Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 533 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase Packs | 13734158 | 1148 days ago | IN | 0.207 ETH | 0.00431846 | ||||
Purchase Packs | 13734136 | 1148 days ago | IN | 0.234 ETH | 0.00748024 | ||||
Purchase Packs | 13734121 | 1148 days ago | IN | 0.207 ETH | 0.00512235 | ||||
Purchase Packs | 13734116 | 1148 days ago | IN | 0.314 ETH | 0.00746193 | ||||
Purchase Packs | 13734112 | 1148 days ago | IN | 0.207 ETH | 0.00565622 | ||||
Purchase Packs | 13734106 | 1148 days ago | IN | 0.414 ETH | 0.00686429 | ||||
Purchase Packs | 13734029 | 1148 days ago | IN | 0.969 ETH | 0.01695593 | ||||
Purchase Packs | 13733907 | 1148 days ago | IN | 0.207 ETH | 0.00653312 | ||||
Purchase Packs | 13733864 | 1148 days ago | IN | 0.341 ETH | 0.01176923 | ||||
Purchase Packs | 13733858 | 1148 days ago | IN | 0.341 ETH | 0.01051505 | ||||
Purchase Packs | 13733838 | 1148 days ago | IN | 0.207 ETH | 0.00615917 | ||||
Purchase Packs | 13733825 | 1148 days ago | IN | 0.414 ETH | 0.00990323 | ||||
Purchase Packs | 13733789 | 1148 days ago | IN | 0.261 ETH | 0.00929552 | ||||
Purchase Packs | 13733770 | 1148 days ago | IN | 0.395 ETH | 0.01346688 | ||||
Purchase Packs | 13733760 | 1148 days ago | IN | 0.054 ETH | 0.00764653 | ||||
Purchase Packs | 13733744 | 1148 days ago | IN | 0.682 ETH | 0.01268605 | ||||
Purchase Packs | 13733691 | 1148 days ago | IN | 0.207 ETH | 0.00464596 | ||||
Purchase Packs | 13733659 | 1148 days ago | IN | 0.207 ETH | 0.00395639 | ||||
Purchase Packs | 13733641 | 1148 days ago | IN | 0.207 ETH | 0.00565073 | ||||
Purchase Packs | 13733603 | 1148 days ago | IN | 0.135 ETH | 0.01300142 | ||||
Purchase Packs | 13733596 | 1148 days ago | IN | 0.682 ETH | 0.01150138 | ||||
Purchase Packs | 13733523 | 1148 days ago | IN | 0.735 ETH | 0.01382406 | ||||
Purchase Packs | 13733519 | 1148 days ago | IN | 0.342 ETH | 0.01592182 | ||||
Purchase Packs | 13733508 | 1148 days ago | IN | 0.207 ETH | 0.00593667 | ||||
Purchase Packs | 13733506 | 1148 days ago | IN | 0.207 ETH | 0.00621871 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Purchasing
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-30 */ // Sources flattened with hardhat v2.6.8 https://hardhat.org // File @openzeppelin/contracts/access/[email protected] // SPDX-License-Identifier: MIT 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/utils/[email protected] 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/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } } // File @openzeppelin/contracts/utils/introspection/[email protected] 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/[email protected] 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/[email protected] 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, _msgSender()); _; } /** * @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 override returns (bool) { return _roles[role].members[account]; } /** * @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 { 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 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. */ 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. */ 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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ 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. * * [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}. * ==== */ 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); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/utils/cryptography/[email protected] pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File contracts/purchasing.sol pragma solidity ^0.8.0; contract Purchasing is AccessControl { bytes32 public constant SIGNER_ROLE = keccak256("SIGNER_ROLE"); mapping (uint256 => address) packOwners; constructor() { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(SIGNER_ROLE, _msgSender()); } event PaymentSuccess(address account, uint256[] packIds, uint256 amountPaid); function purchasePacks(uint256[] calldata packIds, uint blockNum, uint256 amount, address account, bytes calldata signature) external payable { require(block.number <= blockNum, "Signature expired"); require(_verify(_hash(packIds, blockNum, amount, account), signature), "Invalid signature"); require(msg.value == amount, "Incorrect ether sent"); // Store addresses of pack purchaser to prevent re-purchase with same signature for (uint i=0; i<packIds.length; i++){ require(packOwners[packIds[i]] == address(0x0) , "Pack has been purchased!"); packOwners[packIds[i]] = account; } emit PaymentSuccess(account, packIds, msg.value); } // Check/Withdraw contract balance functions function getBalance() external view onlyRole(DEFAULT_ADMIN_ROLE) returns (uint256) { return address(this).balance; } function withdraw() external onlyRole(DEFAULT_ADMIN_ROLE) { payable(msg.sender).transfer(address(this).balance); } // Signature and reservation functions function _hash(uint256[] calldata packIds, uint blockNum, uint256 amount, address account) public pure returns (bytes32) { return ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(packIds, blockNum, amount, account))); } function _verify(bytes32 digest, bytes calldata signature) internal view returns (bool) { // Ensures that the resulting address recovered has a SIGNER_ROLE function return hasRole(SIGNER_ROLE, ECDSA.recover(digest, signature)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"packIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"amountPaid","type":"uint256"}],"name":"PaymentSuccess","type":"event"},{"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":[],"name":"SIGNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"packIds","type":"uint256[]"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"_hash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"uint256[]","name":"packIds","type":"uint256[]"},{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"purchasePacks","outputs":[],"stateMutability":"payable","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":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061001c60003361004b565b6100467fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f703361004b565b6100f7565b6100558282610059565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610055576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556100b33390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6111a7806101066000396000f3fe6080604052600436106100a75760003560e01c80636bf1e9e2116100645780636bf1e9e21461018b57806391d14854146101ab578063a1ebf35d146101cb578063a217fddf146101ff578063bbd2b99014610214578063d547741f1461022757600080fd5b806301ffc9a7146100ac57806312065fe0146100e1578063248a9ca3146101045780632f2ff15d1461013457806336568abe146101565780633ccfd60b14610176575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004610d38565b610247565b60405190151581526020015b60405180910390f35b3480156100ed57600080fd5b506100f661027e565b6040519081526020016100d8565b34801561011057600080fd5b506100f661011f366004610d62565b60009081526020819052604090206001015490565b34801561014057600080fd5b5061015461014f366004610d97565b610292565b005b34801561016257600080fd5b50610154610171366004610d97565b6102bd565b34801561018257600080fd5b50610154610340565b34801561019757600080fd5b506100f66101a6366004610e08565b610378565b3480156101b757600080fd5b506100cc6101c6366004610d97565b610400565b3480156101d757600080fd5b506100f67fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b34801561020b57600080fd5b506100f6600081565b610154610222366004610e6f565b610429565b34801561023357600080fd5b50610154610242366004610d97565b610646565b60006001600160e01b03198216637965db0b60e01b148061027857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008061028b813361066c565b4791505090565b6000828152602081905260409020600101546102ae813361066c565b6102b883836106d0565b505050565b6001600160a01b03811633146103325760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033c8282610754565b5050565b600061034c813361066c565b60405133904780156108fc02916000818181858888f1935050505015801561033c573d6000803e3d6000fd5b60006103f68686868686604051602001610396959493929190610f33565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b9695505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b8443111561046d5760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610329565b61048461047d8888888888610378565b83836107b9565b6104c45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610329565b83341461050a5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a195c881cd95b9d60621b6044820152606401610329565b60005b868110156105ff5760006001818a8a8581811061052c5761052c610f81565b60209081029290920135835250810191909152604001600020546001600160a01b03161461059c5760405162461bcd60e51b815260206004820152601860248201527f5061636b20686173206265656e207075726368617365642100000000000000006044820152606401610329565b83600160008a8a858181106105b3576105b3610f81565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806105f790610fad565b91505061050d565b507f280a5c84275346fdc80844f117561f3d65ebf50756ef1f78d18d04808b109a88838888346040516106359493929190610fc8565b60405180910390a150505050505050565b600082815260208190526040902060010154610662813361066c565b6102b88383610754565b6106768282610400565b61033c5761068e816001600160a01b03166014610827565b610699836020610827565b6040516020016106aa92919061104f565b60408051601f198184030181529082905262461bcd60e51b8252610329916004016110c4565b6106da8282610400565b61033c576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61075e8282610400565b1561033c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061081f7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706101c68686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109ca92505050565b949350505050565b606060006108368360026110f7565b610841906002611116565b67ffffffffffffffff8111156108595761085961112e565b6040519080825280601f01601f191660200182016040528015610883576020820181803683370190505b509050600360fc1b8160008151811061089e5761089e610f81565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106108cd576108cd610f81565b60200101906001600160f81b031916908160001a90535060006108f18460026110f7565b6108fc906001611116565b90505b6001811115610974576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061093057610930610f81565b1a60f81b82828151811061094657610946610f81565b60200101906001600160f81b031916908160001a90535060049490941c9361096d81611144565b90506108ff565b5083156109c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610329565b9392505050565b60008060006109d985856109ee565b915091506109e681610a5e565b509392505050565b600080825160411415610a255760208301516040840151606085015160001a610a1987828585610c1c565b94509450505050610a57565b825160401415610a4f5760208301516040840151610a44868383610d09565b935093505050610a57565b506000905060025b9250929050565b6000816004811115610a7257610a7261115b565b1415610a7b5750565b6001816004811115610a8f57610a8f61115b565b1415610add5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610329565b6002816004811115610af157610af161115b565b1415610b3f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610329565b6003816004811115610b5357610b5361115b565b1415610bac5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610329565b6004816004811115610bc057610bc061115b565b1415610c195760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610329565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610c535750600090506003610d00565b8460ff16601b14158015610c6b57508460ff16601c14155b15610c7c5750600090506004610d00565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610cd0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cf957600060019250925050610d00565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01610d2a87828885610c1c565b935093505050935093915050565b600060208284031215610d4a57600080fd5b81356001600160e01b0319811681146109c357600080fd5b600060208284031215610d7457600080fd5b5035919050565b80356001600160a01b0381168114610d9257600080fd5b919050565b60008060408385031215610daa57600080fd5b82359150610dba60208401610d7b565b90509250929050565b60008083601f840112610dd557600080fd5b50813567ffffffffffffffff811115610ded57600080fd5b6020830191508360208260051b8501011115610a5757600080fd5b600080600080600060808688031215610e2057600080fd5b853567ffffffffffffffff811115610e3757600080fd5b610e4388828901610dc3565b9096509450506020860135925060408601359150610e6360608701610d7b565b90509295509295909350565b600080600080600080600060a0888a031215610e8a57600080fd5b873567ffffffffffffffff80821115610ea257600080fd5b610eae8b838c01610dc3565b909950975060208a0135965060408a01359550879150610ed060608b01610d7b565b945060808a0135915080821115610ee657600080fd5b818a0191508a601f830112610efa57600080fd5b813581811115610f0957600080fd5b8b6020828501011115610f1b57600080fd5b60208301945080935050505092959891949750929550565b60006001600160fb1b03861115610f4957600080fd5b8560051b808884379190910193845250602083019190915260601b6bffffffffffffffffffffffff1916604082015260540192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610fc157610fc1610f97565b5060010190565b6001600160a01b0385168152606060208201819052810183905260006001600160fb1b03841115610ff857600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b60005b8381101561103a578181015183820152602001611022565b83811115611049576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161108781601785016020880161101f565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110b881602884016020880161101f565b01602801949350505050565b60208152600082518060208401526110e381604085016020870161101f565b601f01601f19169190910160400192915050565b600081600019048311821515161561111157611111610f97565b500290565b6000821982111561112957611129610f97565b500190565b634e487b7160e01b600052604160045260246000fd5b60008161115357611153610f97565b506000190190565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220f92bb19fbd4cb05d6b6f3d3fb6201e604b027b71cfe19748a62934374714ca5664736f6c63430008090033
Deployed Bytecode
0x6080604052600436106100a75760003560e01c80636bf1e9e2116100645780636bf1e9e21461018b57806391d14854146101ab578063a1ebf35d146101cb578063a217fddf146101ff578063bbd2b99014610214578063d547741f1461022757600080fd5b806301ffc9a7146100ac57806312065fe0146100e1578063248a9ca3146101045780632f2ff15d1461013457806336568abe146101565780633ccfd60b14610176575b600080fd5b3480156100b857600080fd5b506100cc6100c7366004610d38565b610247565b60405190151581526020015b60405180910390f35b3480156100ed57600080fd5b506100f661027e565b6040519081526020016100d8565b34801561011057600080fd5b506100f661011f366004610d62565b60009081526020819052604090206001015490565b34801561014057600080fd5b5061015461014f366004610d97565b610292565b005b34801561016257600080fd5b50610154610171366004610d97565b6102bd565b34801561018257600080fd5b50610154610340565b34801561019757600080fd5b506100f66101a6366004610e08565b610378565b3480156101b757600080fd5b506100cc6101c6366004610d97565b610400565b3480156101d757600080fd5b506100f67fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f7081565b34801561020b57600080fd5b506100f6600081565b610154610222366004610e6f565b610429565b34801561023357600080fd5b50610154610242366004610d97565b610646565b60006001600160e01b03198216637965db0b60e01b148061027857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008061028b813361066c565b4791505090565b6000828152602081905260409020600101546102ae813361066c565b6102b883836106d0565b505050565b6001600160a01b03811633146103325760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b61033c8282610754565b5050565b600061034c813361066c565b60405133904780156108fc02916000818181858888f1935050505015801561033c573d6000803e3d6000fd5b60006103f68686868686604051602001610396959493929190610f33565b60408051601f1981840301815282825280516020918201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000084830152603c8085019190915282518085039091018152605c909301909152815191012090565b9695505050505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b8443111561046d5760405162461bcd60e51b815260206004820152601160248201527014da59db985d1d5c9948195e1c1a5c9959607a1b6044820152606401610329565b61048461047d8888888888610378565b83836107b9565b6104c45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610329565b83341461050a5760405162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd08195d1a195c881cd95b9d60621b6044820152606401610329565b60005b868110156105ff5760006001818a8a8581811061052c5761052c610f81565b60209081029290920135835250810191909152604001600020546001600160a01b03161461059c5760405162461bcd60e51b815260206004820152601860248201527f5061636b20686173206265656e207075726368617365642100000000000000006044820152606401610329565b83600160008a8a858181106105b3576105b3610f81565b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080806105f790610fad565b91505061050d565b507f280a5c84275346fdc80844f117561f3d65ebf50756ef1f78d18d04808b109a88838888346040516106359493929190610fc8565b60405180910390a150505050505050565b600082815260208190526040902060010154610662813361066c565b6102b88383610754565b6106768282610400565b61033c5761068e816001600160a01b03166014610827565b610699836020610827565b6040516020016106aa92919061104f565b60408051601f198184030181529082905262461bcd60e51b8252610329916004016110c4565b6106da8282610400565b61033c576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556107103390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61075e8282610400565b1561033c576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600061081f7fe2f4eaae4a9751e85a3e4a7b9587827a877f29914755229b07a7b2da98285f706101c68686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506109ca92505050565b949350505050565b606060006108368360026110f7565b610841906002611116565b67ffffffffffffffff8111156108595761085961112e565b6040519080825280601f01601f191660200182016040528015610883576020820181803683370190505b509050600360fc1b8160008151811061089e5761089e610f81565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106108cd576108cd610f81565b60200101906001600160f81b031916908160001a90535060006108f18460026110f7565b6108fc906001611116565b90505b6001811115610974576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061093057610930610f81565b1a60f81b82828151811061094657610946610f81565b60200101906001600160f81b031916908160001a90535060049490941c9361096d81611144565b90506108ff565b5083156109c35760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610329565b9392505050565b60008060006109d985856109ee565b915091506109e681610a5e565b509392505050565b600080825160411415610a255760208301516040840151606085015160001a610a1987828585610c1c565b94509450505050610a57565b825160401415610a4f5760208301516040840151610a44868383610d09565b935093505050610a57565b506000905060025b9250929050565b6000816004811115610a7257610a7261115b565b1415610a7b5750565b6001816004811115610a8f57610a8f61115b565b1415610add5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610329565b6002816004811115610af157610af161115b565b1415610b3f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610329565b6003816004811115610b5357610b5361115b565b1415610bac5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610329565b6004816004811115610bc057610bc061115b565b1415610c195760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610329565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610c535750600090506003610d00565b8460ff16601b14158015610c6b57508460ff16601c14155b15610c7c5750600090506004610d00565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610cd0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cf957600060019250925050610d00565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01610d2a87828885610c1c565b935093505050935093915050565b600060208284031215610d4a57600080fd5b81356001600160e01b0319811681146109c357600080fd5b600060208284031215610d7457600080fd5b5035919050565b80356001600160a01b0381168114610d9257600080fd5b919050565b60008060408385031215610daa57600080fd5b82359150610dba60208401610d7b565b90509250929050565b60008083601f840112610dd557600080fd5b50813567ffffffffffffffff811115610ded57600080fd5b6020830191508360208260051b8501011115610a5757600080fd5b600080600080600060808688031215610e2057600080fd5b853567ffffffffffffffff811115610e3757600080fd5b610e4388828901610dc3565b9096509450506020860135925060408601359150610e6360608701610d7b565b90509295509295909350565b600080600080600080600060a0888a031215610e8a57600080fd5b873567ffffffffffffffff80821115610ea257600080fd5b610eae8b838c01610dc3565b909950975060208a0135965060408a01359550879150610ed060608b01610d7b565b945060808a0135915080821115610ee657600080fd5b818a0191508a601f830112610efa57600080fd5b813581811115610f0957600080fd5b8b6020828501011115610f1b57600080fd5b60208301945080935050505092959891949750929550565b60006001600160fb1b03861115610f4957600080fd5b8560051b808884379190910193845250602083019190915260601b6bffffffffffffffffffffffff1916604082015260540192915050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415610fc157610fc1610f97565b5060010190565b6001600160a01b0385168152606060208201819052810183905260006001600160fb1b03841115610ff857600080fd5b8360051b808660808501376000908301608001908152604090920192909252949350505050565b60005b8381101561103a578181015183820152602001611022565b83811115611049576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161108781601785016020880161101f565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516110b881602884016020880161101f565b01602801949350505050565b60208152600082518060208401526110e381604085016020870161101f565b601f01601f19169190910160400192915050565b600081600019048311821515161561111157611111610f97565b500290565b6000821982111561112957611129610f97565b500190565b634e487b7160e01b600052604160045260246000fd5b60008161115357611153610f97565b506000190190565b634e487b7160e01b600052602160045260246000fdfea2646970667358221220f92bb19fbd4cb05d6b6f3d3fb6201e604b027b71cfe19748a62934374714ca5664736f6c63430008090033
Deployed Bytecode Sourcemap
24028:1957:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10331:204;;;;;;;;;;-1:-1:-1;10331:204:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;10331:204:0;;;;;;;;25164:126;;;;;;;;;;;;;:::i;:::-;;;643:25:1;;;631:2;616:18;25164:126:0;497:177:1;11742:123:0;;;;;;;;;;-1:-1:-1;11742:123:0;;;;;:::i;:::-;11808:7;11835:12;;;;;;;;;;:22;;;;11742:123;12127:147;;;;;;;;;;-1:-1:-1;12127:147:0;;;;;:::i;:::-;;:::i;:::-;;13175:218;;;;;;;;;;-1:-1:-1;13175:218:0;;;;;:::i;:::-;;:::i;25296:122::-;;;;;;;;;;;;;:::i;25466:248::-;;;;;;;;;;-1:-1:-1;25466:248:0;;;;;:::i;:::-;;:::i;10627:139::-;;;;;;;;;;-1:-1:-1;10627:139:0;;;;;:::i;:::-;;:::i;24070:62::-;;;;;;;;;;;;24108:24;24070:62;;9718:49;;;;;;;;;;-1:-1:-1;9718:49:0;9763:4;9718:49;;24387:723;;;;;;:::i;:::-;;:::i;12519:149::-;;;;;;;;;;-1:-1:-1;12519:149:0;;;;;:::i;:::-;;:::i;10331:204::-;10416:4;-1:-1:-1;;;;;;10440:47:0;;-1:-1:-1;;;10440:47:0;;:87;;-1:-1:-1;;;;;;;;;;7759:40:0;;;10491:36;10433:94;10331:204;-1:-1:-1;;10331:204:0:o;25164:126::-;25238:7;;10209:30;25238:7;3789:10;10209;:30::i;:::-;25263:21:::1;25256:28;;25164:126:::0;;:::o;12127:147::-;11808:7;11835:12;;;;;;;;;;:22;;;10209:30;10220:4;3789:10;10209;:30::i;:::-;12241:25:::1;12252:4;12258:7;12241:10;:25::i;:::-;12127:147:::0;;;:::o;13175:218::-;-1:-1:-1;;;;;13271:23:0;;3789:10;13271:23;13263:83;;;;-1:-1:-1;;;13263:83:0;;3833:2:1;13263:83:0;;;3815:21:1;3872:2;3852:18;;;3845:30;3911:34;3891:18;;;3884:62;-1:-1:-1;;;3962:18:1;;;3955:45;4017:19;;13263:83:0;;;;;;;;;13359:26;13371:4;13377:7;13359:11;:26::i;:::-;13175:218;;:::o;25296:122::-;9763:4;10209:30;9763:4;3789:10;10209;:30::i;:::-;25361:51:::1;::::0;25369:10:::1;::::0;25390:21:::1;25361:51:::0;::::1;;;::::0;::::1;::::0;;;25390:21;25369:10;25361:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;25466:248:::0;25583:7;25615:93;25671:7;;25680:8;25690:6;25698:7;25654:52;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25654:52:0;;;;;;;;;25644:63;;25654:52;25644:63;;;;8834:66:1;23343:58:0;;;8822:79:1;8917:12;;;;8910:28;;;;23343:58:0;;;;;;;;;;8954:12:1;;;;23343:58:0;;;23333:69;;;;;;23141:269;25615:93;25608:100;25466:248;-1:-1:-1;;;;;;25466:248:0:o;10627:139::-;10705:4;10729:12;;;;;;;;;;;-1:-1:-1;;;;;10729:29:0;;;;;;;;;;;;;;;10627:139::o;24387:723::-;24564:8;24548:12;:24;;24540:54;;;;-1:-1:-1;;;24540:54:0;;4893:2:1;24540:54:0;;;4875:21:1;4932:2;4912:18;;;4905:30;-1:-1:-1;;;4951:18:1;;;4944:47;5008:18;;24540:54:0;4691:341:1;24540:54:0;24613:61;24621:41;24627:7;;24636:8;24646:6;24654:7;24621:5;:41::i;:::-;24664:9;;24613:7;:61::i;:::-;24605:91;;;;-1:-1:-1;;;24605:91:0;;5239:2:1;24605:91:0;;;5221:21:1;5278:2;5258:18;;;5251:30;-1:-1:-1;;;5297:18:1;;;5290:47;5354:18;;24605:91:0;5037:341:1;24605:91:0;24728:6;24715:9;:19;24707:52;;;;-1:-1:-1;;;24707:52:0;;5585:2:1;24707:52:0;;;5567:21:1;5624:2;5604:18;;;5597:30;-1:-1:-1;;;5643:18:1;;;5636:50;5703:18;;24707:52:0;5383:344:1;24707:52:0;24866:6;24861:183;24876:16;;;24861:183;;;24953:3;24919:10;24953:3;24930:7;;24938:1;24930:10;;;;;;;:::i;:::-;;;;;;;;;;24919:22;;-1:-1:-1;24919:22:0;;;;;;;;-1:-1:-1;24919:22:0;;-1:-1:-1;;;;;24919:22:0;:38;24911:76;;;;-1:-1:-1;;;24911:76:0;;6066:2:1;24911:76:0;;;6048:21:1;6105:2;6085:18;;;6078:30;6144:26;6124:18;;;6117:54;6188:18;;24911:76:0;5864:348:1;24911:76:0;25025:7;25000:10;:22;25011:7;;25019:1;25011:10;;;;;;;:::i;:::-;;;;;;;25000:22;;;;;;;;;;;;:32;;;;;-1:-1:-1;;;;;25000:32:0;;;;;-1:-1:-1;;;;;25000:32:0;;;;;;24894:3;;;;;:::i;:::-;;;;24861:183;;;;25061:43;25076:7;25085;;25094:9;25061:43;;;;;;;;;:::i;:::-;;;;;;;;24387:723;;;;;;;:::o;12519:149::-;11808:7;11835:12;;;;;;;;;;:22;;;10209:30;10220:4;3789:10;10209;:30::i;:::-;12634:26:::1;12646:4;12652:7;12634:11;:26::i;11056:497::-:0;11137:22;11145:4;11151:7;11137;:22::i;:::-;11132:414;;11325:41;11353:7;-1:-1:-1;;;;;11325:41:0;11363:2;11325:19;:41::i;:::-;11439:38;11467:4;11474:2;11439:19;:38::i;:::-;11230:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11230:270:0;;;;;;;;;;-1:-1:-1;;;11176:358:0;;;;;;;:::i;14479:229::-;14554:22;14562:4;14568:7;14554;:22::i;:::-;14549:152;;14593:6;:12;;;;;;;;;;;-1:-1:-1;;;;;14593:29:0;;;;;;;;;:36;;-1:-1:-1;;14593:36:0;14625:4;14593:36;;;14676:12;3789:10;;3709:98;14676:12;-1:-1:-1;;;;;14649:40:0;14667:7;-1:-1:-1;;;;;14649:40:0;14661:4;14649:40;;;;;;;;;;14479:229;;:::o;14716:230::-;14791:22;14799:4;14805:7;14791;:22::i;:::-;14787:152;;;14862:5;14830:12;;;;;;;;;;;-1:-1:-1;;;;;14830:29:0;;;;;;;;;;:37;;-1:-1:-1;;14830:37:0;;;14887:40;3789:10;;14830:12;;14887:40;;14862:5;14887:40;14716:230;;:::o;25720:260::-;25807:4;25920:54;24108:24;25941:32;25955:6;25963:9;;25941:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25941:13:0;;-1:-1:-1;;;25941:32:0:i;25920:54::-;25913:61;25720:260;-1:-1:-1;;;;25720:260:0:o;5539:451::-;5614:13;5640:19;5672:10;5676:6;5672:1;:10;:::i;:::-;:14;;5685:1;5672:14;:::i;:::-;5662:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5662:25:0;;5640:47;;-1:-1:-1;;;5698:6:0;5705:1;5698:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5698:15:0;;;;;;;;;-1:-1:-1;;;5724:6:0;5731:1;5724:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5724:15:0;;;;;;;;-1:-1:-1;5755:9:0;5767:10;5771:6;5767:1;:10;:::i;:::-;:14;;5780:1;5767:14;:::i;:::-;5755:26;;5750:135;5787:1;5783;:5;5750:135;;;-1:-1:-1;;;5835:5:0;5843:3;5835:11;5822:25;;;;;;;:::i;:::-;;;;5810:6;5817:1;5810:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;5810:37:0;;;;;;;;-1:-1:-1;5872:1:0;5862:11;;;;;5790:3;;;:::i;:::-;;;5750:135;;;-1:-1:-1;5903:10:0;;5895:55;;;;-1:-1:-1;;;5895:55:0;;9758:2:1;5895:55:0;;;9740:21:1;;;9777:18;;;9770:30;9836:34;9816:18;;;9809:62;9888:18;;5895:55:0;9556:356:1;5895:55:0;5975:6;5539:451;-1:-1:-1;;;5539:451:0:o;19292:231::-;19370:7;19391:17;19410:18;19432:27;19443:4;19449:9;19432:10;:27::i;:::-;19390:69;;;;19470:18;19482:5;19470:11;:18::i;:::-;-1:-1:-1;19506:9:0;19292:231;-1:-1:-1;;;19292:231:0:o;17182:1308::-;17263:7;17272:12;17497:9;:16;17517:2;17497:22;17493:990;;;17793:4;17778:20;;17772:27;17843:4;17828:20;;17822:27;17901:4;17886:20;;17880:27;17536:9;17872:36;17944:25;17955:4;17872:36;17772:27;17822;17944:10;:25::i;:::-;17937:32;;;;;;;;;17493:990;17991:9;:16;18011:2;17991:22;17987:496;;;18266:4;18251:20;;18245:27;18317:4;18302:20;;18296:27;18359:23;18370:4;18245:27;18296;18359:10;:23::i;:::-;18352:30;;;;;;;;17987:496;-1:-1:-1;18431:1:0;;-1:-1:-1;18435:35:0;17987:496;17182:1308;;;;;:::o;15453:643::-;15531:20;15522:5;:29;;;;;;;;:::i;:::-;;15518:571;;;15453:643;:::o;15518:571::-;15629:29;15620:5;:38;;;;;;;;:::i;:::-;;15616:473;;;15675:34;;-1:-1:-1;;;15675:34:0;;10251:2:1;15675:34:0;;;10233:21:1;10290:2;10270:18;;;10263:30;10329:26;10309:18;;;10302:54;10373:18;;15675:34:0;10049:348:1;15616:473:0;15740:35;15731:5;:44;;;;;;;;:::i;:::-;;15727:362;;;15792:41;;-1:-1:-1;;;15792:41:0;;10604:2:1;15792:41:0;;;10586:21:1;10643:2;10623:18;;;10616:30;10682:33;10662:18;;;10655:61;10733:18;;15792:41:0;10402:355:1;15727:362:0;15864:30;15855:5;:39;;;;;;;;:::i;:::-;;15851:238;;;15911:44;;-1:-1:-1;;;15911:44:0;;10964:2:1;15911:44:0;;;10946:21:1;11003:2;10983:18;;;10976:30;11042:34;11022:18;;;11015:62;-1:-1:-1;;;11093:18:1;;;11086:32;11135:19;;15911:44:0;10762:398:1;15851:238:0;15986:30;15977:5;:39;;;;;;;;:::i;:::-;;15973:116;;;16033:44;;-1:-1:-1;;;16033:44:0;;11367:2:1;16033:44:0;;;11349:21:1;11406:2;11386:18;;;11379:30;11445:34;11425:18;;;11418:62;-1:-1:-1;;;11496:18:1;;;11489:32;11538:19;;16033:44:0;11165:398:1;15973:116:0;15453:643;:::o;20791:1632::-;20922:7;;21856:66;21843:79;;21839:163;;;-1:-1:-1;21955:1:0;;-1:-1:-1;21959:30:0;21939:51;;21839:163;22016:1;:7;;22021:2;22016:7;;:18;;;;;22027:1;:7;;22032:2;22027:7;;22016:18;22012:102;;;-1:-1:-1;22067:1:0;;-1:-1:-1;22071:30:0;22051:51;;22012:102;22228:24;;;22211:14;22228:24;;;;;;;;;11795:25:1;;;11868:4;11856:17;;11836:18;;;11829:45;;;;11890:18;;;11883:34;;;11933:18;;;11926:34;;;22228:24:0;;11767:19:1;;22228:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22228:24:0;;-1:-1:-1;;22228:24:0;;;-1:-1:-1;;;;;;;22267:20:0;;22263:103;;22320:1;22324:29;22304:50;;;;;;;22263:103;22386:6;-1:-1:-1;22394:20:0;;-1:-1:-1;20791:1632:0;;;;;;;;:::o;19786:391::-;19900:7;;-1:-1:-1;;;;;20001:75:0;;20103:3;20099:12;;;20113:2;20095:21;20144:25;20155:4;20095:21;20164:1;20001:75;20144:10;:25::i;:::-;20137:32;;;;;;19786:391;;;;;;:::o;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;679:180;738:6;791:2;779:9;770:7;766:23;762:32;759:52;;;807:1;804;797:12;759:52;-1:-1:-1;830:23:1;;679:180;-1:-1:-1;679:180:1:o;1046:173::-;1114:20;;-1:-1:-1;;;;;1163:31:1;;1153:42;;1143:70;;1209:1;1206;1199:12;1143:70;1046:173;;;:::o;1224:254::-;1292:6;1300;1353:2;1341:9;1332:7;1328:23;1324:32;1321:52;;;1369:1;1366;1359:12;1321:52;1405:9;1392:23;1382:33;;1434:38;1468:2;1457:9;1453:18;1434:38;:::i;:::-;1424:48;;1224:254;;;;;:::o;1483:367::-;1546:8;1556:6;1610:3;1603:4;1595:6;1591:17;1587:27;1577:55;;1628:1;1625;1618:12;1577:55;-1:-1:-1;1651:20:1;;1694:18;1683:30;;1680:50;;;1726:1;1723;1716:12;1680:50;1763:4;1755:6;1751:17;1739:29;;1823:3;1816:4;1806:6;1803:1;1799:14;1791:6;1787:27;1783:38;1780:47;1777:67;;;1840:1;1837;1830:12;1855:648;1968:6;1976;1984;1992;2000;2053:3;2041:9;2032:7;2028:23;2024:33;2021:53;;;2070:1;2067;2060:12;2021:53;2110:9;2097:23;2143:18;2135:6;2132:30;2129:50;;;2175:1;2172;2165:12;2129:50;2214:70;2276:7;2267:6;2256:9;2252:22;2214:70;:::i;:::-;2303:8;;-1:-1:-1;2188:96:1;-1:-1:-1;;2385:2:1;2370:18;;2357:32;;-1:-1:-1;2436:2:1;2421:18;;2408:32;;-1:-1:-1;2459:38:1;2493:2;2478:18;;2459:38;:::i;:::-;2449:48;;1855:648;;;;;;;;:::o;2508:1118::-;2641:6;2649;2657;2665;2673;2681;2689;2742:3;2730:9;2721:7;2717:23;2713:33;2710:53;;;2759:1;2756;2749:12;2710:53;2799:9;2786:23;2828:18;2869:2;2861:6;2858:14;2855:34;;;2885:1;2882;2875:12;2855:34;2924:70;2986:7;2977:6;2966:9;2962:22;2924:70;:::i;:::-;3013:8;;-1:-1:-1;2898:96:1;-1:-1:-1;3095:2:1;3080:18;;3067:32;;-1:-1:-1;3146:2:1;3131:18;;3118:32;;-1:-1:-1;2898:96:1;;-1:-1:-1;3169:38:1;3203:2;3188:18;;3169:38;:::i;:::-;3159:48;;3260:3;3249:9;3245:19;3232:33;3216:49;;3290:2;3280:8;3277:16;3274:36;;;3306:1;3303;3296:12;3274:36;3344:8;3333:9;3329:24;3319:34;;3391:7;3384:4;3380:2;3376:13;3372:27;3362:55;;3413:1;3410;3403:12;3362:55;3453:2;3440:16;3479:2;3471:6;3468:14;3465:34;;;3495:1;3492;3485:12;3465:34;3540:7;3535:2;3526:6;3522:2;3518:15;3514:24;3511:37;3508:57;;;3561:1;3558;3551:12;3508:57;3592:2;3588;3584:11;3574:21;;3614:6;3604:16;;;;;2508:1118;;;;;;;;;;:::o;4047:639::-;4302:3;-1:-1:-1;;;;;4323:31:1;;4320:51;;;4367:1;4364;4357:12;4320:51;4401:6;4398:1;4394:14;4443:6;4435;4430:3;4417:33;4469:16;;;;4516:18;;;-1:-1:-1;4558:2:1;4550:11;;4543:27;;;;4607:2;4603:15;-1:-1:-1;;4599:53:1;4594:2;4586:11;;4579:74;4677:2;4669:11;;4047:639;-1:-1:-1;;4047:639:1:o;5732:127::-;5793:10;5788:3;5784:20;5781:1;5774:31;5824:4;5821:1;5814:15;5848:4;5845:1;5838:15;6217:127;6278:10;6273:3;6269:20;6266:1;6259:31;6309:4;6306:1;6299:15;6333:4;6330:1;6323:15;6349:135;6388:3;-1:-1:-1;;6409:17:1;;6406:43;;;6429:18;;:::i;:::-;-1:-1:-1;6476:1:1;6465:13;;6349:135::o;6489:656::-;-1:-1:-1;;;;;6734:32:1;;6716:51;;6803:2;6798;6783:18;;6776:30;;;6822:18;;6815:34;;;-1:-1:-1;;;;;;6861:31:1;;6858:51;;;6905:1;6902;6895:12;6858:51;6939:6;6936:1;6932:14;6997:6;6989;6983:3;6972:9;6968:19;6955:49;7075:1;7027:22;;;7051:3;7023:32;7064:13;;;7127:2;7112:18;;;7105:34;;;;7023:32;6489:656;-1:-1:-1;;;;6489:656:1:o;7150:258::-;7222:1;7232:113;7246:6;7243:1;7240:13;7232:113;;;7322:11;;;7316:18;7303:11;;;7296:39;7268:2;7261:10;7232:113;;;7363:6;7360:1;7357:13;7354:48;;;7398:1;7389:6;7384:3;7380:16;7373:27;7354:48;;7150:258;;;:::o;7413:786::-;7824:25;7819:3;7812:38;7794:3;7879:6;7873:13;7895:62;7950:6;7945:2;7940:3;7936:12;7929:4;7921:6;7917:17;7895:62;:::i;:::-;-1:-1:-1;;;8016:2:1;7976:16;;;8008:11;;;8001:40;8066:13;;8088:63;8066:13;8137:2;8129:11;;8122:4;8110:17;;8088:63;:::i;:::-;8171:17;8190:2;8167:26;;7413:786;-1:-1:-1;;;;7413:786:1:o;8204:383::-;8353:2;8342:9;8335:21;8316:4;8385:6;8379:13;8428:6;8423:2;8412:9;8408:18;8401:34;8444:66;8503:6;8498:2;8487:9;8483:18;8478:2;8470:6;8466:15;8444:66;:::i;:::-;8571:2;8550:15;-1:-1:-1;;8546:29:1;8531:45;;;;8578:2;8527:54;;8204:383;-1:-1:-1;;8204:383:1:o;8977:168::-;9017:7;9083:1;9079;9075:6;9071:14;9068:1;9065:21;9060:1;9053:9;9046:17;9042:45;9039:71;;;9090:18;;:::i;:::-;-1:-1:-1;9130:9:1;;8977:168::o;9150:128::-;9190:3;9221:1;9217:6;9214:1;9211:13;9208:39;;;9227:18;;:::i;:::-;-1:-1:-1;9263:9:1;;9150:128::o;9283:127::-;9344:10;9339:3;9335:20;9332:1;9325:31;9375:4;9372:1;9365:15;9399:4;9396:1;9389:15;9415:136;9454:3;9482:5;9472:39;;9491:18;;:::i;:::-;-1:-1:-1;;;9527:18:1;;9415:136::o;9917:127::-;9978:10;9973:3;9969:20;9966:1;9959:31;10009:4;10006:1;9999:15;10033:4;10030:1;10023:15
Swarm Source
ipfs://f92bb19fbd4cb05d6b6f3d3fb6201e604b027b71cfe19748a62934374714ca56
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.