Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,573 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Single | 14412197 | 1079 days ago | IN | 0.35 ETH | 0.00282877 | ||||
Buy Single | 14412197 | 1079 days ago | IN | 0.35 ETH | 0.0028095 | ||||
Buy Single | 14412197 | 1079 days ago | IN | 0.35 ETH | 0.00282648 | ||||
Buy Single | 14271082 | 1101 days ago | IN | 0.35 ETH | 0.00362889 | ||||
Buy Single | 14268791 | 1101 days ago | IN | 0.35 ETH | 0.00285586 | ||||
Buy Single | 14268790 | 1101 days ago | IN | 0.35 ETH | 0.00286054 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00274156 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00274156 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00274156 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00273812 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00274156 | ||||
Buy Single | 14192792 | 1113 days ago | IN | 0.35 ETH | 0.00274156 | ||||
Buy Single | 14190615 | 1113 days ago | IN | 0.35 ETH | 0.00179457 | ||||
Buy Single | 14190615 | 1113 days ago | IN | 0.35 ETH | 0.00172563 | ||||
Buy Single | 14189454 | 1114 days ago | IN | 0.35 ETH | 0.00318484 | ||||
Buy Single | 14185783 | 1114 days ago | IN | 0.35 ETH | 0.00520619 | ||||
Buy Single | 14185783 | 1114 days ago | IN | 0.35 ETH | 0.00520619 | ||||
Buy Single | 14185783 | 1114 days ago | IN | 0.35 ETH | 0.00518501 | ||||
Buy Single | 14184963 | 1114 days ago | IN | 0.35 ETH | 0.00185213 | ||||
Buy Single | 14183827 | 1115 days ago | IN | 0.35 ETH | 0.00255753 | ||||
Buy Single | 14179321 | 1115 days ago | IN | 0.35 ETH | 0.00598176 | ||||
Buy | 14177873 | 1115 days ago | IN | 0.7 ETH | 0.00208157 | ||||
Buy | 14177873 | 1115 days ago | IN | 0.7 ETH | 0.00208157 | ||||
Buy | 14176187 | 1116 days ago | IN | 0.7 ETH | 0.0117912 | ||||
Buy | 14176187 | 1116 days ago | IN | 0.7 ETH | 0.00925157 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MintableSale
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-07 */ // File: contracts/interfaces/IMintableERC721.sol pragma solidity ^0.8.10; interface IMintableERC721 { /** * @notice Checks if specified token exists * * @dev Returns whether the specified token ID has an ownership * information associated with it * * @param _tokenId ID of the token to query existence for * @return whether the token exists (true - exists, false - doesn't exist) */ function exists(uint256 _tokenId) external view returns(bool); /** * @dev Creates new token with token ID specified * and assigns an ownership `_to` for this token * * @dev Unsafe: doesn't execute `onERC721Received` on the receiver. * Prefer the use of `saveMint` instead of `mint`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint token to * @param _tokenId ID of the token to mint */ function mint(address _to, uint256 _tokenId) external; /** * @dev Creates new tokens starting with token ID specified * and assigns an ownership `_to` for these tokens * * @dev Token IDs to be minted: [_tokenId, _tokenId + n) * * @dev n must be greater or equal 2: `n > 1` * * @dev Unsafe: doesn't execute `onERC721Received` on the receiver. * Prefer the use of `saveMintBatch` instead of `mintBatch`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint tokens to * @param _tokenId ID of the first token to mint * @param n how many tokens to mint, sequentially increasing the _tokenId */ function mintBatch(address _to, uint256 _tokenId, uint256 n) external; /** * @dev Creates new token with token ID specified * and assigns an ownership `_to` for this token * * @dev Checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint token to * @param _tokenId ID of the token to mint */ function safeMint(address _to, uint256 _tokenId) external; /** * @dev Creates new token with token ID specified * and assigns an ownership `_to` for this token * * @dev Checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint token to * @param _tokenId ID of the token to mint * @param _data additional data with no specified format, sent in call to `_to` */ function safeMint(address _to, uint256 _tokenId, bytes memory _data) external; /** * @dev Creates new tokens starting with token ID specified * and assigns an ownership `_to` for these tokens * * @dev Token IDs to be minted: [_tokenId, _tokenId + n) * * @dev n must be greater or equal 2: `n > 1` * * @dev Checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint token to * @param _tokenId ID of the token to mint * @param n how many tokens to mint, sequentially increasing the _tokenId */ function safeMintBatch(address _to, uint256 _tokenId, uint256 n) external; /** * @dev Creates new tokens starting with token ID specified * and assigns an ownership `_to` for these tokens * * @dev Token IDs to be minted: [_tokenId, _tokenId + n) * * @dev n must be greater or equal 2: `n > 1` * * @dev Checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. * * @dev Should have a restricted access handled by the implementation * * @param _to an address to mint token to * @param _tokenId ID of the token to mint * @param n how many tokens to mint, sequentially increasing the _tokenId * @param _data additional data with no specified format, sent in call to `_to` */ function safeMintBatch(address _to, uint256 _tokenId, uint256 n, bytes memory _data) external; } // File: @openzeppelin/contracts/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/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount ) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/interfaces/IERC165.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/finance/PaymentSplitter.sol // OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol) pragma solidity ^0.8.0; /** * @title PaymentSplitter * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware * that the Ether will be split in this way, since it is handled transparently by the contract. * * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim * an amount proportional to the percentage of total shares they were assigned. * * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release} * function. * * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you * to run tests before sending real value to this contract. */ contract PaymentSplitter is Context { event PayeeAdded(address account, uint256 shares); event PaymentReleased(address to, uint256 amount); event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount); event PaymentReceived(address from, uint256 amount); uint256 private _totalShares; uint256 private _totalReleased; mapping(address => uint256) private _shares; mapping(address => uint256) private _released; address[] private _payees; mapping(IERC20 => uint256) private _erc20TotalReleased; mapping(IERC20 => mapping(address => uint256)) private _erc20Released; /** * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at * the matching position in the `shares` array. * * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no * duplicates in `payees`. */ constructor(address[] memory payees, uint256[] memory shares_) payable { require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch"); require(payees.length > 0, "PaymentSplitter: no payees"); for (uint256 i = 0; i < payees.length; i++) { _addPayee(payees[i], shares_[i]); } } /** * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the * reliability of the events, and not the actual splitting of Ether. * * To learn more about this see the Solidity documentation for * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback * functions]. */ receive() external payable virtual { emit PaymentReceived(_msgSender(), msg.value); } /** * @dev Getter for the total shares held by payees. */ function totalShares() public view returns (uint256) { return _totalShares; } /** * @dev Getter for the total amount of Ether already released. */ function totalReleased() public view returns (uint256) { return _totalReleased; } /** * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20 * contract. */ function totalReleased(IERC20 token) public view returns (uint256) { return _erc20TotalReleased[token]; } /** * @dev Getter for the amount of shares held by an account. */ function shares(address account) public view returns (uint256) { return _shares[account]; } /** * @dev Getter for the amount of Ether already released to a payee. */ function released(address account) public view returns (uint256) { return _released[account]; } /** * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an * IERC20 contract. */ function released(IERC20 token, address account) public view returns (uint256) { return _erc20Released[token][account]; } /** * @dev Getter for the address of the payee number `index`. */ function payee(uint256 index) public view returns (address) { return _payees[index]; } /** * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the * total shares and their previous withdrawals. */ function release(address payable account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = address(this).balance + totalReleased(); uint256 payment = _pendingPayment(account, totalReceived, released(account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _released[account] += payment; _totalReleased += payment; Address.sendValue(account, payment); emit PaymentReleased(account, payment); } /** * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20 * contract. */ function release(IERC20 token, address account) public virtual { require(_shares[account] > 0, "PaymentSplitter: account has no shares"); uint256 totalReceived = token.balanceOf(address(this)) + totalReleased(token); uint256 payment = _pendingPayment(account, totalReceived, released(token, account)); require(payment != 0, "PaymentSplitter: account is not due payment"); _erc20Released[token][account] += payment; _erc20TotalReleased[token] += payment; SafeERC20.safeTransfer(token, account, payment); emit ERC20PaymentReleased(token, account, payment); } /** * @dev internal logic for computing the pending payment of an `account` given the token historical balances and * already released amounts. */ function _pendingPayment( address account, uint256 totalReceived, uint256 alreadyReleased ) private view returns (uint256) { return (totalReceived * _shares[account]) / _totalShares - alreadyReleased; } /** * @dev Add a new payee to the contract. * @param account The address of the payee to add. * @param shares_ The number of shares owned by the payee. */ function _addPayee(address account, uint256 shares_) private { require(account != address(0), "PaymentSplitter: account is the zero address"); require(shares_ > 0, "PaymentSplitter: shares are 0"); require(_shares[account] == 0, "PaymentSplitter: account already has shares"); _payees.push(account); _shares[account] = shares_; _totalShares = _totalShares + shares_; emit PayeeAdded(account, shares_); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: contracts/MintableSale.sol pragma solidity ^0.8.10; /** * @title Mintable Sale * * @notice Mintable Sale sales fixed amount of NFTs (tokens) for a fixed price in a fixed period of time; * it can be used in a 10k sale campaign and the smart contract is generic and * can sell any type of mintable NFT (see MintableERC721 interface) * * @dev Fixed parameters should not be changed mid sale because the minted per walet gets reset each time * * @dev When buying a token from this smart contract, next token is minted to the recipient * * @dev Supports functionality to limit amount of tokens that can be minted to each address * * @dev Deployment and setup: * 1. Deploy smart contract, specify smart contract address during the deployment: * - Mintable ER721 deployed instance address * 2. Execute `initialize` function and set up the sale parameters; * sale is not active until it's initialized * */ contract MintableSale is Ownable, PaymentSplitter, ReentrancyGuard { // Use Zeppelin MerkleProof Library to verify Merkle proofs using MerkleProof for bytes32[]; // ----- SLOT.1 (192/256) /** * @dev Next token ID to mint; * initially this is the first "free" ID which can be minted; * at any point in time this should point to a free, mintable ID * for the token * * @dev `nextId` cannot be zero, we do not ever mint NFTs with zero IDs */ uint32 public nextId = 1; /** * @dev Last token ID to mint; * once `nextId` exceeds `finalId` the sale pauses */ uint32 public finalId; /** * @notice Once set, limits the amount of tokens one can buy in a single transaction; * When unset (zero) the amount of tokens is limited only by block size and * amount of tokens left for sale */ uint32 public batchLimit; /** * @notice Once set, limits the amount of tokens one address can buy for the duration of the sale; * When unset (zero) the amount of tokens is limited only by the amount of tokens left for sale */ uint32 public mintLimit; /** * @notice Counter of the tokens sold (minted) by this sale smart contract */ uint32 public soldCounter; /** * @notice Merkle tree root to validate (address, cost, startDate, endDate) * tuples */ bytes32 public root; // ----- NON-SLOTTED /** * @dev Mintable ERC721 contract address to mint */ address public immutable tokenContract; // ----- NON-SLOTTED /** * @dev Number of mints performed by address */ mapping(uint32 => mapping(address => uint32)) public mints; // ----- NON-SLOTTED /** * @dev Is this a public sale or a private one (Merkle root verify or not) */ bool public isPublicSale = false; // ----- NON-SLOTTED /** * @dev Sale number for contract - starts from 0 and increments to 1 for each new sale. * Used for resetting mints per wallet each sale. */ uint32 public saleNumber = 0; /** * @dev Fired in initialize() * * @param _by an address which executed the initialization * @param _nextId next ID of the token to mint * @param _finalId final ID of the token to mint * @param _batchLimit how many tokens is allowed to buy in a single transaction * @param _root merkle tree root */ event Initialized( address indexed _by, uint32 _nextId, uint32 _finalId, uint32 _batchLimit, uint32 _limit, bytes32 _root, bool _isPublicSale ); /** * @dev Fired in buy(), buyTo(), buySingle(), and buySingleTo() * * @param _by an address which executed and payed the transaction, probably a buyer * @param _to an address which received token(s) minted * @param _amount number of tokens minted * @param _value ETH amount charged */ event Bought( address indexed _by, address indexed _to, uint256 _amount, uint256 _value ); /** * @dev Creates/deploys MintableSale and binds it to Mintable ERC721 * smart contract on construction * * @param _tokenContract deployed Mintable ERC721 smart contract; sale will mint ERC721 * tokens of that type to the recipient */ constructor( address _tokenContract, address[] memory addressList, uint256[] memory shareList ) PaymentSplitter(addressList, shareList) { // verify the input is set require(_tokenContract != address(0), "token contract is not set"); // verify input is valid smart contract of the expected interfaces require( IERC165(_tokenContract).supportsInterface( type(IMintableERC721).interfaceId ), "unexpected token contract type" ); // assign the addresses tokenContract = _tokenContract; } /** * @notice Number of tokens left on sale * * @dev Doesn't take into account if sale is active or not * * @return number of tokens left on sale */ function itemsOnSale() public view returns (uint32) { // calculate items left on sale, taking into account that // finalId is on sale (inclusive bound) return finalId >= nextId ? finalId + 1 - nextId : 0; } /** * @notice Number of tokens available on sale * * @dev Takes into account if sale is active or not, doesn't throw, * returns zero if sale is inactive * * @return number of tokens available on sale */ function itemsAvailable() public view returns (uint32) { // delegate to itemsOnSale() if sale is active, return zero otherwise return isActive() ? itemsOnSale() : 0; } /** * @notice Active sale is an operational sale capable of minting and selling tokens * * @dev The sale is active when all the requirements below are met: * 1. `finalId` is not reached (`nextId <= finalId`) * * @dev Function is marked as virtual to be overridden in the helper test smart contract (mock) * in order to test how it affects the sale process * * @return true if sale is active (operational) and can sell tokens, false otherwise */ function isActive() public view virtual returns (bool) { // evaluate sale state based on the internal state variables and return return nextId <= finalId; } /** * @dev Restricted access function to set up sale parameters, all at once, * or any subset of them * * @dev To skip parameter initialization, set it to `-1`, * that is a maximum value for unsigned integer of the corresponding type; * `_aliSource` and `_aliValue` must both be either set or skipped * * @dev Example: following initialization will update only _itemPrice and _batchLimit, * leaving the rest of the fields unchanged * initialize( * 0xFFFFFFFF, * 0xFFFFFFFF, * 10, * 0xFFFFFFFF * ) * * @dev Requires next ID to be greater than zero (strict): `_nextId > 0` * * @dev Requires transaction sender to have `ROLE_SALE_MANAGER` role * * @param _nextId next ID of the token to mint, will be increased * in smart contract storage after every successful buy * @param _finalId final ID of the token to mint; sale is capable of producing * `_finalId - _nextId + 1` tokens * when current time is within _saleStart (inclusive) and _saleEnd (exclusive) * @param _batchLimit how many tokens is allowed to buy in a single transaction, * set to zero to disable the limit * @param _mintLimit how many tokens is allowed to buy for the duration of the sale, * set to zero to disable the limit * @param _root merkle tree root used to verify whether an address can mint */ function initialize( uint32 _nextId, // <<<--- keep type in sync with the body type(uint32).max !!! uint32 _finalId, // <<<--- keep type in sync with the body type(uint32).max !!! uint32 _batchLimit, // <<<--- keep type in sync with the body type(uint32).max !!! uint32 _mintLimit, // <<<--- keep type in sync with the body type(uint32).max !!! bytes32 _root, // <<<--- keep type in sync with the 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF !!! bool _isPublicSale ) public onlyOwner { // verify the inputs require(_nextId > 0, "zero nextId"); // no need to verify extra parameters - "incorrect" values will deactivate the sale // initialize contract state based on the values supplied // take into account our convention that value `-1` means "do not set" // 0xFFFFFFFFFFFFFFFF, 64 bits // 0xFFFFFFFF, 32 bits if (_nextId != type(uint32).max) { nextId = _nextId; } // 0xFFFFFFFF, 32 bits if (_finalId != type(uint32).max) { finalId = _finalId; } // 0xFFFFFFFF, 32 bits if (_batchLimit != type(uint32).max) { batchLimit = _batchLimit; } // 0xFFFFFFFF, 32 bits if (_mintLimit != type(uint32).max) { mintLimit = _mintLimit; } // 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 256 bits if ( _root != 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF ) { root = _root; } isPublicSale = _isPublicSale; saleNumber++; // emit an event - read values from the storage since not all of them might be set emit Initialized( msg.sender, nextId, finalId, batchLimit, mintLimit, root, isPublicSale ); } /** * @notice Buys several (at least two) tokens in a batch. * Accepts ETH as payment and mints a token * * @param _amount amount of tokens to create, two or more */ function buy( uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof, uint32 _amount ) public payable { // delegate to `buyTo` with the transaction sender set to be a recipient buyTo(msg.sender, _price, _start, _end, _proof, _amount); } /** * @notice Buys several (at least two) tokens in a batch. * Accepts ETH as payment and mints a token * * @param _amount amount of tokens to create, two or more */ function devBuy( uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof, uint32 _amount ) public payable { // delegate to `buyTo` with the transaction sender set to be a recipient buyTo(msg.sender, _price, _start, _end, _proof, _amount); } /** * @notice Buys several (at least two) tokens in a batch to an address specified. * Accepts ETH as payment and mints tokens * * @param _to address to mint tokens to * @param _amount amount of tokens to create, two or more */ function buyTo( address _to, uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof, uint32 _amount ) public payable nonReentrant { if (isPublicSale) { // disallow contracts from buying require(msg.sender == tx.origin, "Contract buys not allowed"); } // construct Merkle tree leaf from the inputs supplied bytes32 leaf = buildLeaf(_price, _start, _end); // verify proof require(_proof.verify(root, leaf), "invalid proof"); // verify the inputs require(_to != address(0), "recipient not set"); require( _amount > 1 && (batchLimit == 0 || _amount <= batchLimit), "incorrect amount" ); require(block.timestamp >= _start, "sale not yet started"); require(block.timestamp <= _end, "sale ended"); // verify mint limit if (mintLimit != 0) { require( mints[saleNumber][msg.sender] + _amount <= mintLimit, "mint limit reached" ); } // verify there is enough items available to buy the amount // verifies sale is in active state under the hood require( itemsAvailable() >= _amount, "inactive sale or not enough items available" ); // calculate the total price required and validate the transaction value uint256 totalPrice = _price * _amount; require(msg.value >= totalPrice, "not enough funds"); // increment sender mints mints[saleNumber][msg.sender] += _amount; // mint token to to the recipient IMintableERC721(tokenContract).mintBatch(_to, nextId, _amount); // increment `nextId` nextId += _amount; // increment `soldCounter` soldCounter += _amount; // if ETH amount supplied exceeds the price if (msg.value > totalPrice) { // send excess amount back to sender payable(msg.sender).transfer(msg.value - totalPrice); } // emit en event emit Bought(msg.sender, _to, _amount, totalPrice); } /** * @notice Buys single token. * Accepts ETH as payment and mints a token */ function devBuySingle( uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof ) public payable { // delegate to `buySingleTo` with the transaction sender set to be a recipient buySingleTo(msg.sender, _price, _start, _end, _proof); } /** * @notice Buys single token. * Accepts ETH as payment and mints a token */ function buySingle( uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof ) public payable { // delegate to `buySingleTo` with the transaction sender set to be a recipient buySingleTo(msg.sender, _price, _start, _end, _proof); } /** * @notice Buys single token to an address specified. * Accepts ETH as payment and mints a token * * @param _to address to mint token to */ function buySingleTo( address _to, uint256 _price, uint256 _start, uint256 _end, bytes32[] memory _proof ) public payable nonReentrant { if (isPublicSale) { // disallow contracts from buying require(msg.sender == tx.origin, "Contract buys not allowed"); } // construct Merkle tree leaf from the inputs supplied bytes32 leaf = buildLeaf(_price, _start, _end); // verify proof require(_proof.verify(root, leaf), "invalid proof"); // verify the inputs and transaction value require(_to != address(0), "recipient not set"); require(msg.value >= _price, "not enough funds"); require(block.timestamp >= _start, "sale not yet started"); require(block.timestamp <= _end, "sale ended"); // verify mint limit if (mintLimit != 0) { require( mints[saleNumber][msg.sender] + 1 <= mintLimit, "mint limit reached" ); } // verify sale is in active state require(isActive(), "inactive sale"); // mint token to the recipient IMintableERC721(tokenContract).mint(_to, nextId); // increment `nextId` nextId++; // increment `soldCounter` soldCounter++; // increment sender mints mints[saleNumber][msg.sender]++; // if ETH amount supplied exceeds the price if (msg.value > _price) { // send excess amount back to sender payable(msg.sender).transfer(msg.value - _price); } // emit en event emit Bought(msg.sender, _to, 1, _price); } function buildLeaf( uint256 _price, uint256 _start, uint256 _end ) internal view returns (bytes32) { // construct Merkle tree leaf from the inputs supplied bytes32 leaf; if (!isPublicSale) { leaf = keccak256(abi.encodePacked(msg.sender, _price, _start, _end)); } else { leaf = keccak256(abi.encodePacked(_price, _start, _end)); } return leaf; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"address[]","name":"addressList","type":"address[]"},{"internalType":"uint256[]","name":"shareList","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Bought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint32","name":"_nextId","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_finalId","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_batchLimit","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_limit","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"_root","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"_isPublicSale","type":"bool"}],"name":"Initialized","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"inputs":[],"name":"batchLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint32","name":"_amount","type":"uint32"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"buySingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"buySingleTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint32","name":"_amount","type":"uint32"}],"name":"buyTo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint32","name":"_amount","type":"uint32"}],"name":"devBuy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"devBuySingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"finalId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_nextId","type":"uint32"},{"internalType":"uint32","name":"_finalId","type":"uint32"},{"internalType":"uint32","name":"_batchLimit","type":"uint32"},{"internalType":"uint32","name":"_mintLimit","type":"uint32"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"bool","name":"_isPublicSale","type":"bool"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemsAvailable","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"itemsOnSale","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLimit","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"","type":"address"}],"name":"mints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"root","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleNumber","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soldCounter","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040526009805463ffffffff19166001179055600c805464ffffffffff191690553480156200002f57600080fd5b5060405162002b2138038062002b21833981016040819052620000529162000600565b81816200005f33620002c4565b8051825114620000d15760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620001245760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620000c8565b60005b825181101562000190576200017b8382815181106200014a576200014a620006e4565b6020026020010151838381518110620001675762000167620006e4565b60200260200101516200031460201b60201c565b80620001878162000710565b91505062000127565b50506001600855506001600160a01b038316620001f05760405162461bcd60e51b815260206004820152601960248201527f746f6b656e20636f6e7472616374206973206e6f7420736574000000000000006044820152606401620000c8565b6040516301ffc9a760e01b8152633197b5d160e21b60048201526001600160a01b038416906301ffc9a790602401602060405180830381865afa1580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026291906200072e565b620002b05760405162461bcd60e51b815260206004820152601e60248201527f756e657870656374656420746f6b656e20636f6e7472616374207479706500006044820152606401620000c8565b50506001600160a01b031660805262000774565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003815760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620000c8565b60008111620003d35760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620000c8565b6001600160a01b038216600090815260036020526040902054156200044f5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620000c8565b6005805460018082019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038516908117909155600090815260036020526040902082905554620004b890829062000759565b600155604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b80516001600160a01b03811681146200051957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200055f576200055f6200051e565b604052919050565b60006001600160401b038211156200058357620005836200051e565b5060051b60200190565b600082601f8301126200059f57600080fd5b81516020620005b8620005b28362000567565b62000534565b82815260059290921b84018101918181019086841115620005d857600080fd5b8286015b84811015620005f55780518352918301918301620005dc565b509695505050505050565b6000806000606084860312156200061657600080fd5b620006218462000501565b602085810151919450906001600160401b03808211156200064157600080fd5b818701915087601f8301126200065657600080fd5b815162000667620005b28262000567565b81815260059190911b8301840190848101908a8311156200068757600080fd5b938501935b82851015620006b057620006a08562000501565b825293850193908501906200068c565b60408a01519097509450505080831115620006ca57600080fd5b5050620006da868287016200058d565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415620007275762000727620006fa565b5060010190565b6000602082840312156200074157600080fd5b815180151581146200075257600080fd5b9392505050565b600082198211156200076f576200076f620006fa565b500190565b6080516123836200079e6000396000818161038a01528181610e00015261134d01526123836000f3fe6080604052600436106101e75760003560e01c80638da5cb5b11610102578063c7ff042111610095578063e2ae99f911610064578063e2ae99f914610617578063e33b7de31461062c578063ebf0c71714610641578063f2fde38b1461065757600080fd5b8063c7ff04211461058b578063ce362ad31461026a578063ce7c2ac2146105ab578063d79779b2146105e157600080fd5b8063a5a865dc116100d1578063a5a865dc14610518578063b831b05814610532578063c1161dd814610545578063c1b2bd5a1461056957600080fd5b80638da5cb5b146104625780639852595c14610480578063996517cf146104b65780639fed650e146104da57600080fd5b806355a373d61161017a578063740561e811610149578063740561e81461025757806388e515f4146104095780638a18e5f21461041e5780638b83209b1461044257600080fd5b806355a373d61461037857806361b8ce8c146103c457806364625ef3146103e1578063715018a6146103f457600080fd5b80633a98ef39116101b65780633a98ef39146102ba578063406072a9146102d9578063474740b11461031f57806348b750441461035857600080fd5b806319165587146102355780631d5a29af146102575780631f5b4f741461026a57806322f3e2d41461027d57600080fd5b36610230577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561024157600080fd5b50610255610250366004611d37565b610677565b005b610255610265366004611dfa565b6107ae565b610255610278366004611e6d565b6107c1565b34801561028957600080fd5b506102a560095463ffffffff600160201b820481169116111590565b60405190151581526020015b60405180910390f35b3480156102c657600080fd5b506001545b6040519081526020016102b1565b3480156102e557600080fd5b506102cb6102f4366004611ed8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561032b57600080fd5b5060095461034390600160401b900463ffffffff1681565b60405163ffffffff90911681526020016102b1565b34801561036457600080fd5b50610255610373366004611ed8565b6107d6565b34801561038457600080fd5b506103ac7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102b1565b3480156103d057600080fd5b506009546103439063ffffffff1681565b6102556103ef366004611f11565b6109af565b34801561040057600080fd5b50610255610f71565b34801561041557600080fd5b50610343610fa7565b34801561042a57600080fd5b5060095461034390600160201b900463ffffffff1681565b34801561044e57600080fd5b506103ac61045d366004611f8d565b610fdb565b34801561046e57600080fd5b506000546001600160a01b03166103ac565b34801561048c57600080fd5b506102cb61049b366004611d37565b6001600160a01b031660009081526004602052604090205490565b3480156104c257600080fd5b5060095461034390600160601b900463ffffffff1681565b3480156104e657600080fd5b506103436104f5366004611fa6565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b34801561052457600080fd5b50600c546102a59060ff1681565b610255610540366004611fc2565b61100b565b34801561055157600080fd5b5060095461034390600160801b900463ffffffff1681565b34801561057557600080fd5b50600c5461034390610100900463ffffffff1681565b34801561059757600080fd5b506102556105a636600461203d565b611503565b3480156105b757600080fd5b506102cb6105c6366004611d37565b6001600160a01b031660009081526003602052604090205490565b3480156105ed57600080fd5b506102cb6105fc366004611d37565b6001600160a01b031660009081526006602052604090205490565b34801561062357600080fd5b506103436116f9565b34801561063857600080fd5b506002546102cb565b34801561064d57600080fd5b506102cb600a5481565b34801561066357600080fd5b50610255610672366004611d37565b611746565b6001600160a01b0381166000908152600360205260409020546106b55760405162461bcd60e51b81526004016106ac906120ae565b60405180910390fd5b60006106c060025490565b6106ca904761210a565b905060006106f783836106f2866001600160a01b031660009081526004602052604090205490565b6117e1565b9050806107165760405162461bcd60e51b81526004016106ac90612122565b6001600160a01b0383166000908152600460205260408120805483929061073e90849061210a565b925050819055508060026000828254610757919061210a565b9091555061076790508382611829565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6107bb338585858561100b565b50505050565b6107cf3386868686866109af565b5050505050565b6001600160a01b03811660009081526003602052604090205461080b5760405162461bcd60e51b81526004016106ac906120ae565b6001600160a01b0382166000908152600660205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c919061216d565b610896919061210a565b905060006108cf83836106f287876001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b9050806108ee5760405162461bcd60e51b81526004016106ac90612122565b6001600160a01b0380851660009081526007602090815260408083209387168352929052908120805483929061092590849061210a565b90915550506001600160a01b0384166000908152600660205260408120805483929061095290849061210a565b909155506109639050848483611947565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60026008541415610a025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ac565b6002600855600c5460ff1615610a5d57333214610a5d5760405162461bcd60e51b815260206004820152601960248201527810dbdb9d1c9858dd08189d5e5cc81b9bdd08185b1b1bddd959603a1b60448201526064016106ac565b6000610a6a868686611999565b600a54909150610a7c90849083611a33565b610ab85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016106ac565b6001600160a01b038716610b025760405162461bcd60e51b81526020600482015260116024820152701c9958da5c1a595b9d081b9bdd081cd95d607a1b60448201526064016106ac565b60018263ffffffff16118015610b425750600954600160401b900463ffffffff161580610b42575060095463ffffffff600160401b909104811690831611155b610b815760405162461bcd60e51b815260206004820152601060248201526f1a5b98dbdc9c9958dd08185b5bdd5b9d60821b60448201526064016106ac565b84421015610bc85760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081e595d081cdd185c9d195960621b60448201526064016106ac565b83421115610c055760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016106ac565b600954600160601b900463ffffffff1615610ca757600954600c54610100900463ffffffff9081166000908152600b60209081526040808320338452909152902054600160601b909204811691610c5e91859116612186565b63ffffffff161115610ca75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b60448201526064016106ac565b8163ffffffff16610cb6610fa7565b63ffffffff161015610d1e5760405162461bcd60e51b815260206004820152602b60248201527f696e6163746976652073616c65206f72206e6f7420656e6f756768206974656d60448201526a7320617661696c61626c6560a81b60648201526084016106ac565b6000610d3063ffffffff8416886121ae565b905080341015610d755760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b60448201526064016106ac565b600c5463ffffffff61010090910481166000908152600b60209081526040808320338452909152812080548693919291610db191859116612186565b82546101009290920a63ffffffff818102199093169183160217909155600954604051631740d57560e11b81526001600160a01b038c81166004830152918316602482015291861660448301527f0000000000000000000000000000000000000000000000000000000000000000169150632e81aaea90606401600060405180830381600087803b158015610e4557600080fd5b505af1158015610e59573d6000803e3d6000fd5b505060098054869350909150600090610e7990849063ffffffff16612186565b92506101000a81548163ffffffff021916908363ffffffff16021790555082600960108282829054906101000a900463ffffffff16610eb89190612186565b92506101000a81548163ffffffff021916908363ffffffff16021790555080341115610f1657336108fc610eec83346121cd565b6040518115909202916000818181858888f19350505050158015610f14573d6000803e3d6000fd5b505b6040805163ffffffff85168152602081018390526001600160a01b038a169133917fbf77fd13a39d14dc0da779342c14105c38d9a5d0c60f2caa22f5fd1d5525416d910160405180910390a350506001600855505050505050565b6000546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ac906121e4565b610fa56000611a49565b565b6000610fc460095463ffffffff600160201b820481169116111590565b610fce5750600090565b610fd66116f9565b905090565b600060058281548110610ff057610ff0612219565b6000918252602090912001546001600160a01b031692915050565b6002600854141561105e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ac565b6002600855600c5460ff16156110b9573332146110b95760405162461bcd60e51b815260206004820152601960248201527810dbdb9d1c9858dd08189d5e5cc81b9bdd08185b1b1bddd959603a1b60448201526064016106ac565b60006110c6858585611999565b600a549091506110d890839083611a33565b6111145760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016106ac565b6001600160a01b03861661115e5760405162461bcd60e51b81526020600482015260116024820152701c9958da5c1a595b9d081b9bdd081cd95d607a1b60448201526064016106ac565b843410156111a15760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b60448201526064016106ac565b834210156111e85760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081e595d081cdd185c9d195960621b60448201526064016106ac565b824211156112255760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016106ac565b600954600160601b900463ffffffff16156112c757600954600c54610100900463ffffffff9081166000908152600b60209081526040808320338452909152902054600160601b90920481169161127e91166001612186565b63ffffffff1611156112c75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b60448201526064016106ac565b6112e260095463ffffffff600160201b820481169116111590565b61131e5760405162461bcd60e51b815260206004820152600d60248201526c696e6163746976652073616c6560981b60448201526064016106ac565b6009546040516340c10f1960e01b81526001600160a01b03888116600483015263ffffffff90921660248201527f0000000000000000000000000000000000000000000000000000000000000000909116906340c10f1990604401600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506009805463ffffffff169250905060006113c28361222f565b91906101000a81548163ffffffff021916908363ffffffff160217905550506009601081819054906101000a900463ffffffff16809291906114039061222f565b825463ffffffff91821661010093840a9081029083021990911617909255600c540481166000908152600b602090815260408083203384529091528120805490921692506114508361222f565b91906101000a81548163ffffffff021916908363ffffffff16021790555050843411156114af57336108fc61148587346121cd565b6040518115909202916000818181858888f193505050501580156114ad573d6000803e3d6000fd5b505b6040805160018152602081018790526001600160a01b0388169133917fbf77fd13a39d14dc0da779342c14105c38d9a5d0c60f2caa22f5fd1d5525416d910160405180910390a35050600160085550505050565b6000546001600160a01b0316331461152d5760405162461bcd60e51b81526004016106ac906121e4565b60008663ffffffff16116115715760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc81b995e1d125960aa1b60448201526064016106ac565b63ffffffff86811614611594576009805463ffffffff191663ffffffff88161790555b63ffffffff858116146115c1576009805467ffffffff000000001916600160201b63ffffffff8816021790555b63ffffffff848116146115f257600980546bffffffff00000000000000001916600160401b63ffffffff8716021790555b63ffffffff8381161461161e576009805463ffffffff60601b1916600160601b63ffffffff8616021790555b600019821461162d57600a8290555b600c805460ff191682151517808255610100900463ffffffff169060016116538361222f565b82546101009290920a63ffffffff818102199093169183160217909155600954600a54600c54604080518486168152600160201b850486166020820152600160401b8504861691810191909152600160601b9093049093166060830152608082015260ff909116151560a08201523391507fd5e1285830eb1be5b88abc0d186aa0da2bc488df92556eb2f9455291439fb0129060c00160405180910390a2505050505050565b60095460009063ffffffff808216600160201b90920416101561171c5750600090565b60095463ffffffff8082169161173c91600160201b909104166001612186565b610fd69190612253565b6000546001600160a01b031633146117705760405162461bcd60e51b81526004016106ac906121e4565b6001600160a01b0381166117d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ac565b6117de81611a49565b50565b6001546001600160a01b0384166000908152600360205260408120549091839161180b90866121ae565b6118159190612278565b61181f91906121cd565b90505b9392505050565b804710156118795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106ac565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118c6576040519150601f19603f3d011682016040523d82523d6000602084013e6118cb565b606091505b50509050806119425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106ac565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611942908490611a99565b600c54600090819060ff166119f8576040516bffffffffffffffffffffffff193360601b16602082015260348101869052605481018590526074810184905260940160405160208183030381529060405280519060200120905061181f565b604080516020810187905290810185905260608101849052608001604051602081830303815290604052805190602001209050949350505050565b600082611a408584611b6b565b14949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611aee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c179092919063ffffffff16565b8051909150156119425780806020019051810190611b0c919061229a565b6119425760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ac565b600081815b8451811015611c0f576000858281518110611b8d57611b8d612219565b60200260200101519050808311611bcf576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bfc565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611c07816122b7565b915050611b70565b509392505050565b606061181f848460008585843b611c705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ac565b600080866001600160a01b03168587604051611c8c91906122fe565b60006040518083038185875af1925050503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b5091509150611cde828286611ce9565b979650505050505050565b60608315611cf8575081611822565b825115611d085782518084602001fd5b8160405162461bcd60e51b81526004016106ac919061231a565b6001600160a01b03811681146117de57600080fd5b600060208284031215611d4957600080fd5b813561182281611d22565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d7b57600080fd5b8135602067ffffffffffffffff80831115611d9857611d98611d54565b8260051b604051601f19603f83011681018181108482111715611dbd57611dbd611d54565b604052938452858101830193838101925087851115611ddb57600080fd5b83870191505b84821015611cde57813583529183019190830190611de1565b60008060008060808587031215611e1057600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115611e3c57600080fd5b611e4887828801611d6a565b91505092959194509250565b803563ffffffff81168114611e6857600080fd5b919050565b600080600080600060a08688031215611e8557600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115611eb157600080fd5b611ebd88828901611d6a565b925050611ecc60808701611e54565b90509295509295909350565b60008060408385031215611eeb57600080fd5b8235611ef681611d22565b91506020830135611f0681611d22565b809150509250929050565b60008060008060008060c08789031215611f2a57600080fd5b8635611f3581611d22565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115611f6657600080fd5b611f7289828a01611d6a565b925050611f8160a08801611e54565b90509295509295509295565b600060208284031215611f9f57600080fd5b5035919050565b60008060408385031215611fb957600080fd5b611ef683611e54565b600080600080600060a08688031215611fda57600080fd5b8535611fe581611d22565b9450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561201657600080fd5b61202288828901611d6a565b9150509295509295909350565b80151581146117de57600080fd5b60008060008060008060c0878903121561205657600080fd5b61205f87611e54565b955061206d60208801611e54565b945061207b60408801611e54565b935061208960608801611e54565b92506080870135915060a08701356120a08161202f565b809150509295509295509295565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561211d5761211d6120f4565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60006020828403121561217f57600080fd5b5051919050565b600063ffffffff8083168185168083038211156121a5576121a56120f4565b01949350505050565b60008160001904831182151516156121c8576121c86120f4565b500290565b6000828210156121df576121df6120f4565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff80831681811415612249576122496120f4565b6001019392505050565b600063ffffffff83811690831681811015612270576122706120f4565b039392505050565b60008261229557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156122ac57600080fd5b81516118228161202f565b60006000198214156122cb576122cb6120f4565b5060010190565b60005b838110156122ed5781810151838201526020016122d5565b838111156107bb5750506000910152565b600082516123108184602087016122d2565b9190910192915050565b60208152600082518060208401526123398160408501602087016122d2565b601f01601f1916919091016040019291505056fea2646970667358221220f0dee937801333bc373c8f928a52215132a47af0d95c923bc3209a109a82285264736f6c634300080b0033000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ec43bfbcc580067b2c075f2c8a83b4e74be6cf750000000000000000000000002f1459438279e07bf4f10c30710772b353e3177c0000000000000000000000004f6d5a8c2738d9a8d8f2ea82c4c325ef2d7284e60000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000e6
Deployed Bytecode
0x6080604052600436106101e75760003560e01c80638da5cb5b11610102578063c7ff042111610095578063e2ae99f911610064578063e2ae99f914610617578063e33b7de31461062c578063ebf0c71714610641578063f2fde38b1461065757600080fd5b8063c7ff04211461058b578063ce362ad31461026a578063ce7c2ac2146105ab578063d79779b2146105e157600080fd5b8063a5a865dc116100d1578063a5a865dc14610518578063b831b05814610532578063c1161dd814610545578063c1b2bd5a1461056957600080fd5b80638da5cb5b146104625780639852595c14610480578063996517cf146104b65780639fed650e146104da57600080fd5b806355a373d61161017a578063740561e811610149578063740561e81461025757806388e515f4146104095780638a18e5f21461041e5780638b83209b1461044257600080fd5b806355a373d61461037857806361b8ce8c146103c457806364625ef3146103e1578063715018a6146103f457600080fd5b80633a98ef39116101b65780633a98ef39146102ba578063406072a9146102d9578063474740b11461031f57806348b750441461035857600080fd5b806319165587146102355780631d5a29af146102575780631f5b4f741461026a57806322f3e2d41461027d57600080fd5b36610230577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561024157600080fd5b50610255610250366004611d37565b610677565b005b610255610265366004611dfa565b6107ae565b610255610278366004611e6d565b6107c1565b34801561028957600080fd5b506102a560095463ffffffff600160201b820481169116111590565b60405190151581526020015b60405180910390f35b3480156102c657600080fd5b506001545b6040519081526020016102b1565b3480156102e557600080fd5b506102cb6102f4366004611ed8565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561032b57600080fd5b5060095461034390600160401b900463ffffffff1681565b60405163ffffffff90911681526020016102b1565b34801561036457600080fd5b50610255610373366004611ed8565b6107d6565b34801561038457600080fd5b506103ac7f000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d81565b6040516001600160a01b0390911681526020016102b1565b3480156103d057600080fd5b506009546103439063ffffffff1681565b6102556103ef366004611f11565b6109af565b34801561040057600080fd5b50610255610f71565b34801561041557600080fd5b50610343610fa7565b34801561042a57600080fd5b5060095461034390600160201b900463ffffffff1681565b34801561044e57600080fd5b506103ac61045d366004611f8d565b610fdb565b34801561046e57600080fd5b506000546001600160a01b03166103ac565b34801561048c57600080fd5b506102cb61049b366004611d37565b6001600160a01b031660009081526004602052604090205490565b3480156104c257600080fd5b5060095461034390600160601b900463ffffffff1681565b3480156104e657600080fd5b506103436104f5366004611fa6565b600b60209081526000928352604080842090915290825290205463ffffffff1681565b34801561052457600080fd5b50600c546102a59060ff1681565b610255610540366004611fc2565b61100b565b34801561055157600080fd5b5060095461034390600160801b900463ffffffff1681565b34801561057557600080fd5b50600c5461034390610100900463ffffffff1681565b34801561059757600080fd5b506102556105a636600461203d565b611503565b3480156105b757600080fd5b506102cb6105c6366004611d37565b6001600160a01b031660009081526003602052604090205490565b3480156105ed57600080fd5b506102cb6105fc366004611d37565b6001600160a01b031660009081526006602052604090205490565b34801561062357600080fd5b506103436116f9565b34801561063857600080fd5b506002546102cb565b34801561064d57600080fd5b506102cb600a5481565b34801561066357600080fd5b50610255610672366004611d37565b611746565b6001600160a01b0381166000908152600360205260409020546106b55760405162461bcd60e51b81526004016106ac906120ae565b60405180910390fd5b60006106c060025490565b6106ca904761210a565b905060006106f783836106f2866001600160a01b031660009081526004602052604090205490565b6117e1565b9050806107165760405162461bcd60e51b81526004016106ac90612122565b6001600160a01b0383166000908152600460205260408120805483929061073e90849061210a565b925050819055508060026000828254610757919061210a565b9091555061076790508382611829565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b6107bb338585858561100b565b50505050565b6107cf3386868686866109af565b5050505050565b6001600160a01b03811660009081526003602052604090205461080b5760405162461bcd60e51b81526004016106ac906120ae565b6001600160a01b0382166000908152600660205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c919061216d565b610896919061210a565b905060006108cf83836106f287876001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b9050806108ee5760405162461bcd60e51b81526004016106ac90612122565b6001600160a01b0380851660009081526007602090815260408083209387168352929052908120805483929061092590849061210a565b90915550506001600160a01b0384166000908152600660205260408120805483929061095290849061210a565b909155506109639050848483611947565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b60026008541415610a025760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ac565b6002600855600c5460ff1615610a5d57333214610a5d5760405162461bcd60e51b815260206004820152601960248201527810dbdb9d1c9858dd08189d5e5cc81b9bdd08185b1b1bddd959603a1b60448201526064016106ac565b6000610a6a868686611999565b600a54909150610a7c90849083611a33565b610ab85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016106ac565b6001600160a01b038716610b025760405162461bcd60e51b81526020600482015260116024820152701c9958da5c1a595b9d081b9bdd081cd95d607a1b60448201526064016106ac565b60018263ffffffff16118015610b425750600954600160401b900463ffffffff161580610b42575060095463ffffffff600160401b909104811690831611155b610b815760405162461bcd60e51b815260206004820152601060248201526f1a5b98dbdc9c9958dd08185b5bdd5b9d60821b60448201526064016106ac565b84421015610bc85760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081e595d081cdd185c9d195960621b60448201526064016106ac565b83421115610c055760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016106ac565b600954600160601b900463ffffffff1615610ca757600954600c54610100900463ffffffff9081166000908152600b60209081526040808320338452909152902054600160601b909204811691610c5e91859116612186565b63ffffffff161115610ca75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b60448201526064016106ac565b8163ffffffff16610cb6610fa7565b63ffffffff161015610d1e5760405162461bcd60e51b815260206004820152602b60248201527f696e6163746976652073616c65206f72206e6f7420656e6f756768206974656d60448201526a7320617661696c61626c6560a81b60648201526084016106ac565b6000610d3063ffffffff8416886121ae565b905080341015610d755760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b60448201526064016106ac565b600c5463ffffffff61010090910481166000908152600b60209081526040808320338452909152812080548693919291610db191859116612186565b82546101009290920a63ffffffff818102199093169183160217909155600954604051631740d57560e11b81526001600160a01b038c81166004830152918316602482015291861660448301527f000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d169150632e81aaea90606401600060405180830381600087803b158015610e4557600080fd5b505af1158015610e59573d6000803e3d6000fd5b505060098054869350909150600090610e7990849063ffffffff16612186565b92506101000a81548163ffffffff021916908363ffffffff16021790555082600960108282829054906101000a900463ffffffff16610eb89190612186565b92506101000a81548163ffffffff021916908363ffffffff16021790555080341115610f1657336108fc610eec83346121cd565b6040518115909202916000818181858888f19350505050158015610f14573d6000803e3d6000fd5b505b6040805163ffffffff85168152602081018390526001600160a01b038a169133917fbf77fd13a39d14dc0da779342c14105c38d9a5d0c60f2caa22f5fd1d5525416d910160405180910390a350506001600855505050505050565b6000546001600160a01b03163314610f9b5760405162461bcd60e51b81526004016106ac906121e4565b610fa56000611a49565b565b6000610fc460095463ffffffff600160201b820481169116111590565b610fce5750600090565b610fd66116f9565b905090565b600060058281548110610ff057610ff0612219565b6000918252602090912001546001600160a01b031692915050565b6002600854141561105e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106ac565b6002600855600c5460ff16156110b9573332146110b95760405162461bcd60e51b815260206004820152601960248201527810dbdb9d1c9858dd08189d5e5cc81b9bdd08185b1b1bddd959603a1b60448201526064016106ac565b60006110c6858585611999565b600a549091506110d890839083611a33565b6111145760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016106ac565b6001600160a01b03861661115e5760405162461bcd60e51b81526020600482015260116024820152701c9958da5c1a595b9d081b9bdd081cd95d607a1b60448201526064016106ac565b843410156111a15760405162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b60448201526064016106ac565b834210156111e85760405162461bcd60e51b81526020600482015260146024820152731cd85b19481b9bdd081e595d081cdd185c9d195960621b60448201526064016106ac565b824211156112255760405162461bcd60e51b815260206004820152600a6024820152691cd85b1948195b99195960b21b60448201526064016106ac565b600954600160601b900463ffffffff16156112c757600954600c54610100900463ffffffff9081166000908152600b60209081526040808320338452909152902054600160601b90920481169161127e91166001612186565b63ffffffff1611156112c75760405162461bcd60e51b81526020600482015260126024820152711b5a5b9d081b1a5b5a5d081c995858da195960721b60448201526064016106ac565b6112e260095463ffffffff600160201b820481169116111590565b61131e5760405162461bcd60e51b815260206004820152600d60248201526c696e6163746976652073616c6560981b60448201526064016106ac565b6009546040516340c10f1960e01b81526001600160a01b03888116600483015263ffffffff90921660248201527f000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d909116906340c10f1990604401600060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b50506009805463ffffffff169250905060006113c28361222f565b91906101000a81548163ffffffff021916908363ffffffff160217905550506009601081819054906101000a900463ffffffff16809291906114039061222f565b825463ffffffff91821661010093840a9081029083021990911617909255600c540481166000908152600b602090815260408083203384529091528120805490921692506114508361222f565b91906101000a81548163ffffffff021916908363ffffffff16021790555050843411156114af57336108fc61148587346121cd565b6040518115909202916000818181858888f193505050501580156114ad573d6000803e3d6000fd5b505b6040805160018152602081018790526001600160a01b0388169133917fbf77fd13a39d14dc0da779342c14105c38d9a5d0c60f2caa22f5fd1d5525416d910160405180910390a35050600160085550505050565b6000546001600160a01b0316331461152d5760405162461bcd60e51b81526004016106ac906121e4565b60008663ffffffff16116115715760405162461bcd60e51b815260206004820152600b60248201526a1e995c9bc81b995e1d125960aa1b60448201526064016106ac565b63ffffffff86811614611594576009805463ffffffff191663ffffffff88161790555b63ffffffff858116146115c1576009805467ffffffff000000001916600160201b63ffffffff8816021790555b63ffffffff848116146115f257600980546bffffffff00000000000000001916600160401b63ffffffff8716021790555b63ffffffff8381161461161e576009805463ffffffff60601b1916600160601b63ffffffff8616021790555b600019821461162d57600a8290555b600c805460ff191682151517808255610100900463ffffffff169060016116538361222f565b82546101009290920a63ffffffff818102199093169183160217909155600954600a54600c54604080518486168152600160201b850486166020820152600160401b8504861691810191909152600160601b9093049093166060830152608082015260ff909116151560a08201523391507fd5e1285830eb1be5b88abc0d186aa0da2bc488df92556eb2f9455291439fb0129060c00160405180910390a2505050505050565b60095460009063ffffffff808216600160201b90920416101561171c5750600090565b60095463ffffffff8082169161173c91600160201b909104166001612186565b610fd69190612253565b6000546001600160a01b031633146117705760405162461bcd60e51b81526004016106ac906121e4565b6001600160a01b0381166117d55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ac565b6117de81611a49565b50565b6001546001600160a01b0384166000908152600360205260408120549091839161180b90866121ae565b6118159190612278565b61181f91906121cd565b90505b9392505050565b804710156118795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106ac565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118c6576040519150601f19603f3d011682016040523d82523d6000602084013e6118cb565b606091505b50509050806119425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106ac565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611942908490611a99565b600c54600090819060ff166119f8576040516bffffffffffffffffffffffff193360601b16602082015260348101869052605481018590526074810184905260940160405160208183030381529060405280519060200120905061181f565b604080516020810187905290810185905260608101849052608001604051602081830303815290604052805190602001209050949350505050565b600082611a408584611b6b565b14949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000611aee826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c179092919063ffffffff16565b8051909150156119425780806020019051810190611b0c919061229a565b6119425760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106ac565b600081815b8451811015611c0f576000858281518110611b8d57611b8d612219565b60200260200101519050808311611bcf576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611bfc565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080611c07816122b7565b915050611b70565b509392505050565b606061181f848460008585843b611c705760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106ac565b600080866001600160a01b03168587604051611c8c91906122fe565b60006040518083038185875af1925050503d8060008114611cc9576040519150601f19603f3d011682016040523d82523d6000602084013e611cce565b606091505b5091509150611cde828286611ce9565b979650505050505050565b60608315611cf8575081611822565b825115611d085782518084602001fd5b8160405162461bcd60e51b81526004016106ac919061231a565b6001600160a01b03811681146117de57600080fd5b600060208284031215611d4957600080fd5b813561182281611d22565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d7b57600080fd5b8135602067ffffffffffffffff80831115611d9857611d98611d54565b8260051b604051601f19603f83011681018181108482111715611dbd57611dbd611d54565b604052938452858101830193838101925087851115611ddb57600080fd5b83870191505b84821015611cde57813583529183019190830190611de1565b60008060008060808587031215611e1057600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff811115611e3c57600080fd5b611e4887828801611d6a565b91505092959194509250565b803563ffffffff81168114611e6857600080fd5b919050565b600080600080600060a08688031215611e8557600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115611eb157600080fd5b611ebd88828901611d6a565b925050611ecc60808701611e54565b90509295509295909350565b60008060408385031215611eeb57600080fd5b8235611ef681611d22565b91506020830135611f0681611d22565b809150509250929050565b60008060008060008060c08789031215611f2a57600080fd5b8635611f3581611d22565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115611f6657600080fd5b611f7289828a01611d6a565b925050611f8160a08801611e54565b90509295509295509295565b600060208284031215611f9f57600080fd5b5035919050565b60008060408385031215611fb957600080fd5b611ef683611e54565b600080600080600060a08688031215611fda57600080fd5b8535611fe581611d22565b9450602086013593506040860135925060608601359150608086013567ffffffffffffffff81111561201657600080fd5b61202288828901611d6a565b9150509295509295909350565b80151581146117de57600080fd5b60008060008060008060c0878903121561205657600080fd5b61205f87611e54565b955061206d60208801611e54565b945061207b60408801611e54565b935061208960608801611e54565b92506080870135915060a08701356120a08161202f565b809150509295509295509295565b60208082526026908201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060408201526573686172657360d01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561211d5761211d6120f4565b500190565b6020808252602b908201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060408201526a191d59481c185e5b595b9d60aa1b606082015260800190565b60006020828403121561217f57600080fd5b5051919050565b600063ffffffff8083168185168083038211156121a5576121a56120f4565b01949350505050565b60008160001904831182151516156121c8576121c86120f4565b500290565b6000828210156121df576121df6120f4565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600063ffffffff80831681811415612249576122496120f4565b6001019392505050565b600063ffffffff83811690831681811015612270576122706120f4565b039392505050565b60008261229557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156122ac57600080fd5b81516118228161202f565b60006000198214156122cb576122cb6120f4565b5060010190565b60005b838110156122ed5781810151838201526020016122d5565b838111156107bb5750506000910152565b600082516123108184602087016122d2565b9190910192915050565b60208152600082518060208401526123398160408501602087016122d2565b601f01601f1916919091016040019291505056fea2646970667358221220f0dee937801333bc373c8f928a52215132a47af0d95c923bc3209a109a82285264736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000003000000000000000000000000ec43bfbcc580067b2c075f2c8a83b4e74be6cf750000000000000000000000002f1459438279e07bf4f10c30710772b353e3177c0000000000000000000000004f6d5a8c2738d9a8d8f2ea82c4c325ef2d7284e60000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000021700000000000000000000000000000000000000000000000000000000000000eb00000000000000000000000000000000000000000000000000000000000000e6
-----Decoded View---------------
Arg [0] : _tokenContract (address): 0xeb6DffB87315a2BdF4dedf72B993AdC960773A0D
Arg [1] : addressList (address[]): 0xEc43bFBcC580067b2c075f2C8A83B4e74BE6CF75,0x2F1459438279E07bF4f10c30710772b353e3177C,0x4f6d5A8c2738D9a8d8F2ea82C4C325EF2D7284e6
Arg [2] : shareList (uint256[]): 535,235,230
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000eb6dffb87315a2bdf4dedf72b993adc960773a0d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 000000000000000000000000ec43bfbcc580067b2c075f2c8a83b4e74be6cf75
Arg [5] : 0000000000000000000000002f1459438279e07bf4f10c30710772b353e3177c
Arg [6] : 0000000000000000000000004f6d5a8c2738d9a8d8f2ea82c4c325ef2d7284e6
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000217
Arg [9] : 00000000000000000000000000000000000000000000000000000000000000eb
Arg [10] : 00000000000000000000000000000000000000000000000000000000000000e6
Deployed Bytecode Sourcemap
42804:14922:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34911:40;31533:10;34911:40;;;-1:-1:-1;;;;;206:32:1;;;188:51;;34941:9:0;270:2:1;255:18;;248:34;161:18;34911:40:0;;;;;;;42804:14922;;;;;36697:566;;;;;;;;;;-1:-1:-1;36697:566:0;;;;;:::i;:::-;;:::i;:::-;;54903:283;;;;;;:::i;:::-;;:::i;51726:292::-;;;;;;:::i;:::-;;:::i;48042:169::-;;;;;;;;;;;;48198:7;;;-1:-1:-1;;;48198:7:0;;;;48188:6;;:17;;;48042:169;;;;3266:14:1;;3259:22;3241:41;;3229:2;3214:18;48042:169:0;;;;;;;;35042:91;;;;;;;;;;-1:-1:-1;35113:12:0;;35042:91;;;3439:25:1;;;3427:2;3412:18;35042:91:0;3293:177:1;36171:135:0;;;;;;;;;;-1:-1:-1;36171:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;36268:21:0;;;36241:7;36268:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;36171:135;43700:24;;;;;;;;;;-1:-1:-1;43700:24:0;;;;-1:-1:-1;;;43700:24:0;;;;;;;;;4072:10:1;4060:23;;;4042:42;;4030:2;4015:18;43700:24:0;3898:192:1;37531:641:0;;;;;;;;;;-1:-1:-1;37531:641:0;;;;;:::i;:::-;;:::i;44336:38::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4259:32:1;;;4241:51;;4229:2;4214:18;44336:38:0;4095:203:1;43303:24:0;;;;;;;;;;-1:-1:-1;43303:24:0;;;;;;;;52780:2017;;;;;;:::i;:::-;;:::i;40983:103::-;;;;;;;;;;;;;:::i;47358:180::-;;;;;;;;;;;;;:::i;43441:21::-;;;;;;;;;;-1:-1:-1;43441:21:0;;;;-1:-1:-1;;;43441:21:0;;;;;;36397:100;;;;;;;;;;-1:-1:-1;36397:100:0;;;;;:::i;:::-;;:::i;40332:87::-;;;;;;;;;;-1:-1:-1;40378:7:0;40405:6;-1:-1:-1;;;;;40405:6:0;40332:87;;35893:109;;;;;;;;;;-1:-1:-1;35893:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;35976:18:0;35949:7;35976:18;;;:9;:18;;;;;;;35893:109;43952:23;;;;;;;;;;-1:-1:-1;43952:23:0;;;;-1:-1:-1;;;43952:23:0;;;;;;44467:58;;;;;;;;;;-1:-1:-1;44467:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44648:32;;;;;;;;;;-1:-1:-1;44648:32:0;;;;;;;;55748:1560;;;;;;:::i;:::-;;:::i;44074:25::-;;;;;;;;;;-1:-1:-1;44074:25:0;;;;-1:-1:-1;;;44074:25:0;;;;;;44869:28;;;;;;;;;;-1:-1:-1;44869:28:0;;;;;;;;;;;49700:1826;;;;;;;;;;-1:-1:-1;49700:1826:0;;;;;:::i;:::-;;:::i;35689:105::-;;;;;;;;;;-1:-1:-1;35689:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;35770:16:0;35743:7;35770:16;;;:7;:16;;;;;;;35689:105;35479:119;;;;;;;;;;-1:-1:-1;35479:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;35564:26:0;35537:7;35564:26;;;:19;:26;;;;;;;35479:119;46889:224;;;;;;;;;;;;;:::i;35227:95::-;;;;;;;;;;-1:-1:-1;35300:14:0;;35227:95;;44220:19;;;;;;;;;;;;;;;;41241:201;;;;;;;;;;-1:-1:-1;41241:201:0;;;;;:::i;:::-;;:::i;36697:566::-;-1:-1:-1;;;;;36773:16:0;;36792:1;36773:16;;;:7;:16;;;;;;36765:71;;;;-1:-1:-1;;;36765:71:0;;;;;;;:::i;:::-;;;;;;;;;36849:21;36897:15;35300:14;;;35227:95;36897:15;36873:39;;:21;:39;:::i;:::-;36849:63;;36923:15;36941:58;36957:7;36966:13;36981:17;36990:7;-1:-1:-1;;;;;35976:18:0;35949:7;35976:18;;;:9;:18;;;;;;;35893:109;36981:17;36941:15;:58::i;:::-;36923:76;-1:-1:-1;37020:12:0;37012:68;;;;-1:-1:-1;;;37012:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37093:18:0;;;;;;:9;:18;;;;;:29;;37115:7;;37093:18;:29;;37115:7;;37093:29;:::i;:::-;;;;;;;;37151:7;37133:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;37171:35:0;;-1:-1:-1;37189:7:0;37198;37171:17;:35::i;:::-;37222:33;;;-1:-1:-1;;;;;206:32:1;;188:51;;270:2;255:18;;248:34;;;37222:33:0;;161:18:1;37222:33:0;;;;;;;36754:509;;36697:566;:::o;54903:283::-;55127:53;55139:10;55151:6;55159;55167:4;55173:6;55127:11;:53::i;:::-;54903:283;;;;:::o;51726:292::-;51956:56;51962:10;51974:6;51982;51990:4;51996:6;52004:7;51956:5;:56::i;:::-;51726:292;;;;;:::o;37531:641::-;-1:-1:-1;;;;;37613:16:0;;37632:1;37613:16;;;:7;:16;;;;;;37605:71;;;;-1:-1:-1;;;37605:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35564:26:0;;37689:21;35564:26;;;:19;:26;;;;;;37713:30;;-1:-1:-1;;;37713:30:0;;37737:4;37713:30;;;4241:51:1;-1:-1:-1;;;;;37713:15:0;;;;;4214:18:1;;37713:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;37689:77;;37777:15;37795:65;37811:7;37820:13;37835:24;37844:5;37851:7;-1:-1:-1;;;;;36268:21:0;;;36241:7;36268:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;36171:135;37795:65;37777:83;-1:-1:-1;37881:12:0;37873:68;;;;-1:-1:-1;;;37873:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37954:21:0;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;37988:7;;37954:21;:41;;37988:7;;37954:41;:::i;:::-;;;;-1:-1:-1;;;;;;;38006:26:0;;;;;;:19;:26;;;;;:37;;38036:7;;38006:26;:37;;38036:7;;38006:37;:::i;:::-;;;;-1:-1:-1;38056:47:0;;-1:-1:-1;38079:5:0;38086:7;38095;38056:22;:47::i;:::-;38119:45;;;-1:-1:-1;;;;;206:32:1;;;188:51;;270:2;255:18;;248:34;;;38119:45:0;;;;;161:18:1;38119:45:0;;;;;;;37594:578;;37531:641;;:::o;52780:2017::-;6538:1;7136:7;;:19;;7128:63;;;;-1:-1:-1;;;7128:63:0;;9503:2:1;7128:63:0;;;9485:21:1;9542:2;9522:18;;;9515:30;9581:33;9561:18;;;9554:61;9632:18;;7128:63:0;9301:355:1;7128:63:0;6538:1;7269:7;:18;52969:12:::1;::::0;::::1;;52965:137;;;53041:10;53055:9;53041:23;53033:61;;;::::0;-1:-1:-1;;;53033:61:0;;9863:2:1;53033:61:0::1;::::0;::::1;9845:21:1::0;9902:2;9882:18;;;9875:30;-1:-1:-1;;;9921:18:1;;;9914:55;9986:18;;53033:61:0::1;9661:349:1::0;53033:61:0::1;53170:12;53185:31;53195:6;53203;53211:4;53185:9;:31::i;:::-;53268:4;::::0;53170:46;;-1:-1:-1;53254:25:0::1;::::0;:6;;53170:46;53254:13:::1;:25::i;:::-;53246:51;;;::::0;-1:-1:-1;;;53246:51:0;;10217:2:1;53246:51:0::1;::::0;::::1;10199:21:1::0;10256:2;10236:18;;;10229:30;-1:-1:-1;;;10275:18:1;;;10268:43;10328:18;;53246:51:0::1;10015:337:1::0;53246:51:0::1;-1:-1:-1::0;;;;;53340:17:0;::::1;53332:47;;;::::0;-1:-1:-1;;;53332:47:0;;10559:2:1;53332:47:0::1;::::0;::::1;10541:21:1::0;10598:2;10578:18;;;10571:30;-1:-1:-1;;;10617:18:1;;;10610:47;10674:18;;53332:47:0::1;10357:341:1::0;53332:47:0::1;53412:1;53402:7;:11;;;:57;;;;-1:-1:-1::0;53418:10:0::1;::::0;-1:-1:-1;;;53418:10:0;::::1;;;:15:::0;;:40:::1;;-1:-1:-1::0;53448:10:0::1;::::0;::::1;-1:-1:-1::0;;;53448:10:0;;::::1;::::0;::::1;53437:21:::0;;::::1;;;53418:40;53386:107;;;::::0;-1:-1:-1;;;53386:107:0;;10905:2:1;53386:107:0::1;::::0;::::1;10887:21:1::0;10944:2;10924:18;;;10917:30;-1:-1:-1;;;10963:18:1;;;10956:46;11019:18;;53386:107:0::1;10703:340:1::0;53386:107:0::1;53527:6;53508:15;:25;;53500:58;;;::::0;-1:-1:-1;;;53500:58:0;;11250:2:1;53500:58:0::1;::::0;::::1;11232:21:1::0;11289:2;11269:18;;;11262:30;-1:-1:-1;;;11308:18:1;;;11301:50;11368:18;;53500:58:0::1;11048:344:1::0;53500:58:0::1;53592:4;53573:15;:23;;53565:46;;;::::0;-1:-1:-1;;;53565:46:0;;11599:2:1;53565:46:0::1;::::0;::::1;11581:21:1::0;11638:2;11618:18;;;11611:30;-1:-1:-1;;;11657:18:1;;;11650:40;11707:18;;53565:46:0::1;11397:334:1::0;53565:46:0::1;53650:9;::::0;-1:-1:-1;;;53650:9:0;::::1;;;:14:::0;53646:147:::1;;53736:9;::::0;::::1;53699:10:::0;53736:9:::1;53699:10:::0;::::1;53736:9;53699:10:::0;;::::1;53693:17;::::0;;;:5:::1;:17;::::0;;;;;;;53711:10:::1;53693:29:::0;;;;;;;;-1:-1:-1;;;53736:9:0;;::::1;::::0;::::1;::::0;53693:39:::1;::::0;53725:7;;53693:29:::1;:39;:::i;:::-;:52;;;;53675:110;;;::::0;-1:-1:-1;;;53675:110:0;;12171:2:1;53675:110:0::1;::::0;::::1;12153:21:1::0;12210:2;12190:18;;;12183:30;-1:-1:-1;;;12229:18:1;;;12222:48;12287:18;;53675:110:0::1;11969:342:1::0;53675:110:0::1;53958:7;53938:27;;:16;:14;:16::i;:::-;:27;;;;53922:104;;;::::0;-1:-1:-1;;;53922:104:0;;12518:2:1;53922:104:0::1;::::0;::::1;12500:21:1::0;12557:2;12537:18;;;12530:30;12596:34;12576:18;;;12569:62;-1:-1:-1;;;12647:18:1;;;12640:41;12698:19;;53922:104:0::1;12316:407:1::0;53922:104:0::1;54113:18;54134:16;;::::0;::::1;:6:::0;:16:::1;:::i;:::-;54113:37;;54178:10;54165:9;:23;;54157:52;;;::::0;-1:-1:-1;;;54157:52:0;;13103:2:1;54157:52:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:46;13217:18;;54157:52:0::1;12901:340:1::0;54157:52:0::1;54255:10;::::0;::::1;;::::0;;::::1;::::0;::::1;54249:17;::::0;;;:5:::1;:17;::::0;;;;;;;54267:10:::1;54249:29:::0;;;;;;;:40;;54282:7;;54249:29;;:17;:40:::1;::::0;54282:7;;54249:40:::1;;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;54383:6:::1;::::0;54337:62:::1;::::0;-1:-1:-1;;;54337:62:0;;-1:-1:-1;;;;;13464:32:1;;;54337:62:0::1;::::0;::::1;13446:51:1::0;54383:6:0;;::::1;13542:18:1::0;;;13535:43;13614:15;;;13594:18;;;13587:43;54353:13:0::1;54337:40;::::0;-1:-1:-1;54337:40:0::1;::::0;13419:18:1;;54337:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54435:6:0::1;:17:::0;;54445:7;;-1:-1:-1;54435:6:0;;-1:-1:-1;54435:6:0::1;::::0;:17:::1;::::0;54445:7;;54435:17:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54506:7;54491:11;;:22;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54587:10;54575:9;:22;54571:141;;;54660:10;54652:52;54681:22;54693:10:::0;54681:9:::1;:22;:::i;:::-;54652:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54571:141;54747:44;::::0;;13974:10:1;13962:23;;13944:42;;14017:2;14002:18;;13995:34;;;-1:-1:-1;;;;;54747:44:0;::::1;::::0;54754:10:::1;::::0;54747:44:::1;::::0;13917:18:1;54747:44:0::1;;;;;;;-1:-1:-1::0;;6494:1:0;7448:7;:22;-1:-1:-1;;;;;;52780:2017:0:o;40983:103::-;40378:7;40405:6;-1:-1:-1;;;;;40405:6:0;31533:10;40552:23;40544:68;;;;-1:-1:-1;;;40544:68:0;;;;;;;:::i;:::-;41048:30:::1;41075:1;41048:18;:30::i;:::-;40983:103::o:0;47358:180::-;47405:6;47502:10;48198:7;;;-1:-1:-1;;;48198:7:0;;;;48188:6;;:17;;;48042:169;47502:10;:30;;-1:-1:-1;47531:1:0;;47358:180::o;47502:30::-;47515:13;:11;:13::i;:::-;47495:37;;47358:180;:::o;36397:100::-;36448:7;36475;36483:5;36475:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36475:14:0;;36397:100;-1:-1:-1;;36397:100:0:o;55748:1560::-;6538:1;7136:7;;:19;;7128:63;;;;-1:-1:-1;;;7128:63:0;;9503:2:1;7128:63:0;;;9485:21:1;9542:2;9522:18;;;9515:30;9581:33;9561:18;;;9554:61;9632:18;;7128:63:0;9301:355:1;7128:63:0;6538:1;7269:7;:18;55922:12:::1;::::0;::::1;;55918:137;;;55994:10;56008:9;55994:23;55986:61;;;::::0;-1:-1:-1;;;55986:61:0;;9863:2:1;55986:61:0::1;::::0;::::1;9845:21:1::0;9902:2;9882:18;;;9875:30;-1:-1:-1;;;9921:18:1;;;9914:55;9986:18;;55986:61:0::1;9661:349:1::0;55986:61:0::1;56121:12;56136:31;56146:6;56154;56162:4;56136:9;:31::i;:::-;56219:4;::::0;56121:46;;-1:-1:-1;56205:25:0::1;::::0;:6;;56121:46;56205:13:::1;:25::i;:::-;56197:51;;;::::0;-1:-1:-1;;;56197:51:0;;10217:2:1;56197:51:0::1;::::0;::::1;10199:21:1::0;10256:2;10236:18;;;10229:30;-1:-1:-1;;;10275:18:1;;;10268:43;10328:18;;56197:51:0::1;10015:337:1::0;56197:51:0::1;-1:-1:-1::0;;;;;56313:17:0;::::1;56305:47;;;::::0;-1:-1:-1;;;56305:47:0;;10559:2:1;56305:47:0::1;::::0;::::1;10541:21:1::0;10598:2;10578:18;;;10571:30;-1:-1:-1;;;10617:18:1;;;10610:47;10674:18;;56305:47:0::1;10357:341:1::0;56305:47:0::1;56380:6;56367:9;:19;;56359:48;;;::::0;-1:-1:-1;;;56359:48:0;;13103:2:1;56359:48:0::1;::::0;::::1;13085:21:1::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:1;;;13154:46;13217:18;;56359:48:0::1;12901:340:1::0;56359:48:0::1;56441:6;56422:15;:25;;56414:58;;;::::0;-1:-1:-1;;;56414:58:0;;11250:2:1;56414:58:0::1;::::0;::::1;11232:21:1::0;11289:2;11269:18;;;11262:30;-1:-1:-1;;;11308:18:1;;;11301:50;11368:18;;56414:58:0::1;11048:344:1::0;56414:58:0::1;56506:4;56487:15;:23;;56479:46;;;::::0;-1:-1:-1;;;56479:46:0;;11599:2:1;56479:46:0::1;::::0;::::1;11581:21:1::0;11638:2;11618:18;;;11611:30;-1:-1:-1;;;11657:18:1;;;11650:40;11707:18;;56479:46:0::1;11397:334:1::0;56479:46:0::1;56564:9;::::0;-1:-1:-1;;;56564:9:0;::::1;;;:14:::0;56560:141:::1;;56644:9;::::0;::::1;56613:10:::0;56644:9:::1;56613:10:::0;::::1;56644:9;56613:10:::0;;::::1;56607:17;::::0;;;:5:::1;:17;::::0;;;;;;;56625:10:::1;56607:29:::0;;;;;;;;-1:-1:-1;;;56644:9:0;;::::1;::::0;::::1;::::0;56607:33:::1;::::0;:29:::1;56613:10;56607:33;:::i;:::-;:46;;;;56589:104;;;::::0;-1:-1:-1;;;56589:104:0;;12171:2:1;56589:104:0::1;::::0;::::1;12153:21:1::0;12210:2;12190:18;;;12183:30;-1:-1:-1;;;12229:18:1;;;12222:48;12287:18;;56589:104:0::1;11969:342:1::0;56589:104:0::1;56756:10;48198:7:::0;;;-1:-1:-1;;;48198:7:0;;;;48188:6;;:17;;;48042:169;56756:10:::1;56748:36;;;::::0;-1:-1:-1;;;56748:36:0;;14735:2:1;56748:36:0::1;::::0;::::1;14717:21:1::0;14774:2;14754:18;;;14747:30;-1:-1:-1;;;14793:18:1;;;14786:43;14846:18;;56748:36:0::1;14533:337:1::0;56748:36:0::1;56870:6;::::0;56829:48:::1;::::0;-1:-1:-1;;;56829:48:0;;-1:-1:-1;;;;;15066:32:1;;;56829:48:0::1;::::0;::::1;15048:51:1::0;56870:6:0::1;::::0;;::::1;15115:18:1::0;;;15108:51;56845:13:0::1;56829:35:::0;;::::1;::::0;::::1;::::0;15021:18:1;;56829:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;56913:6:0::1;:8:::0;;::::1;;::::0;-1:-1:-1;56913:6:0;-1:-1:-1;56913:6:0::1;:8;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56960:11;;:13;;;;;;;;;;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;;::::0;;;57017:10:::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;57011:17:0;;;:5:::1;:17;::::0;;;;;;;57029:10:::1;57011:29:::0;;;;;;;:31;;;;::::1;::::0;-1:-1:-1;57011:31:0::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;57116:6;57104:9;:18;57100:133;;;57185:10;57177:48;57206:18;57218:6:::0;57206:9:::1;:18;:::i;:::-;57177:48;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;57100:133;57268:34;::::0;;57292:1:::1;15558:25:1::0;;15614:2;15599:18;;15592:34;;;-1:-1:-1;;;;;57268:34:0;::::1;::::0;57275:10:::1;::::0;57268:34:::1;::::0;15531:18:1;57268:34:0::1;;;;;;;-1:-1:-1::0;;6494:1:0;7448:7;:22;-1:-1:-1;;;;55748:1560:0:o;49700:1826::-;40378:7;40405:6;-1:-1:-1;;;;;40405:6:0;31533:10;40552:23;40544:68;;;;-1:-1:-1;;;40544:68:0;;;;;;;:::i;:::-;50290:1:::1;50280:7;:11;;;50272:35;;;::::0;-1:-1:-1;;;50272:35:0;;15839:2:1;50272:35:0::1;::::0;::::1;15821:21:1::0;15878:2;15858:18;;;15851:30;-1:-1:-1;;;15897:18:1;;;15890:41;15948:18;;50272:35:0::1;15637:335:1::0;50272:35:0::1;50625:16;50614:27:::0;;::::1;;50610:66;;50652:6;:16:::0;;-1:-1:-1;;50652:16:0::1;;::::0;::::1;;::::0;;50610:66:::1;50726:16;50714:28:::0;;::::1;;50710:69;;50753:7;:18:::0;;-1:-1:-1;;50753:18:0::1;-1:-1:-1::0;;;50753:18:0::1;::::0;::::1;;;::::0;;50710:69:::1;50832:16;50817:31:::0;;::::1;;50813:78;;50859:10;:24:::0;;-1:-1:-1;;50859:24:0::1;-1:-1:-1::0;;;50859:24:0::1;::::0;::::1;;;::::0;;50813:78:::1;50943:16;50929:30:::0;;::::1;;50925:75;;50970:9;:22:::0;;-1:-1:-1;;;;50970:22:0::1;-1:-1:-1::0;;;50970:22:0::1;::::0;::::1;;;::::0;;50925:75:::1;-1:-1:-1::0;;51103:82:0;::::1;51091:131;;51202:4;:12:::0;;;51091:131:::1;51230:12;:28:::0;;-1:-1:-1;;51230:28:0::1;::::0;::::1;;;::::0;;;::::1;51267:12:::0;::::1;;;::::0;-1:-1:-1;51267:12:0::1;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;51420:6:::1;::::0;51488:4:::1;::::0;51470:9:::1;51501:12:::0;51381:139:::1;::::0;;51420:6;;::::1;16279:34:1::0;;-1:-1:-1;;;51435:7:0;::::1;::::0;::::1;16344:2:1::0;16329:18;;16322:43;-1:-1:-1;;;51451:10:0;::::1;::::0;::::1;16381:18:1::0;;;16374:43;;;;-1:-1:-1;;;51470:9:0;;::::1;::::0;;::::1;16448:2:1::0;16433:18;;16426:43;16500:3;16485:19;;16478:35;51501:12:0::1;::::0;;::::1;16557:14:1::0;16550:22;16544:3;16529:19;;16522:51;51401:10:0::1;::::0;-1:-1:-1;51381:139:0::1;::::0;16237:3:1;16222:19;51381:139:0::1;;;;;;;49700:1826:::0;;;;;;:::o;46889:224::-;47074:6;;46933;;47074;;;;-1:-1:-1;;;47063:7:0;;;;:17;;:44;;-1:-1:-1;47106:1:0;;47358:180::o;47063:44::-;47097:6;;;;;;;47083:11;;-1:-1:-1;;;47083:7:0;;;;47097:6;47083:11;:::i;:::-;:20;;;;:::i;41241:201::-;40378:7;40405:6;-1:-1:-1;;;;;40405:6:0;31533:10;40552:23;40544:68;;;;-1:-1:-1;;;40544:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41330:22:0;::::1;41322:73;;;::::0;-1:-1:-1;;;41322:73:0;;17012:2:1;41322:73:0::1;::::0;::::1;16994:21:1::0;17051:2;17031:18;;;17024:30;17090:34;17070:18;;;17063:62;-1:-1:-1;;;17141:18:1;;;17134:36;17187:19;;41322:73:0::1;16810:402:1::0;41322:73:0::1;41406:28;41425:8;41406:18;:28::i;:::-;41241:201:::0;:::o;38350:248::-;38560:12;;-1:-1:-1;;;;;38540:16:0;;38496:7;38540:16;;;:7;:16;;;;;;38496:7;;38575:15;;38524:32;;:13;:32;:::i;:::-;38523:49;;;;:::i;:::-;:67;;;;:::i;:::-;38516:74;;38350:248;;;;;;:::o;9627:317::-;9742:6;9717:21;:31;;9709:73;;;;-1:-1:-1;;;9709:73:0;;17641:2:1;9709:73:0;;;17623:21:1;17680:2;17660:18;;;17653:30;17719:31;17699:18;;;17692:59;17768:18;;9709:73:0;17439:353:1;9709:73:0;9796:12;9814:9;-1:-1:-1;;;;;9814:14:0;9836:6;9814:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9795:52;;;9866:7;9858:78;;;;-1:-1:-1;;;9858:78:0;;18209:2:1;9858:78:0;;;18191:21:1;18248:2;18228:18;;;18221:30;18287:34;18267:18;;;18260:62;18358:28;18338:18;;;18331:56;18404:19;;9858:78:0;18007:422:1;9858:78:0;9698:246;9627:317;;:::o;19229:211::-;19373:58;;;-1:-1:-1;;;;;206:32:1;;19373:58:0;;;188:51:1;255:18;;;;248:34;;;19373:58:0;;;;;;;;;;161:18:1;;;;19373:58:0;;;;;;;;-1:-1:-1;;;;;19373:58:0;-1:-1:-1;;;19373:58:0;;;19346:86;;19366:5;;19346:19;:86::i;57314:409::-;57522:12;;57422:7;;;;57522:12;;57517:183;;57562:50;;-1:-1:-1;;57579:10:0;18667:2:1;18663:15;18659:53;57562:50:0;;;18647:66:1;18729:12;;;18722:28;;;18766:12;;;18759:28;;;18803:12;;;18796:28;;;18840:13;;57562:50:0;;;;;;;;;;;;57552:61;;;;;;57545:68;;57517:183;;;57653:38;;;;;;19049:19:1;;;19084:12;;;19077:28;;;19121:12;;;19114:28;;;19158:12;;57653:38:0;;;;;;;;;;;;57643:49;;;;;;57636:56;;57713:4;57314:409;-1:-1:-1;;;;57314:409:0:o;29514:190::-;29639:4;29692;29663:25;29676:5;29683:4;29663:12;:25::i;:::-;:33;;29514:190;-1:-1:-1;;;;29514:190:0:o;41602:191::-;41676:16;41695:6;;-1:-1:-1;;;;;41712:17:0;;;-1:-1:-1;;;;;;41712:17:0;;;;;;41745:40;;41695:6;;;;;;;41745:40;;41676:16;41745:40;41665:128;41602:191;:::o;21802:716::-;22226:23;22252:69;22280:4;22252:69;;;;;;;;;;;;;;;;;22260:5;-1:-1:-1;;;;;22252:27:0;;;:69;;;;;:::i;:::-;22336:17;;22226:95;;-1:-1:-1;22336:21:0;22332:179;;22433:10;22422:30;;;;;;;;;;;;:::i;:::-;22414:85;;;;-1:-1:-1;;;22414:85:0;;19633:2:1;22414:85:0;;;19615:21:1;19672:2;19652:18;;;19645:30;19711:34;19691:18;;;19684:62;-1:-1:-1;;;19762:18:1;;;19755:40;19812:19;;22414:85:0;19431:406:1;30066:701:0;30149:7;30192:4;30149:7;30207:523;30231:5;:12;30227:1;:16;30207:523;;;30265:20;30288:5;30294:1;30288:8;;;;;;;;:::i;:::-;;;;;;;30265:31;;30331:12;30315;:28;30311:408;;30468:44;;;;;;19999:19:1;;;20034:12;;;20027:28;;;20071:12;;30468:44:0;;;;;;;;;;;;30458:55;;;;;;30443:70;;30311:408;;;30658:44;;;;;;19999:19:1;;;20034:12;;;20027:28;;;20071:12;;30658:44:0;;;;;;;;;;;;30648:55;;;;;;30633:70;;30311:408;-1:-1:-1;30245:3:0;;;;:::i;:::-;;;;30207:523;;;-1:-1:-1;30747:12:0;30066:701;-1:-1:-1;;;30066:701:0:o;11111:229::-;11248:12;11280:52;11302:6;11310:4;11316:1;11319:12;11248;8628:20;;12518:60;;;;-1:-1:-1;;;12518:60:0;;20843:2:1;12518:60:0;;;20825:21:1;20882:2;20862:18;;;20855:30;20921:31;20901:18;;;20894:59;20970:18;;12518:60:0;20641:353:1;12518:60:0;12592:12;12606:23;12633:6;-1:-1:-1;;;;;12633:11:0;12652:5;12659:4;12633:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12591:73;;;;12682:51;12699:7;12708:10;12720:12;12682:16;:51::i;:::-;12675:58;12231:510;-1:-1:-1;;;;;;;12231:510:0:o;14917:712::-;15067:12;15096:7;15092:530;;;-1:-1:-1;15127:10:0;15120:17;;15092:530;15241:17;;:21;15237:374;;15439:10;15433:17;15500:15;15487:10;15483:2;15479:19;15472:44;15237:374;15582:12;15575:20;;-1:-1:-1;;;15575:20:0;;;;;;;;:::i;293:139:1:-;-1:-1:-1;;;;;376:31:1;;366:42;;356:70;;422:1;419;412:12;437:263;504:6;557:2;545:9;536:7;532:23;528:32;525:52;;;573:1;570;563:12;525:52;612:9;599:23;631:39;664:5;631:39;:::i;705:127::-;766:10;761:3;757:20;754:1;747:31;797:4;794:1;787:15;821:4;818:1;811:15;837:902;891:5;944:3;937:4;929:6;925:17;921:27;911:55;;962:1;959;952:12;911:55;998:6;985:20;1024:4;1047:18;1084:2;1080;1077:10;1074:36;;;1090:18;;:::i;:::-;1136:2;1133:1;1129:10;1168:2;1162:9;1231:2;1227:7;1222:2;1218;1214:11;1210:25;1202:6;1198:38;1286:6;1274:10;1271:22;1266:2;1254:10;1251:18;1248:46;1245:72;;;1297:18;;:::i;:::-;1333:2;1326:22;1383:18;;;1459:15;;;1455:24;;;1417:15;;;;-1:-1:-1;1491:15:1;;;1488:35;;;1519:1;1516;1509:12;1488:35;1555:2;1547:6;1543:15;1532:26;;1567:142;1583:6;1578:3;1575:15;1567:142;;;1649:17;;1637:30;;1687:12;;;;1600;;;;1567:142;;1744:553;1855:6;1863;1871;1879;1932:3;1920:9;1911:7;1907:23;1903:33;1900:53;;;1949:1;1946;1939:12;1900:53;1985:9;1972:23;1962:33;;2042:2;2031:9;2027:18;2014:32;2004:42;;2093:2;2082:9;2078:18;2065:32;2055:42;;2148:2;2137:9;2133:18;2120:32;2175:18;2167:6;2164:30;2161:50;;;2207:1;2204;2197:12;2161:50;2230:61;2283:7;2274:6;2263:9;2259:22;2230:61;:::i;:::-;2220:71;;;1744:553;;;;;;;:::o;2302:163::-;2369:20;;2429:10;2418:22;;2408:33;;2398:61;;2455:1;2452;2445:12;2398:61;2302:163;;;:::o;2470:626::-;2589:6;2597;2605;2613;2621;2674:3;2662:9;2653:7;2649:23;2645:33;2642:53;;;2691:1;2688;2681:12;2642:53;2727:9;2714:23;2704:33;;2784:2;2773:9;2769:18;2756:32;2746:42;;2835:2;2824:9;2820:18;2807:32;2797:42;;2890:2;2879:9;2875:18;2862:32;2917:18;2909:6;2906:30;2903:50;;;2949:1;2946;2939:12;2903:50;2972:61;3025:7;3016:6;3005:9;3001:22;2972:61;:::i;:::-;2962:71;;;3052:38;3085:3;3074:9;3070:19;3052:38;:::i;:::-;3042:48;;2470:626;;;;;;;;:::o;3475:418::-;3557:6;3565;3618:2;3606:9;3597:7;3593:23;3589:32;3586:52;;;3634:1;3631;3624:12;3586:52;3673:9;3660:23;3692:39;3725:5;3692:39;:::i;:::-;3750:5;-1:-1:-1;3807:2:1;3792:18;;3779:32;3820:41;3779:32;3820:41;:::i;:::-;3880:7;3870:17;;;3475:418;;;;;:::o;4303:770::-;4431:6;4439;4447;4455;4463;4471;4524:3;4512:9;4503:7;4499:23;4495:33;4492:53;;;4541:1;4538;4531:12;4492:53;4580:9;4567:23;4599:39;4632:5;4599:39;:::i;:::-;4657:5;-1:-1:-1;4709:2:1;4694:18;;4681:32;;-1:-1:-1;4760:2:1;4745:18;;4732:32;;-1:-1:-1;4811:2:1;4796:18;;4783:32;;-1:-1:-1;4866:3:1;4851:19;;4838:33;4894:18;4883:30;;4880:50;;;4926:1;4923;4916:12;4880:50;4949:61;5002:7;4993:6;4982:9;4978:22;4949:61;:::i;:::-;4939:71;;;5029:38;5062:3;5051:9;5047:19;5029:38;:::i;:::-;5019:48;;4303:770;;;;;;;;:::o;5078:180::-;5137:6;5190:2;5178:9;5169:7;5165:23;5161:32;5158:52;;;5206:1;5203;5196:12;5158:52;-1:-1:-1;5229:23:1;;5078:180;-1:-1:-1;5078:180:1:o;5523:327::-;5590:6;5598;5651:2;5639:9;5630:7;5626:23;5622:32;5619:52;;;5667:1;5664;5657:12;5619:52;5690:28;5708:9;5690:28;:::i;5855:697::-;5975:6;5983;5991;5999;6007;6060:3;6048:9;6039:7;6035:23;6031:33;6028:53;;;6077:1;6074;6067:12;6028:53;6116:9;6103:23;6135:39;6168:5;6135:39;:::i;:::-;6193:5;-1:-1:-1;6245:2:1;6230:18;;6217:32;;-1:-1:-1;6296:2:1;6281:18;;6268:32;;-1:-1:-1;6347:2:1;6332:18;;6319:32;;-1:-1:-1;6402:3:1;6387:19;;6374:33;6430:18;6419:30;;6416:50;;;6462:1;6459;6452:12;6416:50;6485:61;6538:7;6529:6;6518:9;6514:22;6485:61;:::i;:::-;6475:71;;;5855:697;;;;;;;;:::o;6557:118::-;6643:5;6636:13;6629:21;6622:5;6619:32;6609:60;;6665:1;6662;6655:12;6680:600;6777:6;6785;6793;6801;6809;6817;6870:3;6858:9;6849:7;6845:23;6841:33;6838:53;;;6887:1;6884;6877:12;6838:53;6910:28;6928:9;6910:28;:::i;:::-;6900:38;;6957:37;6990:2;6979:9;6975:18;6957:37;:::i;:::-;6947:47;;7013:37;7046:2;7035:9;7031:18;7013:37;:::i;:::-;7003:47;;7069:37;7102:2;7091:9;7087:18;7069:37;:::i;:::-;7059:47;;7153:3;7142:9;7138:19;7125:33;7115:43;;7208:3;7197:9;7193:19;7180:33;7222:28;7244:5;7222:28;:::i;:::-;7269:5;7259:15;;;6680:600;;;;;;;;:::o;7741:402::-;7943:2;7925:21;;;7982:2;7962:18;;;7955:30;8021:34;8016:2;8001:18;;7994:62;-1:-1:-1;;;8087:2:1;8072:18;;8065:36;8133:3;8118:19;;7741:402::o;8148:127::-;8209:10;8204:3;8200:20;8197:1;8190:31;8240:4;8237:1;8230:15;8264:4;8261:1;8254:15;8280:128;8320:3;8351:1;8347:6;8344:1;8341:13;8338:39;;;8357:18;;:::i;:::-;-1:-1:-1;8393:9:1;;8280:128::o;8413:407::-;8615:2;8597:21;;;8654:2;8634:18;;;8627:30;8693:34;8688:2;8673:18;;8666:62;-1:-1:-1;;;8759:2:1;8744:18;;8737:41;8810:3;8795:19;;8413:407::o;9112:184::-;9182:6;9235:2;9223:9;9214:7;9210:23;9206:32;9203:52;;;9251:1;9248;9241:12;9203:52;-1:-1:-1;9274:16:1;;9112:184;-1:-1:-1;9112:184:1:o;11736:228::-;11775:3;11803:10;11840:2;11837:1;11833:10;11870:2;11867:1;11863:10;11901:3;11897:2;11893:12;11888:3;11885:21;11882:47;;;11909:18;;:::i;:::-;11945:13;;11736:228;-1:-1:-1;;;;11736:228:1:o;12728:168::-;12768:7;12834:1;12830;12826:6;12822:14;12819:1;12816:21;12811:1;12804:9;12797:17;12793:45;12790:71;;;12841:18;;:::i;:::-;-1:-1:-1;12881:9:1;;12728:168::o;13641:125::-;13681:4;13709:1;13706;13703:8;13700:34;;;13714:18;;:::i;:::-;-1:-1:-1;13751:9:1;;13641:125::o;14040:356::-;14242:2;14224:21;;;14261:18;;;14254:30;14320:34;14315:2;14300:18;;14293:62;14387:2;14372:18;;14040:356::o;14401:127::-;14462:10;14457:3;14453:20;14450:1;14443:31;14493:4;14490:1;14483:15;14517:4;14514:1;14507:15;15170:201;15208:3;15236:10;15281:2;15274:5;15270:14;15308:2;15299:7;15296:15;15293:41;;;15314:18;;:::i;:::-;15363:1;15350:15;;15170:201;-1:-1:-1;;;15170:201:1:o;16584:221::-;16623:4;16652:10;16712;;;;16682;;16734:12;;;16731:38;;;16749:18;;:::i;:::-;16786:13;;16584:221;-1:-1:-1;;;16584:221:1:o;17217:217::-;17257:1;17283;17273:132;;17327:10;17322:3;17318:20;17315:1;17308:31;17362:4;17359:1;17352:15;17390:4;17387:1;17380:15;17273:132;-1:-1:-1;17419:9:1;;17217:217::o;19181:245::-;19248:6;19301:2;19289:9;19280:7;19276:23;19272:32;19269:52;;;19317:1;19314;19307:12;19269:52;19349:9;19343:16;19368:28;19390:5;19368:28;:::i;20094:135::-;20133:3;-1:-1:-1;;20154:17:1;;20151:43;;;20174:18;;:::i;:::-;-1:-1:-1;20221:1:1;20210:13;;20094:135::o;20999:258::-;21071:1;21081:113;21095:6;21092:1;21089:13;21081:113;;;21171:11;;;21165:18;21152:11;;;21145:39;21117:2;21110:10;21081:113;;;21212:6;21209:1;21206:13;21203:48;;;-1:-1:-1;;21247:1:1;21229:16;;21222:27;20999:258::o;21262:274::-;21391:3;21429:6;21423:13;21445:53;21491:6;21486:3;21479:4;21471:6;21467:17;21445:53;:::i;:::-;21514:16;;;;;21262:274;-1:-1:-1;;21262:274:1:o;21541:383::-;21690:2;21679:9;21672:21;21653:4;21722:6;21716:13;21765:6;21760:2;21749:9;21745:18;21738:34;21781:66;21840:6;21835:2;21824:9;21820:18;21815:2;21807:6;21803:15;21781:66;:::i;:::-;21908:2;21887:15;-1:-1:-1;;21883:29:1;21868:45;;;;21915:2;21864:54;;21541:383;-1:-1:-1;;21541:383:1:o
Swarm Source
ipfs://f0dee937801333bc373c8f928a52215132a47af0d95c923bc3209a109a822852
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.