More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 141,008 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Many | 21454683 | 41 hrs ago | IN | 0 ETH | 0.00045983 | ||||
Set Many | 21442579 | 3 days ago | IN | 0 ETH | 0.00363982 | ||||
Set Many | 21402170 | 9 days ago | IN | 0 ETH | 0.00059024 | ||||
Set Many | 21376469 | 12 days ago | IN | 0 ETH | 0.00088962 | ||||
Set Many | 21280094 | 26 days ago | IN | 0 ETH | 0.00167293 | ||||
Set Many | 21198734 | 37 days ago | IN | 0 ETH | 0.00159145 | ||||
Set Many | 21198729 | 37 days ago | IN | 0 ETH | 0.00164883 | ||||
Set Many | 21198723 | 37 days ago | IN | 0 ETH | 0.00143557 | ||||
Set Many | 21197524 | 37 days ago | IN | 0 ETH | 0.00164271 | ||||
Set Many | 21197505 | 37 days ago | IN | 0 ETH | 0.00176078 | ||||
Set Many | 21197490 | 37 days ago | IN | 0 ETH | 0.00182336 | ||||
Set Many | 21197477 | 37 days ago | IN | 0 ETH | 0.00298047 | ||||
Set Many | 21154970 | 43 days ago | IN | 0 ETH | 0.00060341 | ||||
Set Many | 21124169 | 47 days ago | IN | 0 ETH | 0.00074465 | ||||
Set Many | 21114509 | 49 days ago | IN | 0 ETH | 0.00072797 | ||||
Set Many | 20970238 | 69 days ago | IN | 0 ETH | 0.00189632 | ||||
Set Many | 20880374 | 81 days ago | IN | 0 ETH | 0.00135154 | ||||
Set Many | 20880364 | 81 days ago | IN | 0 ETH | 0.00143417 | ||||
Set Many | 20880362 | 81 days ago | IN | 0 ETH | 0.0015737 | ||||
Set Many | 20704638 | 106 days ago | IN | 0 ETH | 0.00018821 | ||||
Set Many | 20700016 | 107 days ago | IN | 0 ETH | 0.00020265 | ||||
Set Many | 20670892 | 111 days ago | IN | 0 ETH | 0.00020868 | ||||
Set Many | 20670819 | 111 days ago | IN | 0 ETH | 0.00028727 | ||||
Set Many | 20670819 | 111 days ago | IN | 0 ETH | 0.00028727 | ||||
Set Many | 20670819 | 111 days ago | IN | 0 ETH | 0.00059597 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Resolver
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-22 */ pragma solidity 0.5.12; /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * 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 * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * 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); } /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either `approve` or `setApproveForAll`. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either `approve` or `setApproveForAll`. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } contract IRegistry is IERC721Metadata { event NewURI(uint256 indexed tokenId, string uri); event NewURIPrefix(string prefix); event Resolve(uint256 indexed tokenId, address indexed to); event Sync(address indexed resolver, uint256 indexed updateId, uint256 indexed tokenId); /** * @dev Controlled function to set the token URI Prefix for all tokens. * @param prefix string URI to assign */ function controlledSetTokenURIPrefix(string calldata prefix) external; /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool); /** * @dev Mints a new a child token. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token not exist. * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the parent token * @param label subdomain label of the child token ID */ function mintChild(address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled function to mint a given token ID. * Requires the msg.sender to be controller. * Requires the token ID to not exist. * @param to address the given token ID will be minted to * @param label string that is a subdomain * @param tokenId uint256 ID of the parent token */ function controlledMintChild(address to, uint256 tokenId, string calldata label) external; /** * @dev Transfers the ownership of a child token ID to another address. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param label subdomain label of the child token ID */ function transferFromChild(address from, address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled function to transfers the ownership of a token ID to * another address. * Requires the msg.sender to be controller. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function controlledTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Safely transfers the ownership of a child token ID to another address. * Calculates child token ID using a namehash function. * Implements a ERC721Reciever check unlike transferFromChild. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 parent ID of the token to be transferred * @param label subdomain label of the child token ID * @param _data bytes data to send along with a safe transfer check */ function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label, bytes calldata _data) external; /// Shorthand for calling the above ^^^ safeTransferFromChild function with an empty _data parameter. Similar to ERC721.safeTransferFrom. function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled frunction to safely transfers the ownership of a token ID * to another address. * Implements a ERC721Reciever check unlike controlledSafeTransferFrom. * Requires the msg.sender to be controller. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 parent ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function controlledSafeTransferFrom(address from, address to, uint256 tokenId, bytes calldata _data) external; /** * @dev Burns a child token ID. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param tokenId uint256 ID of the token to be transferred * @param label subdomain label of the child token ID */ function burnChild(uint256 tokenId, string calldata label) external; /** * @dev Controlled function to burn a given token ID. * Requires the msg.sender to be controller. * Requires the token already exist. * @param tokenId uint256 ID of the token to be burned */ function controlledBurn(uint256 tokenId) external; /** * @dev Sets the resolver of a given token ID to another address. * Requires the msg.sender to be the owner, approved, or operator. * @param to address the given token ID will resolve to * @param tokenId uint256 ID of the token to be transferred */ function resolveTo(address to, uint256 tokenId) external; /** * @dev Gets the resolver of the specified token ID. * @param tokenId uint256 ID of the token to query the resolver of * @return address currently marked as the resolver of the given token ID */ function resolverOf(uint256 tokenId) external view returns (address); /** * @dev Controlled function to sets the resolver of a given token ID. * Requires the msg.sender to be controller. * @param to address the given token ID will resolve to * @param tokenId uint256 ID of the token to be transferred */ function controlledResolveTo(address to, uint256 tokenId) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } /** * @dev Implementation of the `IERC165` interface. * * Contracts may inherit from this and call `_registerInterface` to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See `IERC165.supportsInterface`. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See `IERC165.supportsInterface`. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != msg.sender, "ERC721: approve to caller"); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use `safeTransferFrom` whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke `onERC721Received` on a target address. * The call is not executed if the target address is not a contract. * * This function is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ contract ERC721Burnable is ERC721 { /** * @dev Burns a specific ERC721 token. * @param tokenId uint256 id of the ERC721 token to be burned. */ function burn(uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // solium-disable error-reason /** * @title ControllerRole * @dev An Controller role defined using the Open Zeppelin Role system. */ contract ControllerRole { using Roles for Roles.Role; // NOTE: Commented out standard Role events to save gas. // event ControllerAdded(address indexed account); // event ControllerRemoved(address indexed account); Roles.Role private _controllers; constructor () public { _addController(msg.sender); } modifier onlyController() { require(isController(msg.sender)); _; } function isController(address account) public view returns (bool) { return _controllers.has(account); } function addController(address account) public onlyController { _addController(account); } function renounceController() public { _removeController(msg.sender); } function _addController(address account) internal { _controllers.add(account); // emit ControllerAdded(account); } function _removeController(address account) internal { _controllers.remove(account); // emit ControllerRemoved(account); } } // solium-disable no-empty-blocks,error-reason /** * @title Registry * @dev An ERC721 Token see https://eips.ethereum.org/EIPS/eip-721. With * additional functions so other trusted contracts to interact with the tokens. */ contract Registry is IRegistry, ControllerRole, ERC721Burnable { // Optional mapping for token URIs mapping(uint256 => string) internal _tokenURIs; string internal _prefix; // Mapping from token ID to resolver address mapping (uint256 => address) internal _tokenResolvers; // uint256(keccak256(abi.encodePacked(uint256(0x0), keccak256(abi.encodePacked("crypto"))))) uint256 private constant _CRYPTO_HASH = 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f; modifier onlyApprovedOrOwner(uint256 tokenId) { require(_isApprovedOrOwner(msg.sender, tokenId)); _; } constructor () public { _mint(address(0xdead), _CRYPTO_HASH); // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(0x5b5e139f); // ERC721 Metadata Interface _tokenURIs[root()] = "crypto"; emit NewURI(root(), "crypto"); } /// ERC721 Metadata extension function name() external view returns (string memory) { return ".crypto"; } function symbol() external view returns (string memory) { return "UD"; } function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return string(abi.encodePacked(_prefix, _tokenURIs[tokenId])); } function controlledSetTokenURIPrefix(string calldata prefix) external onlyController { _prefix = prefix; emit NewURIPrefix(prefix); } /// Ownership function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool) { return _isApprovedOrOwner(spender, tokenId); } /// Registry Constants function root() public pure returns (uint256) { return _CRYPTO_HASH; } function childIdOf(uint256 tokenId, string calldata label) external pure returns (uint256) { return _childId(tokenId, label); } /// Minting function mintChild(address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _mintChild(to, tokenId, label); } function controlledMintChild(address to, uint256 tokenId, string calldata label) external onlyController { _mintChild(to, tokenId, label); } function safeMintChild(address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _safeMintChild(to, tokenId, label, ""); } function safeMintChild(address to, uint256 tokenId, string calldata label, bytes calldata _data) external onlyApprovedOrOwner(tokenId) { _safeMintChild(to, tokenId, label, _data); } function controlledSafeMintChild(address to, uint256 tokenId, string calldata label, bytes calldata _data) external onlyController { _safeMintChild(to, tokenId, label, _data); } /// Transfering function setOwner(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) { super._transferFrom(ownerOf(tokenId), to, tokenId); } function transferFromChild(address from, address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _transferFrom(from, to, _childId(tokenId, label)); } function controlledTransferFrom(address from, address to, uint256 tokenId) external onlyController { _transferFrom(from, to, tokenId); } function safeTransferFromChild( address from, address to, uint256 tokenId, string memory label, bytes memory _data ) public onlyApprovedOrOwner(tokenId) { uint256 childId = _childId(tokenId, label); _transferFrom(from, to, childId); require(_checkOnERC721Received(from, to, childId, _data)); } function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label) external { safeTransferFromChild(from, to, tokenId, label, ""); } function controlledSafeTransferFrom(address from, address to, uint256 tokenId, bytes calldata _data) external onlyController { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data)); } /// Burning function burnChild(uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _burn(_childId(tokenId, label)); } function controlledBurn(uint256 tokenId) external onlyController { _burn(tokenId); } /// Resolution function resolverOf(uint256 tokenId) external view returns (address) { address resolver = _tokenResolvers[tokenId]; require(resolver != address(0)); return resolver; } function resolveTo(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) { _resolveTo(to, tokenId); } function controlledResolveTo(address to, uint256 tokenId) external onlyController { _resolveTo(to, tokenId); } function sync(uint256 tokenId, uint256 updateId) external { require(_tokenResolvers[tokenId] == msg.sender); emit Sync(msg.sender, updateId, tokenId); } /// Internal function _childId(uint256 tokenId, string memory label) internal pure returns (uint256) { require(bytes(label).length != 0); return uint256(keccak256(abi.encodePacked(tokenId, keccak256(abi.encodePacked(label))))); } function _mintChild(address to, uint256 tokenId, string memory label) internal { uint256 childId = _childId(tokenId, label); _mint(to, childId); require(bytes(label).length != 0); require(_exists(childId)); bytes memory domain = abi.encodePacked(label, ".", _tokenURIs[tokenId]); _tokenURIs[childId] = string(domain); emit NewURI(childId, string(domain)); } function _safeMintChild(address to, uint256 tokenId, string memory label, bytes memory _data) internal { _mintChild(to, tokenId, label); require(_checkOnERC721Received(address(0), to, _childId(tokenId, label), _data)); } function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); // Clear resolver (if any) if (_tokenResolvers[tokenId] != address(0x0)) { delete _tokenResolvers[tokenId]; } } function _burn(uint256 tokenId) internal { super._burn(tokenId); // Clear resolver (if any) if (_tokenResolvers[tokenId] != address(0x0)) { delete _tokenResolvers[tokenId]; } // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } function _resolveTo(address to, uint256 tokenId) internal { require(_exists(tokenId)); emit Resolve(tokenId, to); _tokenResolvers[tokenId] = to; } } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * (.note) This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * (.warning) `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise) * be too long), and then calling `toEthSignedMessageHash` on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign) * JSON-RPC method. * * See `recover`. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // solium-disable error-reason contract SignatureUtil { using ECDSA for bytes32; // Mapping from owner to a nonce mapping (uint256 => uint256) internal _nonces; Registry internal _registry; constructor(Registry registry) public { _registry = registry; } function registry() external view returns (address) { return address(_registry); } /** * @dev Gets the nonce of the specified address. * @param tokenId token ID for nonce query * @return nonce of the given address */ function nonceOf(uint256 tokenId) external view returns (uint256) { return _nonces[tokenId]; } function _validate(bytes32 hash, uint256 tokenId, bytes memory signature) internal { uint256 nonce = _nonces[tokenId]; address signer = keccak256(abi.encodePacked(hash, address(this), nonce)).toEthSignedMessageHash().recover(signature); require( signer != address(0) && _registry.isApprovedOrOwner( signer, tokenId ), "INVALID_SIGNATURE" ); _nonces[tokenId] += 1; } } contract MinterRole { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(msg.sender); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } interface IMintingController { /** * @dev Minter function that mints a Second Level Domain (SLD). * @param to address to mint the new SLD to. * @param label SLD label to mint. */ function mintSLD(address to, string calldata label) external; /** * @dev Minter function that safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param label SLD label to mint. */ function safeMintSLD(address to, string calldata label) external; /** * @dev Minter function that safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param label SLD label to mint. * @param _data bytes data to send along with a safe transfer check */ function safeMintSLD(address to, string calldata label, bytes calldata _data) external; } /** * @title MintingController * @dev Defines the functions for distribution of Second Level Domains (SLD)s. */ contract MintingController is IMintingController, MinterRole { Registry internal _registry; constructor (Registry registry) public { _registry = registry; } function registry() external view returns (address) { return address(_registry); } function mintSLD(address to, string memory label) public onlyMinter { _registry.controlledMintChild(to, _registry.root(), label); } function safeMintSLD(address to, string calldata label) external { safeMintSLD(to, label, ""); } function safeMintSLD(address to, string memory label, bytes memory _data) public onlyMinter { _registry.controlledSafeMintChild(to, _registry.root(), label, _data); } function mintSLDWithResolver(address to, string memory label, address resolver) public onlyMinter { _registry.controlledMintChild(to, _registry.root(), label); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDWithResolver(address to, string calldata label, address resolver) external { safeMintSLD(to, label, ""); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDWithResolver(address to, string calldata label, address resolver, bytes calldata _data) external { safeMintSLD(to, label, _data); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } } pragma experimental ABIEncoderV2; // solium-disable error-reason contract Resolver is SignatureUtil { event Set(uint256 indexed tokenId, string indexed keyIndex, string indexed valueIndex, string key, string value); event NewKey(uint256 indexed tokenId, string indexed keyIndex, string key); event ResetRecords(uint256 indexed tokenId); // Mapping from token ID to preset id to key to value mapping (uint256 => mapping (uint256 => mapping (string => string))) internal _records; // Mapping from token ID to current preset id mapping (uint256 => uint256) _tokenPresets; // All keys that were set mapping (uint256 => string) _hashedKeys; MintingController internal _mintingController; constructor(Registry registry, MintingController mintingController) public SignatureUtil(registry) { require(address(registry) == mintingController.registry()); _mintingController = mintingController; } /** * @dev Throws if called when not the resolver. */ modifier whenResolver(uint256 tokenId) { require(address(this) == _registry.resolverOf(tokenId), "RESOLVER_DETACHED_FROM_DOMAIN"); _; } modifier whenApprovedOrOwner(uint256 tokenId) { require(_registry.isApprovedOrOwner(msg.sender, tokenId), "SENDER_IS_NOT_APPROVED_OR_OWNER"); _; } function reset(uint256 tokenId) external whenApprovedOrOwner(tokenId) { _setPreset(now, tokenId); } function resetFor(uint256 tokenId, bytes calldata signature) external { _validate(keccak256(abi.encodeWithSelector(this.reset.selector, tokenId)), tokenId, signature); _setPreset(now, tokenId); } /** * @dev Function to get record. * @param key The key to query the value of. * @param tokenId The token id to fetch. * @return The value string. */ function get(string memory key, uint256 tokenId) public view whenResolver(tokenId) returns (string memory) { return _records[tokenId][_tokenPresets[tokenId]][key]; } /** * @dev Function to get key by provided hash. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHash The key to query the value of. * @return The key string. */ function hashToKey(uint256 keyHash) public view returns (string memory) { return _hashedKeys[keyHash]; } /** * @dev Function to get keys by provided key hashes. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param hashes The key to query the value of. * @return Keys */ function hashesToKeys(uint256[] memory hashes) public view returns (string[] memory) { uint256 keyCount = hashes.length; string[] memory values = new string[](keyCount); for (uint256 i = 0; i < keyCount; i++) { values[i] = hashToKey(hashes[i]); } return values; } /** * @dev Function get value by provied key hash. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHash The key to query the value of. * @param tokenId The token id to set. * @return Key and value. */ function getByHash(uint256 keyHash, uint256 tokenId) public view whenResolver(tokenId) returns (string memory key, string memory value) { key = hashToKey(keyHash); value = get(key, tokenId); } /** * @dev Function get values by provied key hashes. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHashes The key to query the value of. * @param tokenId The token id to set. * @return Keys and values. */ function getManyByHash( uint256[] memory keyHashes, uint256 tokenId ) public view whenResolver(tokenId) returns (string[] memory keys, string[] memory values) { uint256 keyCount = keyHashes.length; keys = new string[](keyCount); values = new string[](keyCount); for (uint256 i = 0; i < keyCount; i++) { (keys[i], values[i]) = getByHash(keyHashes[i], tokenId); } } function preconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) public { require(_mintingController.isMinter(msg.sender), "SENDER_IS_NOT_MINTER"); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to set record. * @param key The key set the value of. * @param value The value to set key to. * @param tokenId The token id to set. */ function set(string calldata key, string calldata value, uint256 tokenId) external whenApprovedOrOwner(tokenId) { _set(_tokenPresets[tokenId], key, value, tokenId); } /** * @dev Function to set record on behalf of an address. * @param key The key set the value of. * @param value The value to set key to. * @param tokenId The token id to set. * @param signature The signature to verify the transaction with. */ function setFor( string calldata key, string calldata value, uint256 tokenId, bytes calldata signature ) external { _validate(keccak256(abi.encodeWithSelector(this.set.selector, key, value, tokenId)), tokenId, signature); _set(_tokenPresets[tokenId], key, value, tokenId); } /** * @dev Function to get multiple record. * @param keys The keys to query the value of. * @param tokenId The token id to fetch. * @return The values. */ function getMany(string[] calldata keys, uint256 tokenId) external view whenResolver(tokenId) returns (string[] memory) { uint256 keyCount = keys.length; string[] memory values = new string[](keyCount); uint256 preset = _tokenPresets[tokenId]; for (uint256 i = 0; i < keyCount; i++) { values[i] = _records[tokenId][preset][keys[i]]; } return values; } function setMany( string[] memory keys, string[] memory values, uint256 tokenId ) public whenApprovedOrOwner(tokenId) { _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to set record on behalf of an address. * @param keys The keys set the values of. * @param values The values to set keys to. * @param tokenId The token id to set. * @param signature The signature to verify the transaction with. */ function setManyFor( string[] memory keys, string[] memory values, uint256 tokenId, bytes memory signature ) public { _validate(keccak256(abi.encodeWithSelector(this.setMany.selector, keys, values, tokenId)), tokenId, signature); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to reset all domain records and set new ones. * @param keys records keys. * @param values records values. * @param tokenId domain token id. */ function reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) public whenApprovedOrOwner(tokenId) { _reconfigure(keys, values, tokenId); } /** * @dev Delegated version of reconfigure() function. * @param keys records keys. * @param values records values. * @param tokenId domain token id. * @param signature user signature. */ function reconfigureFor( string[] memory keys, string[] memory values, uint256 tokenId, bytes memory signature ) public { _validate(keccak256(abi.encodeWithSelector(this.reconfigure.selector, keys, values, tokenId)), tokenId, signature); _reconfigure(keys, values, tokenId); } // reset records function _setPreset(uint256 presetId, uint256 tokenId) internal { _tokenPresets[tokenId] = presetId; _registry.sync(tokenId, 0); // notify registry that domain records were reset emit ResetRecords(tokenId); } /** * @dev Internal function to to set record. As opposed to set, this imposes no restrictions on msg.sender. * @param preset preset to set key/values on * @param key key of record to be set * @param value value of record to be set * @param tokenId uint256 ID of the token */ function _set(uint256 preset, string memory key, string memory value, uint256 tokenId) internal { uint256 keyHash = uint256(keccak256(bytes(key))); bool isNewKey = bytes(_records[tokenId][preset][key]).length == 0; _registry.sync(tokenId, keyHash); _records[tokenId][preset][key] = value; if (bytes(_hashedKeys[keyHash]).length == 0) { _hashedKeys[keyHash] = key; } if (isNewKey) { emit NewKey(tokenId, key, key); } emit Set(tokenId, key, value, key, value); } /** * @dev Internal function to to set multiple records. As opposed to setMany, this imposes * no restrictions on msg.sender. * @param preset preset to set key/values on * @param keys keys of record to be set * @param values values of record to be set * @param tokenId uint256 ID of the token */ function _setMany(uint256 preset, string[] memory keys, string[] memory values, uint256 tokenId) internal { uint256 keyCount = keys.length; for (uint256 i = 0; i < keyCount; i++) { _set(preset, keys[i], values[i], tokenId); } } /** * @dev Internal function to reset all domain records and set new ones. * @param keys records keys. * @param values records values. * @param tokenId domain token id. */ function _reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) internal { _setPreset(now, tokenId); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract Registry","name":"registry","type":"address"},{"internalType":"contract MintingController","name":"mintingController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"NewKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ResetRecords","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"keyIndex","type":"string"},{"indexed":true,"internalType":"string","name":"valueIndex","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"},{"indexed":false,"internalType":"string","name":"value","type":"string"}],"name":"Set","type":"event"},{"constant":true,"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"get","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getByHash","outputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMany","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"keyHashes","type":"uint256[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getManyByHash","outputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"keyHash","type":"uint256"}],"name":"hashToKey","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"hashes","type":"uint256[]"}],"name":"hashesToKeys","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"nonceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"preconfigure","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reconfigure","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"reconfigureFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"resetFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setMany","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setManyFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200240a3803806200240a833981016040819052620000349162000160565b8180600160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050806001600160a01b0316637b1039996040518163ffffffff1660e01b815260040160206040518083038186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000d2919081019062000137565b6001600160a01b0316826001600160a01b031614620000f057600080fd5b600580546001600160a01b0319166001600160a01b039290921691909117905550620001ea565b80516200012481620001c5565b92915050565b80516200012481620001df565b6000602082840312156200014a57600080fd5b600062000158848462000117565b949350505050565b600080604083850312156200017457600080fd5b60006200018285856200012a565b925050602062000195858286016200012a565b9150509250929050565b60006200012482620001b9565b600062000124826200019f565b6001600160a01b031690565b620001d0816200019f565b8114620001dc57600080fd5b50565b620001d081620001ac565b61221080620001fa6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638c87a4ea116100a2578063b87abc1111610071578063b87abc1114610244578063c597407314610257578063ce92b33e1461026a578063e837ae741461027d578063ec129eea146102905761010b565b80638c87a4ea146101ea5780638f69c188146101fd578063a3557e6c14610210578063b85afd28146102235761010b565b806347c81699116100de57806347c8169914610181578063672b9f81146101945780636ccbae5f146101b55780637b103999146101d55761010b565b80631bd8cc1a146101105780631be5e7ed146101395780632c3d376d14610159578063310bd74b1461016c575b600080fd5b61012361011e3660046117b4565b6102a3565b6040516101309190611eee565b60405180910390f35b61014c610147366004611aec565b6104f2565b6040516101309190611fd6565b61014c610167366004611b21565b610673565b61017f61017a366004611b21565b610714565b005b61017f61018f3660046119b5565b6107c0565b6101a76101a2366004611b94565b6108ef565b604051610130929190611fe7565b6101c86101c3366004611b21565b6109c3565b604051610130919061204c565b6101dd6109d5565b6040516101309190611ea9565b6101236101f836600461191d565b6109e5565b61017f61020b366004611878565b610a74565b61017f61021e366004611878565b610af0565b610236610231366004611951565b610b1b565b604051610130929190611eff565b61017f610252366004611b3f565b610ca9565b61017f610265366004611a39565b610d43565b61017f610278366004611808565b610df9565b61017f61028b366004611808565b610e97565b61017f61029e366004611808565b610f4e565b60015460405163b3f9e4cb60e01b815260609183916001600160a01b039091169063b3f9e4cb906102d890849060040161204c565b60206040518083038186803b1580156102f057600080fd5b505afa158015610304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610328919081019061178e565b6001600160a01b0316306001600160a01b0316146103615760405162461bcd60e51b81526004016103589061201c565b60405180910390fd5b604080518581526020808702820101909152849060609082801561039957816020015b60608152602001906001900390816103845790505b506000868152600360205260408120549192505b838110156104e557600087815260026020908152604080832085845290915290208989838181106103da57fe5b602002820190508035601e19368490030181126103f657600080fd5b909101602081019150356001600160401b0381111561041457600080fd5b3681900382131561042457600080fd5b604051610432929190611e70565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156104c15780601f10610496576101008083540402835291602001916104c1565b820191906000526020600020905b8154815290600101906020018083116104a457829003601f168201915b50505050508382815181106104d257fe5b60209081029190910101526001016103ad565b5090979650505050505050565b60015460405163b3f9e4cb60e01b815260609183916001600160a01b039091169063b3f9e4cb9061052790849060040161204c565b60206040518083038186803b15801561053f57600080fd5b505afa158015610553573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610577919081019061178e565b6001600160a01b0316306001600160a01b0316146105a75760405162461bcd60e51b81526004016103589061201c565b6000838152600260209081526040808320600383528184205484529091529081902090516105d6908690611e7d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b505050505091505092915050565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156107085780601f106106dd57610100808354040283529160200191610708565b820191906000526020600020905b8154815290600101906020018083116106eb57829003601f168201915b50505050509050919050565b60015460405163430c208160e01b815282916001600160a01b03169063430c2081906107469033908590600401611ec5565b60206040518083038186803b15801561075e57600080fd5b505afa158015610772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107969190810190611997565b6107b25760405162461bcd60e51b81526004016103589061202c565b6107bc4283610fec565b5050565b60015460405163430c208160e01b815282916001600160a01b03169063430c2081906107f29033908590600401611ec5565b60206040518083038186803b15801561080a57600080fd5b505afa15801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108429190810190611997565b61085e5760405162461bcd60e51b81526004016103589061202c565b6108e7600360008481526020019081526020016000205487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525088925061108e915050565b505050505050565b60015460405163b3f9e4cb60e01b8152606091829184916001600160a01b03169063b3f9e4cb9061092490849060040161204c565b60206040518083038186803b15801561093c57600080fd5b505afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610974919081019061178e565b6001600160a01b0316306001600160a01b0316146109a45760405162461bcd60e51b81526004016103589061201c565b6109ad85610673565b92506109b983856104f2565b9150509250929050565b60009081526020819052604090205490565b6001546001600160a01b03165b90565b6060600082519050606081604051908082528060200260200182016040528015610a2357816020015b6060815260200190600190039081610a0e5790505b50905060005b82811015610a6c57610a4d858281518110610a4057fe5b6020026020010151610673565b828281518110610a5957fe5b6020908102919091010152600101610a29565b509392505050565b610acf63ce92b33e60e01b858585604051602401610a9493929190611f24565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092178252519020838361129f565b600082815260036020526040902054610aea908585856113c3565b50505050565b610b1063ec129eea60e01b858585604051602401610a9493929190611f24565b610aea84848461140a565b60015460405163b3f9e4cb60e01b8152606091829184916001600160a01b03169063b3f9e4cb90610b5090849060040161204c565b60206040518083038186803b158015610b6857600080fd5b505afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ba0919081019061178e565b6001600160a01b0316306001600160a01b031614610bd05760405162461bcd60e51b81526004016103589061201c565b8451604080518281526020808402820101909152818015610c0557816020015b6060815260200190600190039081610bf05790505b50935080604051908082528060200260200182016040528015610c3c57816020015b6060815260200190600190039081610c275790505b50925060005b81811015610c9f57610c67878281518110610c5957fe5b6020026020010151876108ef565b8651879084908110610c7557fe5b60200260200101868481518110610c8857fe5b602090810291909101019190915252600101610c42565b5050509250929050565b610d3463310bd74b60e01b84604051602401610cc5919061204c565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417845291519092208251601f8601839004830281018301909352848352918691869086908190840183828082843760009201919091525061129f92505050565b610d3e4284610fec565b505050565b610d676347c8169960e01b8888888888604051602401610cc5959493929190611f96565b610df0600360008581526020019081526020016000205488888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525089925061108e915050565b50505050505050565b60015460405163430c208160e01b815282916001600160a01b03169063430c208190610e2b9033908590600401611ec5565b60206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7b9190810190611997565b610acf5760405162461bcd60e51b81526004016103589061202c565b6005546040516355138f0d60e11b81526001600160a01b039091169063aa271e1a90610ec7903390600401611eb7565b60206040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f179190810190611997565b610f335760405162461bcd60e51b81526004016103589061203c565b600081815260036020526040902054610d3e908484846113c3565b60015460405163430c208160e01b815282916001600160a01b03169063430c208190610f809033908590600401611ec5565b60206040518083038186803b158015610f9857600080fd5b505afa158015610fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd09190810190611997565b610b105760405162461bcd60e51b81526004016103589061202c565b600081815260036020526040808220849055600154905163538361a760e01b81526001600160a01b039091169163538361a79161102d91859160040161205a565b600060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b50506040518392507f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9150600090a25050565b825160208085019190912060008381526002835260408082208883529093528281209251919290916110c1908790611e7d565b908152604051602091819003919091018120546001805463538361a760e01b84526002918316156101000260001901909216041592506001600160a01b03169063538361a7906111179086908690600401612075565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b50505060008481526002602090815260408083208a8452909152908190209051869250611173908890611e7d565b90815260200160405180910390209080519060200190611194929190611521565b50600082815260046020526040902054600260001961010060018416150201909116046111dc57600082815260046020908152604090912086516111da92880190611521565b505b801561123157846040516111f09190611e7d565b6040518091039020837f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86876040516112289190611fd6565b60405180910390a35b8360405161123f9190611e7d565b6040518091039020856040516112559190611e7d565b6040518091039020847f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d92888860405161128f929190611fe7565b60405180910390a4505050505050565b6000828152602081815260408083205490519092916112f59185916112e9916112ce918a913091899101611e39565b60405160208183030381529060405280519060200120611414565b9063ffffffff61144416565b90506001600160a01b0381161580159061138c575060015460405163430c208160e01b81526001600160a01b039091169063430c20819061133c9084908890600401611ee0565b60206040518083038186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061138c9190810190611997565b6113a85760405162461bcd60e51b81526004016103589061200c565b50505060009081526020819052604090208054600101905550565b825160005b818110156108e757611402868683815181106113e057fe5b60200260200101518684815181106113f457fe5b60200260200101518661108e565b6001016113c8565b610f334282610fec565b6000816040516020016114279190611e89565b604051602081830303815290604052805190602001209050919050565b600081516041146114575750600061151b565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561149d576000935050505061151b565b8060ff16601b141580156114b557508060ff16601c14155b156114c6576000935050505061151b565b600186828585604051600081526020016040526040516114e99493929190611f58565b6020604051602081039080840390855afa15801561150b573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061156257805160ff191683800117855561158f565b8280016001018555821561158f579182015b8281111561158f578251825591602001919060010190611574565b5061159b92915061159f565b5090565b6109e291905b8082111561159b57600081556001016115a5565b805161151b816121a4565b60008083601f8401126115d657600080fd5b5081356001600160401b038111156115ed57600080fd5b60208301915083602082028301111561160557600080fd5b9250929050565b600082601f83011261161d57600080fd5b813561163061162b826120a9565b612083565b81815260209384019390925082018360005b8381101561166e57813586016116588882611734565b8452506020928301929190910190600101611642565b5050505092915050565b600082601f83011261168957600080fd5b813561169761162b826120a9565b915081818352602084019350602081019050838560208402820111156116bc57600080fd5b60005b8381101561166e57816116d28882611783565b84525060209283019291909101906001016116bf565b805161151b816121bb565b60008083601f84011261170557600080fd5b5081356001600160401b0381111561171c57600080fd5b60208301915083600182028301111561160557600080fd5b600082601f83011261174557600080fd5b813561175361162b826120c9565b9150808252602083016020830185838301111561176f57600080fd5b61177a83828461214b565b50505092915050565b803561151b816121c4565b6000602082840312156117a057600080fd5b60006117ac84846115b9565b949350505050565b6000806000604084860312156117c957600080fd5b83356001600160401b038111156117df57600080fd5b6117eb868287016115c4565b935093505060206117fe86828701611783565b9150509250925092565b60008060006060848603121561181d57600080fd5b83356001600160401b0381111561183357600080fd5b61183f8682870161160c565b93505060208401356001600160401b0381111561185b57600080fd5b6118678682870161160c565b92505060406117fe86828701611783565b6000806000806080858703121561188e57600080fd5b84356001600160401b038111156118a457600080fd5b6118b08782880161160c565b94505060208501356001600160401b038111156118cc57600080fd5b6118d88782880161160c565b93505060406118e987828801611783565b92505060608501356001600160401b0381111561190557600080fd5b61191187828801611734565b91505092959194509250565b60006020828403121561192f57600080fd5b81356001600160401b0381111561194557600080fd5b6117ac84828501611678565b6000806040838503121561196457600080fd5b82356001600160401b0381111561197a57600080fd5b61198685828601611678565b92505060206109b985828601611783565b6000602082840312156119a957600080fd5b60006117ac84846116e8565b6000806000806000606086880312156119cd57600080fd5b85356001600160401b038111156119e357600080fd5b6119ef888289016116f3565b955095505060208601356001600160401b03811115611a0d57600080fd5b611a19888289016116f3565b93509350506040611a2c88828901611783565b9150509295509295909350565b60008060008060008060006080888a031215611a5457600080fd5b87356001600160401b03811115611a6a57600080fd5b611a768a828b016116f3565b975097505060208801356001600160401b03811115611a9457600080fd5b611aa08a828b016116f3565b95509550506040611ab38a828b01611783565b93505060608801356001600160401b03811115611acf57600080fd5b611adb8a828b016116f3565b925092505092959891949750929550565b60008060408385031215611aff57600080fd5b82356001600160401b03811115611b1557600080fd5b61198685828601611734565b600060208284031215611b3357600080fd5b60006117ac8484611783565b600080600060408486031215611b5457600080fd5b6000611b608686611783565b93505060208401356001600160401b03811115611b7c57600080fd5b611b88868287016116f3565b92509250509250925092565b60008060408385031215611ba757600080fd5b60006119868585611783565b6000611bbf8383611ccb565b9392505050565b611bcf8161212a565b82525050565b611bcf81612108565b611bcf611bea82612108565b612183565b6000611bfa826120f6565b611c0481856120fa565b935083602082028501611c16856120f0565b8060005b85811015611c505784840389528151611c338582611bb3565b9450611c3e836120f0565b60209a909a0199925050600101611c1a565b5091979650505050505050565b611bcf816109e2565b611bcf611c72826109e2565b6109e2565b611bcf81612135565b6000611c8c83856120fa565b9350611c9983858461214b565b611ca283612194565b9093019392505050565b6000611cb88385612103565b9350611cc583858461214b565b50500190565b6000611cd6826120f6565b611ce081856120fa565b9350611cf0818560208601612157565b611ca281612194565b6000611d04826120f6565b611d0e8185612103565b9350611d1e818560208601612157565b9290920192915050565b6000611d35601c83612103565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c0192915050565b6000611d6e6011836120fa565b70494e56414c49445f5349474e415455524560781b815260200192915050565b6000611d9b601d836120fa565b7f5245534f4c5645525f44455441434845445f46524f4d5f444f4d41494e000000815260200192915050565b6000611dd4601f836120fa565b7f53454e4445525f49535f4e4f545f415050524f5645445f4f525f4f574e455200815260200192915050565b6000611e0d6014836120fa565b7329a2a72222a92fa4a9afa727aa2fa6a4a72a22a960611b815260200192915050565b611bcf81612124565b6000611e458286611c66565b602082019150611e558285611bde565b601482019150611e658284611c66565b506020019392505050565b60006117ac828486611cac565b6000611bbf8284611cf9565b6000611e9482611d28565b9150611ea08284611c66565b50602001919050565b6020810161151b8284611bd5565b6020810161151b8284611bc6565b60408101611ed38285611bc6565b611bbf6020830184611c5d565b60408101611ed38285611bd5565b60208082528101611bbf8184611bef565b60408082528101611f108185611bef565b905081810360208301526117ac8184611bef565b60608082528101611f358186611bef565b90508181036020830152611f498185611bef565b90506117ac6040830184611c5d565b60808101611f668287611c5d565b611f736020830186611e30565b611f806040830185611c5d565b611f8d6060830184611c5d565b95945050505050565b60608082528101611fa8818789611c80565b90508181036020830152611fbd818587611c80565b9050611fcc6040830184611c5d565b9695505050505050565b60208082528101611bbf8184611ccb565b60408082528101611ff88185611ccb565b905081810360208301526117ac8184611ccb565b6020808252810161151b81611d61565b6020808252810161151b81611d8e565b6020808252810161151b81611dc7565b6020808252810161151b81611e00565b6020810161151b8284611c5d565b604081016120688285611c5d565b611bbf6020830184611c77565b60408101611ed38285611c5d565b6040518181016001600160401b03811182821017156120a157600080fd5b604052919050565b60006001600160401b038211156120bf57600080fd5b5060209081020190565b60006001600160401b038211156120df57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061151b82612118565b151590565b6001600160a01b031690565b60ff1690565b600061151b82612140565b600061151b826109e2565b600061151b82612108565b82818337506000910152565b60005b8381101561217257818101518382015260200161215a565b83811115610aea5750506000910152565b600061151b82600061151b8261219e565b601f01601f191690565b60601b90565b6121ad81612108565b81146121b857600080fd5b50565b6121ad81612113565b6121ad816109e256fea365627a7a723158201603450ff51bc5c0fb9b850f42b520b3a83b53571990145de278bf6deafa12196c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80638c87a4ea116100a2578063b87abc1111610071578063b87abc1114610244578063c597407314610257578063ce92b33e1461026a578063e837ae741461027d578063ec129eea146102905761010b565b80638c87a4ea146101ea5780638f69c188146101fd578063a3557e6c14610210578063b85afd28146102235761010b565b806347c81699116100de57806347c8169914610181578063672b9f81146101945780636ccbae5f146101b55780637b103999146101d55761010b565b80631bd8cc1a146101105780631be5e7ed146101395780632c3d376d14610159578063310bd74b1461016c575b600080fd5b61012361011e3660046117b4565b6102a3565b6040516101309190611eee565b60405180910390f35b61014c610147366004611aec565b6104f2565b6040516101309190611fd6565b61014c610167366004611b21565b610673565b61017f61017a366004611b21565b610714565b005b61017f61018f3660046119b5565b6107c0565b6101a76101a2366004611b94565b6108ef565b604051610130929190611fe7565b6101c86101c3366004611b21565b6109c3565b604051610130919061204c565b6101dd6109d5565b6040516101309190611ea9565b6101236101f836600461191d565b6109e5565b61017f61020b366004611878565b610a74565b61017f61021e366004611878565b610af0565b610236610231366004611951565b610b1b565b604051610130929190611eff565b61017f610252366004611b3f565b610ca9565b61017f610265366004611a39565b610d43565b61017f610278366004611808565b610df9565b61017f61028b366004611808565b610e97565b61017f61029e366004611808565b610f4e565b60015460405163b3f9e4cb60e01b815260609183916001600160a01b039091169063b3f9e4cb906102d890849060040161204c565b60206040518083038186803b1580156102f057600080fd5b505afa158015610304573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610328919081019061178e565b6001600160a01b0316306001600160a01b0316146103615760405162461bcd60e51b81526004016103589061201c565b60405180910390fd5b604080518581526020808702820101909152849060609082801561039957816020015b60608152602001906001900390816103845790505b506000868152600360205260408120549192505b838110156104e557600087815260026020908152604080832085845290915290208989838181106103da57fe5b602002820190508035601e19368490030181126103f657600080fd5b909101602081019150356001600160401b0381111561041457600080fd5b3681900382131561042457600080fd5b604051610432929190611e70565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156104c15780601f10610496576101008083540402835291602001916104c1565b820191906000526020600020905b8154815290600101906020018083116104a457829003601f168201915b50505050508382815181106104d257fe5b60209081029190910101526001016103ad565b5090979650505050505050565b60015460405163b3f9e4cb60e01b815260609183916001600160a01b039091169063b3f9e4cb9061052790849060040161204c565b60206040518083038186803b15801561053f57600080fd5b505afa158015610553573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610577919081019061178e565b6001600160a01b0316306001600160a01b0316146105a75760405162461bcd60e51b81526004016103589061201c565b6000838152600260209081526040808320600383528184205484529091529081902090516105d6908690611e7d565b9081526040805160209281900383018120805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b505050505091505092915050565b60008181526004602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156107085780601f106106dd57610100808354040283529160200191610708565b820191906000526020600020905b8154815290600101906020018083116106eb57829003601f168201915b50505050509050919050565b60015460405163430c208160e01b815282916001600160a01b03169063430c2081906107469033908590600401611ec5565b60206040518083038186803b15801561075e57600080fd5b505afa158015610772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107969190810190611997565b6107b25760405162461bcd60e51b81526004016103589061202c565b6107bc4283610fec565b5050565b60015460405163430c208160e01b815282916001600160a01b03169063430c2081906107f29033908590600401611ec5565b60206040518083038186803b15801561080a57600080fd5b505afa15801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506108429190810190611997565b61085e5760405162461bcd60e51b81526004016103589061202c565b6108e7600360008481526020019081526020016000205487878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b01819004810282018101909252898152925089915088908190840183828082843760009201919091525088925061108e915050565b505050505050565b60015460405163b3f9e4cb60e01b8152606091829184916001600160a01b03169063b3f9e4cb9061092490849060040161204c565b60206040518083038186803b15801561093c57600080fd5b505afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610974919081019061178e565b6001600160a01b0316306001600160a01b0316146109a45760405162461bcd60e51b81526004016103589061201c565b6109ad85610673565b92506109b983856104f2565b9150509250929050565b60009081526020819052604090205490565b6001546001600160a01b03165b90565b6060600082519050606081604051908082528060200260200182016040528015610a2357816020015b6060815260200190600190039081610a0e5790505b50905060005b82811015610a6c57610a4d858281518110610a4057fe5b6020026020010151610673565b828281518110610a5957fe5b6020908102919091010152600101610a29565b509392505050565b610acf63ce92b33e60e01b858585604051602401610a9493929190611f24565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092178252519020838361129f565b600082815260036020526040902054610aea908585856113c3565b50505050565b610b1063ec129eea60e01b858585604051602401610a9493929190611f24565b610aea84848461140a565b60015460405163b3f9e4cb60e01b8152606091829184916001600160a01b03169063b3f9e4cb90610b5090849060040161204c565b60206040518083038186803b158015610b6857600080fd5b505afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ba0919081019061178e565b6001600160a01b0316306001600160a01b031614610bd05760405162461bcd60e51b81526004016103589061201c565b8451604080518281526020808402820101909152818015610c0557816020015b6060815260200190600190039081610bf05790505b50935080604051908082528060200260200182016040528015610c3c57816020015b6060815260200190600190039081610c275790505b50925060005b81811015610c9f57610c67878281518110610c5957fe5b6020026020010151876108ef565b8651879084908110610c7557fe5b60200260200101868481518110610c8857fe5b602090810291909101019190915252600101610c42565b5050509250929050565b610d3463310bd74b60e01b84604051602401610cc5919061204c565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b031990951694909417845291519092208251601f8601839004830281018301909352848352918691869086908190840183828082843760009201919091525061129f92505050565b610d3e4284610fec565b505050565b610d676347c8169960e01b8888888888604051602401610cc5959493929190611f96565b610df0600360008581526020019081526020016000205488888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525089925061108e915050565b50505050505050565b60015460405163430c208160e01b815282916001600160a01b03169063430c208190610e2b9033908590600401611ec5565b60206040518083038186803b158015610e4357600080fd5b505afa158015610e57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e7b9190810190611997565b610acf5760405162461bcd60e51b81526004016103589061202c565b6005546040516355138f0d60e11b81526001600160a01b039091169063aa271e1a90610ec7903390600401611eb7565b60206040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f179190810190611997565b610f335760405162461bcd60e51b81526004016103589061203c565b600081815260036020526040902054610d3e908484846113c3565b60015460405163430c208160e01b815282916001600160a01b03169063430c208190610f809033908590600401611ec5565b60206040518083038186803b158015610f9857600080fd5b505afa158015610fac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fd09190810190611997565b610b105760405162461bcd60e51b81526004016103589061202c565b600081815260036020526040808220849055600154905163538361a760e01b81526001600160a01b039091169163538361a79161102d91859160040161205a565b600060405180830381600087803b15801561104757600080fd5b505af115801561105b573d6000803e3d6000fd5b50506040518392507f185c30856dadb58bf097c1f665a52ada7029752dbcad008ea3fefc73bee8c9fe9150600090a25050565b825160208085019190912060008381526002835260408082208883529093528281209251919290916110c1908790611e7d565b908152604051602091819003919091018120546001805463538361a760e01b84526002918316156101000260001901909216041592506001600160a01b03169063538361a7906111179086908690600401612075565b600060405180830381600087803b15801561113157600080fd5b505af1158015611145573d6000803e3d6000fd5b50505060008481526002602090815260408083208a8452909152908190209051869250611173908890611e7d565b90815260200160405180910390209080519060200190611194929190611521565b50600082815260046020526040902054600260001961010060018416150201909116046111dc57600082815260046020908152604090912086516111da92880190611521565b505b801561123157846040516111f09190611e7d565b6040518091039020837f7ae4f661958fbecc2f77be6b0eb280d2a6f604b29e1e7221c82b9da0c4af7f86876040516112289190611fd6565b60405180910390a35b8360405161123f9190611e7d565b6040518091039020856040516112559190611e7d565b6040518091039020847f851ffe8e74d5015261dba0a1f9e1b0e5d42c5af5d2ad1908fee897c7d80a0d92888860405161128f929190611fe7565b60405180910390a4505050505050565b6000828152602081815260408083205490519092916112f59185916112e9916112ce918a913091899101611e39565b60405160208183030381529060405280519060200120611414565b9063ffffffff61144416565b90506001600160a01b0381161580159061138c575060015460405163430c208160e01b81526001600160a01b039091169063430c20819061133c9084908890600401611ee0565b60206040518083038186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061138c9190810190611997565b6113a85760405162461bcd60e51b81526004016103589061200c565b50505060009081526020819052604090208054600101905550565b825160005b818110156108e757611402868683815181106113e057fe5b60200260200101518684815181106113f457fe5b60200260200101518661108e565b6001016113c8565b610f334282610fec565b6000816040516020016114279190611e89565b604051602081830303815290604052805190602001209050919050565b600081516041146114575750600061151b565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561149d576000935050505061151b565b8060ff16601b141580156114b557508060ff16601c14155b156114c6576000935050505061151b565b600186828585604051600081526020016040526040516114e99493929190611f58565b6020604051602081039080840390855afa15801561150b573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061156257805160ff191683800117855561158f565b8280016001018555821561158f579182015b8281111561158f578251825591602001919060010190611574565b5061159b92915061159f565b5090565b6109e291905b8082111561159b57600081556001016115a5565b805161151b816121a4565b60008083601f8401126115d657600080fd5b5081356001600160401b038111156115ed57600080fd5b60208301915083602082028301111561160557600080fd5b9250929050565b600082601f83011261161d57600080fd5b813561163061162b826120a9565b612083565b81815260209384019390925082018360005b8381101561166e57813586016116588882611734565b8452506020928301929190910190600101611642565b5050505092915050565b600082601f83011261168957600080fd5b813561169761162b826120a9565b915081818352602084019350602081019050838560208402820111156116bc57600080fd5b60005b8381101561166e57816116d28882611783565b84525060209283019291909101906001016116bf565b805161151b816121bb565b60008083601f84011261170557600080fd5b5081356001600160401b0381111561171c57600080fd5b60208301915083600182028301111561160557600080fd5b600082601f83011261174557600080fd5b813561175361162b826120c9565b9150808252602083016020830185838301111561176f57600080fd5b61177a83828461214b565b50505092915050565b803561151b816121c4565b6000602082840312156117a057600080fd5b60006117ac84846115b9565b949350505050565b6000806000604084860312156117c957600080fd5b83356001600160401b038111156117df57600080fd5b6117eb868287016115c4565b935093505060206117fe86828701611783565b9150509250925092565b60008060006060848603121561181d57600080fd5b83356001600160401b0381111561183357600080fd5b61183f8682870161160c565b93505060208401356001600160401b0381111561185b57600080fd5b6118678682870161160c565b92505060406117fe86828701611783565b6000806000806080858703121561188e57600080fd5b84356001600160401b038111156118a457600080fd5b6118b08782880161160c565b94505060208501356001600160401b038111156118cc57600080fd5b6118d88782880161160c565b93505060406118e987828801611783565b92505060608501356001600160401b0381111561190557600080fd5b61191187828801611734565b91505092959194509250565b60006020828403121561192f57600080fd5b81356001600160401b0381111561194557600080fd5b6117ac84828501611678565b6000806040838503121561196457600080fd5b82356001600160401b0381111561197a57600080fd5b61198685828601611678565b92505060206109b985828601611783565b6000602082840312156119a957600080fd5b60006117ac84846116e8565b6000806000806000606086880312156119cd57600080fd5b85356001600160401b038111156119e357600080fd5b6119ef888289016116f3565b955095505060208601356001600160401b03811115611a0d57600080fd5b611a19888289016116f3565b93509350506040611a2c88828901611783565b9150509295509295909350565b60008060008060008060006080888a031215611a5457600080fd5b87356001600160401b03811115611a6a57600080fd5b611a768a828b016116f3565b975097505060208801356001600160401b03811115611a9457600080fd5b611aa08a828b016116f3565b95509550506040611ab38a828b01611783565b93505060608801356001600160401b03811115611acf57600080fd5b611adb8a828b016116f3565b925092505092959891949750929550565b60008060408385031215611aff57600080fd5b82356001600160401b03811115611b1557600080fd5b61198685828601611734565b600060208284031215611b3357600080fd5b60006117ac8484611783565b600080600060408486031215611b5457600080fd5b6000611b608686611783565b93505060208401356001600160401b03811115611b7c57600080fd5b611b88868287016116f3565b92509250509250925092565b60008060408385031215611ba757600080fd5b60006119868585611783565b6000611bbf8383611ccb565b9392505050565b611bcf8161212a565b82525050565b611bcf81612108565b611bcf611bea82612108565b612183565b6000611bfa826120f6565b611c0481856120fa565b935083602082028501611c16856120f0565b8060005b85811015611c505784840389528151611c338582611bb3565b9450611c3e836120f0565b60209a909a0199925050600101611c1a565b5091979650505050505050565b611bcf816109e2565b611bcf611c72826109e2565b6109e2565b611bcf81612135565b6000611c8c83856120fa565b9350611c9983858461214b565b611ca283612194565b9093019392505050565b6000611cb88385612103565b9350611cc583858461214b565b50500190565b6000611cd6826120f6565b611ce081856120fa565b9350611cf0818560208601612157565b611ca281612194565b6000611d04826120f6565b611d0e8185612103565b9350611d1e818560208601612157565b9290920192915050565b6000611d35601c83612103565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c0192915050565b6000611d6e6011836120fa565b70494e56414c49445f5349474e415455524560781b815260200192915050565b6000611d9b601d836120fa565b7f5245534f4c5645525f44455441434845445f46524f4d5f444f4d41494e000000815260200192915050565b6000611dd4601f836120fa565b7f53454e4445525f49535f4e4f545f415050524f5645445f4f525f4f574e455200815260200192915050565b6000611e0d6014836120fa565b7329a2a72222a92fa4a9afa727aa2fa6a4a72a22a960611b815260200192915050565b611bcf81612124565b6000611e458286611c66565b602082019150611e558285611bde565b601482019150611e658284611c66565b506020019392505050565b60006117ac828486611cac565b6000611bbf8284611cf9565b6000611e9482611d28565b9150611ea08284611c66565b50602001919050565b6020810161151b8284611bd5565b6020810161151b8284611bc6565b60408101611ed38285611bc6565b611bbf6020830184611c5d565b60408101611ed38285611bd5565b60208082528101611bbf8184611bef565b60408082528101611f108185611bef565b905081810360208301526117ac8184611bef565b60608082528101611f358186611bef565b90508181036020830152611f498185611bef565b90506117ac6040830184611c5d565b60808101611f668287611c5d565b611f736020830186611e30565b611f806040830185611c5d565b611f8d6060830184611c5d565b95945050505050565b60608082528101611fa8818789611c80565b90508181036020830152611fbd818587611c80565b9050611fcc6040830184611c5d565b9695505050505050565b60208082528101611bbf8184611ccb565b60408082528101611ff88185611ccb565b905081810360208301526117ac8184611ccb565b6020808252810161151b81611d61565b6020808252810161151b81611d8e565b6020808252810161151b81611dc7565b6020808252810161151b81611e00565b6020810161151b8284611c5d565b604081016120688285611c5d565b611bbf6020830184611c77565b60408101611ed38285611c5d565b6040518181016001600160401b03811182821017156120a157600080fd5b604052919050565b60006001600160401b038211156120bf57600080fd5b5060209081020190565b60006001600160401b038211156120df57600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b919050565b600061151b82612118565b151590565b6001600160a01b031690565b60ff1690565b600061151b82612140565b600061151b826109e2565b600061151b82612108565b82818337506000910152565b60005b8381101561217257818101518382015260200161215a565b83811115610aea5750506000910152565b600061151b82600061151b8261219e565b601f01601f191690565b60601b90565b6121ad81612108565b81146121b857600080fd5b50565b6121ad81612113565b6121ad816109e256fea365627a7a723158201603450ff51bc5c0fb9b850f42b520b3a83b53571990145de278bf6deafa12196c6578706572696d656e74616cf564736f6c634300050c0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
-----Decoded View---------------
Arg [0] : registry (address): 0xD1E5b0FF1287aA9f9A268759062E4Ab08b9Dacbe
Arg [1] : mintingController (address): 0xb0EE56339C3253361730F50c08d3d7817ecD60Ca
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d1e5b0ff1287aa9f9a268759062e4ab08b9dacbe
Arg [1] : 000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Deployed Bytecode Sourcemap
49753:10169:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49753:10169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55441:423;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51618:179;;;;;;;;;:::i;:::-;;;;;;;;52033:118;;;;;;;;;:::i;51086:113::-;;;;;;;;;:::i;:::-;;54432:180;;;;;;;;;:::i;52991:215::-;;;;;;;;;:::i;:::-;;;;;;;;;45385:108;;;;;;;;;:::i;:::-;;;;;;;;45118:96;;;:::i;:::-;;;;;;;;52382:328;;;;;;;;;:::i;56395:352::-;;;;;;;;;:::i;57365:340::-;;;;;;;;;:::i;53494:449::-;;;;;;;;;:::i;:::-;;;;;;;;;51207:218;;;;;;;;;:::i;54905:338::-;;;;;;;;;:::i;55872:224::-;;;;;;;;;:::i;53951:283::-;;;;;;;;;:::i;56954:174::-;;;;;;;;;:::i;55441:423::-;50818:9;;:29;;-1:-1:-1;;;50818:29:0;;55544:15;;55526:7;;-1:-1:-1;;;;;50818:9:0;;;;:20;;:29;;55526:7;;50818:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50818:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50818:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50818:29:0;;;;;;;;;-1:-1:-1;;;;;50801:46:0;50809:4;-1:-1:-1;;;;;50801:46:0;;50793:88;;;;-1:-1:-1;;;50793:88:0;;;;;;;;;;;;;;;;;55638:22;;;;;;;;;;;;;;;;55591:4;;55613:22;;55591:4;55638:22;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55671:14:0;55688:22;;;:13;:22;;;;;;55613:47;;-1:-1:-1;55721:112:0;55745:8;55741:1;:12;55721:112;;;55787:17;;;;:8;:17;;;;;;;;:25;;;;;;;;55813:4;;55818:1;55813:7;;;;;;;;;;;;-1:-1:-1;30:25;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;-1:-1;;;;;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:37;;;137:52;;134:2;;;202:1;199;192:12;134:2;55787:34:0;;;;;;;;;;;;;;;;;;;;;;;;55775:46;;;;;;;;;-1:-1:-1;;55775:46:0;;;;;;;;;;;;;;;;;;;;;;;55787:34;;;;55775:46;;;55787:34;55775:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;55782:1;55775:9;;;;;;;;;;;;;;;;;:46;55755:3;;55721:112;;;-1:-1:-1;55850:6:0;;55441:423;-1:-1:-1;;;;;;;55441:423:0:o;51618:179::-;50818:9;;:29;;-1:-1:-1;;;50818:29:0;;51710:13;;51692:7;;-1:-1:-1;;;;;50818:9:0;;;;:20;;:29;;51692:7;;50818:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50818:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50818:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50818:29:0;;;;;;;;;-1:-1:-1;;;;;50801:46:0;50809:4;-1:-1:-1;;;;;50801:46:0;;50793:88;;;;-1:-1:-1;;;50793:88:0;;;;;;;;;51743:17;;;;:8;:17;;;;;;;;51761:13;:22;;;;;;51743:41;;;;;;;;;:46;;;;51785:3;;51743:46;;;;;;;;;;;;;;;;;;51736:53;;;;;;;;;-1:-1:-1;;51736:53:0;;;;;;;;;;;;;;;;;;;;;;;51743:46;;;;51736:53;;;51743:46;51736:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51618:179;;;;;:::o;52033:118::-;52123:20;;;;:11;:20;;;;;;;;;52116:27;;;;;;-1:-1:-1;;52116:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52090:13;;52116:27;;;52123:20;52116:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52033:118;;;:::o;51086:113::-;50974:9;;:48;;-1:-1:-1;;;50974:48:0;;51147:7;;-1:-1:-1;;;;;50974:9:0;;:27;;:48;;51002:10;;51147:7;;50974:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50974:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50974:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50974:48:0;;;;;;;;;50966:92;;;;-1:-1:-1;;;50966:92:0;;;;;;;;;51167:24;51178:3;51183:7;51167:10;:24::i;:::-;51086:113;;:::o;54432:180::-;50974:9;;:48;;-1:-1:-1;;;50974:48:0;;54535:7;;-1:-1:-1;;;;;50974:9:0;;:27;;:48;;51002:10;;54535:7;;50974:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50974:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50974:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50974:48:0;;;;;;;;;50966:92;;;;-1:-1:-1;;;50966:92:0;;;;;;;;;54555:49;54560:13;:22;54574:7;54560:22;;;;;;;;;;;;54584:3;;54555:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;54555:49:0;;;;137:4:-1;54555:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;54589:5:0;;-1:-1:-1;54589:5:0;;;;54555:49;;54589:5;;;;54555:49;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;54596:7:0;;-1:-1:-1;54555:4:0;;-1:-1:-1;;54555:49:0:i;:::-;54432:180;;;;;;:::o;52991:215::-;50818:9;;:29;;-1:-1:-1;;;50818:29:0;;53087:17;;;;53069:7;;-1:-1:-1;;;;;50818:9:0;;:20;;:29;;53069:7;;50818:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50818:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50818:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50818:29:0;;;;;;;;;-1:-1:-1;;;;;50801:46:0;50809:4;-1:-1:-1;;;;;50801:46:0;;50793:88;;;;-1:-1:-1;;;50793:88:0;;;;;;;;;53144:18;53154:7;53144:9;:18::i;:::-;53138:24;;53181:17;53185:3;53190:7;53181:3;:17::i;:::-;53173:25;;52991:215;;;;;;:::o;45385:108::-;45442:7;45469:16;;;;;;;;;;;;45385:108::o;45118:96::-;45196:9;;-1:-1:-1;;;;;45196:9:0;45118:96;;:::o;52382:328::-;52450:15;52478:16;52497:6;:13;52478:32;;52521:22;52559:8;52546:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52521:47:0;-1:-1:-1;52584:9:0;52579:98;52603:8;52599:1;:12;52579:98;;;52645:20;52655:6;52662:1;52655:9;;;;;;;;;;;;;;52645;:20::i;:::-;52633:6;52640:1;52633:9;;;;;;;;;;;;;;;;;:32;52613:3;;52579:98;;;-1:-1:-1;52696:6:0;52382:328;-1:-1:-1;;;52382:328:0:o;56395:352::-;56563:110;56606:21;;;56629:4;56635:6;56643:7;56583:68;;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;56583:68:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;56583:68:0;;;179:29:-1;;;;160:49;;56573:79:0;;;56654:7;56663:9;56563;:110::i;:::-;56693:22;;;;:13;:22;;;;;;56684:55;;56717:4;56723:6;56707:7;56684:8;:55::i;:::-;56395:352;;;;:::o;57365:340::-;57537:114;57580:25;;;57607:4;57613:6;57621:7;57557:72;;;;;;;;;;;57537:114;57662:35;57675:4;57681:6;57689:7;57662:12;:35::i;53494:449::-;50818:9;;:29;;-1:-1:-1;;;50818:29:0;;53630:20;;;;53612:7;;-1:-1:-1;;;;;50818:9:0;;:20;;:29;;53612:7;;50818:29;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50818:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50818:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50818:29:0;;;;;;;;;-1:-1:-1;;;;;50801:46:0;50809:4;-1:-1:-1;;;;;50801:46:0;;50793:88;;;;-1:-1:-1;;;50793:88:0;;;;;;;;;53706:16;;53740:22;;;;;;;;;;;;;;;;53706:16;53740:22;;;;;;;;;;;;;;;;;;;;;;;;;53733:29;;53795:8;53782:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53773:31:0;-1:-1:-1;53820:9:0;53815:121;53839:8;53835:1;:12;53815:121;;;53892:32;53902:9;53912:1;53902:12;;;;;;;;;;;;;;53916:7;53892:9;:32::i;:::-;53870:7;;:4;;53875:1;;53870:7;;;;;;;;;;;53879:6;53886:1;53879:9;;;;;;;;;;;;;;;;;53869:55;;;;;53849:3;;53815:121;;;;50892:1;53494:449;;;;;;:::o;51207:218::-;51288:94;51331:19;;;51352:7;51308:52;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;51308:52:0;;;49:4:-1;25:18;;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;51308:52:0;;;179:29:-1;;;;160:49;;51298:63:0;;;;;51288:94;;;;;;;;;;;;;;;;;;;;51298:63;51363:7;;51372:9;;;;;;51288:94;;51372:9;;;;51288:94;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;51288:9:0;;-1:-1:-1;;;51288:94:0:i;:::-;51393:24;51404:3;51409:7;51393:10;:24::i;:::-;51207:218;;;:::o;54905:338::-;55071:104;55114:17;;;55133:3;;55138:5;;55145:7;55091:62;;;;;;;;;;;;;55071:104;55186:49;55191:13;:22;55205:7;55191:22;;;;;;;;;;;;55215:3;;55186:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;55186:49:0;;;;137:4:-1;55186:49:0;;;;;;;;;;;;;;;;;;-1:-1:-1;55220:5:0;;-1:-1:-1;55220:5:0;;;;55186:49;;55220:5;;;;55186:49;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;55227:7:0;;-1:-1:-1;55186:4:0;;-1:-1:-1;;55186:49:0:i;:::-;54905:338;;;;;;;:::o;55872:224::-;50974:9;;:48;;-1:-1:-1;;;50974:48:0;;56013:7;;-1:-1:-1;;;;;50974:9:0;;:27;;:48;;51002:10;;56013:7;;50974:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50974:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50974:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50974:48:0;;;;;;;;;50966:92;;;;-1:-1:-1;;;50966:92:0;;;;;;;;53951:283;54096:18;;:39;;-1:-1:-1;;;54096:39:0;;-1:-1:-1;;;;;54096:18:0;;;;:27;;:39;;54124:10;;54096:39;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54096:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54096:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54096:39:0;;;;;;;;;54088:72;;;;-1:-1:-1;;;54088:72:0;;;;;;;;;54180:22;;;;:13;:22;;;;;;54171:55;;54204:4;54210:6;54194:7;54171:8;:55::i;56954:174::-;50974:9;;:48;;-1:-1:-1;;;50974:48:0;;57065:7;;-1:-1:-1;;;;;50974:9:0;;:27;;:48;;51002:10;;57065:7;;50974:48;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50974:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50974:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50974:48:0;;;;;;;;;50966:92;;;;-1:-1:-1;;;50966:92:0;;;;;;;;57735:240;57810:22;;;;:13;:22;;;;;;:33;;;57854:9;;:26;;-1:-1:-1;;;57854:26:0;;-1:-1:-1;;;;;57854:9:0;;;;:14;;:26;;57824:7;;57854:26;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57854:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;57946:21:0;;57959:7;;-1:-1:-1;57946:21:0;;-1:-1:-1;57946:21:0;;;57735:240;;:::o;58300:576::-;58433:21;;;;;;;;;;58407:15;58488:17;;;:8;:17;;;;;;:25;;;;;;;;;:30;;58433:21;;58407:15;;58488:30;;58449:3;;58488:30;;;;;;;;;;;;;;;;;;;58482:44;;58542:9;;-1:-1:-1;;;58542:32:0;;58482:44;;;;;;;-1:-1:-1;;58482:44:0;;;;;:49;;-1:-1:-1;;;;;;58542:9:0;;:14;;:32;;58557:7;;58566;;58542:32;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58542:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;58585:17:0;;;;:8;:17;;;;;;;;:25;;;;;;;;;;:30;;58618:5;;-1:-1:-1;58585:30:0;;58611:3;;58585:30;;;;;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;-1:-1:-1;58646:20:0;;;;:11;:20;;;;;58640:34;;-1:-1:-1;;58640:34:0;;;;;;;;;;;58636:98;;58696:20;;;;:11;:20;;;;;;;;:26;;;;;;;;:::i;:::-;;58636:98;58750:8;58746:71;;;58796:3;58780:25;;;;;;;;;;;;;;;58787:7;58780:25;58801:3;58780:25;;;;;;;;;;;;;;;58746:71;58850:5;58832:36;;;;;;;;;;;;;;;58845:3;58832:36;;;;;;;;;;;;;;;58836:7;58832:36;58857:3;58862:5;58832:36;;;;;;;;;;;;;;;;58300:576;;;;;;:::o;45501:505::-;45595:13;45611:16;;;;;;;;;;;;45667:44;;45611:16;;45595:13;45657:99;;45746:9;;45657:80;;45667:44;;45684:4;;45698;;45611:16;;45667:44;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45667:44:0;;;45657:55;;;;;;:78;:80::i;:::-;:88;:99;:88;:99;:::i;:::-;45640:116;-1:-1:-1;;;;;;45789:20:0;;;;;;:130;;-1:-1:-1;45826:9:0;;:93;;-1:-1:-1;;;45826:93:0;;-1:-1:-1;;;;;45826:9:0;;;;:27;;:93;;45872:6;;45897:7;;45826:93;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45826:93:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45826:93:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45826:93:0;;;;;;;;;45767:197;;;;-1:-1:-1;;;45767:197:0;;;;;;;;;-1:-1:-1;;;45977:7:0;:16;;;;;;;;;;:21;;45997:1;45977:21;;;-1:-1:-1;45501:505:0:o;59227:272::-;59363:11;;59344:16;59385:107;59409:8;59405:1;:12;59385:107;;;59439:41;59444:6;59452:4;59457:1;59452:7;;;;;;;;;;;;;;59461:6;59468:1;59461:9;;;;;;;;;;;;;;59472:7;59439:4;:41::i;:::-;59419:3;;59385:107;;59714:203;59819:24;59830:3;59835:7;59819:10;:24::i;44533:269::-;44602:7;44788:4;44735:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;44735:58:0;;;44725:69;;;;;;44718:76;;44533:269;;;:::o;42327:1930::-;42405:7;42468:9;:16;42488:2;42468:22;42464:74;;-1:-1:-1;42523:1:0;42507:19;;42464:74;42899:4;42884:20;;42878:27;42945:4;42930:20;;42924:27;42999:4;42984:20;;42978:27;42607:9;42970:36;43929:66;43916:79;;43912:129;;;44027:1;44012:17;;;;;;;43912:129;44057:1;:7;;44062:2;44057:7;;:18;;;;;44068:1;:7;;44073:2;44068:7;;44057:18;44053:68;;;44107:1;44092:17;;;;;;;44053:68;44225:24;44235:4;44241:1;44244;44247;44225:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44225:24:0;;;;;;;;44218:31;;;;;42327:1930;;;;;:::o;49753:10169::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49753:10169:0;;;-1:-1:-1;49753:10169:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;5:134:-1;83:13;;101:33;83:13;101:33;;163:360;;;301:3;294:4;286:6;282:17;278:27;268:2;;319:1;316;309:12;268:2;-1:-1;339:20;;-1:-1;;;;;368:30;;365:2;;;411:1;408;401:12;365:2;445:4;437:6;433:17;421:29;;496:3;488:4;480:6;476:17;466:8;462:32;459:41;456:2;;;513:1;510;503:12;456:2;261:262;;;;;;548:696;;671:3;664:4;656:6;652:17;648:27;638:2;;689:1;686;679:12;638:2;726:6;713:20;748:86;763:70;826:6;763:70;;;748:86;;;862:21;;;906:4;894:17;;;;739:95;;-1:-1;919:14;;894:17;1014:1;999:239;1024:6;1021:1;1018:13;999:239;;;1107:3;1094:17;1086:6;1082:30;1131:43;1170:3;1158:10;1131:43;;;1119:56;;-1:-1;1198:4;1189:14;;;;1217;;;;;1046:1;1039:9;999:239;;;1003:14;631:613;;;;;;;;1270:707;;1387:3;1380:4;1372:6;1368:17;1364:27;1354:2;;1405:1;1402;1395:12;1354:2;1442:6;1429:20;1464:80;1479:64;1536:6;1479:64;;1464:80;1455:89;;1561:5;1586:6;1579:5;1572:21;1616:4;1608:6;1604:17;1594:27;;1638:4;1633:3;1629:14;1622:21;;1691:6;1738:3;1730:4;1722:6;1718:17;1713:3;1709:27;1706:36;1703:2;;;1755:1;1752;1745:12;1703:2;1780:1;1765:206;1790:6;1787:1;1784:13;1765:206;;;1848:3;1870:37;1903:3;1891:10;1870:37;;;1858:50;;-1:-1;1931:4;1922:14;;;;1950;;;;;1812:1;1805:9;1765:206;;1985:128;2060:13;;2078:30;2060:13;2078:30;;2134:335;;;2248:3;2241:4;2233:6;2229:17;2225:27;2215:2;;2266:1;2263;2256:12;2215:2;-1:-1;2286:20;;-1:-1;;;;;2315:30;;2312:2;;;2358:1;2355;2348:12;2312:2;2392:4;2384:6;2380:17;2368:29;;2442:3;2435;2427:6;2423:16;2413:8;2409:31;2406:40;2403:2;;;2459:1;2456;2449:12;2478:440;;2579:3;2572:4;2564:6;2560:17;2556:27;2546:2;;2597:1;2594;2587:12;2546:2;2634:6;2621:20;2656:64;2671:48;2712:6;2671:48;;2656:64;2647:73;;2740:6;2733:5;2726:21;2776:4;2768:6;2764:17;2809:4;2802:5;2798:16;2844:3;2835:6;2830:3;2826:16;2823:25;2820:2;;;2861:1;2858;2851:12;2820:2;2871:41;2905:6;2900:3;2895;2871:41;;;2539:379;;;;;;;;4179:130;4246:20;;4271:33;4246:20;4271:33;;4316:263;;4431:2;4419:9;4410:7;4406:23;4402:32;4399:2;;;4447:1;4444;4437:12;4399:2;4482:1;4499:64;4555:7;4535:9;4499:64;;;4489:74;4393:186;-1:-1;;;;4393:186;4586:538;;;;4750:2;4738:9;4729:7;4725:23;4721:32;4718:2;;;4766:1;4763;4756:12;4718:2;4801:31;;-1:-1;;;;;4841:30;;4838:2;;;4884:1;4881;4874:12;4838:2;4912:88;4992:7;4983:6;4972:9;4968:22;4912:88;;;4902:98;;;;4780:226;5037:2;5055:53;5100:7;5091:6;5080:9;5076:22;5055:53;;;5045:63;;5016:98;4712:412;;;;;;5131:787;;;;5331:2;5319:9;5310:7;5306:23;5302:32;5299:2;;;5347:1;5344;5337:12;5299:2;5382:31;;-1:-1;;;;;5422:30;;5419:2;;;5465:1;5462;5455:12;5419:2;5485:84;5561:7;5552:6;5541:9;5537:22;5485:84;;;5475:94;;5361:214;5634:2;5623:9;5619:18;5606:32;-1:-1;;;;;5650:6;5647:30;5644:2;;;5690:1;5687;5680:12;5644:2;5710:84;5786:7;5777:6;5766:9;5762:22;5710:84;;;5700:94;;5585:215;5831:2;5849:53;5894:7;5885:6;5874:9;5870:22;5849:53;;5925:1017;;;;;6151:3;6139:9;6130:7;6126:23;6122:33;6119:2;;;6168:1;6165;6158:12;6119:2;6203:31;;-1:-1;;;;;6243:30;;6240:2;;;6286:1;6283;6276:12;6240:2;6306:84;6382:7;6373:6;6362:9;6358:22;6306:84;;;6296:94;;6182:214;6455:2;6444:9;6440:18;6427:32;-1:-1;;;;;6471:6;6468:30;6465:2;;;6511:1;6508;6501:12;6465:2;6531:84;6607:7;6598:6;6587:9;6583:22;6531:84;;;6521:94;;6406:215;6652:2;6670:53;6715:7;6706:6;6695:9;6691:22;6670:53;;;6660:63;;6631:98;6788:2;6777:9;6773:18;6760:32;-1:-1;;;;;6804:6;6801:30;6798:2;;;6844:1;6841;6834:12;6798:2;6864:62;6918:7;6909:6;6898:9;6894:22;6864:62;;;6854:72;;6739:193;6113:829;;;;;;;;6949:377;;7078:2;7066:9;7057:7;7053:23;7049:32;7046:2;;;7094:1;7091;7084:12;7046:2;7129:31;;-1:-1;;;;;7169:30;;7166:2;;;7212:1;7209;7202:12;7166:2;7232:78;7302:7;7293:6;7282:9;7278:22;7232:78;;7333:502;;;7479:2;7467:9;7458:7;7454:23;7450:32;7447:2;;;7495:1;7492;7485:12;7447:2;7530:31;;-1:-1;;;;;7570:30;;7567:2;;;7613:1;7610;7603:12;7567:2;7633:78;7703:7;7694:6;7683:9;7679:22;7633:78;;;7623:88;;7509:208;7748:2;7766:53;7811:7;7802:6;7791:9;7787:22;7766:53;;7842:257;;7954:2;7942:9;7933:7;7929:23;7925:32;7922:2;;;7970:1;7967;7960:12;7922:2;8005:1;8022:61;8075:7;8055:9;8022:61;;8106:743;;;;;;8284:2;8272:9;8263:7;8259:23;8255:32;8252:2;;;8300:1;8297;8290:12;8252:2;8335:31;;-1:-1;;;;;8375:30;;8372:2;;;8418:1;8415;8408:12;8372:2;8446:65;8503:7;8494:6;8483:9;8479:22;8446:65;;;8436:75;;;;8314:203;8576:2;8565:9;8561:18;8548:32;-1:-1;;;;;8592:6;8589:30;8586:2;;;8632:1;8629;8622:12;8586:2;8660:65;8717:7;8708:6;8697:9;8693:22;8660:65;;;8650:75;;;;8527:204;8762:2;8780:53;8825:7;8816:6;8805:9;8801:22;8780:53;;;8770:63;;8741:98;8246:603;;;;;;;;;8856:993;;;;;;;;9070:3;9058:9;9049:7;9045:23;9041:33;9038:2;;;9087:1;9084;9077:12;9038:2;9122:31;;-1:-1;;;;;9162:30;;9159:2;;;9205:1;9202;9195:12;9159:2;9233:65;9290:7;9281:6;9270:9;9266:22;9233:65;;;9223:75;;;;9101:203;9363:2;9352:9;9348:18;9335:32;-1:-1;;;;;9379:6;9376:30;9373:2;;;9419:1;9416;9409:12;9373:2;9447:65;9504:7;9495:6;9484:9;9480:22;9447:65;;;9437:75;;;;9314:204;9549:2;9567:53;9612:7;9603:6;9592:9;9588:22;9567:53;;;9557:63;;9528:98;9685:2;9674:9;9670:18;9657:32;-1:-1;;;;;9701:6;9698:30;9695:2;;;9741:1;9738;9731:12;9695:2;9769:64;9825:7;9816:6;9805:9;9801:22;9769:64;;;9759:74;;;;9636:203;9032:817;;;;;;;;;;;9856:472;;;9987:2;9975:9;9966:7;9962:23;9958:32;9955:2;;;10003:1;10000;9993:12;9955:2;10038:31;;-1:-1;;;;;10078:30;;10075:2;;;10121:1;10118;10111:12;10075:2;10141:63;10196:7;10187:6;10176:9;10172:22;10141:63;;10335:241;;10439:2;10427:9;10418:7;10414:23;10410:32;10407:2;;;10455:1;10452;10445:12;10407:2;10490:1;10507:53;10552:7;10532:9;10507:53;;10583:490;;;;10723:2;10711:9;10702:7;10698:23;10694:32;10691:2;;;10739:1;10736;10729:12;10691:2;10774:1;10791:53;10836:7;10816:9;10791:53;;;10781:63;;10753:97;10909:2;10898:9;10894:18;10881:32;-1:-1;;;;;10925:6;10922:30;10919:2;;;10965:1;10962;10955:12;10919:2;10993:64;11049:7;11040:6;11029:9;11025:22;10993:64;;;10983:74;;;;10860:203;10685:388;;;;;;11080:366;;;11201:2;11189:9;11180:7;11176:23;11172:32;11169:2;;;11217:1;11214;11207:12;11169:2;11252:1;11269:53;11314:7;11294:9;11269:53;;11454:181;;11567:62;11625:3;11617:6;11567:62;;;11553:76;11546:89;-1:-1;;;11546:89;11643:142;11734:45;11773:5;11734:45;;;11729:3;11722:58;11716:69;;;11792:113;11875:24;11893:5;11875:24;;11912:152;12013:45;12033:24;12051:5;12033:24;;;12013:45;;12100:896;;12257:60;12311:5;12257:60;;;12330:92;12415:6;12410:3;12330:92;;;12323:99;;12445:3;12487:4;12479:6;12475:17;12470:3;12466:27;12514:62;12570:5;12514:62;;;12596:7;12624:1;12609:348;12634:6;12631:1;12628:13;12609:348;;;12696:9;12690:4;12686:20;12681:3;12674:33;12741:6;12735:13;12763:76;12834:4;12819:13;12763:76;;;12755:84;;12856:66;12915:6;12856:66;;;12945:4;12936:14;;;;;12846:76;-1:-1;;12656:1;12649:9;12609:348;;;-1:-1;12970:4;;12236:760;-1:-1;;;;;;;12236:760;13004:113;13087:24;13105:5;13087:24;;13124:152;13225:45;13245:24;13263:5;13245:24;;;13225:45;;13283:142;13374:45;13413:5;13374:45;;13457:300;;13573:71;13637:6;13632:3;13573:71;;;13566:78;;13656:43;13692:6;13687:3;13680:5;13656:43;;;13721:29;13743:6;13721:29;;;13712:39;;;;13559:198;-1:-1;;;13559:198;13790:309;;13920:89;14002:6;13997:3;13920:89;;;13913:96;;14021:43;14057:6;14052:3;14045:5;14021:43;;;-1:-1;;14077:16;;13906:193;14107:347;;14219:39;14252:5;14219:39;;;14270:71;14334:6;14329:3;14270:71;;;14263:78;;14346:52;14391:6;14386:3;14379:4;14372:5;14368:16;14346:52;;;14419:29;14441:6;14419:29;;14461:360;;14591:39;14624:5;14591:39;;;14642:89;14724:6;14719:3;14642:89;;;14635:96;;14736:52;14781:6;14776:3;14769:4;14762:5;14758:16;14736:52;;;14800:16;;;;;14571:250;-1:-1;;14571:250;15155:400;;15333:85;15415:2;15410:3;15333:85;;;15451:66;15431:87;;15546:2;15537:12;;15319:236;-1:-1;;15319:236;15564:364;;15724:67;15788:2;15783:3;15724:67;;;-1:-1;;;15804:87;;15919:2;15910:12;;15710:218;-1:-1;;15710:218;15937:364;;16097:67;16161:2;16156:3;16097:67;;;16197:66;16177:87;;16292:2;16283:12;;16083:218;-1:-1;;16083:218;16310:364;;16470:67;16534:2;16529:3;16470:67;;;16570:66;16550:87;;16665:2;16656:12;;16456:218;-1:-1;;16456:218;16683:364;;16843:67;16907:2;16902:3;16843:67;;;-1:-1;;;16923:87;;17038:2;17029:12;;16829:218;-1:-1;;16829:218;17334:107;17413:22;17429:5;17413:22;;17448:522;;17623:75;17694:3;17685:6;17623:75;;;17720:2;17715:3;17711:12;17704:19;;17734:75;17805:3;17796:6;17734:75;;;17831:2;17826:3;17822:12;17815:19;;17845:75;17916:3;17907:6;17845:75;;;-1:-1;17942:2;17933:12;;17611:359;-1:-1;;;17611:359;17977:278;;18129:101;18226:3;18217:6;18209;18129:101;;18262:266;;18408:95;18499:3;18490:6;18408:95;;18535:511;;18762:148;18906:3;18762:148;;;18755:155;;18921:75;18992:3;18983:6;18921:75;;;-1:-1;19018:2;19009:12;;18743:303;-1:-1;18743:303;19053:213;19171:2;19156:18;;19185:71;19160:9;19229:6;19185:71;;19273:229;19399:2;19384:18;;19413:79;19388:9;19465:6;19413:79;;19509:340;19663:2;19648:18;;19677:79;19652:9;19729:6;19677:79;;;19767:72;19835:2;19824:9;19820:18;19811:6;19767:72;;19856:324;20002:2;19987:18;;20016:71;19991:9;20060:6;20016:71;;20187:385;20367:2;20381:47;;;20352:18;;20442:120;20352:18;20548:6;20442:120;;20579:668;20849:2;20863:47;;;20834:18;;20924:120;20834:18;21030:6;20924:120;;;20916:128;;21092:9;21086:4;21082:20;21077:2;21066:9;21062:18;21055:48;21117:120;21232:4;21223:6;21117:120;;21254:779;21552:2;21566:47;;;21537:18;;21627:120;21537:18;21733:6;21627:120;;;21619:128;;21795:9;21789:4;21785:20;21780:2;21769:9;21765:18;21758:48;21820:120;21935:4;21926:6;21820:120;;;21812:128;;21951:72;22019:2;22008:9;22004:18;21995:6;21951:72;;22040:539;22238:3;22223:19;;22253:71;22227:9;22297:6;22253:71;;;22335:68;22399:2;22388:9;22384:18;22375:6;22335:68;;;22414:72;22482:2;22471:9;22467:18;22458:6;22414:72;;;22497;22565:2;22554:9;22550:18;22541:6;22497:72;;;22209:370;;;;;;;;22586:651;22820:2;22834:47;;;22805:18;;22895:88;22805:18;22969:6;22961;22895:88;;;22887:96;;23031:9;23025:4;23021:20;23016:2;23005:9;23001:18;22994:48;23056:88;23139:4;23130:6;23122;23056:88;;;23048:96;;23155:72;23223:2;23212:9;23208:18;23199:6;23155:72;;;22791:446;;;;;;;;;23244:301;23382:2;23396:47;;;23367:18;;23457:78;23367:18;23521:6;23457:78;;23552:500;23738:2;23752:47;;;23723:18;;23813:78;23723:18;23877:6;23813:78;;;23805:86;;23939:9;23933:4;23929:20;23924:2;23913:9;23909:18;23902:48;23964:78;24037:4;24028:6;23964:78;;24059:407;24250:2;24264:47;;;24235:18;;24325:131;24235:18;24325:131;;24473:407;24664:2;24678:47;;;24649:18;;24739:131;24649:18;24739:131;;24887:407;25078:2;25092:47;;;25063:18;;25153:131;25063:18;25153:131;;25301:407;25492:2;25506:47;;;25477:18;;25567:131;25477:18;25567:131;;25715:213;25833:2;25818:18;;25847:71;25822:9;25891:6;25847:71;;25935:340;26089:2;26074:18;;26103:71;26078:9;26147:6;26103:71;;;26185:80;26261:2;26250:9;26246:18;26237:6;26185:80;;26282:324;26428:2;26413:18;;26442:71;26417:9;26486:6;26442:71;;26613:256;26675:2;26669:9;26701:17;;;-1:-1;;;;;26761:34;;26797:22;;;26758:62;26755:2;;;26833:1;26830;26823:12;26755:2;26849;26842:22;26653:216;;-1:-1;26653:216;26876:310;;-1:-1;;;;;27033:6;27030:30;27027:2;;;27073:1;27070;27063:12;27027:2;-1:-1;27108:4;27096:17;;;27161:15;;26964:222;27504:321;;-1:-1;;;;;27639:6;27636:30;27633:2;;;27679:1;27676;27669:12;27633:2;-1:-1;27810:4;27746;27723:17;;;;-1:-1;;27719:33;27800:15;;27570:255;28486:157;28616:4;28607:14;;28564:79;28650:143;28759:12;;28730:63;29176:184;29300:19;;;29349:4;29340:14;;29293:67;29703:145;29839:3;29817:31;-1:-1;29817:31;29856:91;;29918:24;29936:5;29918:24;;29954:85;30020:13;30013:21;;29996:43;30125:121;-1:-1;;;;;30187:54;;30170:76;30332:81;30403:4;30392:16;;30375:38;30420:129;;30507:37;30538:5;30507:37;;30556:116;;30643:24;30661:5;30643:24;;30679:121;;30758:37;30789:5;30758:37;;30923:145;31004:6;30999:3;30994;30981:30;-1:-1;31060:1;31042:16;;31035:27;30974:94;31077:268;31142:1;31149:101;31163:6;31160:1;31157:13;31149:101;;;31230:11;;;31224:18;31211:11;;;31204:39;31185:2;31178:10;31149:101;;;31265:6;31262:1;31259:13;31256:2;;;-1:-1;;31330:1;31312:16;;31305:27;31126:219;31353:95;;31417:26;31437:5;31536:89;31600:20;31614:5;31600:20;;31713:97;31801:2;31781:14;-1:-1;;31777:28;;31761:49;31818:94;31892:2;31888:14;;31860:52;31920:117;31989:24;32007:5;31989:24;;;31982:5;31979:35;31969:2;;32028:1;32025;32018:12;31969:2;31963:74;;32044:111;32110:21;32125:5;32110:21;;32162:117;32231:24;32249:5;32231:24;
Swarm Source
bzzr://1603450ff51bc5c0fb9b850f42b520b3a83b53571990145de278bf6deafa1219
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.