Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create Token | 18926007 | 181 days ago | IN | 0 ETH | 0.10275348 | ||||
Create Token | 18580852 | 230 days ago | IN | 0 ETH | 0.18163644 | ||||
Create Token | 18526496 | 237 days ago | IN | 0 ETH | 0.13375919 | ||||
Create Token | 18472286 | 245 days ago | IN | 0 ETH | 0.13547788 | ||||
Create Token | 18446808 | 249 days ago | IN | 0 ETH | 0.04756897 | ||||
Create Token | 18443934 | 249 days ago | IN | 0 ETH | 0.09692108 | ||||
Create Token | 18430300 | 251 days ago | IN | 0 ETH | 0.11836446 | ||||
Create Token | 18424960 | 252 days ago | IN | 0 ETH | 0.0656444 | ||||
Create Token | 18420542 | 252 days ago | IN | 0 ETH | 0.15549217 | ||||
Create Token | 18419125 | 252 days ago | IN | 0 ETH | 0.04135329 | ||||
Create Token | 18387969 | 257 days ago | IN | 0 ETH | 0.04636197 | ||||
Create Token | 18387704 | 257 days ago | IN | 0 ETH | 0.04649895 | ||||
Create Token | 18382994 | 257 days ago | IN | 0 ETH | 0.03413901 | ||||
Create Token | 18367919 | 260 days ago | IN | 0 ETH | 0.03189876 | ||||
Create Token | 18359182 | 261 days ago | IN | 0 ETH | 0.03357148 | ||||
Create Token | 18355869 | 261 days ago | IN | 0 ETH | 0.03676637 | ||||
Create Token | 18344571 | 263 days ago | IN | 0 ETH | 0.03230577 | ||||
0x60806040 | 18341287 | 263 days ago | IN | Create: ERC20Factory | 0 ETH | 0.02564227 |
Latest 17 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
18926007 | 181 days ago | Contract Creation | 0 ETH | |||
18580852 | 230 days ago | Contract Creation | 0 ETH | |||
18526496 | 237 days ago | Contract Creation | 0 ETH | |||
18472286 | 245 days ago | Contract Creation | 0 ETH | |||
18446808 | 249 days ago | Contract Creation | 0 ETH | |||
18443934 | 249 days ago | Contract Creation | 0 ETH | |||
18430300 | 251 days ago | Contract Creation | 0 ETH | |||
18424960 | 252 days ago | Contract Creation | 0 ETH | |||
18420542 | 252 days ago | Contract Creation | 0 ETH | |||
18419125 | 252 days ago | Contract Creation | 0 ETH | |||
18387969 | 257 days ago | Contract Creation | 0 ETH | |||
18387704 | 257 days ago | Contract Creation | 0 ETH | |||
18382994 | 257 days ago | Contract Creation | 0 ETH | |||
18367919 | 260 days ago | Contract Creation | 0 ETH | |||
18359182 | 261 days ago | Contract Creation | 0 ETH | |||
18355869 | 261 days ago | Contract Creation | 0 ETH | |||
18344571 | 263 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ERC20Factory
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-13 */ // File: contracts/IgniteDeployer/contracts/interfaces/IUniswapV2Factory.sol pragma solidity ^0.8.19; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB ) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair( address tokenA, address tokenB ) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: contracts/IgniteDeployer/contracts/interfaces/IUniswapV2Router02.sol pragma solidity ^0.8.19; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut( uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function getAmountsIn( uint256 amountOut, address[] calldata path ) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/IgniteDeployer/contracts/ERC20Token.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.19; contract ERC20Token is ERC20, Ownable { uint256 public immutable trading_Fee_Cap; uint256 public immutable min_MaxTx; uint256 public immutable min_MaxWallet; mapping(address => bool) public exemptFromFees; mapping(address => bool) public exemptFromLimits; bool public tradingActive; mapping(address => bool) public isAMMPair; uint256 public maxTransaction; uint256 public maxWallet; address public taxReceiverAddress; uint256 public buyTotalTax; uint256 public sellTotalTax; bool public limitsInEffect = true; bool public swapEnabled = true; bool private swapping; uint256 public swapTokensAtAmt; address public lpPair; IUniswapV2Router02 public dexRouter; uint256 public constant fee_divisor = 10000; address public factory; // socialLinks string public _Website; string public _Telegram; string public _Twitter; string public _Discord; // events event UpdatedMaxTransaction(uint256 newMax); event UpdatedMaxWallet(uint256 newMax); event SetExemptFromFees(address _address, bool _isExempt); event SetExemptFromLimits(address _address, bool _isExempt); event RemovedLimits(); event UpdatedBuyTax(uint256 newAmt); event UpdatedSellTax(uint256 newAmt); event UpdatedTaxReceiver(address receiver); event EnabledTrading(); // constructor struct CreationParams { string name; string symbol; uint256 totalSupply; address owner; address uniswapV2Router; address feeReceiver; uint256 buyTax; uint256 sellTax; uint256 maxTx; uint256 maxWallet; address dynamicSale; address antiBotDynamicSaleCA; uint256 totalFeeCap; uint256 minMaxTx; uint256 minMaxWallet; } constructor( CreationParams memory params ) ERC20(params.name, params.symbol) { address newOwner = params.owner; _mint(newOwner, params.totalSupply); factory = msg.sender; trading_Fee_Cap = params.totalFeeCap; min_MaxTx = params.minMaxTx; min_MaxWallet = params.minMaxWallet; dexRouter = IUniswapV2Router02(params.uniswapV2Router); maxTransaction = params.maxTx; maxWallet = params.maxWallet; swapTokensAtAmt = (totalSupply() * 25) / 100000; taxReceiverAddress = params.feeReceiver; buyTotalTax = params.buyTax; sellTotalTax = params.sellTax; lpPair = IUniswapV2Factory(dexRouter.factory()).createPair( address(this), dexRouter.WETH() ); isAMMPair[lpPair] = true; exemptFromLimits[lpPair] = true; exemptFromLimits[params.owner] = true; exemptFromLimits[address(this)] = true; exemptFromLimits[params.dynamicSale] = true; // Dynamic Sale exemptFromLimits[params.antiBotDynamicSaleCA] = true; // anti-bot Dynamic Sale router exemptFromFees[params.owner] = true; exemptFromFees[address(this)] = true; exemptFromFees[params.dynamicSale] = true; // Dynamic Sale exemptFromFees[params.antiBotDynamicSaleCA] = true; // anti-bot Dynamic Sale router _approve(address(this), address(dexRouter), type(uint256).max); _approve(address(params.owner), address(dexRouter), totalSupply()); transferOwnership(newOwner); } function socialLinks() external view returns (string memory, string memory, string memory, string memory) { return (_Website, _Telegram, _Twitter, _Discord); } function setWebsiteLink(string memory website) external onlyOwner { _Website = website; } function setTelegramLink(string memory telegram) external onlyOwner { _Telegram = telegram; } function setTwitterLink(string memory twitter) external onlyOwner { _Twitter = twitter; } function setDiscordLink(string memory discord) external onlyOwner { _Discord = discord; } function setSocialLinks( string memory website, string memory telegram, string memory twitter, string memory discord ) external { require( msg.sender == owner() || msg.sender == factory, "Not allowed to set" ); _Website = website; _Telegram = telegram; _Twitter = twitter; _Discord = discord; } function _transfer( address from, address to, uint256 amount ) internal virtual override { if (exemptFromFees[from] || exemptFromFees[to]) { super._transfer(from, to, amount); return; } checkLimits(from, to, amount); amount -= handleTax(from, to, amount); super._transfer(from, to, amount); } function checkLimits( address from, address to, uint256 amount ) internal view { require(tradingActive, "Trading not active"); if (limitsInEffect) { // buy if (isAMMPair[from] && !exemptFromLimits[to]) { require( amount <= maxTransaction, "Buy transfer amount exceeded." ); require( amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet" ); } // sell else if (isAMMPair[to] && !exemptFromLimits[from]) { require( amount <= maxTransaction, "Sell transfer amount exceeds the maxTransactionAmt." ); } else if (!exemptFromLimits[to]) { require( amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet" ); } } } function handleTax( address from, address to, uint256 amount ) internal returns (uint256) { if ( balanceOf(address(this)) >= swapTokensAtAmt && swapEnabled && !swapping && isAMMPair[to] ) { swapping = true; swapBack(); swapping = false; } uint256 tax = 0; // on sell if (isAMMPair[to] && sellTotalTax > 0) { tax = (amount * sellTotalTax) / fee_divisor; } // on buy else if (isAMMPair[from] && buyTotalTax > 0) { tax = (amount * buyTotalTax) / fee_divisor; } if (tax > 0) { super._transfer(from, address(this), tax); } return tax; } function swapTokensForETH(uint256 tokenAmt) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = address(dexRouter.WETH()); dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmt, 0, path, address(taxReceiverAddress), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); if (contractBalance > swapTokensAtAmt * 40) { contractBalance = swapTokensAtAmt * 40; } swapTokensForETH(contractBalance); } // owner functions function setExemptFromFees(address _address, bool _isExempt) external { require( msg.sender == owner() || msg.sender == factory, "Not allowed to set" ); require(_address != address(0), "Zero Address"); exemptFromFees[_address] = _isExempt; emit SetExemptFromFees(_address, _isExempt); } function setExemptFromLimits( address _address, bool _isExempt ) external onlyOwner { require(_address != address(0), "Zero Address"); if (!_isExempt) { require(_address != lpPair, "Cannot remove pair"); } exemptFromLimits[_address] = _isExempt; emit SetExemptFromLimits(_address, _isExempt); } function updateMaxTransaction(uint256 maxTxInWei) external onlyOwner { require( maxTxInWei >= ((totalSupply() * min_MaxTx) / fee_divisor), "Too low" ); maxTransaction = maxTxInWei; emit UpdatedMaxTransaction(maxTransaction); } function updateMaxWallet(uint256 maxWalletInWei) external onlyOwner { require( maxWalletInWei >= ((totalSupply() * min_MaxWallet) / fee_divisor), "Too low" ); maxWallet = maxWalletInWei; emit UpdatedMaxWallet(maxWallet); } function updateBuyTax(uint256 _taxWithTwoDecimals) external onlyOwner { buyTotalTax = _taxWithTwoDecimals; require(buyTotalTax <= trading_Fee_Cap, "Keep tax below FeeCap"); emit UpdatedBuyTax(buyTotalTax); } function updateSellTax(uint256 _taxWithTwoDecimals) external onlyOwner { sellTotalTax = _taxWithTwoDecimals; require(sellTotalTax <= trading_Fee_Cap, "Keep tax below FeeCap"); emit UpdatedSellTax(sellTotalTax); } function enableTrading() external onlyOwner { tradingActive = true; emit EnabledTrading(); } function removeLimits() external onlyOwner { limitsInEffect = false; maxTransaction = totalSupply(); maxWallet = totalSupply(); emit RemovedLimits(); } function airdropToWallets( address[] calldata wallets, uint256[] calldata amountsInWei ) external onlyOwner { require( wallets.length == amountsInWei.length, "arrays length mismatch" ); for (uint256 i = 0; i < wallets.length; i++) { super._transfer(msg.sender, wallets[i], amountsInWei[i]); } } function rescueTokens(address _token, address _to) external onlyOwner { require(_token != address(0), "_token address cannot be 0"); require(_token != address(this), "cannot this token"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); SafeERC20.safeTransfer(IERC20(_token), _to, _contractBalance); } function updateTaxAddress(address _address) external onlyOwner { require(_address != address(0), "zero address"); taxReceiverAddress = _address; emit UpdatedTaxReceiver(_address); } } // File: contracts/IgniteDeployer/contracts/ERC20Factory.sol pragma solidity ^0.8.19; contract ERC20Factory is Ownable { uint256 public constant TRADING_FEE_CAP = 2000; //20% uint256 public constant MIN_MAXTX = 25; //0.25% uint256 public constant MIN_MAXWALLET = 25; //0.25% address public constant uniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; struct DeployedInfos { address deployer; string tokenName; string tokenSymbol; address tokenAddress; uint256 timestamp; } DeployedInfos[] public allDeployedInfos; mapping(address => DeployedInfos[]) public deployedInfos; address public dynamicSaleCA = 0x332cAEF8e6eBb43D1421E8Aa2E938b2D44246772; address public antiBotDynamicSaleCA = 0x5BCC254ab5385169FDCf45F3D462b48b9D870B03; struct DeployerParams { string name; string symbol; uint256 totalSupply; address owner; address feeReceiver; uint256 buyTax; uint256 sellTax; uint256 maxTx; uint256 maxWallet; } struct SocialLinks { string website; string telegram; string twitter; string discord; } event TokenCreated(address indexed tokenAddress); constructor() {} function createToken( DeployerParams memory _params, SocialLinks memory _socialLinks ) external { require( _params.buyTax <= TRADING_FEE_CAP, "Total fees exceeds max fee" ); require( _params.sellTax <= TRADING_FEE_CAP, "Total fees exceeds max fee" ); require( _params.maxTx >= ((_params.totalSupply * MIN_MAXTX) / 10000), "MaxTx is too low" ); require( _params.maxWallet >= ((_params.totalSupply * MIN_MAXWALLET) / 10000), "MaxWallet is too low" ); ERC20Token.CreationParams memory params = ERC20Token.CreationParams( _params.name, _params.symbol, _params.totalSupply, _params.owner, uniswapV2Router, _params.feeReceiver, _params.buyTax, _params.sellTax, _params.maxTx, _params.maxWallet, dynamicSaleCA, antiBotDynamicSaleCA, TRADING_FEE_CAP, MIN_MAXTX, MIN_MAXWALLET ); ERC20Token newToken = new ERC20Token(params); DeployedInfos memory deployed = DeployedInfos( msg.sender, _params.name, _params.symbol, address(newToken), block.timestamp ); allDeployedInfos.push(deployed); DeployedInfos[] storage deployeds = deployedInfos[msg.sender]; deployeds.push(deployed); newToken.setSocialLinks( _socialLinks.website, _socialLinks.telegram, _socialLinks.twitter, _socialLinks.discord ); emit TokenCreated(address(newToken)); } function setDynamicSaleCA(address _dynamicSaleCA) external onlyOwner { dynamicSaleCA = _dynamicSaleCA; } function setAntiBotDynamicSaleCA( address _antiBotDynamicSaleCA ) external onlyOwner { antiBotDynamicSaleCA = _antiBotDynamicSaleCA; } function getAllDeployedInfos() external view returns (DeployedInfos[] memory) { return allDeployedInfos; } function getDeployedInfos( address deployer ) external view returns (DeployedInfos[] memory) { return deployedInfos[deployer]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[],"name":"MIN_MAXTX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_MAXWALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRADING_FEE_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allDeployedInfos","outputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotDynamicSaleCA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"feeReceiver","type":"address"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"maxTx","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"}],"internalType":"struct ERC20Factory.DeployerParams","name":"_params","type":"tuple"},{"components":[{"internalType":"string","name":"website","type":"string"},{"internalType":"string","name":"telegram","type":"string"},{"internalType":"string","name":"twitter","type":"string"},{"internalType":"string","name":"discord","type":"string"}],"internalType":"struct ERC20Factory.SocialLinks","name":"_socialLinks","type":"tuple"}],"name":"createToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"deployedInfos","outputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicSaleCA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllDeployedInfos","outputs":[{"components":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct ERC20Factory.DeployedInfos[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"name":"getDeployedInfos","outputs":[{"components":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct ERC20Factory.DeployedInfos[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_antiBotDynamicSaleCA","type":"address"}],"name":"setAntiBotDynamicSaleCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dynamicSaleCA","type":"address"}],"name":"setDynamicSaleCA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052600380546001600160a01b031990811673332caef8e6ebb43d1421e8aa2e938b2d442467721790915560048054909116735bcc254ab5385169fdcf45f3d462b48b9d870b0317905534801561005857600080fd5b5061006233610067565b6100b7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b614b29806100c66000396000f3fe60806040523480156200001157600080fd5b5060043610620001155760003560e01c8063968a133111620000a3578063d49c444c116200006e578063d49c444c1462000226578063e06b90f81462000250578063f2fde38b1462000267578063f37fb9d0146200027e57600080fd5b8063968a133114620001f1578063c78850551462000192578063c8ed51ab14620001fb578063d03409bd146200020f57600080fd5b80636b0d828311620000e45780636b0d828314620001aa578063715018a614620001be5780637f056b9f14620001c85780638da5cb5b14620001df57600080fd5b80631694505e146200011a57806352c746fa14620001535780635673eb89146200016c5780635b1ad6551462000192575b600080fd5b62000136737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b6200016a6200016436600462000e93565b62000288565b005b620001836200017d36600462000e93565b620002b4565b6040516200014a919062000f00565b6200019b601981565b6040519081526020016200014a565b60035462000136906001600160a01b031681565b6200016a62000498565b6200016a620001d936600462001185565b620004b0565b6000546001600160a01b031662000136565b6200019b6107d081565b60045462000136906001600160a01b031681565b6200016a6200022036600462000e93565b6200097c565b6200023d62000237366004620012a6565b620009a8565b6040516200014a959493929190620012c0565b6200023d620002613660046200130e565b62000b1f565b6200016a6200027836600462000e93565b62000b6f565b6200018362000bee565b6200029262000dbc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609492939192909184015b828210156200048d5760008481526020908190206040805160a081019091526005850290910180546001600160a01b03168252600181018054929391929184019162000338906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000366906200133b565b8015620003b75780601f106200038b57610100808354040283529160200191620003b7565b820191906000526020600020905b8154815290600101906020018083116200039957829003601f168201915b50505050508152602001600282018054620003d2906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000400906200133b565b8015620004515780601f10620004255761010080835404028352916020019162000451565b820191906000526020600020905b8154815290600101906020018083116200043357829003601f168201915b505050918352505060038201546001600160a01b03166020808301919091526004909201546040909101529082526001929092019101620002ec565b505050509050919050565b620004a262000dbc565b620004ae600062000e18565b565b6107d08260a0015111156200050c5760405162461bcd60e51b815260206004820152601a60248201527f546f74616c20666565732065786365656473206d61782066656500000000000060448201526064015b60405180910390fd5b6107d08260c001511115620005645760405162461bcd60e51b815260206004820152601a60248201527f546f74616c20666565732065786365656473206d617820666565000000000000604482015260640162000503565b612710601983604001516200057a919062001377565b620005869190620013a3565b8260e001511015620005ce5760405162461bcd60e51b815260206004820152601060248201526f4d6178547820697320746f6f206c6f7760801b604482015260640162000503565b61271060198360400151620005e4919062001377565b620005f09190620013a3565b82610100015110156200063d5760405162461bcd60e51b81526020600482015260146024820152734d617857616c6c657420697320746f6f206c6f7760601b604482015260640162000503565b604080516101e081018252835181526020808501519082015283820151818301526060808501516001600160a01b0390811691830191909152737a250d5630b4cf539739df2c5dacb4c659f2488d608080840191909152850151811660a08084019190915285015160c08084019190915285015160e080840191909152850151610100808401919091528501516101208301526003548116610140830152600454166101608201526107d061018082015260196101a082018190526101c082015290516000908290620007109062000e68565b6200071c9190620013c6565b604051809103906000f08015801562000739573d6000803e3d6000fd5b506040805160a08101825233815286516020808301918252880151928201929092526001600160a01b03838116606083015242608083015260018054808201825560009190915282517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600590920291820180546001600160a01b031916919093161782559251939450909283927fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf70190620007f6908262001543565b50604082015160028201906200080d908262001543565b5060608201516003820180546001600160a01b039283166001600160a01b031991821617909155608090930151600490920191909155336000908152600260209081526040822080546001818101835582855293839020875160059092020180549190951695169490941783558401518492918201906200088f908262001543565b5060408201516002820190620008a6908262001543565b506060828101516003830180546001600160a01b0319166001600160a01b03928316179055608090930151600492830155875160208901516040808b0151938b0151905163791f0bb560e11b81529589169563f23e176a956200090c9592910162001610565b600060405180830381600087803b1580156200092757600080fd5b505af11580156200093c573d6000803e3d6000fd5b50506040516001600160a01b03861692507f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9150600090a2505050505050565b6200098662000dbc565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60018181548110620009b957600080fd5b6000918252602090912060059091020180546001820180546001600160a01b03909216935090620009ea906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000a18906200133b565b801562000a695780601f1062000a3d5761010080835404028352916020019162000a69565b820191906000526020600020905b81548152906001019060200180831162000a4b57829003601f168201915b50505050509080600201805462000a80906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000aae906200133b565b801562000aff5780601f1062000ad35761010080835404028352916020019162000aff565b820191906000526020600020905b81548152906001019060200180831162000ae157829003601f168201915b50505050600383015460049093015491926001600160a01b031691905085565b6002602052816000526040600020818154811062000b3c57600080fd5b6000918252602090912060059091020180546001820180546001600160a01b039092169450919250620009ea906200133b565b62000b7962000dbc565b6001600160a01b03811662000be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000503565b62000beb8162000e18565b50565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101562000db35760008481526020908190206040805160a081019091526005850290910180546001600160a01b03168252600181018054929391929184019162000c5e906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000c8c906200133b565b801562000cdd5780601f1062000cb15761010080835404028352916020019162000cdd565b820191906000526020600020905b81548152906001019060200180831162000cbf57829003601f168201915b5050505050815260200160028201805462000cf8906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000d26906200133b565b801562000d775780601f1062000d4b5761010080835404028352916020019162000d77565b820191906000526020600020905b81548152906001019060200180831162000d5957829003601f168201915b505050918352505060038201546001600160a01b0316602080830191909152600490920154604090910152908252600192909201910162000c12565b50505050905090565b6000546001600160a01b03163314620004ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000503565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613483806200167183390190565b80356001600160a01b038116811462000e8e57600080fd5b919050565b60006020828403121562000ea657600080fd5b62000eb18262000e76565b9392505050565b6000815180845260005b8181101562000ee05760208185018101518683018201520162000ec2565b506000602082860101526020601f19601f83011685010191505092915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101562000fb157888303603f19018552815180516001600160a01b0390811685528882015160a08a8701819052919062000f668388018262000eb8565b925050888301518683038a88015262000f80838262000eb8565b6060858101519093169288019290925250608092830151929095019190915250938601939086019060010162000f27565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171562000ffb5762000ffb62000fbf565b60405290565b604051610120810167ffffffffffffffff8111828210171562000ffb5762000ffb62000fbf565b600082601f8301126200103a57600080fd5b813567ffffffffffffffff8082111562001058576200105862000fbf565b604051601f8301601f19908116603f0116810190828211818310171562001083576200108362000fbf565b816040528381528660208588010111156200109d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808284031215620010d057600080fd5b620010da62000fd5565b9050813567ffffffffffffffff80821115620010f557600080fd5b620011038583860162001028565b835260208401359150808211156200111a57600080fd5b620011288583860162001028565b602084015260408401359150808211156200114257600080fd5b620011508583860162001028565b604084015260608401359150808211156200116a57600080fd5b50620011798482850162001028565b60608301525092915050565b600080604083850312156200119957600080fd5b823567ffffffffffffffff80821115620011b257600080fd5b908401906101208287031215620011c857600080fd5b620011d262001001565b823582811115620011e257600080fd5b620011f08882860162001028565b8252506020830135828111156200120657600080fd5b620012148882860162001028565b60208301525060408301356040820152620012326060840162000e76565b6060820152620012456080840162000e76565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508094505060208501359150808211156200128d57600080fd5b506200129c85828601620010bd565b9150509250929050565b600060208284031215620012b957600080fd5b5035919050565b600060018060a01b03808816835260a06020840152620012e460a084018862000eb8565b8381036040850152620012f8818862000eb8565b9590911660608401525050608001529392505050565b600080604083850312156200132257600080fd5b6200132d8362000e76565b946020939093013593505050565b600181811c908216806200135057607f821691505b6020821081036200137157634e487b7160e01b600052602260045260246000fd5b50919050565b80820281158282048414176200139d57634e487b7160e01b600052601160045260246000fd5b92915050565b600082620013c157634e487b7160e01b600052601260045260246000fd5b500490565b60208152600082516101e0806020850152620013e761020085018362000eb8565b91506020850151601f1985840301604086015262001406838262000eb8565b9250506040850151606085015260608501516200142e60808601826001600160a01b03169052565b5060808501516001600160a01b03811660a08601525060a08501516001600160a01b03811660c08601525060c085015160e085810191909152850151610100808601919091528501516101208086019190915285015161014080860191909152850151610160620014a9818701836001600160a01b03169052565b8601519050610180620014c6868201836001600160a01b03169052565b8601516101a0868101919091528601516101c0808701919091529095015193019290925250919050565b601f8211156200153e57600081815260208120601f850160051c81016020861015620015195750805b601f850160051c820191505b818110156200153a5782815560010162001525565b5050505b505050565b815167ffffffffffffffff81111562001560576200156062000fbf565b62001578816200157184546200133b565b84620014f0565b602080601f831160018114620015b05760008415620015975750858301515b600019600386901b1c1916600185901b1785556200153a565b600085815260208120601f198616915b82811015620015e157888601518255948401946001909101908401620015c0565b5085821015620016005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60808152600062001625608083018762000eb8565b828103602084015262001639818762000eb8565b905082810360408401526200164f818662000eb8565b9050828103606084015262001665818562000eb8565b97965050505050505056fe60e0604052600f805461ffff19166101011790553480156200002057600080fd5b506040516200348338038062003483833981016040819052620000439162000835565b80516020820151600362000058838262000a1d565b50600462000067828262000a1d565b505050620000846200007e620003ef60201b60201c565b620003f3565b606081015160408201516200009b90829062000445565b60138054336001600160a01b03199182161790915561018083015160809081526101a084015160a0526101c084015160c052830151601280549092166001600160a01b03909116179055610100820151600a55610120820151600b55620186a06200010560025490565b6200011290601962000aff565b6200011e919062000b1f565b60105560a0820151600c80546001600160a01b0319166001600160a01b0392831617905560c0830151600d5560e0830151600e556012546040805163c45a015560e01b81529051919092169163c45a01559160048281019260209291908290030181865afa15801562000195573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bb919062000b42565b6001600160a01b031663c9c6539630601260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200021e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000244919062000b42565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062000b42565b601180546001600160a01b0319166001600160a01b0392831690811782556000908152600960209081526040808320805460ff1990811660019081179092559454861684526007835281842080548616821790556060880180518716855282852080548716831790553080865283862080548816841790556101408a0180518916875284872080548916851790556101608b0180518a16885285882080548a16861790559251891687526006909552838620805488168417905580865283862080548816841790559351871685528285208054871683179055518616845292208054909316909117909155601254620003b592166000196200050c565b6060820151601254620003dc91906001600160a01b0316620003d660025490565b6200050c565b620003e78162000634565b505062000b7d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004a15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004b5919062000b67565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620005705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000498565b6001600160a01b038216620005d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000498565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6200063e620006b8565b6001600160a01b038116620006a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000498565b620006b081620003f3565b50565b505050565b6005546001600160a01b03163314620007145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000498565b565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b038111828210171562000752576200075262000716565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000783576200078362000716565b604052919050565b600082601f8301126200079d57600080fd5b81516001600160401b03811115620007b957620007b962000716565b6020620007cf601f8301601f1916820162000758565b8281528582848701011115620007e457600080fd5b60005b8381101562000804578581018301518282018401528201620007e7565b506000928101909101919091529392505050565b80516001600160a01b03811681146200083057600080fd5b919050565b6000602082840312156200084857600080fd5b81516001600160401b03808211156200086057600080fd5b908301906101e082860312156200087657600080fd5b620008806200072c565b8251828111156200089057600080fd5b6200089e878286016200078b565b825250602083015182811115620008b457600080fd5b620008c2878286016200078b565b60208301525060408301516040820152620008e06060840162000818565b6060820152620008f36080840162000818565b60808201526200090660a0840162000818565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014091506200094782840162000818565b8282015261016091506200095d82840162000818565b9181019190915261018082810151908201526101a080830151908201526101c091820151918101919091529392505050565b600181811c90821680620009a457607f821691505b602082108103620009c557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006b357600081815260208120601f850160051c81016020861015620009f45750805b601f850160051c820191505b8181101562000a155782815560010162000a00565b505050505050565b81516001600160401b0381111562000a395762000a3962000716565b62000a518162000a4a84546200098f565b84620009cb565b602080601f83116001811462000a89576000841562000a705750858301515b600019600386901b1c1916600185901b17855562000a15565b600085815260208120601f198616915b8281101562000aba5788860151825594840194600190910190840162000a99565b508582101562000ad95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000b195762000b1962000ae9565b92915050565b60008262000b3d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000b5557600080fd5b62000b608262000818565b9392505050565b8082018082111562000b195762000b1962000ae9565b60805160a05160c0516128ba62000bc9600039600081816106e701526109990152600081816105d0015261076a015260008181610676015281816108db0152610b5501526128ba6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c80638a8c523c116101b8578063b232c69211610104578063d27c8a37116100a2578063e27a55fe1161007c578063e27a55fe14610725578063f23e176a1461072e578063f2fde38b14610741578063f8b45b051461075457600080fd5b8063d27c8a37146106e2578063dd62ed3e14610709578063dde5541b1461071c57600080fd5b8063c3f70b52116100de578063c3f70b52146106a5578063c45a0155146106ae578063c78d0fa0146106c1578063cd059a64146106ca57600080fd5b8063b232c6921461065e578063b63a900b14610671578063bbc0c7421461069857600080fd5b80639b34ea3f11610171578063a457c2d71161014b578063a457c2d71461060d578063a65fe64114610620578063a9059cbb14610628578063b0249cc61461063b57600080fd5b80639b34ea3f146105cb5780639b5a76c5146105f2578063a13d1a2b146105fa57600080fd5b80638a8c523c1461056c5780638d3e6e40146105745780638da5cb5b1461059757806395d89b41146105a857806398cb5318146105b05780639b0e18a0146105c357600080fd5b8063436d3340116102925780635df6e68e11610230578063715018a61161020a578063715018a614610536578063719290161461053e578063751039fc1461055157806377b27d1f1461055957600080fd5b80635df6e68e146104f25780636ddd1713146104fb57806370a082311461050d57600080fd5b80634b298b961161026c5780634b298b96146104a15780635431c94e146104a95780635a90a49e146104bc5780635adf655a146104df57600080fd5b8063436d33401461046e578063452ed4f1146104815780634a62bb651461049457600080fd5b806318160ddd116102ff5780632307b441116102d95780632307b4411461042657806323b872dd14610439578063313ce5671461044c578063395093511461045b57600080fd5b806318160ddd146103ee57806319f9e247146104005780631c499ab01461041357600080fd5b80630517d13d1461034757806306fdde031461035c5780630758d9241461037a578063095ea7b3146103a5578063114ca2ed146103c857806312185a39146103db575b600080fd5b61035a61035536600461219f565b61075d565b005b610364610820565b6040516103719190612208565b60405180910390f35b60125461038d906001600160a01b031681565b6040516001600160a01b039091168152602001610371565b6103b86103b3366004612237565b6108b2565b6040519015158152602001610371565b600c5461038d906001600160a01b031681565b61035a6103e936600461219f565b6108cc565b6002545b604051908152602001610371565b61035a61040e366004612306565b610974565b61035a61042136600461219f565b61098c565b61035a610434366004612387565b610a43565b6103b86104473660046123f3565b610b00565b60405160128152602001610371565b6103b8610469366004612237565b610b24565b61035a61047c36600461219f565b610b46565b60115461038d906001600160a01b031681565b600f546103b89060ff1681565b610364610bee565b61035a6104b7366004612434565b610c7c565b6103b86104ca36600461246d565b60066020526000908152604090205460ff1681565b61035a6104ed36600461246d565b610da3565b6103f2600d5481565b600f546103b890610100900460ff1681565b6103f261051b36600461246d565b6001600160a01b031660009081526020819052604090205490565b61035a610e3e565b61035a61054c366004612306565b610e52565b61035a610e66565b61035a610567366004612498565b610eaf565b61035a610fbc565b6103b861058236600461246d565b60076020526000908152604090205460ff1681565b6005546001600160a01b031661038d565b610364610ffc565b61035a6105be366004612306565b61100b565b61036461101f565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b61036461102c565b61035a610608366004612498565b611039565b6103b861061b366004612237565b61113a565b6103646111b5565b6103b8610636366004612237565b6111c2565b6103b861064936600461246d565b60096020526000908152604090205460ff1681565b61035a61066c366004612306565b6111d0565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b6008546103b89060ff1681565b6103f2600a5481565b60135461038d906001600160a01b031681565b6103f260105481565b6106d26111e4565b60405161037194939291906124c6565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b6103f2610717366004612434565b611430565b6103f261271081565b6103f2600e5481565b61035a61073c366004612513565b61145b565b61035a61074f36600461246d565b6114f2565b6103f2600b5481565b61076561156b565b6127107f000000000000000000000000000000000000000000000000000000000000000061079260025490565b61079c91906125d6565b6107a691906125ed565b8110156107e45760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064015b60405180910390fd5b600a8190556040518181527f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574906020015b60405180910390a150565b60606003805461082f9061260f565b80601f016020809104026020016040519081016040528092919081815260200182805461085b9061260f565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b6000336108c08185856115c5565b60019150505b92915050565b6108d461156b565b600e8190557f00000000000000000000000000000000000000000000000000000000000000008111156109415760405162461bcd60e51b815260206004820152601560248201527404b656570207461782062656c6f772046656543617605c1b60448201526064016107db565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600e5460405161081591815260200190565b61097c61156b565b6014610988828261268f565b5050565b61099461156b565b6127107f00000000000000000000000000000000000000000000000000000000000000006109c160025490565b6109cb91906125d6565b6109d591906125ed565b811015610a0e5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016107db565b600b8190556040518181527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610815565b610a4b61156b565b828114610a935760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b60448201526064016107db565b60005b83811015610af957610ae733868684818110610ab457610ab461274f565b9050602002016020810190610ac9919061246d565b858585818110610adb57610adb61274f565b905060200201356116e9565b80610af181612765565b915050610a96565b5050505050565b600033610b0e85828561188f565b610b19858585611903565b506001949350505050565b6000336108c0818585610b378383611430565b610b41919061277e565b6115c5565b610b4e61156b565b600d8190557f0000000000000000000000000000000000000000000000000000000000000000811115610bbb5760405162461bcd60e51b815260206004820152601560248201527404b656570207461782062656c6f772046656543617605c1b60448201526064016107db565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600d5460405161081591815260200190565b60178054610bfb9061260f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c279061260f565b8015610c745780601f10610c4957610100808354040283529160200191610c74565b820191906000526020600020905b815481529060010190602001808311610c5757829003601f168201915b505050505081565b610c8461156b565b6001600160a01b038216610cda5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016107db565b306001600160a01b03831603610d265760405162461bcd60e51b815260206004820152601160248201527031b0b73737ba103a3434b9903a37b5b2b760791b60448201526064016107db565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190612791565b9050610d9e83838361197f565b505050565b610dab61156b565b6001600160a01b038116610df05760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107db565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f71643334f77c29f51ee4d3b7c31f7606e763ead7b69553eb6d0da092ef5d79e390602001610815565b610e4661156b565b610e5060006119d1565b565b610e5a61156b565b6017610988828261268f565b610e6e61156b565b600f805460ff19169055600254600a55600254600b556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b0316331480610ed257506013546001600160a01b031633145b610f135760405162461bcd60e51b8152602060048201526012602482015271139bdd08185b1b1bddd959081d1bc81cd95d60721b60448201526064016107db565b6001600160a01b038216610f585760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107db565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b610fc461156b565b6008805460ff191660011790556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b60606004805461082f9061260f565b61101361156b565b6015610988828261268f565b60158054610bfb9061260f565b60148054610bfb9061260f565b61104161156b565b6001600160a01b0382166110865760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107db565b806110de576011546001600160a01b03908116908316036110de5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b60448201526064016107db565b6001600160a01b038216600081815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101610fb0565b600033816111488286611430565b9050838110156111a85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107db565b610b1982868684036115c5565b60168054610bfb9061260f565b6000336108c0818585611903565b6111d861156b565b6016610988828261268f565b60608060608060146015601660178380546111fe9061260f565b80601f016020809104026020016040519081016040528092919081815260200182805461122a9061260f565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b5050505050935082805461128a9061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546112b69061260f565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505092508180546113169061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546113429061260f565b801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b505050505091508080546113a29061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546113ce9061260f565b801561141b5780601f106113f05761010080835404028352916020019161141b565b820191906000526020600020905b8154815290600101906020018083116113fe57829003601f168201915b50505050509050935093509350935090919293565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633148061147e57506013546001600160a01b031633145b6114bf5760405162461bcd60e51b8152602060048201526012602482015271139bdd08185b1b1bddd959081d1bc81cd95d60721b60448201526064016107db565b60146114cb858261268f565b5060156114d8848261268f565b5060166114e5838261268f565b506017610af9828261268f565b6114fa61156b565b6001600160a01b03811661155f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107db565b611568816119d1565b50565b6005546001600160a01b03163314610e505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107db565b6001600160a01b0383166116275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107db565b6001600160a01b0382166116885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107db565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661174d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107db565b6001600160a01b0382166117af5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107db565b6001600160a01b038316600090815260208190526040902054818110156118275760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107db565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b600061189b8484611430565b9050600019811461188957818110156118f65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107db565b61188984848484036115c5565b6001600160a01b03831660009081526006602052604090205460ff168061194257506001600160a01b03821660009081526006602052604090205460ff165b1561195257610d9e8383836116e9565b61195d838383611a23565b611968838383611c77565b61197290826127aa565b9050610d9e8383836116e9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d9e908490611dbc565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16611a6a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b60448201526064016107db565b600f5460ff1615610d9e576001600160a01b03831660009081526009602052604090205460ff168015611ab657506001600160a01b03821660009081526007602052604090205460ff16155b15611b8257600a54811115611b0d5760405162461bcd60e51b815260206004820152601d60248201527f427579207472616e7366657220616d6f756e742065786365656465642e00000060448201526064016107db565b600b546001600160a01b0383166000908152602081905260409020545b611b34908361277e565b1115610d9e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c6574000000000060448201526064016107db565b6001600160a01b03821660009081526009602052604090205460ff168015611bc357506001600160a01b03831660009081526007602052604090205460ff16155b15611c3657600a54811115610d9e5760405162461bcd60e51b815260206004820152603360248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152721036b0bc2a3930b739b0b1ba34b7b720b6ba1760691b60648201526084016107db565b6001600160a01b03821660009081526007602052604090205460ff16610d9e57600b546001600160a01b038316600090815260208190526040902054611b2a565b60105430600090815260208190526040812054909111158015611ca15750600f54610100900460ff165b8015611cb65750600f5462010000900460ff16155b8015611cda57506001600160a01b03831660009081526009602052604090205460ff165b15611d0557600f805462ff0000191662010000179055611cf8611e91565b600f805462ff0000191690555b6001600160a01b03831660009081526009602052604081205460ff168015611d2f57506000600e54115b15611d5657612710600e5484611d4591906125d6565b611d4f91906125ed565b9050611da3565b6001600160a01b03851660009081526009602052604090205460ff168015611d8057506000600d54115b15611da357612710600d5484611d9691906125d6565b611da091906125ed565b90505b8015611db457611db48530836116e9565b949350505050565b6000611e11826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed09092919063ffffffff16565b9050805160001480611e32575080806020019051810190611e3291906127bd565b610d9e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107db565b30600090815260208190526040902054601054611eaf9060286125d6565b811115611ec757601054611ec49060286125d6565b90505b61156881611edf565b6060611db48484600085612026565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f1457611f1461274f565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9191906127da565b81600181518110611fa457611fa461274f565b6001600160a01b039283166020918202929092010152601254600c5460405163791ac94760e01b81529183169263791ac94792611ff092879260009288929091169042906004016127f7565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b505050505050565b6060824710156120875760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107db565b600080866001600160a01b031685876040516120a39190612868565b60006040518083038185875af1925050503d80600081146120e0576040519150601f19603f3d011682016040523d82523d6000602084013e6120e5565b606091505b50915091506120f687838387612101565b979650505050505050565b60608315612170578251600003612169576001600160a01b0385163b6121695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107db565b5081611db4565b611db483838151156121855781518083602001fd5b8060405162461bcd60e51b81526004016107db9190612208565b6000602082840312156121b157600080fd5b5035919050565b60005b838110156121d35781810151838201526020016121bb565b50506000910152565b600081518084526121f48160208601602086016121b8565b601f01601f19169290920160200192915050565b60208152600061221b60208301846121dc565b9392505050565b6001600160a01b038116811461156857600080fd5b6000806040838503121561224a57600080fd5b823561225581612222565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261228a57600080fd5b813567ffffffffffffffff808211156122a5576122a5612263565b604051601f8301601f19908116603f011681019082821181831017156122cd576122cd612263565b816040528381528660208588010111156122e657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561231857600080fd5b813567ffffffffffffffff81111561232f57600080fd5b611db484828501612279565b60008083601f84011261234d57600080fd5b50813567ffffffffffffffff81111561236557600080fd5b6020830191508360208260051b850101111561238057600080fd5b9250929050565b6000806000806040858703121561239d57600080fd5b843567ffffffffffffffff808211156123b557600080fd5b6123c18883890161233b565b909650945060208701359150808211156123da57600080fd5b506123e78782880161233b565b95989497509550505050565b60008060006060848603121561240857600080fd5b833561241381612222565b9250602084013561242381612222565b929592945050506040919091013590565b6000806040838503121561244757600080fd5b823561245281612222565b9150602083013561246281612222565b809150509250929050565b60006020828403121561247f57600080fd5b813561221b81612222565b801515811461156857600080fd5b600080604083850312156124ab57600080fd5b82356124b681612222565b915060208301356124628161248a565b6080815260006124d960808301876121dc565b82810360208401526124eb81876121dc565b905082810360408401526124ff81866121dc565b905082810360608401526120f681856121dc565b6000806000806080858703121561252957600080fd5b843567ffffffffffffffff8082111561254157600080fd5b61254d88838901612279565b9550602087013591508082111561256357600080fd5b61256f88838901612279565b9450604087013591508082111561258557600080fd5b61259188838901612279565b935060608701359150808211156125a757600080fd5b506125b487828801612279565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108c6576108c66125c0565b60008261260a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061262357607f821691505b60208210810361264357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d9e57600081815260208120601f850160051c810160208610156126705750805b601f850160051c820191505b8181101561201e5782815560010161267c565b815167ffffffffffffffff8111156126a9576126a9612263565b6126bd816126b7845461260f565b84612649565b602080601f8311600181146126f257600084156126da5750858301515b600019600386901b1c1916600185901b17855561201e565b600085815260208120601f198616915b8281101561272157888601518255948401946001909101908401612702565b508582101561273f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060018201612777576127776125c0565b5060010190565b808201808211156108c6576108c66125c0565b6000602082840312156127a357600080fd5b5051919050565b818103818111156108c6576108c66125c0565b6000602082840312156127cf57600080fd5b815161221b8161248a565b6000602082840312156127ec57600080fd5b815161221b81612222565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128475784516001600160a01b031683529383019391830191600101612822565b50506001600160a01b03969096166060850152505050608001529392505050565b6000825161287a8184602087016121b8565b919091019291505056fea2646970667358221220f54a27d7fe4ece2251bd24b56db3d52d5e033a93e55f8e5741f76a9c01f7ca9564736f6c63430008130033a26469706673582212206e9b028cc64cb3577067d0372d2a8796f1c010e809a0a08fec4fe7fd7705a7e864736f6c63430008130033
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001155760003560e01c8063968a133111620000a3578063d49c444c116200006e578063d49c444c1462000226578063e06b90f81462000250578063f2fde38b1462000267578063f37fb9d0146200027e57600080fd5b8063968a133114620001f1578063c78850551462000192578063c8ed51ab14620001fb578063d03409bd146200020f57600080fd5b80636b0d828311620000e45780636b0d828314620001aa578063715018a614620001be5780637f056b9f14620001c85780638da5cb5b14620001df57600080fd5b80631694505e146200011a57806352c746fa14620001535780635673eb89146200016c5780635b1ad6551462000192575b600080fd5b62000136737a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b6200016a6200016436600462000e93565b62000288565b005b620001836200017d36600462000e93565b620002b4565b6040516200014a919062000f00565b6200019b601981565b6040519081526020016200014a565b60035462000136906001600160a01b031681565b6200016a62000498565b6200016a620001d936600462001185565b620004b0565b6000546001600160a01b031662000136565b6200019b6107d081565b60045462000136906001600160a01b031681565b6200016a6200022036600462000e93565b6200097c565b6200023d62000237366004620012a6565b620009a8565b6040516200014a959493929190620012c0565b6200023d620002613660046200130e565b62000b1f565b6200016a6200027836600462000e93565b62000b6f565b6200018362000bee565b6200029262000dbc565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609492939192909184015b828210156200048d5760008481526020908190206040805160a081019091526005850290910180546001600160a01b03168252600181018054929391929184019162000338906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000366906200133b565b8015620003b75780601f106200038b57610100808354040283529160200191620003b7565b820191906000526020600020905b8154815290600101906020018083116200039957829003601f168201915b50505050508152602001600282018054620003d2906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000400906200133b565b8015620004515780601f10620004255761010080835404028352916020019162000451565b820191906000526020600020905b8154815290600101906020018083116200043357829003601f168201915b505050918352505060038201546001600160a01b03166020808301919091526004909201546040909101529082526001929092019101620002ec565b505050509050919050565b620004a262000dbc565b620004ae600062000e18565b565b6107d08260a0015111156200050c5760405162461bcd60e51b815260206004820152601a60248201527f546f74616c20666565732065786365656473206d61782066656500000000000060448201526064015b60405180910390fd5b6107d08260c001511115620005645760405162461bcd60e51b815260206004820152601a60248201527f546f74616c20666565732065786365656473206d617820666565000000000000604482015260640162000503565b612710601983604001516200057a919062001377565b620005869190620013a3565b8260e001511015620005ce5760405162461bcd60e51b815260206004820152601060248201526f4d6178547820697320746f6f206c6f7760801b604482015260640162000503565b61271060198360400151620005e4919062001377565b620005f09190620013a3565b82610100015110156200063d5760405162461bcd60e51b81526020600482015260146024820152734d617857616c6c657420697320746f6f206c6f7760601b604482015260640162000503565b604080516101e081018252835181526020808501519082015283820151818301526060808501516001600160a01b0390811691830191909152737a250d5630b4cf539739df2c5dacb4c659f2488d608080840191909152850151811660a08084019190915285015160c08084019190915285015160e080840191909152850151610100808401919091528501516101208301526003548116610140830152600454166101608201526107d061018082015260196101a082018190526101c082015290516000908290620007109062000e68565b6200071c9190620013c6565b604051809103906000f08015801562000739573d6000803e3d6000fd5b506040805160a08101825233815286516020808301918252880151928201929092526001600160a01b03838116606083015242608083015260018054808201825560009190915282517fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6600590920291820180546001600160a01b031916919093161782559251939450909283927fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf70190620007f6908262001543565b50604082015160028201906200080d908262001543565b5060608201516003820180546001600160a01b039283166001600160a01b031991821617909155608090930151600490920191909155336000908152600260209081526040822080546001818101835582855293839020875160059092020180549190951695169490941783558401518492918201906200088f908262001543565b5060408201516002820190620008a6908262001543565b506060828101516003830180546001600160a01b0319166001600160a01b03928316179055608090930151600492830155875160208901516040808b0151938b0151905163791f0bb560e11b81529589169563f23e176a956200090c9592910162001610565b600060405180830381600087803b1580156200092757600080fd5b505af11580156200093c573d6000803e3d6000fd5b50506040516001600160a01b03861692507f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9150600090a2505050505050565b6200098662000dbc565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60018181548110620009b957600080fd5b6000918252602090912060059091020180546001820180546001600160a01b03909216935090620009ea906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000a18906200133b565b801562000a695780601f1062000a3d5761010080835404028352916020019162000a69565b820191906000526020600020905b81548152906001019060200180831162000a4b57829003601f168201915b50505050509080600201805462000a80906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000aae906200133b565b801562000aff5780601f1062000ad35761010080835404028352916020019162000aff565b820191906000526020600020905b81548152906001019060200180831162000ae157829003601f168201915b50505050600383015460049093015491926001600160a01b031691905085565b6002602052816000526040600020818154811062000b3c57600080fd5b6000918252602090912060059091020180546001820180546001600160a01b039092169450919250620009ea906200133b565b62000b7962000dbc565b6001600160a01b03811662000be05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000503565b62000beb8162000e18565b50565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101562000db35760008481526020908190206040805160a081019091526005850290910180546001600160a01b03168252600181018054929391929184019162000c5e906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000c8c906200133b565b801562000cdd5780601f1062000cb15761010080835404028352916020019162000cdd565b820191906000526020600020905b81548152906001019060200180831162000cbf57829003601f168201915b5050505050815260200160028201805462000cf8906200133b565b80601f016020809104026020016040519081016040528092919081815260200182805462000d26906200133b565b801562000d775780601f1062000d4b5761010080835404028352916020019162000d77565b820191906000526020600020905b81548152906001019060200180831162000d5957829003601f168201915b505050918352505060038201546001600160a01b0316602080830191909152600490920154604090910152908252600192909201910162000c12565b50505050905090565b6000546001600160a01b03163314620004ae5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000503565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b613483806200167183390190565b80356001600160a01b038116811462000e8e57600080fd5b919050565b60006020828403121562000ea657600080fd5b62000eb18262000e76565b9392505050565b6000815180845260005b8181101562000ee05760208185018101518683018201520162000ec2565b506000602082860101526020601f19601f83011685010191505092915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101562000fb157888303603f19018552815180516001600160a01b0390811685528882015160a08a8701819052919062000f668388018262000eb8565b925050888301518683038a88015262000f80838262000eb8565b6060858101519093169288019290925250608092830151929095019190915250938601939086019060010162000f27565b509098975050505050505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171562000ffb5762000ffb62000fbf565b60405290565b604051610120810167ffffffffffffffff8111828210171562000ffb5762000ffb62000fbf565b600082601f8301126200103a57600080fd5b813567ffffffffffffffff8082111562001058576200105862000fbf565b604051601f8301601f19908116603f0116810190828211818310171562001083576200108362000fbf565b816040528381528660208588010111156200109d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060808284031215620010d057600080fd5b620010da62000fd5565b9050813567ffffffffffffffff80821115620010f557600080fd5b620011038583860162001028565b835260208401359150808211156200111a57600080fd5b620011288583860162001028565b602084015260408401359150808211156200114257600080fd5b620011508583860162001028565b604084015260608401359150808211156200116a57600080fd5b50620011798482850162001028565b60608301525092915050565b600080604083850312156200119957600080fd5b823567ffffffffffffffff80821115620011b257600080fd5b908401906101208287031215620011c857600080fd5b620011d262001001565b823582811115620011e257600080fd5b620011f08882860162001028565b8252506020830135828111156200120657600080fd5b620012148882860162001028565b60208301525060408301356040820152620012326060840162000e76565b6060820152620012456080840162000e76565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152508094505060208501359150808211156200128d57600080fd5b506200129c85828601620010bd565b9150509250929050565b600060208284031215620012b957600080fd5b5035919050565b600060018060a01b03808816835260a06020840152620012e460a084018862000eb8565b8381036040850152620012f8818862000eb8565b9590911660608401525050608001529392505050565b600080604083850312156200132257600080fd5b6200132d8362000e76565b946020939093013593505050565b600181811c908216806200135057607f821691505b6020821081036200137157634e487b7160e01b600052602260045260246000fd5b50919050565b80820281158282048414176200139d57634e487b7160e01b600052601160045260246000fd5b92915050565b600082620013c157634e487b7160e01b600052601260045260246000fd5b500490565b60208152600082516101e0806020850152620013e761020085018362000eb8565b91506020850151601f1985840301604086015262001406838262000eb8565b9250506040850151606085015260608501516200142e60808601826001600160a01b03169052565b5060808501516001600160a01b03811660a08601525060a08501516001600160a01b03811660c08601525060c085015160e085810191909152850151610100808601919091528501516101208086019190915285015161014080860191909152850151610160620014a9818701836001600160a01b03169052565b8601519050610180620014c6868201836001600160a01b03169052565b8601516101a0868101919091528601516101c0808701919091529095015193019290925250919050565b601f8211156200153e57600081815260208120601f850160051c81016020861015620015195750805b601f850160051c820191505b818110156200153a5782815560010162001525565b5050505b505050565b815167ffffffffffffffff81111562001560576200156062000fbf565b62001578816200157184546200133b565b84620014f0565b602080601f831160018114620015b05760008415620015975750858301515b600019600386901b1c1916600185901b1785556200153a565b600085815260208120601f198616915b82811015620015e157888601518255948401946001909101908401620015c0565b5085821015620016005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60808152600062001625608083018762000eb8565b828103602084015262001639818762000eb8565b905082810360408401526200164f818662000eb8565b9050828103606084015262001665818562000eb8565b97965050505050505056fe60e0604052600f805461ffff19166101011790553480156200002057600080fd5b506040516200348338038062003483833981016040819052620000439162000835565b80516020820151600362000058838262000a1d565b50600462000067828262000a1d565b505050620000846200007e620003ef60201b60201c565b620003f3565b606081015160408201516200009b90829062000445565b60138054336001600160a01b03199182161790915561018083015160809081526101a084015160a0526101c084015160c052830151601280549092166001600160a01b03909116179055610100820151600a55610120820151600b55620186a06200010560025490565b6200011290601962000aff565b6200011e919062000b1f565b60105560a0820151600c80546001600160a01b0319166001600160a01b0392831617905560c0830151600d5560e0830151600e556012546040805163c45a015560e01b81529051919092169163c45a01559160048281019260209291908290030181865afa15801562000195573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bb919062000b42565b6001600160a01b031663c9c6539630601260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200021e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000244919062000b42565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000292573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b8919062000b42565b601180546001600160a01b0319166001600160a01b0392831690811782556000908152600960209081526040808320805460ff1990811660019081179092559454861684526007835281842080548616821790556060880180518716855282852080548716831790553080865283862080548816841790556101408a0180518916875284872080548916851790556101608b0180518a16885285882080548a16861790559251891687526006909552838620805488168417905580865283862080548816841790559351871685528285208054871683179055518616845292208054909316909117909155601254620003b592166000196200050c565b6060820151601254620003dc91906001600160a01b0316620003d660025490565b6200050c565b620003e78162000634565b505062000b7d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620004a15760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620004b5919062000b67565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b038316620005705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840162000498565b6001600160a01b038216620005d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000498565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6200063e620006b8565b6001600160a01b038116620006a55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000498565b620006b081620003f3565b50565b505050565b6005546001600160a01b03163314620007145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000498565b565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b038111828210171562000752576200075262000716565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000783576200078362000716565b604052919050565b600082601f8301126200079d57600080fd5b81516001600160401b03811115620007b957620007b962000716565b6020620007cf601f8301601f1916820162000758565b8281528582848701011115620007e457600080fd5b60005b8381101562000804578581018301518282018401528201620007e7565b506000928101909101919091529392505050565b80516001600160a01b03811681146200083057600080fd5b919050565b6000602082840312156200084857600080fd5b81516001600160401b03808211156200086057600080fd5b908301906101e082860312156200087657600080fd5b620008806200072c565b8251828111156200089057600080fd5b6200089e878286016200078b565b825250602083015182811115620008b457600080fd5b620008c2878286016200078b565b60208301525060408301516040820152620008e06060840162000818565b6060820152620008f36080840162000818565b60808201526200090660a0840162000818565b60a082015260c0838101519082015260e080840151908201526101008084015190820152610120808401519082015261014091506200094782840162000818565b8282015261016091506200095d82840162000818565b9181019190915261018082810151908201526101a080830151908201526101c091820151918101919091529392505050565b600181811c90821680620009a457607f821691505b602082108103620009c557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006b357600081815260208120601f850160051c81016020861015620009f45750805b601f850160051c820191505b8181101562000a155782815560010162000a00565b505050505050565b81516001600160401b0381111562000a395762000a3962000716565b62000a518162000a4a84546200098f565b84620009cb565b602080601f83116001811462000a89576000841562000a705750858301515b600019600386901b1c1916600185901b17855562000a15565b600085815260208120601f198616915b8281101562000aba5788860151825594840194600190910190840162000a99565b508582101562000ad95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000b195762000b1962000ae9565b92915050565b60008262000b3d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121562000b5557600080fd5b62000b608262000818565b9392505050565b8082018082111562000b195762000b1962000ae9565b60805160a05160c0516128ba62000bc9600039600081816106e701526109990152600081816105d0015261076a015260008181610676015281816108db0152610b5501526128ba6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c80638a8c523c116101b8578063b232c69211610104578063d27c8a37116100a2578063e27a55fe1161007c578063e27a55fe14610725578063f23e176a1461072e578063f2fde38b14610741578063f8b45b051461075457600080fd5b8063d27c8a37146106e2578063dd62ed3e14610709578063dde5541b1461071c57600080fd5b8063c3f70b52116100de578063c3f70b52146106a5578063c45a0155146106ae578063c78d0fa0146106c1578063cd059a64146106ca57600080fd5b8063b232c6921461065e578063b63a900b14610671578063bbc0c7421461069857600080fd5b80639b34ea3f11610171578063a457c2d71161014b578063a457c2d71461060d578063a65fe64114610620578063a9059cbb14610628578063b0249cc61461063b57600080fd5b80639b34ea3f146105cb5780639b5a76c5146105f2578063a13d1a2b146105fa57600080fd5b80638a8c523c1461056c5780638d3e6e40146105745780638da5cb5b1461059757806395d89b41146105a857806398cb5318146105b05780639b0e18a0146105c357600080fd5b8063436d3340116102925780635df6e68e11610230578063715018a61161020a578063715018a614610536578063719290161461053e578063751039fc1461055157806377b27d1f1461055957600080fd5b80635df6e68e146104f25780636ddd1713146104fb57806370a082311461050d57600080fd5b80634b298b961161026c5780634b298b96146104a15780635431c94e146104a95780635a90a49e146104bc5780635adf655a146104df57600080fd5b8063436d33401461046e578063452ed4f1146104815780634a62bb651461049457600080fd5b806318160ddd116102ff5780632307b441116102d95780632307b4411461042657806323b872dd14610439578063313ce5671461044c578063395093511461045b57600080fd5b806318160ddd146103ee57806319f9e247146104005780631c499ab01461041357600080fd5b80630517d13d1461034757806306fdde031461035c5780630758d9241461037a578063095ea7b3146103a5578063114ca2ed146103c857806312185a39146103db575b600080fd5b61035a61035536600461219f565b61075d565b005b610364610820565b6040516103719190612208565b60405180910390f35b60125461038d906001600160a01b031681565b6040516001600160a01b039091168152602001610371565b6103b86103b3366004612237565b6108b2565b6040519015158152602001610371565b600c5461038d906001600160a01b031681565b61035a6103e936600461219f565b6108cc565b6002545b604051908152602001610371565b61035a61040e366004612306565b610974565b61035a61042136600461219f565b61098c565b61035a610434366004612387565b610a43565b6103b86104473660046123f3565b610b00565b60405160128152602001610371565b6103b8610469366004612237565b610b24565b61035a61047c36600461219f565b610b46565b60115461038d906001600160a01b031681565b600f546103b89060ff1681565b610364610bee565b61035a6104b7366004612434565b610c7c565b6103b86104ca36600461246d565b60066020526000908152604090205460ff1681565b61035a6104ed36600461246d565b610da3565b6103f2600d5481565b600f546103b890610100900460ff1681565b6103f261051b36600461246d565b6001600160a01b031660009081526020819052604090205490565b61035a610e3e565b61035a61054c366004612306565b610e52565b61035a610e66565b61035a610567366004612498565b610eaf565b61035a610fbc565b6103b861058236600461246d565b60076020526000908152604090205460ff1681565b6005546001600160a01b031661038d565b610364610ffc565b61035a6105be366004612306565b61100b565b61036461101f565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b61036461102c565b61035a610608366004612498565b611039565b6103b861061b366004612237565b61113a565b6103646111b5565b6103b8610636366004612237565b6111c2565b6103b861064936600461246d565b60096020526000908152604090205460ff1681565b61035a61066c366004612306565b6111d0565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b6008546103b89060ff1681565b6103f2600a5481565b60135461038d906001600160a01b031681565b6103f260105481565b6106d26111e4565b60405161037194939291906124c6565b6103f27f000000000000000000000000000000000000000000000000000000000000000081565b6103f2610717366004612434565b611430565b6103f261271081565b6103f2600e5481565b61035a61073c366004612513565b61145b565b61035a61074f36600461246d565b6114f2565b6103f2600b5481565b61076561156b565b6127107f000000000000000000000000000000000000000000000000000000000000000061079260025490565b61079c91906125d6565b6107a691906125ed565b8110156107e45760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064015b60405180910390fd5b600a8190556040518181527f76a9278644b7300961aa0e7e86f10934585987f1daf1c6ecc971c18376691574906020015b60405180910390a150565b60606003805461082f9061260f565b80601f016020809104026020016040519081016040528092919081815260200182805461085b9061260f565b80156108a85780601f1061087d576101008083540402835291602001916108a8565b820191906000526020600020905b81548152906001019060200180831161088b57829003601f168201915b5050505050905090565b6000336108c08185856115c5565b60019150505b92915050565b6108d461156b565b600e8190557f00000000000000000000000000000000000000000000000000000000000000008111156109415760405162461bcd60e51b815260206004820152601560248201527404b656570207461782062656c6f772046656543617605c1b60448201526064016107db565b7fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c97600e5460405161081591815260200190565b61097c61156b565b6014610988828261268f565b5050565b61099461156b565b6127107f00000000000000000000000000000000000000000000000000000000000000006109c160025490565b6109cb91906125d6565b6109d591906125ed565b811015610a0e5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b60448201526064016107db565b600b8190556040518181527f3046ad62de8b70d396246aaed19ff2559ff20df8706520cbde58320766c4276290602001610815565b610a4b61156b565b828114610a935760405162461bcd60e51b81526020600482015260166024820152750c2e4e4c2f2e640d8cadccee8d040dad2e6dac2e8c6d60531b60448201526064016107db565b60005b83811015610af957610ae733868684818110610ab457610ab461274f565b9050602002016020810190610ac9919061246d565b858585818110610adb57610adb61274f565b905060200201356116e9565b80610af181612765565b915050610a96565b5050505050565b600033610b0e85828561188f565b610b19858585611903565b506001949350505050565b6000336108c0818585610b378383611430565b610b41919061277e565b6115c5565b610b4e61156b565b600d8190557f0000000000000000000000000000000000000000000000000000000000000000811115610bbb5760405162461bcd60e51b815260206004820152601560248201527404b656570207461782062656c6f772046656543617605c1b60448201526064016107db565b7f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece0508600d5460405161081591815260200190565b60178054610bfb9061260f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c279061260f565b8015610c745780601f10610c4957610100808354040283529160200191610c74565b820191906000526020600020905b815481529060010190602001808311610c5757829003601f168201915b505050505081565b610c8461156b565b6001600160a01b038216610cda5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016107db565b306001600160a01b03831603610d265760405162461bcd60e51b815260206004820152601160248201527031b0b73737ba103a3434b9903a37b5b2b760791b60448201526064016107db565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190612791565b9050610d9e83838361197f565b505050565b610dab61156b565b6001600160a01b038116610df05760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b60448201526064016107db565b600c80546001600160a01b0319166001600160a01b0383169081179091556040519081527f71643334f77c29f51ee4d3b7c31f7606e763ead7b69553eb6d0da092ef5d79e390602001610815565b610e4661156b565b610e5060006119d1565b565b610e5a61156b565b6017610988828261268f565b610e6e61156b565b600f805460ff19169055600254600a55600254600b556040517fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c90600090a1565b6005546001600160a01b0316331480610ed257506013546001600160a01b031633145b610f135760405162461bcd60e51b8152602060048201526012602482015271139bdd08185b1b1bddd959081d1bc81cd95d60721b60448201526064016107db565b6001600160a01b038216610f585760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107db565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b610fc461156b565b6008805460ff191660011790556040517fa56feb2d31b9a7424db0be063fd450863979c9e2382cf5110f869bd1ad361bb790600090a1565b60606004805461082f9061260f565b61101361156b565b6015610988828261268f565b60158054610bfb9061260f565b60148054610bfb9061260f565b61104161156b565b6001600160a01b0382166110865760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b60448201526064016107db565b806110de576011546001600160a01b03908116908316036110de5760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b60448201526064016107db565b6001600160a01b038216600081815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101610fb0565b600033816111488286611430565b9050838110156111a85760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107db565b610b1982868684036115c5565b60168054610bfb9061260f565b6000336108c0818585611903565b6111d861156b565b6016610988828261268f565b60608060608060146015601660178380546111fe9061260f565b80601f016020809104026020016040519081016040528092919081815260200182805461122a9061260f565b80156112775780601f1061124c57610100808354040283529160200191611277565b820191906000526020600020905b81548152906001019060200180831161125a57829003601f168201915b5050505050935082805461128a9061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546112b69061260f565b80156113035780601f106112d857610100808354040283529160200191611303565b820191906000526020600020905b8154815290600101906020018083116112e657829003601f168201915b505050505092508180546113169061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546113429061260f565b801561138f5780601f106113645761010080835404028352916020019161138f565b820191906000526020600020905b81548152906001019060200180831161137257829003601f168201915b505050505091508080546113a29061260f565b80601f01602080910402602001604051908101604052809291908181526020018280546113ce9061260f565b801561141b5780601f106113f05761010080835404028352916020019161141b565b820191906000526020600020905b8154815290600101906020018083116113fe57829003601f168201915b50505050509050935093509350935090919293565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6005546001600160a01b031633148061147e57506013546001600160a01b031633145b6114bf5760405162461bcd60e51b8152602060048201526012602482015271139bdd08185b1b1bddd959081d1bc81cd95d60721b60448201526064016107db565b60146114cb858261268f565b5060156114d8848261268f565b5060166114e5838261268f565b506017610af9828261268f565b6114fa61156b565b6001600160a01b03811661155f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107db565b611568816119d1565b50565b6005546001600160a01b03163314610e505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107db565b6001600160a01b0383166116275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107db565b6001600160a01b0382166116885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107db565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831661174d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107db565b6001600160a01b0382166117af5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107db565b6001600160a01b038316600090815260208190526040902054818110156118275760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107db565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b600061189b8484611430565b9050600019811461188957818110156118f65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107db565b61188984848484036115c5565b6001600160a01b03831660009081526006602052604090205460ff168061194257506001600160a01b03821660009081526006602052604090205460ff165b1561195257610d9e8383836116e9565b61195d838383611a23565b611968838383611c77565b61197290826127aa565b9050610d9e8383836116e9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d9e908490611dbc565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60085460ff16611a6a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b60448201526064016107db565b600f5460ff1615610d9e576001600160a01b03831660009081526009602052604090205460ff168015611ab657506001600160a01b03821660009081526007602052604090205460ff16155b15611b8257600a54811115611b0d5760405162461bcd60e51b815260206004820152601d60248201527f427579207472616e7366657220616d6f756e742065786365656465642e00000060448201526064016107db565b600b546001600160a01b0383166000908152602081905260409020545b611b34908361277e565b1115610d9e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f20657863656564204d61782057616c6c6574000000000060448201526064016107db565b6001600160a01b03821660009081526009602052604090205460ff168015611bc357506001600160a01b03831660009081526007602052604090205460ff16155b15611c3657600a54811115610d9e5760405162461bcd60e51b815260206004820152603360248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152721036b0bc2a3930b739b0b1ba34b7b720b6ba1760691b60648201526084016107db565b6001600160a01b03821660009081526007602052604090205460ff16610d9e57600b546001600160a01b038316600090815260208190526040902054611b2a565b60105430600090815260208190526040812054909111158015611ca15750600f54610100900460ff165b8015611cb65750600f5462010000900460ff16155b8015611cda57506001600160a01b03831660009081526009602052604090205460ff165b15611d0557600f805462ff0000191662010000179055611cf8611e91565b600f805462ff0000191690555b6001600160a01b03831660009081526009602052604081205460ff168015611d2f57506000600e54115b15611d5657612710600e5484611d4591906125d6565b611d4f91906125ed565b9050611da3565b6001600160a01b03851660009081526009602052604090205460ff168015611d8057506000600d54115b15611da357612710600d5484611d9691906125d6565b611da091906125ed565b90505b8015611db457611db48530836116e9565b949350505050565b6000611e11826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ed09092919063ffffffff16565b9050805160001480611e32575080806020019051810190611e3291906127bd565b610d9e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107db565b30600090815260208190526040902054601054611eaf9060286125d6565b811115611ec757601054611ec49060286125d6565b90505b61156881611edf565b6060611db48484600085612026565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f1457611f1461274f565b6001600160a01b03928316602091820292909201810191909152601254604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9191906127da565b81600181518110611fa457611fa461274f565b6001600160a01b039283166020918202929092010152601254600c5460405163791ac94760e01b81529183169263791ac94792611ff092879260009288929091169042906004016127f7565b600060405180830381600087803b15801561200a57600080fd5b505af115801561201e573d6000803e3d6000fd5b505050505050565b6060824710156120875760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016107db565b600080866001600160a01b031685876040516120a39190612868565b60006040518083038185875af1925050503d80600081146120e0576040519150601f19603f3d011682016040523d82523d6000602084013e6120e5565b606091505b50915091506120f687838387612101565b979650505050505050565b60608315612170578251600003612169576001600160a01b0385163b6121695760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107db565b5081611db4565b611db483838151156121855781518083602001fd5b8060405162461bcd60e51b81526004016107db9190612208565b6000602082840312156121b157600080fd5b5035919050565b60005b838110156121d35781810151838201526020016121bb565b50506000910152565b600081518084526121f48160208601602086016121b8565b601f01601f19169290920160200192915050565b60208152600061221b60208301846121dc565b9392505050565b6001600160a01b038116811461156857600080fd5b6000806040838503121561224a57600080fd5b823561225581612222565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261228a57600080fd5b813567ffffffffffffffff808211156122a5576122a5612263565b604051601f8301601f19908116603f011681019082821181831017156122cd576122cd612263565b816040528381528660208588010111156122e657600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561231857600080fd5b813567ffffffffffffffff81111561232f57600080fd5b611db484828501612279565b60008083601f84011261234d57600080fd5b50813567ffffffffffffffff81111561236557600080fd5b6020830191508360208260051b850101111561238057600080fd5b9250929050565b6000806000806040858703121561239d57600080fd5b843567ffffffffffffffff808211156123b557600080fd5b6123c18883890161233b565b909650945060208701359150808211156123da57600080fd5b506123e78782880161233b565b95989497509550505050565b60008060006060848603121561240857600080fd5b833561241381612222565b9250602084013561242381612222565b929592945050506040919091013590565b6000806040838503121561244757600080fd5b823561245281612222565b9150602083013561246281612222565b809150509250929050565b60006020828403121561247f57600080fd5b813561221b81612222565b801515811461156857600080fd5b600080604083850312156124ab57600080fd5b82356124b681612222565b915060208301356124628161248a565b6080815260006124d960808301876121dc565b82810360208401526124eb81876121dc565b905082810360408401526124ff81866121dc565b905082810360608401526120f681856121dc565b6000806000806080858703121561252957600080fd5b843567ffffffffffffffff8082111561254157600080fd5b61254d88838901612279565b9550602087013591508082111561256357600080fd5b61256f88838901612279565b9450604087013591508082111561258557600080fd5b61259188838901612279565b935060608701359150808211156125a757600080fd5b506125b487828801612279565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176108c6576108c66125c0565b60008261260a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061262357607f821691505b60208210810361264357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610d9e57600081815260208120601f850160051c810160208610156126705750805b601f850160051c820191505b8181101561201e5782815560010161267c565b815167ffffffffffffffff8111156126a9576126a9612263565b6126bd816126b7845461260f565b84612649565b602080601f8311600181146126f257600084156126da5750858301515b600019600386901b1c1916600185901b17855561201e565b600085815260208120601f198616915b8281101561272157888601518255948401946001909101908401612702565b508582101561273f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060018201612777576127776125c0565b5060010190565b808201808211156108c6576108c66125c0565b6000602082840312156127a357600080fd5b5051919050565b818103818111156108c6576108c66125c0565b6000602082840312156127cf57600080fd5b815161221b8161248a565b6000602082840312156127ec57600080fd5b815161221b81612222565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128475784516001600160a01b031683529383019391830191600101612822565b50506001600160a01b03969096166060850152505050608001529392505050565b6000825161287a8184602087016121b8565b919091019291505056fea2646970667358221220f54a27d7fe4ece2251bd24b56db3d52d5e033a93e55f8e5741f76a9c01f7ca9564736f6c63430008130033a26469706673582212206e9b028cc64cb3577067d0372d2a8796f1c010e809a0a08fec4fe7fd7705a7e864736f6c63430008130033
Deployed Bytecode Sourcemap
56930:3757:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57139:93;;57190:42;57139:93;;;;;-1:-1:-1;;;;;287:32:1;;;269:51;;257:2;242:18;57139:93:0;;;;;;;;60072:118;;;;;;:::i;:::-;;:::i;:::-;;60528:156;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57082:42::-;;57122:2;57082:42;;;;;2782:25:1;;;2770:2;2755:18;57082:42:0;2636:177:1;57531:73:0;;;;;-1:-1:-1;;;;;57531:73:0;;;45028:103;;;:::i;58197:1867::-;;;;;;:::i;:::-;;:::i;44387:87::-;44433:7;44460:6;-1:-1:-1;;;;;44460:6:0;44387:87;;56970:46;;57012:4;56970:46;;57611:89;;;;;-1:-1:-1;;;;;57611:89:0;;;60198:162;;;;;;:::i;:::-;;:::i;57420:39::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;57466:56::-;;;;;;:::i;:::-;;:::i;45286:201::-;;;;;;:::i;:::-;;:::i;60368:152::-;;;:::i;60072:118::-;44273:13;:11;:13::i;:::-;60152::::1;:30:::0;;-1:-1:-1;;;;;;60152:30:0::1;-1:-1:-1::0;;;;;60152:30:0;;;::::1;::::0;;;::::1;::::0;;60072:118::o;60528:156::-;-1:-1:-1;;;;;60653:23:0;;;;;;:13;:23;;;;;;;;60646:30;;;;;;;;;;;;;;;;;60611:22;;60646:30;;60653:23;;60646:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60646:30:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60646:30:0;;;-1:-1:-1;;60646:30:0;;;;-1:-1:-1;;;;;60646:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60528:156;;;:::o;45028:103::-;44273:13;:11;:13::i;:::-;45093:30:::1;45120:1;45093:18;:30::i;:::-;45028:103::o:0;58197:1867::-;57012:4;58349:7;:14;;;:33;;58327:109;;;;-1:-1:-1;;;58327:109:0;;8272:2:1;58327:109:0;;;8254:21:1;8311:2;8291:18;;;8284:30;8350:28;8330:18;;;8323:56;8396:18;;58327:109:0;;;;;;;;;57012:4;58469:7;:15;;;:34;;58447:110;;;;-1:-1:-1;;;58447:110:0;;8272:2:1;58447:110:0;;;8254:21:1;8311:2;8291:18;;;8284:30;8350:28;8330:18;;;8323:56;8396:18;;58447:110:0;8070:350:1;58447:110:0;58646:5;57065:2;58611:7;:19;;;:31;;;;:::i;:::-;58610:41;;;;:::i;:::-;58592:7;:13;;;:60;;58570:126;;;;-1:-1:-1;;;58570:126:0;;9119:2:1;58570:126:0;;;9101:21:1;9158:2;9138:18;;;9131:30;-1:-1:-1;;;9177:18:1;;;9170:46;9233:18;;58570:126:0;8917:340:1;58570:126:0;58808:5;57122:2;58769:7;:19;;;:35;;;;:::i;:::-;58768:45;;;;:::i;:::-;58729:7;:17;;;:85;;58707:155;;;;-1:-1:-1;;;58707:155:0;;9464:2:1;58707:155:0;;;9446:21:1;9503:2;9483:18;;;9476:30;-1:-1:-1;;;9522:18:1;;;9515:50;9582:18;;58707:155:0;9262:344:1;58707:155:0;58917:482;;;;;;;;58957:12;;58917:482;;;58984:14;;;;58917:482;;;;59013:19;;;;58917:482;;;;;59047:13;;;;-1:-1:-1;;;;;58917:482:0;;;;;;;;;;57190:42;58917:482;;;;;;;;59105:19;;;58917:482;;;;;;;;;;59139:14;;;58917:482;;;;;;;;59168:15;;;58917:482;;;;;;;;59198:13;;;58917:482;;;;;;;;59226:17;;;58917:482;;;;59258:13;;;;58917:482;;;;59286:20;;;58917:482;;;;57012:4;58917:482;;;;57065:2;58917:482;;;;;;;;;;59434:22;;58875:39;;58917:482;;59434:22;;;:::i;:::-;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59501:167:0;;;;;;;;59529:10;59501:167;;59554:12;;59501:167;;;;;;;59581:14;;;59501:167;;;;;;;-1:-1:-1;;;;;59501:167:0;;;;;;;59642:15;59501:167;;;;59681:16;:31;;;;;;;-1:-1:-1;59681:31:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;59681:31:0;;;;;;;;;;59501:167;;-1:-1:-1;59501:167:0;;;;59681:31;;;;;;;:::i;:::-;-1:-1:-1;59681:31:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59681:31:0;;;;;;;;;-1:-1:-1;;;;;59681:31:0;;;-1:-1:-1;;;;;;59681:31:0;;;;;;;;;;;;;;;;;;;;59775:10;59681:31;59761:25;;;:13;:25;;;;;;;59797:24;;59681:31;59797:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59812:8;;59797:24;;;;;;;;:::i;:::-;-1:-1:-1;59797:24:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59797:24:0;;;;;;;;;;-1:-1:-1;;;;;;59797:24:0;-1:-1:-1;;;;;59797:24:0;;;;;;;;;;;;;;;;59872:20;;59907:21;;;;59943:20;;;;;59978;;;;59834:175;;-1:-1:-1;;;59834:175:0;;:23;;;;;;:175;;59943:20;59978;59834:175;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60025:31:0;;-1:-1:-1;;;;;60025:31:0;;;-1:-1:-1;60025:31:0;;-1:-1:-1;60025:31:0;;;58316:1748;;;;58197:1867;;:::o;60198:162::-;44273:13;:11;:13::i;:::-;60308:20:::1;:44:::0;;-1:-1:-1;;;;;;60308:44:0::1;-1:-1:-1::0;;;;;60308:44:0;;;::::1;::::0;;;::::1;::::0;;60198:162::o;57420:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57420:39:0;;;;-1:-1:-1;57420:39:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57420:39:0;;;;;;;;;;;-1:-1:-1;;;;;57420:39:0;;;-1:-1:-1;57420:39:0;:::o;57466:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57466:56:0;;;;-1:-1:-1;57466:56:0;;-1:-1:-1;57466:56:0;;;:::i;45286:201::-;44273:13;:11;:13::i;:::-;-1:-1:-1;;;;;45375:22:0;::::1;45367:73;;;::::0;-1:-1:-1;;;45367:73:0;;14663:2:1;45367:73:0::1;::::0;::::1;14645:21:1::0;14702:2;14682:18;;;14675:30;14741:34;14721:18;;;14714:62;-1:-1:-1;;;14792:18:1;;;14785:36;14838:19;;45367:73:0::1;14461:402:1::0;45367:73:0::1;45451:28;45470:8;45451:18;:28::i;:::-;45286:201:::0;:::o;60368:152::-;60449:22;60496:16;60489:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;60489:23:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60489:23:0;;;-1:-1:-1;;60489:23:0;;;;-1:-1:-1;;;;;60489:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60368:152;:::o;44552:132::-;44433:7;44460:6;-1:-1:-1;;;;;44460:6:0;29877:10;44616:23;44608:68;;;;-1:-1:-1;;;44608:68:0;;15070:2:1;44608:68:0;;;15052:21:1;;;15089:18;;;15082:30;15148:34;15128:18;;;15121:62;15200:18;;44608:68:0;14868:356:1;45647:191:0;45721:16;45740:6;;-1:-1:-1;;;;;45757:17:0;;;-1:-1:-1;;;;;;45757:17:0;;;;;;45790:40;;45740:6;;;;;;;45790:40;;45721:16;45790:40;45710:128;45647:191;:::o;-1:-1:-1:-;;;;;;;;:::o;331:173:1:-;399:20;;-1:-1:-1;;;;;448:31:1;;438:42;;428:70;;494:1;491;484:12;428:70;331:173;;;:::o;509:186::-;568:6;621:2;609:9;600:7;596:23;592:32;589:52;;;637:1;634;627:12;589:52;660:29;679:9;660:29;:::i;:::-;650:39;509:186;-1:-1:-1;;;509:186:1:o;700:423::-;742:3;780:5;774:12;807:6;802:3;795:19;832:1;842:162;856:6;853:1;850:13;842:162;;;918:4;974:13;;;970:22;;964:29;946:11;;;942:20;;935:59;871:12;842:162;;;846:3;1049:1;1042:4;1033:6;1028:3;1024:16;1020:27;1013:38;1112:4;1105:2;1101:7;1096:2;1088:6;1084:15;1080:29;1075:3;1071:39;1067:50;1060:57;;;700:423;;;;:::o;1128:1503::-;1332:4;1361:2;1401;1390:9;1386:18;1431:2;1420:9;1413:21;1454:6;1489;1483:13;1520:6;1512;1505:22;1546:2;1536:12;;1579:2;1568:9;1564:18;1557:25;;1641:2;1631:6;1628:1;1624:14;1613:9;1609:30;1605:39;1679:2;1671:6;1667:15;1700:1;1710:892;1724:6;1721:1;1718:13;1710:892;;;1789:22;;;-1:-1:-1;;1785:36:1;1773:49;;1845:13;;1959:9;;-1:-1:-1;;;;;1955:18:1;;;1940:34;;2013:11;;;2007:18;1881:4;2045:15;;;2038:27;;;1881:4;1908:19;2092:48;2124:15;;;2007:18;2092:48;:::i;:::-;2078:62;;;2189:2;2185;2181:11;2175:18;2242:6;2234;2230:19;2225:2;2217:6;2213:15;2206:44;2277:41;2311:6;2295:14;2277:41;:::i;:::-;2341:4;2392:11;;;2386:18;2382:27;;;2365:15;;;2358:52;;;;-1:-1:-1;2433:4:1;2480:11;;;2474:18;2457:15;;;;2450:43;;;;-1:-1:-1;2580:12:1;;;;2545:15;;;;1746:1;1739:9;1710:892;;;-1:-1:-1;2619:6:1;;1128:1503;-1:-1:-1;;;;;;;;1128:1503:1:o;2818:127::-;2879:10;2874:3;2870:20;2867:1;2860:31;2910:4;2907:1;2900:15;2934:4;2931:1;2924:15;2950:253;3022:2;3016:9;3064:4;3052:17;;3099:18;3084:34;;3120:22;;;3081:62;3078:88;;;3146:18;;:::i;:::-;3182:2;3175:22;2950:253;:::o;3208:250::-;3275:2;3269:9;3317:6;3305:19;;3354:18;3339:34;;3375:22;;;3336:62;3333:88;;;3401:18;;:::i;3463:719::-;3506:5;3559:3;3552:4;3544:6;3540:17;3536:27;3526:55;;3577:1;3574;3567:12;3526:55;3613:6;3600:20;3639:18;3676:2;3672;3669:10;3666:36;;;3682:18;;:::i;:::-;3757:2;3751:9;3725:2;3811:13;;-1:-1:-1;;3807:22:1;;;3831:2;3803:31;3799:40;3787:53;;;3855:18;;;3875:22;;;3852:46;3849:72;;;3901:18;;:::i;:::-;3941:10;3937:2;3930:22;3976:2;3968:6;3961:18;4022:3;4015:4;4010:2;4002:6;3998:15;3994:26;3991:35;3988:55;;;4039:1;4036;4029:12;3988:55;4103:2;4096:4;4088:6;4084:17;4077:4;4069:6;4065:17;4052:54;4150:1;4143:4;4138:2;4130:6;4126:15;4122:26;4115:37;4170:6;4161:15;;;;;;3463:719;;;;:::o;4187:919::-;4245:5;4293:4;4281:9;4276:3;4272:19;4268:30;4265:50;;;4311:1;4308;4301:12;4265:50;4333:22;;:::i;:::-;4324:31;;4391:9;4378:23;4420:18;4461:2;4453:6;4450:14;4447:34;;;4477:1;4474;4467:12;4447:34;4504:46;4546:3;4537:6;4526:9;4522:22;4504:46;:::i;:::-;4497:5;4490:61;4604:2;4593:9;4589:18;4576:32;4560:48;;4633:2;4623:8;4620:16;4617:36;;;4649:1;4646;4639:12;4617:36;4685:48;4729:3;4718:8;4707:9;4703:24;4685:48;:::i;:::-;4680:2;4673:5;4669:14;4662:72;4787:2;4776:9;4772:18;4759:32;4743:48;;4816:2;4806:8;4803:16;4800:36;;;4832:1;4829;4822:12;4800:36;4868:48;4912:3;4901:8;4890:9;4886:24;4868:48;:::i;:::-;4863:2;4856:5;4852:14;4845:72;4970:2;4959:9;4955:18;4942:32;4926:48;;4999:2;4989:8;4986:16;4983:36;;;5015:1;5012;5005:12;4983:36;;5051:48;5095:3;5084:8;5073:9;5069:24;5051:48;:::i;:::-;5046:2;5039:5;5035:14;5028:72;;4187:919;;;;:::o;5111:1465::-;5240:6;5248;5301:2;5289:9;5280:7;5276:23;5272:32;5269:52;;;5317:1;5314;5307:12;5269:52;5357:9;5344:23;5386:18;5427:2;5419:6;5416:14;5413:34;;;5443:1;5440;5433:12;5413:34;5466:22;;;;5522:6;5504:16;;;5500:29;5497:49;;;5542:1;5539;5532:12;5497:49;5568:17;;:::i;:::-;5623:2;5610:16;5651:2;5641:8;5638:16;5635:36;;;5667:1;5664;5657:12;5635:36;5694:45;5731:7;5720:8;5716:2;5712:17;5694:45;:::i;:::-;5687:5;5680:60;;5786:2;5782;5778:11;5765:25;5815:2;5805:8;5802:16;5799:36;;;5831:1;5828;5821:12;5799:36;5867:45;5904:7;5893:8;5889:2;5885:17;5867:45;:::i;:::-;5862:2;5855:5;5851:14;5844:69;;5966:2;5962;5958:11;5945:25;5940:2;5933:5;5929:14;5922:49;6003:31;6030:2;6026;6022:11;6003:31;:::i;:::-;5998:2;5991:5;5987:14;5980:55;6068:32;6095:3;6091:2;6087:12;6068:32;:::i;:::-;6062:3;6055:5;6051:15;6044:57;6155:3;6151:2;6147:12;6134:26;6128:3;6121:5;6117:15;6110:51;6215:3;6211:2;6207:12;6194:26;6188:3;6181:5;6177:15;6170:51;6275:3;6271:2;6267:12;6254:26;6248:3;6241:5;6237:15;6230:51;6300:3;6356:2;6352;6348:11;6335:25;6330:2;6323:5;6319:14;6312:49;;6380:5;6370:15;;;6438:2;6427:9;6423:18;6410:32;6394:48;;6467:2;6457:8;6454:16;6451:36;;;6483:1;6480;6473:12;6451:36;;6506:64;6562:7;6551:8;6540:9;6536:24;6506:64;:::i;:::-;6496:74;;;5111:1465;;;;;:::o;6581:180::-;6640:6;6693:2;6681:9;6672:7;6668:23;6664:32;6661:52;;;6709:1;6706;6699:12;6661:52;-1:-1:-1;6732:23:1;;6581:180;-1:-1:-1;6581:180:1:o;6766:655::-;7010:4;7056:1;7052;7047:3;7043:11;7039:19;7097:2;7089:6;7085:15;7074:9;7067:34;7137:3;7132:2;7121:9;7117:18;7110:31;7164:46;7205:3;7194:9;7190:19;7182:6;7164:46;:::i;:::-;7258:9;7250:6;7246:22;7241:2;7230:9;7226:18;7219:50;7286:33;7312:6;7304;7286:33;:::i;:::-;7355:15;;;;7350:2;7335:18;;7328:43;-1:-1:-1;;7402:3:1;7387:19;7380:35;7278:41;6766:655;-1:-1:-1;;;6766:655:1:o;7426:254::-;7494:6;7502;7555:2;7543:9;7534:7;7530:23;7526:32;7523:52;;;7571:1;7568;7561:12;7523:52;7594:29;7613:9;7594:29;:::i;:::-;7584:39;7670:2;7655:18;;;;7642:32;;-1:-1:-1;;;7426:254:1:o;7685:380::-;7764:1;7760:12;;;;7807;;;7828:61;;7882:4;7874:6;7870:17;7860:27;;7828:61;7935:2;7927:6;7924:14;7904:18;7901:38;7898:161;;7981:10;7976:3;7972:20;7969:1;7962:31;8016:4;8013:1;8006:15;8044:4;8041:1;8034:15;7898:161;;7685:380;;;:::o;8425:265::-;8498:9;;;8529;;8546:15;;;8540:22;;8526:37;8516:168;;8606:10;8601:3;8597:20;8594:1;8587:31;8641:4;8638:1;8631:15;8669:4;8666:1;8659:15;8516:168;8425:265;;;;:::o;8695:217::-;8735:1;8761;8751:132;;8805:10;8800:3;8796:20;8793:1;8786:31;8840:4;8837:1;8830:15;8868:4;8865:1;8858:15;8751:132;-1:-1:-1;8897:9:1;;8695:217::o;9611:1925::-;9804:2;9793:9;9786:21;9767:4;9842:6;9836:13;9868:6;9910:2;9905;9894:9;9890:18;9883:30;9936:52;9983:3;9972:9;9968:19;9954:12;9936:52;:::i;:::-;9922:66;;10037:2;10029:6;10025:15;10019:22;10109:2;10105:7;10093:9;10085:6;10081:22;10077:36;10072:2;10061:9;10057:18;10050:64;10137:41;10171:6;10155:14;10137:41;:::i;:::-;10123:55;;;10232:2;10224:6;10220:15;10214:22;10209:2;10198:9;10194:18;10187:50;10286:2;10278:6;10274:15;10268:22;10299:55;10349:3;10338:9;10334:19;10318:14;-1:-1:-1;;;;;80:31:1;68:44;;14:104;10299:55;-1:-1:-1;10403:3:1;10391:16;;10385:23;-1:-1:-1;;;;;80:31:1;;10467:3;10452:19;;68:44;-1:-1:-1;10521:3:1;10509:16;;10503:23;-1:-1:-1;;;;;80:31:1;;10585:3;10570:19;;68:44;-1:-1:-1;10645:3:1;10633:16;;10627:23;10621:3;10606:19;;;10599:52;;;;10676:16;;10670:23;10712:3;10731:18;;;10724:30;;;;10779:15;;10773:22;10814:3;10833:18;;;10826:30;;;;10881:15;;10875:22;10916:3;10935:18;;;10928:30;;;;10995:15;;10989:22;11030:3;11042:54;11077:18;;;10989:22;-1:-1:-1;;;;;80:31:1;68:44;;14:104;11042:54;11133:15;;11127:22;;-1:-1:-1;11168:3:1;11180:54;11215:18;;;11127:22;-1:-1:-1;;;;;80:31:1;68:44;;14:104;11180:54;11260:15;;11254:22;11296:3;11315:19;;;11308:32;;;;11366:16;;11360:23;11403:3;11422:19;;;11415:32;;;;11489:16;;;11483:23;11463:18;;11456:51;;;;-1:-1:-1;11524:6:1;9611:1925;-1:-1:-1;9611:1925:1:o;11667:545::-;11769:2;11764:3;11761:11;11758:448;;;11805:1;11830:5;11826:2;11819:17;11875:4;11871:2;11861:19;11945:2;11933:10;11929:19;11926:1;11922:27;11916:4;11912:38;11981:4;11969:10;11966:20;11963:47;;;-1:-1:-1;12004:4:1;11963:47;12059:2;12054:3;12050:12;12047:1;12043:20;12037:4;12033:31;12023:41;;12114:82;12132:2;12125:5;12122:13;12114:82;;;12177:17;;;12158:1;12147:13;12114:82;;;12118:3;;;11758:448;11667:545;;;:::o;12388:1352::-;12514:3;12508:10;12541:18;12533:6;12530:30;12527:56;;;12563:18;;:::i;:::-;12592:97;12682:6;12642:38;12674:4;12668:11;12642:38;:::i;:::-;12636:4;12592:97;:::i;:::-;12744:4;;12808:2;12797:14;;12825:1;12820:663;;;;13527:1;13544:6;13541:89;;;-1:-1:-1;13596:19:1;;;13590:26;13541:89;-1:-1:-1;;12345:1:1;12341:11;;;12337:24;12333:29;12323:40;12369:1;12365:11;;;12320:57;13643:81;;12790:944;;12820:663;11614:1;11607:14;;;11651:4;11638:18;;-1:-1:-1;;12856:20:1;;;12974:236;12988:7;12985:1;12982:14;12974:236;;;13077:19;;;13071:26;13056:42;;13169:27;;;;13137:1;13125:14;;;;13004:19;;12974:236;;;12978:3;13238:6;13229:7;13226:19;13223:201;;;13299:19;;;13293:26;-1:-1:-1;;13382:1:1;13378:14;;;13394:3;13374:24;13370:37;13366:42;13351:58;13336:74;;13223:201;-1:-1:-1;;;;;13470:1:1;13454:14;;;13450:22;13437:36;;-1:-1:-1;12388:1352:1:o;13745:711::-;14038:3;14027:9;14020:22;14001:4;14065:46;14106:3;14095:9;14091:19;14083:6;14065:46;:::i;:::-;14159:9;14151:6;14147:22;14142:2;14131:9;14127:18;14120:50;14193:33;14219:6;14211;14193:33;:::i;:::-;14179:47;;14274:9;14266:6;14262:22;14257:2;14246:9;14242:18;14235:50;14308:33;14334:6;14326;14308:33;:::i;:::-;14294:47;;14389:9;14381:6;14377:22;14372:2;14361:9;14357:18;14350:50;14417:33;14443:6;14435;14417:33;:::i;:::-;14409:41;13745:711;-1:-1:-1;;;;;;;13745:711:1:o
Swarm Source
ipfs://6e9b028cc64cb3577067d0372d2a8796f1c010e809a0a08fec4fe7fd7705a7e8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.