Feature Tip: Add private address tag to any address under My Name Tag !
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| 0x7e57d61cd249cf036ba2f36137e60b1cfb7ce6b6ce56b93fbf130511edc3d356 | Set Many | (pending) | 2 days ago | IN | 0 ETH | (Pending) | |||
| Set Many | 24020770 | 32 days ago | IN | 0 ETH | 0.00024771 | ||||
| Set Many | 24020232 | 32 days ago | IN | 0 ETH | 0.00010678 | ||||
| Set Many | 24020197 | 32 days ago | IN | 0 ETH | 0.00024991 | ||||
| Set Many | 24020115 | 32 days ago | IN | 0 ETH | 0.00010863 | ||||
| Set Many | 24013350 | 33 days ago | IN | 0 ETH | 0.00024866 | ||||
| Set Many | 24013338 | 33 days ago | IN | 0 ETH | 0.00010689 | ||||
| Set Many | 24012527 | 33 days ago | IN | 0 ETH | 0.0002487 | ||||
| Set Many | 24012432 | 33 days ago | IN | 0 ETH | 0.00010697 | ||||
| Set Many | 24012393 | 33 days ago | IN | 0 ETH | 0.00024946 | ||||
| Set Many | 24012380 | 33 days ago | IN | 0 ETH | 0.00010691 | ||||
| Set Many | 24011714 | 33 days ago | IN | 0 ETH | 0.00024899 | ||||
| Set Many | 24011658 | 33 days ago | IN | 0 ETH | 0.0001068 | ||||
| Set Many | 24006161 | 34 days ago | IN | 0 ETH | 0.00024665 | ||||
| Set Many | 24006137 | 34 days ago | IN | 0 ETH | 0.00010607 | ||||
| Set Many | 24005923 | 34 days ago | IN | 0 ETH | 0.00024664 | ||||
| Set Many | 24005737 | 34 days ago | IN | 0 ETH | 0.00010735 | ||||
| Set Many | 23992677 | 36 days ago | IN | 0 ETH | 0.00025603 | ||||
| Set Many | 23992667 | 36 days ago | IN | 0 ETH | 0.00011032 | ||||
| Set Many | 23992365 | 36 days ago | IN | 0 ETH | 0.00025677 | ||||
| Set Many | 23992233 | 36 days ago | IN | 0 ETH | 0.00011014 | ||||
| Set Many | 23991568 | 36 days ago | IN | 0 ETH | 0.00025874 | ||||
| Set Many | 23991517 | 36 days ago | IN | 0 ETH | 0.00011006 | ||||
| Set Many | 23991457 | 36 days ago | IN | 0 ETH | 0.00025773 | ||||
| Set Many | 23991440 | 36 days ago | IN | 0 ETH | 0.0001108 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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.