Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NBACryptoSportsNFT
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at fraxscan.com on 2025-01-22 */ // Sources flattened with hardhat v2.12.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // 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/[email protected] // 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/utils/[email protected] // 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/introspection/[email protected] // 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/[email protected] // 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/[email protected] // 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/utils/[email protected] // 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/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC1155/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File contracts/NBACryptoSportsNFT.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract NBACryptoSportsNFT is ERC1155, AccessControl { using Address for address; // Setting admin role bytes32 public constant RESERVE_ROLE = keccak256("RESERVE_ROLE"); // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.jso string private _uri; string private _baseURI; string public name; string public symbol; address public _adminwallet; bytes32 public merkleRoot; /** * @dev See {_setURI}. */ constructor(string memory uri_, string memory name_, string memory symbol_, address adminwallet_ ) ERC1155(uri_) { name = name_; symbol = symbol_; _adminwallet = adminwallet_; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } /** * @notice edit the merkle root for early access sale * * @param _merkleRoot the new merkle root */ function setMerkleRoot(bytes32 _merkleRoot) public onlyRole(RESERVE_ROLE) { merkleRoot = _merkleRoot; } function batchmint(address account, uint256[] memory tokenid, uint256[] memory amount) external virtual onlyRole(RESERVE_ROLE) { _mintBatch(account, tokenid, amount, ""); } function mint(address account, uint256 tokenid, uint256 amount) external virtual onlyRole(RESERVE_ROLE) { _mint(account, tokenid, amount, ""); } //For testing, clean up// function burn(address from, uint256 tokenid,uint256 amount) external virtual onlyRole(RESERVE_ROLE) { _burn(from, tokenid, amount); } function canTransferTo(address to, bytes32[] calldata merkleProof) public view returns (bool) { bytes32 leaf = keccak256(abi.encode(to)); return (MerkleProof.verify( merkleProof, merkleRoot, leaf )); } function adminTrasfer(address from, address to, uint256 tokenid, uint256 amount, bytes32[] calldata merkleProof) external virtual onlyRole(RESERVE_ROLE) { require(canTransferTo(to, merkleProof), "To address not whitelisted"); _safeTransferFrom(from, to, tokenid, amount, ""); } function _setURI(string memory newuri) internal virtual override(ERC1155) { _uri = newuri; } /** * @notice edit the base uri for the collection * * @param baseURI the new URI */ function setURI(string memory baseURI) external onlyRole(RESERVE_ROLE) { _setURI(baseURI); } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function uri(uint256 tokenId) public view virtual override(ERC1155) returns (string memory) { return string(abi.encodePacked(_uri, _toString(tokenId))); //return _uri; } function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"uri_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"adminwallet_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_adminwallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"adminTrasfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"tokenid","type":"uint256[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"batchmint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"canTransferTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tokenid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620029a0380380620029a083398101604081905262000034916200022e565b83620000408162000091565b5060086200004f848262000389565b5060096200005e838262000389565b50600a80546001600160a01b0319166001600160a01b03831617905562000087600033620000a3565b5050505062000455565b60066200009f828262000389565b5050565b60008281526003602090815260408083206001600160a01b03851684529091529020546200009f908390839060ff166200009f5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff191660011790556200010c3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126200019157600080fd5b81516001600160401b0380821115620001ae57620001ae62000150565b604051601f8301601f19908116603f01168101908282118183101715620001d957620001d962000150565b81604052838152602092508683858801011115620001f657600080fd5b600091505b838210156200021a5785820183015181830184015290820190620001fb565b600093810190920192909252949350505050565b600080600080608085870312156200024557600080fd5b84516001600160401b03808211156200025d57600080fd5b6200026b888389016200017f565b955060208701519150808211156200028257600080fd5b62000290888389016200017f565b94506040870151915080821115620002a757600080fd5b50620002b6878288016200017f565b606087015190935090506001600160a01b0381168114620002d657600080fd5b939692955090935050565b600181811c90821680620002f657607f821691505b60208210810362000330577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156200038457600081815260208120601f850160051c810160208610156200035f5750805b601f850160051c820191505b8181101562000380578281556001016200036b565b5050505b505050565b81516001600160401b03811115620003a557620003a562000150565b620003bd81620003b68454620002e1565b8462000336565b602080601f831160018114620003f55760008415620003dc5750858301515b600019600386901b1c1916600185901b17855562000380565b600085815260208120601f198616915b82811015620004265788860151825594840194600190910190840162000405565b5085821015620004455787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61253b80620004656000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806338ecb05f116100de578063a217fddf11610097578063d863ce1711610071578063d863ce171461035a578063e985e9c514610385578063f242432a146103c1578063f5298aca146103d457600080fd5b8063a217fddf1461032c578063a22cb46514610334578063d547741f1461034757600080fd5b806338ecb05f146102b85780634e1273f4146102cb5780636a96f1af146102eb5780637cb64759146102fe57806391d148541461031157806395d89b411461032457600080fd5b8063191fd57d1161014b5780632eb2c2d6116101255780632eb2c2d6146102765780632eb4a7ab146102895780632f2ff15d1461029257806336568abe146102a557600080fd5b8063191fd57d1461022b578063248a9ca31461024057806324bce81c1461026357600080fd5b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db57806306fdde03146101f05780630e89341c14610205578063156e29f614610218575b600080fd5b6101a56101a03660046117fe565b6103e7565b6040519081526020015b60405180910390f35b6101cb6101c636600461183e565b610480565b60405190151581526020016101af565b6101ee6101e93660046118fa565b61048b565b005b6101f86104b0565b6040516101af919061199a565b6101f86102133660046119ad565b61053e565b6101ee6102263660046119c6565b610572565b6101a56000805160206124e683398151915281565b6101a561024e3660046119ad565b60009081526003602052604090206001015490565b6101ee610271366004611a44565b6105ab565b6101ee610284366004611b6f565b61063f565b6101a5600b5481565b6101ee6102a0366004611c18565b61068b565b6101ee6102b3366004611c18565b6106b5565b6101ee6102c6366004611c44565b61072f565b6102de6102d9366004611cb7565b610762565b6040516101af9190611dbc565b6101cb6102f9366004611dcf565b61088b565b6101ee61030c3660046119ad565b610906565b6101cb61031f366004611c18565b610924565b6101f861094f565b6101a5600081565b6101ee610342366004611e21565b61095c565b6101ee610355366004611c18565b610967565b600a5461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016101af565b6101cb610393366004611e5d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101ee6103cf366004611e87565b61098c565b6101ee6103e23660046119c6565b6109d1565b60006001600160a01b0383166104575760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061047a826109f4565b6000805160206124e68339815191526104a381610a19565b6104ac82610a26565b5050565b600880546104bd90611eeb565b80601f01602080910402602001604051908101604052809291908181526020018280546104e990611eeb565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b505050505081565b6060600661054b83610a32565b60405160200161055c929190611f25565b6040516020818303038152906040529050919050565b6000805160206124e683398151915261058a81610a19565b6105a584848460405180602001604052806000815250610a76565b50505050565b6000805160206124e68339815191526105c381610a19565b6105ce86848461088b565b61061a5760405162461bcd60e51b815260206004820152601a60248201527f546f2061646472657373206e6f742077686974656c6973746564000000000000604482015260640161044e565b6106368787878760405180602001604052806000815250610b47565b50505050505050565b6001600160a01b03851633148061065b575061065b8533610393565b6106775760405162461bcd60e51b815260040161044e90611fac565b6106848585858585610c71565b5050505050565b6000828152600360205260409020600101546106a681610a19565b6106b08383610e0d565b505050565b6001600160a01b03811633146107255760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161044e565b6104ac8282610e93565b6000805160206124e683398151915261074781610a19565b6105a584848460405180602001604052806000815250610efa565b606081518351146107c75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161044e565b600083516001600160401b038111156107e2576107e261185b565b60405190808252806020026020018201604052801561080b578160200160208202803683370190505b50905060005b84518110156108835761085685828151811061082f5761082f611ffb565b602002602001015185838151811061084957610849611ffb565b60200260200101516103e7565b82828151811061086857610868611ffb565b602090810291909101015261087c81612027565b9050610811565b509392505050565b604080516001600160a01b03851660208201526000918291016040516020818303038152906040528051906020012090506108fd84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050611045565b95945050505050565b6000805160206124e683398151915261091e81610a19565b50600b55565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600980546104bd90611eeb565b6104ac33838361105b565b60008281526003602052604090206001015461098281610a19565b6106b08383610e93565b6001600160a01b0385163314806109a857506109a88533610393565b6109c45760405162461bcd60e51b815260040161044e90611fac565b6106848585858585610b47565b6000805160206124e68339815191526109e981610a19565b6105a584848461113b565b60006001600160e01b03198216637965db0b60e01b148061047a575061047a826112b7565b610a238133611307565b50565b60066104ac8282612086565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610a4c5750819003601f19909101908152919050565b6001600160a01b038416610a9c5760405162461bcd60e51b815260040161044e90612145565b336000610aa88561136b565b90506000610ab58561136b565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610ae7908490612186565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610636836000898989896113b6565b6001600160a01b038416610b6d5760405162461bcd60e51b815260040161044e90612199565b336000610b798561136b565b90506000610b868561136b565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015610bc95760405162461bcd60e51b815260040161044e906121de565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610c06908490612186565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c66848a8a8a8a8a6113b6565b505050505050505050565b8151835114610c925760405162461bcd60e51b815260040161044e90612228565b6001600160a01b038416610cb85760405162461bcd60e51b815260040161044e90612199565b3360005b8451811015610d9f576000858281518110610cd957610cd9611ffb565b602002602001015190506000858381518110610cf757610cf7611ffb565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d475760405162461bcd60e51b815260040161044e906121de565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d84908490612186565b9250508190555050505080610d9890612027565b9050610cbc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610def929190612270565b60405180910390a4610e05818787878787611511565b505050505050565b610e178282610924565b6104ac5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610e4f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610e9d8282610924565b156104ac5760008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038416610f205760405162461bcd60e51b815260040161044e90612145565b8151835114610f415760405162461bcd60e51b815260040161044e90612228565b3360005b8451811015610fdd57838181518110610f6057610f60611ffb565b6020026020010151600080878481518110610f7d57610f7d611ffb565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254610fc59190612186565b90915550819050610fd581612027565b915050610f45565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161102e929190612270565b60405180910390a461068481600087878787611511565b60008261105285846115cc565b14949350505050565b816001600160a01b0316836001600160a01b0316036110ce5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161044e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03831661119d5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b606482015260840161044e565b3360006111a98461136b565b905060006111b68461136b565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561123f5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b606482015260840161044e565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610636565b60006001600160e01b03198216636cdb3d1360e11b14806112e857506001600160e01b031982166303a24d0760e21b145b8061047a57506301ffc9a760e01b6001600160e01b031983161461047a565b6113118282610924565b6104ac57611329816001600160a01b03166014611611565b611334836020611611565b604051602001611345929190612295565b60408051601f198184030181529082905262461bcd60e51b825261044e9160040161199a565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106113a5576113a5611ffb565b602090810291909101015292915050565b6001600160a01b0384163b15610e055760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906113fa908990899088908890889060040161230a565b6020604051808303816000875af1925050508015611435575060408051601f3d908101601f191682019092526114329181019061234f565b60015b6114e15761144161236c565b806308c379a00361147a5750611455612388565b80611460575061147c565b8060405162461bcd60e51b815260040161044e919061199a565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161044e565b6001600160e01b0319811663f23a6e6160e01b146106365760405162461bcd60e51b815260040161044e90612411565b6001600160a01b0384163b15610e055760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906115559089908990889088908890600401612459565b6020604051808303816000875af1925050508015611590575060408051601f3d908101601f1916820190925261158d9181019061234f565b60015b61159c5761144161236c565b6001600160e01b0319811663bc197c8160e01b146106365760405162461bcd60e51b815260040161044e90612411565b600081815b8451811015610883576115fd828683815181106115f0576115f0611ffb565b60200260200101516117b3565b91508061160981612027565b9150506115d1565b606060006116208360026124b7565b61162b906002612186565b6001600160401b038111156116425761164261185b565b6040519080825280601f01601f19166020018201604052801561166c576020820181803683370190505b509050600360fc1b8160008151811061168757611687611ffb565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106116b6576116b6611ffb565b60200101906001600160f81b031916908160001a90535060006116da8460026124b7565b6116e5906001612186565b90505b600181111561175d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061171957611719611ffb565b1a60f81b82828151811061172f5761172f611ffb565b60200101906001600160f81b031916908160001a90535060049490941c93611756816124ce565b90506116e8565b5083156117ac5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161044e565b9392505050565b60008183106117cf5760008281526020849052604090206117ac565b60008381526020839052604090206117ac565b80356001600160a01b03811681146117f957600080fd5b919050565b6000806040838503121561181157600080fd5b61181a836117e2565b946020939093013593505050565b6001600160e01b031981168114610a2357600080fd5b60006020828403121561185057600080fd5b81356117ac81611828565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156118965761189661185b565b6040525050565b60006001600160401b038311156118b6576118b661185b565b6040516118cd601f8501601f191660200182611871565b8091508381528484840111156118e257600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561190c57600080fd5b81356001600160401b0381111561192257600080fd5b8201601f8101841361193357600080fd5b6119428482356020840161189d565b949350505050565b60005b8381101561196557818101518382015260200161194d565b50506000910152565b6000815180845261198681602086016020860161194a565b601f01601f19169290920160200192915050565b6020815260006117ac602083018461196e565b6000602082840312156119bf57600080fd5b5035919050565b6000806000606084860312156119db57600080fd5b6119e4846117e2565b95602085013595506040909401359392505050565b60008083601f840112611a0b57600080fd5b5081356001600160401b03811115611a2257600080fd5b6020830191508360208260051b8501011115611a3d57600080fd5b9250929050565b60008060008060008060a08789031215611a5d57600080fd5b611a66876117e2565b9550611a74602088016117e2565b9450604087013593506060870135925060808701356001600160401b03811115611a9d57600080fd5b611aa989828a016119f9565b979a9699509497509295939492505050565b60006001600160401b03821115611ad457611ad461185b565b5060051b60200190565b600082601f830112611aef57600080fd5b81356020611afc82611abb565b604051611b098282611871565b83815260059390931b8501820192828101915086841115611b2957600080fd5b8286015b84811015611b445780358352918301918301611b2d565b509695505050505050565b600082601f830112611b6057600080fd5b6117ac8383356020850161189d565b600080600080600060a08688031215611b8757600080fd5b611b90866117e2565b9450611b9e602087016117e2565b935060408601356001600160401b0380821115611bba57600080fd5b611bc689838a01611ade565b94506060880135915080821115611bdc57600080fd5b611be889838a01611ade565b93506080880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b9150509295509295909350565b60008060408385031215611c2b57600080fd5b82359150611c3b602084016117e2565b90509250929050565b600080600060608486031215611c5957600080fd5b611c62846117e2565b925060208401356001600160401b0380821115611c7e57600080fd5b611c8a87838801611ade565b93506040860135915080821115611ca057600080fd5b50611cad86828701611ade565b9150509250925092565b60008060408385031215611cca57600080fd5b82356001600160401b0380821115611ce157600080fd5b818501915085601f830112611cf557600080fd5b81356020611d0282611abb565b604051611d0f8282611871565b83815260059390931b8501820192828101915089841115611d2f57600080fd5b948201945b83861015611d5457611d45866117e2565b82529482019490820190611d34565b96505086013592505080821115611d6a57600080fd5b50611d7785828601611ade565b9150509250929050565b600081518084526020808501945080840160005b83811015611db157815187529582019590820190600101611d95565b509495945050505050565b6020815260006117ac6020830184611d81565b600080600060408486031215611de457600080fd5b611ded846117e2565b925060208401356001600160401b03811115611e0857600080fd5b611e14868287016119f9565b9497909650939450505050565b60008060408385031215611e3457600080fd5b611e3d836117e2565b915060208301358015158114611e5257600080fd5b809150509250929050565b60008060408385031215611e7057600080fd5b611e79836117e2565b9150611c3b602084016117e2565b600080600080600060a08688031215611e9f57600080fd5b611ea8866117e2565b9450611eb6602087016117e2565b9350604086013592506060860135915060808601356001600160401b03811115611edf57600080fd5b611c0b88828901611b4f565b600181811c90821680611eff57607f821691505b602082108103611f1f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611f3381611eeb565b60018281168015611f4b5760018114611f6057611f8f565b60ff1984168752821515830287019450611f8f565b8860005260208060002060005b85811015611f865781548a820152908401908201611f6d565b50505082870194505b505050508351611fa381836020880161194a565b01949350505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161203957612039612011565b5060010190565b601f8211156106b057600081815260208120601f850160051c810160208610156120675750805b601f850160051c820191505b81811015610e0557828155600101612073565b81516001600160401b0381111561209f5761209f61185b565b6120b3816120ad8454611eeb565b84612040565b602080601f8311600181146120e857600084156120d05750858301515b600019600386901b1c1916600185901b178555610e05565b600085815260208120601f198616915b82811015612117578886015182559484019460019091019084016120f8565b50858210156121355787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8082018082111561047a5761047a612011565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006122836040830185611d81565b82810360208401526108fd8185611d81565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516122cd81601785016020880161194a565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516122fe81602884016020880161194a565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906123449083018461196e565b979650505050505050565b60006020828403121561236157600080fd5b81516117ac81611828565b600060033d11156123855760046000803e5060005160e01c5b90565b600060443d10156123965790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156123c557505050505090565b82850191508151818111156123dd5750505050505090565b843d87010160208285010111156123f75750505050505090565b61240660208286010187611871565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061248590830186611d81565b82810360608401526124978186611d81565b905082810360808401526124ab818561196e565b98975050505050505050565b808202811582820484141761047a5761047a612011565b6000816124dd576124dd612011565b50600019019056febf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ffa2646970667358221220e838ed12b7abb3e6f8c4e30815975a7450a172870fe8abc311f1a68dab4ead8964736f6c63430008110033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000cba2602d63baebbe3050ce8b41c633a22fe9464c000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f6e65772d63727970746f2d6261636b656e642e76657263656c2e6170702f6170692f76312f6e62612f6d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000f43727970746f53706f7274734e42410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543534e4241000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c806338ecb05f116100de578063a217fddf11610097578063d863ce1711610071578063d863ce171461035a578063e985e9c514610385578063f242432a146103c1578063f5298aca146103d457600080fd5b8063a217fddf1461032c578063a22cb46514610334578063d547741f1461034757600080fd5b806338ecb05f146102b85780634e1273f4146102cb5780636a96f1af146102eb5780637cb64759146102fe57806391d148541461031157806395d89b411461032457600080fd5b8063191fd57d1161014b5780632eb2c2d6116101255780632eb2c2d6146102765780632eb4a7ab146102895780632f2ff15d1461029257806336568abe146102a557600080fd5b8063191fd57d1461022b578063248a9ca31461024057806324bce81c1461026357600080fd5b8062fdd58e1461019257806301ffc9a7146101b857806302fe5305146101db57806306fdde03146101f05780630e89341c14610205578063156e29f614610218575b600080fd5b6101a56101a03660046117fe565b6103e7565b6040519081526020015b60405180910390f35b6101cb6101c636600461183e565b610480565b60405190151581526020016101af565b6101ee6101e93660046118fa565b61048b565b005b6101f86104b0565b6040516101af919061199a565b6101f86102133660046119ad565b61053e565b6101ee6102263660046119c6565b610572565b6101a56000805160206124e683398151915281565b6101a561024e3660046119ad565b60009081526003602052604090206001015490565b6101ee610271366004611a44565b6105ab565b6101ee610284366004611b6f565b61063f565b6101a5600b5481565b6101ee6102a0366004611c18565b61068b565b6101ee6102b3366004611c18565b6106b5565b6101ee6102c6366004611c44565b61072f565b6102de6102d9366004611cb7565b610762565b6040516101af9190611dbc565b6101cb6102f9366004611dcf565b61088b565b6101ee61030c3660046119ad565b610906565b6101cb61031f366004611c18565b610924565b6101f861094f565b6101a5600081565b6101ee610342366004611e21565b61095c565b6101ee610355366004611c18565b610967565b600a5461036d906001600160a01b031681565b6040516001600160a01b0390911681526020016101af565b6101cb610393366004611e5d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101ee6103cf366004611e87565b61098c565b6101ee6103e23660046119c6565b6109d1565b60006001600160a01b0383166104575760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b600061047a826109f4565b6000805160206124e68339815191526104a381610a19565b6104ac82610a26565b5050565b600880546104bd90611eeb565b80601f01602080910402602001604051908101604052809291908181526020018280546104e990611eeb565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b505050505081565b6060600661054b83610a32565b60405160200161055c929190611f25565b6040516020818303038152906040529050919050565b6000805160206124e683398151915261058a81610a19565b6105a584848460405180602001604052806000815250610a76565b50505050565b6000805160206124e68339815191526105c381610a19565b6105ce86848461088b565b61061a5760405162461bcd60e51b815260206004820152601a60248201527f546f2061646472657373206e6f742077686974656c6973746564000000000000604482015260640161044e565b6106368787878760405180602001604052806000815250610b47565b50505050505050565b6001600160a01b03851633148061065b575061065b8533610393565b6106775760405162461bcd60e51b815260040161044e90611fac565b6106848585858585610c71565b5050505050565b6000828152600360205260409020600101546106a681610a19565b6106b08383610e0d565b505050565b6001600160a01b03811633146107255760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161044e565b6104ac8282610e93565b6000805160206124e683398151915261074781610a19565b6105a584848460405180602001604052806000815250610efa565b606081518351146107c75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161044e565b600083516001600160401b038111156107e2576107e261185b565b60405190808252806020026020018201604052801561080b578160200160208202803683370190505b50905060005b84518110156108835761085685828151811061082f5761082f611ffb565b602002602001015185838151811061084957610849611ffb565b60200260200101516103e7565b82828151811061086857610868611ffb565b602090810291909101015261087c81612027565b9050610811565b509392505050565b604080516001600160a01b03851660208201526000918291016040516020818303038152906040528051906020012090506108fd84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600b549150849050611045565b95945050505050565b6000805160206124e683398151915261091e81610a19565b50600b55565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600980546104bd90611eeb565b6104ac33838361105b565b60008281526003602052604090206001015461098281610a19565b6106b08383610e93565b6001600160a01b0385163314806109a857506109a88533610393565b6109c45760405162461bcd60e51b815260040161044e90611fac565b6106848585858585610b47565b6000805160206124e68339815191526109e981610a19565b6105a584848461113b565b60006001600160e01b03198216637965db0b60e01b148061047a575061047a826112b7565b610a238133611307565b50565b60066104ac8282612086565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480610a4c5750819003601f19909101908152919050565b6001600160a01b038416610a9c5760405162461bcd60e51b815260040161044e90612145565b336000610aa88561136b565b90506000610ab58561136b565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610ae7908490612186565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610636836000898989896113b6565b6001600160a01b038416610b6d5760405162461bcd60e51b815260040161044e90612199565b336000610b798561136b565b90506000610b868561136b565b90506000868152602081815260408083206001600160a01b038c16845290915290205485811015610bc95760405162461bcd60e51b815260040161044e906121de565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290610c06908490612186565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c66848a8a8a8a8a6113b6565b505050505050505050565b8151835114610c925760405162461bcd60e51b815260040161044e90612228565b6001600160a01b038416610cb85760405162461bcd60e51b815260040161044e90612199565b3360005b8451811015610d9f576000858281518110610cd957610cd9611ffb565b602002602001015190506000858381518110610cf757610cf7611ffb565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610d475760405162461bcd60e51b815260040161044e906121de565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d84908490612186565b9250508190555050505080610d9890612027565b9050610cbc565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610def929190612270565b60405180910390a4610e05818787878787611511565b505050505050565b610e178282610924565b6104ac5760008281526003602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610e4f3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b610e9d8282610924565b156104ac5760008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038416610f205760405162461bcd60e51b815260040161044e90612145565b8151835114610f415760405162461bcd60e51b815260040161044e90612228565b3360005b8451811015610fdd57838181518110610f6057610f60611ffb565b6020026020010151600080878481518110610f7d57610f7d611ffb565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254610fc59190612186565b90915550819050610fd581612027565b915050610f45565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161102e929190612270565b60405180910390a461068481600087878787611511565b60008261105285846115cc565b14949350505050565b816001600160a01b0316836001600160a01b0316036110ce5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161044e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03831661119d5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b606482015260840161044e565b3360006111a98461136b565b905060006111b68461136b565b60408051602080820183526000918290528882528181528282206001600160a01b038b168352905220549091508481101561123f5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b606482015260840161044e565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610636565b60006001600160e01b03198216636cdb3d1360e11b14806112e857506001600160e01b031982166303a24d0760e21b145b8061047a57506301ffc9a760e01b6001600160e01b031983161461047a565b6113118282610924565b6104ac57611329816001600160a01b03166014611611565b611334836020611611565b604051602001611345929190612295565b60408051601f198184030181529082905262461bcd60e51b825261044e9160040161199a565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106113a5576113a5611ffb565b602090810291909101015292915050565b6001600160a01b0384163b15610e055760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906113fa908990899088908890889060040161230a565b6020604051808303816000875af1925050508015611435575060408051601f3d908101601f191682019092526114329181019061234f565b60015b6114e15761144161236c565b806308c379a00361147a5750611455612388565b80611460575061147c565b8060405162461bcd60e51b815260040161044e919061199a565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161044e565b6001600160e01b0319811663f23a6e6160e01b146106365760405162461bcd60e51b815260040161044e90612411565b6001600160a01b0384163b15610e055760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906115559089908990889088908890600401612459565b6020604051808303816000875af1925050508015611590575060408051601f3d908101601f1916820190925261158d9181019061234f565b60015b61159c5761144161236c565b6001600160e01b0319811663bc197c8160e01b146106365760405162461bcd60e51b815260040161044e90612411565b600081815b8451811015610883576115fd828683815181106115f0576115f0611ffb565b60200260200101516117b3565b91508061160981612027565b9150506115d1565b606060006116208360026124b7565b61162b906002612186565b6001600160401b038111156116425761164261185b565b6040519080825280601f01601f19166020018201604052801561166c576020820181803683370190505b509050600360fc1b8160008151811061168757611687611ffb565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106116b6576116b6611ffb565b60200101906001600160f81b031916908160001a90535060006116da8460026124b7565b6116e5906001612186565b90505b600181111561175d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061171957611719611ffb565b1a60f81b82828151811061172f5761172f611ffb565b60200101906001600160f81b031916908160001a90535060049490941c93611756816124ce565b90506116e8565b5083156117ac5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161044e565b9392505050565b60008183106117cf5760008281526020849052604090206117ac565b60008381526020839052604090206117ac565b80356001600160a01b03811681146117f957600080fd5b919050565b6000806040838503121561181157600080fd5b61181a836117e2565b946020939093013593505050565b6001600160e01b031981168114610a2357600080fd5b60006020828403121561185057600080fd5b81356117ac81611828565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b03811182821017156118965761189661185b565b6040525050565b60006001600160401b038311156118b6576118b661185b565b6040516118cd601f8501601f191660200182611871565b8091508381528484840111156118e257600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561190c57600080fd5b81356001600160401b0381111561192257600080fd5b8201601f8101841361193357600080fd5b6119428482356020840161189d565b949350505050565b60005b8381101561196557818101518382015260200161194d565b50506000910152565b6000815180845261198681602086016020860161194a565b601f01601f19169290920160200192915050565b6020815260006117ac602083018461196e565b6000602082840312156119bf57600080fd5b5035919050565b6000806000606084860312156119db57600080fd5b6119e4846117e2565b95602085013595506040909401359392505050565b60008083601f840112611a0b57600080fd5b5081356001600160401b03811115611a2257600080fd5b6020830191508360208260051b8501011115611a3d57600080fd5b9250929050565b60008060008060008060a08789031215611a5d57600080fd5b611a66876117e2565b9550611a74602088016117e2565b9450604087013593506060870135925060808701356001600160401b03811115611a9d57600080fd5b611aa989828a016119f9565b979a9699509497509295939492505050565b60006001600160401b03821115611ad457611ad461185b565b5060051b60200190565b600082601f830112611aef57600080fd5b81356020611afc82611abb565b604051611b098282611871565b83815260059390931b8501820192828101915086841115611b2957600080fd5b8286015b84811015611b445780358352918301918301611b2d565b509695505050505050565b600082601f830112611b6057600080fd5b6117ac8383356020850161189d565b600080600080600060a08688031215611b8757600080fd5b611b90866117e2565b9450611b9e602087016117e2565b935060408601356001600160401b0380821115611bba57600080fd5b611bc689838a01611ade565b94506060880135915080821115611bdc57600080fd5b611be889838a01611ade565b93506080880135915080821115611bfe57600080fd5b50611c0b88828901611b4f565b9150509295509295909350565b60008060408385031215611c2b57600080fd5b82359150611c3b602084016117e2565b90509250929050565b600080600060608486031215611c5957600080fd5b611c62846117e2565b925060208401356001600160401b0380821115611c7e57600080fd5b611c8a87838801611ade565b93506040860135915080821115611ca057600080fd5b50611cad86828701611ade565b9150509250925092565b60008060408385031215611cca57600080fd5b82356001600160401b0380821115611ce157600080fd5b818501915085601f830112611cf557600080fd5b81356020611d0282611abb565b604051611d0f8282611871565b83815260059390931b8501820192828101915089841115611d2f57600080fd5b948201945b83861015611d5457611d45866117e2565b82529482019490820190611d34565b96505086013592505080821115611d6a57600080fd5b50611d7785828601611ade565b9150509250929050565b600081518084526020808501945080840160005b83811015611db157815187529582019590820190600101611d95565b509495945050505050565b6020815260006117ac6020830184611d81565b600080600060408486031215611de457600080fd5b611ded846117e2565b925060208401356001600160401b03811115611e0857600080fd5b611e14868287016119f9565b9497909650939450505050565b60008060408385031215611e3457600080fd5b611e3d836117e2565b915060208301358015158114611e5257600080fd5b809150509250929050565b60008060408385031215611e7057600080fd5b611e79836117e2565b9150611c3b602084016117e2565b600080600080600060a08688031215611e9f57600080fd5b611ea8866117e2565b9450611eb6602087016117e2565b9350604086013592506060860135915060808601356001600160401b03811115611edf57600080fd5b611c0b88828901611b4f565b600181811c90821680611eff57607f821691505b602082108103611f1f57634e487b7160e01b600052602260045260246000fd5b50919050565b6000808454611f3381611eeb565b60018281168015611f4b5760018114611f6057611f8f565b60ff1984168752821515830287019450611f8f565b8860005260208060002060005b85811015611f865781548a820152908401908201611f6d565b50505082870194505b505050508351611fa381836020880161194a565b01949350505050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161203957612039612011565b5060010190565b601f8211156106b057600081815260208120601f850160051c810160208610156120675750805b601f850160051c820191505b81811015610e0557828155600101612073565b81516001600160401b0381111561209f5761209f61185b565b6120b3816120ad8454611eeb565b84612040565b602080601f8311600181146120e857600084156120d05750858301515b600019600386901b1c1916600185901b178555610e05565b600085815260208120601f198616915b82811015612117578886015182559484019460019091019084016120f8565b50858210156121355787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b8082018082111561047a5761047a612011565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006122836040830185611d81565b82810360208401526108fd8185611d81565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516122cd81601785016020880161194a565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516122fe81602884016020880161194a565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906123449083018461196e565b979650505050505050565b60006020828403121561236157600080fd5b81516117ac81611828565b600060033d11156123855760046000803e5060005160e01c5b90565b600060443d10156123965790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156123c557505050505090565b82850191508151818111156123dd5750505050505090565b843d87010160208285010111156123f75750505050505090565b61240660208286010187611871565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a06040820181905260009061248590830186611d81565b82810360608401526124978186611d81565b905082810360808401526124ab818561196e565b98975050505050505050565b808202811582820484141761047a5761047a612011565b6000816124dd576124dd612011565b50600019019056febf575aa07286781f90c1bdc8f4940c6c29874a0c25a1f1fe7661650b409c01ffa2646970667358221220e838ed12b7abb3e6f8c4e30815975a7450a172870fe8abc311f1a68dab4ead8964736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000cba2602d63baebbe3050ce8b41c633a22fe9464c000000000000000000000000000000000000000000000000000000000000003a68747470733a2f2f6e65772d63727970746f2d6261636b656e642e76657263656c2e6170702f6170692f76312f6e62612f6d657461646174612f000000000000000000000000000000000000000000000000000000000000000000000000000f43727970746f53706f7274734e42410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000543534e4241000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri_ (string): https://new-crypto-backend.vercel.app/api/v1/nba/metadata/
Arg [1] : name_ (string): CryptoSportsNBA
Arg [2] : symbol_ (string): CSNBA
Arg [3] : adminwallet_ (address): 0xCbA2602D63bAEbBE3050ce8b41C633a22fe9464c
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000cba2602d63baebbe3050ce8b41c633a22fe9464c
Arg [4] : 000000000000000000000000000000000000000000000000000000000000003a
Arg [5] : 68747470733a2f2f6e65772d63727970746f2d6261636b656e642e7665726365
Arg [6] : 6c2e6170702f6170692f76312f6e62612f6d657461646174612f000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [8] : 43727970746f53706f7274734e42410000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 43534e4241000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
59501:5326:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43602:230;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;43602:230:0;;;;;;;;60676:177;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;60676:177:0;1019:187:1;62524:106:0;;;;;;:::i;:::-;;:::i;:::-;;60123:18;;;:::i;:::-;;;;;;;:::i;62741:192::-;;;;;;:::i;:::-;;:::i;61314:158::-;;;;;;:::i;:::-;;:::i;59625:64::-;;-1:-1:-1;;;;;;;;;;;59625:64:0;;12918:131;;;;;;:::i;:::-;12992:7;13019:12;;;:6;:12;;;;;:22;;;;12918:131;61976:314;;;;;;:::i;:::-;;:::i;45546:439::-;;;;;;:::i;:::-;;:::i;60212:25::-;;;;;;13359:147;;;;;;:::i;:::-;;:::i;14503:218::-;;;;;;:::i;:::-;;:::i;61114:186::-;;;;;;:::i;:::-;;:::i;43998:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61666:302::-;;;;;;:::i;:::-;;:::i;60989:117::-;;;;;;:::i;:::-;;:::i;11378:147::-;;;;;;:::i;:::-;;:::i;60148:20::-;;;:::i;10483:49::-;;10528:4;10483:49;;44595:155;;;;;;:::i;:::-;;:::i;13799:149::-;;;;;;:::i;:::-;;:::i;60178:27::-;;;;;-1:-1:-1;;;;;60178:27:0;;;;;;-1:-1:-1;;;;;11237:32:1;;;11219:51;;11207:2;11192:18;60178:27:0;11073:203:1;44822:168:0;;;;;;:::i;:::-;-1:-1:-1;;;;;44945:27:0;;;44921:4;44945:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;44822:168;45062:407;;;;;;:::i;:::-;;:::i;61511:147::-;;;;;;:::i;:::-;;:::i;43602:230::-;43688:7;-1:-1:-1;;;;;43716:21:0;;43708:76;;;;-1:-1:-1;;;43708:76:0;;12359:2:1;43708:76:0;;;12341:21:1;12398:2;12378:18;;;12371:30;12437:34;12417:18;;;12410:62;-1:-1:-1;;;12488:18:1;;;12481:40;12538:19;;43708:76:0;;;;;;;;;-1:-1:-1;43802:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;43802:22:0;;;;;;;;;;43602:230;;;;;:::o;60676:177::-;60785:4;60809:36;60833:11;60809:23;:36::i;62524:106::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;62606::::1;62614:7;62606;:16::i;:::-;62524:106:::0;;:::o;60123:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62741:192::-;62818:13;62875:4;62881:18;62891:7;62881:9;:18::i;:::-;62858:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62844:57;;62741:192;;;:::o;61314:158::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;61429:35:::1;61435:7;61444;61453:6;61429:35;;;;;;;;;;;::::0;:5:::1;:35::i;:::-;61314:158:::0;;;;:::o;61976:314::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;62148:30:::1;62162:2;62166:11;;62148:13;:30::i;:::-;62140:69;;;::::0;-1:-1:-1;;;62140:69:0;;14306:2:1;62140:69:0::1;::::0;::::1;14288:21:1::0;14345:2;14325:18;;;14318:30;14384:28;14364:18;;;14357:56;14430:18;;62140:69:0::1;14104:350:1::0;62140:69:0::1;62220:48;62238:4;62244:2;62248:7;62257:6;62220:48;;;;;;;;;;;::::0;:17:::1;:48::i;:::-;61976:314:::0;;;;;;;:::o;45546:439::-;-1:-1:-1;;;;;45779:20:0;;861:10;45779:20;;:60;;-1:-1:-1;45803:36:0;45820:4;861:10;44822:168;:::i;45803:36::-;45757:157;;;;-1:-1:-1;;;45757:157:0;;;;;;;:::i;:::-;45925:52;45948:4;45954:2;45958:3;45963:7;45972:4;45925:22;:52::i;:::-;45546:439;;;;;:::o;13359:147::-;12992:7;13019:12;;;:6;:12;;;;;:22;;;10974:16;10985:4;10974:10;:16::i;:::-;13473:25:::1;13484:4;13490:7;13473:10;:25::i;:::-;13359:147:::0;;;:::o;14503:218::-;-1:-1:-1;;;;;14599:23:0;;861:10;14599:23;14591:83;;;;-1:-1:-1;;;14591:83:0;;15077:2:1;14591:83:0;;;15059:21:1;15116:2;15096:18;;;15089:30;15155:34;15135:18;;;15128:62;-1:-1:-1;;;15206:18:1;;;15199:45;15261:19;;14591:83:0;14875:411:1;14591:83:0;14687:26;14699:4;14705:7;14687:11;:26::i;61114:186::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;61252:40:::1;61263:7;61272;61281:6;61252:40;;;;;;;;;;;::::0;:10:::1;:40::i;43998:524::-:0;44154:16;44215:3;:10;44196:8;:15;:29;44188:83;;;;-1:-1:-1;;;44188:83:0;;15493:2:1;44188:83:0;;;15475:21:1;15532:2;15512:18;;;15505:30;15571:34;15551:18;;;15544:62;-1:-1:-1;;;15622:18:1;;;15615:39;15671:19;;44188:83:0;15291:405:1;44188:83:0;44284:30;44331:8;:15;-1:-1:-1;;;;;44317:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44317:30:0;;44284:63;;44365:9;44360:122;44384:8;:15;44380:1;:19;44360:122;;;44440:30;44450:8;44459:1;44450:11;;;;;;;;:::i;:::-;;;;;;;44463:3;44467:1;44463:6;;;;;;;;:::i;:::-;;;;;;;44440:9;:30::i;:::-;44421:13;44435:1;44421:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;44401:3;;;:::i;:::-;;;44360:122;;;-1:-1:-1;44501:13:0;43998:524;-1:-1:-1;;;43998:524:0:o;61666:302::-;61824:14;;;-1:-1:-1;;;;;11237:32:1;;61824:14:0;;;11219:51:1;61781:4:0;;;;11192:18:1;61824:14:0;;;;;;;;;;;;61814:25;;;;;;61799:40;;61856:103;61889:11;;61856:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61915:10:0;;;-1:-1:-1;61940:4:0;;-1:-1:-1;61856:18:0;:103::i;:::-;61848:112;61666:302;-1:-1:-1;;;;;61666:302:0:o;60989:117::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;-1:-1:-1;61074:10:0::1;:24:::0;60989:117::o;11378:147::-;11464:4;11488:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;11488:29:0;;;;;;;;;;;;;;;11378:147::o;60148:20::-;;;;;;;:::i;44595:155::-;44690:52;861:10;44723:8;44733;44690:18;:52::i;13799:149::-;12992:7;13019:12;;;:6;:12;;;;;:22;;;10974:16;10985:4;10974:10;:16::i;:::-;13914:26:::1;13926:4;13932:7;13914:11;:26::i;45062:407::-:0;-1:-1:-1;;;;;45270:20:0;;861:10;45270:20;;:60;;-1:-1:-1;45294:36:0;45311:4;861:10;44822:168;:::i;45294:36::-;45248:157;;;;-1:-1:-1;;;45248:157:0;;;;;;;:::i;:::-;45416:45;45434:4;45440:2;45444;45448:6;45456:4;45416:17;:45::i;61511:147::-;-1:-1:-1;;;;;;;;;;;10974:16:0;10985:4;10974:10;:16::i;:::-;61622:28:::1;61628:4;61634:7;61643:6;61622:5;:28::i;11082:204::-:0;11167:4;-1:-1:-1;;;;;;11191:47:0;;-1:-1:-1;;;11191:47:0;;:87;;;11242:36;11266:11;11242:23;:36::i;11829:105::-;11896:30;11907:4;861:10;11896;:30::i;:::-;11829:105;:::o;62300:106::-;62385:4;:13;62392:6;62385:4;:13;:::i;62941:1881::-;63006:17;63464:4;63457;63451:11;63447:22;63564:1;63558:4;63551:15;63647:4;63644:1;63640:12;63633:19;;;63737:1;63732:3;63725:14;63849:3;64104:5;64086:464;64156:1;64151:3;64147:11;64140:18;;64339:2;64333:4;64329:13;64325:2;64321:22;64316:3;64308:36;64441:2;64431:13;;64506:25;64086:464;64506:25;-1:-1:-1;64584:13:0;;;-1:-1:-1;;64707:14:0;;;64777:19;;;64707:14;62941:1881;-1:-1:-1;62941:1881:0:o;50245:729::-;-1:-1:-1;;;;;50398:16:0;;50390:62;;;;-1:-1:-1;;;50390:62:0;;;;;;;:::i;:::-;861:10;50465:16;50530:21;50548:2;50530:17;:21::i;:::-;50507:44;;50562:24;50589:25;50607:6;50589:17;:25::i;:::-;50562:52;;50706:9;:13;;;;;;;;;;;-1:-1:-1;;;;;50706:17:0;;;;;;;;;:27;;50727:6;;50706:9;:27;;50727:6;;50706:27;:::i;:::-;;;;-1:-1:-1;;50749:52:0;;;18889:25:1;;;18945:2;18930:18;;18923:34;;;-1:-1:-1;;;;;50749:52:0;;;;50782:1;;50749:52;;;;;;18862:18:1;50749:52:0;;;;;;;50892:74;50923:8;50941:1;50945:2;50949;50953:6;50961:4;50892:30;:74::i;46449:974::-;-1:-1:-1;;;;;46637:16:0;;46629:66;;;;-1:-1:-1;;;46629:66:0;;;;;;;:::i;:::-;861:10;46708:16;46773:21;46791:2;46773:17;:21::i;:::-;46750:44;;46805:24;46832:25;46850:6;46832:17;:25::i;:::-;46805:52;;46943:19;46965:13;;;;;;;;;;;-1:-1:-1;;;;;46965:19:0;;;;;;;;;;47003:21;;;;46995:76;;;;-1:-1:-1;;;46995:76:0;;;;;;;:::i;:::-;47107:9;:13;;;;;;;;;;;-1:-1:-1;;;;;47107:19:0;;;;;;;;;;47129:20;;;47107:42;;47171:17;;;;;;;:27;;47129:20;;47107:9;47171:27;;47129:20;;47171:27;:::i;:::-;;;;-1:-1:-1;;47216:46:0;;;18889:25:1;;;18945:2;18930:18;;18923:34;;;-1:-1:-1;;;;;47216:46:0;;;;;;;;;;;;;;18862:18:1;47216:46:0;;;;;;;47347:68;47378:8;47388:4;47394:2;47398;47402:6;47410:4;47347:30;:68::i;:::-;46618:805;;;;46449:974;;;;;:::o;47781:1146::-;48008:7;:14;47994:3;:10;:28;47986:81;;;;-1:-1:-1;;;47986:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48086:16:0;;48078:66;;;;-1:-1:-1;;;48078:66:0;;;;;;;:::i;:::-;861:10;48157:16;48274:421;48298:3;:10;48294:1;:14;48274:421;;;48330:10;48343:3;48347:1;48343:6;;;;;;;;:::i;:::-;;;;;;;48330:19;;48364:14;48381:7;48389:1;48381:10;;;;;;;;:::i;:::-;;;;;;;;;;;;48408:19;48430:13;;;;;;;;;;-1:-1:-1;;;;;48430:19:0;;;;;;;;;;;;48381:10;;-1:-1:-1;48472:21:0;;;;48464:76;;;;-1:-1:-1;;;48464:76:0;;;;;;;:::i;:::-;48584:9;:13;;;;;;;;;;;-1:-1:-1;;;;;48584:19:0;;;;;;;;;;48606:20;;;48584:42;;48656:17;;;;;;;:27;;48606:20;;48584:9;48656:27;;48606:20;;48656:27;:::i;:::-;;;;;;;;48315:380;;;48310:3;;;;:::i;:::-;;;48274:421;;;;48742:2;-1:-1:-1;;;;;48712:47:0;48736:4;-1:-1:-1;;;;;48712:47:0;48726:8;-1:-1:-1;;;;;48712:47:0;;48746:3;48751:7;48712:47;;;;;;;:::i;:::-;;;;;;;;48844:75;48880:8;48890:4;48896:2;48900:3;48905:7;48914:4;48844:35;:75::i;:::-;47975:952;47781:1146;;;;;:::o;16100:238::-;16184:22;16192:4;16198:7;16184;:22::i;:::-;16179:152;;16223:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;16223:29:0;;;;;;;;;:36;;-1:-1:-1;;16223:36:0;16255:4;16223:36;;;16306:12;861:10;;781:98;16306:12;-1:-1:-1;;;;;16279:40:0;16297:7;-1:-1:-1;;;;;16279:40:0;16291:4;16279:40;;;;;;;;;;16100:238;;:::o;16518:239::-;16602:22;16610:4;16616:7;16602;:22::i;:::-;16598:152;;;16673:5;16641:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;16641:29:0;;;;;;;;;;:37;;-1:-1:-1;;16641:37:0;;;16698:40;861:10;;16641:12;;16698:40;;16673:5;16698:40;16518:239;;:::o;51377:813::-;-1:-1:-1;;;;;51555:16:0;;51547:62;;;;-1:-1:-1;;;51547:62:0;;;;;;;:::i;:::-;51642:7;:14;51628:3;:10;:28;51620:81;;;;-1:-1:-1;;;51620:81:0;;;;;;;:::i;:::-;861:10;51714:16;51837:103;51861:3;:10;51857:1;:14;51837:103;;;51918:7;51926:1;51918:10;;;;;;;;:::i;:::-;;;;;;;51893:9;:17;51903:3;51907:1;51903:6;;;;;;;;:::i;:::-;;;;;;;51893:17;;;;;;;;;;;:21;51911:2;-1:-1:-1;;;;;51893:21:0;-1:-1:-1;;;;;51893:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;51873:3:0;;-1:-1:-1;51873:3:0;;;:::i;:::-;;;;51837:103;;;;51993:2;-1:-1:-1;;;;;51957:53:0;51989:1;-1:-1:-1;;;;;51957:53:0;51971:8;-1:-1:-1;;;;;51957:53:0;;51997:3;52002:7;51957:53;;;;;;;:::i;:::-;;;;;;;;52101:81;52137:8;52155:1;52159:2;52163:3;52168:7;52177:4;52101:35;:81::i;29105:190::-;29230:4;29283;29254:25;29267:5;29274:4;29254:12;:25::i;:::-;:33;;29105:190;-1:-1:-1;;;;29105:190:0:o;54658:331::-;54813:8;-1:-1:-1;;;;;54804:17:0;:5;-1:-1:-1;;;;;54804:17:0;;54796:71;;;;-1:-1:-1;;;54796:71:0;;20866:2:1;54796:71:0;;;20848:21:1;20905:2;20885:18;;;20878:30;20944:34;20924:18;;;20917:62;-1:-1:-1;;;20995:18:1;;;20988:39;21044:19;;54796:71:0;20664:405:1;54796:71:0;-1:-1:-1;;;;;54878:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;54878:46:0;;;;;;;;;;54940:41;;1159::1;;;54940::0;;1132:18:1;54940:41:0;;;;;;;54658:331;;;:::o;52488:808::-;-1:-1:-1;;;;;52615:18:0;;52607:66;;;;-1:-1:-1;;;52607:66:0;;21276:2:1;52607:66:0;;;21258:21:1;21315:2;21295:18;;;21288:30;21354:34;21334:18;;;21327:62;-1:-1:-1;;;21405:18:1;;;21398:33;21448:19;;52607:66:0;21074:399:1;52607:66:0;861:10;52686:16;52751:21;52769:2;52751:17;:21::i;:::-;52728:44;;52783:24;52810:25;52828:6;52810:17;:25::i;:::-;52848:66;;;;;;;;;-1:-1:-1;52848:66:0;;;;52949:13;;;;;;;;;-1:-1:-1;;;;;52949:19:0;;;;;;;;52783:52;;-1:-1:-1;52987:21:0;;;;52979:70;;;;-1:-1:-1;;;52979:70:0;;21680:2:1;52979:70:0;;;21662:21:1;21719:2;21699:18;;;21692:30;21758:34;21738:18;;;21731:62;-1:-1:-1;;;21809:18:1;;;21802:34;21853:19;;52979:70:0;21478:400:1;52979:70:0;53085:9;:13;;;;;;;;;;;-1:-1:-1;;;;;53085:19:0;;;;;;;;;;;;53107:20;;;53085:42;;53156:54;;18889:25:1;;;18930:18;;;18923:34;;;53085:19:0;;53156:54;;;;;;18862:18:1;53156:54:0;;;;;;;53223:65;;;;;;;;;53267:1;53223:65;;;47781:1146;42625:310;42727:4;-1:-1:-1;;;;;;42764:41:0;;-1:-1:-1;;;42764:41:0;;:110;;-1:-1:-1;;;;;;;42822:52:0;;-1:-1:-1;;;42822:52:0;42764:110;:163;;;-1:-1:-1;;;;;;;;;;8446:40:0;;;42891:36;8337:157;12224:505;12313:22;12321:4;12327:7;12313;:22::i;:::-;12308:414;;12501:41;12529:7;-1:-1:-1;;;;;12501:41:0;12539:2;12501:19;:41::i;:::-;12615:38;12643:4;12650:2;12615:19;:38::i;:::-;12406:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12406:270:0;;;;;;;;;;-1:-1:-1;;;12352:358:0;;;;;;;:::i;58924:198::-;59044:16;;;59058:1;59044:16;;;;;;;;;58990;;59019:22;;59044:16;;;;;;;;;;;;-1:-1:-1;59044:16:0;59019:41;;59082:7;59071:5;59077:1;59071:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;59109:5;58924:198;-1:-1:-1;;58924:198:0:o;57351:744::-;-1:-1:-1;;;;;57566:13:0;;18298:19;:23;57562:526;;57602:72;;-1:-1:-1;;;57602:72:0;;-1:-1:-1;;;;;57602:38:0;;;;;:72;;57641:8;;57651:4;;57657:2;;57661:6;;57669:4;;57602:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57602:72:0;;;;;;;;-1:-1:-1;;57602:72:0;;;;;;;;;;;;:::i;:::-;;;57598:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;57950:6;57943:14;;-1:-1:-1;;;57943:14:0;;;;;;;;:::i;57598:479::-;;;57999:62;;-1:-1:-1;;;57999:62:0;;24582:2:1;57999:62:0;;;24564:21:1;24621:2;24601:18;;;24594:30;24660:34;24640:18;;;24633:62;-1:-1:-1;;;24711:18:1;;;24704:50;24771:19;;57999:62:0;24380:416:1;57598:479:0;-1:-1:-1;;;;;;57724:55:0;;-1:-1:-1;;;57724:55:0;57720:154;;57804:50;;-1:-1:-1;;;57804:50:0;;;;;;;:::i;58103:813::-;-1:-1:-1;;;;;58343:13:0;;18298:19;:23;58339:570;;58379:79;;-1:-1:-1;;;58379:79:0;;-1:-1:-1;;;;;58379:43:0;;;;;:79;;58423:8;;58433:4;;58439:3;;58444:7;;58453:4;;58379:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58379:79:0;;;;;;;;-1:-1:-1;;58379:79:0;;;;;;;;;;;;:::i;:::-;;;58375:523;;;;:::i;:::-;-1:-1:-1;;;;;;58540:60:0;;-1:-1:-1;;;58540:60:0;58536:159;;58625:50;;-1:-1:-1;;;58625:50:0;;;;;;;:::i;29972:296::-;30055:7;30098:4;30055:7;30113:118;30137:5;:12;30133:1;:16;30113:118;;;30186:33;30196:12;30210:5;30216:1;30210:8;;;;;;;;:::i;:::-;;;;;;;30186:9;:33::i;:::-;30171:48;-1:-1:-1;30151:3:0;;;;:::i;:::-;;;;30113:118;;5779:451;5854:13;5880:19;5912:10;5916:6;5912:1;:10;:::i;:::-;:14;;5925:1;5912:14;:::i;:::-;-1:-1:-1;;;;;5902:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5902:25:0;;5880:47;;-1:-1:-1;;;5938:6:0;5945:1;5938:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5938:15:0;;;;;;;;;-1:-1:-1;;;5964:6:0;5971:1;5964:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;5964:15:0;;;;;;;;-1:-1:-1;5995:9:0;6007:10;6011:6;6007:1;:10;:::i;:::-;:14;;6020:1;6007:14;:::i;:::-;5995:26;;5990:135;6027:1;6023;:5;5990:135;;;-1:-1:-1;;;6075:5:0;6083:3;6075:11;6062:25;;;;;;;:::i;:::-;;;;6050:6;6057:1;6050:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;6050:37:0;;;;;;;;-1:-1:-1;6112:1:0;6102:11;;;;;6030:3;;;:::i;:::-;;;5990:135;;;-1:-1:-1;6143:10:0;;6135:55;;;;-1:-1:-1;;;6135:55:0;;26558:2:1;6135:55:0;;;26540:21:1;;;26577:18;;;26570:30;26636:34;26616:18;;;26609:62;26688:18;;6135:55:0;26356:356:1;6135:55:0;6215:6;5779:451;-1:-1:-1;;;5779:451:0:o;36179:149::-;36242:7;36273:1;36269;:5;:51;;36404:13;36498:15;;;36534:4;36527:15;;;36581:4;36565:21;;36269:51;;;36404:13;36498:15;;;36534:4;36527:15;;;36581:4;36565:21;;36277:20;36336:268;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;-1:-1:-1;;;;;1688:6:1;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;-1:-1:-1;;;;;2274:6:1;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;:::-;2432:84;2071:451;-1:-1:-1;;;;2071:451:1:o;2527:250::-;2612:1;2622:113;2636:6;2633:1;2630:13;2622:113;;;2712:11;;;2706:18;2693:11;;;2686:39;2658:2;2651:10;2622:113;;;-1:-1:-1;;2769:1:1;2751:16;;2744:27;2527:250::o;2782:271::-;2824:3;2862:5;2856:12;2889:6;2884:3;2877:19;2905:76;2974:6;2967:4;2962:3;2958:14;2951:4;2944:5;2940:16;2905:76;:::i;:::-;3035:2;3014:15;-1:-1:-1;;3010:29:1;3001:39;;;;3042:4;2997:50;;2782:271;-1:-1:-1;;2782:271:1:o;3058:220::-;3207:2;3196:9;3189:21;3170:4;3227:45;3268:2;3257:9;3253:18;3245:6;3227:45;:::i;3283:180::-;3342:6;3395:2;3383:9;3374:7;3370:23;3366:32;3363:52;;;3411:1;3408;3401:12;3363:52;-1:-1:-1;3434:23:1;;3283:180;-1:-1:-1;3283:180:1:o;3468:322::-;3545:6;3553;3561;3614:2;3602:9;3593:7;3589:23;3585:32;3582:52;;;3630:1;3627;3620:12;3582:52;3653:29;3672:9;3653:29;:::i;:::-;3643:39;3729:2;3714:18;;3701:32;;-1:-1:-1;3780:2:1;3765:18;;;3752:32;;3468:322;-1:-1:-1;;;3468:322:1:o;4162:367::-;4225:8;4235:6;4289:3;4282:4;4274:6;4270:17;4266:27;4256:55;;4307:1;4304;4297:12;4256:55;-1:-1:-1;4330:20:1;;-1:-1:-1;;;;;4362:30:1;;4359:50;;;4405:1;4402;4395:12;4359:50;4442:4;4434:6;4430:17;4418:29;;4502:3;4495:4;4485:6;4482:1;4478:14;4470:6;4466:27;4462:38;4459:47;4456:67;;;4519:1;4516;4509:12;4456:67;4162:367;;;;;:::o;4534:723::-;4656:6;4664;4672;4680;4688;4696;4749:3;4737:9;4728:7;4724:23;4720:33;4717:53;;;4766:1;4763;4756:12;4717:53;4789:29;4808:9;4789:29;:::i;:::-;4779:39;;4837:38;4871:2;4860:9;4856:18;4837:38;:::i;:::-;4827:48;;4922:2;4911:9;4907:18;4894:32;4884:42;;4973:2;4962:9;4958:18;4945:32;4935:42;;5028:3;5017:9;5013:19;5000:33;-1:-1:-1;;;;;5048:6:1;5045:30;5042:50;;;5088:1;5085;5078:12;5042:50;5127:70;5189:7;5180:6;5169:9;5165:22;5127:70;:::i;:::-;4534:723;;;;-1:-1:-1;4534:723:1;;-1:-1:-1;4534:723:1;;5216:8;;4534:723;-1:-1:-1;;;4534:723:1:o;5262:183::-;5322:4;-1:-1:-1;;;;;5347:6:1;5344:30;5341:56;;;5377:18;;:::i;:::-;-1:-1:-1;5422:1:1;5418:14;5434:4;5414:25;;5262:183::o;5450:724::-;5504:5;5557:3;5550:4;5542:6;5538:17;5534:27;5524:55;;5575:1;5572;5565:12;5524:55;5611:6;5598:20;5637:4;5660:43;5700:2;5660:43;:::i;:::-;5732:2;5726:9;5744:31;5772:2;5764:6;5744:31;:::i;:::-;5810:18;;;5902:1;5898:10;;;;5886:23;;5882:32;;;5844:15;;;;-1:-1:-1;5926:15:1;;;5923:35;;;5954:1;5951;5944:12;5923:35;5990:2;5982:6;5978:15;6002:142;6018:6;6013:3;6010:15;6002:142;;;6084:17;;6072:30;;6122:12;;;;6035;;6002:142;;;-1:-1:-1;6162:6:1;5450:724;-1:-1:-1;;;;;;5450:724:1:o;6179:221::-;6221:5;6274:3;6267:4;6259:6;6255:17;6251:27;6241:55;;6292:1;6289;6282:12;6241:55;6314:80;6390:3;6381:6;6368:20;6361:4;6353:6;6349:17;6314:80;:::i;6405:943::-;6559:6;6567;6575;6583;6591;6644:3;6632:9;6623:7;6619:23;6615:33;6612:53;;;6661:1;6658;6651:12;6612:53;6684:29;6703:9;6684:29;:::i;:::-;6674:39;;6732:38;6766:2;6755:9;6751:18;6732:38;:::i;:::-;6722:48;;6821:2;6810:9;6806:18;6793:32;-1:-1:-1;;;;;6885:2:1;6877:6;6874:14;6871:34;;;6901:1;6898;6891:12;6871:34;6924:61;6977:7;6968:6;6957:9;6953:22;6924:61;:::i;:::-;6914:71;;7038:2;7027:9;7023:18;7010:32;6994:48;;7067:2;7057:8;7054:16;7051:36;;;7083:1;7080;7073:12;7051:36;7106:63;7161:7;7150:8;7139:9;7135:24;7106:63;:::i;:::-;7096:73;;7222:3;7211:9;7207:19;7194:33;7178:49;;7252:2;7242:8;7239:16;7236:36;;;7268:1;7265;7258:12;7236:36;;7291:51;7334:7;7323:8;7312:9;7308:24;7291:51;:::i;:::-;7281:61;;;6405:943;;;;;;;;:::o;7353:254::-;7421:6;7429;7482:2;7470:9;7461:7;7457:23;7453:32;7450:52;;;7498:1;7495;7488:12;7450:52;7534:9;7521:23;7511:33;;7563:38;7597:2;7586:9;7582:18;7563:38;:::i;:::-;7553:48;;7353:254;;;;;:::o;7612:669::-;7739:6;7747;7755;7808:2;7796:9;7787:7;7783:23;7779:32;7776:52;;;7824:1;7821;7814:12;7776:52;7847:29;7866:9;7847:29;:::i;:::-;7837:39;;7927:2;7916:9;7912:18;7899:32;-1:-1:-1;;;;;7991:2:1;7983:6;7980:14;7977:34;;;8007:1;8004;7997:12;7977:34;8030:61;8083:7;8074:6;8063:9;8059:22;8030:61;:::i;:::-;8020:71;;8144:2;8133:9;8129:18;8116:32;8100:48;;8173:2;8163:8;8160:16;8157:36;;;8189:1;8186;8179:12;8157:36;;8212:63;8267:7;8256:8;8245:9;8241:24;8212:63;:::i;:::-;8202:73;;;7612:669;;;;;:::o;8286:1208::-;8404:6;8412;8465:2;8453:9;8444:7;8440:23;8436:32;8433:52;;;8481:1;8478;8471:12;8433:52;8521:9;8508:23;-1:-1:-1;;;;;8591:2:1;8583:6;8580:14;8577:34;;;8607:1;8604;8597:12;8577:34;8645:6;8634:9;8630:22;8620:32;;8690:7;8683:4;8679:2;8675:13;8671:27;8661:55;;8712:1;8709;8702:12;8661:55;8748:2;8735:16;8770:4;8793:43;8833:2;8793:43;:::i;:::-;8865:2;8859:9;8877:31;8905:2;8897:6;8877:31;:::i;:::-;8943:18;;;9031:1;9027:10;;;;9019:19;;9015:28;;;8977:15;;;;-1:-1:-1;9055:19:1;;;9052:39;;;9087:1;9084;9077:12;9052:39;9111:11;;;;9131:148;9147:6;9142:3;9139:15;9131:148;;;9213:23;9232:3;9213:23;:::i;:::-;9201:36;;9164:12;;;;9257;;;;9131:148;;;9298:6;-1:-1:-1;;9342:18:1;;9329:32;;-1:-1:-1;;9373:16:1;;;9370:36;;;9402:1;9399;9392:12;9370:36;;9425:63;9480:7;9469:8;9458:9;9454:24;9425:63;:::i;:::-;9415:73;;;8286:1208;;;;;:::o;9499:435::-;9552:3;9590:5;9584:12;9617:6;9612:3;9605:19;9643:4;9672:2;9667:3;9663:12;9656:19;;9709:2;9702:5;9698:14;9730:1;9740:169;9754:6;9751:1;9748:13;9740:169;;;9815:13;;9803:26;;9849:12;;;;9884:15;;;;9776:1;9769:9;9740:169;;;-1:-1:-1;9925:3:1;;9499:435;-1:-1:-1;;;;;9499:435:1:o;9939:261::-;10118:2;10107:9;10100:21;10081:4;10138:56;10190:2;10179:9;10175:18;10167:6;10138:56;:::i;10205:511::-;10300:6;10308;10316;10369:2;10357:9;10348:7;10344:23;10340:32;10337:52;;;10385:1;10382;10375:12;10337:52;10408:29;10427:9;10408:29;:::i;:::-;10398:39;;10488:2;10477:9;10473:18;10460:32;-1:-1:-1;;;;;10507:6:1;10504:30;10501:50;;;10547:1;10544;10537:12;10501:50;10586:70;10648:7;10639:6;10628:9;10624:22;10586:70;:::i;:::-;10205:511;;10675:8;;-1:-1:-1;10560:96:1;;-1:-1:-1;;;;10205:511:1:o;10721:347::-;10786:6;10794;10847:2;10835:9;10826:7;10822:23;10818:32;10815:52;;;10863:1;10860;10853:12;10815:52;10886:29;10905:9;10886:29;:::i;:::-;10876:39;;10965:2;10954:9;10950:18;10937:32;11012:5;11005:13;10998:21;10991:5;10988:32;10978:60;;11034:1;11031;11024:12;10978:60;11057:5;11047:15;;;10721:347;;;;;:::o;11281:260::-;11349:6;11357;11410:2;11398:9;11389:7;11385:23;11381:32;11378:52;;;11426:1;11423;11416:12;11378:52;11449:29;11468:9;11449:29;:::i;:::-;11439:39;;11497:38;11531:2;11520:9;11516:18;11497:38;:::i;11546:606::-;11650:6;11658;11666;11674;11682;11735:3;11723:9;11714:7;11710:23;11706:33;11703:53;;;11752:1;11749;11742:12;11703:53;11775:29;11794:9;11775:29;:::i;:::-;11765:39;;11823:38;11857:2;11846:9;11842:18;11823:38;:::i;:::-;11813:48;;11908:2;11897:9;11893:18;11880:32;11870:42;;11959:2;11948:9;11944:18;11931:32;11921:42;;12014:3;12003:9;11999:19;11986:33;-1:-1:-1;;;;;12034:6:1;12031:30;12028:50;;;12074:1;12071;12064:12;12028:50;12097:49;12138:7;12129:6;12118:9;12114:22;12097:49;:::i;12568:380::-;12647:1;12643:12;;;;12690;;;12711:61;;12765:4;12757:6;12753:17;12743:27;;12711:61;12818:2;12810:6;12807:14;12787:18;12784:38;12781:161;;12864:10;12859:3;12855:20;12852:1;12845:31;12899:4;12896:1;12889:15;12927:4;12924:1;12917:15;12781:161;;12568:380;;;:::o;13079:1020::-;13255:3;13284:1;13317:6;13311:13;13347:36;13373:9;13347:36;:::i;:::-;13402:1;13419:18;;;13446:133;;;;13593:1;13588:356;;;;13412:532;;13446:133;-1:-1:-1;;13479:24:1;;13467:37;;13552:14;;13545:22;13533:35;;13524:45;;;-1:-1:-1;13446:133:1;;13588:356;13619:6;13616:1;13609:17;13649:4;13694:2;13691:1;13681:16;13719:1;13733:165;13747:6;13744:1;13741:13;13733:165;;;13825:14;;13812:11;;;13805:35;13868:16;;;;13762:10;;13733:165;;;13737:3;;;13927:6;13922:3;13918:16;13911:23;;13412:532;;;;;13975:6;13969:13;13991:68;14050:8;14045:3;14038:4;14030:6;14026:17;13991:68;:::i;:::-;14075:18;;13079:1020;-1:-1:-1;;;;13079:1020:1:o;14459:411::-;14661:2;14643:21;;;14700:2;14680:18;;;14673:30;14739:34;14734:2;14719:18;;14712:62;-1:-1:-1;;;14805:2:1;14790:18;;14783:45;14860:3;14845:19;;14459:411::o;15701:127::-;15762:10;15757:3;15753:20;15750:1;15743:31;15793:4;15790:1;15783:15;15817:4;15814:1;15807:15;15833:127;15894:10;15889:3;15885:20;15882:1;15875:31;15925:4;15922:1;15915:15;15949:4;15946:1;15939:15;15965:135;16004:3;16025:17;;;16022:43;;16045:18;;:::i;:::-;-1:-1:-1;16092:1:1;16081:13;;15965:135::o;16105:545::-;16207:2;16202:3;16199:11;16196:448;;;16243:1;16268:5;16264:2;16257:17;16313:4;16309:2;16299:19;16383:2;16371:10;16367:19;16364:1;16360:27;16354:4;16350:38;16419:4;16407:10;16404:20;16401:47;;;-1:-1:-1;16442:4:1;16401:47;16497:2;16492:3;16488:12;16485:1;16481:20;16475:4;16471:31;16461:41;;16552:82;16570:2;16563:5;16560:13;16552:82;;;16615:17;;;16596:1;16585:13;16552:82;;16826:1352;16952:3;16946:10;-1:-1:-1;;;;;16971:6:1;16968:30;16965:56;;;17001:18;;:::i;:::-;17030:97;17120:6;17080:38;17112:4;17106:11;17080:38;:::i;:::-;17074:4;17030:97;:::i;:::-;17182:4;;17246:2;17235:14;;17263:1;17258:663;;;;17965:1;17982:6;17979:89;;;-1:-1:-1;18034:19:1;;;18028:26;17979:89;-1:-1:-1;;16783:1:1;16779:11;;;16775:24;16771:29;16761:40;16807:1;16803:11;;;16758:57;18081:81;;17228:944;;17258:663;13026:1;13019:14;;;13063:4;13050:18;;-1:-1:-1;;17294:20:1;;;17412:236;17426:7;17423:1;17420:14;17412:236;;;17515:19;;;17509:26;17494:42;;17607:27;;;;17575:1;17563:14;;;;17442:19;;17412:236;;;17416:3;17676:6;17667:7;17664:19;17661:201;;;17737:19;;;17731:26;-1:-1:-1;;17820:1:1;17816:14;;;17832:3;17812:24;17808:37;17804:42;17789:58;17774:74;;17661:201;-1:-1:-1;;;;;17908:1:1;17892:14;;;17888:22;17875:36;;-1:-1:-1;16826:1352:1:o;18183:397::-;18385:2;18367:21;;;18424:2;18404:18;;;18397:30;18463:34;18458:2;18443:18;;18436:62;-1:-1:-1;;;18529:2:1;18514:18;;18507:31;18570:3;18555:19;;18183:397::o;18585:125::-;18650:9;;;18671:10;;;18668:36;;;18684:18;;:::i;18968:401::-;19170:2;19152:21;;;19209:2;19189:18;;;19182:30;19248:34;19243:2;19228:18;;19221:62;-1:-1:-1;;;19314:2:1;19299:18;;19292:35;19359:3;19344:19;;18968:401::o;19374:406::-;19576:2;19558:21;;;19615:2;19595:18;;;19588:30;19654:34;19649:2;19634:18;;19627:62;-1:-1:-1;;;19720:2:1;19705:18;;19698:40;19770:3;19755:19;;19374:406::o;19785:404::-;19987:2;19969:21;;;20026:2;20006:18;;;19999:30;20065:34;20060:2;20045:18;;20038:62;-1:-1:-1;;;20131:2:1;20116:18;;20109:38;20179:3;20164:19;;19785:404::o;20194:465::-;20451:2;20440:9;20433:21;20414:4;20477:56;20529:2;20518:9;20514:18;20506:6;20477:56;:::i;:::-;20581:9;20573:6;20569:22;20564:2;20553:9;20549:18;20542:50;20609:44;20646:6;20638;20609:44;:::i;21883:812::-;22294:25;22289:3;22282:38;22264:3;22349:6;22343:13;22365:75;22433:6;22428:2;22423:3;22419:12;22412:4;22404:6;22400:17;22365:75;:::i;:::-;-1:-1:-1;;;22499:2:1;22459:16;;;22491:11;;;22484:40;22549:13;;22571:76;22549:13;22633:2;22625:11;;22618:4;22606:17;;22571:76;:::i;:::-;22667:17;22686:2;22663:26;;21883:812;-1:-1:-1;;;;21883:812:1:o;22700:561::-;-1:-1:-1;;;;;22997:15:1;;;22979:34;;23049:15;;23044:2;23029:18;;23022:43;23096:2;23081:18;;23074:34;;;23139:2;23124:18;;23117:34;;;22959:3;23182;23167:19;;23160:32;;;22922:4;;23209:46;;23235:19;;23227:6;23209:46;:::i;:::-;23201:54;22700:561;-1:-1:-1;;;;;;;22700:561:1:o;23266:249::-;23335:6;23388:2;23376:9;23367:7;23363:23;23359:32;23356:52;;;23404:1;23401;23394:12;23356:52;23436:9;23430:16;23455:30;23479:5;23455:30;:::i;23520:179::-;23555:3;23597:1;23579:16;23576:23;23573:120;;;23643:1;23640;23637;23622:23;-1:-1:-1;23680:1:1;23674:8;23669:3;23665:18;23573:120;23520:179;:::o;23704:671::-;23743:3;23785:4;23767:16;23764:26;23761:39;;;23704:671;:::o;23761:39::-;23827:2;23821:9;-1:-1:-1;;23892:16:1;23888:25;;23885:1;23821:9;23864:50;23943:4;23937:11;23967:16;-1:-1:-1;;;;;24073:2:1;24066:4;24058:6;24054:17;24051:25;24046:2;24038:6;24035:14;24032:45;24029:58;;;24080:5;;;;;23704:671;:::o;24029:58::-;24117:6;24111:4;24107:17;24096:28;;24153:3;24147:10;24180:2;24172:6;24169:14;24166:27;;;24186:5;;;;;;23704:671;:::o;24166:27::-;24270:2;24251:16;24245:4;24241:27;24237:36;24230:4;24221:6;24216:3;24212:16;24208:27;24205:69;24202:82;;;24277:5;;;;;;23704:671;:::o;24202:82::-;24293:57;24344:4;24335:6;24327;24323:19;24319:30;24313:4;24293:57;:::i;:::-;-1:-1:-1;24366:3:1;;23704:671;-1:-1:-1;;;;;23704:671:1:o;24801:404::-;25003:2;24985:21;;;25042:2;25022:18;;;25015:30;25081:34;25076:2;25061:18;;25054:62;-1:-1:-1;;;25147:2:1;25132:18;;25125:38;25195:3;25180:19;;24801:404::o;25210:827::-;-1:-1:-1;;;;;25607:15:1;;;25589:34;;25659:15;;25654:2;25639:18;;25632:43;25569:3;25706:2;25691:18;;25684:31;;;25532:4;;25738:57;;25775:19;;25767:6;25738:57;:::i;:::-;25843:9;25835:6;25831:22;25826:2;25815:9;25811:18;25804:50;25877:44;25914:6;25906;25877:44;:::i;:::-;25863:58;;25970:9;25962:6;25958:22;25952:3;25941:9;25937:19;25930:51;25998:33;26024:6;26016;25998:33;:::i;:::-;25990:41;25210:827;-1:-1:-1;;;;;;;;25210:827:1:o;26042:168::-;26115:9;;;26146;;26163:15;;;26157:22;;26143:37;26133:71;;26184:18;;:::i;26215:136::-;26254:3;26282:5;26272:39;;26291:18;;:::i;:::-;-1:-1:-1;;;26327:18:1;;26215:136::o
Swarm Source
ipfs://e838ed12b7abb3e6f8c4e30815975a7450a172870fe8abc311f1a68dab4ead89
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.