Overview
Max Total Supply
1,000,064,236 PAT
Holders
1,251
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
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ArtTokenERC1155
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.4; import "./Ownable.sol"; import './ERC1155.sol'; import './ERC1155MintBurn.sol'; import './IERC1155Metadata.sol'; import "./StringsUtil.sol"; contract ArtTokenERC1155 is IERC1155Metadata, ERC1155, ERC1155MintBurn, Ownable { using StringsUtil for string; uint256 private _currentTokenID = 0; mapping (uint256 => uint256) public tokenSupply; string internal baseMetadataURI; mapping (uint256 => string) internal _tokenURIs; /* * @notice Will emit default URI log event for corresponding token _id * @param _tokenIDs Array of IDs of tokens to log default URI */ // function _logURIs(uint256[] memory _tokenIDs) internal { // string memory baseURL = baseMetadataURI; // string memory tokenURI; // // for (uint256 i = 0; i < _tokenIDs.length; i++) { // tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json")); // emit URI(tokenURI, _tokenIDs[i]); // } // } // Contract name string public name; // Contract symbol string public symbol; mapping (uint256 => address) public creators; mapping(bytes32 => bool) private _uniqTitleSet; constructor() { name = "Portion Art Token"; symbol = "PAT"; } /** * @dev Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function setBaseMetadataURI( string memory _newBaseMetadataURI ) public onlyOwner { _setBaseMetadataURI(_newBaseMetadataURI); } /** * @dev Creates a new token type and assigns _quantity to an creator (i.e. the message sender) * @param _title unique art title * @param _quantity art's quantity * @param _uri token's type metadata uri * @param _data Data to pass if receiver is contract * @return The newly created token ID */ function createArt( bytes32 _title, uint256 _quantity, string calldata _uri, bytes calldata _data ) external returns (uint) { bytes32 hash = keccak256(abi.encodePacked(_title)); require(!_uniqTitleSet[hash], "ArtTokenERC1155#createArt: TITLE_NOT_UNIQUE"); _uniqTitleSet[hash] = true; _currentTokenID += 1; uint256 _id = _currentTokenID; creators[_id] = msg.sender; if (bytes(_uri).length > 0) { _tokenURIs[_id] = _uri; emit URI(_uri, _id); } else { require(bytes(baseMetadataURI).length > 0, "ArtTokenERC1155#createArt: NO_DEFAULT_URI"); } _mint(_msgSender(), _id, _quantity, _data); tokenSupply[_id] = _quantity; return _id; } /** * @dev Returns the total quantity for a token ID * @param _id uint256 ID of the token to query * @return amount of token in existence */ function totalSupply( uint256 _id ) public view returns (uint256) { return tokenSupply[_id]; } function uri( uint256 _id ) public override view returns (string memory) { require(_exists(_id), "ERC721Tradable#uri: NONEXISTENT_TOKEN"); string memory _tokenURI = _tokenURIs[_id]; if (bytes(baseMetadataURI).length == 0) { return _tokenURI; } return StringsUtil.strConcat(baseMetadataURI, StringsUtil.uint2str(_id), ".json"); } /** * @notice Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal { baseMetadataURI = _newBaseMetadataURI; } /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { if (_interfaceID == type(IERC1155Metadata).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } /** * @dev Returns whether the specified token exists by checking to see if it has a creator * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists( uint256 _id ) internal view returns (bool) { return creators[_id] != address(0); } }
pragma solidity 0.7.4; /** * Utility library of inline functions on addresses */ library Address { // Default hash for EOA accounts returned by extcodehash bytes32 constant internal ACCOUNT_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract. * @param _address address of the account to check * @return Whether the target address is a contract */ function isContract(address _address) internal view returns (bool) { bytes32 codehash; // Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address or if it has a non-zero code hash or account hash assembly { codehash := extcodehash(_address) } return (codehash != 0x0 && codehash != ACCOUNT_HASH); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; import "./SafeMath.sol"; import "./IERC1155TokenReceiver.sol"; import "./IERC1155.sol"; import "./Address.sol"; import "./ERC165.sol"; /** * @dev Implementation of Multi-Token Standard contract */ contract ERC1155 is IERC1155, ERC165 { using SafeMath for uint256; using Address for address; /***********************************| | Variables and Events | |__________________________________*/ // onReceive function signatures bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61; bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81; // Objects balances mapping (address => mapping(uint256 => uint256)) internal balances; // Operator Functions mapping (address => mapping(address => bool)) internal operators; /***********************************| | Public Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) public override { require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR"); require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT"); // require(_amount <= balances[_from][_id]) is not necessary since checked with safemath operations _safeTransferFrom(_from, _to, _id, _amount); _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data); } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) public override { // Requirements require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR"); require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT"); _safeBatchTransferFrom(_from, _to, _ids, _amounts); _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data); } /***********************************| | Internal Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount */ function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount) internal { // Update balances balances[_from][_id] = balances[_from][_id].sub(_amount); // Subtract amount balances[_to][_id] = balances[_to][_id].add(_amount); // Add amount // Emit event emit TransferSingle(msg.sender, _from, _to, _id, _amount); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...) */ function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, uint256 _gasLimit, bytes memory _data) internal { // Check if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received{gas: _gasLimit}(msg.sender, _from, _id, _amount, _data); require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE"); } } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type */ function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts) internal { require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH"); // Number of transfer to execute uint256 nTransfer = _ids.length; // Executing all transfers for (uint256 i = 0; i < nTransfer; i++) { // Update storage balance of previous bin balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]); balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]); } // Emit event emit TransferBatch(msg.sender, _from, _to, _ids, _amounts); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...) */ function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, uint256 _gasLimit, bytes memory _data) internal { // Pass data if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived{gas: _gasLimit}(msg.sender, _from, _ids, _amounts, _data); require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE"); } } /***********************************| | Operator Functions | |__________________________________*/ /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external override { // Update operator status operators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return isOperator True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) public override view returns (bool isOperator) { return operators[_owner][_operator]; } /***********************************| | Balance Functions | |__________________________________*/ /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) public override view returns (uint256) { return balances[_owner][_id]; } /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] memory _owners, uint256[] memory _ids) public override view returns (uint256[] memory) { require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH"); // Variables uint256[] memory batchBalances = new uint256[](_owners.length); // Iterate over each owner and token ID for (uint256 i = 0; i < _owners.length; i++) { batchBalances[i] = balances[_owners[i]][_ids[i]]; } return batchBalances; } /***********************************| | ERC165 Functions | |__________________________________*/ /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { if (_interfaceID == type(IERC1155).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; import "./IERC1155Metadata.sol"; import "./ERC165.sol"; /** * @notice Contract that handles metadata related methods. * @dev Methods assume a deterministic generation of URI based on token IDs. * Methods also assume that URI uses hex representation of token IDs. */ contract ERC1155Metadata is IERC1155Metadata, ERC165 { // URI's default URI prefix string internal baseMetadataURI; /***********************************| | Metadata Public Function s | |__________________________________*/ /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * URIs are assumed to be deterministically generated based on token ID * @return URI string */ function uri(uint256 _id) public override view returns (string memory) { return string(abi.encodePacked(baseMetadataURI, _uint2str(_id), ".json")); } /***********************************| | Metadata Internal Functions | |__________________________________*/ /** * @notice Will emit default URI log event for corresponding token _id * @param _tokenIDs Array of IDs of tokens to log default URI */ function _logURIs(uint256[] memory _tokenIDs) internal { string memory baseURL = baseMetadataURI; string memory tokenURI; for (uint256 i = 0; i < _tokenIDs.length; i++) { tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json")); emit URI(tokenURI, _tokenIDs[i]); } } /** * @notice Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal { baseMetadataURI = _newBaseMetadataURI; } /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { if (_interfaceID == type(IERC1155Metadata).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } /***********************************| | Utility Internal Functions | |__________________________________*/ /** * @notice Convert uint256 to string * @param _i Unsigned integer to convert to string */ function _uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 ii = _i; uint256 len; // Get number of bytes while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; // Get each individual ASCII while (ii != 0) { bstr[k--] = byte(uint8(48 + ii % 10)); ii /= 10; } // Convert to string return string(bstr); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; import "./ERC1155.sol"; /** * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume * a parent contract to be executed as they are `internal` functions */ contract ERC1155MintBurn is ERC1155 { using SafeMath for uint256; /****************************************| | Minting Functions | |_______________________________________*/ /** * @notice Mint _amount of tokens of a given id * @param _to The address to mint tokens to * @param _id Token id to mint * @param _amount The amount to be minted * @param _data Data to pass if receiver is contract */ function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal { // Add _amount balances[_to][_id] = balances[_to][_id].add(_amount); // Emit event emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount); // Calling onReceive method if recipient is contract _callonERC1155Received(address(0x0), _to, _id, _amount, gasleft(), _data); } /** * @notice Mint tokens for each ids in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _amounts Array of amount of tokens to mint per id * @param _data Data to pass if receiver is contract */ function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal { require(_ids.length == _amounts.length, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH"); // Number of mints to execute uint256 nMint = _ids.length; // Executing all minting for (uint256 i = 0; i < nMint; i++) { // Update storage balance balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts); // Calling onReceive method if recipient is contract _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, gasleft(), _data); } /****************************************| | Burning Functions | |_______________________________________*/ /** * @notice Burn _amount of tokens of a given token id * @param _from The address to burn tokens from * @param _id Token id to burn * @param _amount The amount to be burned */ function _burn(address _from, uint256 _id, uint256 _amount) internal { //Substract _amount balances[_from][_id] = balances[_from][_id].sub(_amount); // Emit event emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount); } /** * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair * @param _from The address to burn tokens from * @param _ids Array of token ids to burn * @param _amounts Array of the amount to be burned */ function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal { // Number of mints to execute uint256 nBurn = _ids.length; require(nBurn == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH"); // Executing all minting for (uint256 i = 0; i < nBurn; i++) { // Update storage balance balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts); } }
pragma solidity 0.7.4; abstract contract ERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` */ function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) { return _interfaceID == this.supportsInterface.selector; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; interface IERC1155 { /****************************************| | Events | |_______________________________________*/ /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount); /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts); /** * @dev MUST emit when an approval is updated */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /****************************************| | Functions | |_______________________________________*/ /** * @notice Transfers amount of an _id from the _from address to the _to address specified * @dev MUST emit TransferSingle event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external; /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @dev MUST emit TransferBatch event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if length of `_ids` is not the same as length of `_amounts` * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external; /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @dev MUST emit the ApprovalForAll event on success * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external; /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return isOperator True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; interface IERC1155Metadata { event URI(string _uri, uint256 indexed _id); /****************************************| | Functions | |_______________________________________*/ /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * URIs are assumed to be deterministically generated based on token ID * Token IDs are assumed to be represented in their hex format in URIs * @return URI string */ function uri(uint256 _id) external view returns (string memory); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.4; /** * @dev ERC-1155 interface for accepting safe transfers. */ interface IERC1155TokenReceiver { /** * @notice Handle the receipt of a single ERC1155 token type * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value MUST result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeTransferFrom` function * @param _from The address which previously owned the token * @param _id The id of the token being transferred * @param _amount The amount of tokens being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` */ function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4); /** * @notice Handle the receipt of multiple ERC1155 token types * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value WILL result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeBatchTransferFrom` function * @param _from The address which previously owned the token * @param _ids An array containing ids of each token being transferred * @param _amounts An array containing amounts of each token being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` */ function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
pragma solidity 0.7.4; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // 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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath#mul: OVERFLOW"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath#div: DIVISION_BY_ZERO"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath#sub: UNDERFLOW"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath#add: OVERFLOW"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath#mod: DIVISION_BY_ZERO"); return a % b; } }
pragma solidity ^0.7.4; library StringsUtil { // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length); bytes memory babcde = bytes(abcde); uint k = 0; for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i]; return string(babcde); } function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) { return strConcat(_a, _b, _c, _d, ""); } function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { return strConcat(_a, _b, _c, "", ""); } function strConcat(string memory _a, string memory _b) internal pure returns (string memory) { return strConcat(_a, _b, "", "", ""); } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"_amounts","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":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_title","type":"bytes32"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"createArt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"string","name":"_newBaseMetadataURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006003553480156200001657600080fd5b50600062000023620000df565b600280546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604080518082019091526011808252702837b93a34b7b71020b93a102a37b5b2b760791b6020909201918252620000ab91600791620000e3565b506040805180820190915260038082526214105560ea1b6020909201918252620000d891600891620000e3565b506200018f565b3390565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200011b576000855562000166565b82601f106200013657805160ff191683800117855562000166565b8280016001018555821562000166579182015b828111156200016657825182559160200191906001019062000149565b506200017492915062000178565b5090565b5b8082111562000174576000815560010162000179565b6122fa806200019f6000396000f3fe608060405234801561001057600080fd5b50600436106101145760003560e01c80637e518ec8116100a2578063bd85b03911610071578063bd85b0391461074f578063cd53d08e1461076c578063e985e9c514610789578063f242432a146107b7578063f2fde38b1461088057610114565b80637e518ec8146106515780638da5cb5b146106f557806395d89b4114610719578063a22cb4651461072157610114565b80630e89341c116100e95780630e89341c146102d95780632693ebf2146102f65780632eb2c2d6146103135780634e1273f4146104d6578063715018a61461064957610114565b8062bfd8c814610119578062fdd58e146101f557806301ffc9a71461022157806306fdde031461025c575b600080fd5b6101e36004803603608081101561012f57600080fd5b813591602081013591810190606081016040820135600160201b81111561015557600080fd5b82018360208201111561016757600080fd5b803590602001918460018302840111600160201b8311171561018857600080fd5b919390929091602081019035600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b5090925090506108a6565b60408051918252519081900360200190f35b6101e36004803603604081101561020b57600080fd5b506001600160a01b038135169060200135610a9c565b6102486004803603602081101561023757600080fd5b50356001600160e01b031916610ac2565b604080519115158252519081900360200190f35b610264610af6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610264600480360360208110156102ef57600080fd5b5035610b84565b6101e36004803603602081101561030c57600080fd5b5035610d4d565b6104d4600480360360a081101561032957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561035c57600080fd5b82018360208201111561036e57600080fd5b803590602001918460208302840111600160201b8311171561038f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460208302840111600160201b8311171561041157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046057600080fd5b82018360208201111561047257600080fd5b803590602001918460018302840111600160201b8311171561049357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d5f945050505050565b005b6105f9600480360360408110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460208302840111600160201b8311171561053957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460208302840111600160201b831117156105bb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1c945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b6104d4610f34565b6104d46004803603602081101561066757600080fd5b810190602081018135600160201b81111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111600160201b831117156106b457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe8945050505050565b6106fd61105e565b604080516001600160a01b039092168252519081900360200190f35b61026461106d565b6104d46004803603604081101561073757600080fd5b506001600160a01b03813516906020013515156110c8565b6101e36004803603602081101561076557600080fd5b5035611136565b6106fd6004803603602081101561078257600080fd5b5035611148565b6102486004803603604081101561079f57600080fd5b506001600160a01b0381358116916020013516611163565b6104d4600480360360a08110156107cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611191945050505050565b6104d46004803603602081101561089657600080fd5b50356001600160a01b0316611247565b60408051602080820189905282518083038201815291830183528151918101919091206000818152600a9092529181205490919060ff16156109195760405162461bcd60e51b815260040180806020018281038252602b815260200180612113602b913960400191505060405180910390fd5b6000818152600a60209081526040808320805460ff191660019081179091556003805490910190819055808452600990925290912080546001600160a01b0319163317905585156109e457600081815260066020526040902061097d908888611f7a565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b888860405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2610a35565b60055460026000196101006001841615020190911604610a355760405162461bcd60e51b81526004018080602001828103825260298152602001806121736029913960400191505060405180910390fd5b610a7e610a40611352565b828a88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135692505050565b60008181526004602052604090208890559150509695505050505050565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b60006001600160e01b031982166303a24d0760e21b1415610ae557506001610af1565b610aee826113f7565b90505b919050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b820191906000526020600020905b815481529060010190602001808311610b5f57829003601f168201915b505050505081565b6060610b8f82611423565b610bca5760405162461bcd60e51b81526004018080602001828103825260258152602001806121cc6025913960400191505060405180910390fd5b60008281526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b505060055493945050505060026000196101006001841615020190911604610c88579050610af1565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d469390929091830182828015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050610d2385611440565b60405180604001604052806005815260200164173539b7b760d91b815250611518565b9392505050565b60046020526000908152604090205481565b336001600160a01b0386161480610d7b5750610d7b8533611163565b610db65760405162461bcd60e51b815260040180806020018281038252602f81526020018061221d602f913960400191505060405180910390fd5b6001600160a01b038416610dfb5760405162461bcd60e51b815260040180806020018281038252603081526020018061219c6030913960400191505060405180910390fd5b610e078585858561154d565b610e15858585855a866117f8565b5050505050565b60608151835114610e5e5760405162461bcd60e51b815260040180806020018281038252602c8152602001806121f1602c913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610e7857600080fd5b50604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b8451811015610f2c57600080868381518110610ec057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610ef657fe5b6020026020010151815260200190815260200160002054828281518110610f1957fe5b6020908102919091010152600101610ea8565b509392505050565b610f3c611352565b6002546001600160a01b03908116911614610f9e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b610ff0611352565b6002546001600160a01b03908116911614611052576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61105b816119f0565b50565b6002546001600160a01b031690565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526004602052604090205490565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b03861614806111ad57506111ad8533611163565b6111e85760405162461bcd60e51b815260040180806020018281038252602a8152602001806120e9602a913960400191505060405180910390fd5b6001600160a01b03841661122d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612098602b913960400191505060405180910390fd5b61123985858585611a07565b610e15858585855a86611ae3565b61124f611352565b6002546001600160a01b039081169116146112b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f65760405162461bcd60e51b81526004018080602001828103825260268152602001806120c36026913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0384166000908152602081815260408083208684529091529020546113829083611c55565b6001600160a01b038516600081815260208181526040808320888452825280832094909455835187815290810186905283519293919233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a46113f160008585855a86611ae3565b50505050565b60006001600160e01b03198216636cdb3d1360e11b141561141a57506001610af1565b610aee82611ca8565b6000908152600960205260409020546001600160a01b0316151590565b60608161146557506040805180820190915260018152600360fc1b6020820152610af1565b8160005b811561147d57600101600a82049150611469565b60608167ffffffffffffffff8111801561149657600080fd5b506040519080825280601f01601f1916602001820160405280156114c1576020820181803683370190505b50905060001982015b851561150f57600a860660300160f81b828280600190039350815181106114ed57fe5b60200101906001600160f81b031916908160001a905350600a860495506114ca565b50949350505050565b60606115458484846040518060200160405280600081525060405180602001604052806000815250611cc1565b949350505050565b805182511461158d5760405162461bcd60e51b815260040180806020018281038252603581526020018061213e6035913960400191505060405180910390fd5b815160005b81811015611717576116088382815181106115a957fe5b6020026020010151600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106115e357fe5b6020026020010151815260200190815260200160002054611ee690919063ffffffff16565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061163a57fe5b60200260200101518152602001908152602001600020819055506116c283828151811061166357fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061169d57fe5b6020026020010151815260200190815260200160002054611c5590919063ffffffff16565b600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106116f457fe5b602090810291909101810151825281019190915260400160002055600101611592565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561179d578181015183820152602001611785565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117dc5781810151838201526020016117c4565b5050505090500194505050505060405180910390a45050505050565b61180a856001600160a01b0316611f43565b156119e8576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561189b578181015183820152602001611883565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156118da5781810151838201526020016118c2565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561196857600080fd5b5087f115801561197c573d6000803e3d6000fd5b50505050506040513d602081101561199357600080fd5b505190506001600160e01b0319811663bc197c8160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603f81526020018061224c603f913960400191505060405180910390fd5b505b505050505050565b8051611a03906005906020840190612006565b5050565b6001600160a01b038416600090815260208181526040808320858452909152902054611a339082611ee6565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054611a769082611c55565b6001600160a01b03808516600081815260208181526040808320888452825291829020949094558051868152938401859052805191939288169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a450505050565b611af5856001600160a01b0316611f43565b156119e8576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b87578181015183820152602001611b6f565b50505050905090810190601f168015611bb45780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b158015611bd757600080fd5b5087f1158015611beb573d6000803e3d6000fd5b50505050506040513d6020811015611c0257600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603a81526020018061228b603a913960400191505060405180910390fd5b600082820183811015610d46576040805162461bcd60e51b8152602060048201526016602482015275536166654d617468236164643a204f564552464c4f5760501b604482015290519081900360640190fd5b6001600160e01b031981166301ffc9a760e01b14919050565b805182518451865188516060948a948a948a948a948a948a94919092019092019091010167ffffffffffffffff81118015611cfb57600080fd5b506040519080825280601f01601f191660200182016040528015611d26576020820181803683370190505b509050806000805b8851811015611d7f57888181518110611d4357fe5b602001015160f81c60f81b838380600101945081518110611d6057fe5b60200101906001600160f81b031916908160001a905350600101611d2e565b5060005b8751811015611dd457878181518110611d9857fe5b602001015160f81c60f81b838380600101945081518110611db557fe5b60200101906001600160f81b031916908160001a905350600101611d83565b5060005b8651811015611e2957868181518110611ded57fe5b602001015160f81c60f81b838380600101945081518110611e0a57fe5b60200101906001600160f81b031916908160001a905350600101611dd8565b5060005b8551811015611e7e57858181518110611e4257fe5b602001015160f81c60f81b838380600101945081518110611e5f57fe5b60200101906001600160f81b031916908160001a905350600101611e2d565b5060005b8451811015611ed357848181518110611e9757fe5b602001015160f81c60f81b838380600101945081518110611eb457fe5b60200101906001600160f81b031916908160001a905350600101611e82565b50909d9c50505050505050505050505050565b600082821115611f3d576040805162461bcd60e51b815260206004820152601760248201527f536166654d617468237375623a20554e444552464c4f57000000000000000000604482015290519081900360640190fd5b50900390565b6000813f8015801590610d4657507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611fb05760008555611ff6565b82601f10611fc95782800160ff19823516178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578235825591602001919060010190611fdb565b50612002929150612082565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261203c5760008555611ff6565b82601f1061205557805160ff1916838001178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578251825591602001919060010190612067565b5b80821115612002576000815560010161208356fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52417274546f6b656e45524331313535236372656174654172743a205449544c455f4e4f545f554e4951554545524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448417274546f6b656e45524331313535236372656174654172743a204e4f5f44454641554c545f55524945524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a2646970667358221220f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f464736f6c63430007040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101145760003560e01c80637e518ec8116100a2578063bd85b03911610071578063bd85b0391461074f578063cd53d08e1461076c578063e985e9c514610789578063f242432a146107b7578063f2fde38b1461088057610114565b80637e518ec8146106515780638da5cb5b146106f557806395d89b4114610719578063a22cb4651461072157610114565b80630e89341c116100e95780630e89341c146102d95780632693ebf2146102f65780632eb2c2d6146103135780634e1273f4146104d6578063715018a61461064957610114565b8062bfd8c814610119578062fdd58e146101f557806301ffc9a71461022157806306fdde031461025c575b600080fd5b6101e36004803603608081101561012f57600080fd5b813591602081013591810190606081016040820135600160201b81111561015557600080fd5b82018360208201111561016757600080fd5b803590602001918460018302840111600160201b8311171561018857600080fd5b919390929091602081019035600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b5090925090506108a6565b60408051918252519081900360200190f35b6101e36004803603604081101561020b57600080fd5b506001600160a01b038135169060200135610a9c565b6102486004803603602081101561023757600080fd5b50356001600160e01b031916610ac2565b604080519115158252519081900360200190f35b610264610af6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029e578181015183820152602001610286565b50505050905090810190601f1680156102cb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610264600480360360208110156102ef57600080fd5b5035610b84565b6101e36004803603602081101561030c57600080fd5b5035610d4d565b6104d4600480360360a081101561032957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561035c57600080fd5b82018360208201111561036e57600080fd5b803590602001918460208302840111600160201b8311171561038f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103de57600080fd5b8201836020820111156103f057600080fd5b803590602001918460208302840111600160201b8311171561041157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561046057600080fd5b82018360208201111561047257600080fd5b803590602001918460018302840111600160201b8311171561049357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610d5f945050505050565b005b6105f9600480360360408110156104ec57600080fd5b810190602081018135600160201b81111561050657600080fd5b82018360208201111561051857600080fd5b803590602001918460208302840111600160201b8311171561053957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561058857600080fd5b82018360208201111561059a57600080fd5b803590602001918460208302840111600160201b831117156105bb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610e1c945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561063557818101518382015260200161061d565b505050509050019250505060405180910390f35b6104d4610f34565b6104d46004803603602081101561066757600080fd5b810190602081018135600160201b81111561068157600080fd5b82018360208201111561069357600080fd5b803590602001918460018302840111600160201b831117156106b457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe8945050505050565b6106fd61105e565b604080516001600160a01b039092168252519081900360200190f35b61026461106d565b6104d46004803603604081101561073757600080fd5b506001600160a01b03813516906020013515156110c8565b6101e36004803603602081101561076557600080fd5b5035611136565b6106fd6004803603602081101561078257600080fd5b5035611148565b6102486004803603604081101561079f57600080fd5b506001600160a01b0381358116916020013516611163565b6104d4600480360360a08110156107cd57600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561080c57600080fd5b82018360208201111561081e57600080fd5b803590602001918460018302840111600160201b8311171561083f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611191945050505050565b6104d46004803603602081101561089657600080fd5b50356001600160a01b0316611247565b60408051602080820189905282518083038201815291830183528151918101919091206000818152600a9092529181205490919060ff16156109195760405162461bcd60e51b815260040180806020018281038252602b815260200180612113602b913960400191505060405180910390fd5b6000818152600a60209081526040808320805460ff191660019081179091556003805490910190819055808452600990925290912080546001600160a01b0319163317905585156109e457600081815260066020526040902061097d908888611f7a565b50807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b888860405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2610a35565b60055460026000196101006001841615020190911604610a355760405162461bcd60e51b81526004018080602001828103825260298152602001806121736029913960400191505060405180910390fd5b610a7e610a40611352565b828a88888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061135692505050565b60008181526004602052604090208890559150509695505050505050565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b60006001600160e01b031982166303a24d0760e21b1415610ae557506001610af1565b610aee826113f7565b90505b919050565b6007805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b820191906000526020600020905b815481529060010190602001808311610b5f57829003601f168201915b505050505081565b6060610b8f82611423565b610bca5760405162461bcd60e51b81526004018080602001828103825260258152602001806121cc6025913960400191505060405180910390fd5b60008281526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610c5f5780601f10610c3457610100808354040283529160200191610c5f565b820191906000526020600020905b815481529060010190602001808311610c4257829003601f168201915b505060055493945050505060026000196101006001841615020190911604610c88579050610af1565b60058054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152610d469390929091830182828015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050610d2385611440565b60405180604001604052806005815260200164173539b7b760d91b815250611518565b9392505050565b60046020526000908152604090205481565b336001600160a01b0386161480610d7b5750610d7b8533611163565b610db65760405162461bcd60e51b815260040180806020018281038252602f81526020018061221d602f913960400191505060405180910390fd5b6001600160a01b038416610dfb5760405162461bcd60e51b815260040180806020018281038252603081526020018061219c6030913960400191505060405180910390fd5b610e078585858561154d565b610e15858585855a866117f8565b5050505050565b60608151835114610e5e5760405162461bcd60e51b815260040180806020018281038252602c8152602001806121f1602c913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610e7857600080fd5b50604051908082528060200260200182016040528015610ea2578160200160208202803683370190505b50905060005b8451811015610f2c57600080868381518110610ec057fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610ef657fe5b6020026020010151815260200190815260200160002054828281518110610f1957fe5b6020908102919091010152600101610ea8565b509392505050565b610f3c611352565b6002546001600160a01b03908116911614610f9e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6002546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600280546001600160a01b0319169055565b610ff0611352565b6002546001600160a01b03908116911614611052576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61105b816119f0565b50565b6002546001600160a01b031690565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610b7c5780601f10610b5157610100808354040283529160200191610b7c565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526004602052604090205490565b6009602052600090815260409020546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b336001600160a01b03861614806111ad57506111ad8533611163565b6111e85760405162461bcd60e51b815260040180806020018281038252602a8152602001806120e9602a913960400191505060405180910390fd5b6001600160a01b03841661122d5760405162461bcd60e51b815260040180806020018281038252602b815260200180612098602b913960400191505060405180910390fd5b61123985858585611a07565b610e15858585855a86611ae3565b61124f611352565b6002546001600160a01b039081169116146112b1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112f65760405162461bcd60e51b81526004018080602001828103825260268152602001806120c36026913960400191505060405180910390fd5b6002546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b0384166000908152602081815260408083208684529091529020546113829083611c55565b6001600160a01b038516600081815260208181526040808320888452825280832094909455835187815290810186905283519293919233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a46113f160008585855a86611ae3565b50505050565b60006001600160e01b03198216636cdb3d1360e11b141561141a57506001610af1565b610aee82611ca8565b6000908152600960205260409020546001600160a01b0316151590565b60608161146557506040805180820190915260018152600360fc1b6020820152610af1565b8160005b811561147d57600101600a82049150611469565b60608167ffffffffffffffff8111801561149657600080fd5b506040519080825280601f01601f1916602001820160405280156114c1576020820181803683370190505b50905060001982015b851561150f57600a860660300160f81b828280600190039350815181106114ed57fe5b60200101906001600160f81b031916908160001a905350600a860495506114ca565b50949350505050565b60606115458484846040518060200160405280600081525060405180602001604052806000815250611cc1565b949350505050565b805182511461158d5760405162461bcd60e51b815260040180806020018281038252603581526020018061213e6035913960400191505060405180910390fd5b815160005b81811015611717576116088382815181106115a957fe5b6020026020010151600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106115e357fe5b6020026020010151815260200190815260200160002054611ee690919063ffffffff16565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061163a57fe5b60200260200101518152602001908152602001600020819055506116c283828151811061166357fe5b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600087858151811061169d57fe5b6020026020010151815260200190815260200160002054611c5590919063ffffffff16565b600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106116f457fe5b602090810291909101810151825281019190915260400160002055600101611592565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561179d578181015183820152602001611785565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156117dc5781810151838201526020016117c4565b5050505090500194505050505060405180910390a45050505050565b61180a856001600160a01b0316611f43565b156119e8576000856001600160a01b031663bc197c8184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561189b578181015183820152602001611883565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156118da5781810151838201526020016118c2565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156119165781810151838201526020016118fe565b50505050905090810190601f1680156119435780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600088803b15801561196857600080fd5b5087f115801561197c573d6000803e3d6000fd5b50505050506040513d602081101561199357600080fd5b505190506001600160e01b0319811663bc197c8160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603f81526020018061224c603f913960400191505060405180910390fd5b505b505050505050565b8051611a03906005906020840190612006565b5050565b6001600160a01b038416600090815260208181526040808320858452909152902054611a339082611ee6565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054611a769082611c55565b6001600160a01b03808516600081815260208181526040808320888452825291829020949094558051868152938401859052805191939288169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a450505050565b611af5856001600160a01b0316611f43565b156119e8576000856001600160a01b031663f23a6e6184338a8989886040518763ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611b87578181015183820152602001611b6f565b50505050905090810190601f168015611bb45780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600088803b158015611bd757600080fd5b5087f1158015611beb573d6000803e3d6000fd5b50505050506040513d6020811015611c0257600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146119e65760405162461bcd60e51b815260040180806020018281038252603a81526020018061228b603a913960400191505060405180910390fd5b600082820183811015610d46576040805162461bcd60e51b8152602060048201526016602482015275536166654d617468236164643a204f564552464c4f5760501b604482015290519081900360640190fd5b6001600160e01b031981166301ffc9a760e01b14919050565b805182518451865188516060948a948a948a948a948a948a94919092019092019091010167ffffffffffffffff81118015611cfb57600080fd5b506040519080825280601f01601f191660200182016040528015611d26576020820181803683370190505b509050806000805b8851811015611d7f57888181518110611d4357fe5b602001015160f81c60f81b838380600101945081518110611d6057fe5b60200101906001600160f81b031916908160001a905350600101611d2e565b5060005b8751811015611dd457878181518110611d9857fe5b602001015160f81c60f81b838380600101945081518110611db557fe5b60200101906001600160f81b031916908160001a905350600101611d83565b5060005b8651811015611e2957868181518110611ded57fe5b602001015160f81c60f81b838380600101945081518110611e0a57fe5b60200101906001600160f81b031916908160001a905350600101611dd8565b5060005b8551811015611e7e57858181518110611e4257fe5b602001015160f81c60f81b838380600101945081518110611e5f57fe5b60200101906001600160f81b031916908160001a905350600101611e2d565b5060005b8451811015611ed357848181518110611e9757fe5b602001015160f81c60f81b838380600101945081518110611eb457fe5b60200101906001600160f81b031916908160001a905350600101611e82565b50909d9c50505050505050505050505050565b600082821115611f3d576040805162461bcd60e51b815260206004820152601760248201527f536166654d617468237375623a20554e444552464c4f57000000000000000000604482015290519081900360640190fd5b50900390565b6000813f8015801590610d4657507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611fb05760008555611ff6565b82601f10611fc95782800160ff19823516178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578235825591602001919060010190611fdb565b50612002929150612082565b5090565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261203c5760008555611ff6565b82601f1061205557805160ff1916838001178555611ff6565b82800160010185558215611ff6579182015b82811115611ff6578251825591602001919060010190612067565b5b80821115612002576000815560010161208356fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f52417274546f6b656e45524331313535236372656174654172743a205449544c455f4e4f545f554e4951554545524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e475448417274546f6b656e45524331313535236372656174654172743a204e4f5f44454641554c545f55524945524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a2646970667358221220f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f464736f6c63430007040033
Deployed Bytecode Sourcemap
200:4048:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1857:717;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1857:717:1;;;;;;;;;;-1:-1:-1;1857:717:1;;-1:-1:-1;1857:717:1;-1:-1:-1;1857:717:1;:::i;:::-;;;;;;;;;;;;;;;;7067:132:3;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7067:132:3;;;;;;;;:::i;3679:234:1:-;;;;;;;;;;;;;;;;-1:-1:-1;3679:234:1;-1:-1:-1;;;;;;3679:234:1;;:::i;:::-;;;;;;;;;;;;;;;;;;1022:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:365;;;;;;;;;;;;;;;;-1:-1:-1;2849:365:1;;:::i;356:47::-;;;;;;;;;;;;;;;;-1:-1:-1;356:47:1;;:::i;2252:522:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2252:522:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2252:522:3;;-1:-1:-1;2252:522:3;;-1:-1:-1;;;;;2252:522:3:i;:::-;;7479:495;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7479:495:3;;;;;;;;-1:-1:-1;7479:495:3;;-1:-1:-1;;;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7479:495:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7479:495:3;;-1:-1:-1;7479:495:3;;-1:-1:-1;;;;;7479:495:3:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1701:145:10;;;:::i;1387:139:1:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1387:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1387:139:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1387:139:1;;-1:-1:-1;1387:139:1;;-1:-1:-1;;;;;1387:139:1:i;1078:77:10:-;;;:::i;:::-;;;;-1:-1:-1;;;;;1078:77:10;;;;;;;;;;;;;;1065:20:1;;;:::i;6075:230:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6075:230:3;;;;;;;;;;:::i;2738:106:1:-;;;;;;;;;;;;;;;;-1:-1:-1;2738:106:1;;:::i;1090:44::-;;;;;;;;;;;;;;;;-1:-1:-1;1090:44:1;;:::i;6567:160:3:-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6567:160:3;;;;;;;;;;:::i;1313:556::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1313:556:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1313:556:3;;-1:-1:-1;1313:556:3;;-1:-1:-1;;;;;1313:556:3:i;1995:240:10:-;;;;;;;;;;;;;;;;-1:-1:-1;1995:240:10;-1:-1:-1;;;;;1995:240:10;;:::i;1857:717:1:-;2030:24;;;;;;;;;;;;;;;;;;;;;;;;2020:35;;;;;;;;;1993:4;2070:19;;;:13;:19;;;;;;;1993:4;;2020:35;2070:19;;2069:20;2061:76;;;;-1:-1:-1;;;2061:76:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2143:19;;;;:13;:19;;;;;;;;:26;;-1:-1:-1;;2143:26:1;2165:4;2143:26;;;;;;2176:15;:20;;;;;;;;;2238:13;;;:8;:13;;;;;;:26;;-1:-1:-1;;;;;;2238:26:1;2254:10;2238:26;;;2275:22;;2271:200;;2307:15;;;;:10;:15;;;;;:22;;2325:4;;2307:22;:::i;:::-;;2352:3;2342:14;2346:4;;2342:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2342:14:1;;;;;;;;-1:-1:-1;2342:14:1;;-1:-1:-1;;;;2342:14:1;2271:200;;;2391:15;2385:29;;-1:-1:-1;;2385:29:1;;;;;;;;;;;2377:87;;;;-1:-1:-1;;;2377:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2477:42;2483:12;:10;:12::i;:::-;2497:3;2502:9;2513:5;;2477:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2477:5:1;;-1:-1:-1;;;2477:42:1:i;:::-;2525:16;;;;:11;:16;;;;;:28;;;2537:3;-1:-1:-1;;1857:717:1;;;;;;;;:::o;7067:132:3:-;-1:-1:-1;;;;;7173:16:3;;;;7149:7;7173:16;;;;;;;;;;;:21;;;;;;;;;7067:132::o;3679:234:1:-;3765:4;-1:-1:-1;;;;;;3781:50:1;;-1:-1:-1;;;3781:50:1;3777:82;;;-1:-1:-1;3848:4:1;3841:11;;3777:82;3871:37;3895:12;3871:23;:37::i;:::-;3864:44;;3679:234;;;;:::o;1022:18::-;;;;;;;;;;;;;;;-1:-1:-1;;1022:18:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2849:365::-;2913:13;2942:12;2950:3;2942:7;:12::i;:::-;2934:62;;;;-1:-1:-1;;;2934:62:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:15;;;;:10;:15;;;;;;;;;3003:41;;;;;;-1:-1:-1;;3003:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:41;;;3029:15;3003:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3061:15:1;3055:29;3003:41;;-1:-1:-1;;;;3055:29:1;-1:-1:-1;;3055:29:1;;;;;;;;;;;3051:71;;3106:9;-1:-1:-1;3099:16:1;;3051:71;3157:15;3135:74;;;;;;;;-1:-1:-1;;3135:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3157:15;;3135:74;;3157:15;3135:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3174:25;3195:3;3174:20;:25::i;:::-;3135:74;;;;;;;;;;;;;-1:-1:-1;;;3135:74:1;;;:21;:74::i;:::-;3128:81;2849:365;-1:-1:-1;;;2849:365:1:o;356:47::-;;;;;;;;;;;;;:::o;2252:522:3:-;2438:10;-1:-1:-1;;;;;2438:19:3;;;;2437:60;;;2462:35;2479:5;2486:10;2462:16;:35::i;:::-;2429:120;;;;-1:-1:-1;;;2429:120:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2563:17:3;;2555:78;;;;-1:-1:-1;;;2555:78:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2640:50;2663:5;2670:3;2675:4;2681:8;2640:22;:50::i;:::-;2696:73;2724:5;2731:3;2736:4;2742:8;2752:9;2763:5;2696:27;:73::i;:::-;2252:522;;;;;:::o;7479:495::-;7586:16;7638:4;:11;7620:7;:14;:29;7612:86;;;;-1:-1:-1;;;7612:86:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7722:30;7769:7;:14;7755:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7755:29:3;;7722:62;;7840:9;7835:108;7859:7;:14;7855:1;:18;7835:108;;;7907:8;:20;7916:7;7924:1;7916:10;;;;;;;;;;;;;;-1:-1:-1;;;;;7907:20:3;-1:-1:-1;;;;;7907:20:3;;;;;;;;;;;;:29;7928:4;7933:1;7928:7;;;;;;;;;;;;;;7907:29;;;;;;;;;;;;7888:13;7902:1;7888:16;;;;;;;;;;;;;;;;;:48;7875:3;;7835:108;;;-1:-1:-1;7956:13:3;7479:495;-1:-1:-1;;;7479:495:3:o;1701:145:10:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1791:6:::1;::::0;1770:40:::1;::::0;1807:1:::1;::::0;-1:-1:-1;;;;;1791:6:10::1;::::0;1770:40:::1;::::0;1807:1;;1770:40:::1;1820:6;:19:::0;;-1:-1:-1;;;;;;1820:19:10::1;::::0;;1701:145::o;1387:139:1:-;1292:12:10;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1481:40:1::1;1501:19;1481;:40::i;:::-;1387:139:::0;:::o;1078:77:10:-;1142:6;;-1:-1:-1;;;;;1142:6:10;1078:77;:::o;1065:20:1:-;;;;;;;;;;;;;;;-1:-1:-1;;1065:20:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6075:230:3;6207:10;6197:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;6197:32:3;;;;;;;;;;;;:44;;-1:-1:-1;;6197:44:3;;;;;;;;;;6252:48;;;;;;;6197:32;;6207:10;6252:48;;;;;;;;;;;6075:230;;:::o;2738:106:1:-;2801:7;2823:16;;;:11;:16;;;;;;;2738:106::o;1090:44::-;;;;;;;;;;;;-1:-1:-1;;;;;1090:44:1;;:::o;6567:160:3:-;-1:-1:-1;;;;;6694:17:3;;;6662:15;6694:17;;;:9;:17;;;;;;;;:28;;;;;;;;;;;;;;;6567:160::o;1313:556::-;1454:10;-1:-1:-1;;;;;1454:19:3;;;;1453:60;;;1478:35;1495:5;1502:10;1478:16;:35::i;:::-;1445:115;;;;-1:-1:-1;;;1445:115:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1574:17:3;;1566:72;;;;-1:-1:-1;;;1566:72:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1749:43;1767:5;1774:3;1779;1784:7;1749:17;:43::i;:::-;1798:66;1821:5;1828:3;1833;1838:7;1847:9;1858:5;1798:22;:66::i;1995:240:10:-;1292:12;:10;:12::i;:::-;1282:6;;-1:-1:-1;;;;;1282:6:10;;;:22;;;1274:67;;;;;-1:-1:-1;;;1274:67:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2083:22:10;::::1;2075:73;;;;-1:-1:-1::0;;;2075:73:10::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:6;::::0;2163:38:::1;::::0;-1:-1:-1;;;;;2163:38:10;;::::1;::::0;2184:6:::1;::::0;2163:38:::1;::::0;2184:6:::1;::::0;2163:38:::1;2211:6;:17:::0;;-1:-1:-1;;;;;;2211:17:10::1;-1:-1:-1::0;;;;;2211:17:10;;;::::1;::::0;;;::::1;::::0;;1995:240::o;598:104:2:-;685:10;598:104;:::o;716:401:5:-;-1:-1:-1;;;;;855:13:5;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:31;;878:7;855:22;:31::i;:::-;-1:-1:-1;;;;;834:13:5;;:8;:13;;;;;;;;;;;:18;;;;;;;;:52;;;;916:59;;;;;;;;;;;;;834:13;;:8;;931:10;;916:59;;;;;;;;1039:73;1070:3;1076;1081;1086:7;1095:9;1106:5;1039:22;:73::i;:::-;716:401;;;;:::o;8311:226:3:-;8397:4;-1:-1:-1;;;;;;8413:42:3;;-1:-1:-1;;;8413:42:3;8409:74;;;-1:-1:-1;8472:4:3;8465:11;;8409:74;8495:37;8519:12;8495:23;:37::i;4134:112:1:-;4195:4;4214:13;;;:8;:13;;;;;;-1:-1:-1;;;;;4214:13:1;:27;;;4134:112::o;1448:389:12:-;1498:27;1537:7;1533:38;;-1:-1:-1;1554:10:12;;;;;;;;;;;;-1:-1:-1;;;1554:10:12;;;;;;1533:38;1585:2;1576:6;1607:50;1614:6;;1607:50;;1630:5;;1648:2;1643:7;;;;1607:50;;;1662:17;1692:3;1682:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1682:14:12;-1:-1:-1;1662:34:12;-1:-1:-1;;;1711:7:12;;1724:84;1731:7;;1724:84;;1781:2;1776;:7;1771:2;:12;1760:25;;1748:4;1753:3;;;;;;;1748:9;;;;;;;;;;;:37;-1:-1:-1;;;;;1748:37:12;;;;;;;;-1:-1:-1;1799:2:12;1793:8;;;;1724:84;;;-1:-1:-1;1827:4:12;1448:389;-1:-1:-1;;;;1448:389:12:o;1142:158::-;1238:13;1266:29;1276:2;1280;1284;1266:29;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;1259:36;1142:158;-1:-1:-1;;;;1142:158:12:o;4392:670:3:-;4546:8;:15;4531:4;:11;:30;4523:96;;;;-1:-1:-1;;;4523:96:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4683:11;;4663:17;4732:243;4756:9;4752:1;:13;4732:243;;;4855:41;4884:8;4893:1;4884:11;;;;;;;;;;;;;;4855:8;:15;4864:5;-1:-1:-1;;;;;4855:15:3;-1:-1:-1;;;;;4855:15:3;;;;;;;;;;;;:24;4871:4;4876:1;4871:7;;;;;;;;;;;;;;4855:24;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;4828:8;:15;4837:5;-1:-1:-1;;;;;4828:15:3;-1:-1:-1;;;;;4828:15:3;;;;;;;;;;;;:24;4844:4;4849:1;4844:7;;;;;;;;;;;;;;4828:24;;;;;;;;;;;:68;;;;4929:39;4956:8;4965:1;4956:11;;;;;;;;;;;;;;4929:8;:13;4938:3;-1:-1:-1;;;;;4929:13:3;-1:-1:-1;;;;;4929:13:3;;;;;;;;;;;;:22;4943:4;4948:1;4943:7;;;;;;;;;;;;;;4929:22;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;4904:8;:13;4913:3;-1:-1:-1;;;;;4904:13:3;-1:-1:-1;;;;;4904:13:3;;;;;;;;;;;;:22;4918:4;4923:1;4918:7;;;;;;;;;;;;;;;;;;;4904:22;;;;;;;;;;-1:-1:-1;4904:22:3;:64;4767:3;;4732:243;;;;5037:3;-1:-1:-1;;;;;5004:53:3;5030:5;-1:-1:-1;;;;;5004:53:3;5018:10;-1:-1:-1;;;;;5004:53:3;;5042:4;5048:8;5004:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4392:670;;;;;:::o;5175:503::-;5396:16;:3;-1:-1:-1;;;;;5396:14:3;;:16::i;:::-;5392:282;;;5422:13;5460:3;-1:-1:-1;;;;;5438:49:3;;5493:9;5504:10;5516:5;5523:4;5529:8;5539:5;5438:107;;;;;;;;;;;;;-1:-1:-1;;;;;5438:107:3;;;;;;-1:-1:-1;;;;;5438:107:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5438:107:3;;-1:-1:-1;;;;;;;5561:38:3;;-1:-1:-1;;;5561:38:3;5553:114;;;;-1:-1:-1;;;5553:114:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5392:282;;5175:503;;;;;;:::o;3343:121:1:-;3422:37;;;;:15;;:37;;;;;:::i;:::-;;3343:121;:::o;3164:367:3:-;-1:-1:-1;;;;;3316:15:3;;:8;:15;;;;;;;;;;;:20;;;;;;;;;:33;;3341:7;3316:24;:33::i;:::-;-1:-1:-1;;;;;3293:15:3;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:56;;;;3395:13;;;;;;;;;;;:18;;;;;;;;:31;;3418:7;3395:22;:31::i;:::-;-1:-1:-1;;;;;3374:13:3;;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:52;;;;3474;;;;;;;;;;;;;3374:13;;3474:52;;;;3489:10;;3474:52;;;;;;;;;;;3164:367;;;;:::o;3639:456::-;3831:16;:3;-1:-1:-1;;;;;3831:14:3;;:16::i;:::-;3827:264;;;3857:13;3895:3;-1:-1:-1;;;;;3873:44:3;;3923:9;3934:10;3946:5;3953:3;3958:7;3967:5;3873:100;;;;;;;;;;;;;-1:-1:-1;;;;;3873:100:3;;;;;;-1:-1:-1;;;;;3873:100:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3873:100:3;;-1:-1:-1;;;;;;;3989:32:3;;-1:-1:-1;;;3989:32:3;3981:103;;;;-1:-1:-1;;;3981:103:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1419:158:11;1477:7;1504:5;;;1523:6;;;;1515:41;;;;;-1:-1:-1;;;1515:41:11;;;;;;;;;;;;-1:-1:-1;;;1515:41:11;;;;;;;;;;;;;;259:148:6;-1:-1:-1;;;;;;355:47:6;;-1:-1:-1;;;355:47:6;259:148;;;:::o;131:827:12:-;539:10;;526;;513;;500;;487;;263:13;;309:2;;343;;377;;411;;445;;263:13;;487:23;;;;:36;;;:49;;;:62;476:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;476:74:12;-1:-1:-1;454:96:12;-1:-1:-1;454:96:12;596:6;;612:58;633:3;:10;629:1;:14;612:58;;;664:3;668:1;664:6;;;;;;;;;;;;;;;;650;657:3;;;;;;650:11;;;;;;;;;;;:20;-1:-1:-1;;;;;650:20:12;;;;;;;;-1:-1:-1;645:3:12;;612:58;;;;681:6;676:58;697:3;:10;693:1;:14;676:58;;;728:3;732:1;728:6;;;;;;;;;;;;;;;;714;721:3;;;;;;714:11;;;;;;;;;;;:20;-1:-1:-1;;;;;714:20:12;;;;;;;;-1:-1:-1;709:3:12;;676:58;;;;745:6;740:58;761:3;:10;757:1;:14;740:58;;;792:3;796:1;792:6;;;;;;;;;;;;;;;;778;785:3;;;;;;778:11;;;;;;;;;;;:20;-1:-1:-1;;;;;778:20:12;;;;;;;;-1:-1:-1;773:3:12;;740:58;;;;809:6;804:58;825:3;:10;821:1;:14;804:58;;;856:3;860:1;856:6;;;;;;;;;;;;;;;;842;849:3;;;;;;842:11;;;;;;;;;;;:20;-1:-1:-1;;;;;842:20:12;;;;;;;;-1:-1:-1;837:3:12;;804:58;;;;873:6;868:58;889:3;:10;885:1;:14;868:58;;;920:3;924:1;920:6;;;;;;;;;;;;;;;;906;913:3;;;;;;906:11;;;;;;;;;;;:20;-1:-1:-1;;;;;906:20:12;;;;;;;;-1:-1:-1;901:3:12;;868:58;;;-1:-1:-1;946:6:12;;131:827;-1:-1:-1;;;;;;;;;;;;;131:827:12:o;1186:158:11:-;1244:7;1272:1;1267;:6;;1259:42;;;;;-1:-1:-1;;;1259:42:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1319:5:11;;;1186:158::o;541:398:0:-;602:4;854:21;;890:15;;;;;:43;;-1:-1:-1;206:66:0;909:24;;;541:398;-1:-1:-1;;541:398:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://f993c926a758b9314fe9f1a1d0ffd6ae2f59f73d7d7c89730f70f1ae215a67f4
Loading...
Loading
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.