ERC-721
Overview
Max Total Supply
5,464 AZUR
Holders
972
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
11 AZURLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Azurian
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import {MultiOwnable} from "./MultiOwnable.sol"; import {ERC721} from "solmate/tokens/ERC721.sol"; import {ERC2981} from "openzeppelin-contracts/contracts/token/common/ERC2981.sol"; import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol"; import {DefaultOperatorFilterer} from "operator-filter-registry/DefaultOperatorFilterer.sol"; import {IAzurian} from "./AzurRoot.sol"; contract Azurian is IAzurian, DefaultOperatorFilterer, ERC721, ERC2981, MultiOwnable { /// @notice The Azur Root contract address public immutable ROOT; /// @notice Total number of tokens which have minted uint256 public totalSupply = 0; /// @notice The prefix to attach to the tokenId to get the metadata uri string public baseTokenURI; /// @notice Whether the minting is open bool public mintOpen; /// @notice Thrown when the mint is not yet open error MintNotOpen(); /// @notice Thrown when metadata is queried for a nonexistent token error TokenDoesNotExist(); constructor(address _root) ERC721("Azurian", "AZUR") { ROOT = _root; } function burnRootAndMint(uint256[] calldata rootIds) external { if (msg.sender != ROOT) revert AccessControl(); if (!mintOpen) revert MintNotOpen(); unchecked { for (uint256 i = 0; i < rootIds.length; ++i) { _mint(tx.origin, rootIds[i]); } } totalSupply += rootIds.length; } ///////////////////////// // ADMIN FUNCTIONALITY // ///////////////////////// /// @notice Set metadata function setBaseTokenURI(string memory _baseTokenURI) external { if (msg.sender != metadataOwner) { revert AccessControl(); } baseTokenURI = _baseTokenURI; } /// @notice Set mint open function setMintOpen(bool _mintOpen) external { if (msg.sender != mintingOwner) { revert AccessControl(); } mintOpen = _mintOpen; } // ROYALTY FUNCTIONALITY /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) { return interfaceId == 0x2a55205a // ERC165 Interface ID for ERC2981 || interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /// @dev See {ERC2981-_setDefaultRoyalty}. function setDefaultRoyalty(address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setDefaultRoyalty(receiver, feeNumerator); } /// @dev See {ERC2981-_deleteDefaultRoyalty}. function deleteDefaultRoyalty() external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _deleteDefaultRoyalty(); } /// @dev See {ERC2981-_setTokenRoyalty}. function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setTokenRoyalty(tokenId, receiver, feeNumerator); } /// @dev See {ERC2981-_resetTokenRoyalty}. function resetTokenRoyalty(uint256 tokenId) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _resetTokenRoyalty(tokenId); } // METADATA FUNCTIONALITY /// @notice Returns the metadata URI for a given token function tokenURI(uint256 tokenId) public view override returns (string memory) { if (_ownerOf[tokenId] == address(0)) revert TokenDoesNotExist(); return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId))); } // OPERATOR FILTER function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; abstract contract MultiOwnable { /// @notice The address which can admin mint for free, set merkle roots, and set auction params address public mintingOwner; /// @notice The address which can update the metadata uri address public metadataOwner; /// @notice The address which will be returned for the ERC721 owner() standard for setting royalties address public royaltyOwner; /// @notice Raised when an unauthorized user calls a gated function error AccessControl(); constructor() { mintingOwner = msg.sender; metadataOwner = msg.sender; royaltyOwner = msg.sender; } modifier onlyMintingOwner() { if (msg.sender != mintingOwner) { revert AccessControl(); } _; } modifier onlyMetadataOwner() { if (msg.sender != metadataOwner) { revert AccessControl(); } _; } modifier onlyRoyaltyOwner() { if (msg.sender != royaltyOwner) { revert AccessControl(); } _; } //////////////////////////////////// // ACCESS CONTROL ADDRESS UPDATES // //////////////////////////////////// /// @notice Update the mintingOwner /// @dev Can also be used to revoke this power by setting to 0x0 function setMintingOwner(address _mintingOwner) external onlyMintingOwner { mintingOwner = _mintingOwner; } /// @notice Update the metadataOwner /// @dev Can also be used to revoke this power by setting to 0x0 /// @dev Should only be revoked after setting an IPFS url so others can pin function setMetadataOwner(address _metadataOwner) external onlyMetadataOwner { metadataOwner = _metadataOwner; } /// @notice Update the royaltyOwner /// @dev Can also be used to revoke this power by setting to 0x0 function setRoyaltyOwner(address _royaltyOwner) external onlyRoyaltyOwner { royaltyOwner = _royaltyOwner; } /// @notice The address which can set royalties function owner() external view returns (address) { return royaltyOwner; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "../../interfaces/IERC2981.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.21; import {MultiOwnable} from "./MultiOwnable.sol"; import {IDelegationRegistry} from "./IDelegationRegistry.sol"; import {ERC721} from "solmate/tokens/ERC721.sol"; import {ERC2981} from "openzeppelin-contracts/contracts/token/common/ERC2981.sol"; import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol"; import {DefaultOperatorFilterer} from "operator-filter-registry/DefaultOperatorFilterer.sol"; interface IERC721 { function ownerOf(uint256 tokenId) external view returns (address); function transferFrom(address from, address to, uint256 id) external; } interface IAzurian { function burnRootAndMint(uint256[] calldata rootIds) external; } contract AzurRoot is DefaultOperatorFilterer, ERC721, ERC2981, MultiOwnable { /// @notice The Bored and Dangerous contract address public immutable BOOK; /// @notice Total number of tokens which have minted uint256 public totalSupply = 0; /// @notice The prefix to attach to the tokenId to get the metadata uri string public baseTokenURI; /// @notice Whether the burning is open bool public burnOpen; /// @notice The delegation registry for burning root authentication IDelegationRegistry public constant delegationRegistry = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B); /// @notice Emitted when a token is minted event Mint(address indexed owner, uint256 indexed tokenId); /// @notice Raised when the mint has not reached the required timestamp error MintNotOpen(); /// @notice Raised when two calldata arrays do not have the same length error MismatchedArrays(); /// @notice Raised when `sender` does not pass the proper ether amount to `recipient` error FailedToSendEther(address sender, address recipient); /// @notice Raised when `msg.sender` does not own the roots they're attempting to burn error BurnAuthentication(); constructor(address _book) ERC721("Azur Root", "ROOT") { BOOK = _book; } /// @notice Admin mint a batch of tokens function ownerMint(address[] calldata recipients) external { if (msg.sender != mintingOwner) { revert AccessControl(); } unchecked { uint256 _totalSupply = totalSupply; for (uint256 i = 0; i < recipients.length; ++i) { _mint(recipients[i], _totalSupply + i); } totalSupply += recipients.length; } } /// @notice Burn a token function burn(uint256 id) external { address from = _ownerOf[id]; require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); _burn(id); } ////////////////// // BOOK BURNING // ////////////////// /// @notice Burn a book to receive an azur root function burnBooks(uint256[] calldata tokenIds) external { if (!burnOpen) { revert MintNotOpen(); } // Cache the totalSupply to minimize storage reads uint256 _totalSupply = totalSupply; for (uint256 i = 0; i < tokenIds.length; ++i) { // Attempt to transfer token from the msg sender, revert if not owned or approved IERC721(BOOK).transferFrom(msg.sender, address(this), tokenIds[i]); _mint(msg.sender, _totalSupply + i); } totalSupply += tokenIds.length; } /// @notice Burn a root to receive an azurian function burnRoots(address azurians, uint256[] calldata rootIds) external { for (uint256 i = 0; i < rootIds.length; ++i) { address rootOwner = ownerOf(rootIds[i]); if ( !( msg.sender == rootOwner || delegationRegistry.checkDelegateForToken(msg.sender, rootOwner, address(this), rootIds[i]) ) ) { revert BurnAuthentication(); } _burn(rootIds[i]); } IAzurian(azurians).burnRootAndMint(rootIds); } ///////////////////////// // ADMIN FUNCTIONALITY // ///////////////////////// /// @notice Set metadata function setBaseTokenURI(string memory _baseTokenURI) external { if (msg.sender != metadataOwner) { revert AccessControl(); } baseTokenURI = _baseTokenURI; } /// @notice Set burn open function setBurnOpen(bool _burnOpen) external { if (msg.sender != mintingOwner) { revert AccessControl(); } burnOpen = _burnOpen; } /// @notice Claim funds function claimFunds(address payable recipient) external { if (!(msg.sender == mintingOwner || msg.sender == metadataOwner || msg.sender == royaltyOwner)) { revert AccessControl(); } (bool sent,) = recipient.call{value: address(this).balance}(""); if (!sent) { revert FailedToSendEther(address(this), recipient); } } // ROYALTY FUNCTIONALITY /// @dev See {IERC165-supportsInterface}. function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) { return interfaceId == 0x2a55205a // ERC165 Interface ID for ERC2981 || interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165 || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721 || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /// @dev See {ERC2981-_setDefaultRoyalty}. function setDefaultRoyalty(address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setDefaultRoyalty(receiver, feeNumerator); } /// @dev See {ERC2981-_deleteDefaultRoyalty}. function deleteDefaultRoyalty() external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _deleteDefaultRoyalty(); } /// @dev See {ERC2981-_setTokenRoyalty}. function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _setTokenRoyalty(tokenId, receiver, feeNumerator); } /// @dev See {ERC2981-_resetTokenRoyalty}. function resetTokenRoyalty(uint256 tokenId) external { if (msg.sender != royaltyOwner) { revert AccessControl(); } _resetTokenRoyalty(tokenId); } // METADATA FUNCTIONALITY /// @notice Returns the metadata URI for a given token function tokenURI(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId))); } // OPERATOR FILTER function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// SPDX-License-Identifier: CC0-1.0 pragma solidity ^0.8.17; /** * @title An immutable registry contract to be deployed as a standalone primitive * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations * from here and integrate those permissions into their flow */ interface IDelegationRegistry { /// @notice Delegation type enum DelegationType { NONE, ALL, CONTRACT, TOKEN } /// @notice Info about a single delegation, used for onchain enumeration struct DelegationInfo { DelegationType type_; address vault; address delegate; address contract_; uint256 tokenId; } /// @notice Info about a single contract-level delegation struct ContractDelegation { address contract_; address delegate; } /// @notice Info about a single token-level delegation struct TokenDelegation { address contract_; uint256 tokenId; address delegate; } /// @notice Emitted when a user delegates their entire wallet event DelegateForAll(address vault, address delegate, bool value); /// @notice Emitted when a user delegates a specific contract event DelegateForContract(address vault, address delegate, address contract_, bool value); /// @notice Emitted when a user delegates a specific token event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value); /// @notice Emitted when a user revokes all delegations event RevokeAllDelegates(address vault); /// @notice Emitted when a user revoes all delegations for a given delegate event RevokeDelegate(address vault, address delegate); /** * ----------- WRITE ----------- */ /** * @notice Allow the delegate to act on your behalf for all contracts * @param delegate The hotwallet to act on your behalf * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForAll(address delegate, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific contract * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForContract(address delegate, address contract_, bool value) external; /** * @notice Allow the delegate to act on your behalf for a specific token * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking */ function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external; /** * @notice Revoke all delegates */ function revokeAllDelegates() external; /** * @notice Revoke a specific delegate for all their permissions * @param delegate The hotwallet to revoke */ function revokeDelegate(address delegate) external; /** * @notice Remove yourself as a delegate for a specific vault * @param vault The vault which delegated to the msg.sender, and should be removed */ function revokeSelf(address vault) external; /** * ----------- READ ----------- */ /** * @notice Returns all active delegations a given delegate is able to claim on behalf of * @param delegate The delegate that you would like to retrieve delegations for * @return info Array of DelegationInfo structs */ function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory); /** * @notice Returns an array of wallet-level delegates for a given vault * @param vault The cold wallet who issued the delegation * @return addresses Array of wallet-level delegates for a given vault */ function getDelegatesForAll(address vault) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault and contract * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract you're delegating * @return addresses Array of contract-level delegates for a given vault and contract */ function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory); /** * @notice Returns an array of contract-level delegates for a given vault's token * @param vault The cold wallet who issued the delegation * @param contract_ The address for the contract holding the token * @param tokenId The token id for the token you're delegating * @return addresses Array of contract-level delegates for a given vault's token */ function getDelegatesForToken(address vault, address contract_, uint256 tokenId) external view returns (address[] memory); /** * @notice Returns all contract-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of ContractDelegation structs */ function getContractLevelDelegations(address vault) external view returns (ContractDelegation[] memory delegations); /** * @notice Returns all token-level delegations for a given vault * @param vault The cold wallet who issued the delegations * @return delegations Array of TokenDelegation structs */ function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations); /** * @notice Returns true if the address is delegated to act on the entire vault * @param delegate The hotwallet to act on your behalf * @param vault The cold wallet who issued the delegation */ function checkDelegateForAll(address delegate, address vault) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForContract(address delegate, address vault, address contract_) external view returns (bool); /** * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault * @param delegate The hotwallet to act on your behalf * @param contract_ The address for the contract you're delegating * @param tokenId The token id for the token you're delegating * @param vault The cold wallet who issued the delegation */ function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); }
{ "remappings": [ "@rari-capital/solmate/=lib/solmate/", "contracts/=contracts/", "ds-test/=lib/ds-test/src/", "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-std/=lib/forge-std/src/", "murky/=lib/murky/src/", "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "operator-filter-registry/=lib/operator-filter-registry/src/", "solmate/=lib/solmate/src/", "lib/murky:ds-test/=lib/murky/lib/forge-std/lib/ds-test/src/", "lib/murky:forge-std/=lib/murky/lib/forge-std/src/", "lib/murky:openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/", "lib/operator-filter-registry:ds-test/=lib/operator-filter-registry/lib/forge-std/lib/ds-test/src/", "lib/operator-filter-registry:erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/", "lib/operator-filter-registry:forge-std/=lib/operator-filter-registry/lib/forge-std/src/", "lib/operator-filter-registry:openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/contracts/", "lib/operator-filter-registry:openzeppelin-contracts/=lib/operator-filter-registry/lib/openzeppelin-contracts/contracts/", "lib/solmate:ds-test/=lib/solmate/lib/ds-test/src/" ], "optimizer": { "enabled": true, "runs": 9999 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "shanghai", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_root","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControl","type":"error"},{"inputs":[],"name":"MintNotOpen","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"rootIds","type":"uint256[]"}],"name":"burnRootAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metadataOwner","type":"address"}],"name":"setMetadataOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintOpen","type":"bool"}],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintingOwner","type":"address"}],"name":"setMintingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyOwner","type":"address"}],"name":"setRoyaltyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040525f600b5534801562000014575f80fd5b506040516200266d3803806200266d833981016040819052620000379162000223565b604080518082018252600781526620bd3ab934b0b760c91b6020808301919091528251808401909352600483526320ad2aa960e11b9083015290733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001c35780156200011657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b5f604051808303815f87803b158015620000f9575f80fd5b505af11580156200010c573d5f803e3d5ffd5b50505050620001c3565b6001600160a01b03821615620001675760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e1565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024015f604051808303815f87803b158015620001ab575f80fd5b505af1158015620001be573d5f803e3d5ffd5b505050505b505f9050620001d38382620002f2565b506001620001e28282620002f2565b505060088054336001600160a01b0319918216811790925560098054821683179055600a80549091169091179055506001600160a01b0316608052620003ba565b5f6020828403121562000234575f80fd5b81516001600160a01b03811681146200024b575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200027b57607f821691505b6020821081036200029a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002ed575f81815260208120601f850160051c81016020861015620002c85750805b601f850160051c820191505b81811015620002e957828155600101620002d4565b5050505b505050565b81516001600160401b038111156200030e576200030e62000252565b62000326816200031f845462000266565b84620002a0565b602080601f8311600181146200035c575f8415620003445750858301515b5f19600386901b1c1916600185901b178555620002e9565b5f85815260208120601f198616915b828110156200038c578886015182559484019460019091019084016200036b565b5085821015620003aa57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b608051612293620003da5f395f81816103790152610a4d01526122935ff3fe608060405234801561000f575f80fd5b5060043610610201575f3560e01c80635c49d2cb11610123578063aa1b103f116100b8578063d547cfb711610088578063e985e9c51161006e578063e985e9c514610495578063ecde3c89146104c2578063f8004d31146104d5575f80fd5b8063d547cfb71461047a578063db5eb70214610482575f80fd5b8063aa1b103f14610439578063b113c60814610441578063b88d4fde14610454578063c87b56dd14610467575f80fd5b80638a616bc0116100f35780638a616bc0146103fa5780638da5cb5b1461040d57806395d89b411461041e578063a22cb46514610426575f80fd5b80635c49d2cb146103ae5780636352211e146103c157806367c24000146103d457806370a08231146103e7575f80fd5b80632525b3d71161019957806341f434341161016957806341f434341461034c57806342842e0e146103615780635909c12f146103745780635944c7531461039b575f80fd5b80632525b3d7146102e15780632a55205a146102f457806330176e131461032657806335137cd014610339575f80fd5b8063095ea7b3116101d4578063095ea7b31461029757806318160ddd146102aa57806323b872dd146102c157806324bbd049146102d4575f80fd5b806301ffc9a71461020557806304634d8d1461022d57806306fdde0314610242578063081812fc14610257575b5f80fd5b610218610213366004611a13565b6104e8565b60405190151581526020015b60405180910390f35b61024061023b366004611a66565b610618565b005b61024a61066a565b6040516102249190611ab9565b61027f610265366004611b09565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610224565b6102406102a5366004611b20565b6106f5565b6102b3600b5481565b604051908152602001610224565b6102406102cf366004611b48565b61070e565b600d546102189060ff1681565b6102406102ef366004611b81565b610739565b610307610302366004611b9a565b6107b7565b604080516001600160a01b039093168352602083019190915201610224565b610240610334366004611be7565b610892565b610240610347366004611b81565b6108e2565b61027f6daaeb6d7670e522a718067333cd4e81565b61024061036f366004611b48565b610960565b61027f7f000000000000000000000000000000000000000000000000000000000000000081565b6102406103a9366004611cb0565b610985565b60085461027f906001600160a01b031681565b61027f6103cf366004611b09565b6109d4565b6102406103e2366004611ce9565b610a42565b6102b36103f5366004611b81565b610b32565b610240610408366004611b09565b610ba4565b600a546001600160a01b031661027f565b61024a610bfb565b610240610434366004611d65565b610c08565b610240610c1c565b60095461027f906001600160a01b031681565b610240610462366004611d9a565b610c6b565b61024a610475366004611b09565b610c9a565b61024a610d1c565b600a5461027f906001600160a01b031681565b6102186104a3366004611e2d565b600560209081525f928352604080842090915290825290205460ff1681565b6102406104d0366004611b81565b610d29565b6102406104e3366004611e55565b610da7565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061057a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105c657507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061061257507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600a546001600160a01b0316331461065c576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106668282610e1c565b5050565b5f805461067690611e70565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290611e70565b80156106ed5780601f106106c4576101008083540402835291602001916106ed565b820191905f5260205f20905b8154815290600101906020018083116106d057829003601f168201915b505050505081565b816106ff81610f47565b6107098383611030565b505050565b826001600160a01b03811633146107285761072833610f47565b610733848484611136565b50505050565b600a546001600160a01b0316331461077d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916108575750604080518082019091526006546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f906127109061087a906bffffffffffffffffffffffff1687611eee565b6108849190611f32565b915196919550909350505050565b6009546001600160a01b031633146108d6576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c6106668282611f8a565b6008546001600160a01b03163314610926576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b826001600160a01b038116331461097a5761097a33610f47565b61073384848461135d565b600a546001600160a01b031633146109c9576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61070983838361148a565b5f818152600260205260409020546001600160a01b031680610a3d5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aa4576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff16610ae0576040517f951b974f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b1457610b0c32848484818110610b0057610b006120a2565b905060200201356115c5565b600101610ae2565b5081819050600b5f828254610b2991906120cf565b90915550505050565b5f6001600160a01b038216610b895760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610a34565b506001600160a01b03165f9081526003602052604090205490565b600a546001600160a01b03163314610be8576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461067690611e70565b81610c1281610f47565b6107098383611701565b600a546001600160a01b03163314610c60576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c695f600655565b565b846001600160a01b0381163314610c8557610c8533610f47565b610c92868686868661178a565b505050505050565b5f818152600260205260409020546060906001600160a01b0316610cea576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c610cf5836118ad565b604051602001610d069291906120e2565b6040516020818303038152906040529050919050565b600c805461067690611e70565b6009546001600160a01b03163314610d6d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610deb576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6127106bffffffffffffffffffffffff82161115610ea25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b038216610ef85760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610a34565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600655565b6daaeb6d7670e522a718067333cd4e3b15610bf8576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612183565b610bf8576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a34565b5f818152600260205260409020546001600160a01b03163381148061107757506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6110c35760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b5f8281526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b0384811691161461119e5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382166111f45760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b336001600160a01b038416148061122d57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061124d57505f818152600460205260409020546001600160a01b031633145b6112995760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b038084165f81815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61136883838361070e565b6001600160a01b0382163b158061143e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156113f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141a919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6107095760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b6127106bffffffffffffffffffffffff821611156115105760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b0382166115665760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610a34565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182525f96875260079052919094209351905190911674010000000000000000000000000000000000000000029116179055565b6001600160a01b03821661161b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b5f818152600260205260409020546001600160a01b03161561167f5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61179585858561070e565b6001600160a01b0384163b158061185a57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906117f69033908a908990899089906004016121b9565b6020604051808303815f875af1158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6118a65760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b5050505050565b6060815f036118ef57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b8115611918578061190281612229565b91506119119050600a83611f32565b91506118f2565b5f8167ffffffffffffffff81111561193257611932611bba565b6040519080825280601f01601f19166020018201604052801561195c576020820181803683370190505b5090505b84156119de57611971600183612260565b915061197e600a86612273565b6119899060306120cf565b60f81b81838151811061199e5761199e6120a2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506119d7600a86611f32565b9450611960565b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf8575f80fd5b5f60208284031215611a23575f80fd5b8135611a2e816119e6565b9392505050565b80356001600160a01b0381168114610a3d575f80fd5b80356bffffffffffffffffffffffff81168114610a3d575f80fd5b5f8060408385031215611a77575f80fd5b611a8083611a35565b9150611a8e60208401611a4b565b90509250929050565b5f5b83811015611ab1578181015183820152602001611a99565b50505f910152565b602081525f8251806020840152611ad7816040850160208701611a97565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b611b3a83611a35565b946020939093013593505050565b5f805f60608486031215611b5a575f80fd5b611b6384611a35565b9250611b7160208501611a35565b9150604084013590509250925092565b5f60208284031215611b91575f80fd5b611a2e82611a35565b5f8060408385031215611bab575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611bf7575f80fd5b813567ffffffffffffffff80821115611c0e575f80fd5b818401915084601f830112611c21575f80fd5b813581811115611c3357611c33611bba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611c7957611c79611bba565b81604052828152876020848701011115611c91575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611cc2575f80fd5b83359250611cd260208501611a35565b9150611ce060408501611a4b565b90509250925092565b5f8060208385031215611cfa575f80fd5b823567ffffffffffffffff80821115611d11575f80fd5b818501915085601f830112611d24575f80fd5b813581811115611d32575f80fd5b8660208260051b8501011115611d46575f80fd5b60209290920196919550909350505050565b8015158114610bf8575f80fd5b5f8060408385031215611d76575f80fd5b611d7f83611a35565b91506020830135611d8f81611d58565b809150509250929050565b5f805f805f60808688031215611dae575f80fd5b611db786611a35565b9450611dc560208701611a35565b935060408601359250606086013567ffffffffffffffff80821115611de8575f80fd5b818801915088601f830112611dfb575f80fd5b813581811115611e09575f80fd5b896020828501011115611e1a575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611e3e575f80fd5b611e4783611a35565b9150611a8e60208401611a35565b5f60208284031215611e65575f80fd5b8135611a2e81611d58565b600181811c90821680611e8457607f821691505b602082108103611ebb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761061257610612611ec1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611f4057611f40611f05565b500490565b601f821115610709575f81815260208120601f850160051c81016020861015611f6b5750805b601f850160051c820191505b81811015610c9257828155600101611f77565b815167ffffffffffffffff811115611fa457611fa4611bba565b611fb881611fb28454611e70565b84611f45565b602080601f83116001811461200a575f8415611fd45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610c92565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205657888601518255948401946001909101908401612037565b508582101561209257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082018082111561061257610612611ec1565b5f8084546120ef81611e70565b60018281168015612107576001811461213a57612166565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612166565b885f526020805f205f5b8581101561215d5781548a820152908401908201612144565b50505082870194505b50505050835161217a818360208801611a97565b01949350505050565b5f60208284031215612193575f80fd5b8151611a2e81611d58565b5f602082840312156121ae575f80fd5b8151611a2e816119e6565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361225957612259611ec1565b5060010190565b8181038181111561061257610612611ec1565b5f8261228157612281611f05565b50069056fea164736f6c6343000815000a0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610201575f3560e01c80635c49d2cb11610123578063aa1b103f116100b8578063d547cfb711610088578063e985e9c51161006e578063e985e9c514610495578063ecde3c89146104c2578063f8004d31146104d5575f80fd5b8063d547cfb71461047a578063db5eb70214610482575f80fd5b8063aa1b103f14610439578063b113c60814610441578063b88d4fde14610454578063c87b56dd14610467575f80fd5b80638a616bc0116100f35780638a616bc0146103fa5780638da5cb5b1461040d57806395d89b411461041e578063a22cb46514610426575f80fd5b80635c49d2cb146103ae5780636352211e146103c157806367c24000146103d457806370a08231146103e7575f80fd5b80632525b3d71161019957806341f434341161016957806341f434341461034c57806342842e0e146103615780635909c12f146103745780635944c7531461039b575f80fd5b80632525b3d7146102e15780632a55205a146102f457806330176e131461032657806335137cd014610339575f80fd5b8063095ea7b3116101d4578063095ea7b31461029757806318160ddd146102aa57806323b872dd146102c157806324bbd049146102d4575f80fd5b806301ffc9a71461020557806304634d8d1461022d57806306fdde0314610242578063081812fc14610257575b5f80fd5b610218610213366004611a13565b6104e8565b60405190151581526020015b60405180910390f35b61024061023b366004611a66565b610618565b005b61024a61066a565b6040516102249190611ab9565b61027f610265366004611b09565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610224565b6102406102a5366004611b20565b6106f5565b6102b3600b5481565b604051908152602001610224565b6102406102cf366004611b48565b61070e565b600d546102189060ff1681565b6102406102ef366004611b81565b610739565b610307610302366004611b9a565b6107b7565b604080516001600160a01b039093168352602083019190915201610224565b610240610334366004611be7565b610892565b610240610347366004611b81565b6108e2565b61027f6daaeb6d7670e522a718067333cd4e81565b61024061036f366004611b48565b610960565b61027f7f0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c81565b6102406103a9366004611cb0565b610985565b60085461027f906001600160a01b031681565b61027f6103cf366004611b09565b6109d4565b6102406103e2366004611ce9565b610a42565b6102b36103f5366004611b81565b610b32565b610240610408366004611b09565b610ba4565b600a546001600160a01b031661027f565b61024a610bfb565b610240610434366004611d65565b610c08565b610240610c1c565b60095461027f906001600160a01b031681565b610240610462366004611d9a565b610c6b565b61024a610475366004611b09565b610c9a565b61024a610d1c565b600a5461027f906001600160a01b031681565b6102186104a3366004611e2d565b600560209081525f928352604080842090915290825290205460ff1681565b6102406104d0366004611b81565b610d29565b6102406104e3366004611e55565b610da7565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061057a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105c657507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061061257507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600a546001600160a01b0316331461065c576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106668282610e1c565b5050565b5f805461067690611e70565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290611e70565b80156106ed5780601f106106c4576101008083540402835291602001916106ed565b820191905f5260205f20905b8154815290600101906020018083116106d057829003601f168201915b505050505081565b816106ff81610f47565b6107098383611030565b505050565b826001600160a01b03811633146107285761072833610f47565b610733848484611136565b50505050565b600a546001600160a01b0316331461077d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916108575750604080518082019091526006546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f906127109061087a906bffffffffffffffffffffffff1687611eee565b6108849190611f32565b915196919550909350505050565b6009546001600160a01b031633146108d6576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c6106668282611f8a565b6008546001600160a01b03163314610926576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b826001600160a01b038116331461097a5761097a33610f47565b61073384848461135d565b600a546001600160a01b031633146109c9576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61070983838361148a565b5f818152600260205260409020546001600160a01b031680610a3d5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b919050565b336001600160a01b037f0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c1614610aa4576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff16610ae0576040517f951b974f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b1457610b0c32848484818110610b0057610b006120a2565b905060200201356115c5565b600101610ae2565b5081819050600b5f828254610b2991906120cf565b90915550505050565b5f6001600160a01b038216610b895760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610a34565b506001600160a01b03165f9081526003602052604090205490565b600a546001600160a01b03163314610be8576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461067690611e70565b81610c1281610f47565b6107098383611701565b600a546001600160a01b03163314610c60576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c695f600655565b565b846001600160a01b0381163314610c8557610c8533610f47565b610c92868686868661178a565b505050505050565b5f818152600260205260409020546060906001600160a01b0316610cea576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c610cf5836118ad565b604051602001610d069291906120e2565b6040516020818303038152906040529050919050565b600c805461067690611e70565b6009546001600160a01b03163314610d6d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610deb576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6127106bffffffffffffffffffffffff82161115610ea25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b038216610ef85760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610a34565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600655565b6daaeb6d7670e522a718067333cd4e3b15610bf8576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612183565b610bf8576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a34565b5f818152600260205260409020546001600160a01b03163381148061107757506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6110c35760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b5f8281526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b0384811691161461119e5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382166111f45760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b336001600160a01b038416148061122d57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061124d57505f818152600460205260409020546001600160a01b031633145b6112995760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b038084165f81815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61136883838361070e565b6001600160a01b0382163b158061143e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156113f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141a919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6107095760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b6127106bffffffffffffffffffffffff821611156115105760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b0382166115665760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610a34565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182525f96875260079052919094209351905190911674010000000000000000000000000000000000000000029116179055565b6001600160a01b03821661161b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b5f818152600260205260409020546001600160a01b03161561167f5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61179585858561070e565b6001600160a01b0384163b158061185a57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906117f69033908a908990899089906004016121b9565b6020604051808303815f875af1158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6118a65760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b5050505050565b6060815f036118ef57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b8115611918578061190281612229565b91506119119050600a83611f32565b91506118f2565b5f8167ffffffffffffffff81111561193257611932611bba565b6040519080825280601f01601f19166020018201604052801561195c576020820181803683370190505b5090505b84156119de57611971600183612260565b915061197e600a86612273565b6119899060306120cf565b60f81b81838151811061199e5761199e6120a2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506119d7600a86611f32565b9450611960565b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf8575f80fd5b5f60208284031215611a23575f80fd5b8135611a2e816119e6565b9392505050565b80356001600160a01b0381168114610a3d575f80fd5b80356bffffffffffffffffffffffff81168114610a3d575f80fd5b5f8060408385031215611a77575f80fd5b611a8083611a35565b9150611a8e60208401611a4b565b90509250929050565b5f5b83811015611ab1578181015183820152602001611a99565b50505f910152565b602081525f8251806020840152611ad7816040850160208701611a97565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b611b3a83611a35565b946020939093013593505050565b5f805f60608486031215611b5a575f80fd5b611b6384611a35565b9250611b7160208501611a35565b9150604084013590509250925092565b5f60208284031215611b91575f80fd5b611a2e82611a35565b5f8060408385031215611bab575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611bf7575f80fd5b813567ffffffffffffffff80821115611c0e575f80fd5b818401915084601f830112611c21575f80fd5b813581811115611c3357611c33611bba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611c7957611c79611bba565b81604052828152876020848701011115611c91575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611cc2575f80fd5b83359250611cd260208501611a35565b9150611ce060408501611a4b565b90509250925092565b5f8060208385031215611cfa575f80fd5b823567ffffffffffffffff80821115611d11575f80fd5b818501915085601f830112611d24575f80fd5b813581811115611d32575f80fd5b8660208260051b8501011115611d46575f80fd5b60209290920196919550909350505050565b8015158114610bf8575f80fd5b5f8060408385031215611d76575f80fd5b611d7f83611a35565b91506020830135611d8f81611d58565b809150509250929050565b5f805f805f60808688031215611dae575f80fd5b611db786611a35565b9450611dc560208701611a35565b935060408601359250606086013567ffffffffffffffff80821115611de8575f80fd5b818801915088601f830112611dfb575f80fd5b813581811115611e09575f80fd5b896020828501011115611e1a575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611e3e575f80fd5b611e4783611a35565b9150611a8e60208401611a35565b5f60208284031215611e65575f80fd5b8135611a2e81611d58565b600181811c90821680611e8457607f821691505b602082108103611ebb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761061257610612611ec1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611f4057611f40611f05565b500490565b601f821115610709575f81815260208120601f850160051c81016020861015611f6b5750805b601f850160051c820191505b81811015610c9257828155600101611f77565b815167ffffffffffffffff811115611fa457611fa4611bba565b611fb881611fb28454611e70565b84611f45565b602080601f83116001811461200a575f8415611fd45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610c92565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205657888601518255948401946001909101908401612037565b508582101561209257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082018082111561061257610612611ec1565b5f8084546120ef81611e70565b60018281168015612107576001811461213a57612166565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612166565b885f526020805f205f5b8581101561215d5781548a820152908401908201612144565b50505082870194505b50505050835161217a818360208801611a97565b01949350505050565b5f60208284031215612193575f80fd5b8151611a2e81611d58565b5f602082840312156121ae575f80fd5b8151611a2e816119e6565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361225957612259611ec1565b5060010190565b8181038181111561061257610612611ec1565b5f8261228157612281611f05565b50069056fea164736f6c6343000815000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c
-----Decoded View---------------
Arg [0] : _root (address): 0x0025C3ABfa72E7c509ad458b50982835404A1d6c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c
Deployed Bytecode Sourcemap
455:4408:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2136:417;;;;;;:::i;:::-;;:::i;:::-;;;611:14:14;;604:22;586:41;;574:2;559:18;2136:417:11;;;;;;;;2606:222;;;;;;:::i;:::-;;:::i;:::-;;896:18:9;;;:::i;:::-;;;;;;;:::i;1841:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1841:46:9;;;;;;-1:-1:-1;;;;;2350:55:14;;;2332:74;;2320:2;2305:18;1841:46:9;2186:226:14;4134:155:11;;;;;;:::i;:::-;;:::i;678:30::-;;;;;;;;;2822:25:14;;;2810:2;2795:18;678:30:11;2676:177:14;4295:161:11;;;;;;:::i;:::-;;:::i;868:20::-;;;;;;;;;1906:119:13;;;;;;:::i;:::-;;:::i;1671:432:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3827:55:14;;;3809:74;;3914:2;3899:18;;3892:34;;;;3782:18;1671:432:1;3635:297:14;1650:197:11;;;;;;:::i;:::-;;:::i;1352:119:13:-;;;;;;:::i;:::-;;:::i;1158:142:7:-;;120:42:8;1158:142:7;;4462:169:11;;;;;;:::i;:::-;;:::i;585:29::-;;;;;3104:244;;;;;;:::i;:::-;;:::i;196:27:13:-;;;;;-1:-1:-1;;;;;196:27:13;;;1324:149:9;;;;;;:::i;:::-;;:::i;1166:358:11:-;;;;;;:::i;:::-;;:::i;1479:168:9:-;;;;;;:::i;:::-;;:::i;3401:185:11:-;;;;;;:::i;:::-;;:::i;2083:85:13:-;2149:12;;-1:-1:-1;;;;;2149:12:13;2083:85;;921:20:9;;;:::i;3954:174:11:-;;;;;;:::i;:::-;;:::i;2884:169::-;;;:::i;291:28:13:-;;;;;-1:-1:-1;;;;;291:28:13;;;4637:224:11;;;;;;:::i;:::-;;:::i;3682:242::-;;;;;;:::i;:::-;;:::i;791:26::-;;;:::i;430:27:13:-;;;;;-1:-1:-1;;;;;430:27:13;;;1894:68:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1667:124:13;;;;;;:::i;:::-;;:::i;1883:171:11:-;;;;;;:::i;:::-;;:::i;2136:417::-;2230:4;2253:25;;;;;;:101;;-1:-1:-1;2329:25:11;;;;;2253:101;:176;;;-1:-1:-1;2404:25:11;;;;;2253:176;:251;;;-1:-1:-1;2479:25:11;;;;;2253:251;2246:258;2136:417;-1:-1:-1;;2136:417:11:o;2606:222::-;2709:12;;-1:-1:-1;;;;;2709:12:11;2695:10;:26;2691:79;;2744:15;;;;;;;;;;;;;;2691:79;2779:42;2798:8;2808:12;2779:18;:42::i;:::-;2606:222;;:::o;896:18:9:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4134:155:11:-;4230:8;2902:30:7;2923:8;2902:20;:30::i;:::-;4250:32:11::1;4264:8;4274:7;4250:13;:32::i;:::-;4134:155:::0;;;:::o;4295:161::-;4396:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4412:37:11::1;4431:4;4437:2;4441:7;4412:18;:37::i;:::-;4295:161:::0;;;;:::o;1906:119:13:-;1035:12;;-1:-1:-1;;;;;1035:12:13;1021:10;:26;1017:79;;1070:15;;;;;;;;;;;;;;1017:79;1990:12:::1;:28:::0;;;::::1;-1:-1:-1::0;;;;;1990:28:13;;;::::1;::::0;;;::::1;::::0;;1906:119::o;1671:432:1:-;1768:7;1825:27;;;:17;:27;;;;;;;;1796:56;;;;;;;;;-1:-1:-1;;;;;1796:56:1;;;;;;;;;;;;;;;;;;1768:7;;1863:90;;-1:-1:-1;1913:29:1;;;;;;;;;1923:19;1913:29;-1:-1:-1;;;;;1913:29:1;;;;;;;;;;;;;1863:90;2001:23;;;;1963:21;;2461:5;;1988:36;;1987:58;1988:36;:10;:36;:::i;:::-;1987:58;;;;:::i;:::-;2064:16;;;;;-1:-1:-1;1671:432:1;;-1:-1:-1;;;;1671:432:1:o;1650:197:11:-;1741:13;;-1:-1:-1;;;;;1741:13:11;1727:10;:27;1723:80;;1777:15;;;;;;;;;;;;;;1723:80;1812:12;:28;1827:13;1812:12;:28;:::i;1352:119:13:-;753:12;;-1:-1:-1;;;;;753:12:13;739:10;:26;735:79;;788:15;;;;;;;;;;;;;;735:79;1436:12:::1;:28:::0;;;::::1;-1:-1:-1::0;;;;;1436:28:13;;;::::1;::::0;;;::::1;::::0;;1352:119::o;4462:169:11:-;4567:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4583:41:11::1;4606:4;4612:2;4616:7;4583:22;:41::i;3104:244::-:0;3222:12;;-1:-1:-1;;;;;3222:12:11;3208:10;:26;3204:79;;3257:15;;;;;;;;;;;;;;3204:79;3292:49;3309:7;3318:8;3328:12;3292:16;:49::i;1324:149:9:-;1382:13;1424:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1424:12:9;;1407:59;;;;-1:-1:-1;;;1407:59:9;;11795:2:14;1407:59:9;;;11777:21:14;11834:2;11814:18;;;11807:30;11873:12;11853:18;;;11846:40;11903:18;;1407:59:9;;;;;;;;;1324:149;;;:::o;1166:358:11:-;1242:10;-1:-1:-1;;;;;1256:4:11;1242:18;;1238:46;;1269:15;;;;;;;;;;;;;;1238:46;1299:8;;;;1294:35;;1316:13;;;;;;;;;;;;;;1294:35;1368:9;1363:106;1383:18;;;1363:106;;;1426:28;1432:9;1443:7;;1451:1;1443:10;;;;;;;:::i;:::-;;;;;;;1426:5;:28::i;:::-;1403:3;;1363:106;;;;1503:7;;:14;;1488:11;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;1166:358:11:o;1479:168:9:-;1542:7;-1:-1:-1;;;;;1569:19:9;;1561:44;;;;-1:-1:-1;;;1561:44:9;;12453:2:14;1561:44:9;;;12435:21:14;12492:2;12472:18;;;12465:30;12531:14;12511:18;;;12504:42;12563:18;;1561:44:9;12251:336:14;1561:44:9;-1:-1:-1;;;;;;1623:17:9;;;;;:10;:17;;;;;;;1479:168::o;3401:185:11:-;3482:12;;-1:-1:-1;;;;;3482:12:11;3468:10;:26;3464:79;;3517:15;;;;;;;;;;;;;;3464:79;4061:26:1;;;;:17;:26;;;;;4054:33;3401:185:11:o;3552:27::-;3401:185;:::o;921:20:9:-;;;;;;;:::i;3954:174:11:-;4058:8;2902:30:7;2923:8;2902:20;:30::i;:::-;4078:43:11::1;4102:8;4112;4078:23;:43::i;2884:169::-:0;2953:12;;-1:-1:-1;;;;;2953:12:11;2939:10;:26;2935:79;;2988:15;;;;;;;;;;;;;;2935:79;3023:23;3199:19:1;;3192:26;3132:93;3023:23:11;2884:169::o;4637:224::-;4787:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4807:47:11::1;4830:4;4836:2;4840:7;4849:4;;4807:22;:47::i;:::-;4637:224:::0;;;;;;:::o;3682:242::-;3805:1;3776:17;;;:8;:17;;;;;;3747:13;;-1:-1:-1;;;;;3776:17:11;3772:63;;3816:19;;;;;;;;;;;;;;3772:63;3876:12;3890:25;3907:7;3890:16;:25::i;:::-;3859:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3845:72;;3682:242;;;:::o;791:26::-;;;;;;;:::i;1667:124:13:-;894:13;;-1:-1:-1;;;;;894:13:13;880:10;:27;876:80;;930:15;;;;;;;;;;;;;;876:80;1754:13:::1;:30:::0;;;::::1;-1:-1:-1::0;;;;;1754:30:13;;;::::1;::::0;;;::::1;::::0;;1667:124::o;1883:171:11:-;1957:12;;-1:-1:-1;;;;;1957:12:11;1943:10;:26;1939:79;;1992:15;;;;;;;;;;;;;;1939:79;2027:8;:20;;;;;;;;;;;;;1883:171::o;2734:327:1:-;2461:5;2836:33;;;;;2828:88;;;;-1:-1:-1;;;2828:88:1;;13877:2:14;2828:88:1;;;13859:21:14;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;14026:12;14006:18;;;13999:40;14056:19;;2828:88:1;13675:406:14;2828:88:1;-1:-1:-1;;;;;2934:22:1;;2926:60;;;;-1:-1:-1;;;2926:60:1;;14288:2:14;2926:60:1;;;14270:21:14;14327:2;14307:18;;;14300:30;14366:27;14346:18;;;14339:55;14411:18;;2926:60:1;14086:349:14;2926:60:1;3019:35;;;;;;;;;-1:-1:-1;;;;;3019:35:1;;;;;;;;;;;;;;;;;2997:57;;;;;:19;:57;2734:327::o;3038:638:7:-;120:42:8;3227:45:7;:49;3223:447;;3523:67;;;;;3574:4;3523:67;;;14675:34:14;-1:-1:-1;;;;;14745:15:14;;14725:18;;;14718:43;120:42:8;;3523::7;;14587:18:14;;3523:67:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3518:142;;3617:28;;;;;-1:-1:-1;;;;;2350:55:14;;3617:28:7;;;2332:74:14;2305:18;;3617:28:7;2186:226:14;2450:282:9;2521:13;2537:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2537:12:9;2568:10;:19;;;:58;;-1:-1:-1;;;;;;2591:23:9;;;;;;:16;:23;;;;;;;;2615:10;2591:35;;;;;;;;;;2568:58;2560:85;;;;-1:-1:-1;;;2560:85:9;;15224:2:14;2560:85:9;;;15206:21:14;15263:2;15243:18;;;15236:30;15302:16;15282:18;;;15275:44;15336:18;;2560:85:9;15022:338:14;2560:85:9;2656:15;;;;:11;:15;;;;;;:25;;;;-1:-1:-1;;;;;2656:25:9;;;;;;;;;2697:28;;2656:15;;2697:28;;;;;;;2511:221;2450:282;;:::o;2947:741::-;3078:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3070:20:9;;;3078:12;;3070:20;3062:43;;;;-1:-1:-1;;;3062:43:9;;15567:2:14;3062:43:9;;;15549:21:14;15606:2;15586:18;;;15579:30;15645:12;15625:18;;;15618:40;15675:18;;3062:43:9;15365:334:14;3062:43:9;-1:-1:-1;;;;;3124:16:9;;3116:46;;;;-1:-1:-1;;;3116:46:9;;15906:2:14;3116:46:9;;;15888:21:14;15945:2;15925:18;;;15918:30;15984:19;15964:18;;;15957:47;16021:18;;3116:46:9;15704:341:14;3116:46:9;3194:10;-1:-1:-1;;;;;3194:18:9;;;;:56;;-1:-1:-1;;;;;;3216:22:9;;;;;;:16;:22;;;;;;;;3239:10;3216:34;;;;;;;;;;3194:56;:89;;;-1:-1:-1;3268:15:9;;;;:11;:15;;;;;;-1:-1:-1;;;;;3268:15:9;3254:10;:29;3194:89;3173:150;;;;-1:-1:-1;;;3173:150:9;;15224:2:14;3173:150:9;;;15206:21:14;15263:2;15243:18;;;15236:30;15302:16;15282:18;;;15275:44;15336:18;;3173:150:9;15022:338:14;3173:150:9;-1:-1:-1;;;;;3523:16:9;;;;;;;:10;:16;;;;;;;;:18;;;;;;3556:14;;;;;;;;;:16;;3523:18;3556:16;;;3593:12;;;:8;:12;;;;;:17;;;;;;;;;;;3628:11;:15;;;;;;3621:22;;;;;;;;3659;;3602:2;;3556:14;3523:16;3659:22;;;2947:741;;;:::o;3694:396::-;3813:26;3826:4;3832:2;3836;3813:12;:26::i;:::-;-1:-1:-1;;;;;3871:14:9;;;:19;;:170;;-1:-1:-1;3910:66:9;;3996:45;3910:66;;;3951:10;3910:66;;;16378:34:14;-1:-1:-1;;;;;16448:15:14;;;16428:18;;;16421:43;16480:18;;;16473:34;;;16543:3;16523:18;;;16516:31;-1:-1:-1;16563:19:14;;;16556:30;3996:45:9;;3910:40;;;;3996:45;;16603:19:14;;3910:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:131;;;3871:170;3850:233;;;;-1:-1:-1;;;3850:233:9;;17089:2:14;3850:233:9;;;17071:21:14;17128:2;17108:18;;;17101:30;17167:18;17147;;;17140:46;17203:18;;3850:233:9;16887:340:14;3495:381:1;2461:5;3642:33;;;;;3634:88;;;;-1:-1:-1;;;3634:88:1;;13877:2:14;3634:88:1;;;13859:21:14;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;14026:12;14006:18;;;13999:40;14056:19;;3634:88:1;13675:406:14;3634:88:1;-1:-1:-1;;;;;3740:22:1;;3732:62;;;;-1:-1:-1;;;3732:62:1;;17434:2:14;3732:62:1;;;17416:21:14;17473:2;17453:18;;;17446:30;17512:29;17492:18;;;17485:57;17559:18;;3732:62:1;17232:351:14;3732:62:1;3834:35;;;;;;;;-1:-1:-1;;;;;3834:35:1;;;;;;;;;;;;;;;;-1:-1:-1;3805:26:1;;;:17;:26;;;;;;:64;;;;;;;;;;;;;;3495:381::o;5240:371:9:-;-1:-1:-1;;;;;5314:16:9;;5306:46;;;;-1:-1:-1;;;5306:46:9;;15906:2:14;5306:46:9;;;15888:21:14;15945:2;15925:18;;;15918:30;15984:19;15964:18;;;15957:47;16021:18;;5306:46:9;15704:341:14;5306:46:9;5395:1;5371:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5371:12:9;:26;5363:53;;;;-1:-1:-1;;;5363:53:9;;17790:2:14;5363:53:9;;;17772:21:14;17829:2;17809:18;;;17802:30;17868:16;17848:18;;;17841:44;17902:18;;5363:53:9;17588:338:14;5363:53:9;-1:-1:-1;;;;;5506:14:9;;;;;;:10;:14;;;;;;;;:16;;;;;;5543:12;;;:8;:12;;;;;;:17;;;;;;;;5576:28;5552:2;;5506:14;;5576:28;;5506:14;;5576:28;5240:371;;:::o;2738:203::-;2840:10;2823:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2823:38:9;;;;;;;;;;;;:49;;;;;;;;;;;;;2888:46;;586:41:14;;;2823:38:9;;2840:10;2888:46;;559:18:14;2888:46:9;;;;;;;2738:203;;:::o;4096:427::-;4244:26;4257:4;4263:2;4267;4244:12;:26::i;:::-;-1:-1:-1;;;;;4302:14:9;;;:19;;:172;;-1:-1:-1;4341:68:9;;4429:45;4341:68;;;4429:45;-1:-1:-1;;;;;4341:40:9;;;4429:45;;4341:68;;4382:10;;4394:4;;4400:2;;4404:4;;;;4341:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:133;;;4302:172;4281:235;;;;-1:-1:-1;;;4281:235:9;;17089:2:14;4281:235:9;;;17071:21:14;17128:2;17108:18;;;17101:30;17167:18;17147;;;17140:46;17203:18;;4281:235:9;16887:340:14;4281:235:9;4096:427;;;;;:::o;392:703:2:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:2;;;;;;;;;;;;;;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:2;;-1:-1:-1;837:2:2;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:2;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:2;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1036:11:2;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:2:o;14:177:14:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:14:o;638:196::-;706:20;;-1:-1:-1;;;;;755:54:14;;745:65;;735:93;;824:1;821;814:12;839:179;906:20;;966:26;955:38;;945:49;;935:77;;1008:1;1005;998:12;1023:258;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1190:29;1209:9;1190:29;:::i;:::-;1180:39;;1238:37;1271:2;1260:9;1256:18;1238:37;:::i;:::-;1228:47;;1023:258;;;;;:::o;1286:250::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;-1:-1:-1;;1528:1:14;1510:16;;1503:27;1286:250::o;1541:455::-;1690:2;1679:9;1672:21;1653:4;1722:6;1716:13;1765:6;1760:2;1749:9;1745:18;1738:34;1781:79;1853:6;1848:2;1837:9;1833:18;1828:2;1820:6;1816:15;1781:79;:::i;:::-;1912:2;1900:15;1917:66;1896:88;1881:104;;;;1987:2;1877:113;;1541:455;-1:-1:-1;;1541:455:14:o;2001:180::-;2060:6;2113:2;2101:9;2092:7;2088:23;2084:32;2081:52;;;2129:1;2126;2119:12;2081:52;-1:-1:-1;2152:23:14;;2001:180;-1:-1:-1;2001:180:14:o;2417:254::-;2485:6;2493;2546:2;2534:9;2525:7;2521:23;2517:32;2514:52;;;2562:1;2559;2552:12;2514:52;2585:29;2604:9;2585:29;:::i;:::-;2575:39;2661:2;2646:18;;;;2633:32;;-1:-1:-1;;;2417:254:14:o;2858:328::-;2935:6;2943;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3043:29;3062:9;3043:29;:::i;:::-;3033:39;;3091:38;3125:2;3114:9;3110:18;3091:38;:::i;:::-;3081:48;;3176:2;3165:9;3161:18;3148:32;3138:42;;2858:328;;;;;:::o;3191:186::-;3250:6;3303:2;3291:9;3282:7;3278:23;3274:32;3271:52;;;3319:1;3316;3309:12;3271:52;3342:29;3361:9;3342:29;:::i;3382:248::-;3450:6;3458;3511:2;3499:9;3490:7;3486:23;3482:32;3479:52;;;3527:1;3524;3517:12;3479:52;-1:-1:-1;;3550:23:14;;;3620:2;3605:18;;;3592:32;;-1:-1:-1;3382:248:14:o;3937:184::-;3989:77;3986:1;3979:88;4086:4;4083:1;4076:15;4110:4;4107:1;4100:15;4126:981;4195:6;4248:2;4236:9;4227:7;4223:23;4219:32;4216:52;;;4264:1;4261;4254:12;4216:52;4304:9;4291:23;4333:18;4374:2;4366:6;4363:14;4360:34;;;4390:1;4387;4380:12;4360:34;4428:6;4417:9;4413:22;4403:32;;4473:7;4466:4;4462:2;4458:13;4454:27;4444:55;;4495:1;4492;4485:12;4444:55;4531:2;4518:16;4553:2;4549;4546:10;4543:36;;;4559:18;;:::i;:::-;4693:2;4687:9;4755:4;4747:13;;4598:66;4743:22;;;4767:2;4739:31;4735:40;4723:53;;;4791:18;;;4811:22;;;4788:46;4785:72;;;4837:18;;:::i;:::-;4877:10;4873:2;4866:22;4912:2;4904:6;4897:18;4952:7;4947:2;4942;4938;4934:11;4930:20;4927:33;4924:53;;;4973:1;4970;4963:12;4924:53;5029:2;5024;5020;5016:11;5011:2;5003:6;4999:15;4986:46;5074:1;5052:15;;;5069:2;5048:24;5041:35;;;;-1:-1:-1;5056:6:14;4126:981;-1:-1:-1;;;;;4126:981:14:o;5374:326::-;5450:6;5458;5466;5519:2;5507:9;5498:7;5494:23;5490:32;5487:52;;;5535:1;5532;5525:12;5487:52;5571:9;5558:23;5548:33;;5600:38;5634:2;5623:9;5619:18;5600:38;:::i;:::-;5590:48;;5657:37;5690:2;5679:9;5675:18;5657:37;:::i;:::-;5647:47;;5374:326;;;;;:::o;5705:615::-;5791:6;5799;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;5908:9;5895:23;5937:18;5978:2;5970:6;5967:14;5964:34;;;5994:1;5991;5984:12;5964:34;6032:6;6021:9;6017:22;6007:32;;6077:7;6070:4;6066:2;6062:13;6058:27;6048:55;;6099:1;6096;6089:12;6048:55;6139:2;6126:16;6165:2;6157:6;6154:14;6151:34;;;6181:1;6178;6171:12;6151:34;6234:7;6229:2;6219:6;6216:1;6212:14;6208:2;6204:23;6200:32;6197:45;6194:65;;;6255:1;6252;6245:12;6194:65;6286:2;6278:11;;;;;6308:6;;-1:-1:-1;5705:615:14;;-1:-1:-1;;;;5705:615:14:o;6325:118::-;6411:5;6404:13;6397:21;6390:5;6387:32;6377:60;;6433:1;6430;6423:12;6448:315;6513:6;6521;6574:2;6562:9;6553:7;6549:23;6545:32;6542:52;;;6590:1;6587;6580:12;6542:52;6613:29;6632:9;6613:29;:::i;:::-;6603:39;;6692:2;6681:9;6677:18;6664:32;6705:28;6727:5;6705:28;:::i;:::-;6752:5;6742:15;;;6448:315;;;;;:::o;6768:808::-;6865:6;6873;6881;6889;6897;6950:3;6938:9;6929:7;6925:23;6921:33;6918:53;;;6967:1;6964;6957:12;6918:53;6990:29;7009:9;6990:29;:::i;:::-;6980:39;;7038:38;7072:2;7061:9;7057:18;7038:38;:::i;:::-;7028:48;;7123:2;7112:9;7108:18;7095:32;7085:42;;7178:2;7167:9;7163:18;7150:32;7201:18;7242:2;7234:6;7231:14;7228:34;;;7258:1;7255;7248:12;7228:34;7296:6;7285:9;7281:22;7271:32;;7341:7;7334:4;7330:2;7326:13;7322:27;7312:55;;7363:1;7360;7353:12;7312:55;7403:2;7390:16;7429:2;7421:6;7418:14;7415:34;;;7445:1;7442;7435:12;7415:34;7490:7;7485:2;7476:6;7472:2;7468:15;7464:24;7461:37;7458:57;;;7511:1;7508;7501:12;7458:57;6768:808;;;;-1:-1:-1;6768:808:14;;-1:-1:-1;7542:2:14;7534:11;;7564:6;6768:808;-1:-1:-1;;;6768:808:14:o;7581:260::-;7649:6;7657;7710:2;7698:9;7689:7;7685:23;7681:32;7678:52;;;7726:1;7723;7716:12;7678:52;7749:29;7768:9;7749:29;:::i;:::-;7739:39;;7797:38;7831:2;7820:9;7816:18;7797:38;:::i;7846:241::-;7902:6;7955:2;7943:9;7934:7;7930:23;7926:32;7923:52;;;7971:1;7968;7961:12;7923:52;8010:9;7997:23;8029:28;8051:5;8029:28;:::i;8092:437::-;8171:1;8167:12;;;;8214;;;8235:61;;8289:4;8281:6;8277:17;8267:27;;8235:61;8342:2;8334:6;8331:14;8311:18;8308:38;8305:218;;8379:77;8376:1;8369:88;8480:4;8477:1;8470:15;8508:4;8505:1;8498:15;8305:218;;8092:437;;;:::o;8534:184::-;8586:77;8583:1;8576:88;8683:4;8680:1;8673:15;8707:4;8704:1;8697:15;8723:168;8796:9;;;8827;;8844:15;;;8838:22;;8824:37;8814:71;;8865:18;;:::i;8896:184::-;8948:77;8945:1;8938:88;9045:4;9042:1;9035:15;9069:4;9066:1;9059:15;9085:120;9125:1;9151;9141:35;;9156:18;;:::i;:::-;-1:-1:-1;9190:9:14;;9085:120::o;9336:545::-;9438:2;9433:3;9430:11;9427:448;;;9474:1;9499:5;9495:2;9488:17;9544:4;9540:2;9530:19;9614:2;9602:10;9598:19;9595:1;9591:27;9585:4;9581:38;9650:4;9638:10;9635:20;9632:47;;;-1:-1:-1;9673:4:14;9632:47;9728:2;9723:3;9719:12;9716:1;9712:20;9706:4;9702:31;9692:41;;9783:82;9801:2;9794:5;9791:13;9783:82;;;9846:17;;;9827:1;9816:13;9783:82;;10117:1471;10243:3;10237:10;10270:18;10262:6;10259:30;10256:56;;;10292:18;;:::i;:::-;10321:97;10411:6;10371:38;10403:4;10397:11;10371:38;:::i;:::-;10365:4;10321:97;:::i;:::-;10473:4;;10537:2;10526:14;;10554:1;10549:782;;;;11375:1;11392:6;11389:89;;;-1:-1:-1;11444:19:14;;;11438:26;11389:89;10023:66;10014:1;10010:11;;;10006:84;10002:89;9992:100;10098:1;10094:11;;;9989:117;11491:81;;10519:1063;;10549:782;9283:1;9276:14;;;9320:4;9307:18;;10597:66;10585:79;;;10762:236;10776:7;10773:1;10770:14;10762:236;;;10865:19;;;10859:26;10844:42;;10957:27;;;;10925:1;10913:14;;;;10792:19;;10762:236;;;10766:3;11026:6;11017:7;11014:19;11011:261;;;11087:19;;;11081:26;11188:66;11170:1;11166:14;;;11182:3;11162:24;11158:97;11154:102;11139:118;11124:134;;11011:261;-1:-1:-1;;;;;11318:1:14;11302:14;;;11298:22;11285:36;;-1:-1:-1;10117:1471:14:o;11932:184::-;11984:77;11981:1;11974:88;12081:4;12078:1;12071:15;12105:4;12102:1;12095:15;12121:125;12186:9;;;12207:10;;;12204:36;;;12220:18;;:::i;12592:1078::-;12768:3;12797:1;12830:6;12824:13;12860:36;12886:9;12860:36;:::i;:::-;12915:1;12932:18;;;12959:191;;;;13164:1;13159:356;;;;12925:590;;12959:191;13007:66;12996:9;12992:82;12987:3;12980:95;13130:6;13123:14;13116:22;13108:6;13104:35;13099:3;13095:45;13088:52;;12959:191;;13159:356;13190:6;13187:1;13180:17;13220:4;13265:2;13262:1;13252:16;13290:1;13304:165;13318:6;13315:1;13312:13;13304:165;;;13396:14;;13383:11;;;13376:35;13439:16;;;;13333:10;;13304:165;;;13308:3;;;13498:6;13493:3;13489:16;13482:23;;12925:590;;;;;13546:6;13540:13;13562:68;13621:8;13616:3;13609:4;13601:6;13597:17;13562:68;:::i;:::-;13646:18;;12592:1078;-1:-1:-1;;;;12592:1078:14:o;14772:245::-;14839:6;14892:2;14880:9;14871:7;14867:23;14863:32;14860:52;;;14908:1;14905;14898:12;14860:52;14940:9;14934:16;14959:28;14981:5;14959:28;:::i;16633:249::-;16702:6;16755:2;16743:9;16734:7;16730:23;16726:32;16723:52;;;16771:1;16768;16761:12;16723:52;16803:9;16797:16;16822:30;16846:5;16822:30;:::i;17931:744::-;18135:4;-1:-1:-1;;;;;18245:2:14;18237:6;18233:15;18222:9;18215:34;18297:2;18289:6;18285:15;18280:2;18269:9;18265:18;18258:43;;18337:6;18332:2;18321:9;18317:18;18310:34;18380:3;18375:2;18364:9;18360:18;18353:31;18421:6;18415:3;18404:9;18400:19;18393:35;18479:6;18471;18465:3;18454:9;18450:19;18437:49;18536:1;18530:3;18521:6;18510:9;18506:22;18502:32;18495:43;18665:3;18595:66;18590:2;18582:6;18578:15;18574:88;18563:9;18559:104;18555:114;18547:122;;17931:744;;;;;;;;:::o;18680:195::-;18719:3;18750:66;18743:5;18740:77;18737:103;;18820:18;;:::i;:::-;-1:-1:-1;18867:1:14;18856:13;;18680:195::o;18880:128::-;18947:9;;;18968:11;;;18965:37;;;18982:18;;:::i;19013:112::-;19045:1;19071;19061:35;;19076:18;;:::i;:::-;-1:-1:-1;19110:9:14;;19013:112::o
Swarm Source
none
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.