Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,183 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Tokens For ... | 21082195 | 80 days ago | IN | 0 ETH | 0.00218827 | ||||
Swap Tokens For ... | 21082176 | 80 days ago | IN | 0 ETH | 0.00221852 | ||||
Swap Tokens For ... | 21082156 | 80 days ago | IN | 0 ETH | 0.00199704 | ||||
Swap Tokens For ... | 20911557 | 104 days ago | IN | 0.01456016 ETH | 0.00110284 | ||||
Swap Tokens For ... | 20412918 | 174 days ago | IN | 0 ETH | 0.00106413 | ||||
Swap Exact Token... | 20412912 | 174 days ago | IN | 0 ETH | 0.00095796 | ||||
Swap Tokens For ... | 20181043 | 206 days ago | IN | 0 ETH | 0.00089231 | ||||
Swap Exact Token... | 20057609 | 223 days ago | IN | 0 ETH | 0.00081365 | ||||
Swap Tokens For ... | 20057571 | 223 days ago | IN | 0 ETH | 0.00092036 | ||||
Swap Exact Token... | 20057553 | 223 days ago | IN | 0 ETH | 0.00086512 | ||||
Swap Exact Token... | 20057533 | 223 days ago | IN | 0 ETH | 0.00083472 | ||||
Swap Tokens For ... | 20057522 | 223 days ago | IN | 0 ETH | 0.00086885 | ||||
Swap Tokens For ... | 20057509 | 223 days ago | IN | 0 ETH | 0.00081533 | ||||
Swap Tokens For ... | 20057477 | 223 days ago | IN | 0 ETH | 0.00084337 | ||||
Swap Tokens For ... | 20057451 | 223 days ago | IN | 0 ETH | 0.00127281 | ||||
Swap Exact Token... | 20057395 | 224 days ago | IN | 0 ETH | 0.0008696 | ||||
Swap Tokens For ... | 19996883 | 232 days ago | IN | 0 ETH | 0.0008986 | ||||
Swap Exact Token... | 19996858 | 232 days ago | IN | 0 ETH | 0.00117921 | ||||
Swap Tokens For ... | 19996837 | 232 days ago | IN | 0 ETH | 0.00103331 | ||||
Swap Exact Token... | 19996790 | 232 days ago | IN | 0 ETH | 0.00112844 | ||||
Swap Tokens For ... | 19969882 | 236 days ago | IN | 0 ETH | 0.00394091 | ||||
Swap Tokens For ... | 19969732 | 236 days ago | IN | 0 ETH | 0.00527709 | ||||
Swap Tokens For ... | 19946180 | 239 days ago | IN | 0 ETH | 0.00086151 | ||||
Swap Exact Token... | 19946101 | 239 days ago | IN | 0 ETH | 0.00083287 | ||||
Swap Tokens For ... | 19946093 | 239 days ago | IN | 0 ETH | 0.00066776 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21082195 | 80 days ago | 0.08229026 ETH | ||||
21082195 | 80 days ago | 0.00024761 ETH | ||||
21082195 | 80 days ago | 0.08253788 ETH | ||||
21082176 | 80 days ago | 0.19417499 ETH | ||||
21082176 | 80 days ago | 0.00058427 ETH | ||||
21082176 | 80 days ago | 0.19475926 ETH | ||||
21082156 | 80 days ago | 0.00705928 ETH | ||||
21082156 | 80 days ago | 0.00002124 ETH | ||||
21082156 | 80 days ago | 0.00708052 ETH | ||||
20911557 | 104 days ago | 0.01439641 ETH | ||||
20911557 | 104 days ago | 0.00004331 ETH | ||||
20911557 | 104 days ago | 0.00012042 ETH | ||||
20412918 | 174 days ago | 0.00192259 ETH | ||||
20412918 | 174 days ago | 0.00000578 ETH | ||||
20412918 | 174 days ago | 0.00192837 ETH | ||||
20412912 | 174 days ago | 0.00797165 ETH | ||||
20412912 | 174 days ago | 0.00002398 ETH | ||||
20412912 | 174 days ago | 0.00799564 ETH | ||||
20181043 | 206 days ago | 0.0030694 ETH | ||||
20181043 | 206 days ago | 0.00000923 ETH | ||||
20181043 | 206 days ago | 0.00307863 ETH | ||||
20057609 | 223 days ago | 0.01509789 ETH | ||||
20057609 | 223 days ago | 0.00004542 ETH | ||||
20057609 | 223 days ago | 0.01514332 ETH | ||||
20057571 | 223 days ago | 0.02012214 ETH |
Loading...
Loading
Contract Name:
Aggregate
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-24 */ // File: my/aggregate/IPair.sol pragma solidity ^0.8.0; interface IPair { function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; } // File: my/aggregate/IFactory.sol pragma solidity ^0.8.0; interface IFactory { function getPair(address tokenA, address tokenB) external view returns (IPair pair); } // File: my/aggregate/IRouter.sol pragma solidity ^0.8.0; interface IRouter { function factory() external pure returns (IFactory); function WETH() external pure returns (address); //function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); //function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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: @openzeppelin/[email protected]/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.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: my/aggregate/IWETH.sol pragma solidity ^0.8.0; interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint) external; } // File: @openzeppelin/[email protected]/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/[email protected]/interfaces/IERC1271.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/[email protected]/utils/cryptography/ECDSA.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.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 * ==== * * [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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(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) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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: my/TransferLib.sol pragma solidity ^0.8.0; library TransferLib { function transferFrom(address erc20,address from,address to,uint value) internal { if(from==address(this)){ Address.functionCall(erc20,abi.encodeWithSignature("transfer(address,uint256)",to,value),"TransferLib: transfer error"); } else{ Address.functionCall(erc20,abi.encodeWithSignature("transferFrom(address,address,uint256)",from,to,value,"TransferLib: transfer error")); } } } // File: @openzeppelin/[email protected]/utils/cryptography/SignatureChecker.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol) pragma solidity ^0.8.0; /** * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like * Argent and Gnosis Safe. * * _Available since v4.1._ */ library SignatureChecker { /** * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`. * * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus * change through time. It could return true at block N and false at block N+1 (or the opposite). */ function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); if (error == ECDSA.RecoverError.NoError && recovered == signer) { return true; } (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector); } } // File: @openzeppelin/[email protected]/utils/Multicall.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Multicall.sol) pragma solidity ^0.8.0; /** * @dev Provides a function to batch together multiple calls in a single external call. * * _Available since v4.1._ */ abstract contract Multicall { /** * @dev Receives and executes a batch of function calls on this contract. */ function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { results[i] = Address.functionDelegateCall(address(this), data[i]); } return results; } } // File: my/aggregate/Aggregate.sol pragma solidity ^0.8.0; contract Aggregate is ReentrancyGuard,Ownable { address public feeAddress; uint public feeRate; event Fee(address indexed _feeAddress,address coin,uint amount); event AmountIn(address indexed user,address coin,uint amount); event AmountOut(address indexed user,address coin,uint amount); constructor(address _feeAddress,uint _feeRate) { feeAddress=_feeAddress; feeRate=_feeRate; } function feeAddressAdmin(address _feeAddress) external onlyOwner { feeAddress=_feeAddress; } function feeRateAdmin(uint _feeRate) external onlyOwner { feeRate=_feeRate; } function swapTokensForExactTokens(address coin0,address coin1,address coin2,address coin3, address route0,address route1,address route2, uint amountInMax,uint amountOut, address to,uint deadline) external nonReentrant payable returns(uint) { require(block.timestamp <= deadline, "EXPIRED"); uint result; { uint middle=calcInputs(IRouter(route2),coin2,coin3,amountOut); if(feeAddress!=address(0)&&feeRate>0) { middle=middle*10000/(10000-feeRate); } middle=calcInputs(IRouter(route1),coin1,coin2,middle); result=calcInputs(IRouter(route0),coin0,coin1,middle); } require(result<=amountInMax,"EXCESSIVE_INPUT_AMOUNT"); if(msg.value>result) { payable(msg.sender).transfer(msg.value-result); } _swap(coin0,coin1,coin2,coin3,route0,route1,route2,result,to); return result; } function swapExactTokensForTokens(address coin0,address coin1,address coin2,address coin3, address route0,address route1,address route2, uint amountIn,uint amountMinOut, address to,uint deadline) external nonReentrant payable returns(uint) { require(block.timestamp <= deadline, "EXPIRED"); { uint middle=calcOutputs(IRouter(route0),coin0,coin1,amountIn); middle=calcOutputs(IRouter(route1),coin1,coin2,middle); if(feeAddress!=address(0)&&feeRate>0) { middle=middle*(10000-feeRate)/10000; } middle=calcOutputs(IRouter(route2),coin2,coin3,middle); require(middle>=amountMinOut,"INSUFFICIENT_OUTPUT_AMOUNT"); } uint result=_swap(coin0,coin1,coin2,coin3,route0,route1,route2,amountIn,to); //require(result>=amountMinOut,"INSUFFICIENT_OUTPUT_AMOUNT"); return result; } function _swap(address coin0,address coin1,address coin2,address coin3, address route0,address route1,address route2, uint amountIn,address to) internal returns(uint) { leftToMiddle(IRouter(route0),coin0,coin1,amountIn); middleToMiddle(IRouter(route1),coin1,coin2); getFee(coin2); return middleToRight(IRouter(route2),coin2,coin3,to); } function middleToMiddle(IRouter route,address input,address output) internal { if(input==output) { return; } address weth=route.WETH(); address wapperInput=(input==address(0)?weth:input); address wapperOutput=(output==address(0)?weth:output); if(input==address(0)) { IWETH(weth).deposit{value: address(this).balance}(); } if(wapperInput!=wapperOutput){ IPair pair=route.factory().getPair(wapperInput,wapperOutput); TransferLib.transferFrom(wapperInput,address(this),address(pair),IERC20(wapperInput).balanceOf(address(this))); swap(route,pair,wapperInput,wapperOutput,address(this)); } if(output==address(0)) { IWETH(weth).withdraw(IWETH(weth).balanceOf(address(this))); } } function middleToRight(IRouter route,address input,address output,address to) internal returns(uint) { uint oldUserBalance=balance(output,to); if(input==output) { if(input!=address(0)){ TransferLib.transferFrom(input,address(this),to,IERC20(input).balanceOf(address(this))); } else { payable(to).transfer(address(this).balance); } } else { address weth=route.WETH(); address wapperInput=(input==address(0)?weth:input); address wapperOutput=(output==address(0)?weth:output); if(input==address(0)) { IWETH(weth).deposit{value: address(this).balance}(); } if(wapperInput!=wapperOutput){ IPair pair=route.factory().getPair(wapperInput,wapperOutput); TransferLib.transferFrom(wapperInput,address(this),address(pair),IERC20(wapperInput).balanceOf(address(this))); if(output!=address(0)) { swap(route,pair,wapperInput,wapperOutput,to); } else { swap(route,pair,wapperInput,wapperOutput,address(this)); } } if(output==address(0)) { IWETH(weth).withdraw(IWETH(weth).balanceOf(address(this))); } uint wethBalance=IWETH(weth).balanceOf(address(this)); if(wethBalance>0) { TransferLib.transferFrom(weth,address(this),to,wethBalance); } if(address(this).balance>0) { payable(to).transfer(address(this).balance); } } uint newUserBalance=balance(output,to); emit AmountOut(to,output,newUserBalance-oldUserBalance); return newUserBalance-oldUserBalance; } function leftToMiddle(IRouter route,address input,address output,uint amount) internal { emit AmountIn(msg.sender,input,amount); if(input==output) { if(input!=address(0)){ TransferLib.transferFrom(input,msg.sender,address(this),amount); //IERC20(input).transferFrom(msg.sender,address(this),amount); } else { require(address(this).balance>=amount,"insufficient eth"); } return; } address weth=route.WETH(); address wapperInput=(input==address(0)?weth:input); address wapperOutput=(output==address(0)?weth:output); if(input==address(0)) { require(address(this).balance>=amount,"insufficient eth"); IWETH(weth).deposit{value: amount}(); } if(wapperInput!=wapperOutput){ IPair pair=route.factory().getPair(wapperInput,wapperOutput); if(input==address(0)) { IWETH(weth).transfer(address(pair),amount); } else { TransferLib.transferFrom(input,msg.sender,address(pair),amount); } swap(route,pair,wapperInput,wapperOutput,address(this)); } else { if(input!=address(0)) { TransferLib.transferFrom(input,msg.sender,address(this),amount); } } if(output==address(0)) { IWETH(weth).withdraw(IWETH(weth).balanceOf(address(this))); } } function getFee(address middleCoin) internal { if(feeAddress!=address(0)&&feeRate>0) { uint middle; if(middleCoin!=address(0)){ middle=IERC20(middleCoin).balanceOf(address(this)); } else { middle=address(this).balance; } uint fee=middle-(middle*(10000-feeRate)/10000); if (fee==0){ return; } if(middleCoin!=address(0)) { TransferLib.transferFrom(middleCoin,address(this),feeAddress,fee); //IERC20(middleCoin).transfer(feeAddress,fee); } else { payable(feeAddress).transfer(fee); } emit Fee(feeAddress,middleCoin,fee); } } function calcOutputs(IRouter route,address input,address output,uint amountInput) view internal returns(uint) { if(input==output){ return amountInput; } address weth=route.WETH(); address wapperInput=(input==address(0)?weth:input); address wapperOutput=(output==address(0)?weth:output); if(wapperInput==wapperOutput) { return amountInput; } //IPair pair=route.factory().getPair(wapperInput,wapperOutput); return calcOutput(route,wapperInput,wapperOutput,amountInput); } function calcOutput(IRouter route,address input,address output,uint amountInput) view internal returns(uint amountOutput) { // (address token0,) = sortTokens(input, output); // (uint reserve0, uint reserve1,) = pair.getReserves(); // (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); // amountOutput = route.getAmountOut(amountInput, reserveInput, reserveOutput); address[] memory path=new address[](2); path[0]=input; path[1]=output; amountOutput = route.getAmountsOut(amountInput, path)[1]; } function calcInputs(IRouter route,address input,address output,uint amountOutput) view internal returns(uint) { if(input==output){ return amountOutput; } address weth=route.WETH(); address wapperInput=(input==address(0)?weth:input); address wapperOutput=(output==address(0)?weth:output); if(wapperInput==wapperOutput) { return amountOutput; } //IPair pair=route.factory().getPair(wapperInput,wapperOutput); return calcInput(route,wapperInput,wapperOutput,amountOutput); } function calcInput(IRouter route,address input,address output,uint amountOutput) view internal returns(uint amountInput) { // (address token0,) = sortTokens(input, output); // (uint reserve0, uint reserve1,) = pair.getReserves(); // (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); // amountInput = route.getAmountIn(amountOutput, reserveInput, reserveOutput); address[] memory path=new address[](2); path[0]=input; path[1]=output; amountInput = route.getAmountsIn(amountOutput,path)[0]; } function swap(IRouter route,IPair pair,address input,address output,address to) internal { (address token0,) = sortTokens(input, output); uint amountInput; uint amountOutput; { (uint reserve0, uint reserve1,) = pair.getReserves(); (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); reserveOutput; amountInput = IERC20(input).balanceOf(address(pair))-reserveInput; //amountOutput = route.getAmountOut(amountInput, reserveInput, reserveOutput); amountOutput = calcOutput(route,input,output,amountInput); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); pair.swap(amount0Out, amount1Out, to, new bytes(0)); } function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'ZERO_ADDRESS'); } function balance(address coin,address user) internal view returns(uint) { if(coin==address(0)){ return user.balance; } else { return IERC20(coin).balanceOf(user); } } receive() external payable { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"coin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AmountIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"coin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AmountOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_feeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"coin","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Fee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"feeAddressAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"feeRateAdmin","outputs":[],"stateMutability":"nonpayable","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":"coin0","type":"address"},{"internalType":"address","name":"coin1","type":"address"},{"internalType":"address","name":"coin2","type":"address"},{"internalType":"address","name":"coin3","type":"address"},{"internalType":"address","name":"route0","type":"address"},{"internalType":"address","name":"route1","type":"address"},{"internalType":"address","name":"route2","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountMinOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"coin0","type":"address"},{"internalType":"address","name":"coin1","type":"address"},{"internalType":"address","name":"coin2","type":"address"},{"internalType":"address","name":"coin3","type":"address"},{"internalType":"address","name":"route0","type":"address"},{"internalType":"address","name":"route1","type":"address"},{"internalType":"address","name":"route2","type":"address"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003068380380620030688339810160408190526200003491620000c0565b600160005562000044336200006e565b600280546001600160a01b0319166001600160a01b039390931692909217909155600355620000fc565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060408385031215620000d457600080fd5b82516001600160a01b0381168114620000ec57600080fd5b6020939093015192949293505050565b612f5c806200010c6000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063978bbdb91161004e578063978bbdb914610193578063abf3267f146101a9578063f2fde38b146101c957600080fd5b80638da5cb5b1461015557806390200fe91461018057600080fd5b80632007efdf146100a657806341275358146100c85780636bec7f061461011f578063715018a61461014057600080fd5b366100a157005b600080fd5b3480156100b257600080fd5b506100c66100c1366004612a00565b6101e9565b005b3480156100d457600080fd5b506002546100f59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013261012d366004612a3b565b6101f6565b604051908152602001610116565b34801561014c57600080fd5b506100c66103f1565b34801561016157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166100f5565b61013261018e366004612a3b565b610405565b34801561019f57600080fd5b5061013260035481565b3480156101b557600080fd5b506100c66101c4366004612b04565b610638565b3480156101d557600080fd5b506100c66101e4366004612b04565b610687565b6101f161073e565b600355565b6000600260005403610269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055428210156102d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152606401610260565b60006102e6898e8e896107bf565b90506102f4888d8d846107bf565b60025490915073ffffffffffffffffffffffffffffffffffffffff161580159061032057506000600354115b1561034f576127106003546127106103389190612b50565b6103429083612b63565b61034c9190612ba0565b90505b61035b878c8c846107bf565b9050848110156103c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e540000000000006044820152606401610260565b5060006103db8d8d8d8d8d8d8d8d8c610916565b60016000559d9c50505050505050505050505050565b6103f961073e565b6104036000610952565b565b6000600260005403610473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610260565b6002600055428210156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152606401610260565b6000806104f1888d8d896109c9565b60025490915073ffffffffffffffffffffffffffffffffffffffff161580159061051d57506000600354115b1561054a5760035461053190612710612b50565b61053d82612710612b63565b6105479190612ba0565b90505b610556898e8e846109c9565b90506105648a8f8f846109c9565b915050858111156105d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4558434553534956455f494e5055545f414d4f554e54000000000000000000006044820152606401610260565b8034111561061157336108fc6105e78334612b50565b6040518115909202916000818181858888f1935050505015801561060f573d6000803e3d6000fd5b505b6106228d8d8d8d8d8d8d888c610916565b5060016000559c9b505050505050505050505050565b61064061073e565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61068f61073e565b73ffffffffffffffffffffffffffffffffffffffff8116610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610260565b61073b81610952565b50565b60015473ffffffffffffffffffffffffffffffffffffffff163314610403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610260565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107fb57508061090e565b60008573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff8616156108925785610894565b815b9050600073ffffffffffffffffffffffffffffffffffffffff8616156108ba57856108bc565b825b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108fc5784935050505061090e565b61090888838388610b12565b93505050505b949350505050565b6000610924868b8b86610c84565b61092f858a8a611296565b61093888611706565b61094484898985611919565b9a9950505050505050505050565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a0557508061090e565b60008573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff861615610a9c5785610a9e565b815b9050600073ffffffffffffffffffffffffffffffffffffffff861615610ac45785610ac6565b825b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b065784935050505061090e565b61090888838388611fc6565b604080516002808252606082018352600092839291906020830190803683370190505090508481600081518110610b4b57610b4b612c27565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600181518110610b9957610b99612c27565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517fd06ca61f0000000000000000000000000000000000000000000000000000000081529087169063d06ca61f90610bfc9086908590600401612c56565b600060405180830381865afa158015610c19573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c5f9190810190612cba565b600181518110610c7157610c71612c27565b6020026020010151915050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff851681526020810183905233917f47c01b4372d8d00a5ff56e7bb28d4764bde87072fe64f9ef6bb49290a9bd040e910160405180910390a28173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d9f5773ffffffffffffffffffffffffffffffffffffffff831615610d3557610d3083333084612125565b611290565b80471015610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e73756666696369656e7420657468000000000000000000000000000000006044820152606401610260565b60008473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e109190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff851615610e365784610e38565b815b9050600073ffffffffffffffffffffffffffffffffffffffff851615610e5e5784610e60565b825b905073ffffffffffffffffffffffffffffffffffffffff8616610f495783471015610ee7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e73756666696369656e7420657468000000000000000000000000000000006044820152606401610260565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f2f57600080fd5b505af1158015610f43573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111625760008773ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190612bdb565b905073ffffffffffffffffffffffffffffffffffffffff8716611143576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820187905285169063a9059cbb906044016020604051808303816000875af1158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190612d96565b5061114f565b61114f87338388612125565b61115c8882858530612311565b5061118a565b73ffffffffffffffffffffffffffffffffffffffff86161561118a5761118a86333087612125565b73ffffffffffffffffffffffffffffffffffffffff851661128c576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b9190612db8565b6040518263ffffffff1660e01b815260040161125991815260200190565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050505b5050505b50505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112ce57505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff8416156113655783611367565b815b9050600073ffffffffffffffffffffffffffffffffffffffff84161561138d578361138f565b825b905073ffffffffffffffffffffffffffffffffffffffff851661140e578273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113f457600080fd5b505af1158015611408573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115fc5760008673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190612bdb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529192506115ed918591849073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024015b602060405180830381865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190612db8565b612125565b6115fa8782858530612311565b505b73ffffffffffffffffffffffffffffffffffffffff84166116fe576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612db8565b6040518263ffffffff1660e01b81526004016116cb91815260200190565b600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b505050505b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff161580159061172f57506000600354115b1561073b57600073ffffffffffffffffffffffffffffffffffffffff8216156117e7576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190612db8565b90506117ea565b50475b60006127106003546127106117ff9190612b50565b6118099084612b63565b6118139190612ba0565b61181d9083612b50565b90508060000361182c57505050565b73ffffffffffffffffffffffffffffffffffffffff8316156118745760025461186f908490309073ffffffffffffffffffffffffffffffffffffffff1684612125565b6118bd565b60025460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f193505050501580156118bb573d6000803e3d6000fd5b505b6002546040805173ffffffffffffffffffffffffffffffffffffffff868116825260208201859052909216917f6ded982279c8387ad8a63e73385031a3807c1862e633f06e09d11bcb6e282f60910160405180910390a2505050565b600080611926848461259a565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a215773ffffffffffffffffffffffffffffffffffffffff8516156119d9576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190526119d491879190869073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024016115a7565b611f31565b60405173ffffffffffffffffffffffffffffffffffffffff8416904780156108fc02916000818181858888f19350505050158015611a1b573d6000803e3d6000fd5b50611f31565b60008673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff871615611ab85786611aba565b815b9050600073ffffffffffffffffffffffffffffffffffffffff871615611ae05786611ae2565b825b905073ffffffffffffffffffffffffffffffffffffffff8816611b61578273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b4757600080fd5b505af1158015611b5b573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d3b5760008973ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9f9190612bdb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201819052919250611cfe918591849073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024016115a7565b73ffffffffffffffffffffffffffffffffffffffff881615611d2c57611d278a8285858b612311565b611d39565b611d398a82858530612311565b505b73ffffffffffffffffffffffffffffffffffffffff8716611e3d576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dec9190612db8565b6040518263ffffffff1660e01b8152600401611e0a91815260200190565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190612db8565b90508015611ee257611ee284308984612125565b4715611f2c5760405173ffffffffffffffffffffffffffffffffffffffff8816904780156108fc02916000818181858888f19350505050158015611f2a573d6000803e3d6000fd5b505b505050505b6000611f3d858561259a565b905073ffffffffffffffffffffffffffffffffffffffff84167f187c8f04980a0b7b0b509a5c76d79182360df767d78bf86ded992bdc0d1015b986611f828585612b50565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520160405180910390a2611fbb8282612b50565b979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090508481600081518110611fff57611fff612c27565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160018151811061204d5761204d612c27565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f1f00ca7400000000000000000000000000000000000000000000000000000000815290871690631f00ca74906120b09086908590600401612c56565b600060405180830381865afa1580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121139190810190612cba565b600081518110610c7157610c71612c27565b3073ffffffffffffffffffffffffffffffffffffffff8416036122245760405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261221e908590606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790528151808301909252601b82527f5472616e736665724c69623a207472616e73666572206572726f7200000000009082015261266e565b50611290565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905260806084820152601b60a48201527f5472616e736665724c69623a207472616e73666572206572726f72000000000060c482015261230a90859060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612687565b5050505050565b600061231d84846126c9565b5090506000806000808873ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123959190612df4565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146123f75782846123fa565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa15801561246e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124929190612db8565b61249c9190612b50565b95506124aa8c8b8b89610b12565b9450505050506000808473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146124ee578260006124f2565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9061255c90859085908b9060248101612eb2565b600060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b5050505050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff83166125d5575073ffffffffffffffffffffffffffffffffffffffff811631612668565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906370a0823190602401602060405180830381865afa158015612641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126659190612db8565b90505b92915050565b606061267d8484600085612827565b90505b9392505050565b606061266583836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061266e565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f414444524553534553000000000000000000000000006044820152606401610260565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061279b57828461279e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610260565b9250929050565b6060824710156128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610260565b73ffffffffffffffffffffffffffffffffffffffff85163b612937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610260565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129609190612ef7565b60006040518083038185875af1925050503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b5091509150611fbb828286606083156129bc575081612680565b8251156129cc5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609190612f13565b600060208284031215612a1257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073b57600080fd5b60008060008060008060008060008060006101608c8e031215612a5d57600080fd5b8b35612a6881612a19565b9a5060208c0135612a7881612a19565b995060408c0135612a8881612a19565b985060608c0135612a9881612a19565b975060808c0135612aa881612a19565b965060a08c0135612ab881612a19565b955060c08c0135612ac881612a19565b945060e08c013593506101008c013592506101208c0135612ae881612a19565b809250506101408c013590509295989b509295989b9093969950565b600060208284031215612b1657600080fd5b813561268081612a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561266857612668612b21565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9b57612b9b612b21565b500290565b600082612bd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215612bed57600080fd5b815161268081612a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612cad57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612c7b565b5090979650505050505050565b60006020808385031215612ccd57600080fd5b825167ffffffffffffffff80821115612ce557600080fd5b818501915085601f830112612cf957600080fd5b815181811115612d0b57612d0b612bf8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612d4e57612d4e612bf8565b604052918252848201925083810185019188831115612d6c57600080fd5b938501935b82851015612d8a57845184529385019392850192612d71565b98975050505050505050565b600060208284031215612da857600080fd5b8151801515811461268057600080fd5b600060208284031215612dca57600080fd5b5051919050565b80516dffffffffffffffffffffffffffff81168114612def57600080fd5b919050565b600080600060608486031215612e0957600080fd5b612e1284612dd1565b9250612e2060208501612dd1565b9150604084015163ffffffff81168114612e3957600080fd5b809150509250925092565b60005b83811015612e5f578181015183820152602001612e47565b50506000910152565b60008151808452612e80816020860160208601612e44565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000612eed6080830184612e68565b9695505050505050565b60008251612f09818460208701612e44565b9190910192915050565b6020815260006126656020830184612e6856fea2646970667358221220780dcd83a0b1650855275241b6e875a8d10cb2569e8a89f3b149e124adde993d64736f6c634300081000330000000000000000000000005363828a7c57355a6845b787a66912f45717ea7e000000000000000000000000000000000000000000000000000000000000001e
Deployed Bytecode
0x60806040526004361061009a5760003560e01c80638da5cb5b11610069578063978bbdb91161004e578063978bbdb914610193578063abf3267f146101a9578063f2fde38b146101c957600080fd5b80638da5cb5b1461015557806390200fe91461018057600080fd5b80632007efdf146100a657806341275358146100c85780636bec7f061461011f578063715018a61461014057600080fd5b366100a157005b600080fd5b3480156100b257600080fd5b506100c66100c1366004612a00565b6101e9565b005b3480156100d457600080fd5b506002546100f59073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61013261012d366004612a3b565b6101f6565b604051908152602001610116565b34801561014c57600080fd5b506100c66103f1565b34801561016157600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff166100f5565b61013261018e366004612a3b565b610405565b34801561019f57600080fd5b5061013260035481565b3480156101b557600080fd5b506100c66101c4366004612b04565b610638565b3480156101d557600080fd5b506100c66101e4366004612b04565b610687565b6101f161073e565b600355565b6000600260005403610269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055428210156102d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152606401610260565b60006102e6898e8e896107bf565b90506102f4888d8d846107bf565b60025490915073ffffffffffffffffffffffffffffffffffffffff161580159061032057506000600354115b1561034f576127106003546127106103389190612b50565b6103429083612b63565b61034c9190612ba0565b90505b61035b878c8c846107bf565b9050848110156103c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f494e53554646494349454e545f4f55545055545f414d4f554e540000000000006044820152606401610260565b5060006103db8d8d8d8d8d8d8d8d8c610916565b60016000559d9c50505050505050505050505050565b6103f961073e565b6104036000610952565b565b6000600260005403610473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610260565b6002600055428210156104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152606401610260565b6000806104f1888d8d896109c9565b60025490915073ffffffffffffffffffffffffffffffffffffffff161580159061051d57506000600354115b1561054a5760035461053190612710612b50565b61053d82612710612b63565b6105479190612ba0565b90505b610556898e8e846109c9565b90506105648a8f8f846109c9565b915050858111156105d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4558434553534956455f494e5055545f414d4f554e54000000000000000000006044820152606401610260565b8034111561061157336108fc6105e78334612b50565b6040518115909202916000818181858888f1935050505015801561060f573d6000803e3d6000fd5b505b6106228d8d8d8d8d8d8d888c610916565b5060016000559c9b505050505050505050505050565b61064061073e565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61068f61073e565b73ffffffffffffffffffffffffffffffffffffffff8116610732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610260565b61073b81610952565b50565b60015473ffffffffffffffffffffffffffffffffffffffff163314610403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610260565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107fb57508061090e565b60008573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff8616156108925785610894565b815b9050600073ffffffffffffffffffffffffffffffffffffffff8616156108ba57856108bc565b825b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108fc5784935050505061090e565b61090888838388610b12565b93505050505b949350505050565b6000610924868b8b86610c84565b61092f858a8a611296565b61093888611706565b61094484898985611919565b9a9950505050505050505050565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a0557508061090e565b60008573ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a769190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff861615610a9c5785610a9e565b815b9050600073ffffffffffffffffffffffffffffffffffffffff861615610ac45785610ac6565b825b90508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b065784935050505061090e565b61090888838388611fc6565b604080516002808252606082018352600092839291906020830190803683370190505090508481600081518110610b4b57610b4b612c27565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508381600181518110610b9957610b99612c27565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517fd06ca61f0000000000000000000000000000000000000000000000000000000081529087169063d06ca61f90610bfc9086908590600401612c56565b600060405180830381865afa158015610c19573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c5f9190810190612cba565b600181518110610c7157610c71612c27565b6020026020010151915050949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff851681526020810183905233917f47c01b4372d8d00a5ff56e7bb28d4764bde87072fe64f9ef6bb49290a9bd040e910160405180910390a28173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d9f5773ffffffffffffffffffffffffffffffffffffffff831615610d3557610d3083333084612125565b611290565b80471015610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e73756666696369656e7420657468000000000000000000000000000000006044820152606401610260565b60008473ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e109190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff851615610e365784610e38565b815b9050600073ffffffffffffffffffffffffffffffffffffffff851615610e5e5784610e60565b825b905073ffffffffffffffffffffffffffffffffffffffff8616610f495783471015610ee7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e73756666696369656e7420657468000000000000000000000000000000006044820152606401610260565b8273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610f2f57600080fd5b505af1158015610f43573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146111625760008773ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110879190612bdb565b905073ffffffffffffffffffffffffffffffffffffffff8716611143576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820187905285169063a9059cbb906044016020604051808303816000875af1158015611119573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113d9190612d96565b5061114f565b61114f87338388612125565b61115c8882858530612311565b5061118a565b73ffffffffffffffffffffffffffffffffffffffff86161561118a5761118a86333087612125565b73ffffffffffffffffffffffffffffffffffffffff851661128c576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b9190612db8565b6040518263ffffffff1660e01b815260040161125991815260200190565b600060405180830381600087803b15801561127357600080fd5b505af1158015611287573d6000803e3d6000fd5b505050505b5050505b50505050565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112ce57505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff8416156113655783611367565b815b9050600073ffffffffffffffffffffffffffffffffffffffff84161561138d578361138f565b825b905073ffffffffffffffffffffffffffffffffffffffff851661140e578273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113f457600080fd5b505af1158015611408573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146115fc5760008673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b29190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154c9190612bdb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190529192506115ed918591849073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024015b602060405180830381865afa1580156115c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e89190612db8565b612125565b6115fa8782858530612311565b505b73ffffffffffffffffffffffffffffffffffffffff84166116fe576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612db8565b6040518263ffffffff1660e01b81526004016116cb91815260200190565b600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b505050505b505050505050565b60025473ffffffffffffffffffffffffffffffffffffffff161580159061172f57506000600354115b1561073b57600073ffffffffffffffffffffffffffffffffffffffff8216156117e7576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e09190612db8565b90506117ea565b50475b60006127106003546127106117ff9190612b50565b6118099084612b63565b6118139190612ba0565b61181d9083612b50565b90508060000361182c57505050565b73ffffffffffffffffffffffffffffffffffffffff8316156118745760025461186f908490309073ffffffffffffffffffffffffffffffffffffffff1684612125565b6118bd565b60025460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f193505050501580156118bb573d6000803e3d6000fd5b505b6002546040805173ffffffffffffffffffffffffffffffffffffffff868116825260208201859052909216917f6ded982279c8387ad8a63e73385031a3807c1862e633f06e09d11bcb6e282f60910160405180910390a2505050565b600080611926848461259a565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611a215773ffffffffffffffffffffffffffffffffffffffff8516156119d9576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482018190526119d491879190869073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024016115a7565b611f31565b60405173ffffffffffffffffffffffffffffffffffffffff8416904780156108fc02916000818181858888f19350505050158015611a1b573d6000803e3d6000fd5b50611f31565b60008673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a929190612bdb565b9050600073ffffffffffffffffffffffffffffffffffffffff871615611ab85786611aba565b815b9050600073ffffffffffffffffffffffffffffffffffffffff871615611ae05786611ae2565b825b905073ffffffffffffffffffffffffffffffffffffffff8816611b61578273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b4757600080fd5b505af1158015611b5b573d6000803e3d6000fd5b50505050505b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614611d3b5760008973ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c059190612bdb565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85811660048301528481166024830152919091169063e6a4390590604401602060405180830381865afa158015611c7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9f9190612bdb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201819052919250611cfe918591849073ffffffffffffffffffffffffffffffffffffffff8416906370a08231906024016115a7565b73ffffffffffffffffffffffffffffffffffffffff881615611d2c57611d278a8285858b612311565b611d39565b611d398a82858530612311565b505b73ffffffffffffffffffffffffffffffffffffffff8716611e3d576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff841690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dec9190612db8565b6040518263ffffffff1660e01b8152600401611e0a91815260200190565b600060405180830381600087803b158015611e2457600080fd5b505af1158015611e38573d6000803e3d6000fd5b505050505b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190612db8565b90508015611ee257611ee284308984612125565b4715611f2c5760405173ffffffffffffffffffffffffffffffffffffffff8816904780156108fc02916000818181858888f19350505050158015611f2a573d6000803e3d6000fd5b505b505050505b6000611f3d858561259a565b905073ffffffffffffffffffffffffffffffffffffffff84167f187c8f04980a0b7b0b509a5c76d79182360df767d78bf86ded992bdc0d1015b986611f828585612b50565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520160405180910390a2611fbb8282612b50565b979650505050505050565b604080516002808252606082018352600092839291906020830190803683370190505090508481600081518110611fff57611fff612c27565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838160018151811061204d5761204d612c27565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526040517f1f00ca7400000000000000000000000000000000000000000000000000000000815290871690631f00ca74906120b09086908590600401612c56565b600060405180830381865afa1580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526121139190810190612cba565b600081518110610c7157610c71612c27565b3073ffffffffffffffffffffffffffffffffffffffff8416036122245760405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261221e908590606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790528151808301909252601b82527f5472616e736665724c69623a207472616e73666572206572726f7200000000009082015261266e565b50611290565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905260806084820152601b60a48201527f5472616e736665724c69623a207472616e73666572206572726f72000000000060c482015261230a90859060e401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052612687565b5050505050565b600061231d84846126c9565b5090506000806000808873ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123959190612df4565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16146123f75782846123fa565b83835b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8e8116600483015292945090925083918c16906370a0823190602401602060405180830381865afa15801561246e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124929190612db8565b61249c9190612b50565b95506124aa8c8b8b89610b12565b9450505050506000808473ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146124ee578260006124f2565b6000835b604080516000815260208101918290527f022c0d9f00000000000000000000000000000000000000000000000000000000909152919350915073ffffffffffffffffffffffffffffffffffffffff8a169063022c0d9f9061255c90859085908b9060248101612eb2565b600060405180830381600087803b15801561257657600080fd5b505af115801561258a573d6000803e3d6000fd5b5050505050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff83166125d5575073ffffffffffffffffffffffffffffffffffffffff811631612668565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906370a0823190602401602060405180830381865afa158015612641573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126659190612db8565b90505b92915050565b606061267d8484600085612827565b90505b9392505050565b606061266583836040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061266e565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4944454e544943414c5f414444524553534553000000000000000000000000006044820152606401610260565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161061279b57828461279e565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610260565b9250929050565b6060824710156128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610260565b73ffffffffffffffffffffffffffffffffffffffff85163b612937576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610260565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516129609190612ef7565b60006040518083038185875af1925050503d806000811461299d576040519150601f19603f3d011682016040523d82523d6000602084013e6129a2565b606091505b5091509150611fbb828286606083156129bc575081612680565b8251156129cc5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102609190612f13565b600060208284031215612a1257600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073b57600080fd5b60008060008060008060008060008060006101608c8e031215612a5d57600080fd5b8b35612a6881612a19565b9a5060208c0135612a7881612a19565b995060408c0135612a8881612a19565b985060608c0135612a9881612a19565b975060808c0135612aa881612a19565b965060a08c0135612ab881612a19565b955060c08c0135612ac881612a19565b945060e08c013593506101008c013592506101208c0135612ae881612a19565b809250506101408c013590509295989b509295989b9093969950565b600060208284031215612b1657600080fd5b813561268081612a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561266857612668612b21565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9b57612b9b612b21565b500290565b600082612bd6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215612bed57600080fd5b815161268081612a19565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b81811015612cad57845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612c7b565b5090979650505050505050565b60006020808385031215612ccd57600080fd5b825167ffffffffffffffff80821115612ce557600080fd5b818501915085601f830112612cf957600080fd5b815181811115612d0b57612d0b612bf8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612d4e57612d4e612bf8565b604052918252848201925083810185019188831115612d6c57600080fd5b938501935b82851015612d8a57845184529385019392850192612d71565b98975050505050505050565b600060208284031215612da857600080fd5b8151801515811461268057600080fd5b600060208284031215612dca57600080fd5b5051919050565b80516dffffffffffffffffffffffffffff81168114612def57600080fd5b919050565b600080600060608486031215612e0957600080fd5b612e1284612dd1565b9250612e2060208501612dd1565b9150604084015163ffffffff81168114612e3957600080fd5b809150509250925092565b60005b83811015612e5f578181015183820152602001612e47565b50506000910152565b60008151808452612e80816020860160208601612e44565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000612eed6080830184612e68565b9695505050505050565b60008251612f09818460208701612e44565b9190910192915050565b6020815260006126656020830184612e6856fea2646970667358221220780dcd83a0b1650855275241b6e875a8d10cb2569e8a89f3b149e124adde993d64736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005363828a7c57355a6845b787a66912f45717ea7e000000000000000000000000000000000000000000000000000000000000001e
-----Decoded View---------------
Arg [0] : _feeAddress (address): 0x5363828a7c57355a6845B787a66912f45717EA7E
Arg [1] : _feeRate (uint256): 30
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005363828a7c57355a6845b787a66912f45717ea7e
Arg [1] : 000000000000000000000000000000000000000000000000000000000000001e
Deployed Bytecode Sourcemap
35697:12205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36256:91;;;;;;;;;;-1:-1:-1;36256:91:0;;;;;:::i;:::-;;:::i;:::-;;35750:25;;;;;;;;;;-1:-1:-1;35750:25:0;;;;;;;;;;;375:42:1;363:55;;;345:74;;333:2;318:18;35750:25:0;;;;;;;;37428:1035;;;;;;:::i;:::-;;:::i;:::-;;;2188:25:1;;;2176:2;2161:18;37428:1035:0;2042:177:1;4579:103:0;;;;;;;;;;;;;:::i;3931:87::-;;;;;;;;;;-1:-1:-1;4004:6:0;;;;3931:87;;36355:1065;;;;;;:::i;:::-;;:::i;35782:19::-;;;;;;;;;;;;;;;;36142:106;;;;;;;;;;-1:-1:-1;36142:106:0;;;;;:::i;:::-;;:::i;4837:201::-;;;;;;;;;;-1:-1:-1;4837:201:0;;;;;:::i;:::-;;:::i;36256:91::-;3817:13;:11;:13::i;:::-;36323:7:::1;:16:::0;36256:91::o;37428:1035::-;37779:4;10280:1;10878:7;;:19;10870:63;;;;;;;2678:2:1;10870:63:0;;;2660:21:1;2717:2;2697:18;;;2690:30;2756:33;2736:18;;;2729:61;2807:18;;10870:63:0;;;;;;;;;10280:1;11011:7;:18;37804:15:::1;:27:::0;-1:-1:-1;37804:27:0::1;37796:47;;;::::0;::::1;::::0;;3038:2:1;37796:47:0::1;::::0;::::1;3020:21:1::0;3077:1;3057:18;;;3050:29;3115:9;3095:18;;;3088:37;3142:18;;37796:47:0::1;2836:330:1::0;37796:47:0::1;37869:11;37881:49;37901:6;37909:5;37915;37921:8;37881:11;:49::i;:::-;37869:61;;37952:47;37972:6;37980:5;37986;37992:6;37952:11;:47::i;:::-;38017:10;::::0;37945:54;;-1:-1:-1;38017:22:0::1;:10;:22:::0;;::::1;::::0;:33:::1;;;38049:1;38041:7;;:9;38017:33;38014:108;;;38101:5;38092:7;;38086:5;:13;;;;:::i;:::-;38078:22;::::0;:6;:22:::1;:::i;:::-;:28;;;;:::i;:::-;38071:35;;38014:108;38143:47;38163:6;38171:5;38177;38183:6;38143:11;:47::i;:::-;38136:54;;38221:12;38213:6;:20;;38205:58;;;::::0;::::1;::::0;;4207:2:1;38205:58:0::1;::::0;::::1;4189:21:1::0;4246:2;4226:18;;;4219:30;4285:28;4265:18;;;4258:56;4331:18;;38205:58:0::1;4005:350:1::0;38205:58:0::1;37854:421;38285:11;38297:63;38303:5;38309;38315;38321;38327:6;38334;38341;38348:8;38357:2;38297:5;:63::i;:::-;10236:1:::0;11190:7;:22;38285:75;37428:1035;-1:-1:-1;;;;;;;;;;;;;37428:1035:0:o;4579:103::-;3817:13;:11;:13::i;:::-;4644:30:::1;4671:1;4644:18;:30::i;:::-;4579:103::o:0;36355:1065::-;36706:4;10280:1;10878:7;;:19;10870:63;;;;;;;2678:2:1;10870:63:0;;;2660:21:1;2717:2;2697:18;;;2690:30;2756:33;2736:18;;;2729:61;2807:18;;10870:63:0;2476:355:1;10870:63:0;10280:1;11011:7;:18;36731:15:::1;:27:::0;-1:-1:-1;36731:27:0::1;36723:47;;;::::0;::::1;::::0;;3038:2:1;36723:47:0::1;::::0;::::1;3020:21:1::0;3077:1;3057:18;;;3050:29;3115:9;3095:18;;;3088:37;3142:18;;36723:47:0::1;2836:330:1::0;36723:47:0::1;36781:11;36818::::0;36830:49:::1;36849:6;36857:5;36863;36869:9;36830:10;:49::i;:::-;36897:10;::::0;36818:61;;-1:-1:-1;36897:22:0::1;:10;:22:::0;;::::1;::::0;:33:::1;;;36929:1;36921:7;;:9;36897:33;36894:108;;;36978:7;::::0;36972:13:::1;::::0;:5:::1;:13;:::i;:::-;36958:12;:6:::0;36965:5:::1;36958:12;:::i;:::-;:28;;;;:::i;:::-;36951:35;;36894:108;37023:46;37042:6;37050:5;37056;37062:6;37023:10;:46::i;:::-;37016:53;;37091:46;37110:6;37118:5;37124;37130:6;37091:10;:46::i;:::-;37084:53;;36803:346;37175:11;37167:6;:19;;37159:53;;;::::0;::::1;::::0;;4562:2:1;37159:53:0::1;::::0;::::1;4544:21:1::0;4601:2;4581:18;;;4574:30;4640:24;4620:18;;;4613:52;4682:18;;37159:53:0::1;4360:346:1::0;37159:53:0::1;37236:6;37226:9;:16;37223:94;;;37267:10;37259:46;37288:16;37298:6:::0;37288:9:::1;:16;:::i;:::-;37259:46;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;37223:94;37327:61;37333:5;37339;37345;37351;37357:6;37364;37371;37378;37385:2;37327:5;:61::i;:::-;-1:-1:-1::0;10236:1:0;11190:7;:22;37406:6;36355:1065;-1:-1:-1;;;;;;;;;;;;36355:1065:0:o;36142:106::-;3817:13;:11;:13::i;:::-;36218:10:::1;:22:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;36142:106::o;4837:201::-;3817:13;:11;:13::i;:::-;4926:22:::1;::::0;::::1;4918:73;;;::::0;::::1;::::0;;4913:2:1;4918:73:0::1;::::0;::::1;4895:21:1::0;4952:2;4932:18;;;4925:30;4991:34;4971:18;;;4964:62;5062:8;5042:18;;;5035:36;5088:19;;4918:73:0::1;4711:402:1::0;4918:73:0::1;5002:28;5021:8;5002:18;:28::i;:::-;4837:201:::0;:::o;4096:132::-;4004:6;;4160:23;4004:6;2556:10;4160:23;4152:68;;;;;;;5320:2:1;4152:68:0;;;5302:21:1;;;5339:18;;;5332:30;5398:34;5378:18;;;5371:62;5450:18;;4152:68:0;5118:356:1;43995:581:0;44099:4;44126:6;44119:13;;:5;:13;;;44116:62;;-1:-1:-1;44155:11:0;44148:18;;44116:62;44188:12;44201:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44188:25;-1:-1:-1;44224:19:0;44245:17;;;;:28;;44268:5;44245:28;;;44263:4;44245:28;44224:50;-1:-1:-1;44285:20:0;44307:18;;;;:30;;44331:6;44307:30;;;44326:4;44307:30;44285:53;;44365:12;44352:25;;:11;:25;;;44349:75;;44401:11;44394:18;;;;;;;44349:75;44514:54;44525:5;44531:11;44543:12;44556:11;44514:10;:54::i;:::-;44507:61;;;;;43995:581;;;;;;;:::o;38471:455::-;38710:4;38727:50;38748:6;38756:5;38762;38768:8;38727:12;:50::i;:::-;38788:43;38811:6;38819:5;38825;38788:14;:43::i;:::-;38842:13;38849:5;38842:6;:13::i;:::-;38873:45;38895:6;38903:5;38909;38915:2;38873:13;:45::i;:::-;38866:52;38471:455;-1:-1:-1;;;;;;;;;;38471:455:0:o;5198:191::-;5291:6;;;;5308:17;;;;;;;;;;;5341:40;;5291:6;;;5308:17;5291:6;;5341:40;;5272:16;;5341:40;5261:128;5198:191;:::o;45218:583::-;45322:4;45349:6;45342:13;;:5;:13;;;45339:63;;-1:-1:-1;45378:12:0;45371:19;;45339:63;45412:12;45425:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45412:25;-1:-1:-1;45448:19:0;45469:17;;;;:28;;45492:5;45469:28;;;45487:4;45469:28;45448:50;-1:-1:-1;45509:20:0;45531:18;;;;:30;;45555:6;45531:30;;;45550:4;45531:30;45509:53;;45589:12;45576:25;;:11;:25;;;45573:76;;45625:12;45618:19;;;;;;;45573:76;45739:54;45749:5;45755:11;45767:12;45780;45739:9;:54::i;44584:626::-;45070:16;;;45084:1;45070:16;;;;;;;;44687:17;;;;45070:16;45084:1;45070:16;;;;;;;;;;-1:-1:-1;45070:16:0;45048:38;;45105:5;45097:4;45102:1;45097:7;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;45129:6;45121:4;45126:1;45121:7;;;;;;;;:::i;:::-;:14;;;;:7;;;;;;;;;:14;45161:38;;;;;:19;;;;;;:38;;45181:11;;45194:4;;45161:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45200:1;45161:41;;;;;;;;:::i;:::-;;;;;;;45146:56;;44706:504;44584:626;;;;;;:::o;41663:1527::-;41766:33;;;;8231:55:1;;8213:74;;8318:2;8303:18;;8296:34;;;41775:10:0;;41766:33;;8186:18:1;41766:33:0;;;;;;;41820:6;41813:13;;:5;:13;;;41810:362;;41846:17;;;;41843:297;;41883:63;41908:5;41914:10;41933:4;41939:6;41883:24;:63::i;:::-;42154:7;;41843:297;42098:6;42075:21;:29;;42067:57;;;;;;;8543:2:1;42067:57:0;;;8525:21:1;8582:2;8562:18;;;8555:30;8621:18;8601;;;8594:46;8657:18;;42067:57:0;8341:340:1;41810:362:0;42182:12;42195:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42182:25;-1:-1:-1;42218:19:0;42239:17;;;;:28;;42262:5;42239:28;;;42257:4;42239:28;42218:50;-1:-1:-1;42279:20:0;42301:18;;;;:30;;42325:6;42301:30;;;42320:4;42301:30;42279:53;-1:-1:-1;42346:17:0;;;42343:157;;42411:6;42388:21;:29;;42380:57;;;;;;;8543:2:1;42380:57:0;;;8525:21:1;8582:2;8562:18;;;8555:30;8621:18;8601;;;8594:46;8657:18;;42380:57:0;8341:340:1;42380:57:0;42458:4;42452:19;;;42479:6;42452:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42343:157;42526:12;42513:25;;:11;:25;;;42510:555;;42554:10;42565:5;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;;;:23;9210:15:1;;;42565:49:0;;;9192:34:1;9262:15;;;9242:18;;;9235:43;42565:23:0;;;;;;;9104:18:1;;42565:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42554:60;-1:-1:-1;42632:17:0;;;42629:203;;42670:42;;;;;:20;8231:55:1;;;42670:42:0;;;8213:74:1;8303:18;;;8296:34;;;42670:20:0;;;;;8186:18:1;;42670:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42629:203;;;42753:63;42778:5;42784:10;42803:4;42809:6;42753:24;:63::i;:::-;42846:55;42851:5;42857:4;42862:11;42874:12;42895:4;42846;:55::i;:::-;42539:374;42510:555;;;42937:17;;;;42934:120;;42975:63;43000:5;43006:10;43025:4;43031:6;42975:24;:63::i;:::-;43078:18;;;43075:108;;43134:36;;;;;43164:4;43134:36;;;345:74:1;43113:20:0;;;;;;;;43134:21;;318:18:1;;43134:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43113:58;;;;;;;;;;;;;2188:25:1;;2176:2;2161:18;;2042:177;43113:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43075:108;41750:1440;;;41663:1527;;;;;:::o;38934:856::-;39032:6;39025:13;;:5;:13;;;39022:51;;38934:856;;;:::o;39022:51::-;39083:12;39096:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39083:25;-1:-1:-1;39119:19:0;39140:17;;;;:28;;39163:5;39140:28;;;39158:4;39140:28;39119:50;-1:-1:-1;39180:20:0;39202:18;;;;:30;;39226:6;39202:30;;;39221:4;39202:30;39180:53;-1:-1:-1;39247:17:0;;;39244:100;;39287:4;39281:19;;;39308:21;39281:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39244:100;39370:12;39357:25;;:11;:25;;;39354:311;;39398:10;39409:5;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;;;:23;9210:15:1;;;39409:49:0;;;9192:34:1;9262:15;;;9242:18;;;9235:43;39409:23:0;;;;;;;9104:18:1;;39409:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39538:44;;;;;39518:4;39538:44;;;345:74:1;;;39398:60:0;;-1:-1:-1;39473:110:0;;39498:11;;39398:60;;39538:29;;;;;;318:18:1;;39538:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39473:24;:110::i;:::-;39598:55;39603:5;39609:4;39614:11;39626:12;39647:4;39598;:55::i;:::-;39383:282;39354:311;39678:18;;;39675:108;;39734:36;;;;;39764:4;39734:36;;;345:74:1;39713:20:0;;;;;;;;39734:21;;318:18:1;;39734:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39713:58;;;;;;;;;;;;;2188:25:1;;2176:2;2161:18;;2042:177;39713:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39675:108;39011:779;;;38934:856;;;:::o;43198:789::-;43257:10;;:22;:10;:22;;;;:33;;;43289:1;43281:7;;:9;43257:33;43254:726;;;43307:11;43336:22;;;;43333:180;;43385:43;;;;;43422:4;43385:43;;;345:74:1;43385:28:0;;;;;;318:18:1;;43385:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43378:50;;43333:180;;;-1:-1:-1;43476:21:0;43333:180;43527:8;43567:5;43558:7;;43552:5;:13;;;;:::i;:::-;43544:22;;:6;:22;:::i;:::-;:28;;;;:::i;:::-;43536:37;;:6;:37;:::i;:::-;43527:46;;43592:3;43597:1;43592:6;43588:52;;43618:7;;43198:789;:::o;43588:52::-;43657:22;;;;43654:265;;43750:10;;43700:65;;43725:10;;43744:4;;43750:10;;43761:3;43700:24;:65::i;:::-;43654:265;;;43878:10;;43870:33;;43878:10;;;;;43870:33;;;;;43899:3;;43878:10;43870:33;43878:10;43870:33;43899:3;43878:10;43870:33;;;;;;;;;;;;;;;;;;;;;43654:265;43942:10;;43938:30;;;43942:10;8231:55:1;;;8213:74;;8318:2;8303:18;;8296:34;;;43942:10:0;;;;43938:30;;8186:18:1;43938:30:0;;;;;;;43292:688;;43198:789;:::o;39798:1857::-;39893:4;39910:19;39930:18;39938:6;39945:2;39930:7;:18::i;:::-;39910:38;;39969:6;39962:13;;:5;:13;;;39959:1527;;39995:17;;;;39992:227;;40080:38;;;;;40071:4;40080:38;;;345:74:1;;;40032:87:0;;40057:5;;40071:4;40077:2;;40080:23;;;;;;318:18:1;;40080:38:0;199:226:1;40032:87:0;39959:1527;;39992:227;40160:43;;:20;;;;40181:21;40160:43;;;;;;;;;40181:21;40160:20;:43;;;;;;;;;;;;;;;;;;;;;39959:1527;;;40251:12;40264:5;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40251:25;-1:-1:-1;40291:19:0;40312:17;;;;:28;;40335:5;40312:28;;;40330:4;40312:28;40291:50;-1:-1:-1;40356:20:0;40378:18;;;;:30;;40402:6;40378:30;;;40397:4;40378:30;40356:53;-1:-1:-1;40427:17:0;;;40424:108;;40471:4;40465:19;;;40492:21;40465:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40424:108;40562:12;40549:25;;:11;:25;;;40546:485;;40594:10;40605:5;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;;;:23;9210:15:1;;;40605:49:0;;;9192:34:1;9262:15;;;9242:18;;;9235:43;40605:23:0;;;;;;;9104:18:1;;40605:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40738:44;;;;;40718:4;40738:44;;;345:74:1;;;40594:60:0;;-1:-1:-1;40673:110:0;;40698:11;;40594:60;;40738:29;;;;;;318:18:1;;40738:44:0;199:226:1;40673:110:0;40805:18;;;;40802:214;;40848:44;40853:5;40859:4;40864:11;40876:12;40889:2;40848:4;:44::i;:::-;40802:214;;;40941:55;40946:5;40952:4;40957:11;40969:12;40990:4;40941;:55::i;:::-;40575:456;40546:485;41048:18;;;41045:116;;41108:36;;;;;41138:4;41108:36;;;345:74:1;41087:20:0;;;;;;;;41108:21;;318:18:1;;41108:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41087:58;;;;;;;;;;;;;2188:25:1;;2176:2;2161:18;;2042:177;41087:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41045:116;41192:36;;;;;41222:4;41192:36;;;345:74:1;41175:16:0;;41192:21;;;;;;318:18:1;;41192:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41175:53;-1:-1:-1;41246:13:0;;41243:112;;41280:59;41305:4;41318;41324:2;41327:11;41280:24;:59::i;:::-;41372:21;:23;41369:106;;41416:43;;:20;;;;41437:21;41416:43;;;;;;;;;41437:21;41416:20;:43;;;;;;;;;;;;;;;;;;;;;41369:106;40236:1250;;;;39959:1527;41496:19;41516:18;41524:6;41531:2;41516:7;:18::i;:::-;41496:38;-1:-1:-1;41550:50:0;;;;41563:6;41570:29;41585:14;41496:38;41570:29;:::i;:::-;41550:50;;;8243:42:1;8231:55;;;8213:74;;8318:2;8303:18;;8296:34;;;;8186:18;41550:50:0;;;;;;;41618:29;41633:14;41618;:29;:::i;:::-;41611:36;39798:1857;-1:-1:-1;;;;;;;39798:1857:0:o;45809:622::-;46293:16;;;46307:1;46293:16;;;;;;;;45912;;;;46293;46307:1;46293:16;;;;;;;;;;-1:-1:-1;46293:16:0;46271:38;;46328:5;46320:4;46325:1;46320:7;;;;;;;;:::i;:::-;;;;;;:13;;;;;;;;;;;46352:6;46344:4;46349:1;46344:7;;;;;;;;:::i;:::-;:14;;;;:7;;;;;;;;;:14;46383:37;;;;;:18;;;;;;:37;;46402:12;;46415:4;;46383:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46421:1;46383:40;;;;;;;;:::i;32738:436::-;32847:4;32833:19;;;;32830:337;;32895:61;;8243:42:1;8231:55;;32895:61:0;;;8213:74:1;8303:18;;;8296:34;;;32868:119:0;;32889:5;;8186:18:1;;32895:61:0;;;;;;;;;;;;;;;;;;;;;;;;;32868:119;;;;;;;;;;;;;;;;:20;:119::i;:::-;;32830:337;;;33046:108;;10306:42:1;10375:15;;;33046:108:0;;;10357:34:1;10427:15;;10407:18;;;10400:43;10459:18;;;10452:34;;;10522:3;10502:18;;;10495:31;10563:2;10542:19;;;10535:31;10603:29;10582:19;;;10575:58;33019:136:0;;33040:5;;10650:19:1;;33046:108:0;;;;;;;;;;;;;;;;;;;;;;;;33019:20;:136::i;:::-;;32738:436;;;;:::o;46439:864::-;46540:14;46559:25;46570:5;46577:6;46559:10;:25::i;:::-;46539:45;;;46595:16;46622:17;46666:13;46681;46699:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46665:52;;;;;;;;;46733:17;46752:18;46783:6;46774:15;;:5;:15;;;:61;;46816:8;46826;46774:61;;;46793:8;46803;46774:61;46892:38;;;;;:23;363:55:1;;;46892:38:0;;;345:74:1;46732:103:0;;-1:-1:-1;46732:103:0;;-1:-1:-1;46732:103:0;;46892:23;;;;;318:18:1;;46892:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;46878:65;;47065:42;47076:5;47082;47088:6;47095:11;47065:10;:42::i;:::-;47050:57;;46650:469;;;;47130:15;47147;47175:6;47166:15;;:5;:15;;;:67;;47211:12;47230:1;47166:67;;;47190:1;47194:12;47166:67;47282:12;;;47292:1;47282:12;;;;;;;;;47244:51;;;;47129:104;;-1:-1:-1;47129:104:0;-1:-1:-1;47244:9:0;;;;;;:51;;47129:104;;;;47278:2;;47244:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46528:775;;;;;46439:864;;;;;:::o;47632:224::-;47698:4;47718:16;;;47715:134;;-1:-1:-1;47757:12:0;;;;47750:19;;47715:134;47809:28;;;;;:22;363:55:1;;;47809:28:0;;;345:74:1;47809:22:0;;;;;318:18:1;;47809:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47802:35;;47715:134;47632:224;;;;:::o;28072:229::-;28209:12;28241:52;28263:6;28271:4;28277:1;28280:12;28241:21;:52::i;:::-;28234:59;;28072:229;;;;;;:::o;27667:175::-;27742:12;27774:60;27787:6;27795:4;27774:60;;;;;;;;;;;;;;;;;:12;:60::i;47311:313::-;47386:14;47402;47447:6;47437:16;;:6;:16;;;47429:48;;;;;;;12605:2:1;47429:48:0;;;12587:21:1;12644:2;12624:18;;;12617:30;12683:21;12663:18;;;12656:49;12722:18;;47429:48:0;12403:343:1;47429:48:0;47516:6;47507:15;;:6;:15;;;:53;;47545:6;47553;47507:53;;;47526:6;47534;47507:53;47488:72;;-1:-1:-1;47488:72:0;-1:-1:-1;47579:20:0;;;47571:45;;;;;;;12953:2:1;47571:45:0;;;12935:21:1;12992:2;12972:18;;;12965:30;13031:14;13011:18;;;13004:42;13063:18;;47571:45:0;12751:336:1;47571:45:0;47311:313;;;;;:::o;29192:510::-;29362:12;29420:5;29395:21;:30;;29387:81;;;;;;;13294:2:1;29387:81:0;;;13276:21:1;13333:2;13313:18;;;13306:30;13372:34;13352:18;;;13345:62;13443:8;13423:18;;;13416:36;13469:19;;29387:81:0;13092:402:1;29387:81:0;25622:19;;;;29479:60;;;;;;;13701:2:1;29479:60:0;;;13683:21:1;13740:2;13720:18;;;13713:30;13779:31;13759:18;;;13752:59;13828:18;;29479:60:0;13499:353:1;29479:60:0;29553:12;29567:23;29594:6;:11;;29613:5;29620:4;29594:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29552:73;;;;29643:51;29660:7;29669:10;29681:12;32028;32057:7;32053:580;;;-1:-1:-1;32088:10:0;32081:17;;32053:580;32202:17;;:21;32198:424;;32450:10;32444:17;32511:15;32498:10;32494:2;32490:19;32483:44;32198:424;32593:12;32586:20;;;;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;430:154::-;516:42;509:5;505:54;498:5;495:65;485:93;;574:1;571;564:12;589:1448;738:6;746;754;762;770;778;786;794;802;810;818:7;872:3;860:9;851:7;847:23;843:33;840:53;;;889:1;886;879:12;840:53;928:9;915:23;947:31;972:5;947:31;:::i;:::-;997:5;-1:-1:-1;1054:2:1;1039:18;;1026:32;1067:33;1026:32;1067:33;:::i;:::-;1119:7;-1:-1:-1;1178:2:1;1163:18;;1150:32;1191:33;1150:32;1191:33;:::i;:::-;1243:7;-1:-1:-1;1302:2:1;1287:18;;1274:32;1315:33;1274:32;1315:33;:::i;:::-;1367:7;-1:-1:-1;1426:3:1;1411:19;;1398:33;1440;1398;1440;:::i;:::-;1492:7;-1:-1:-1;1551:3:1;1536:19;;1523:33;1565;1523;1565;:::i;:::-;1617:7;-1:-1:-1;1676:3:1;1661:19;;1648:33;1690;1648;1690;:::i;:::-;1742:7;-1:-1:-1;1796:3:1;1781:19;;1768:33;;-1:-1:-1;1848:3:1;1833:19;;1820:33;;-1:-1:-1;1905:3:1;1890:19;;1877:33;1919;1877;1919;:::i;:::-;1971:7;1961:17;;;2026:3;2015:9;2011:19;1998:33;1987:44;;589:1448;;;;;;;;;;;;;;:::o;2224:247::-;2283:6;2336:2;2324:9;2315:7;2311:23;2307:32;2304:52;;;2352:1;2349;2342:12;2304:52;2391:9;2378:23;2410:31;2435:5;2410:31;:::i;3171:184::-;3223:77;3220:1;3213:88;3320:4;3317:1;3310:15;3344:4;3341:1;3334:15;3360:128;3427:9;;;3448:11;;;3445:37;;;3462:18;;:::i;3493:228::-;3533:7;3659:1;3591:66;3587:74;3584:1;3581:81;3576:1;3569:9;3562:17;3558:105;3555:131;;;3666:18;;:::i;:::-;-1:-1:-1;3706:9:1;;3493:228::o;3726:274::-;3766:1;3792;3782:189;;3827:77;3824:1;3817:88;3928:4;3925:1;3918:15;3956:4;3953:1;3946:15;3782:189;-1:-1:-1;3985:9:1;;3726:274::o;5479:251::-;5549:6;5602:2;5590:9;5581:7;5577:23;5573:32;5570:52;;;5618:1;5615;5608:12;5570:52;5650:9;5644:16;5669:31;5694:5;5669:31;:::i;5735:184::-;5787:77;5784:1;5777:88;5884:4;5881:1;5874:15;5908:4;5905:1;5898:15;5924:184;5976:77;5973:1;5966:88;6073:4;6070:1;6063:15;6097:4;6094:1;6087:15;6113:752;6283:4;6331:2;6320:9;6316:18;6361:6;6350:9;6343:25;6387:2;6425;6420;6409:9;6405:18;6398:30;6448:6;6483;6477:13;6514:6;6506;6499:22;6552:2;6541:9;6537:18;6530:25;;6590:2;6582:6;6578:15;6564:29;;6611:1;6621:218;6635:6;6632:1;6629:13;6621:218;;;6700:13;;6715:42;6696:62;6684:75;;6814:15;;;;6779:12;;;;6657:1;6650:9;6621:218;;;-1:-1:-1;6856:3:1;;6113:752;-1:-1:-1;;;;;;;6113:752:1:o;6870:1164::-;6965:6;6996:2;7039;7027:9;7018:7;7014:23;7010:32;7007:52;;;7055:1;7052;7045:12;7007:52;7088:9;7082:16;7117:18;7158:2;7150:6;7147:14;7144:34;;;7174:1;7171;7164:12;7144:34;7212:6;7201:9;7197:22;7187:32;;7257:7;7250:4;7246:2;7242:13;7238:27;7228:55;;7279:1;7276;7269:12;7228:55;7308:2;7302:9;7330:2;7326;7323:10;7320:36;;;7336:18;;:::i;:::-;7382:2;7379:1;7375:10;7414:2;7408:9;7473:66;7468:2;7464;7460:11;7456:84;7448:6;7444:97;7591:6;7579:10;7576:22;7571:2;7559:10;7556:18;7553:46;7550:72;;;7602:18;;:::i;:::-;7638:2;7631:22;7688:18;;;7722:15;;;;-1:-1:-1;7764:11:1;;;7760:20;;;7792:19;;;7789:39;;;7824:1;7821;7814:12;7789:39;7848:11;;;;7868:135;7884:6;7879:3;7876:15;7868:135;;;7950:10;;7938:23;;7901:12;;;;7981;;;;7868:135;;;8022:6;6870:1164;-1:-1:-1;;;;;;;;6870:1164:1:o;9557:277::-;9624:6;9677:2;9665:9;9656:7;9652:23;9648:32;9645:52;;;9693:1;9690;9683:12;9645:52;9725:9;9719:16;9778:5;9771:13;9764:21;9757:5;9754:32;9744:60;;9800:1;9797;9790:12;9839:184;9909:6;9962:2;9950:9;9941:7;9937:23;9933:32;9930:52;;;9978:1;9975;9968:12;9930:52;-1:-1:-1;10001:16:1;;9839:184;-1:-1:-1;9839:184:1:o;10680:188::-;10759:13;;10812:30;10801:42;;10791:53;;10781:81;;10858:1;10855;10848:12;10781:81;10680:188;;;:::o;10873:450::-;10960:6;10968;10976;11029:2;11017:9;11008:7;11004:23;11000:32;10997:52;;;11045:1;11042;11035:12;10997:52;11068:40;11098:9;11068:40;:::i;:::-;11058:50;;11127:49;11172:2;11161:9;11157:18;11127:49;:::i;:::-;11117:59;;11219:2;11208:9;11204:18;11198:25;11263:10;11256:5;11252:22;11245:5;11242:33;11232:61;;11289:1;11286;11279:12;11232:61;11312:5;11302:15;;;10873:450;;;;;:::o;11328:250::-;11413:1;11423:113;11437:6;11434:1;11431:13;11423:113;;;11513:11;;;11507:18;11494:11;;;11487:39;11459:2;11452:10;11423:113;;;-1:-1:-1;;11570:1:1;11552:16;;11545:27;11328:250::o;11583:329::-;11624:3;11662:5;11656:12;11689:6;11684:3;11677:19;11705:76;11774:6;11767:4;11762:3;11758:14;11751:4;11744:5;11740:16;11705:76;:::i;:::-;11826:2;11814:15;11831:66;11810:88;11801:98;;;;11901:4;11797:109;;11583:329;-1:-1:-1;;11583:329:1:o;11917:481::-;12148:6;12137:9;12130:25;12191:6;12186:2;12175:9;12171:18;12164:34;12246:42;12238:6;12234:55;12229:2;12218:9;12214:18;12207:83;12326:3;12321:2;12310:9;12306:18;12299:31;12111:4;12347:45;12387:3;12376:9;12372:19;12364:6;12347:45;:::i;:::-;12339:53;11917:481;-1:-1:-1;;;;;;11917:481:1:o;13857:287::-;13986:3;14024:6;14018:13;14040:66;14099:6;14094:3;14087:4;14079:6;14075:17;14040:66;:::i;:::-;14122:16;;;;;13857:287;-1:-1:-1;;13857:287:1:o;14149:219::-;14298:2;14287:9;14280:21;14261:4;14318:44;14358:2;14347:9;14343:18;14335:6;14318:44;:::i
Swarm Source
ipfs://780dcd83a0b1650855275241b6e875a8d10cb2569e8a89f3b149e124adde993d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 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.