More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,917 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16842265 | 663 days ago | IN | 0 ETH | 0.00197391 | ||||
Withdraw | 16507704 | 710 days ago | IN | 0 ETH | 0.00183033 | ||||
Withdraw | 16371622 | 729 days ago | IN | 0 ETH | 0.0024785 | ||||
Withdraw | 16342056 | 733 days ago | IN | 0 ETH | 0.00207757 | ||||
Withdraw | 16190523 | 754 days ago | IN | 0 ETH | 0.00150031 | ||||
Withdraw | 15854155 | 801 days ago | IN | 0 ETH | 0.00081571 | ||||
Withdraw | 15778777 | 812 days ago | IN | 0 ETH | 0.00154752 | ||||
Withdraw | 15670178 | 827 days ago | IN | 0 ETH | 0.00177903 | ||||
Withdraw | 15665559 | 828 days ago | IN | 0 ETH | 0.00063355 | ||||
Withdraw | 15646522 | 830 days ago | IN | 0 ETH | 0.00169619 | ||||
Withdraw | 15643788 | 831 days ago | IN | 0 ETH | 0.00110382 | ||||
Withdraw | 15633864 | 832 days ago | IN | 0 ETH | 0.00216031 | ||||
Withdraw | 15617364 | 834 days ago | IN | 0 ETH | 0.00037131 | ||||
Withdraw | 15617025 | 834 days ago | IN | 0 ETH | 0.00040843 | ||||
Withdraw | 15617020 | 834 days ago | IN | 0 ETH | 0.0004831 | ||||
Withdraw | 15617018 | 834 days ago | IN | 0 ETH | 0.00050313 | ||||
Withdraw | 15617010 | 834 days ago | IN | 0 ETH | 0.0005952 | ||||
Withdraw | 15616136 | 835 days ago | IN | 0 ETH | 0.00065185 | ||||
Withdraw | 15613014 | 835 days ago | IN | 0 ETH | 0.00092676 | ||||
Withdraw | 15613013 | 835 days ago | IN | 0 ETH | 0.00100854 | ||||
Withdraw | 15612899 | 835 days ago | IN | 0 ETH | 0.00134862 | ||||
Withdraw | 15612821 | 835 days ago | IN | 0 ETH | 0.00161671 | ||||
Withdraw | 15612011 | 835 days ago | IN | 0 ETH | 0.0007416 | ||||
Withdraw | 15578708 | 840 days ago | IN | 0 ETH | 0.00059602 | ||||
Withdraw | 15578702 | 840 days ago | IN | 0 ETH | 0.00061613 |
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-18 */ // 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; // 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 = 100000000000000; // 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; } // 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 _tokenId) 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; } // 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; // Update the timeOfLastUpdate for the staker 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) 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" ); // Wallet must own the token they are trying to withdraw require(stakerAddress[_tokenId] == msg.sender, "You don't own this token!"); // 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; // 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); // Update the timeOfLastUpdate for the withdrawer stakers[msg.sender].timeOfLastUpdate = block.timestamp; } // 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
[{"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":"_tokenId","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":"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":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260a8600255655af3107a40006003553480156200002057600080fd5b506040516200188c3803806200188c833981016040819052620000439162000110565b600160009081556200005690336200006e565b6001600160a01b0391821660a052166080526200014f565b60008281526001602090815260408083206001600160a01b038516845290915290205460ff16620000f35760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45b5050565b6001600160a01b03811681146200010d57600080fd5b50565b600080604083850312156200012457600080fd5b82516200013181620000f7565b60208401519092506200014481620000f7565b809150509250929050565b60805160a0516116fb62000191600039600081816101dd0152818161069401528181610bad0152610c8c0152600081816102d9015261085101526116fb6000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806391d14854116100a2578063a694fc3a11610071578063a694fc3a146102b8578063c5ab62f3146102cb578063d1af0c7d146102d4578063d547741f146102fb578063f854a27f1461030e57600080fd5b806391d14854146102615780639406704514610274578063951e0e561461029d578063a217fddf146102b057600080fd5b806336568abe116100e957806336568abe1461019d578063372500ab146101b057806363c28db1146101b85780636588103b146101d85780639168ae721461021757600080fd5b806301ffc9a71461011b578063248a9ca3146101435780632e1a7d4d146101755780632f2ff15d1461018a575b600080fd5b61012e6101293660046113c2565b610321565b60405190151581526020015b60405180910390f35b6101676101513660046113ec565b6000908152600160208190526040909120015490565b60405190815260200161013a565b6101886101833660046113ec565b610358565b005b61018861019836600461141a565b61070f565b6101886101ab36600461141a565b61073a565b6101886107b8565b6101cb6101c636600461144a565b610883565b60405161013a9190611467565b6101ff7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013a565b61024661022536600461144a565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161013a565b61012e61026f36600461141a565b610aad565b6101ff6102823660046113ec565b6005602052600090815260409020546001600160a01b031681565b6101886102ab3660046113ec565b610ad8565b610167600081565b6101886102c63660046113ec565b610ae9565b61016760025481565b6101ff7f000000000000000000000000000000000000000000000000000000000000000081565b61018861030936600461141a565b610d8f565b61016761031c36600461144a565b610db5565b60006001600160e01b03198216637965db0b60e01b148061035257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002600054036103af5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260009081553381526004602052604090205461040f5760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b65640000000000000060448201526064016103a6565b6000818152600560205260409020546001600160a01b031633146104715760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103a6565b600061047c33610ded565b336000908152600460205260408120600301805492935083929091906104a39084906114df565b9091555060009050805b33600090815260046020526040902060010154811015610515573360009081526004602052604090206001018054859190839081106104ee576104ee6114f7565b9060005260206000209060030201600101540361050d57809150610515565b6001016104ad565b5042600254610e10610527919061150d565b33600090815260046020526040902060010180548490811061054b5761054b6114f7565b90600052602060002090600302016002015461056791906114df565b11156105db5760405162461bcd60e51b815260206004820152603b60248201527f596f752063616e6e6f74207769746864726177206265666f7265206d696e696d60448201527f756d207374616b696e672074696d65206973207061737365642021000000000060648201526084016103a6565b3360009081526004602052604081206001018054839081106105ff576105ff6114f7565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b0394909416939093179092553381526004909152604081208054916106498361152c565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505033600090815260046020526040812042600290910155600190555050505050565b6000828152600160208190526040909120015461072b81610e41565b6107358383610e4b565b505050565b6001600160a01b03811633146107aa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103a6565b6107b48282610eb6565b5050565b3360008181526004602052604081206003015490916107d690610ded565b6107e091906114df565b9050600081116108325760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d0000000060448201526064016103a6565b33600081815260046020526040812042600282015560030155610880907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169083610f1d565b50565b6001600160a01b03811660009081526004602052604090205460609015610a50576001600160a01b03821660009081526004602052604081205467ffffffffffffffff8111156108d5576108d5611543565b60405190808252806020026020018201604052801561093357816020015b610920604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816108f35790505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610a47576001600160a01b038516600090815260046020526040812060010180548390811061098a5761098a6114f7565b60009182526020909120600390910201546001600160a01b031614610a3f576001600160a01b03851660009081526004602052604090206001018054829081106109d6576109d66114f7565b600091825260209182902060408051606081018252600390930290910180546001600160a01b03168352600181015493830193909352600290920154918101919091528351849084908110610a2d57610a2d6114f7565b60209081029190910101526001909101905b60010161093a565b50909392505050565b6040805160008082526020820190925290610aa6565b610a93604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b815260200190600190039081610a665790505b5092915050565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610ae381610e41565b50600255565b600260005403610b3b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103a6565b600260009081553381526004602052604090205415610b8d576000610b5f33610ded565b33600090815260046020526040812060030180549293508392909190610b869084906114df565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190611559565b6001600160a01b031614610c6a5760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103a6565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610cd857600080fd5b505af1158015610cec573d6000803e3d6000fd5b50506040805160608101825233808252602080830187815242848601818152600085815260048086528882206001808201805480830182559085528885209a516003909102909a0180546001600160a01b039b909b166001600160a01b03199b8c1617815596518782015593516002968701558054840181559b825260058652978120805490971686179096559385529490915290950191909155929092555050565b60008281526001602081905260409091200154610dab81610e41565b6107358383610eb6565b6001600160a01b0381166000908152600460205260408120600301548190610ddc84610ded565b610de691906114df565b9392505050565b6003546001600160a01b038216600090815260046020526040812080546002909101549192610e1092909190610e239042611576565b610e2d919061150d565b610e37919061150d565b610352919061158d565b6108808133610f6f565b610e558282610aad565b6107b45760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610ec08282610aad565b156107b45760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610735908490610fd3565b610f798282610aad565b6107b457610f91816001600160a01b031660146110a5565b610f9c8360206110a5565b604051602001610fad9291906115df565b60408051601f198184030181529082905262461bcd60e51b82526103a691600401611654565b6000611028826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112419092919063ffffffff16565b80519091501561073557808060200190518101906110469190611687565b6107355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103a6565b606060006110b483600261150d565b6110bf9060026114df565b67ffffffffffffffff8111156110d7576110d7611543565b6040519080825280601f01601f191660200182016040528015611101576020820181803683370190505b509050600360fc1b8160008151811061111c5761111c6114f7565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061114b5761114b6114f7565b60200101906001600160f81b031916908160001a905350600061116f84600261150d565b61117a9060016114df565b90505b60018111156111f2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106111ae576111ae6114f7565b1a60f81b8282815181106111c4576111c46114f7565b60200101906001600160f81b031916908160001a90535060049490941c936111eb8161152c565b905061117d565b508315610de65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103a6565b60606112508484600085611258565b949350505050565b6060824710156112b95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103a6565b6001600160a01b0385163b6113105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a6565b600080866001600160a01b0316858760405161132c91906116a9565b60006040518083038185875af1925050503d8060008114611369576040519150601f19603f3d011682016040523d82523d6000602084013e61136e565b606091505b509150915061137e828286611389565b979650505050505050565b60608315611398575081610de6565b8251156113a85782518084602001fd5b8160405162461bcd60e51b81526004016103a69190611654565b6000602082840312156113d457600080fd5b81356001600160e01b031981168114610de657600080fd5b6000602082840312156113fe57600080fd5b5035919050565b6001600160a01b038116811461088057600080fd5b6000806040838503121561142d57600080fd5b82359150602083013561143f81611405565b809150509250929050565b60006020828403121561145c57600080fd5b8135610de681611405565b602080825282518282018190526000919060409081850190868401855b828110156114bc57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101611484565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114f2576114f26114c9565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611527576115276114c9565b500290565b60008161153b5761153b6114c9565b506000190190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561156b57600080fd5b8151610de681611405565b600082821015611588576115886114c9565b500390565b6000826115aa57634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156115ca5781810151838201526020016115b2565b838111156115d9576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516116178160178501602088016115af565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516116488160288401602088016115af565b01602801949350505050565b60208152600082518060208401526116738160408501602087016115af565b601f01601f19169190910160400192915050565b60006020828403121561169957600080fd5b81518015158114610de657600080fd5b600082516116bb8184602087016115af565b919091019291505056fea2646970667358221220b9ddffe5d8249f9752530706be90e5b1bced8a015ffb3e4459a266e242ad261464736f6c634300080e0033000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d7598406000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c806391d14854116100a2578063a694fc3a11610071578063a694fc3a146102b8578063c5ab62f3146102cb578063d1af0c7d146102d4578063d547741f146102fb578063f854a27f1461030e57600080fd5b806391d14854146102615780639406704514610274578063951e0e561461029d578063a217fddf146102b057600080fd5b806336568abe116100e957806336568abe1461019d578063372500ab146101b057806363c28db1146101b85780636588103b146101d85780639168ae721461021757600080fd5b806301ffc9a71461011b578063248a9ca3146101435780632e1a7d4d146101755780632f2ff15d1461018a575b600080fd5b61012e6101293660046113c2565b610321565b60405190151581526020015b60405180910390f35b6101676101513660046113ec565b6000908152600160208190526040909120015490565b60405190815260200161013a565b6101886101833660046113ec565b610358565b005b61018861019836600461141a565b61070f565b6101886101ab36600461141a565b61073a565b6101886107b8565b6101cb6101c636600461144a565b610883565b60405161013a9190611467565b6101ff7f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d759840681565b6040516001600160a01b03909116815260200161013a565b61024661022536600461144a565b60046020526000908152604090208054600282015460039092015490919083565b6040805193845260208401929092529082015260600161013a565b61012e61026f36600461141a565b610aad565b6101ff6102823660046113ec565b6005602052600090815260409020546001600160a01b031681565b6101886102ab3660046113ec565b610ad8565b610167600081565b6101886102c63660046113ec565b610ae9565b61016760025481565b6101ff7f000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc81565b61018861030936600461141a565b610d8f565b61016761031c36600461144a565b610db5565b60006001600160e01b03198216637965db0b60e01b148061035257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002600054036103af5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260009081553381526004602052604090205461040f5760405162461bcd60e51b815260206004820152601960248201527f596f752068617665206e6f20746f6b656e73207374616b65640000000000000060448201526064016103a6565b6000818152600560205260409020546001600160a01b031633146104715760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103a6565b600061047c33610ded565b336000908152600460205260408120600301805492935083929091906104a39084906114df565b9091555060009050805b33600090815260046020526040902060010154811015610515573360009081526004602052604090206001018054859190839081106104ee576104ee6114f7565b9060005260206000209060030201600101540361050d57809150610515565b6001016104ad565b5042600254610e10610527919061150d565b33600090815260046020526040902060010180548490811061054b5761054b6114f7565b90600052602060002090600302016002015461056791906114df565b11156105db5760405162461bcd60e51b815260206004820152603b60248201527f596f752063616e6e6f74207769746864726177206265666f7265206d696e696d60448201527f756d207374616b696e672074696d65206973207061737365642021000000000060648201526084016103a6565b3360009081526004602052604081206001018054839081106105ff576105ff6114f7565b6000918252602080832060039290920290910180546001600160a01b0319166001600160a01b0394909416939093179092553381526004909152604081208054916106498361152c565b90915550506000838152600560205260409081902080546001600160a01b0319169055516323b872dd60e01b8152306004820152336024820152604481018490526001600160a01b037f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d759840616906323b872dd90606401600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b505033600090815260046020526040812042600290910155600190555050505050565b6000828152600160208190526040909120015461072b81610e41565b6107358383610e4b565b505050565b6001600160a01b03811633146107aa5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016103a6565b6107b48282610eb6565b5050565b3360008181526004602052604081206003015490916107d690610ded565b6107e091906114df565b9050600081116108325760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f207265776172647320746f20636c61696d0000000060448201526064016103a6565b33600081815260046020526040812042600282015560030155610880907f000000000000000000000000f63f99a11e01b7e3b8568316947324f24e83fddc6001600160a01b03169083610f1d565b50565b6001600160a01b03811660009081526004602052604090205460609015610a50576001600160a01b03821660009081526004602052604081205467ffffffffffffffff8111156108d5576108d5611543565b60405190808252806020026020018201604052801561093357816020015b610920604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816108f35790505b5090506000805b6001600160a01b038516600090815260046020526040902060010154811015610a47576001600160a01b038516600090815260046020526040812060010180548390811061098a5761098a6114f7565b60009182526020909120600390910201546001600160a01b031614610a3f576001600160a01b03851660009081526004602052604090206001018054829081106109d6576109d66114f7565b600091825260209182902060408051606081018252600390930290910180546001600160a01b03168352600181015493830193909352600290920154918101919091528351849084908110610a2d57610a2d6114f7565b60209081029190910101526001909101905b60010161093a565b50909392505050565b6040805160008082526020820190925290610aa6565b610a93604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b815260200190600190039081610a665790505b5092915050565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000610ae381610e41565b50600255565b600260005403610b3b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016103a6565b600260009081553381526004602052604090205415610b8d576000610b5f33610ded565b33600090815260046020526040812060030180549293508392909190610b869084906114df565b9091555050505b6040516331a9108f60e11b81526004810182905233906001600160a01b037f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d75984061690636352211e90602401602060405180830381865afa158015610bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c189190611559565b6001600160a01b031614610c6a5760405162461bcd60e51b8152602060048201526019602482015278596f7520646f6e2774206f776e207468697320746f6b656e2160381b60448201526064016103a6565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f000000000000000000000000c86664e7d2608f881f796ee8e24fa9d4d75984066001600160a01b0316906323b872dd90606401600060405180830381600087803b158015610cd857600080fd5b505af1158015610cec573d6000803e3d6000fd5b50506040805160608101825233808252602080830187815242848601818152600085815260048086528882206001808201805480830182559085528885209a516003909102909a0180546001600160a01b039b909b166001600160a01b03199b8c1617815596518782015593516002968701558054840181559b825260058652978120805490971686179096559385529490915290950191909155929092555050565b60008281526001602081905260409091200154610dab81610e41565b6107358383610eb6565b6001600160a01b0381166000908152600460205260408120600301548190610ddc84610ded565b610de691906114df565b9392505050565b6003546001600160a01b038216600090815260046020526040812080546002909101549192610e1092909190610e239042611576565b610e2d919061150d565b610e37919061150d565b610352919061158d565b6108808133610f6f565b610e558282610aad565b6107b45760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610ec08282610aad565b156107b45760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610735908490610fd3565b610f798282610aad565b6107b457610f91816001600160a01b031660146110a5565b610f9c8360206110a5565b604051602001610fad9291906115df565b60408051601f198184030181529082905262461bcd60e51b82526103a691600401611654565b6000611028826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166112419092919063ffffffff16565b80519091501561073557808060200190518101906110469190611687565b6107355760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103a6565b606060006110b483600261150d565b6110bf9060026114df565b67ffffffffffffffff8111156110d7576110d7611543565b6040519080825280601f01601f191660200182016040528015611101576020820181803683370190505b509050600360fc1b8160008151811061111c5761111c6114f7565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061114b5761114b6114f7565b60200101906001600160f81b031916908160001a905350600061116f84600261150d565b61117a9060016114df565b90505b60018111156111f2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106111ae576111ae6114f7565b1a60f81b8282815181106111c4576111c46114f7565b60200101906001600160f81b031916908160001a90535060049490941c936111eb8161152c565b905061117d565b508315610de65760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103a6565b60606112508484600085611258565b949350505050565b6060824710156112b95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103a6565b6001600160a01b0385163b6113105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103a6565b600080866001600160a01b0316858760405161132c91906116a9565b60006040518083038185875af1925050503d8060008114611369576040519150601f19603f3d011682016040523d82523d6000602084013e61136e565b606091505b509150915061137e828286611389565b979650505050505050565b60608315611398575081610de6565b8251156113a85782518084602001fd5b8160405162461bcd60e51b81526004016103a69190611654565b6000602082840312156113d457600080fd5b81356001600160e01b031981168114610de657600080fd5b6000602082840312156113fe57600080fd5b5035919050565b6001600160a01b038116811461088057600080fd5b6000806040838503121561142d57600080fd5b82359150602083013561143f81611405565b809150509250929050565b60006020828403121561145c57600080fd5b8135610de681611405565b602080825282518282018190526000919060409081850190868401855b828110156114bc57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101611484565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114f2576114f26114c9565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611527576115276114c9565b500290565b60008161153b5761153b6114c9565b506000190190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561156b57600080fd5b8151610de681611405565b600082821015611588576115886114c9565b500390565b6000826115aa57634e487b7160e01b600052601260045260246000fd5b500490565b60005b838110156115ca5781810151838201526020016115b2565b838111156115d9576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516116178160178501602088016115af565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516116488160288401602088016115af565b01602801949350505050565b60208152600082518060208401526116738160408501602087016115af565b601f01601f19169190910160400192915050565b60006020828403121561169957600080fd5b81518015158114610de657600080fd5b600082516116bb8184602087016115af565b919091019291505056fea2646970667358221220b9ddffe5d8249f9752530706be90e5b1bced8a015ffb3e4459a266e242ad261464736f6c634300080e0033
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
42685:7825:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13750:204;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;13750:204:0;;;;;;;;15586:131;;;;;;:::i;:::-;15660:7;15687:12;;;:6;:12;;;;;;;;:22;;;15586:131;;;;828:25:1;;;816:2;801:18;15586:131:0;682:177:1;46251:1905:0;;;;;;:::i;:::-;;:::i;:::-;;16027:147;;;;;;:::i;:::-;;:::i;17171:218::-;;;;;;:::i;:::-;;:::i;48339:386::-;;;:::i;49002:957::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42866:38::-;;;;;;;;-1:-1:-1;;;;;2818:32:1;;;2800:51;;2788:2;2773:18;42866:38:0;2639:218:1;44020:41:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3064:25:1;;;3120:2;3105:18;;3098:34;;;;3148:18;;;3141:34;3052:2;3037:18;44020:41:0;2862:319:1;14046:147:0;;;;;;:::i;:::-;;:::i;44182:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;44182:48:0;;;44241:128;;;;;;:::i;:::-;;:::i;13151:49::-;;13196:4;13151:49;;44643:1355;;;;;;:::i;:::-;;:::i;42911:39::-;;;;;;42823:36;;;;;16467:149;;;;;;:::i;:::-;;:::i;48785:209::-;;;;;;:::i;:::-;;:::i;13750:204::-;13835:4;-1:-1:-1;;;;;;13859:47:0;;-1:-1:-1;;;13859:47:0;;:87;;-1:-1:-1;;;;;;;;;;11118:40:0;;;13910:36;13852:94;13750:204;-1:-1:-1;;13750:204:0:o;46251:1905::-;8280:1;8878:7;;:19;8870:63;;;;-1:-1:-1;;;8870:63:0;;4001:2:1;8870:63:0;;;3983:21:1;4040:2;4020:18;;;4013:30;4079:33;4059:18;;;4052:61;4130:18;;8870:63:0;;;;;;;;;8280:1;9011:7;:18;;;46430:10:::1;46422:19:::0;;:7:::1;:19;::::0;;;;:32;46400:111:::1;;;::::0;-1:-1:-1;;;46400:111:0;;4361:2:1;46400:111:0::1;::::0;::::1;4343:21:1::0;4400:2;4380:18;;;4373:30;4439:27;4419:18;;;4412:55;4484:18;;46400:111:0::1;4159:349:1::0;46400:111:0::1;46606:23;::::0;;;:13:::1;:23;::::0;;;;;-1:-1:-1;;;;;46606:23:0::1;46633:10;46606:37;46598:75;;;::::0;-1:-1:-1;;;46598:75:0;;4715:2:1;46598:75:0::1;::::0;::::1;4697:21:1::0;4754:2;4734:18;;;4727:30;-1:-1:-1;;;4773:18:1;;;4766:55;4838:18;;46598:75:0::1;4513:349:1::0;46598:75:0::1;46783:15;46801:28;46818:10;46801:16;:28::i;:::-;46848:10;46840:19;::::0;;;:7:::1;:19;::::0;;;;:36:::1;;:47:::0;;46783:46;;-1:-1:-1;46783:46:0;;46840:36;;:19;:47:::1;::::0;46783:46;;46840:47:::1;:::i;:::-;::::0;;;-1:-1:-1;46970:13:0::1;::::0;-1:-1:-1;46970:13:0;47023:245:::1;47055:10;47047:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;:39:::0;47043:43;::::1;47023:245;;;47124:10;47116:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;:35:::0;;47163:8;;47116:32;47149:1;;47116:35;::::1;;;;;:::i;:::-;;;;;;;;;;;:43;;;:55:::0;47112:141:::1;;47204:1;47196:9;;47228:5;;47112:141;47088:3;;47023:245;;;;47390:15;47357:18;;47378:7;47357:28;;;;:::i;:::-;47307:10;47299:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;:39:::0;;47332:5;;47299:39;::::1;;;;;:::i;:::-;;;;;;;;;;;:54;;;:87;;;;:::i;:::-;:106;;47291:178;;;::::0;-1:-1:-1;;;47291:178:0;;5639:2:1;47291:178:0::1;::::0;::::1;5621:21:1::0;5678:2;5658:18;;;5651:30;5717:34;5697:18;;;5690:62;5788:29;5768:18;;;5761:57;5835:19;;47291:178:0::1;5437:423:1::0;47291:178:0::1;47572:10;47621:1;47564:19:::0;;;:7:::1;:19;::::0;;;;:32:::1;;:39:::0;;47597:5;;47564:39;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;:59:::0;;-1:-1:-1;;;;;;47564:59:0::1;-1:-1:-1::0;;;;;47564:59:0;;;::::1;::::0;;;::::1;::::0;;;47700:10:::1;47692:19:::0;;:7:::1;:19:::0;;;;;;:34;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;47887:1:0::1;47853:23:::0;;;:13:::1;:23;::::0;;;;;;:36;;-1:-1:-1;;;;;;47853:36:0::1;::::0;;47956:63;-1:-1:-1;;;47956:63:0;;47991:4:::1;47956:63;::::0;::::1;6246:34:1::0;47998:10:0::1;6296:18:1::0;;;6289:43;6348:18;;;6341:34;;;-1:-1:-1;;;;;47956:13:0::1;:26;::::0;::::1;::::0;6181:18:1;;47956:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48102:10:0::1;48094:19;::::0;;;:7:::1;:19;::::0;;;;48133:15:::1;48094:36;::::0;;::::1;:54:::0;8236:1;9190:22;;-1:-1:-1;;;;;46251:1905:0:o;16027:147::-;15660:7;15687:12;;;:6;:12;;;;;;;;:22;;13642:16;13653:4;13642:10;:16::i;:::-;16141:25:::1;16152:4;16158:7;16141:10;:25::i;:::-;16027:147:::0;;;:::o;17171:218::-;-1:-1:-1;;;;;17267:23:0;;3293:10;17267:23;17259:83;;;;-1:-1:-1;;;17259:83:0;;6588:2:1;17259:83:0;;;6570:21:1;6627:2;6607:18;;;6600:30;6666:34;6646:18;;;6639:62;-1:-1:-1;;;6717:18:1;;;6710:45;6772:19;;17259:83:0;6386:411:1;17259:83:0;17355:26;17367:4;17373:7;17355:11;:26::i;:::-;17171:218;;:::o;48339:386::-;48453:10;48383:15;48445:19;;;:7;:19;;;;;:36;;;48383:15;;48401:28;;:16;:28::i;:::-;:80;;;;:::i;:::-;48383:98;;48510:1;48500:7;:11;48492:52;;;;-1:-1:-1;;;48492:52:0;;7004:2:1;48492:52:0;;;6986:21:1;7043:2;7023:18;;;7016:30;7082;7062:18;;;7055:58;7130:18;;48492:52:0;6802:352:1;48492:52:0;48563:10;48555:19;;;;:7;:19;;;;;48594:15;48555:36;;;:54;48620:36;;:40;48671:46;;:12;-1:-1:-1;;;;;48671:25:0;;48709:7;48671:25;:46::i;:::-;48372:353;48339:386::o;49002:957::-;-1:-1:-1;;;;;49139:14:0;;49169:1;49139:14;;;:7;:14;;;;;:27;49063:20;;49139:31;49135:817;;-1:-1:-1;;;;;49372:14:0;;49317:34;49372:14;;;:7;:14;;;;;:27;49354:46;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49354:46:0;;;;;;;;;;;;;;;;;49317:83;;49419:14;49463:9;49458:306;-1:-1:-1;;;;;49482:14:0;;;;;;:7;:14;;;;;:27;;:34;49478:38;;49458:306;;;-1:-1:-1;;;;;49550:14:0;;49600:1;49550:14;;;:7;:14;;;;;:27;;:30;;49578:1;;49550:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:37;-1:-1:-1;;;;;49550:37:0;:53;49546:199;;-1:-1:-1;;;;;49656:14:0;;;;;;:7;:14;;;;;:27;;:30;;49684:1;;49656:30;;;;;;:::i;:::-;;;;;;;;;;49632:54;;;;;;;;49656:30;;;;;;;49632:54;;-1:-1:-1;;;;;49632:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;:21;;:13;;49646:6;;49632:21;;;;;;:::i;:::-;;;;;;;;;;:54;49713:8;;;;;49546:199;49518:3;;49458:306;;;-1:-1:-1;49791:13:0;;49002:957;-1:-1:-1;;;49002:957:0:o;49135:817::-;49920:20;;;49938:1;49920:20;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49920:20:0;;;;;;;;;;;;;;;;-1:-1:-1;49913:27:0;49002:957;-1:-1:-1;;49002:957:0:o;14046:147::-;14132:4;14156:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;14156:29:0;;;;;;;;;;;;;;;14046:147::o;44241:128::-;13196:4;13642:16;13196:4;13642:10;:16::i;:::-;-1:-1:-1;44334:18:0::1;:27:::0;44241:128::o;44643:1355::-;8280:1;8878:7;;:19;8870:63;;;;-1:-1:-1;;;8870:63:0;;4001:2:1;8870:63:0;;;3983:21:1;4040:2;4020:18;;;4013:30;4079:33;4059:18;;;4052:61;4130:18;;8870:63:0;3799:355:1;8870:63:0;8280:1;9011:7;:18;;;44812:10:::1;44804:19:::0;;:7:::1;:19;::::0;;;;:32;:36;44800:177:::1;;44857:15;44875:28;44892:10;44875:16;:28::i;:::-;44926:10;44918:19;::::0;;;:7:::1;:19;::::0;;;;:36:::1;;:47:::0;;44857:46;;-1:-1:-1;44857:46:0;;44918:36;;:19;:47:::1;::::0;44857:46;;44918:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;;44800:177:0::1;45074:31;::::0;-1:-1:-1;;;45074:31:0;;::::1;::::0;::::1;828:25:1::0;;;45109:10:0::1;::::0;-1:-1:-1;;;;;45074:13:0::1;:21;::::0;::::1;::::0;801:18:1;;45074:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45074:45:0::1;;45052:120;;;::::0;-1:-1:-1;;;45052:120:0;;4715:2:1;45052:120:0::1;::::0;::::1;4697:21:1::0;4754:2;4734:18;;;4727:30;-1:-1:-1;;;4773:18:1;;;4766:55;4838:18;;45052:120:0::1;4513:349:1::0;45052:120:0::1;45287:63;::::0;-1:-1:-1;;;45287:63:0;;45314:10:::1;45287:63;::::0;::::1;6246:34:1::0;45334:4:0::1;6296:18:1::0;;;6289:43;6348:18;;;6341:34;;;45287:13:0::1;-1:-1:-1::0;;;;;45287:26:0::1;::::0;::::1;::::0;6181:18:1;;45287:63:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;45435:50:0::1;::::0;;::::1;::::0;::::1;::::0;;45447:10:::1;45435:50:::0;;;::::1;::::0;;::::1;::::0;;;45469:15:::1;45435:50:::0;;;;;;45402:30:::1;45558:19:::0;;;:7:::1;:19:::0;;;;;;:32:::1;::::0;;::::1;:50:::0;;;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;45558:50:0;;;::::1;-1:-1:-1::0;;;;;;45558:50:0;;::::1;;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;45685:34;;;::::1;::::0;;45810:23;;;:13:::1;:23:::0;;;;;:36;;;;::::1;::::0;::::1;::::0;;;45925:19;;;;;;;:36;;::::1;:54:::0;;;;9190:22;;;;-1:-1:-1;;44643:1355:0:o;16467:149::-;15660:7;15687:12;;;:6;:12;;;;;;;;:22;;13642:16;13653:4;13642:10;:16::i;:::-;16582:26:::1;16594:4;16600:7;16582:11;:26::i;48785:209::-:0;-1:-1:-1;;;;;48928:16:0;;48849:7;48928:16;;;:7;:16;;;;;:33;;;48849:7;;48887:25;48936:7;48887:16;:25::i;:::-;:74;;;;:::i;:::-;48869:92;48785:209;-1:-1:-1;;;48785:209:0:o;50207:300::-;50476:14;;-1:-1:-1;;;;;50432:16:0;;50300;50432;;;:7;:16;;;;;:29;;50378:33;;;;;50300:16;;50494:4;;50476:14;;50432:29;50360:51;;:15;:51;:::i;:::-;50359:102;;;;:::i;:::-;50343:147;;;;:::i;:::-;50342:156;;;;:::i;14497:105::-;14564:30;14575:4;3293:10;14564;:30::i;18768:238::-;18852:22;18860:4;18866:7;18852;:22::i;:::-;18847:152;;18891:12;;;;18923:4;18891:12;;;;;;;;-1:-1:-1;;;;;18891:29:0;;;;;;;;;;:36;;-1:-1:-1;;18891:36:0;;;;;;;18947:40;;3293:10;;18891:12;;18947:40;;18891:12;18947:40;18768:238;;:::o;19186:239::-;19270:22;19278:4;19284:7;19270;:22::i;:::-;19266:152;;;19341:5;19309:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;19309:29:0;;;;;;;;;;:37;;-1:-1:-1;;19309:37:0;;;19366:40;3293:10;;19309:12;;19366:40;;19341:5;19366:40;19186:239;;:::o;38817:211::-;38961:58;;;-1:-1:-1;;;;;8091:32:1;;38961:58:0;;;8073:51:1;8140:18;;;;8133:34;;;38961:58:0;;;;;;;;;;8046:18:1;;;;38961:58:0;;;;;;;;-1:-1:-1;;;;;38961:58:0;-1:-1:-1;;;38961:58:0;;;38934:86;;38954:5;;38934:19;:86::i;14892:505::-;14981:22;14989:4;14995:7;14981;:22::i;:::-;14976:414;;15169:41;15197:7;-1:-1:-1;;;;;15169:41:0;15207:2;15169:19;:41::i;:::-;15283:38;15311:4;15318:2;15283:19;:38::i;:::-;15074:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15074:270:0;;;;;;;;;;-1:-1:-1;;;15020:358:0;;;;;;;:::i;41884:716::-;42308:23;42334:69;42362:4;42334:69;;;;;;;;;;;;;;;;;42342:5;-1:-1:-1;;;;;42334:27:0;;;:69;;;;;:::i;:::-;42418:17;;42308:95;;-1:-1:-1;42418:21:0;42414:179;;42515:10;42504:30;;;;;;;;;;;;:::i;:::-;42496:85;;;;-1:-1:-1;;;42496:85:0;;10104:2:1;42496:85:0;;;10086:21:1;10143:2;10123:18;;;10116:30;10182:34;10162:18;;;10155:62;-1:-1:-1;;;10233:18:1;;;10226:40;10283:19;;42496:85:0;9902:406:1;1768:451:0;1843:13;1869:19;1901:10;1905:6;1901:1;:10;:::i;:::-;:14;;1914:1;1901:14;:::i;:::-;1891:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1891:25:0;;1869:47;;-1:-1:-1;;;1927:6:0;1934:1;1927:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1927:15:0;;;;;;;;;-1:-1:-1;;;1953:6:0;1960:1;1953:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;1953:15:0;;;;;;;;-1:-1:-1;1984:9:0;1996:10;2000:6;1996:1;:10;:::i;:::-;:14;;2009:1;1996:14;:::i;:::-;1984:26;;1979:135;2016:1;2012;:5;1979:135;;;-1:-1:-1;;;2064:5:0;2072:3;2064:11;2051:25;;;;;;;:::i;:::-;;;;2039:6;2046:1;2039:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;2039:37:0;;;;;;;;-1:-1:-1;2101:1:0;2091:11;;;;;2019:3;;;:::i;:::-;;;1979:135;;;-1:-1:-1;2132:10:0;;2124:55;;;;-1:-1:-1;;;2124:55:0;;10515:2:1;2124:55:0;;;10497:21:1;;;10534:18;;;10527:30;10593:34;10573:18;;;10566:62;10645:18;;2124:55:0;10313:356:1;28284:229:0;28421:12;28453:52;28475:6;28483:4;28489:1;28492:12;28453:21;:52::i;:::-;28446:59;28284:229;-1:-1:-1;;;;28284:229:0:o;29404:510::-;29574:12;29632:5;29607:21;:30;;29599:81;;;;-1:-1:-1;;;29599:81:0;;10876:2:1;29599:81:0;;;10858:21:1;10915:2;10895:18;;;10888:30;10954:34;10934:18;;;10927:62;-1:-1:-1;;;11005:18:1;;;10998:36;11051:19;;29599:81:0;10674:402:1;29599:81:0;-1:-1:-1;;;;;25834:19:0;;;29691:60;;;;-1:-1:-1;;;29691:60:0;;11283:2:1;29691:60:0;;;11265:21:1;11322:2;11302:18;;;11295:30;11361:31;11341:18;;;11334:59;11410:18;;29691:60:0;11081:353:1;29691:60:0;29765:12;29779:23;29806:6;-1:-1:-1;;;;;29806:11:0;29825:5;29832:4;29806:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29764:73;;;;29855:51;29872:7;29881:10;29893:12;29855:16;:51::i;:::-;29848:58;29404:510;-1:-1:-1;;;;;;;29404:510:0:o;32090:762::-;32240:12;32269:7;32265:580;;;-1:-1:-1;32300:10:0;32293:17;;32265:580;32414:17;;:21;32410:424;;32662:10;32656:17;32723:15;32710:10;32706:2;32702:19;32695:44;32410:424;32805:12;32798:20;;-1:-1:-1;;;32798: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:180;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;-1:-1:-1;648:23:1;;497:180;-1:-1:-1;497:180:1:o;1049:131::-;-1:-1:-1;;;;;1124:31:1;;1114:42;;1104:70;;1170:1;1167;1160:12;1185:315;1253:6;1261;1314:2;1302:9;1293:7;1289:23;1285:32;1282:52;;;1330:1;1327;1320:12;1282:52;1366:9;1353:23;1343:33;;1426:2;1415:9;1411:18;1398:32;1439:31;1464:5;1439:31;:::i;:::-;1489:5;1479:15;;;1185:315;;;;;:::o;1505:247::-;1564:6;1617:2;1605:9;1596:7;1592:23;1588:32;1585:52;;;1633:1;1630;1623:12;1585:52;1672:9;1659:23;1691:31;1716:5;1691:31;:::i;1757:877::-;1986:2;2038:21;;;2108:13;;2011:18;;;2130:22;;;1957:4;;1986:2;2171;;2189:18;;;;2230:15;;;1957:4;2273:335;2287:6;2284:1;2281:13;2273:335;;;2346:13;;2388:9;;-1:-1:-1;;;;;2384:35:1;2372:48;;2460:11;;;2454:18;2440:12;;;2433:40;2513:11;;2507:18;2493:12;;;2486:40;2555:4;2546:14;;;;2583:15;;;;2416:1;2302:9;2273:335;;;-1:-1:-1;2625:3:1;;1757:877;-1:-1:-1;;;;;;;1757:877:1:o;4867:127::-;4928:10;4923:3;4919:20;4916:1;4909:31;4959:4;4956:1;4949:15;4983:4;4980:1;4973:15;4999:128;5039:3;5070:1;5066:6;5063:1;5060:13;5057:39;;;5076:18;;:::i;:::-;-1:-1:-1;5112:9:1;;4999:128::o;5132:127::-;5193:10;5188:3;5184:20;5181:1;5174:31;5224:4;5221:1;5214:15;5248:4;5245:1;5238:15;5264:168;5304:7;5370:1;5366;5362:6;5358:14;5355:1;5352:21;5347:1;5340:9;5333:17;5329:45;5326:71;;;5377:18;;:::i;:::-;-1:-1:-1;5417:9:1;;5264:168::o;5865:136::-;5904:3;5932:5;5922:39;;5941:18;;:::i;:::-;-1:-1:-1;;;5977:18:1;;5865:136::o;7159:127::-;7220:10;7215:3;7211:20;7208:1;7201:31;7251:4;7248:1;7241:15;7275:4;7272:1;7265:15;7291:251;7361:6;7414:2;7402:9;7393:7;7389:23;7385:32;7382:52;;;7430:1;7427;7420:12;7382:52;7462:9;7456:16;7481:31;7506:5;7481:31;:::i;7547:125::-;7587:4;7615:1;7612;7609:8;7606:34;;;7620:18;;:::i;:::-;-1:-1:-1;7657:9:1;;7547:125::o;7677:217::-;7717:1;7743;7733:132;;7787:10;7782:3;7778:20;7775:1;7768:31;7822:4;7819:1;7812:15;7850:4;7847:1;7840:15;7733:132;-1:-1:-1;7879:9:1;;7677:217::o;8178:258::-;8250:1;8260:113;8274:6;8271:1;8268:13;8260:113;;;8350:11;;;8344:18;8331:11;;;8324:39;8296:2;8289:10;8260:113;;;8391:6;8388:1;8385:13;8382:48;;;8426:1;8417:6;8412:3;8408:16;8401:27;8382:48;;8178:258;;;:::o;8441:786::-;8852:25;8847:3;8840:38;8822:3;8907:6;8901:13;8923:62;8978:6;8973:2;8968:3;8964:12;8957:4;8949:6;8945:17;8923:62;:::i;:::-;-1:-1:-1;;;9044:2:1;9004:16;;;9036:11;;;9029:40;9094:13;;9116:63;9094:13;9165:2;9157:11;;9150:4;9138:17;;9116:63;:::i;:::-;9199:17;9218:2;9195:26;;8441:786;-1:-1:-1;;;;8441:786:1:o;9232:383::-;9381:2;9370:9;9363:21;9344:4;9413:6;9407:13;9456:6;9451:2;9440:9;9436:18;9429:34;9472:66;9531:6;9526:2;9515:9;9511:18;9506:2;9498:6;9494:15;9472:66;:::i;:::-;9599:2;9578:15;-1:-1:-1;;9574:29:1;9559:45;;;;9606:2;9555:54;;9232:383;-1:-1:-1;;9232:383:1:o;9620:277::-;9687:6;9740:2;9728:9;9719:7;9715:23;9711:32;9708:52;;;9756:1;9753;9746:12;9708:52;9788:9;9782:16;9841:5;9834:13;9827:21;9820:5;9817:32;9807:60;;9863:1;9860;9853:12;11439:274;11568:3;11606:6;11600:13;11622:53;11668:6;11663:3;11656:4;11648:6;11644:17;11622:53;:::i;:::-;11691:16;;;;;11439:274;-1:-1:-1;;11439:274:1:o
Swarm Source
ipfs://b9ddffe5d8249f9752530706be90e5b1bced8a015ffb3e4459a266e242ad2614
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.