ERC-1155
Overview
Max Total Supply
0
Holders
14,298
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
NFT
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-30 */ // File: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: github.com/bcnmy/metatx-standard/blob/master/src/contracts/lib/EIP712Base.sol pragma solidity ^0.8.0; contract EIP712Base { struct EIP712Domain { string name; string version; uint256 salt; address verifyingContract; } bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(bytes("EIP712Domain(string name,string version,uint256 salt,address verifyingContract)")); bytes32 internal domainSeperator; constructor(string memory name, string memory version) public { domainSeperator = keccak256(abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(version)), getChainID(), address(this) )); } function getChainID() internal view returns (uint256 id) { return 137; } function getDomainSeperator() private view returns(bytes32) { return domainSeperator; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns(bytes32) { return keccak256(abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)); } } // File: github.com/bcnmy/metatx-standard/blob/master/src/contracts/EIP712MetaTransaction.sol pragma solidity 0.8.0; contract EIP712MetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(bytes("MetaTransaction(uint256 nonce,address from,bytes functionSignature)")); event MetaTransactionExecuted(address userAddress, address payable relayerAddress, bytes functionSignature); mapping(address => uint256) private nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } constructor(string memory name, string memory version) public EIP712Base(name, version) {} function convertBytesToBytes4(bytes memory inBytes) internal returns (bytes4 outBytes4) { if (inBytes.length == 0) { return 0x0; } assembly { outBytes4 := mload(add(inBytes, 32)) } } function executeMetaTransaction(address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV) public payable returns(bytes memory) { bytes4 destinationFunctionSig = convertBytesToBytes4(functionSignature); require(destinationFunctionSig != msg.sig, "functionSignature can not be of executeMetaTransaction method"); MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require(verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match"); nonces[userAddress] = nonces[userAddress].add(1); // Append userAddress at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call(abi.encodePacked(functionSignature, userAddress)); require(success, "Function call not successful"); emit MetaTransactionExecuted(userAddress, payable(msg.sender), functionSignature); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256(abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) )); } function getNonce(address user) external view returns(uint256 nonce) { nonce = nonces[user]; } function verify(address user, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV) internal view returns (bool) { address signer = ecrecover(toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS); require(signer != address(0), "Invalid signature"); return signer == user; } function msgSender() internal view returns(address sender) { if(msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff) } } else { sender = msg.sender; } return sender; } } // File: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } } // File: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity ^0.8.0; /** * _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. 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. 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: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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 be 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: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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: github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/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) external 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: balance query for the zero address"); 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 { require(_msgSender() != operator, "ERC1155: setting approval status for self"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, 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(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); 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"); _balances[id][from] = fromBalance - amount; _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _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 `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][account] += amount; emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 (uint i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn(address account, uint256 id, uint256 amount) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 accountBalance = _balances[id][account]; require(accountBalance >= amount, "ERC1155: burn amount exceeds balance"); _balances[id][account] = accountBalance - amount; } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @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 `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 _beforeTokenTransfer( 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(to).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(to).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: browser/NFT1155minter.sol // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; contract NFT is ERC1155, EIP712MetaTransaction("POLYGON ERC1155 NFT MINTER", "1") { mapping(uint => string) public locator; using Counters for Counters.Counter; Counters.Counter private _tokenIds; constructor() ERC1155("https://gateway.pinata.cloud/ipfs/") {} function uri(uint256 _id) public view override returns (string memory){ return string( abi.encodePacked('https://gateway.pinata.cloud/ipfs/', locator[_id]) ); } function mapIdToLocator(uint _tokenId, string memory locale) internal { locator[_tokenId] = locale; } function mintTocaller(address account, uint256 amount, bytes memory data, string memory givenURL) public returns (uint256){ _tokenIds.increment(); uint256 id = _tokenIds.current(); _mint(account, id, amount, data); mapIdToLocator(id, givenURL); return id; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":[{"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":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locator","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"string","name":"givenURL","type":"string"}],"name":"mintTocaller","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601a81526020017f504f4c59474f4e2045524331313535204e4654204d494e544552000000000000815250604051806040016040528060018152602001603160f81b81525081816040518060600160405280602281526020016200223260229139620000898162000108565b506040518060800160405280604f815260200162002254604f91398051906020012082805190602001208280519060200120620000cb6200012160201b60201c565b30604051602001620000e2959493929190620001cc565b604051602081830303815290604052805190602001206003819055505050505062000235565b80516200011d90600290602084019062000126565b5050565b608990565b8280546200013490620001f8565b90600052602060002090601f016020900481019282620001585760008555620001a3565b82601f106200017357805160ff1916838001178555620001a3565b82800160010185558215620001a3579182015b82811115620001a357825182559160200191906001019062000186565b50620001b1929150620001b5565b5090565b5b80821115620001b15760008155600101620001b6565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6002810460018216806200020d57607f821691505b602082108114156200022f57634e487b7160e01b600052602260045260246000fd5b50919050565b611fed80620002456000396000f3fe6080604052600436106100a65760003560e01c80632eb2c2d6116100645780632eb2c2d61461018e5780634e1273f4146101b05780637de42fc0146101dd578063a22cb465146101fd578063e985e9c51461021d578063f242432a1461023d576100a6565b8062fdd58e146100ab57806301ffc9a7146100e15780630c53c51c1461010e5780630d8126e21461012e5780630e89341c1461014e5780632d0335ab1461016e575b600080fd5b3480156100b757600080fd5b506100cb6100c636600461145e565b61025d565b6040516100d89190611d5e565b60405180910390f35b3480156100ed57600080fd5b506101016100fc3660046115d3565b6102b4565b6040516100d891906118d2565b61012161011c3660046113e5565b6102fc565b6040516100d8919061191f565b34801561013a57600080fd5b506100cb610149366004611487565b6104b3565b34801561015a57600080fd5b5061012161016936600461160b565b6104ec565b34801561017a57600080fd5b506100cb610189366004611256565b610527565b34801561019a57600080fd5b506101ae6101a93660046112a2565b610542565b005b3480156101bc57600080fd5b506101d06101cb366004611515565b6107a8565b6040516100d8919061189a565b3480156101e957600080fd5b506101216101f836600461160b565b6108c8565b34801561020957600080fd5b506101ae6102183660046113ab565b610962565b34801561022957600080fd5b50610101610238366004611270565b610a30565b34801561024957600080fd5b506101ae610258366004611348565b610a5e565b60006001600160a01b03831661028e5760405162461bcd60e51b8152600401610285906119ce565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806102e557506001600160e01b031982166303a24d0760e21b145b806102f457506102f482610bf4565b90505b919050565b6060600061030986610c0d565b90506000356001600160e01b0319908116908216141561033b5760405162461bcd60e51b815260040161028590611a50565b604080516060810182526001600160a01b038916600081815260046020908152908490205483528201529081018790526103788882888888610c29565b6103945760405162461bcd60e51b815260040161028590611c02565b6001600160a01b0388166000908152600460205260409020546103b8906001610cd5565b6001600160a01b03891660009081526004602090815260408083209390935591519091829130916103ed918c918e91016116a5565b60408051601f198184030181529082905261040791611689565b6000604051808303816000865af19150503d8060008114610444576040519150601f19603f3d011682016040523d82523d6000602084013e610449565b606091505b50915091508161046b5760405162461bcd60e51b815260040161028590611a19565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b60405161049e939291906117cb565b60405180910390a19998505050505050505050565b60006104bf6006610ce8565b60006104cb6006610cf1565b90506104d986828787610cf5565b6104e38184610ddc565b95945050505050565b60606005600083815260200190815260200160002060405160200161051191906116f7565b6040516020818303038152906040529050919050565b6001600160a01b031660009081526004602052604090205490565b81518351146105635760405162461bcd60e51b815260040161028590611cd5565b6001600160a01b0384166105895760405162461bcd60e51b815260040161028590611b21565b610591610e00565b6001600160a01b0316856001600160a01b031614806105b757506105b785610238610e00565b6105d35760405162461bcd60e51b815260040161028590611b66565b60006105dd610e00565b90506105ed8187878787876107a0565b60005b845181101561073a57600085828151811061061b57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061064757634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156106975760405162461bcd60e51b815260040161028590611bb8565b6106a18282611de7565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071f9190611dcf565b925050819055505050508061073390611e69565b90506105f0565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161078a9291906118ad565b60405180910390a46107a0818787878787610e05565b505050505050565b606081518351146107cb5760405162461bcd60e51b815260040161028590611c8c565b6000835167ffffffffffffffff8111156107f557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561081e578160200160208202803683370190505b50905060005b84518110156108c05761088585828151811061085057634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061087857634e487b7160e01b600052603260045260246000fd5b602002602001015161025d565b8282815181106108a557634e487b7160e01b600052603260045260246000fd5b60209081029190910101526108b981611e69565b9050610824565b509392505050565b600560205260009081526040902080546108e190611e2e565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90611e2e565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b505050505081565b816001600160a01b0316610974610e00565b6001600160a01b0316141561099b5760405162461bcd60e51b815260040161028590611c43565b80600160006109a8610e00565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556109ec610e00565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610a2491906118d2565b60405180910390a35050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b038416610a845760405162461bcd60e51b815260040161028590611b21565b610a8c610e00565b6001600160a01b0316856001600160a01b03161480610ab25750610ab285610238610e00565b610ace5760405162461bcd60e51b815260040161028590611aad565b6000610ad8610e00565b9050610af8818787610ae988610f13565b610af288610f13565b876107a0565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015610b395760405162461bcd60e51b815260040161028590611bb8565b610b438482611de7565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290610b7f908490611dcf565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051610bd5929190611d67565b60405180910390a4610beb828888888888610f6c565b50505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6000815160001415610c21575060006102f7565b506020015190565b6000806001610c3f610c3a8861103d565b61109b565b84878760405160008152602001604052604051610c5f9493929190611901565b6020604051602081039080840390855afa158015610c81573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cb45760405162461bcd60e51b815260040161028590611af6565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610ce18284611dcf565b9392505050565b80546001019055565b5490565b6001600160a01b038416610d1b5760405162461bcd60e51b815260040161028590611d1d565b6000610d25610e00565b9050610d3781600087610ae988610f13565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610d67908490611dcf565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051610dbe929190611d67565b60405180910390a4610dd581600087878787610f6c565b5050505050565b60008281526005602090815260409091208251610dfb928401906110c3565b505050565b335b90565b610e17846001600160a01b03166110b7565b156107a05760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610e5090899089908890889088906004016117f7565b602060405180830381600087803b158015610e6a57600080fd5b505af1925050508015610e9a575060408051601f3d908101601f19168201909252610e97918101906115ef565b60015b610ee357610ea6611eb6565b80610eb15750610ecb565b8060405162461bcd60e51b8152600401610285919061191f565b60405162461bcd60e51b815260040161028590611932565b6001600160e01b0319811663bc197c8160e01b14610beb5760405162461bcd60e51b815260040161028590611986565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610f5b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b610f7e846001600160a01b03166110b7565b156107a05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610fb79089908990889088908890600401611855565b602060405180830381600087803b158015610fd157600080fd5b505af1925050508015611001575060408051601f3d908101601f19168201909252610ffe918101906115ef565b60015b61100d57610ea6611eb6565b6001600160e01b0319811663f23a6e6160e01b14610beb5760405162461bcd60e51b815260040161028590611986565b6000604051806080016040528060438152602001611f75604391398051602091820120835184830151604080870151805190860120905161107e95016118dd565b604051602081830303815290604052805190602001209050919050565b60006110a56110bd565b8260405160200161107e9291906116dc565b3b151590565b60035490565b8280546110cf90611e2e565b90600052602060002090601f0160209004810192826110f15760008555611137565b82601f1061110a57805160ff1916838001178555611137565b82800160010185558215611137579182015b8281111561113757825182559160200191906001019061111c565b50611143929150611147565b5090565b5b808211156111435760008155600101611148565b600067ffffffffffffffff83111561117657611176611e9a565b611189601f8401601f1916602001611d75565b905082815283838301111561119d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f757600080fd5b600082601f8301126111db578081fd5b813560206111f06111eb83611d9f565b611d75565b828152818101908583018385028701840188101561120c578586fd5b855b8581101561122a5781358452928401929084019060010161120e565b5090979650505050505050565b600082601f830112611247578081fd5b610ce18383356020850161115c565b600060208284031215611267578081fd5b610ce1826111b4565b60008060408385031215611282578081fd5b61128b836111b4565b9150611299602084016111b4565b90509250929050565b600080600080600060a086880312156112b9578081fd5b6112c2866111b4565b94506112d0602087016111b4565b9350604086013567ffffffffffffffff808211156112ec578283fd5b6112f889838a016111cb565b9450606088013591508082111561130d578283fd5b61131989838a016111cb565b9350608088013591508082111561132e578283fd5b5061133b88828901611237565b9150509295509295909350565b600080600080600060a0868803121561135f578081fd5b611368866111b4565b9450611376602087016111b4565b93506040860135925060608601359150608086013567ffffffffffffffff81111561139f578182fd5b61133b88828901611237565b600080604083850312156113bd578182fd5b6113c6836111b4565b9150602083013580151581146113da578182fd5b809150509250929050565b600080600080600060a086880312156113fc578081fd5b611405866111b4565b9450602086013567ffffffffffffffff811115611420578182fd5b61142c88828901611237565b9450506040860135925060608601359150608086013560ff81168114611450578182fd5b809150509295509295909350565b60008060408385031215611470578182fd5b611479836111b4565b946020939093013593505050565b6000806000806080858703121561149c578182fd5b6114a5856111b4565b935060208501359250604085013567ffffffffffffffff808211156114c8578384fd5b6114d488838901611237565b935060608701359150808211156114e9578283fd5b508501601f810187136114fa578182fd5b6115098782356020840161115c565b91505092959194509250565b60008060408385031215611527578182fd5b823567ffffffffffffffff8082111561153e578384fd5b818501915085601f830112611551578384fd5b813560206115616111eb83611d9f565b82815281810190858301838502870184018b101561157d578889fd5b8896505b848710156115a657611592816111b4565b835260019690960195918301918301611581565b50965050860135925050808211156115bc578283fd5b506115c9858286016111cb565b9150509250929050565b6000602082840312156115e4578081fd5b8135610ce181611f5b565b600060208284031215611600578081fd5b8151610ce181611f5b565b60006020828403121561161c578081fd5b5035919050565b6000815180845260208085019450808401835b8381101561165257815187529582019590820190600101611636565b509495945050505050565b60008151808452611675816020860160208601611dfe565b601f01601f19169290920160200192915050565b6000825161169b818460208701611dfe565b9190910192915050565b600083516116b7818460208801611dfe565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b61190160f01b81526002810192909252602282015260420190565b60007f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f6970668252602061732f60f01b8184015260228285548460028204905060018083168061174557607f831692505b86831081141561176357634e487b7160e01b88526004869052602488fd5b808015611777576001811461178c576117bc565b60ff1985168a880152838a01870195506117bc565b6117958b611dc3565b895b858110156117b25781548c82018a0152908401908901611797565b505086848b010195505b50939998505050505050505050565b6001600160a01b038481168252831660208201526060604082018190526000906104e39083018461165d565b6001600160a01b0386811682528516602082015260a06040820181905260009061182390830186611623565b82810360608401526118358186611623565b90508281036080840152611849818561165d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061188f9083018461165d565b979650505050505050565b600060208252610ce16020830184611623565b6000604082526118c06040830185611623565b82810360208401526104e38185611623565b901515815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610ce1602083018461165d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715611d9757611d97611e9a565b604052919050565b600067ffffffffffffffff821115611db957611db9611e9a565b5060209081020190565b60009081526020902090565b60008219821115611de257611de2611e84565b500190565b600082821015611df957611df9611e84565b500390565b60005b83811015611e19578181015183820152602001611e01565b83811115611e28576000848401525b50505050565b600281046001821680611e4257607f821691505b60208210811415611e6357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e7d57611e7d611e84565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015611ec657610e02565b600481823e6308c379a0611eda8251611eb0565b14611ee457610e02565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715611f145750505050610e02565b82840192508251915080821115611f2e5750505050610e02565b503d83016020828401011115611f4657505050610e02565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114611f7157600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220ceff672cd3f8985f85ae566b35c11e26babbcd59ae839249348266c4838db61264736f6c6343000800003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e743235362073616c742c6164647265737320766572696679696e67436f6e747261637429
Deployed Bytecode
0x6080604052600436106100a65760003560e01c80632eb2c2d6116100645780632eb2c2d61461018e5780634e1273f4146101b05780637de42fc0146101dd578063a22cb465146101fd578063e985e9c51461021d578063f242432a1461023d576100a6565b8062fdd58e146100ab57806301ffc9a7146100e15780630c53c51c1461010e5780630d8126e21461012e5780630e89341c1461014e5780632d0335ab1461016e575b600080fd5b3480156100b757600080fd5b506100cb6100c636600461145e565b61025d565b6040516100d89190611d5e565b60405180910390f35b3480156100ed57600080fd5b506101016100fc3660046115d3565b6102b4565b6040516100d891906118d2565b61012161011c3660046113e5565b6102fc565b6040516100d8919061191f565b34801561013a57600080fd5b506100cb610149366004611487565b6104b3565b34801561015a57600080fd5b5061012161016936600461160b565b6104ec565b34801561017a57600080fd5b506100cb610189366004611256565b610527565b34801561019a57600080fd5b506101ae6101a93660046112a2565b610542565b005b3480156101bc57600080fd5b506101d06101cb366004611515565b6107a8565b6040516100d8919061189a565b3480156101e957600080fd5b506101216101f836600461160b565b6108c8565b34801561020957600080fd5b506101ae6102183660046113ab565b610962565b34801561022957600080fd5b50610101610238366004611270565b610a30565b34801561024957600080fd5b506101ae610258366004611348565b610a5e565b60006001600160a01b03831661028e5760405162461bcd60e51b8152600401610285906119ce565b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806102e557506001600160e01b031982166303a24d0760e21b145b806102f457506102f482610bf4565b90505b919050565b6060600061030986610c0d565b90506000356001600160e01b0319908116908216141561033b5760405162461bcd60e51b815260040161028590611a50565b604080516060810182526001600160a01b038916600081815260046020908152908490205483528201529081018790526103788882888888610c29565b6103945760405162461bcd60e51b815260040161028590611c02565b6001600160a01b0388166000908152600460205260409020546103b8906001610cd5565b6001600160a01b03891660009081526004602090815260408083209390935591519091829130916103ed918c918e91016116a5565b60408051601f198184030181529082905261040791611689565b6000604051808303816000865af19150503d8060008114610444576040519150601f19603f3d011682016040523d82523d6000602084013e610449565b606091505b50915091508161046b5760405162461bcd60e51b815260040161028590611a19565b7f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b8a338b60405161049e939291906117cb565b60405180910390a19998505050505050505050565b60006104bf6006610ce8565b60006104cb6006610cf1565b90506104d986828787610cf5565b6104e38184610ddc565b95945050505050565b60606005600083815260200190815260200160002060405160200161051191906116f7565b6040516020818303038152906040529050919050565b6001600160a01b031660009081526004602052604090205490565b81518351146105635760405162461bcd60e51b815260040161028590611cd5565b6001600160a01b0384166105895760405162461bcd60e51b815260040161028590611b21565b610591610e00565b6001600160a01b0316856001600160a01b031614806105b757506105b785610238610e00565b6105d35760405162461bcd60e51b815260040161028590611b66565b60006105dd610e00565b90506105ed8187878787876107a0565b60005b845181101561073a57600085828151811061061b57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061064757634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156106975760405162461bcd60e51b815260040161028590611bb8565b6106a18282611de7565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082825461071f9190611dcf565b925050819055505050508061073390611e69565b90506105f0565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161078a9291906118ad565b60405180910390a46107a0818787878787610e05565b505050505050565b606081518351146107cb5760405162461bcd60e51b815260040161028590611c8c565b6000835167ffffffffffffffff8111156107f557634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561081e578160200160208202803683370190505b50905060005b84518110156108c05761088585828151811061085057634e487b7160e01b600052603260045260246000fd5b602002602001015185838151811061087857634e487b7160e01b600052603260045260246000fd5b602002602001015161025d565b8282815181106108a557634e487b7160e01b600052603260045260246000fd5b60209081029190910101526108b981611e69565b9050610824565b509392505050565b600560205260009081526040902080546108e190611e2e565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90611e2e565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b505050505081565b816001600160a01b0316610974610e00565b6001600160a01b0316141561099b5760405162461bcd60e51b815260040161028590611c43565b80600160006109a8610e00565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556109ec610e00565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610a2491906118d2565b60405180910390a35050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b038416610a845760405162461bcd60e51b815260040161028590611b21565b610a8c610e00565b6001600160a01b0316856001600160a01b03161480610ab25750610ab285610238610e00565b610ace5760405162461bcd60e51b815260040161028590611aad565b6000610ad8610e00565b9050610af8818787610ae988610f13565b610af288610f13565b876107a0565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015610b395760405162461bcd60e51b815260040161028590611bb8565b610b438482611de7565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290610b7f908490611dcf565b92505081905550856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051610bd5929190611d67565b60405180910390a4610beb828888888888610f6c565b50505050505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6000815160001415610c21575060006102f7565b506020015190565b6000806001610c3f610c3a8861103d565b61109b565b84878760405160008152602001604052604051610c5f9493929190611901565b6020604051602081039080840390855afa158015610c81573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cb45760405162461bcd60e51b815260040161028590611af6565b866001600160a01b0316816001600160a01b03161491505095945050505050565b6000610ce18284611dcf565b9392505050565b80546001019055565b5490565b6001600160a01b038416610d1b5760405162461bcd60e51b815260040161028590611d1d565b6000610d25610e00565b9050610d3781600087610ae988610f13565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610d67908490611dcf565b92505081905550846001600160a01b031660006001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051610dbe929190611d67565b60405180910390a4610dd581600087878787610f6c565b5050505050565b60008281526005602090815260409091208251610dfb928401906110c3565b505050565b335b90565b610e17846001600160a01b03166110b7565b156107a05760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190610e5090899089908890889088906004016117f7565b602060405180830381600087803b158015610e6a57600080fd5b505af1925050508015610e9a575060408051601f3d908101601f19168201909252610e97918101906115ef565b60015b610ee357610ea6611eb6565b80610eb15750610ecb565b8060405162461bcd60e51b8152600401610285919061191f565b60405162461bcd60e51b815260040161028590611932565b6001600160e01b0319811663bc197c8160e01b14610beb5760405162461bcd60e51b815260040161028590611986565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110610f5b57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b610f7e846001600160a01b03166110b7565b156107a05760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190610fb79089908990889088908890600401611855565b602060405180830381600087803b158015610fd157600080fd5b505af1925050508015611001575060408051601f3d908101601f19168201909252610ffe918101906115ef565b60015b61100d57610ea6611eb6565b6001600160e01b0319811663f23a6e6160e01b14610beb5760405162461bcd60e51b815260040161028590611986565b6000604051806080016040528060438152602001611f75604391398051602091820120835184830151604080870151805190860120905161107e95016118dd565b604051602081830303815290604052805190602001209050919050565b60006110a56110bd565b8260405160200161107e9291906116dc565b3b151590565b60035490565b8280546110cf90611e2e565b90600052602060002090601f0160209004810192826110f15760008555611137565b82601f1061110a57805160ff1916838001178555611137565b82800160010185558215611137579182015b8281111561113757825182559160200191906001019061111c565b50611143929150611147565b5090565b5b808211156111435760008155600101611148565b600067ffffffffffffffff83111561117657611176611e9a565b611189601f8401601f1916602001611d75565b905082815283838301111561119d57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146102f757600080fd5b600082601f8301126111db578081fd5b813560206111f06111eb83611d9f565b611d75565b828152818101908583018385028701840188101561120c578586fd5b855b8581101561122a5781358452928401929084019060010161120e565b5090979650505050505050565b600082601f830112611247578081fd5b610ce18383356020850161115c565b600060208284031215611267578081fd5b610ce1826111b4565b60008060408385031215611282578081fd5b61128b836111b4565b9150611299602084016111b4565b90509250929050565b600080600080600060a086880312156112b9578081fd5b6112c2866111b4565b94506112d0602087016111b4565b9350604086013567ffffffffffffffff808211156112ec578283fd5b6112f889838a016111cb565b9450606088013591508082111561130d578283fd5b61131989838a016111cb565b9350608088013591508082111561132e578283fd5b5061133b88828901611237565b9150509295509295909350565b600080600080600060a0868803121561135f578081fd5b611368866111b4565b9450611376602087016111b4565b93506040860135925060608601359150608086013567ffffffffffffffff81111561139f578182fd5b61133b88828901611237565b600080604083850312156113bd578182fd5b6113c6836111b4565b9150602083013580151581146113da578182fd5b809150509250929050565b600080600080600060a086880312156113fc578081fd5b611405866111b4565b9450602086013567ffffffffffffffff811115611420578182fd5b61142c88828901611237565b9450506040860135925060608601359150608086013560ff81168114611450578182fd5b809150509295509295909350565b60008060408385031215611470578182fd5b611479836111b4565b946020939093013593505050565b6000806000806080858703121561149c578182fd5b6114a5856111b4565b935060208501359250604085013567ffffffffffffffff808211156114c8578384fd5b6114d488838901611237565b935060608701359150808211156114e9578283fd5b508501601f810187136114fa578182fd5b6115098782356020840161115c565b91505092959194509250565b60008060408385031215611527578182fd5b823567ffffffffffffffff8082111561153e578384fd5b818501915085601f830112611551578384fd5b813560206115616111eb83611d9f565b82815281810190858301838502870184018b101561157d578889fd5b8896505b848710156115a657611592816111b4565b835260019690960195918301918301611581565b50965050860135925050808211156115bc578283fd5b506115c9858286016111cb565b9150509250929050565b6000602082840312156115e4578081fd5b8135610ce181611f5b565b600060208284031215611600578081fd5b8151610ce181611f5b565b60006020828403121561161c578081fd5b5035919050565b6000815180845260208085019450808401835b8381101561165257815187529582019590820190600101611636565b509495945050505050565b60008151808452611675816020860160208601611dfe565b601f01601f19169290920160200192915050565b6000825161169b818460208701611dfe565b9190910192915050565b600083516116b7818460208801611dfe565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b61190160f01b81526002810192909252602282015260420190565b60007f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f6970668252602061732f60f01b8184015260228285548460028204905060018083168061174557607f831692505b86831081141561176357634e487b7160e01b88526004869052602488fd5b808015611777576001811461178c576117bc565b60ff1985168a880152838a01870195506117bc565b6117958b611dc3565b895b858110156117b25781548c82018a0152908401908901611797565b505086848b010195505b50939998505050505050505050565b6001600160a01b038481168252831660208201526060604082018190526000906104e39083018461165d565b6001600160a01b0386811682528516602082015260a06040820181905260009061182390830186611623565b82810360608401526118358186611623565b90508281036080840152611849818561165d565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061188f9083018461165d565b979650505050505050565b600060208252610ce16020830184611623565b6000604082526118c06040830185611623565b82810360208401526104e38185611623565b901515815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b93845260ff9290921660208401526040830152606082015260800190565b600060208252610ce1602083018461165d565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b6020808252601c908201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604082015260600190565b6020808252603d908201527f66756e6374696f6e5369676e61747572652063616e206e6f74206265206f662060408201527f657865637574654d6574615472616e73616374696f6e206d6574686f64000000606082015260800190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b602080825260119082015270496e76616c6964207369676e617475726560781b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60208082526021908201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636040820152600d60fb1b606082015260800190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526021908201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff81118282101715611d9757611d97611e9a565b604052919050565b600067ffffffffffffffff821115611db957611db9611e9a565b5060209081020190565b60009081526020902090565b60008219821115611de257611de2611e84565b500190565b600082821015611df957611df9611e84565b500390565b60005b83811015611e19578181015183820152602001611e01565b83811115611e28576000848401525b50505050565b600281046001821680611e4257607f821691505b60208210811415611e6357634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e7d57611e7d611e84565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60e01c90565b600060443d1015611ec657610e02565b600481823e6308c379a0611eda8251611eb0565b14611ee457610e02565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715611f145750505050610e02565b82840192508251915080821115611f2e5750505050610e02565b503d83016020828401011115611f4657505050610e02565b601f01601f1916810160200160405291505090565b6001600160e01b031981168114611f7157600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220ceff672cd3f8985f85ae566b35c11e26babbcd59ae839249348266c4838db61264736f6c63430008000033
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.