More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,669 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Rewards | 19072566 | 448 days ago | IN | 0 ETH | 0.00059042 | ||||
Claim Rewards | 18524713 | 525 days ago | IN | 0 ETH | 0.00107339 | ||||
Withdraw | 18371230 | 546 days ago | IN | 0 ETH | 0.00216608 | ||||
Withdraw | 18331080 | 552 days ago | IN | 0 ETH | 0.00059284 | ||||
Withdraw | 18325898 | 552 days ago | IN | 0 ETH | 0.00095085 | ||||
Withdraw | 18320951 | 553 days ago | IN | 0 ETH | 0.00076677 | ||||
Withdraw | 18300480 | 556 days ago | IN | 0 ETH | 0.00206529 | ||||
Withdraw | 18283537 | 558 days ago | IN | 0 ETH | 0.00331794 | ||||
Withdraw | 18275819 | 560 days ago | IN | 0 ETH | 0.0009682 | ||||
Claim Rewards | 18269109 | 560 days ago | IN | 0 ETH | 0.00045074 | ||||
Withdraw | 18256696 | 562 days ago | IN | 0 ETH | 0.00208499 | ||||
Claim Rewards | 18256687 | 562 days ago | IN | 0 ETH | 0.00047237 | ||||
Claim Rewards | 18234505 | 565 days ago | IN | 0 ETH | 0.00051121 | ||||
Claim Rewards | 18226785 | 566 days ago | IN | 0 ETH | 0.00042262 | ||||
Withdraw | 18187417 | 572 days ago | IN | 0 ETH | 0.00162408 | ||||
Withdraw | 18186876 | 572 days ago | IN | 0 ETH | 0.00492593 | ||||
Withdraw | 18152022 | 577 days ago | IN | 0 ETH | 0.00071752 | ||||
Claim Rewards | 18102326 | 584 days ago | IN | 0 ETH | 0.00044235 | ||||
Withdraw | 18081227 | 587 days ago | IN | 0 ETH | 0.00109631 | ||||
Withdraw | 18081224 | 587 days ago | IN | 0 ETH | 0.001292 | ||||
Withdraw | 18070932 | 588 days ago | IN | 0 ETH | 0.00505318 | ||||
Claim Rewards | 18069815 | 588 days ago | IN | 0 ETH | 0.0006005 | ||||
Withdraw | 18058376 | 590 days ago | IN | 0 ETH | 0.00127726 | ||||
Withdraw | 18058287 | 590 days ago | IN | 0 ETH | 0.00110832 | ||||
Withdraw | 18004339 | 598 days ago | IN | 0 ETH | 0.00381687 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WagmiStaking
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-19 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/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/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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 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); } // 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/WagmiStaking.sol pragma solidity ^0.8.4; contract WagmiStaking is ReentrancyGuard, AccessControl { using SafeERC20 for IERC20; // Interfaces for ERC20 and ERC721 IERC20 public immutable rewardsToken; IERC721 public immutable nftCollection; uint256 public minimumStakingTime = 168; // Constructor function to set the rewards token and the NFT collection addresses constructor(IERC721 _nftCollection, IERC20 _rewardsToken) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); nftCollection = _nftCollection; rewardsToken = _rewardsToken; } struct StakedToken { address staker; uint256 tokenId; uint256 tokenStoreTime; } // Staker info struct Staker { // Amount of tokens staked by the staker uint256 amountStaked; // Staked token ids StakedToken[] stakedTokens; // Last time of the rewards were calculated for this user uint256 timeOfLastUpdate; uint256 timeOfStake; // Calculated, but unclaimed rewards for the User. The rewards are // calculated each time the user writes to the Smart Contract uint256 unclaimedRewards; } // Rewards per hour per token deposited in wei. uint256 private rewardsPerHour = 1000000000000000000; // Mapping of User Address to Staker info mapping(address => Staker) public stakers; // Mapping of Token Id to staker. Made for the SC to remeber // who to send back the ERC721 Token to. mapping(uint256 => address) public stakerAddress; function setMinimumStakingHours (uint _hours) public onlyRole(DEFAULT_ADMIN_ROLE) { minimumStakingTime = _hours; } function setRewardPerHour (uint _reward) public onlyRole(DEFAULT_ADMIN_ROLE) { rewardsPerHour = _reward; } // If address already has ERC721 Token/s staked, calculate the rewards. // Increment the amountStaked 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 wallet has tokens staked, calculate the rewards before adding the new token if (stakers[msg.sender].amountStaked > 0) { uint256 rewards = calculateRewards(msg.sender); stakers[msg.sender].unclaimedRewards += rewards; } unchecked { for (uint256 i = 0; i < _tokenIds.length; i++) { _stake(_tokenIds[i]); } } // Update the timeOfLastUpdate for the staker stakers[msg.sender].timeOfLastUpdate = block.timestamp; } function _stake(uint _tokenId) internal { // Wallet must own the token they are trying to stake require( nftCollection.ownerOf(_tokenId) == msg.sender, "You don't own this token!" ); unchecked { // Transfer the token from the wallet to the Smart contract nftCollection.transferFrom(msg.sender, address(this), _tokenId); // Create StakedToken StakedToken memory stakedToken = StakedToken(msg.sender, _tokenId, block.timestamp); // Add the token to the stakedTokens array stakers[msg.sender].stakedTokens.push(stakedToken); // Increment the amount staked for this wallet stakers[msg.sender].amountStaked++; // Update the mapping of the tokenId to the staker's address stakerAddress[_tokenId] = msg.sender; } } function withdraw(uint256[] calldata _tokenIds) external nonReentrant { // Make sure the user has at least one token staked before withdrawing require( stakers[msg.sender].amountStaked > 0, "You have no tokens staked" ); // Update the rewards for this user, as the amount of rewards decreases with less tokens. uint256 rewards = calculateRewards(msg.sender); stakers[msg.sender].unclaimedRewards += rewards; unchecked { for (uint256 i = 0; i < _tokenIds.length; i++) { _withdraw(_tokenIds[i]); } } // Update the timeOfLastUpdate for the withdrawer stakers[msg.sender].timeOfLastUpdate = block.timestamp; } // Check if user has any ERC721 Tokens Staked and if they tried to withdraw, // calculate the rewards and store them in the unclaimedRewards // decrement the amountStaked of the user and transfer the ERC721 token back to them function _withdraw(uint256 _tokenId) internal { // Wallet must own the token they are trying to withdraw require(stakerAddress[_tokenId] == msg.sender, "You don't own this token!"); // Find the index of this token id in the stakedTokens array uint256 index = 0; unchecked { for (uint256 i = 0; i < stakers[msg.sender].stakedTokens.length; i++) { if (stakers[msg.sender].stakedTokens[i].tokenId == _tokenId) { index = i; break; } } } require(stakers[msg.sender].stakedTokens[index].tokenStoreTime + (minimumStakingTime * 1 hours) <= block.timestamp, "You cannot withdraw before minimum staking time is passed !"); // Set this token's .staker to be address 0 to mark it as no longer staked stakers[msg.sender].stakedTokens[index].staker = address(0); // Decrement the amount staked for this wallet stakers[msg.sender].amountStaked--; // Update the mapping of the tokenId to the be address(0) to indicate that the token is no longer staked stakerAddress[_tokenId] = address(0); // Transfer the token back to the withdrawer nftCollection.transferFrom(address(this), msg.sender, _tokenId); } // 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) + stakers[msg.sender].unclaimedRewards; require(rewards > 0, "You have no rewards to claim"); stakers[msg.sender].timeOfLastUpdate = block.timestamp; stakers[msg.sender].unclaimedRewards = 0; rewardsToken.safeTransfer(msg.sender, rewards); } ////////// // View // ////////// function availableRewards(address _staker) public view returns (uint256) { uint256 rewards = calculateRewards(_staker) + stakers[_staker].unclaimedRewards; return rewards; } function getStakedTokens(address _user) public view returns (StakedToken[] memory) { // Check if we know this user if (stakers[_user].amountStaked > 0) { unchecked { // Return all the tokens in the stakedToken Array for this user that are not -1 StakedToken[] memory _stakedTokens = new StakedToken[](stakers[_user].amountStaked); uint256 _index = 0; for (uint256 j = 0; j < stakers[_user].stakedTokens.length; j++) { if (stakers[_user].stakedTokens[j].staker != (address(0))) { _stakedTokens[_index] = stakers[_user].stakedTokens[j]; _index++; } } return _stakedTokens; } } // Otherwise, return empty array else { return new StakedToken[](0); } } ///////////// // Internal// ///////////// // Calculate rewards for param _staker by calculating the time passed // since last update in hours and mulitplying it to ERC721 Tokens Staked // and rewardsPerHour. function calculateRewards(address _staker) internal view returns (uint256 _rewards) { return ((( ((block.timestamp - stakers[_staker].timeOfLastUpdate) * stakers[_staker].amountStaked) ) * rewardsPerHour) / 3600); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC721","name":"_nftCollection","type":"address"},{"internalType":"contract IERC20","name":"_rewardsToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"availableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getStakedTokens","outputs":[{"components":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tokenStoreTime","type":"uint256"}],"internalType":"struct WagmiStaking.StakedToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumStakingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftCollection","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hours","type":"uint256"}],"name":"setMinimumStakingHours","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"setRewardPerHour","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":"stakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"amountStaked","type":"uint256"},{"internalType":"uint256","name":"timeOfLastUpdate","type":"uint256"},{"internalType":"uint256","name":"timeOfStake","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260a8600255670de0b6b3a76400006003553480156200002257600080fd5b50604051620019bd380380620019bd833981016040819052620000459162000112565b6001600090815562000058903362000070565b6001600160a01b0391821660a0521660805262000151565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620000f55760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45b5050565b6001600160a01b03811681146200010f57600080fd5b50565b600080604083850312156200012657600080fd5b82516200013381620000f9565b60208401519092506200014681620000f9565b809150509250929050565b60805160a05161182a62000193600039600081816101e801528181610a7a01528181610b590152610fc901526000818161030401526105c1015261182a6000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639168ae72116100ad578063a217fddf11610071578063a217fddf146102ee578063c5ab62f3146102f6578063d1af0c7d146102ff578063d547741f14610326578063f854a27f1461033957600080fd5b80639168ae721461023557806391d148541461028c578063940670451461029f578063951e0e56146102c8578063983d95ce146102db57600080fd5b806336568abe116100f457806336568abe146101a8578063372500ab146101bb57806363c28db1146101c35780636588103b146101e35780638761dc5f1461022257600080fd5b806301ffc9a7146101265780630fbf0a931461014e578063248a9ca3146101635780632f2ff15d14610195575b600080fd5b61013961013436600461147c565b61034c565b60405190151581526020015b60405180910390f35b61016161015c3660046114a6565b610383565b005b61018761017136600461151b565b6000908152600160208190526040909120015490565b604051908152602001610145565b6101616101a3366004611549565b61047f565b6101616101b6366004611549565b6104aa565b610161610528565b6101d66101d1366004611579565b6105f3565b6040516101459190611596565b61020a7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610145565b61016161023036600461151b565b61081d565b61026c610243366004611579565b600460208190526000918252604090912080546002820154600383015492909301549092919084565b604080519485526020850193909352918301526060820152608001610145565b61013961029a366004611549565b61082e565b61020a6102ad36600461151b565b6005602052600090815260409020546001600160a01b031681565b6101616102d636600461151b565b610859565b6101616102e93660046114a6565b61086a565b610187600081565b61018760025481565b61020a7f000000000000000000000000000000000000000000000000000000000000000081565b610161610334366004611549565b6109a8565b610187610347366004611579565b6109ce565b60006001600160e01b03198216637965db0b60e01b148061037d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002600054036103da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155338152600460205260409020541561042c5760006103fe33610a06565b3360009081526004602081905260408220018054929350839290919061042590849061160e565b9091555050505b60005b818110156104605761045883838381811061044c5761044c611626565b90506020020135610a5a565b60010161042f565b5050336000908152600460205260408120426002909101556001905550565b6000828152600160208190526040909120015461049b81610c4e565b6104a58383610c58565b505050565b6001600160a01b038116331461051a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103d1565b6105248282610cc3565b5050565b33600081815260046020819052604082200154909161054690610a06565b610550919061160e565b9050600081116105a25760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d0000000060448201526064016103d1565b336000818152600460208190526040822042600282015501556105f0907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169083610d2a565b50565b6001600160a01b038116600090815260046020526040902054606090156107c0576001600160a01b03821660009081526004602052604081205467ffffffffffffffff8111156106455761064561163c565b6040519080825280602002602001820160405280156106a357816020015b610690604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816106635790505b5090506000805b6001600160a01b0385166000908152600460205260409020600101548110156107b7576001600160a01b03851660009081526004602052604081206001018054839081106106fa576106fa611626565b60009182526020909120600390910201546001600160a01b0316146107af576001600160a01b038516600090815260046020526040902060010180548290811061074657610746611626565b600091825260209182902060408051606081018252600390930290910180546001600160a01b0316835260018101549383019390935260029092015491810191909152835184908490811061079d5761079d611626565b60209081029190910101526001909101905b6001016106aa565b50909392505050565b6040805160008082526020820190925290610816565b610803604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816107d65790505b5092915050565b600061082881610c4e565b50600355565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061086481610c4e565b50600255565b6002600054036108bc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103d1565b600260009081553381526004602052604090205461091c5760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b65640000000000000060448201526064016103d1565b600061092733610a06565b3360009081526004602081905260408220018054929350839290919061094e90849061160e565b90915550600090505b828110156109885761098084848381811061097457610974611626565b90506020020135610d7c565b600101610957565b505033600090815260046020526040812042600290910155600190555050565b600082815260016020819052604090912001546109c481610c4e565b6104a58383610cc3565b6001600160a01b03811660009081526004602081905260408220015481906109f584610a06565b6109ff919061160e565b9392505050565b6003546001600160a01b038216600090815260046020526040812080546002909101549192610e1092909190610a3c9042611652565b610a469190611669565b610a509190611669565b61037d9190611688565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906116aa565b6001600160a01b031614610b375760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103d1565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610ba557600080fd5b505af1158015610bb9573d6000803e3d6000fd5b505060408051606081018252338082526020808301878152428486019081526000848152600484528681206001808201805480830182559084528684209851600390910290980180546001600160a01b03999099166001600160a01b0319998a161781559451858201559251600290940193909355825490910190915596875260059052919094208054909416179092555050565b6105f08133611029565b610c62828261082e565b6105245760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610ccd828261082e565b156105245760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526104a590849061108d565b6000818152600560205260409020546001600160a01b03163314610dde5760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103d1565b6000805b33600090815260046020526040902060010154811015610e4a57336000908152600460205260409020600101805484919083908110610e2357610e23611626565b90600052602060002090600302016001015403610e4257809150610e4a565b600101610de2565b5042600254610e10610e5c9190611669565b336000908152600460205260409020600101805484908110610e8057610e80611626565b906000526020600020906003020160020154610e9c919061160e565b1115610f105760405162461bcd60e51b815260206004820152603b60248201527f596f752063616e6e6f74207769746864726177206265666f7265206d696e696d60448201527f756d207374616b696e672074696d65206973207061737365642021000000000060648201526084016103d1565b336000908152600460205260408120600101805483908110610f3457610f34611626565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b039490941693909317909255338152600490915260408120805491610f7e836116c7565b90915550506000828152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b15801561100d57600080fd5b505af1158015611021573d6000803e3d6000fd5b505050505050565b611033828261082e565b6105245761104b816001600160a01b0316601461115f565b61105683602061115f565b60405160200161106792919061170e565b60408051601f198184030181529082905262461bcd60e51b82526103d191600401611783565b60006110e2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112fb9092919063ffffffff16565b8051909150156104a5578080602001905181019061110091906117b6565b6104a55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103d1565b6060600061116e836002611669565b61117990600261160e565b67ffffffffffffffff8111156111915761119161163c565b6040519080825280601f01601f1916602001820160405280156111bb576020820181803683370190505b509050600360fc1b816000815181106111d6576111d6611626565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061120557611205611626565b60200101906001600160f81b031916908160001a9053506000611229846002611669565b61123490600161160e565b90505b60018111156112ac576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061126857611268611626565b1a60f81b82828151811061127e5761127e611626565b60200101906001600160f81b031916908160001a90535060049490941c936112a5816116c7565b9050611237565b5083156109ff5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103d1565b606061130a8484600085611312565b949350505050565b6060824710156113735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103d1565b6001600160a01b0385163b6113ca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103d1565b600080866001600160a01b031685876040516113e691906117d8565b60006040518083038185875af1925050503d8060008114611423576040519150601f19603f3d011682016040523d82523d6000602084013e611428565b606091505b5091509150611438828286611443565b979650505050505050565b606083156114525750816109ff565b8251156114625782518084602001fd5b8160405162461bcd60e51b81526004016103d19190611783565b60006020828403121561148e57600080fd5b81356001600160e01b0319811681146109ff57600080fd5b600080602083850312156114b957600080fd5b823567ffffffffffffffff808211156114d157600080fd5b818501915085601f8301126114e557600080fd5b8135818111156114f457600080fd5b8660208260051b850101111561150957600080fd5b60209290920196919550909350505050565b60006020828403121561152d57600080fd5b5035919050565b6001600160a01b03811681146105f057600080fd5b6000806040838503121561155c57600080fd5b82359150602083013561156e81611534565b809150509250929050565b60006020828403121561158b57600080fd5b81356109ff81611534565b602080825282518282018190526000919060409081850190868401855b828110156115eb57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016115b3565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611621576116216115f8565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600082821015611664576116646115f8565b500390565b6000816000190483118215151615611683576116836115f8565b500290565b6000826116a557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116bc57600080fd5b81516109ff81611534565b6000816116d6576116d66115f8565b506000190190565b60005b838110156116f95781810151838201526020016116e1565b83811115611708576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516117468160178501602088016116de565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117778160288401602088016116de565b01602801949350505050565b60208152600082518060208401526117a28160408501602087016116de565b601f01601f19169190910160400192915050565b6000602082840312156117c857600080fd5b815180151581146109ff57600080fd5b600082516117ea8184602087016116de565b919091019291505056fea26469706673582212204490a4f60bfeb05a448b563bca0706bcc31ab31625bef3a3c25605bcae1f3dfa64736f6c634300080e0033000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d7598406000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80639168ae72116100ad578063a217fddf11610071578063a217fddf146102ee578063c5ab62f3146102f6578063d1af0c7d146102ff578063d547741f14610326578063f854a27f1461033957600080fd5b80639168ae721461023557806391d148541461028c578063940670451461029f578063951e0e56146102c8578063983d95ce146102db57600080fd5b806336568abe116100f457806336568abe146101a8578063372500ab146101bb57806363c28db1146101c35780636588103b146101e35780638761dc5f1461022257600080fd5b806301ffc9a7146101265780630fbf0a931461014e578063248a9ca3146101635780632f2ff15d14610195575b600080fd5b61013961013436600461147c565b61034c565b60405190151581526020015b60405180910390f35b61016161015c3660046114a6565b610383565b005b61018761017136600461151b565b6000908152600160208190526040909120015490565b604051908152602001610145565b6101616101a3366004611549565b61047f565b6101616101b6366004611549565b6104aa565b610161610528565b6101d66101d1366004611579565b6105f3565b6040516101459190611596565b61020a7f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d759840681565b6040516001600160a01b039091168152602001610145565b61016161023036600461151b565b61081d565b61026c610243366004611579565b600460208190526000918252604090912080546002820154600383015492909301549092919084565b604080519485526020850193909352918301526060820152608001610145565b61013961029a366004611549565b61082e565b61020a6102ad36600461151b565b6005602052600090815260409020546001600160a01b031681565b6101616102d636600461151b565b610859565b6101616102e93660046114a6565b61086a565b610187600081565b61018760025481565b61020a7f000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc81565b610161610334366004611549565b6109a8565b610187610347366004611579565b6109ce565b60006001600160e01b03198216637965db0b60e01b148061037d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002600054036103da5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155338152600460205260409020541561042c5760006103fe33610a06565b3360009081526004602081905260408220018054929350839290919061042590849061160e565b9091555050505b60005b818110156104605761045883838381811061044c5761044c611626565b90506020020135610a5a565b60010161042f565b5050336000908152600460205260408120426002909101556001905550565b6000828152600160208190526040909120015461049b81610c4e565b6104a58383610c58565b505050565b6001600160a01b038116331461051a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103d1565b6105248282610cc3565b5050565b33600081815260046020819052604082200154909161054690610a06565b610550919061160e565b9050600081116105a25760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d0000000060448201526064016103d1565b336000818152600460208190526040822042600282015501556105f0907f000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc6001600160a01b03169083610d2a565b50565b6001600160a01b038116600090815260046020526040902054606090156107c0576001600160a01b03821660009081526004602052604081205467ffffffffffffffff8111156106455761064561163c565b6040519080825280602002602001820160405280156106a357816020015b610690604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816106635790505b5090506000805b6001600160a01b0385166000908152600460205260409020600101548110156107b7576001600160a01b03851660009081526004602052604081206001018054839081106106fa576106fa611626565b60009182526020909120600390910201546001600160a01b0316146107af576001600160a01b038516600090815260046020526040902060010180548290811061074657610746611626565b600091825260209182902060408051606081018252600390930290910180546001600160a01b0316835260018101549383019390935260029092015491810191909152835184908490811061079d5761079d611626565b60209081029190910101526001909101905b6001016106aa565b50909392505050565b6040805160008082526020820190925290610816565b610803604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816107d65790505b5092915050565b600061082881610c4e565b50600355565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600061086481610c4e565b50600255565b6002600054036108bc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103d1565b600260009081553381526004602052604090205461091c5760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b65640000000000000060448201526064016103d1565b600061092733610a06565b3360009081526004602081905260408220018054929350839290919061094e90849061160e565b90915550600090505b828110156109885761098084848381811061097457610974611626565b90506020020135610d7c565b600101610957565b505033600090815260046020526040812042600290910155600190555050565b600082815260016020819052604090912001546109c481610c4e565b6104a58383610cc3565b6001600160a01b03811660009081526004602081905260408220015481906109f584610a06565b6109ff919061160e565b9392505050565b6003546001600160a01b038216600090815260046020526040812080546002909101549192610e1092909190610a3c9042611652565b610a469190611669565b610a509190611669565b61037d9190611688565b6040516331a9108f60e11b81526004810182905233906001600160a01b037f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d75984061690636352211e90602401602060405180830381865afa158015610ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae591906116aa565b6001600160a01b031614610b375760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103d1565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d75984066001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610ba557600080fd5b505af1158015610bb9573d6000803e3d6000fd5b505060408051606081018252338082526020808301878152428486019081526000848152600484528681206001808201805480830182559084528684209851600390910290980180546001600160a01b03999099166001600160a01b0319998a161781559451858201559251600290940193909355825490910190915596875260059052919094208054909416179092555050565b6105f08133611029565b610c62828261082e565b6105245760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610ccd828261082e565b156105245760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526104a590849061108d565b6000818152600560205260409020546001600160a01b03163314610dde5760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103d1565b6000805b33600090815260046020526040902060010154811015610e4a57336000908152600460205260409020600101805484919083908110610e2357610e23611626565b90600052602060002090600302016001015403610e4257809150610e4a565b600101610de2565b5042600254610e10610e5c9190611669565b336000908152600460205260409020600101805484908110610e8057610e80611626565b906000526020600020906003020160020154610e9c919061160e565b1115610f105760405162461bcd60e51b815260206004820152603b60248201527f596f752063616e6e6f74207769746864726177206265666f7265206d696e696d60448201527f756d207374616b696e672074696d65206973207061737365642021000000000060648201526084016103d1565b336000908152600460205260408120600101805483908110610f3457610f34611626565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b039490941693909317909255338152600490915260408120805491610f7e836116c7565b90915550506000828152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018390526001600160a01b037f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d759840616906323b872dd90606401600060405180830381600087803b15801561100d57600080fd5b505af1158015611021573d6000803e3d6000fd5b505050505050565b611033828261082e565b6105245761104b816001600160a01b0316601461115f565b61105683602061115f565b60405160200161106792919061170e565b60408051601f198184030181529082905262461bcd60e51b82526103d191600401611783565b60006110e2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112fb9092919063ffffffff16565b8051909150156104a5578080602001905181019061110091906117b6565b6104a55760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103d1565b6060600061116e836002611669565b61117990600261160e565b67ffffffffffffffff8111156111915761119161163c565b6040519080825280601f01601f1916602001820160405280156111bb576020820181803683370190505b509050600360fc1b816000815181106111d6576111d6611626565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061120557611205611626565b60200101906001600160f81b031916908160001a9053506000611229846002611669565b61123490600161160e565b90505b60018111156112ac576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061126857611268611626565b1a60f81b82828151811061127e5761127e611626565b60200101906001600160f81b031916908160001a90535060049490941c936112a5816116c7565b9050611237565b5083156109ff5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103d1565b606061130a8484600085611312565b949350505050565b6060824710156113735760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103d1565b6001600160a01b0385163b6113ca5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103d1565b600080866001600160a01b031685876040516113e691906117d8565b60006040518083038185875af1925050503d8060008114611423576040519150601f19603f3d011682016040523d82523d6000602084013e611428565b606091505b5091509150611438828286611443565b979650505050505050565b606083156114525750816109ff565b8251156114625782518084602001fd5b8160405162461bcd60e51b81526004016103d19190611783565b60006020828403121561148e57600080fd5b81356001600160e01b0319811681146109ff57600080fd5b600080602083850312156114b957600080fd5b823567ffffffffffffffff808211156114d157600080fd5b818501915085601f8301126114e557600080fd5b8135818111156114f457600080fd5b8660208260051b850101111561150957600080fd5b60209290920196919550909350505050565b60006020828403121561152d57600080fd5b5035919050565b6001600160a01b03811681146105f057600080fd5b6000806040838503121561155c57600080fd5b82359150602083013561156e81611534565b809150509250929050565b60006020828403121561158b57600080fd5b81356109ff81611534565b602080825282518282018190526000919060409081850190868401855b828110156115eb57815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016115b3565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b60008219821115611621576116216115f8565b500190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600082821015611664576116646115f8565b500390565b6000816000190483118215151615611683576116836115f8565b500290565b6000826116a557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116bc57600080fd5b81516109ff81611534565b6000816116d6576116d66115f8565b506000190190565b60005b838110156116f95781810151838201526020016116e1565b83811115611708576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516117468160178501602088016116de565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516117778160288401602088016116de565b01602801949350505050565b60208152600082518060208401526117a28160408501602087016116de565b601f01601f19169190910160400192915050565b6000602082840312156117c857600080fd5b815180151581146109ff57600080fd5b600082516117ea8184602087016116de565b919091019291505056fea26469706673582212204490a4f60bfeb05a448b563bca0706bcc31ab31625bef3a3c25605bcae1f3dfa64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d7598406000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc
-----Decoded View---------------
Arg [0] : _nftCollection (address): 0xC86664e7d2608f881f796ee8E24FA9d4d7598406
Arg [1] : _rewardsToken (address): 0xf63F99a11e01b7e3B8568316947324f24E83FdDC
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d7598406
Arg [1] : 000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc
Deployed Bytecode Sourcemap
42681:8421:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13746:204;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;13746:204:0;;;;;;;;44800:629;;;;;;:::i;:::-;;:::i;:::-;;15582:131;;;;;;:::i;:::-;15656:7;15683:12;;;:6;:12;;;;;;;;:22;;;15582:131;;;;1448:25:1;;;1436:2;1421:18;15582:131:0;1302:177:1;16023:147:0;;;;;;:::i;:::-;;:::i;17167:218::-;;;;;;:::i;:::-;;:::i;48931:386::-;;;:::i;49594:957::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42862:38::-;;;;;;;;-1:-1:-1;;;;;3253:32:1;;;3235:51;;3223:2;3208:18;42862:38:0;3074:218:1;44407:120:0;;;;;;:::i;:::-;;:::i;44050:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3713:25:1;;;3769:2;3754:18;;3747:34;;;;3797:18;;;3790:34;3855:2;3840:18;;3833:34;3700:3;3685:19;44050:41:0;3482:391:1;14042:147:0;;;;;;:::i;:::-;;:::i;44212:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;44212:48:0;;;44271:128;;;;;;:::i;:::-;;:::i;46372:787::-;;;;;;:::i;:::-;;:::i;13147:49::-;;13192:4;13147:49;;42907:39;;;;;;42819:36;;;;;16463:149;;;;;;:::i;:::-;;:::i;49377:209::-;;;;;;:::i;:::-;;:::i;13746:204::-;13831:4;-1:-1:-1;;;;;;13855:47:0;;-1:-1:-1;;;13855:47:0;;:87;;-1:-1:-1;;;;;;;;;;11114:40:0;;;13906:36;13848:94;13746:204;-1:-1:-1;;13746:204:0:o;44800:629::-;8276:1;8874:7;;:19;8866:63;;;;-1:-1:-1;;;8866:63:0;;4693:2:1;8866:63:0;;;4675:21:1;4732:2;4712:18;;;4705:30;4771:33;4751:18;;;4744:61;4822:18;;8866:63:0;;;;;;;;;8276:1;9007:7;:18;;;44981:10:::1;44973:19:::0;;:7:::1;:19;::::0;;;;:32;:36;44969:177:::1;;45026:15;45044:28;45061:10;45044:16;:28::i;:::-;45095:10;45087:19;::::0;;;:7:::1;:19;::::0;;;;;;:36:::1;:47:::0;;45026:46;;-1:-1:-1;45026:46:0;;45087:36;;:19;:47:::1;::::0;45026:46;;45087:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;;44969:177:0::1;45189:9;45184:102;45204:20:::0;;::::1;45184:102;;;45250:20;45257:9;;45267:1;45257:12;;;;;;;:::i;:::-;;;;;;;45250:6;:20::i;:::-;45226:3;;45184:102;;;-1:-1:-1::0;;45375:10:0::1;45367:19;::::0;;;:7:::1;:19;::::0;;;;45406:15:::1;45367:36;::::0;;::::1;:54:::0;8232:1;9186:22;;-1:-1:-1;44800:629:0:o;16023:147::-;15656:7;15683:12;;;:6;:12;;;;;;;;:22;;13638:16;13649:4;13638:10;:16::i;:::-;16137:25:::1;16148:4;16154:7;16137:10;:25::i;:::-;16023:147:::0;;;:::o;17167:218::-;-1:-1:-1;;;;;17263:23:0;;3289:10;17263:23;17255:83;;;;-1:-1:-1;;;17255:83:0;;5450:2:1;17255:83:0;;;5432:21:1;5489:2;5469:18;;;5462:30;5528:34;5508:18;;;5501:62;-1:-1:-1;;;5579:18:1;;;5572:45;5634:19;;17255:83:0;5248:411:1;17255:83:0;17351:26;17363:4;17369:7;17351:11;:26::i;:::-;17167:218;;:::o;48931:386::-;49045:10;48975:15;49037:19;;;:7;:19;;;;;;;:36;;48975:15;;48993:28;;:16;:28::i;:::-;:80;;;;:::i;:::-;48975:98;;49102:1;49092:7;:11;49084:52;;;;-1:-1:-1;;;49084:52:0;;5866:2:1;49084:52:0;;;5848:21:1;5905:2;5885:18;;;5878:30;5944;5924:18;;;5917:58;5992:18;;49084:52:0;5664:352:1;49084:52:0;49155:10;49147:19;;;;:7;:19;;;;;;;49186:15;49147:36;;;:54;49212:36;:40;49263:46;;:12;-1:-1:-1;;;;;49263:25:0;;49301:7;49263:25;:46::i;:::-;48964:353;48931:386::o;49594:957::-;-1:-1:-1;;;;;49731:14:0;;49761:1;49731:14;;;:7;:14;;;;;:27;49655:20;;49731:31;49727:817;;-1:-1:-1;;;;;49964:14:0;;49909:34;49964:14;;;:7;:14;;;;;:27;49946:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49946:46:0;;;;;;;;;;;;;;;;;49909:83;;50011:14;50055:9;50050:306;-1:-1:-1;;;;;50074:14:0;;;;;;:7;:14;;;;;:27;;:34;50070:38;;50050:306;;;-1:-1:-1;;;;;50142:14:0;;50192:1;50142:14;;;:7;:14;;;;;:27;;:30;;50170:1;;50142:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;-1:-1:-1;;;;;50142:37:0;:53;50138:199;;-1:-1:-1;;;;;50248:14:0;;;;;;:7;:14;;;;;:27;;:30;;50276:1;;50248:30;;;;;;:::i;:::-;;;;;;;;;;50224:54;;;;;;;;50248:30;;;;;;;50224:54;;-1:-1:-1;;;;;50224:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:13;;50238:6;;50224:21;;;;;;:::i;:::-;;;;;;;;;;:54;50305:8;;;;;50138:199;50110:3;;50050:306;;;-1:-1:-1;50383:13:0;;49594:957;-1:-1:-1;;;49594:957:0:o;49727:817::-;50512:20;;;50530:1;50512:20;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50512:20:0;;;;;;;;;;;;;;;;-1:-1:-1;50505:27:0;49594:957;-1:-1:-1;;49594:957:0:o;44407:120::-;13192:4;13638:16;13192:4;13638:10;:16::i;:::-;-1:-1:-1;44495:14:0::1;:24:::0;44407:120::o;14042:147::-;14128:4;14152:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14152:29:0;;;;;;;;;;;;;;;14042:147::o;44271:128::-;13192:4;13638:16;13192:4;13638:10;:16::i;:::-;-1:-1:-1;44364:18:0::1;:27:::0;44271:128::o;46372:787::-;8276:1;8874:7;;:19;8866:63;;;;-1:-1:-1;;;8866:63:0;;4693:2:1;8866:63:0;;;4675:21:1;4732:2;4712:18;;;4705:30;4771:33;4751:18;;;4744:61;4822:18;;8866:63:0;4491:355:1;8866:63:0;8276:1;9007:7;:18;;;46564:10:::1;46556:19:::0;;:7:::1;:19;::::0;;;;:32;46534:111:::1;;;::::0;-1:-1:-1;;;46534:111:0;;6355:2:1;46534:111:0::1;::::0;::::1;6337:21:1::0;6394:2;6374:18;;;6367:30;6433:27;6413:18;;;6406:55;6478:18;;46534:111:0::1;6153:349:1::0;46534:111:0::1;46765:15;46783:28;46800:10;46783:16;:28::i;:::-;46830:10;46822:19;::::0;;;:7:::1;:19;::::0;;;;;;:36:::1;:47:::0;;46765:46;;-1:-1:-1;46765:46:0;;46822:36;;:19;:47:::1;::::0;46765:46;;46822:47:::1;:::i;:::-;::::0;;;-1:-1:-1;46912:9:0::1;::::0;-1:-1:-1;46907:105:0::1;46927:20:::0;;::::1;46907:105;;;46973:23;46983:9;;46993:1;46983:12;;;;;;;:::i;:::-;;;;;;;46973:9;:23::i;:::-;46949:3;;46907:105;;;-1:-1:-1::0;;47105:10:0::1;47097:19;::::0;;;:7:::1;:19;::::0;;;;47136:15:::1;47097:36;::::0;;::::1;:54:::0;8232:1;9186:22;;-1:-1:-1;;46372:787:0:o;16463:149::-;15656:7;15683:12;;;:6;:12;;;;;;;;:22;;13638:16;13649:4;13638:10;:16::i;:::-;16578:26:::1;16590:4;16596:7;16578:11;:26::i;49377:209::-:0;-1:-1:-1;;;;;49520:16:0;;49441:7;49520:16;;;:7;:16;;;;;;;:33;;49441:7;;49479:25;49528:7;49479:16;:25::i;:::-;:74;;;;:::i;:::-;49461:92;49377:209;-1:-1:-1;;;49377:209:0:o;50799:300::-;51068:14;;-1:-1:-1;;;;;51024:16:0;;50892;51024;;;:7;:16;;;;;:29;;50970:33;;;;;50892:16;;51086:4;;51068:14;;51024:29;50952:51;;:15;:51;:::i;:::-;50951:102;;;;:::i;:::-;50935:147;;;;:::i;:::-;50934:156;;;;:::i;45437:927::-;45573:31;;-1:-1:-1;;;45573:31:0;;;;;1448:25:1;;;45608:10:0;;-1:-1:-1;;;;;45573:13:0;:21;;;;1421:18:1;;45573:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45573:45:0;;45551:120;;;;-1:-1:-1;;;45551:120:0;;7490:2:1;45551:120:0;;;7472:21:1;7529:2;7509:18;;;7502:30;-1:-1:-1;;;7548:18:1;;;7541:55;7613:18;;45551:120:0;7288:349:1;45551:120:0;45786:63;;-1:-1:-1;;;45786:63:0;;45813:10;45786:63;;;7882:34:1;45833:4:0;7932:18:1;;;7925:43;7984:18;;;7977:34;;;45786:13:0;-1:-1:-1;;;;;45786:26:0;;;;7817:18:1;;45786:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;45934:50:0;;;;;;;;45946:10;45934:50;;;;;;;;;;45968:15;45934:50;;;;;;45901:30;46057:19;;;:7;:19;;;;;:32;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46057:50:0;;;;-1:-1:-1;;;;;;46057:50:0;;;;;;;;;;;;;;;;;;;;;;46184:34;;;;;;;;46309:23;;;:13;:23;;;;;;:36;;;;;;;;;-1:-1:-1;;45437:927:0:o;14493:105::-;14560:30;14571:4;3289:10;14560;:30::i;18764:238::-;18848:22;18856:4;18862:7;18848;:22::i;:::-;18843:152;;18887:12;;;;18919:4;18887:12;;;;;;;;-1:-1:-1;;;;;18887:29:0;;;;;;;;;;:36;;-1:-1:-1;;18887:36:0;;;;;;;18943:40;;3289:10;;18887:12;;18943:40;;18887:12;18943:40;18764:238;;:::o;19182:239::-;19266:22;19274:4;19280:7;19266;:22::i;:::-;19262:152;;;19337:5;19305:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19305:29:0;;;;;;;;;;:37;;-1:-1:-1;;19305:37:0;;;19362:40;3289:10;;19305:12;;19362:40;;19337:5;19362:40;19182:239;;:::o;38813:211::-;38957:58;;;-1:-1:-1;;;;;8214:32:1;;38957:58:0;;;8196:51:1;8263:18;;;;8256:34;;;38957:58:0;;;;;;;;;;8169:18:1;;;;38957:58:0;;;;;;;;-1:-1:-1;;;;;38957:58:0;-1:-1:-1;;;38957:58:0;;;38930:86;;38950:5;;38930:19;:86::i;47412:1336::-;47543:23;;;;:13;:23;;;;;;-1:-1:-1;;;;;47543:23:0;47570:10;47543:37;47535:75;;;;-1:-1:-1;;;47535:75:0;;7490:2:1;47535:75:0;;;7472:21:1;7529:2;7509:18;;;7502:30;-1:-1:-1;;;7548:18:1;;;7541:55;7613:18;;47535:75:0;7288:349:1;47535:75:0;47691:13;47749:9;47744:245;47776:10;47768:19;;;;:7;:19;;;;;:32;;:39;47764:43;;47744:245;;;47845:10;47837:19;;;;:7;:19;;;;;:32;;:35;;47884:8;;47837:32;47870:1;;47837:35;;;;;;:::i;:::-;;;;;;;;;;;:43;;;:55;47833:141;;47925:1;47917:9;;47949:5;;47833:141;47809:3;;47744:245;;;;48111:15;48078:18;;48099:7;48078:28;;;;:::i;:::-;48028:10;48020:19;;;;:7;:19;;;;;:32;;:39;;48053:5;;48020:39;;;;;;:::i;:::-;;;;;;;;;;;:54;;;:87;;;;:::i;:::-;:106;;48012:178;;;;-1:-1:-1;;;48012:178:0;;8503:2:1;48012:178:0;;;8485:21:1;8542:2;8522:18;;;8515:30;8581:34;8561:18;;;8554:62;8652:29;8632:18;;;8625:57;8699:19;;48012:178:0;8301:423:1;48012:178:0;48293:10;48342:1;48285:19;;;:7;:19;;;;;:32;;:39;;48318:5;;48285:39;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:59;;-1:-1:-1;;;;;;48285:59:0;-1:-1:-1;;;;;48285:59:0;;;;;;;;;;;48421:10;48413:19;;:7;:19;;;;;;:34;;;;;;:::i;:::-;;;;-1:-1:-1;;48608:1:0;48574:23;;;:13;:23;;;;;;;:36;;-1:-1:-1;;;;;;48574:36:0;;;48677:63;-1:-1:-1;;;48677:63:0;;48712:4;48677:63;;;7882:34:1;48719:10:0;7932:18:1;;;7925:43;7984:18;;;7977:34;;;-1:-1:-1;;;;;48677:13:0;:26;;;;7817:18:1;;48677:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47458:1290;47412:1336;:::o;14888:505::-;14977:22;14985:4;14991:7;14977;:22::i;:::-;14972:414;;15165:41;15193:7;-1:-1:-1;;;;;15165:41:0;15203:2;15165:19;:41::i;:::-;15279:38;15307:4;15314:2;15279:19;:38::i;:::-;15070:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15070:270:0;;;;;;;;;;-1:-1:-1;;;15016:358:0;;;;;;;:::i;41880:716::-;42304:23;42330:69;42358:4;42330:69;;;;;;;;;;;;;;;;;42338:5;-1:-1:-1;;;;;42330:27:0;;;:69;;;;;:::i;:::-;42414:17;;42304:95;;-1:-1:-1;42414:21:0;42410:179;;42511:10;42500:30;;;;;;;;;;;;:::i;:::-;42492:85;;;;-1:-1:-1;;;42492:85:0;;10796:2:1;42492:85:0;;;10778:21:1;10835:2;10815:18;;;10808:30;10874:34;10854:18;;;10847:62;-1:-1:-1;;;10925:18:1;;;10918:40;10975:19;;42492:85:0;10594:406:1;1764:451:0;1839:13;1865:19;1897:10;1901:6;1897:1;:10;:::i;:::-;:14;;1910:1;1897:14;:::i;:::-;1887:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1887:25:0;;1865:47;;-1:-1:-1;;;1923:6:0;1930:1;1923:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1923:15:0;;;;;;;;;-1:-1:-1;;;1949:6:0;1956:1;1949:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1949:15:0;;;;;;;;-1:-1:-1;1980:9:0;1992:10;1996:6;1992:1;:10;:::i;:::-;:14;;2005:1;1992:14;:::i;:::-;1980:26;;1975:135;2012:1;2008;:5;1975:135;;;-1:-1:-1;;;2060:5:0;2068:3;2060:11;2047:25;;;;;;;:::i;:::-;;;;2035:6;2042:1;2035:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;2035:37:0;;;;;;;;-1:-1:-1;2097:1:0;2087:11;;;;;2015:3;;;:::i;:::-;;;1975:135;;;-1:-1:-1;2128:10:0;;2120:55;;;;-1:-1:-1;;;2120:55:0;;11207:2:1;2120:55:0;;;11189:21:1;;;11226:18;;;11219:30;11285:34;11265:18;;;11258:62;11337:18;;2120:55:0;11005:356:1;28280:229:0;28417:12;28449:52;28471:6;28479:4;28485:1;28488:12;28449:21;:52::i;:::-;28442:59;28280:229;-1:-1:-1;;;;28280:229:0:o;29400:510::-;29570:12;29628:5;29603:21;:30;;29595:81;;;;-1:-1:-1;;;29595:81:0;;11568:2:1;29595:81:0;;;11550:21:1;11607:2;11587:18;;;11580:30;11646:34;11626:18;;;11619:62;-1:-1:-1;;;11697:18:1;;;11690:36;11743:19;;29595:81:0;11366:402:1;29595:81:0;-1:-1:-1;;;;;25830:19:0;;;29687:60;;;;-1:-1:-1;;;29687:60:0;;11975:2:1;29687:60:0;;;11957:21:1;12014:2;11994:18;;;11987:30;12053:31;12033:18;;;12026:59;12102:18;;29687:60:0;11773:353:1;29687:60:0;29761:12;29775:23;29802:6;-1:-1:-1;;;;;29802:11:0;29821:5;29828:4;29802:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29760:73;;;;29851:51;29868:7;29877:10;29889:12;29851:16;:51::i;:::-;29844:58;29400:510;-1:-1:-1;;;;;;;29400:510:0:o;32086:762::-;32236:12;32265:7;32261:580;;;-1:-1:-1;32296:10:0;32289:17;;32261:580;32410:17;;:21;32406:424;;32658:10;32652:17;32719:15;32706:10;32702:2;32698:19;32691:44;32406:424;32801:12;32794:20;;-1:-1:-1;;;32794:20:0;;;;;;;;:::i;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;497:615;583:6;591;644:2;632:9;623:7;619:23;615:32;612:52;;;660:1;657;650:12;612:52;700:9;687:23;729:18;770:2;762:6;759:14;756:34;;;786:1;783;776:12;756:34;824:6;813:9;809:22;799:32;;869:7;862:4;858:2;854:13;850:27;840:55;;891:1;888;881:12;840:55;931:2;918:16;957:2;949:6;946:14;943:34;;;973:1;970;963:12;943:34;1026:7;1021:2;1011:6;1008:1;1004:14;1000:2;996:23;992:32;989:45;986:65;;;1047:1;1044;1037:12;986:65;1078:2;1070:11;;;;;1100:6;;-1:-1:-1;497:615:1;;-1:-1:-1;;;;497:615:1:o;1117:180::-;1176:6;1229:2;1217:9;1208:7;1204:23;1200:32;1197:52;;;1245:1;1242;1235:12;1197:52;-1:-1:-1;1268:23:1;;1117:180;-1:-1:-1;1117:180:1:o;1484:131::-;-1:-1:-1;;;;;1559:31:1;;1549:42;;1539:70;;1605:1;1602;1595:12;1620:315;1688:6;1696;1749:2;1737:9;1728:7;1724:23;1720:32;1717:52;;;1765:1;1762;1755:12;1717:52;1801:9;1788:23;1778:33;;1861:2;1850:9;1846:18;1833:32;1874:31;1899:5;1874:31;:::i;:::-;1924:5;1914:15;;;1620:315;;;;;:::o;1940:247::-;1999:6;2052:2;2040:9;2031:7;2027:23;2023:32;2020:52;;;2068:1;2065;2058:12;2020:52;2107:9;2094:23;2126:31;2151:5;2126:31;:::i;2192:877::-;2421:2;2473:21;;;2543:13;;2446:18;;;2565:22;;;2392:4;;2421:2;2606;;2624:18;;;;2665:15;;;2392:4;2708:335;2722:6;2719:1;2716:13;2708:335;;;2781:13;;2823:9;;-1:-1:-1;;;;;2819:35:1;2807:48;;2895:11;;;2889:18;2875:12;;;2868:40;2948:11;;2942:18;2928:12;;;2921:40;2990:4;2981:14;;;;3018:15;;;;2851:1;2737:9;2708:335;;;-1:-1:-1;3060:3:1;;2192:877;-1:-1:-1;;;;;;;2192:877:1:o;4851:127::-;4912:10;4907:3;4903:20;4900:1;4893:31;4943:4;4940:1;4933:15;4967:4;4964:1;4957:15;4983:128;5023:3;5054:1;5050:6;5047:1;5044:13;5041:39;;;5060:18;;:::i;:::-;-1:-1:-1;5096:9:1;;4983:128::o;5116:127::-;5177:10;5172:3;5168:20;5165:1;5158:31;5208:4;5205:1;5198:15;5232:4;5229:1;5222:15;6021:127;6082:10;6077:3;6073:20;6070:1;6063:31;6113:4;6110:1;6103:15;6137:4;6134:1;6127:15;6507:125;6547:4;6575:1;6572;6569:8;6566:34;;;6580:18;;:::i;:::-;-1:-1:-1;6617:9:1;;6507:125::o;6637:168::-;6677:7;6743:1;6739;6735:6;6731:14;6728:1;6725:21;6720:1;6713:9;6706:17;6702:45;6699:71;;;6750:18;;:::i;:::-;-1:-1:-1;6790:9:1;;6637:168::o;6810:217::-;6850:1;6876;6866:132;;6920:10;6915:3;6911:20;6908:1;6901:31;6955:4;6952:1;6945:15;6983:4;6980:1;6973:15;6866:132;-1:-1:-1;7012:9:1;;6810:217::o;7032:251::-;7102:6;7155:2;7143:9;7134:7;7130:23;7126:32;7123:52;;;7171:1;7168;7161:12;7123:52;7203:9;7197:16;7222:31;7247:5;7222:31;:::i;8729:136::-;8768:3;8796:5;8786:39;;8805:18;;:::i;:::-;-1:-1:-1;;;8841:18:1;;8729:136::o;8870:258::-;8942:1;8952:113;8966:6;8963:1;8960:13;8952:113;;;9042:11;;;9036:18;9023:11;;;9016:39;8988:2;8981:10;8952:113;;;9083:6;9080:1;9077:13;9074:48;;;9118:1;9109:6;9104:3;9100:16;9093:27;9074:48;;8870:258;;;:::o;9133:786::-;9544:25;9539:3;9532:38;9514:3;9599:6;9593:13;9615:62;9670:6;9665:2;9660:3;9656:12;9649:4;9641:6;9637:17;9615:62;:::i;:::-;-1:-1:-1;;;9736:2:1;9696:16;;;9728:11;;;9721:40;9786:13;;9808:63;9786:13;9857:2;9849:11;;9842:4;9830:17;;9808:63;:::i;:::-;9891:17;9910:2;9887:26;;9133:786;-1:-1:-1;;;;9133:786:1:o;9924:383::-;10073:2;10062:9;10055:21;10036:4;10105:6;10099:13;10148:6;10143:2;10132:9;10128:18;10121:34;10164:66;10223:6;10218:2;10207:9;10203:18;10198:2;10190:6;10186:15;10164:66;:::i;:::-;10291:2;10270:15;-1:-1:-1;;10266:29:1;10251:45;;;;10298:2;10247:54;;9924:383;-1:-1:-1;;9924:383:1:o;10312:277::-;10379:6;10432:2;10420:9;10411:7;10407:23;10403:32;10400:52;;;10448:1;10445;10438:12;10400:52;10480:9;10474:16;10533:5;10526:13;10519:21;10512:5;10509:32;10499:60;;10555:1;10552;10545:12;12131:274;12260:3;12298:6;12292:13;12314:53;12360:6;12355:3;12348:4;12340:6;12336:17;12314:53;:::i;:::-;12383:16;;;;;12131:274;-1:-1:-1;;12131:274:1:o
Swarm Source
ipfs://4490a4f60bfeb05a448b563bca0706bcc31ab31625bef3a3c25605bcae1f3dfa
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.