More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 760 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16390989 | 599 days ago | IN | 0 ETH | 0.0184223 | ||||
Withdraw | 16390886 | 599 days ago | IN | 0 ETH | 0.00336842 | ||||
Withdraw | 16388286 | 600 days ago | IN | 0 ETH | 0.00536715 | ||||
Withdraw | 16388286 | 600 days ago | IN | 0 ETH | 0.00365203 | ||||
Withdraw | 16383865 | 600 days ago | IN | 0 ETH | 0.0038404 | ||||
Withdraw | 16383708 | 600 days ago | IN | 0 ETH | 0.00745231 | ||||
Withdraw | 16383693 | 600 days ago | IN | 0 ETH | 0.00687279 | ||||
Claim Rewards | 16383670 | 600 days ago | IN | 0 ETH | 0.00276051 | ||||
Withdraw | 16383584 | 600 days ago | IN | 0 ETH | 0.01431084 | ||||
Withdraw | 16383517 | 600 days ago | IN | 0 ETH | 0.00795904 | ||||
Stake | 16303832 | 611 days ago | IN | 0 ETH | 0.00751984 | ||||
Withdraw | 16185023 | 628 days ago | IN | 0 ETH | 0.00224747 | ||||
Withdraw | 16185020 | 628 days ago | IN | 0 ETH | 0.00208827 | ||||
Stake | 16159283 | 632 days ago | IN | 0 ETH | 0.00221875 | ||||
Withdraw | 16150092 | 633 days ago | IN | 0 ETH | 0.00313424 | ||||
Claim Rewards | 16141134 | 634 days ago | IN | 0 ETH | 0.00113962 | ||||
Withdraw | 16140623 | 634 days ago | IN | 0 ETH | 0.01600497 | ||||
Claim Rewards | 16140611 | 634 days ago | IN | 0 ETH | 0.00086217 | ||||
Withdraw | 16128230 | 636 days ago | IN | 0 ETH | 0.00101691 | ||||
Claim Rewards | 16127141 | 636 days ago | IN | 0 ETH | 0.00479997 | ||||
Stake | 16111909 | 638 days ago | IN | 0 ETH | 0.00080612 | ||||
Claim Rewards | 16111804 | 638 days ago | IN | 0 ETH | 0.00097631 | ||||
Stake | 16111752 | 638 days ago | IN | 0 ETH | 0.0027389 | ||||
Claim Rewards | 16095985 | 640 days ago | IN | 0 ETH | 0.00068455 | ||||
Withdraw | 16095984 | 640 days ago | IN | 0 ETH | 0.01268548 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DucksMigration
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-18 */ // File: contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // 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/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/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/DucksMigration.sol pragma solidity ^0.8.4; contract DucksMigration is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; // Interfaces for ERC20 and ERC721 IERC20 public immutable rewardsToken; IERC721A public immutable nftCollection; // Migrator info struct Migrator { // Amount of ERC721 Tokens staked uint256 amountMigrated; // Last time of details update for this User uint256 timeOfLastUpdate; // Calculated, but unclaimed rewards for the User. The rewards are // calculated each time the user writes to the Smart Contract uint256 unclaimedRewards; uint256[] stakedTokens; } // Rewards per day per token deposited in wei. // Rewards are cumulated once every day. uint256 private rewardsPerDay = 1; uint256 public lockPeriod = 120; // Mapping of User Address to Migrator info mapping(address => Migrator) public migrators; // Mapping of Token Id to Migrator. Made for the SC to remeber // who to send back the ERC721 Token to. mapping(uint256 => address) public migratorAddress; // Mapping of Token Id to Time Staked. Made to check if lock up // period is over. mapping(uint256 => uint256) public tokenUnlockTime; address[] public migratorsArray; // Constructor function constructor(IERC721A _nftCollection, IERC20 _rewardsToken) { nftCollection = _nftCollection; rewardsToken = _rewardsToken; } // If address already has ERC721 Token/s staked, calculate the rewards. // For every new Token Id in param transferFrom user to this Smart Contract, // increment the amountMigrated and map msg.sender to the Token Id of the staked // Token to later send back on withdrawal. Finally give timeOfLastUpdate the // value of now. function stake(uint256[] calldata _tokenIds) external nonReentrant { if (migrators[msg.sender].amountMigrated > 0) { uint256 rewards = calculateRewards(msg.sender); migrators[msg.sender].unclaimedRewards += rewards; } else { migratorsArray.push(msg.sender); } uint256 len = _tokenIds.length; for (uint256 i; i < len; ++i) { require( nftCollection.ownerOf(_tokenIds[i]) == msg.sender, "Can't stake tokens you don't own!" ); nftCollection.transferFrom(msg.sender, address(this), _tokenIds[i]); migrators[msg.sender].stakedTokens.push(_tokenIds[i]); migratorAddress[_tokenIds[i]] = msg.sender; tokenUnlockTime[_tokenIds[i]] = block.timestamp + lockPeriod; } migrators[msg.sender].amountMigrated += len; migrators[msg.sender].timeOfLastUpdate = block.timestamp; } // Check if user has any ERC721 Tokens Staked and if he tried to withdraw, // calculate the rewards and store them in the unclaimedRewards and for each // ERC721 Token in param: check if msg.sender is the original Migrator, decrement // the amountMigrated of the user and transfer the ERC721 token back to them function withdraw(uint256[] calldata _tokenIds) external nonReentrant { require( migrators[msg.sender].amountMigrated > 0, "You have no tokens staked" ); uint256 rewards = calculateRewards(msg.sender); migrators[msg.sender].unclaimedRewards += rewards; uint256 len = _tokenIds.length; for (uint256 i; i < len; ++i) { require(migratorAddress[_tokenIds[i]] == msg.sender); require(block.timestamp >= tokenUnlockTime[_tokenIds[i]], "Duck not done migrating yet."); migratorAddress[_tokenIds[i]] = address(0); tokenUnlockTime[_tokenIds[i]] = 0; nftCollection.transferFrom(address(this), msg.sender, _tokenIds[i]); } migrators[msg.sender].amountMigrated -= len; migrators[msg.sender].timeOfLastUpdate = block.timestamp; if (migrators[msg.sender].amountMigrated == 0) { for (uint256 i; i < migratorsArray.length; ++i) { if (migratorsArray[i] == msg.sender) { migratorsArray[i] = migratorsArray[migratorsArray.length - 1]; migratorsArray.pop(); } } } } // Calculate rewards for the msg.sender, check if there are any rewards // claim, set unclaimedRewards to 0 and transfer the ERC20 Reward token // to the user. function claimRewards() external { uint256 rewards = calculateRewards(msg.sender) + migrators[msg.sender].unclaimedRewards; require(rewards > 0, "You have no rewards to claim"); migrators[msg.sender].timeOfLastUpdate = block.timestamp; migrators[msg.sender].unclaimedRewards = 0; rewardsToken.safeTransfer(msg.sender, rewards); } // Set the rewardsPerDay variable // Because the rewards are calculated passively, the owner has to first update the rewards // to all the migrators, witch could result in very heavy load and expensive transactions or // even reverting due to reaching the gas limit per block. Redesign incoming to bound loop. function setrewardsPerDay(uint256 _newValue) public onlyOwner { address[] memory _migrators = migratorsArray; uint256 len = _migrators.length; for (uint256 i; i < len; ++i) { address user = _migrators[i]; migrators[user].unclaimedRewards += calculateRewards(user); migrators[msg.sender].timeOfLastUpdate = block.timestamp; } rewardsPerDay = _newValue; } ////////// // View // ////////// function userStakeInfo(address _user) public view returns (uint256 _tokensStaked, uint256 _availableRewards) { return (migrators[_user].amountMigrated, availableRewards(_user)); } function getStakedTokens(address _user) public view returns (uint256[] memory) { // Check if we know this user if (migrators[_user].amountMigrated > 0) { // Return all the tokens in the stakedToken Array for this user that are not -1 uint256[] memory _stakedTokens = new uint256[](migrators[_user].amountMigrated); uint256 _index = 0; for (uint256 j = 0; j < migrators[_user].stakedTokens.length; j++) { _stakedTokens[_index] = migrators[_user].stakedTokens[j]; _index++; } return _stakedTokens; } // Otherwise, return empty array else { return new uint256[](0); } } function availableRewards(address _user) internal view returns (uint256) { if (migrators[_user].amountMigrated == 0) { return migrators[_user].unclaimedRewards; } uint256 _rewards = migrators[_user].unclaimedRewards + calculateRewards(_user); return _rewards; } ///////////// // Internal// ///////////// // Calculate rewards for param _migrator by calculating the time passed // since last update in hours and mulitplying it to ERC721 Tokens Staked // and rewardsPerDay. function calculateRewards(address _migrator) internal view returns (uint256 _rewards) { Migrator memory migrator = migrators[_migrator]; return ((( ((block.timestamp - migrator.timeOfLastUpdate) * migrator.amountMigrated) ) * rewardsPerDay) / 300); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC721A","name":"_nftCollection","type":"address"},{"internalType":"contract IERC20","name":"_rewardsToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getStakedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"migratorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"migrators","outputs":[{"internalType":"uint256","name":"amountMigrated","type":"uint256"},{"internalType":"uint256","name":"timeOfLastUpdate","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"migratorsArray","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCollection","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"setrewardsPerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"userStakeInfo","outputs":[{"internalType":"uint256","name":"_tokensStaked","type":"uint256"},{"internalType":"uint256","name":"_availableRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600160025560786003553480156200001b57600080fd5b5060405162002c6038038062002c60833981810160405281019062000041919062000267565b6200006162000055620000d860201b60201c565b620000e060201b60201c565b600180819055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505050620002ae565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d682620001a9565b9050919050565b6000620001ea82620001c9565b9050919050565b620001fc81620001dd565b81146200020857600080fd5b50565b6000815190506200021c81620001f1565b92915050565b60006200022f82620001c9565b9050919050565b620002418162000222565b81146200024d57600080fd5b50565b600081519050620002618162000236565b92915050565b60008060408385031215620002815762000280620001a4565b5b600062000291858286016200020b565b9250506020620002a48582860162000250565b9150509250929050565b60805160a051612970620002f0600039600081816104b9015281816105d101528181610ca2015261116a015260008181610993015261150201526129706000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063751721f811610097578063d066795f11610066578063d066795f1461028a578063d1af0c7d146102ba578063f2fde38b146102d8578063fdf969fc146102f457610100565b8063751721f8146102025780638da5cb5b1461021e578063983d95ce1461023c578063b7fb7d101461025857610100565b806354ddacf5116100d357806354ddacf51461017a57806363c28db1146101aa5780636588103b146101da578063715018a6146101f857610100565b80630fbf0a9314610105578063372500ab146101215780633fd8b02f1461012b5780634ead432714610149575b600080fd5b61011f600480360381019061011a9190611c7c565b610324565b005b610129610860565b005b6101336109da565b6040516101409190611ce2565b60405180910390f35b610163600480360381019061015e9190611d5b565b6109e0565b604051610171929190611d88565b60405180910390f35b610194600480360381019061018f9190611ddd565b610a38565b6040516101a19190611e19565b60405180910390f35b6101c460048036038101906101bf9190611d5b565b610a77565b6040516101d19190611ef2565b60405180910390f35b6101e2610ca0565b6040516101ef9190611f73565b60405180910390f35b610200610cc4565b005b61021c60048036038101906102179190611ddd565b610cd8565b005b610226610e62565b6040516102339190611e19565b60405180910390f35b61025660048036038101906102519190611c7c565b610e8b565b005b610272600480360381019061026d9190611d5b565b6114a3565b60405161028193929190611f8e565b60405180910390f35b6102a4600480360381019061029f9190611ddd565b6114cd565b6040516102b19190611e19565b60405180910390f35b6102c2611500565b6040516102cf9190611fe6565b60405180910390f35b6102f260048036038101906102ed9190611d5b565b611524565b005b61030e60048036038101906103099190611ddd565b6115a8565b60405161031b9190611ce2565b60405180910390f35b6002600154141561036a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103619061205e565b60405180910390fd5b60026001819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156104295760006103c8336115c0565b905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600082825461041c91906120ad565b925050819055505061048d565b6007339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600082829050905060005b818110156107b3573373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061050657610505612103565b5b905060200201356040518263ffffffff1660e01b81526004016105299190611ce2565b60206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190612147565b73ffffffffffffffffffffffffffffffffffffffff16146105cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c6906121e6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106106205761061f612103565b5b905060200201356040518463ffffffff1660e01b815260040161064593929190612206565b600060405180830381600087803b15801561065f57600080fd5b505af1158015610673573d6000803e3d6000fd5b50505050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018484838181106106cc576106cb612103565b5b905060200201359080600181540180825580915050600190039060005260206000200160009091909190915055336005600086868581811061071157610710612103565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003544261077291906120ad565b6006600086868581811061078957610788612103565b5b90506020020135815260200190815260200160002081905550806107ac9061223d565b9050610498565b5080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461080691906120ad565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050600180819055505050565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546108ae336115c0565b6108b891906120ad565b9050600081116108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f4906122d2565b60405180910390fd5b42600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506109d733827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166116c69092919063ffffffff16565b50565b60035481565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610a2f8461174c565b91509150915091565b60078181548110610a4857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610c4e576000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff811115610b2257610b216122f2565b5b604051908082528060200260200182016040528015610b505781602001602082028036833780820191505090505b5090506000805b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030180549050811015610c4357600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018181548110610bf857610bf7612103565b5b9060005260206000200154838381518110610c1657610c15612103565b5b6020026020010181815250508180610c2d9061223d565b9250508080610c3b9061223d565b915050610b57565b508192505050610c9b565b600067ffffffffffffffff811115610c6957610c686122f2565b5b604051908082528060200260200182016040528015610c975781602001602082028036833780820191505090505b5090505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610ccc611846565b610cd660006118c4565b565b610ce0611846565b60006007805480602002602001604051908101604052809291908181526020018280548015610d6457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d1a575b5050505050905060008151905060005b81811015610e55576000838281518110610d9157610d90612103565b5b60200260200101519050610da4816115c0565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610df591906120ad565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505080610e4e9061223d565b9050610d74565b5082600281905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec89061205e565b60405180910390fd5b60026001819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f559061236d565b60405180910390fd5b6000610f69336115c0565b905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610fbd91906120ad565b92505081905550600083839050905060005b81811015611221573373ffffffffffffffffffffffffffffffffffffffff166005600087878581811061100557611004612103565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105b57600080fd5b6006600086868481811061107257611071612103565b5b905060200201358152602001908152602001600020544210156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c1906123d9565b60405180910390fd5b6000600560008787858181106110e3576110e2612103565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006006600087878581811061114f5761114e612103565b5b905060200201358152602001908152602001600020819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd30338888868181106111b9576111b8612103565b5b905060200201356040518463ffffffff1660e01b81526004016111de93929190612206565b600060405180830381600087803b1580156111f857600080fd5b505af115801561120c573d6000803e3d6000fd5b505050508061121a9061223d565b9050610fcf565b5080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461127491906123f9565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156114965760005b600780549050811015611494573373ffffffffffffffffffffffffffffffffffffffff166007828154811061134857611347612103565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561148357600760016007805490506113a391906123f9565b815481106113b4576113b3612103565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600782815481106113f3576113f2612103565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600780548061144d5761144c61242d565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b8061148d9061223d565b9050611310565b505b5050600180819055505050565b60046020528060005260406000206000915090508060000154908060010154908060020154905083565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b61152c611846565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906124ce565b60405180910390fd5b6115a5816118c4565b50565b60066020528060005260406000206000915090505481565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820180548060200260200160405190810160405280929190818152602001828054801561167a57602002820191906000526020600020905b815481526020019060010190808311611666575b505050505081525050905061012c60025482600001518360200151426116a091906123f9565b6116aa91906124ee565b6116b491906124ee565b6116be9190612577565b915050919050565b6117478363a9059cbb60e01b84846040516024016116e59291906125a8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611988565b505050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156117e257600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050611841565b60006117ed836115c0565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461183a91906120ad565b9050809150505b919050565b61184e611a4f565b73ffffffffffffffffffffffffffffffffffffffff1661186c610e62565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061261d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006119ea826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a579092919063ffffffff16565b9050600081511115611a4a5780806020019051810190611a0a9190612675565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090612714565b60405180910390fd5b5b505050565b600033905090565b6060611a668484600085611a6f565b90509392505050565b606082471015611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab906127a6565b60405180910390fd5b611abd85611b83565b611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390612812565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611b2591906128ac565b60006040518083038185875af1925050503d8060008114611b62576040519150601f19603f3d011682016040523d82523d6000602084013e611b67565b606091505b5091509150611b77828286611ba6565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611bb657829050611c06565b600083511115611bc95782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9190612918565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112611c3c57611c3b611c17565b5b8235905067ffffffffffffffff811115611c5957611c58611c1c565b5b602083019150836020820283011115611c7557611c74611c21565b5b9250929050565b60008060208385031215611c9357611c92611c0d565b5b600083013567ffffffffffffffff811115611cb157611cb0611c12565b5b611cbd85828601611c26565b92509250509250929050565b6000819050919050565b611cdc81611cc9565b82525050565b6000602082019050611cf76000830184611cd3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d2882611cfd565b9050919050565b611d3881611d1d565b8114611d4357600080fd5b50565b600081359050611d5581611d2f565b92915050565b600060208284031215611d7157611d70611c0d565b5b6000611d7f84828501611d46565b91505092915050565b6000604082019050611d9d6000830185611cd3565b611daa6020830184611cd3565b9392505050565b611dba81611cc9565b8114611dc557600080fd5b50565b600081359050611dd781611db1565b92915050565b600060208284031215611df357611df2611c0d565b5b6000611e0184828501611dc8565b91505092915050565b611e1381611d1d565b82525050565b6000602082019050611e2e6000830184611e0a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611e6981611cc9565b82525050565b6000611e7b8383611e60565b60208301905092915050565b6000602082019050919050565b6000611e9f82611e34565b611ea98185611e3f565b9350611eb483611e50565b8060005b83811015611ee5578151611ecc8882611e6f565b9750611ed783611e87565b925050600181019050611eb8565b5085935050505092915050565b60006020820190508181036000830152611f0c8184611e94565b905092915050565b6000819050919050565b6000611f39611f34611f2f84611cfd565b611f14565b611cfd565b9050919050565b6000611f4b82611f1e565b9050919050565b6000611f5d82611f40565b9050919050565b611f6d81611f52565b82525050565b6000602082019050611f886000830184611f64565b92915050565b6000606082019050611fa36000830186611cd3565b611fb06020830185611cd3565b611fbd6040830184611cd3565b949350505050565b6000611fd082611f40565b9050919050565b611fe081611fc5565b82525050565b6000602082019050611ffb6000830184611fd7565b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612048601f83612001565b915061205382612012565b602082019050919050565b600060208201905081810360008301526120778161203b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120b882611cc9565b91506120c383611cc9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120f8576120f761207e565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061214181611d2f565b92915050565b60006020828403121561215d5761215c611c0d565b5b600061216b84828501612132565b91505092915050565b7f43616e2774207374616b6520746f6b656e7320796f7520646f6e2774206f776e60008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b60006121d0602183612001565b91506121db82612174565b604082019050919050565b600060208201905081810360008301526121ff816121c3565b9050919050565b600060608201905061221b6000830186611e0a565b6122286020830185611e0a565b6122356040830184611cd3565b949350505050565b600061224882611cc9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561227b5761227a61207e565b5b600182019050919050565b7f596f752068617665206e6f207265776172647320746f20636c61696d00000000600082015250565b60006122bc601c83612001565b91506122c782612286565b602082019050919050565b600060208201905081810360008301526122eb816122af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f596f752068617665206e6f20746f6b656e73207374616b656400000000000000600082015250565b6000612357601983612001565b915061236282612321565b602082019050919050565b600060208201905081810360008301526123868161234a565b9050919050565b7f4475636b206e6f7420646f6e65206d6967726174696e67207965742e00000000600082015250565b60006123c3601c83612001565b91506123ce8261238d565b602082019050919050565b600060208201905081810360008301526123f2816123b6565b9050919050565b600061240482611cc9565b915061240f83611cc9565b9250828210156124225761242161207e565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124b8602683612001565b91506124c38261245c565b604082019050919050565b600060208201905081810360008301526124e7816124ab565b9050919050565b60006124f982611cc9565b915061250483611cc9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561253d5761253c61207e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061258282611cc9565b915061258d83611cc9565b92508261259d5761259c612548565b5b828204905092915050565b60006040820190506125bd6000830185611e0a565b6125ca6020830184611cd3565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612607602083612001565b9150612612826125d1565b602082019050919050565b60006020820190508181036000830152612636816125fa565b9050919050565b60008115159050919050565b6126528161263d565b811461265d57600080fd5b50565b60008151905061266f81612649565b92915050565b60006020828403121561268b5761268a611c0d565b5b600061269984828501612660565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006126fe602a83612001565b9150612709826126a2565b604082019050919050565b6000602082019050818103600083015261272d816126f1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612790602683612001565b915061279b82612734565b604082019050919050565b600060208201905081810360008301526127bf81612783565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006127fc601d83612001565b9150612807826127c6565b602082019050919050565b6000602082019050818103600083015261282b816127ef565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561286657808201518184015260208101905061284b565b83811115612875576000848401525b50505050565b600061288682612832565b612890818561283d565b93506128a0818560208601612848565b80840191505092915050565b60006128b8828461287b565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b60006128ea826128c3565b6128f48185612001565b9350612904818560208601612848565b61290d816128ce565b840191505092915050565b6000602082019050818103600083015261293281846128df565b90509291505056fea2646970667358221220a603a57001c38cf2b54fd898723019b102334a608a3e445419f6ad063101d5c164736f6c634300080900330000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f84000000000000000000000000db53b32db1a79f14bb17d71ac1039cee098a7084
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063751721f811610097578063d066795f11610066578063d066795f1461028a578063d1af0c7d146102ba578063f2fde38b146102d8578063fdf969fc146102f457610100565b8063751721f8146102025780638da5cb5b1461021e578063983d95ce1461023c578063b7fb7d101461025857610100565b806354ddacf5116100d357806354ddacf51461017a57806363c28db1146101aa5780636588103b146101da578063715018a6146101f857610100565b80630fbf0a9314610105578063372500ab146101215780633fd8b02f1461012b5780634ead432714610149575b600080fd5b61011f600480360381019061011a9190611c7c565b610324565b005b610129610860565b005b6101336109da565b6040516101409190611ce2565b60405180910390f35b610163600480360381019061015e9190611d5b565b6109e0565b604051610171929190611d88565b60405180910390f35b610194600480360381019061018f9190611ddd565b610a38565b6040516101a19190611e19565b60405180910390f35b6101c460048036038101906101bf9190611d5b565b610a77565b6040516101d19190611ef2565b60405180910390f35b6101e2610ca0565b6040516101ef9190611f73565b60405180910390f35b610200610cc4565b005b61021c60048036038101906102179190611ddd565b610cd8565b005b610226610e62565b6040516102339190611e19565b60405180910390f35b61025660048036038101906102519190611c7c565b610e8b565b005b610272600480360381019061026d9190611d5b565b6114a3565b60405161028193929190611f8e565b60405180910390f35b6102a4600480360381019061029f9190611ddd565b6114cd565b6040516102b19190611e19565b60405180910390f35b6102c2611500565b6040516102cf9190611fe6565b60405180910390f35b6102f260048036038101906102ed9190611d5b565b611524565b005b61030e60048036038101906103099190611ddd565b6115a8565b60405161031b9190611ce2565b60405180910390f35b6002600154141561036a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103619061205e565b60405180910390fd5b60026001819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411156104295760006103c8336115c0565b905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600082825461041c91906120ad565b925050819055505061048d565b6007339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600082829050905060005b818110156107b3573373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f8473ffffffffffffffffffffffffffffffffffffffff16636352211e86868581811061050657610505612103565b5b905060200201356040518263ffffffff1660e01b81526004016105299190611ce2565b60206040518083038186803b15801561054157600080fd5b505afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190612147565b73ffffffffffffffffffffffffffffffffffffffff16146105cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105c6906121e6565b60405180910390fd5b7f0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f8473ffffffffffffffffffffffffffffffffffffffff166323b872dd33308787868181106106205761061f612103565b5b905060200201356040518463ffffffff1660e01b815260040161064593929190612206565b600060405180830381600087803b15801561065f57600080fd5b505af1158015610673573d6000803e3d6000fd5b50505050600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018484838181106106cc576106cb612103565b5b905060200201359080600181540180825580915050600190039060005260206000200160009091909190915055336005600086868581811061071157610710612103565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003544261077291906120ad565b6006600086868581811061078957610788612103565b5b90506020020135815260200190815260200160002081905550806107ac9061223d565b9050610498565b5080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461080691906120ad565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050600180819055505050565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546108ae336115c0565b6108b891906120ad565b9050600081116108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f4906122d2565b60405180910390fd5b42600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506109d733827f000000000000000000000000db53b32db1a79f14bb17d71ac1039cee098a708473ffffffffffffffffffffffffffffffffffffffff166116c69092919063ffffffff16565b50565b60035481565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610a2f8461174c565b91509150915091565b60078181548110610a4857600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610c4e576000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015467ffffffffffffffff811115610b2257610b216122f2565b5b604051908082528060200260200182016040528015610b505781602001602082028036833780820191505090505b5090506000805b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030180549050811015610c4357600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003018181548110610bf857610bf7612103565b5b9060005260206000200154838381518110610c1657610c15612103565b5b6020026020010181815250508180610c2d9061223d565b9250508080610c3b9061223d565b915050610b57565b508192505050610c9b565b600067ffffffffffffffff811115610c6957610c686122f2565b5b604051908082528060200260200182016040528015610c975781602001602082028036833780820191505090505b5090505b919050565b7f0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f8481565b610ccc611846565b610cd660006118c4565b565b610ce0611846565b60006007805480602002602001604051908101604052809291908181526020018280548015610d6457602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610d1a575b5050505050905060008151905060005b81811015610e55576000838281518110610d9157610d90612103565b5b60200260200101519050610da4816115c0565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610df591906120ad565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505080610e4e9061223d565b9050610d74565b5082600281905550505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60026001541415610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec89061205e565b60405180910390fd5b60026001819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015411610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f559061236d565b60405180910390fd5b6000610f69336115c0565b905080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610fbd91906120ad565b92505081905550600083839050905060005b81811015611221573373ffffffffffffffffffffffffffffffffffffffff166005600087878581811061100557611004612103565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105b57600080fd5b6006600086868481811061107257611071612103565b5b905060200201358152602001908152602001600020544210156110ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c1906123d9565b60405180910390fd5b6000600560008787858181106110e3576110e2612103565b5b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006006600087878581811061114f5761114e612103565b5b905060200201358152602001908152602001600020819055507f0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f8473ffffffffffffffffffffffffffffffffffffffff166323b872dd30338888868181106111b9576111b8612103565b5b905060200201356040518463ffffffff1660e01b81526004016111de93929190612206565b600060405180830381600087803b1580156111f857600080fd5b505af115801561120c573d6000803e3d6000fd5b505050508061121a9061223d565b9050610fcf565b5080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825461127491906123f9565b9250508190555042600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156114965760005b600780549050811015611494573373ffffffffffffffffffffffffffffffffffffffff166007828154811061134857611347612103565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561148357600760016007805490506113a391906123f9565b815481106113b4576113b3612103565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600782815481106113f3576113f2612103565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600780548061144d5761144c61242d565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555b8061148d9061223d565b9050611310565b505b5050600180819055505050565b60046020528060005260406000206000915090508060000154908060010154908060020154905083565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000db53b32db1a79f14bb17d71ac1039cee098a708481565b61152c611846565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906124ce565b60405180910390fd5b6115a5816118c4565b50565b60066020528060005260406000206000915090505481565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820180548060200260200160405190810160405280929190818152602001828054801561167a57602002820191906000526020600020905b815481526020019060010190808311611666575b505050505081525050905061012c60025482600001518360200151426116a091906123f9565b6116aa91906124ee565b6116b491906124ee565b6116be9190612577565b915050919050565b6117478363a9059cbb60e01b84846040516024016116e59291906125a8565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611988565b505050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156117e257600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050611841565b60006117ed836115c0565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015461183a91906120ad565b9050809150505b919050565b61184e611a4f565b73ffffffffffffffffffffffffffffffffffffffff1661186c610e62565b73ffffffffffffffffffffffffffffffffffffffff16146118c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b99061261d565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006119ea826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611a579092919063ffffffff16565b9050600081511115611a4a5780806020019051810190611a0a9190612675565b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4090612714565b60405180910390fd5b5b505050565b600033905090565b6060611a668484600085611a6f565b90509392505050565b606082471015611ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aab906127a6565b60405180910390fd5b611abd85611b83565b611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af390612812565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611b2591906128ac565b60006040518083038185875af1925050503d8060008114611b62576040519150601f19603f3d011682016040523d82523d6000602084013e611b67565b606091505b5091509150611b77828286611ba6565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315611bb657829050611c06565b600083511115611bc95782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9190612918565b60405180910390fd5b9392505050565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f840112611c3c57611c3b611c17565b5b8235905067ffffffffffffffff811115611c5957611c58611c1c565b5b602083019150836020820283011115611c7557611c74611c21565b5b9250929050565b60008060208385031215611c9357611c92611c0d565b5b600083013567ffffffffffffffff811115611cb157611cb0611c12565b5b611cbd85828601611c26565b92509250509250929050565b6000819050919050565b611cdc81611cc9565b82525050565b6000602082019050611cf76000830184611cd3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d2882611cfd565b9050919050565b611d3881611d1d565b8114611d4357600080fd5b50565b600081359050611d5581611d2f565b92915050565b600060208284031215611d7157611d70611c0d565b5b6000611d7f84828501611d46565b91505092915050565b6000604082019050611d9d6000830185611cd3565b611daa6020830184611cd3565b9392505050565b611dba81611cc9565b8114611dc557600080fd5b50565b600081359050611dd781611db1565b92915050565b600060208284031215611df357611df2611c0d565b5b6000611e0184828501611dc8565b91505092915050565b611e1381611d1d565b82525050565b6000602082019050611e2e6000830184611e0a565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611e6981611cc9565b82525050565b6000611e7b8383611e60565b60208301905092915050565b6000602082019050919050565b6000611e9f82611e34565b611ea98185611e3f565b9350611eb483611e50565b8060005b83811015611ee5578151611ecc8882611e6f565b9750611ed783611e87565b925050600181019050611eb8565b5085935050505092915050565b60006020820190508181036000830152611f0c8184611e94565b905092915050565b6000819050919050565b6000611f39611f34611f2f84611cfd565b611f14565b611cfd565b9050919050565b6000611f4b82611f1e565b9050919050565b6000611f5d82611f40565b9050919050565b611f6d81611f52565b82525050565b6000602082019050611f886000830184611f64565b92915050565b6000606082019050611fa36000830186611cd3565b611fb06020830185611cd3565b611fbd6040830184611cd3565b949350505050565b6000611fd082611f40565b9050919050565b611fe081611fc5565b82525050565b6000602082019050611ffb6000830184611fd7565b92915050565b600082825260208201905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612048601f83612001565b915061205382612012565b602082019050919050565b600060208201905081810360008301526120778161203b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120b882611cc9565b91506120c383611cc9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156120f8576120f761207e565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061214181611d2f565b92915050565b60006020828403121561215d5761215c611c0d565b5b600061216b84828501612132565b91505092915050565b7f43616e2774207374616b6520746f6b656e7320796f7520646f6e2774206f776e60008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b60006121d0602183612001565b91506121db82612174565b604082019050919050565b600060208201905081810360008301526121ff816121c3565b9050919050565b600060608201905061221b6000830186611e0a565b6122286020830185611e0a565b6122356040830184611cd3565b949350505050565b600061224882611cc9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561227b5761227a61207e565b5b600182019050919050565b7f596f752068617665206e6f207265776172647320746f20636c61696d00000000600082015250565b60006122bc601c83612001565b91506122c782612286565b602082019050919050565b600060208201905081810360008301526122eb816122af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f596f752068617665206e6f20746f6b656e73207374616b656400000000000000600082015250565b6000612357601983612001565b915061236282612321565b602082019050919050565b600060208201905081810360008301526123868161234a565b9050919050565b7f4475636b206e6f7420646f6e65206d6967726174696e67207965742e00000000600082015250565b60006123c3601c83612001565b91506123ce8261238d565b602082019050919050565b600060208201905081810360008301526123f2816123b6565b9050919050565b600061240482611cc9565b915061240f83611cc9565b9250828210156124225761242161207e565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124b8602683612001565b91506124c38261245c565b604082019050919050565b600060208201905081810360008301526124e7816124ab565b9050919050565b60006124f982611cc9565b915061250483611cc9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561253d5761253c61207e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061258282611cc9565b915061258d83611cc9565b92508261259d5761259c612548565b5b828204905092915050565b60006040820190506125bd6000830185611e0a565b6125ca6020830184611cd3565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612607602083612001565b9150612612826125d1565b602082019050919050565b60006020820190508181036000830152612636816125fa565b9050919050565b60008115159050919050565b6126528161263d565b811461265d57600080fd5b50565b60008151905061266f81612649565b92915050565b60006020828403121561268b5761268a611c0d565b5b600061269984828501612660565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006126fe602a83612001565b9150612709826126a2565b604082019050919050565b6000602082019050818103600083015261272d816126f1565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612790602683612001565b915061279b82612734565b604082019050919050565b600060208201905081810360008301526127bf81612783565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006127fc601d83612001565b9150612807826127c6565b602082019050919050565b6000602082019050818103600083015261282b816127ef565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561286657808201518184015260208101905061284b565b83811115612875576000848401525b50505050565b600061288682612832565b612890818561283d565b93506128a0818560208601612848565b80840191505092915050565b60006128b8828461287b565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b60006128ea826128c3565b6128f48185612001565b9350612904818560208601612848565b61290d816128ce565b840191505092915050565b6000602082019050818103600083015261293281846128df565b90509291505056fea2646970667358221220a603a57001c38cf2b54fd898723019b102334a608a3e445419f6ad063101d5c164736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f84000000000000000000000000db53b32db1a79f14bb17d71ac1039cee098a7084
-----Decoded View---------------
Arg [0] : _nftCollection (address): 0x8E6e63e05Fffc220f808674e6Ce14c82799D9F84
Arg [1] : _rewardsToken (address): 0xdB53B32DB1a79F14Bb17d71ac1039cee098A7084
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008e6e63e05fffc220f808674e6ce14c82799d9f84
Arg [1] : 000000000000000000000000db53b32db1a79f14bb17d71ac1039cee098a7084
Deployed Bytecode Sourcemap
32780:7735:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34614:987;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37365:392;;;:::i;:::-;;33577:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38595:225;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34041:31;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38828:772;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32957:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13582:103;;;:::i;:::-;;38095:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12934:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35940:1242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33666:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;33832:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32914:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13840:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33982:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34614:987;9859:1;10457:7;;:19;;10449:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9859:1;10590:7;:18;;;;34735:1:::1;34696:9;:21;34706:10;34696:21;;;;;;;;;;;;;;;:36;;;:40;34692:247;;;34753:15;34771:28;34788:10;34771:16;:28::i;:::-;34753:46;;34856:7;34814:9;:21;34824:10;34814:21;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;;;;;34738:137;34692:247;;;34896:14;34916:10;34896:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34692:247;34949:11;34963:9;;:16;;34949:30;;34995:9;34990:483;35010:3;35006:1;:7;34990:483;;;35100:10;35061:49;;:13;:21;;;35083:9;;35093:1;35083:12;;;;;;;:::i;:::-;;;;;;;;35061:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;35035:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;35194:13;:26;;;35221:10;35241:4;35248:9;;35258:1;35248:12;;;;;;;:::i;:::-;;;;;;;;35194:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35276:9;:21;35286:10;35276:21;;;;;;;;;;;;;;;:34;;35316:9;;35326:1;35316:12;;;;;;;:::i;:::-;;;;;;;;35276:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35376:10;35344:15;:29;35360:9;;35370:1;35360:12;;;;;;;:::i;:::-;;;;;;;;35344:29;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;35451:10;;35433:15;:28;;;;:::i;:::-;35401:15;:29;35417:9;;35427:1;35417:12;;;;;;;:::i;:::-;;;;;;;;35401:29;;;;;;;;;;;:60;;;;35015:3;;;;:::i;:::-;;;34990:483;;;;35523:3;35483:9;:21;35493:10;35483:21;;;;;;;;;;;;;;;:36;;;:43;;;;;;;:::i;:::-;;;;;;;;35578:15;35537:9;:21;35547:10;35537:21;;;;;;;;;;;;;;;:38;;:56;;;;34681:920;9815:1:::0;10769:7;:22;;;;34614:987;;:::o;37365:392::-;37409:15;37471:9;:21;37481:10;37471:21;;;;;;;;;;;;;;;:38;;;37427:28;37444:10;37427:16;:28::i;:::-;:82;;;;:::i;:::-;37409:100;;37538:1;37528:7;:11;37520:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;37624:15;37583:9;:21;37593:10;37583:21;;;;;;;;;;;;;;;:38;;:56;;;;37691:1;37650:9;:21;37660:10;37650:21;;;;;;;;;;;;;;;:38;;:42;;;;37703:46;37729:10;37741:7;37703:12;:25;;;;:46;;;;;:::i;:::-;37398:359;37365:392::o;33577:31::-;;;;:::o;38595:225::-;38681:21;38704:25;38755:9;:16;38765:5;38755:16;;;;;;;;;;;;;;;:31;;;38788:23;38805:5;38788:16;:23::i;:::-;38747:65;;;;38595:225;;;:::o;34041:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38828:772::-;38889:16;38995:1;38961:9;:16;38971:5;38961:16;;;;;;;;;;;;;;;:31;;;:35;38957:636;;;39106:30;39153:9;:16;39163:5;39153:16;;;;;;;;;;;;;;;:31;;;39139:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39106:79;;39200:14;39240:9;39235:193;39259:9;:16;39269:5;39259:16;;;;;;;;;;;;;;;:29;;:36;;;;39255:1;:40;39235:193;;;39349:9;:16;39359:5;39349:16;;;;;;;;;;;;;;;:29;;39379:1;39349:32;;;;;;;;:::i;:::-;;;;;;;;;;39325:13;39339:6;39325:21;;;;;;;;:::i;:::-;;;;;;;:56;;;;;39404:8;;;;;:::i;:::-;;;;39297:3;;;;;:::i;:::-;;;;39235:193;;;;39451:13;39444:20;;;;;;38957:636;39579:1;39565:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39558:23;;38828:772;;;;:::o;32957:39::-;;;:::o;13582:103::-;12820:13;:11;:13::i;:::-;13647:30:::1;13674:1;13647:18;:30::i;:::-;13582:103::o:0;38095:442::-;12820:13;:11;:13::i;:::-;38168:27:::1;38198:14;38168:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38223:11;38237:10;:17;38223:31;;38270:9;38265:229;38285:3;38281:1;:7;38265:229;;;38310:12;38325:10;38336:1;38325:13;;;;;;;;:::i;:::-;;;;;;;;38310:28;;38389:22;38406:4;38389:16;:22::i;:::-;38353:9;:15;38363:4;38353:15;;;;;;;;;;;;;;;:32;;;:58;;;;;;;:::i;:::-;;;;;;;;38467:15;38426:9;:21;38436:10;38426:21;;;;;;;;;;;;;;;:38;;:56;;;;38295:199;38290:3;;;;:::i;:::-;;;38265:229;;;;38520:9;38504:13;:25;;;;38157:380;;38095:442:::0;:::o;12934:87::-;12980:7;13007:6;;;;;;;;;;;13000:13;;12934:87;:::o;35940:1242::-;9859:1;10457:7;;:19;;10449:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;9859:1;10590:7;:18;;;;36082:1:::1;36043:9;:21;36053:10;36043:21;;;;;;;;;;;;;;;:36;;;:40;36021:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;36147:15;36165:28;36182:10;36165:16;:28::i;:::-;36147:46;;36246:7;36204:9;:21;36214:10;36204:21;;;;;;;;;;;;;;;:38;;;:49;;;;;;;:::i;:::-;;;;;;;;36264:11;36278:9;;:16;;36264:30;;36310:9;36305:400;36325:3;36321:1;:7;36305:400;;;36391:10;36358:43;;:15;:29;36374:9;;36384:1;36374:12;;;;;;;:::i;:::-;;;;;;;;36358:29;;;;;;;;;;;;;;;;;;;;;:43;;;36350:52;;;::::0;::::1;;36444:15;:29;36460:9;;36470:1;36460:12;;;;;;;:::i;:::-;;;;;;;;36444:29;;;;;;;;;;;;36425:15;:48;;36417:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;36561:1;36521:15;:29;36537:9;;36547:1;36537:12;;;;;;;:::i;:::-;;;;;;;;36521:29;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;36610:1;36578:15;:29;36594:9;;36604:1;36594:12;;;;;;;:::i;:::-;;;;;;;;36578:29;;;;;;;;;;;:33;;;;36626:13;:26;;;36661:4;36668:10;36680:9;;36690:1;36680:12;;;;;;;:::i;:::-;;;;;;;;36626:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36330:3;;;;:::i;:::-;;;36305:400;;;;36755:3;36715:9;:21;36725:10;36715:21;;;;;;;;;;;;;;;:36;;;:43;;;;;;;:::i;:::-;;;;;;;;36810:15;36769:9;:21;36779:10;36769:21;;;;;;;;;;;;;;;:38;;:56;;;;36880:1;36840:9;:21;36850:10;36840:21;;;;;;;;;;;;;;;:36;;;:41;36836:339;;;36903:9;36898:266;36918:14;:21;;;;36914:1;:25;36898:266;;;36990:10;36969:31;;:14;36984:1;36969:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:31;;;36965:184;;;37045:14;37084:1;37060:14;:21;;;;:25;;;;:::i;:::-;37045:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37025:14;37040:1;37025:17;;;;;;;;:::i;:::-;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;37109:14;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;36965:184;36941:3;;;;:::i;:::-;;;36898:266;;;;36836:339;36010:1172;;9815:1:::0;10769:7;:22;;;;35940:1242;;:::o;33666:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33832:50::-;;;;;;;;;;;;;;;;;;;;;;:::o;32914:36::-;;;:::o;13840:201::-;12820:13;:11;:13::i;:::-;13949:1:::1;13929:22;;:8;:22;;;;13921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14005:28;14024:8;14005:18;:28::i;:::-;13840:201:::0;:::o;33982:50::-;;;;;;;;;;;;;;;;;:::o;40185:327::-;40280:16;40314:24;40341:9;:20;40351:9;40341:20;;;;;;;;;;;;;;;40314:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40500:3;40483:13;;40445:8;:23;;;40416:8;:25;;;40398:15;:43;;;;:::i;:::-;40397:71;;;;:::i;:::-;40381:115;;;;:::i;:::-;40380:123;;;;:::i;:::-;40372:132;;;40185:327;;;:::o;28910:211::-;29027:86;29047:5;29077:23;;;29102:2;29106:5;29054:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29027:19;:86::i;:::-;28910:211;;;:::o;39608:328::-;39672:7;39731:1;39696:9;:16;39706:5;39696:16;;;;;;;;;;;;;;;:31;;;:36;39692:109;;;39756:9;:16;39766:5;39756:16;;;;;;;;;;;;;;;:33;;;39749:40;;;;39692:109;39811:16;39879:23;39896:5;39879:16;:23::i;:::-;39830:9;:16;39840:5;39830:16;;;;;;;;;;;;;;;:33;;;:72;;;;:::i;:::-;39811:91;;39920:8;39913:15;;;39608:328;;;;:::o;13099:132::-;13174:12;:10;:12::i;:::-;13163:23;;:7;:5;:7::i;:::-;:23;;;13155:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13099:132::o;14201:191::-;14275:16;14294:6;;;;;;;;;;;14275:25;;14320:8;14311:6;;:17;;;;;;;;;;;;;;;;;;14375:8;14344:40;;14365:8;14344:40;;;;;;;;;;;;14264:128;14201:191;:::o;31977:716::-;32401:23;32427:69;32455:4;32427:69;;;;;;;;;;;;;;;;;32435:5;32427:27;;;;:69;;;;;:::i;:::-;32401:95;;32531:1;32511:10;:17;:21;32507:179;;;32608:10;32597:30;;;;;;;;;;;;:::i;:::-;32589:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32507:179;32047:646;31977:716;;:::o;11485:98::-;11538:7;11565:10;11558:17;;11485:98;:::o;18377:229::-;18514:12;18546:52;18568:6;18576:4;18582:1;18585:12;18546:21;:52::i;:::-;18539:59;;18377:229;;;;;:::o;19497:510::-;19667:12;19725:5;19700:21;:30;;19692:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;19792:18;19803:6;19792:10;:18::i;:::-;19784:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19858:12;19872:23;19899:6;:11;;19918:5;19925:4;19899:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19857:73;;;;19948:51;19965:7;19974:10;19986:12;19948:16;:51::i;:::-;19941:58;;;;19497:510;;;;;;:::o;15632:326::-;15692:4;15949:1;15927:7;:19;;;:23;15920:30;;15632:326;;;:::o;22183:762::-;22333:12;22362:7;22358:580;;;22393:10;22386:17;;;;22358:580;22527:1;22507:10;:17;:21;22503:424;;;22755:10;22749:17;22816:15;22803:10;22799:2;22795:19;22788:44;22503:424;22898:12;22891:20;;;;;;;;;;;:::i;:::-;;;;;;;;22183:762;;;;;;:::o;88:117:1:-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:117;689:1;686;679:12;720:568;793:8;803:6;853:3;846:4;838:6;834:17;830:27;820:122;;861:79;;:::i;:::-;820:122;974:6;961:20;951:30;;1004:18;996:6;993:30;990:117;;;1026:79;;:::i;:::-;990:117;1140:4;1132:6;1128:17;1116:29;;1194:3;1186:4;1178:6;1174:17;1164:8;1160:32;1157:41;1154:128;;;1201:79;;:::i;:::-;1154:128;720:568;;;;;:::o;1294:559::-;1380:6;1388;1437:2;1425:9;1416:7;1412:23;1408:32;1405:119;;;1443:79;;:::i;:::-;1405:119;1591:1;1580:9;1576:17;1563:31;1621:18;1613:6;1610:30;1607:117;;;1643:79;;:::i;:::-;1607:117;1756:80;1828:7;1819:6;1808:9;1804:22;1756:80;:::i;:::-;1738:98;;;;1534:312;1294:559;;;;;:::o;1859:77::-;1896:7;1925:5;1914:16;;1859:77;;;:::o;1942:118::-;2029:24;2047:5;2029:24;:::i;:::-;2024:3;2017:37;1942:118;;:::o;2066:222::-;2159:4;2197:2;2186:9;2182:18;2174:26;;2210:71;2278:1;2267:9;2263:17;2254:6;2210:71;:::i;:::-;2066:222;;;;:::o;2294:126::-;2331:7;2371:42;2364:5;2360:54;2349:65;;2294:126;;;:::o;2426:96::-;2463:7;2492:24;2510:5;2492:24;:::i;:::-;2481:35;;2426:96;;;:::o;2528:122::-;2601:24;2619:5;2601:24;:::i;:::-;2594:5;2591:35;2581:63;;2640:1;2637;2630:12;2581:63;2528:122;:::o;2656:139::-;2702:5;2740:6;2727:20;2718:29;;2756:33;2783:5;2756:33;:::i;:::-;2656:139;;;;:::o;2801:329::-;2860:6;2909:2;2897:9;2888:7;2884:23;2880:32;2877:119;;;2915:79;;:::i;:::-;2877:119;3035:1;3060:53;3105:7;3096:6;3085:9;3081:22;3060:53;:::i;:::-;3050:63;;3006:117;2801:329;;;;:::o;3136:332::-;3257:4;3295:2;3284:9;3280:18;3272:26;;3308:71;3376:1;3365:9;3361:17;3352:6;3308:71;:::i;:::-;3389:72;3457:2;3446:9;3442:18;3433:6;3389:72;:::i;:::-;3136:332;;;;;:::o;3474:122::-;3547:24;3565:5;3547:24;:::i;:::-;3540:5;3537:35;3527:63;;3586:1;3583;3576:12;3527:63;3474:122;:::o;3602:139::-;3648:5;3686:6;3673:20;3664:29;;3702:33;3729:5;3702:33;:::i;:::-;3602:139;;;;:::o;3747:329::-;3806:6;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;3981:1;4006:53;4051:7;4042:6;4031:9;4027:22;4006:53;:::i;:::-;3996:63;;3952:117;3747:329;;;;:::o;4082:118::-;4169:24;4187:5;4169:24;:::i;:::-;4164:3;4157:37;4082:118;;:::o;4206:222::-;4299:4;4337:2;4326:9;4322:18;4314:26;;4350:71;4418:1;4407:9;4403:17;4394:6;4350:71;:::i;:::-;4206:222;;;;:::o;4434:114::-;4501:6;4535:5;4529:12;4519:22;;4434:114;;;:::o;4554:184::-;4653:11;4687:6;4682:3;4675:19;4727:4;4722:3;4718:14;4703:29;;4554:184;;;;:::o;4744:132::-;4811:4;4834:3;4826:11;;4864:4;4859:3;4855:14;4847:22;;4744:132;;;:::o;4882:108::-;4959:24;4977:5;4959:24;:::i;:::-;4954:3;4947:37;4882:108;;:::o;4996:179::-;5065:10;5086:46;5128:3;5120:6;5086:46;:::i;:::-;5164:4;5159:3;5155:14;5141:28;;4996:179;;;;:::o;5181:113::-;5251:4;5283;5278:3;5274:14;5266:22;;5181:113;;;:::o;5330:732::-;5449:3;5478:54;5526:5;5478:54;:::i;:::-;5548:86;5627:6;5622:3;5548:86;:::i;:::-;5541:93;;5658:56;5708:5;5658:56;:::i;:::-;5737:7;5768:1;5753:284;5778:6;5775:1;5772:13;5753:284;;;5854:6;5848:13;5881:63;5940:3;5925:13;5881:63;:::i;:::-;5874:70;;5967:60;6020:6;5967:60;:::i;:::-;5957:70;;5813:224;5800:1;5797;5793:9;5788:14;;5753:284;;;5757:14;6053:3;6046:10;;5454:608;;;5330:732;;;;:::o;6068:373::-;6211:4;6249:2;6238:9;6234:18;6226:26;;6298:9;6292:4;6288:20;6284:1;6273:9;6269:17;6262:47;6326:108;6429:4;6420:6;6326:108;:::i;:::-;6318:116;;6068:373;;;;:::o;6447:60::-;6475:3;6496:5;6489:12;;6447:60;;;:::o;6513:142::-;6563:9;6596:53;6614:34;6623:24;6641:5;6623:24;:::i;:::-;6614:34;:::i;:::-;6596:53;:::i;:::-;6583:66;;6513:142;;;:::o;6661:126::-;6711:9;6744:37;6775:5;6744:37;:::i;:::-;6731:50;;6661:126;;;:::o;6793:142::-;6859:9;6892:37;6923:5;6892:37;:::i;:::-;6879:50;;6793:142;;;:::o;6941:163::-;7044:53;7091:5;7044:53;:::i;:::-;7039:3;7032:66;6941:163;;:::o;7110:254::-;7219:4;7257:2;7246:9;7242:18;7234:26;;7270:87;7354:1;7343:9;7339:17;7330:6;7270:87;:::i;:::-;7110:254;;;;:::o;7370:442::-;7519:4;7557:2;7546:9;7542:18;7534:26;;7570:71;7638:1;7627:9;7623:17;7614:6;7570:71;:::i;:::-;7651:72;7719:2;7708:9;7704:18;7695:6;7651:72;:::i;:::-;7733;7801:2;7790:9;7786:18;7777:6;7733:72;:::i;:::-;7370:442;;;;;;:::o;7818:140::-;7882:9;7915:37;7946:5;7915:37;:::i;:::-;7902:50;;7818:140;;;:::o;7964:159::-;8065:51;8110:5;8065:51;:::i;:::-;8060:3;8053:64;7964:159;;:::o;8129:250::-;8236:4;8274:2;8263:9;8259:18;8251:26;;8287:85;8369:1;8358:9;8354:17;8345:6;8287:85;:::i;:::-;8129:250;;;;:::o;8385:169::-;8469:11;8503:6;8498:3;8491:19;8543:4;8538:3;8534:14;8519:29;;8385:169;;;;:::o;8560:181::-;8700:33;8696:1;8688:6;8684:14;8677:57;8560:181;:::o;8747:366::-;8889:3;8910:67;8974:2;8969:3;8910:67;:::i;:::-;8903:74;;8986:93;9075:3;8986:93;:::i;:::-;9104:2;9099:3;9095:12;9088:19;;8747:366;;;:::o;9119:419::-;9285:4;9323:2;9312:9;9308:18;9300:26;;9372:9;9366:4;9362:20;9358:1;9347:9;9343:17;9336:47;9400:131;9526:4;9400:131;:::i;:::-;9392:139;;9119:419;;;:::o;9544:180::-;9592:77;9589:1;9582:88;9689:4;9686:1;9679:15;9713:4;9710:1;9703:15;9730:305;9770:3;9789:20;9807:1;9789:20;:::i;:::-;9784:25;;9823:20;9841:1;9823:20;:::i;:::-;9818:25;;9977:1;9909:66;9905:74;9902:1;9899:81;9896:107;;;9983:18;;:::i;:::-;9896:107;10027:1;10024;10020:9;10013:16;;9730:305;;;;:::o;10041:180::-;10089:77;10086:1;10079:88;10186:4;10183:1;10176:15;10210:4;10207:1;10200:15;10227:143;10284:5;10315:6;10309:13;10300:22;;10331:33;10358:5;10331:33;:::i;:::-;10227:143;;;;:::o;10376:351::-;10446:6;10495:2;10483:9;10474:7;10470:23;10466:32;10463:119;;;10501:79;;:::i;:::-;10463:119;10621:1;10646:64;10702:7;10693:6;10682:9;10678:22;10646:64;:::i;:::-;10636:74;;10592:128;10376:351;;;;:::o;10733:220::-;10873:34;10869:1;10861:6;10857:14;10850:58;10942:3;10937:2;10929:6;10925:15;10918:28;10733:220;:::o;10959:366::-;11101:3;11122:67;11186:2;11181:3;11122:67;:::i;:::-;11115:74;;11198:93;11287:3;11198:93;:::i;:::-;11316:2;11311:3;11307:12;11300:19;;10959:366;;;:::o;11331:419::-;11497:4;11535:2;11524:9;11520:18;11512:26;;11584:9;11578:4;11574:20;11570:1;11559:9;11555:17;11548:47;11612:131;11738:4;11612:131;:::i;:::-;11604:139;;11331:419;;;:::o;11756:442::-;11905:4;11943:2;11932:9;11928:18;11920:26;;11956:71;12024:1;12013:9;12009:17;12000:6;11956:71;:::i;:::-;12037:72;12105:2;12094:9;12090:18;12081:6;12037:72;:::i;:::-;12119;12187:2;12176:9;12172:18;12163:6;12119:72;:::i;:::-;11756:442;;;;;;:::o;12204:233::-;12243:3;12266:24;12284:5;12266:24;:::i;:::-;12257:33;;12312:66;12305:5;12302:77;12299:103;;;12382:18;;:::i;:::-;12299:103;12429:1;12422:5;12418:13;12411:20;;12204:233;;;:::o;12443:178::-;12583:30;12579:1;12571:6;12567:14;12560:54;12443:178;:::o;12627:366::-;12769:3;12790:67;12854:2;12849:3;12790:67;:::i;:::-;12783:74;;12866:93;12955:3;12866:93;:::i;:::-;12984:2;12979:3;12975:12;12968:19;;12627:366;;;:::o;12999:419::-;13165:4;13203:2;13192:9;13188:18;13180:26;;13252:9;13246:4;13242:20;13238:1;13227:9;13223:17;13216:47;13280:131;13406:4;13280:131;:::i;:::-;13272:139;;12999:419;;;:::o;13424:180::-;13472:77;13469:1;13462:88;13569:4;13566:1;13559:15;13593:4;13590:1;13583:15;13610:175;13750:27;13746:1;13738:6;13734:14;13727:51;13610:175;:::o;13791:366::-;13933:3;13954:67;14018:2;14013:3;13954:67;:::i;:::-;13947:74;;14030:93;14119:3;14030:93;:::i;:::-;14148:2;14143:3;14139:12;14132:19;;13791:366;;;:::o;14163:419::-;14329:4;14367:2;14356:9;14352:18;14344:26;;14416:9;14410:4;14406:20;14402:1;14391:9;14387:17;14380:47;14444:131;14570:4;14444:131;:::i;:::-;14436:139;;14163:419;;;:::o;14588:178::-;14728:30;14724:1;14716:6;14712:14;14705:54;14588:178;:::o;14772:366::-;14914:3;14935:67;14999:2;14994:3;14935:67;:::i;:::-;14928:74;;15011:93;15100:3;15011:93;:::i;:::-;15129:2;15124:3;15120:12;15113:19;;14772:366;;;:::o;15144:419::-;15310:4;15348:2;15337:9;15333:18;15325:26;;15397:9;15391:4;15387:20;15383:1;15372:9;15368:17;15361:47;15425:131;15551:4;15425:131;:::i;:::-;15417:139;;15144:419;;;:::o;15569:191::-;15609:4;15629:20;15647:1;15629:20;:::i;:::-;15624:25;;15663:20;15681:1;15663:20;:::i;:::-;15658:25;;15702:1;15699;15696:8;15693:34;;;15707:18;;:::i;:::-;15693:34;15752:1;15749;15745:9;15737:17;;15569:191;;;;:::o;15766:180::-;15814:77;15811:1;15804:88;15911:4;15908:1;15901:15;15935:4;15932:1;15925:15;15952:225;16092:34;16088:1;16080:6;16076:14;16069:58;16161:8;16156:2;16148:6;16144:15;16137:33;15952:225;:::o;16183:366::-;16325:3;16346:67;16410:2;16405:3;16346:67;:::i;:::-;16339:74;;16422:93;16511:3;16422:93;:::i;:::-;16540:2;16535:3;16531:12;16524:19;;16183:366;;;:::o;16555:419::-;16721:4;16759:2;16748:9;16744:18;16736:26;;16808:9;16802:4;16798:20;16794:1;16783:9;16779:17;16772:47;16836:131;16962:4;16836:131;:::i;:::-;16828:139;;16555:419;;;:::o;16980:348::-;17020:7;17043:20;17061:1;17043:20;:::i;:::-;17038:25;;17077:20;17095:1;17077:20;:::i;:::-;17072:25;;17265:1;17197:66;17193:74;17190:1;17187:81;17182:1;17175:9;17168:17;17164:105;17161:131;;;17272:18;;:::i;:::-;17161:131;17320:1;17317;17313:9;17302:20;;16980:348;;;;:::o;17334:180::-;17382:77;17379:1;17372:88;17479:4;17476:1;17469:15;17503:4;17500:1;17493:15;17520:185;17560:1;17577:20;17595:1;17577:20;:::i;:::-;17572:25;;17611:20;17629:1;17611:20;:::i;:::-;17606:25;;17650:1;17640:35;;17655:18;;:::i;:::-;17640:35;17697:1;17694;17690:9;17685:14;;17520:185;;;;:::o;17711:332::-;17832:4;17870:2;17859:9;17855:18;17847:26;;17883:71;17951:1;17940:9;17936:17;17927:6;17883:71;:::i;:::-;17964:72;18032:2;18021:9;18017:18;18008:6;17964:72;:::i;:::-;17711:332;;;;;:::o;18049:182::-;18189:34;18185:1;18177:6;18173:14;18166:58;18049:182;:::o;18237:366::-;18379:3;18400:67;18464:2;18459:3;18400:67;:::i;:::-;18393:74;;18476:93;18565:3;18476:93;:::i;:::-;18594:2;18589:3;18585:12;18578:19;;18237:366;;;:::o;18609:419::-;18775:4;18813:2;18802:9;18798:18;18790:26;;18862:9;18856:4;18852:20;18848:1;18837:9;18833:17;18826:47;18890:131;19016:4;18890:131;:::i;:::-;18882:139;;18609:419;;;:::o;19034:90::-;19068:7;19111:5;19104:13;19097:21;19086:32;;19034:90;;;:::o;19130:116::-;19200:21;19215:5;19200:21;:::i;:::-;19193:5;19190:32;19180:60;;19236:1;19233;19226:12;19180:60;19130:116;:::o;19252:137::-;19306:5;19337:6;19331:13;19322:22;;19353:30;19377:5;19353:30;:::i;:::-;19252:137;;;;:::o;19395:345::-;19462:6;19511:2;19499:9;19490:7;19486:23;19482:32;19479:119;;;19517:79;;:::i;:::-;19479:119;19637:1;19662:61;19715:7;19706:6;19695:9;19691:22;19662:61;:::i;:::-;19652:71;;19608:125;19395:345;;;;:::o;19746:229::-;19886:34;19882:1;19874:6;19870:14;19863:58;19955:12;19950:2;19942:6;19938:15;19931:37;19746:229;:::o;19981:366::-;20123:3;20144:67;20208:2;20203:3;20144:67;:::i;:::-;20137:74;;20220:93;20309:3;20220:93;:::i;:::-;20338:2;20333:3;20329:12;20322:19;;19981:366;;;:::o;20353:419::-;20519:4;20557:2;20546:9;20542:18;20534:26;;20606:9;20600:4;20596:20;20592:1;20581:9;20577:17;20570:47;20634:131;20760:4;20634:131;:::i;:::-;20626:139;;20353:419;;;:::o;20778:225::-;20918:34;20914:1;20906:6;20902:14;20895:58;20987:8;20982:2;20974:6;20970:15;20963:33;20778:225;:::o;21009:366::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:419::-;21547:4;21585:2;21574:9;21570:18;21562:26;;21634:9;21628:4;21624:20;21620:1;21609:9;21605:17;21598:47;21662:131;21788:4;21662:131;:::i;:::-;21654:139;;21381:419;;;:::o;21806:179::-;21946:31;21942:1;21934:6;21930:14;21923:55;21806:179;:::o;21991:366::-;22133:3;22154:67;22218:2;22213:3;22154:67;:::i;:::-;22147:74;;22230:93;22319:3;22230:93;:::i;:::-;22348:2;22343:3;22339:12;22332:19;;21991:366;;;:::o;22363:419::-;22529:4;22567:2;22556:9;22552:18;22544:26;;22616:9;22610:4;22606:20;22602:1;22591:9;22587:17;22580:47;22644:131;22770:4;22644:131;:::i;:::-;22636:139;;22363:419;;;:::o;22788:98::-;22839:6;22873:5;22867:12;22857:22;;22788:98;;;:::o;22892:147::-;22993:11;23030:3;23015:18;;22892:147;;;;:::o;23045:307::-;23113:1;23123:113;23137:6;23134:1;23131:13;23123:113;;;23222:1;23217:3;23213:11;23207:18;23203:1;23198:3;23194:11;23187:39;23159:2;23156:1;23152:10;23147:15;;23123:113;;;23254:6;23251:1;23248:13;23245:101;;;23334:1;23325:6;23320:3;23316:16;23309:27;23245:101;23094:258;23045:307;;;:::o;23358:373::-;23462:3;23490:38;23522:5;23490:38;:::i;:::-;23544:88;23625:6;23620:3;23544:88;:::i;:::-;23537:95;;23641:52;23686:6;23681:3;23674:4;23667:5;23663:16;23641:52;:::i;:::-;23718:6;23713:3;23709:16;23702:23;;23466:265;23358:373;;;;:::o;23737:271::-;23867:3;23889:93;23978:3;23969:6;23889:93;:::i;:::-;23882:100;;23999:3;23992:10;;23737:271;;;;:::o;24014:99::-;24066:6;24100:5;24094:12;24084:22;;24014:99;;;:::o;24119:102::-;24160:6;24211:2;24207:7;24202:2;24195:5;24191:14;24187:28;24177:38;;24119:102;;;:::o;24227:364::-;24315:3;24343:39;24376:5;24343:39;:::i;:::-;24398:71;24462:6;24457:3;24398:71;:::i;:::-;24391:78;;24478:52;24523:6;24518:3;24511:4;24504:5;24500:16;24478:52;:::i;:::-;24555:29;24577:6;24555:29;:::i;:::-;24550:3;24546:39;24539:46;;24319:272;24227:364;;;;:::o;24597:313::-;24710:4;24748:2;24737:9;24733:18;24725:26;;24797:9;24791:4;24787:20;24783:1;24772:9;24768:17;24761:47;24825:78;24898:4;24889:6;24825:78;:::i;:::-;24817:86;;24597:313;;;;:::o
Swarm Source
ipfs://a603a57001c38cf2b54fd898723019b102334a608a3e445419f6ad063101d5c1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.