Contract
0xB485D89aBA096Fc9F117fA28B80dC8AAC7971049
5
More Info
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
View more zero value Internal Transactions in Advanced View mode
Contract Name:
WhitelistedMinter
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-12-14 */ // File: @openzeppelin/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @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]; } } // File: @openzeppelin/contracts/access/roles/WhitelistAdminRole.sol pragma solidity ^0.5.0; /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(msg.sender); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(msg.sender), "WhitelistAdminRole: caller does not have the WhitelistAdmin role"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(msg.sender); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } // File: @openzeppelin/contracts/access/roles/WhitelistedRole.sol pragma solidity ^0.5.0; /** * @title WhitelistedRole * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove * it), and not Whitelisteds themselves. */ contract WhitelistedRole is WhitelistAdminRole { using Roles for Roles.Role; event WhitelistedAdded(address indexed account); event WhitelistedRemoved(address indexed account); Roles.Role private _whitelisteds; modifier onlyWhitelisted() { require(isWhitelisted(msg.sender), "WhitelistedRole: caller does not have the Whitelisted role"); _; } function isWhitelisted(address account) public view returns (bool) { return _whitelisteds.has(account); } function addWhitelisted(address account) public onlyWhitelistAdmin { _addWhitelisted(account); } function removeWhitelisted(address account) public onlyWhitelistAdmin { _removeWhitelisted(account); } function renounceWhitelisted() public { _removeWhitelisted(msg.sender); } function _addWhitelisted(address account) internal { _whitelisteds.add(account); emit WhitelistedAdded(account); } function _removeWhitelisted(address account) internal { _whitelisteds.remove(account); emit WhitelistedRemoved(account); } } // File: contracts/util/BulkWhitelistedRole.sol pragma solidity 0.5.12; /** * @title BulkWhitelistedRole * @dev a Whitelist role defined using the Open Zeppelin Role system with the addition of bulkAddWhitelisted and * bulkRemoveWhitelisted. * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove * it), and not Whitelisteds themselves. */ contract BulkWhitelistedRole is WhitelistedRole { function bulkAddWhitelisted(address[] memory accounts) public onlyWhitelistAdmin { for (uint256 index = 0; index < accounts.length; index++) { _addWhitelisted(accounts[index]); } } function bulkRemoveWhitelisted(address[] memory accounts) public onlyWhitelistAdmin { for (uint256 index = 0; index < accounts.length; index++) { _removeWhitelisted(accounts[index]); } } } // File: contracts/controllers/IMintingController.sol pragma solidity 0.5.12; 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; } // File: @openzeppelin/contracts/access/roles/MinterRole.sol pragma solidity ^0.5.0; 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); } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; /** * @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; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity ^0.5.0; /** * @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); } // File: contracts/IRegistry.sol pragma solidity 0.5.12; 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; } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @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; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.5.0; /** * @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; } } // File: @openzeppelin/contracts/drafts/Counters.sol pragma solidity ^0.5.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); } } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; /** * @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; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.5.0; /** * @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); } } } // File: @openzeppelin/contracts/token/ERC721/ERC721Burnable.sol pragma solidity ^0.5.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); } } // File: contracts/util/ControllerRole.sol pragma solidity 0.5.12; // 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); } } // File: contracts/Registry.sol pragma solidity 0.5.12; // 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; } } // File: contracts/controllers/MintingController.sol pragma solidity 0.5.12; /** * @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)); } } // File: @openzeppelin/contracts/cryptography/ECDSA.sol pragma solidity ^0.5.0; /** * @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)); } } // File: contracts/util/SignatureUtil.sol pragma solidity 0.5.12; // 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 ) ); _nonces[tokenId] += 1; } } // File: contracts/Resolver.sol pragma solidity 0.5.12; // solium-disable error-reason contract Resolver is SignatureUtil { event Set(uint256 indexed preset, string indexed key, string value, uint256 indexed tokenId); event SetPreset(uint256 indexed preset, 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; 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), "SimpleResolver: is not the resolver"); _; } function presetOf(uint256 tokenId) external view returns (uint256) { return _tokenPresets[tokenId]; } function setPreset(uint256 presetId, uint256 tokenId) external { require(_registry.isApprovedOrOwner(msg.sender, tokenId)); _setPreset(presetId, tokenId); } function setPresetFor(uint256 presetId, uint256 tokenId, bytes calldata signature) external { _validate(keccak256(abi.encodeWithSelector(this.setPreset.selector, presetId, tokenId)), tokenId, signature); _setPreset(presetId, tokenId); } function reset(uint256 tokenId) external { require(_registry.isApprovedOrOwner(msg.sender, 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]; } function preconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) public { require(msg.sender == address(_mintingController)); _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 { require(_registry.isApprovedOrOwner(msg.sender, 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 { require(_registry.isApprovedOrOwner(msg.sender, 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); } function _setPreset(uint256 presetId, uint256 tokenId) internal { _tokenPresets[tokenId] = presetId; emit SetPreset(presetId, 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 { _registry.sync(tokenId, uint256(keccak256(bytes(key)))); _records[tokenId][preset][key] = value; emit Set(preset, key, value, tokenId); } /** * @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); } } } // File: contracts/util/WhitelistedMinter.sol pragma solidity 0.5.12; pragma experimental ABIEncoderV2; /** * @title WhitelistedMinter * @dev Defines the functions for distribution of Second Level Domains (SLD)s. */ contract WhitelistedMinter is IMintingController, BulkWhitelistedRole { MintingController internal _mintingController; Resolver internal _resolver; Registry internal _registry; constructor (MintingController mintingController) public { _mintingController = mintingController; _registry = Registry(mintingController.registry()); } function renounceMinter() external { _mintingController.renounceMinter(); } function mintSLD(address to, string calldata label) external onlyWhitelisted { _mintingController.mintSLD(to, label); } function safeMintSLD(address to, string calldata label) external onlyWhitelisted { _mintingController.safeMintSLD(to, label); } function safeMintSLD(address to, string calldata label, bytes calldata _data) external onlyWhitelisted { _mintingController.safeMintSLD(to, label, _data); } function mintSLDToDefaultResolver(address to, string memory label, string[] memory keys, string[] memory values) public onlyWhitelisted { _mintingController.mintSLDWithResolver(to, label, address(_resolver)); _resolver.preconfigure(keys, values, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDToDefaultResolver(address to, string memory label, string[] memory keys, string[] memory values) public onlyWhitelisted { _mintingController.safeMintSLDWithResolver(to, label, address(_resolver)); _resolver.preconfigure(keys, values, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDToDefaultResolver(address to, string memory label, string[] memory keys, string[] memory values, bytes memory _data) public onlyWhitelisted { _mintingController.safeMintSLDWithResolver(to, label, address(_resolver), _data); _resolver.preconfigure(keys, values, _registry.childIdOf(_registry.root(), label)); } function setDefaultResolver(address resolver) external onlyWhitelistAdmin { _resolver = Resolver(resolver); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract MintingController","name":"mintingController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"bulkAddWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"bulkRemoveWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"}],"name":"mintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"mintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"}],"name":"safeMintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"safeMintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"setDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200196538038062001965833981016040819052620000349162000293565b62000048336001600160e01b036200011816565b600280546001600160a01b0319166001600160a01b038316908117909155604080517f7b1039990000000000000000000000000000000000000000000000000000000081529051637b10399991600480820192602092909190829003018186803b158015620000b657600080fd5b505afa158015620000cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620000f191908101906200026a565b600480546001600160a01b0319166001600160a01b039290921691909117905550620003c8565b620001338160006200016a60201b62000b551790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b6200017f82826001600160e01b03620001e716565b15620001c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b99062000350565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200022c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b99062000362565b506001600160a01b03811660009081526020839052604090205460ff165b92915050565b80516200024a81620003a3565b80516200024a81620003bd565b6000602082840312156200027d57600080fd5b60006200028b848462000250565b949350505050565b600060208284031215620002a657600080fd5b60006200028b84846200025d565b6000620002c3601f8362000374565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b6000620002fe60228362000374565b7f526f6c65733a206163636f756e7420697320746865207a65726f20616464726581527f7373000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b602080825281016200024a81620002b4565b602080825281016200024a81620002ef565b90815260200190565b60006200024a8262000397565b60006200024a826200037d565b6001600160a01b031690565b620003ae816200037d565b8114620003ba57600080fd5b50565b620003ae816200038a565b61158d80620003d86000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80637362d9c8116100a2578063be362e2e11610071578063be362e2e146101f6578063c66485b214610209578063d6cd94731461021c578063f6e491aa14610224578063f8a6c3d6146102375761010b565b80637362d9c8146101b557806398650275146101c8578063b2da2979146101d0578063bb5f747b146101e35761010b565b80634b18abea116100de5780634b18abea146101745780634c0b0ed2146101875780634c5a628c1461019a57806361050ffd146101a25761010b565b806310154bad14610110578063291d9549146101255780633af32abf146101385780633d7989fe14610161575b600080fd5b61012361011e366004610d72565b61024a565b005b610123610133366004610d72565b610284565b61014b610146366004610d72565b6102b2565b60405161015891906113ce565b60405180910390f35b61012361016f366004610e72565b6102cb565b610123610182366004610f18565b6104b0565b610123610195366004610d98565b610698565b610123610728565b6101236101b0366004610e72565b610733565b6101236101c3366004610d72565b61078f565b6101236107bd565b6101236101de366004610d98565b610827565b61014b6101f1366004610d72565b610880565b610123610204366004610ded565b610892565b610123610217366004610d72565b6108ef565b610123610936565b610123610232366004610fe9565b61093f565b610123610245366004610fe9565b610998565b61025333610880565b6102785760405162461bcd60e51b815260040161026f9061140c565b60405180910390fd5b610281816109ed565b50565b61028d33610880565b6102a95760405162461bcd60e51b815260040161026f9061140c565b61028181610a35565b60006102c560018363ffffffff610a7d16565b92915050565b6102d4336102b2565b6102f05760405162461bcd60e51b815260040161026f9061141c565b60025460035460405163c36c212560e01b81526001600160a01b039283169263c36c21259261032792899289921690600401611320565b600060405180830381600087803b15801561034157600080fd5b505af1158015610355573d6000803e3d6000fd5b5050600354600480546040805163ebf0c71760e01b815290516001600160a01b03948516965063e837ae749550889488949316926368b62d3292849263ebf0c71792828101926020929190829003018186803b1580156103b457600080fd5b505afa1580156103c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506103ec919081019061101d565b896040518363ffffffff1660e01b815260040161040a92919061142c565b60206040518083038186803b15801561042257600080fd5b505afa158015610436573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061045a919081019061101d565b6040518463ffffffff1660e01b81526004016104789392919061139a565b600060405180830381600087803b15801561049257600080fd5b505af11580156104a6573d6000803e3d6000fd5b5050505050505050565b6104b9336102b2565b6104d55760405162461bcd60e51b815260040161026f9061141c565b600254600354604051630f95e75b60e31b81526001600160a01b0392831692637caf3ad89261050e928a928a921690879060040161134f565b600060405180830381600087803b15801561052857600080fd5b505af115801561053c573d6000803e3d6000fd5b5050600354600480546040805163ebf0c71760e01b815290516001600160a01b03948516965063e837ae749550899489949316926368b62d3292849263ebf0c71792828101926020929190829003018186803b15801561059b57600080fd5b505afa1580156105af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105d3919081019061101d565b8a6040518363ffffffff1660e01b81526004016105f192919061142c565b60206040518083038186803b15801561060957600080fd5b505afa15801561061d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610641919081019061101d565b6040518463ffffffff1660e01b815260040161065f9392919061139a565b600060405180830381600087803b15801561067957600080fd5b505af115801561068d573d6000803e3d6000fd5b505050505050505050565b6106a1336102b2565b6106bd5760405162461bcd60e51b815260040161026f9061141c565b600254604051632605876960e11b81526001600160a01b0390911690634c0b0ed2906106f1908690869086906004016112b5565b600060405180830381600087803b15801561070b57600080fd5b505af115801561071f573d6000803e3d6000fd5b50505050505050565b61073133610ac5565b565b61073c336102b2565b6107585760405162461bcd60e51b815260040161026f9061141c565b60025460035460405163115a6c9f60e31b81526001600160a01b0392831692638ad364f89261032792899289921690600401611320565b61079833610880565b6107b45760405162461bcd60e51b815260040161026f9061140c565b61028181610b0d565b600260009054906101000a90046001600160a01b03166001600160a01b031663986502756040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561080d57600080fd5b505af1158015610821573d6000803e3d6000fd5b50505050565b610830336102b2565b61084c5760405162461bcd60e51b815260040161026f9061141c565b60025460405163b2da297960e01b81526001600160a01b039091169063b2da2979906106f1908690869086906004016112b5565b60006102c5818363ffffffff610a7d16565b61089b336102b2565b6108b75760405162461bcd60e51b815260040161026f9061141c565b600254604051635f1b171760e11b81526001600160a01b039091169063be362e2e9061065f90889088908890889088906004016112df565b6108f833610880565b6109145760405162461bcd60e51b815260040161026f9061140c565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61073133610a35565b61094833610880565b6109645760405162461bcd60e51b815260040161026f9061140c565b60005b81518110156109945761098c82828151811061097f57fe5b60200260200101516109ed565b600101610967565b5050565b6109a133610880565b6109bd5760405162461bcd60e51b815260040161026f9061140c565b60005b8151811015610994576109e58282815181106109d857fe5b6020026020010151610a35565b6001016109c0565b6109fe60018263ffffffff610b5516565b6040516001600160a01b038216907fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f90600090a250565b610a4660018263ffffffff610ba116565b6040516001600160a01b038216907f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b690600090a250565b60006001600160a01b038216610aa55760405162461bcd60e51b815260040161026f906113fc565b506001600160a01b03166000908152602091909152604090205460ff1690565b610ad660008263ffffffff610ba116565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b610b1e60008263ffffffff610b5516565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b610b5f8282610a7d565b15610b7c5760405162461bcd60e51b815260040161026f906113dc565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b610bab8282610a7d565b610bc75760405162461bcd60e51b815260040161026f906113ec565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b80356102c58161152d565b600082601f830112610c0557600080fd5b8135610c18610c1382611472565b61144c565b91508181835260208401935060208101905083856020840282011115610c3d57600080fd5b60005b83811015610c695781610c538882610be9565b8452506020928301929190910190600101610c40565b5050505092915050565b600082601f830112610c8457600080fd5b8135610c92610c1382611472565b81815260209384019390925082018360005b83811015610c695781358601610cba8882610d18565b8452506020928301929190910190600101610ca4565b60008083601f840112610ce257600080fd5b5081356001600160401b03811115610cf957600080fd5b602083019150836001820283011115610d1157600080fd5b9250929050565b600082601f830112610d2957600080fd5b8135610d37610c1382611492565b91508082526020830160208301858383011115610d5357600080fd5b610d5e8382846114eb565b50505092915050565b80516102c581611541565b600060208284031215610d8457600080fd5b6000610d908484610be9565b949350505050565b600080600060408486031215610dad57600080fd5b6000610db98686610be9565b93505060208401356001600160401b03811115610dd557600080fd5b610de186828701610cd0565b92509250509250925092565b600080600080600060608688031215610e0557600080fd5b6000610e118888610be9565b95505060208601356001600160401b03811115610e2d57600080fd5b610e3988828901610cd0565b945094505060408601356001600160401b03811115610e5757600080fd5b610e6388828901610cd0565b92509250509295509295909350565b60008060008060808587031215610e8857600080fd5b6000610e948787610be9565b94505060208501356001600160401b03811115610eb057600080fd5b610ebc87828801610d18565b93505060408501356001600160401b03811115610ed857600080fd5b610ee487828801610c73565b92505060608501356001600160401b03811115610f0057600080fd5b610f0c87828801610c73565b91505092959194509250565b600080600080600060a08688031215610f3057600080fd5b6000610f3c8888610be9565b95505060208601356001600160401b03811115610f5857600080fd5b610f6488828901610d18565b94505060408601356001600160401b03811115610f8057600080fd5b610f8c88828901610c73565b93505060608601356001600160401b03811115610fa857600080fd5b610fb488828901610c73565b92505060808601356001600160401b03811115610fd057600080fd5b610fdc88828901610d18565b9150509295509295909350565b600060208284031215610ffb57600080fd5b81356001600160401b0381111561101157600080fd5b610d9084828501610bf4565b60006020828403121561102f57600080fd5b6000610d908484610d67565b60006110478383611100565b9392505050565b611057816114cc565b82525050565b6000611068826114bf565b61107281856114c3565b935083602082028501611084856114b9565b8060005b858110156110be57848403895281516110a1858261103b565b94506110ac836114b9565b60209a909a0199925050600101611088565b5091979650505050505050565b611057816114d7565b60006110e083856114c3565b93506110ed8385846114eb565b6110f683611523565b9093019392505050565b600061110b826114bf565b61111581856114c3565b93506111258185602086016114f7565b6110f681611523565b600061113b601f836114c3565b7f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500815260200192915050565b60006111746021836114c3565b7f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c8152606560f81b602082015260400192915050565b60006111b76022836114c3565b7f526f6c65733a206163636f756e7420697320746865207a65726f206164647265815261737360f01b602082015260400192915050565b60006111fb6040836114c3565b7f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732081527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65602082015260400192915050565b600061125a603a836114c3565b7f57686974656c6973746564526f6c653a2063616c6c657220646f6573206e6f7481527f2068617665207468652057686974656c697374656420726f6c65000000000000602082015260400192915050565b611057816114e8565b604081016112c3828661104e565b81810360208301526112d68184866110d4565b95945050505050565b606081016112ed828861104e565b81810360208301526113008186886110d4565b905081810360408301526113158184866110d4565b979650505050505050565b6060810161132e828661104e565b81810360208301526113408185611100565b9050610d90604083018461104e565b6080810161135d828761104e565b818103602083015261136f8186611100565b905061137e604083018561104e565b81810360608301526113908184611100565b9695505050505050565b606080825281016113ab818661105d565b905081810360208301526113bf818561105d565b9050610d9060408301846112ac565b602081016102c582846110cb565b602080825281016102c58161112e565b602080825281016102c581611167565b602080825281016102c5816111aa565b602080825281016102c5816111ee565b602080825281016102c58161124d565b6040810161143a82856112ac565b8181036020830152610d908184611100565b6040518181016001600160401b038111828210171561146a57600080fd5b604052919050565b60006001600160401b0382111561148857600080fd5b5060209081020190565b60006001600160401b038211156114a857600080fd5b506020601f91909101601f19160190565b60200190565b5190565b90815260200190565b60006102c5826114dc565b151590565b6001600160a01b031690565b90565b82818337506000910152565b60005b838110156115125781810151838201526020016114fa565b838111156108215750506000910152565b601f01601f191690565b611536816114cc565b811461028157600080fd5b611536816114e856fea365627a7a723158202015818809abf01d7df619867f5e5e6cf548e7d7f7b02855ff06949ccf08e6bb6c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
-----Decoded View---------------
Arg [0] : mintingController (address): 0xb0EE56339C3253361730F50c08d3d7817ecD60Ca
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Deployed ByteCode Sourcemap
62198:2095:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62198:2095:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3413:110;;;;;;;;;:::i;:::-;;3531:116;;;;;;;;;:::i;3286:119::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;63147:317;;;;;;;;;:::i;63805:352::-;;;;;;;;;:::i;62679:133::-;;;;;;;;;:::i;2048:93::-;;;:::i;63472:325::-;;;;;;;;;:::i;1924:116::-;;;;;;;;;:::i;62582:89::-;;;:::i;62820:141::-;;;;;;;;;:::i;1791:125::-;;;;;;;;;:::i;62969:170::-;;;;;;;;;:::i;64165:123::-;;;;;;;;;:::i;3655:87::-;;;:::i;4649:216::-;;;;;;;;;:::i;4873:222::-;;;;;;;;;:::i;3413:110::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;;;;;;;;;3491:24;3507:7;3491:15;:24::i;:::-;3413:110;:::o;3531:116::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;3612:27;3631:7;3612:18;:27::i;3286:119::-;3347:4;3371:26;:13;3389:7;3371:26;:17;:26;:::i;:::-;3364:33;3286:119;-1:-1:-1;;3286:119:0:o;63147:317::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;63294:18;;63352:9;;63294:69;;-1:-1:-1;;;63294:69:0;;-1:-1:-1;;;;;63294:18:0;;;;:38;;:69;;63333:2;;63337:5;;63352:9;;63294:69;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63294:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;63374:9:0;;63411;;;63431:16;;;-1:-1:-1;;;63431:16:0;;;;-1:-1:-1;;;;;63374:9:0;;;;-1:-1:-1;63374:22:0;;-1:-1:-1;63397:4:0;;63403:6;;63411:9;;;:19;;:9;;63431:14;;:16;;;;;;;;;;;;;63411:9;63431:16;;;5:2:-1;;;;30:1;27;20:12;5:2;63431:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63431:16: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;63431:16:0;;;;;;;;;63449:5;63411:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63411:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63411:44: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;63411:44:0;;;;;;;;;63374:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63374:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;63374:82:0;;;;63147:317;;;;:::o;63805:352::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;63976:18;;64038:9;;63976:80;;-1:-1:-1;;;63976:80:0;;-1:-1:-1;;;;;63976:18:0;;;;:42;;:80;;64019:2;;64023:5;;64038:9;;64050:5;;63976:80;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63976:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;64067:9:0;;64104;;;64124:16;;;-1:-1:-1;;;64124:16:0;;;;-1:-1:-1;;;;;64067:9:0;;;;-1:-1:-1;64067:22:0;;-1:-1:-1;64090:4:0;;64096:6;;64104:9;;;:19;;:9;;64124:14;;:16;;;;;;;;;;;;;64104:9;64124:16;;;5:2:-1;;;;30:1;27;20:12;5:2;64124:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64124:16: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;64124:16:0;;;;;;;;;64142:5;64104:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64104:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64104:44: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;64104:44:0;;;;;;;;;64067:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64067:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64067:82:0;;;;63805:352;;;;;:::o;62679:133::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;62767:18;;:37;;-1:-1:-1;;;62767:37:0;;-1:-1:-1;;;;;62767:18:0;;;;:26;;:37;;62794:2;;62798:5;;;;62767:37;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62767:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62767:37:0;;;;62679:133;;;:::o;2048:93::-;2100:33;2122:10;2100:21;:33::i;:::-;2048:93::o;63472:325::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;63623:18;;63685:9;;63623:73;;-1:-1:-1;;;63623:73:0;;-1:-1:-1;;;;;63623:18:0;;;;:42;;:73;;63666:2;;63670:5;;63685:9;;63623:73;;;;1924:116;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;2005:27;2024:7;2005:18;:27::i;62582:89::-;62628:18;;;;;;;;;-1:-1:-1;;;;;62628:18:0;-1:-1:-1;;;;;62628:33:0;;:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62628:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;62628:35:0;;;;62582:89::o;62820:141::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;62912:18;;:41;;-1:-1:-1;;;62912:41:0;;-1:-1:-1;;;;;62912:18:0;;;;:30;;:41;;62943:2;;62947:5;;;;62912:41;;;;1791:125;1855:4;1879:29;1855:4;1900:7;1879:29;:20;:29;:::i;62969:170::-;3170:25;3184:10;3170:13;:25::i;:::-;3162:96;;;;-1:-1:-1;;;3162:96:0;;;;;;;;;63083:18;;:48;;-1:-1:-1;;;63083:48:0;;-1:-1:-1;;;;;63083:18:0;;;;:30;;:48;;63114:2;;63118:5;;;;63125;;;;63083:48;;;;64165:123;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;64250:9;:30;;-1:-1:-1;;;;;;64250:30:0;-1:-1:-1;;;;;64250:30:0;;;;;;;;;;64165:123::o;3655:87::-;3704:30;3723:10;3704:18;:30::i;4649:216::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;4746:13;4741:117;4773:8;:15;4765:5;:23;4741:117;;;4814:32;4830:8;4839:5;4830:15;;;;;;;;;;;;;;4814;:32::i;:::-;4790:7;;4741:117;;;;4649:216;:::o;4873:222::-;1666:28;1683:10;1666:16;:28::i;:::-;1658:105;;;;-1:-1:-1;;;1658:105:0;;;;;;;;;4973:13;4968:120;5000:8;:15;4992:5;:23;4968:120;;;5041:35;5060:8;5069:5;5060:15;;;;;;;;;;;;;;5041:18;:35::i;:::-;5017:7;;4968:120;;3750:137;3812:26;:13;3830:7;3812:26;:17;:26;:::i;:::-;3854:25;;-1:-1:-1;;;;;3854:25:0;;;;;;;;3750:137;:::o;3895:145::-;3960:29;:13;3981:7;3960:29;:20;:29;:::i;:::-;4005:27;;-1:-1:-1;;;;;4005:27:0;;;;;;;;3895:145;:::o;863:203::-;935:4;-1:-1:-1;;;;;960:21:0;;952:68;;;;-1:-1:-1;;;952:68:0;;;;;;;;;-1:-1:-1;;;;;;1038:20:0;:11;:20;;;;;;;;;;;;;;;863:203::o;2303:154::-;2371:32;:16;2395:7;2371:32;:23;:32;:::i;:::-;2419:30;;-1:-1:-1;;;;;2419:30:0;;;;;;;;2303:154;:::o;2149:146::-;2214:29;:16;2235:7;2214:29;:20;:29;:::i;:::-;2259:28;;-1:-1:-1;;;;;2259:28:0;;;;;;;;2149:146;:::o;327:178::-;405:18;409:4;415:7;405:3;:18::i;:::-;404:19;396:63;;;;-1:-1:-1;;;396:63:0;;;;;;;;;-1:-1:-1;;;;;470:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;470:27:0;493:4;470:27;;;327:178::o;585:183::-;665:18;669:4;675:7;665:3;:18::i;:::-;657:64;;;;-1:-1:-1;;;657:64:0;;;;;;;;;-1:-1:-1;;;;;732:20:0;755:5;732:20;;;;;;;;;;;:28;;-1:-1:-1;;732:28:0;;;585:183::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;748:50;;-1:-1;821:4;812:14;;;;840;;;;;702:1;695:9;655:206;;;659:14;237:630;;;;;;;;892:696;;1015:3;1008:4;1000:6;996:17;992:27;982:2;;1033:1;1030;1023:12;982:2;1070:6;1057:20;1092:86;1107:70;1170:6;1107:70;;1092:86;1206:21;;;1250:4;1238:17;;;;1083:95;;-1:-1;1263:14;;1238:17;1358:1;1343:239;1368:6;1365:1;1362:13;1343:239;;;1451:3;1438:17;1430:6;1426:30;1475:43;1514:3;1502:10;1475:43;;;1463:56;;-1:-1;1542:4;1533:14;;;;1561;;;;;1390:1;1383:9;1343:239;;1610:335;;;1724:3;1717:4;1709:6;1705:17;1701:27;1691:2;;1742:1;1739;1732:12;1691:2;-1:-1;1762:20;;-1:-1;;;;;1791:30;;1788:2;;;1834:1;1831;1824:12;1788:2;1868:4;1860:6;1856:17;1844:29;;1918:3;1911;1903:6;1899:16;1889:8;1885:31;1882:40;1879:2;;;1935:1;1932;1925:12;1879:2;1684:261;;;;;;1954:440;;2055:3;2048:4;2040:6;2036:17;2032:27;2022:2;;2073:1;2070;2063:12;2022:2;2110:6;2097:20;2132:64;2147:48;2188:6;2147:48;;2132:64;2123:73;;2216:6;2209:5;2202:21;2252:4;2244:6;2240:17;2285:4;2278:5;2274:16;2320:3;2311:6;2306:3;2302:16;2299:25;2296:2;;;2337:1;2334;2327:12;2296:2;2347:41;2381:6;2376:3;2371;2347:41;;;2015:379;;;;;;;;3655:134;3733:13;;3751:33;3733:13;3751:33;;3796:241;;3900:2;3888:9;3879:7;3875:23;3871:32;3868:2;;;3916:1;3913;3906:12;3868:2;3951:1;3968:53;4013:7;3993:9;3968:53;;;3958:63;3862:175;-1:-1;;;;3862:175;4044:492;;;;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4236:1;4253:53;4298:7;4278:9;4253:53;;;4243:63;;4215:97;4371:2;4360:9;4356:18;4343:32;-1:-1;;;;;4387:6;4384:30;4381:2;;;4427:1;4424;4417:12;4381:2;4455:65;4512:7;4503:6;4492:9;4488:22;4455:65;;;4445:75;;;;4322:204;4147:389;;;;;;4543:741;;;;;;4720:2;4708:9;4699:7;4695:23;4691:32;4688:2;;;4736:1;4733;4726:12;4688:2;4771:1;4788:53;4833:7;4813:9;4788:53;;;4778:63;;4750:97;4906:2;4895:9;4891:18;4878:32;-1:-1;;;;;4922:6;4919:30;4916:2;;;4962:1;4959;4952:12;4916:2;4990:65;5047:7;5038:6;5027:9;5023:22;4990:65;;;4980:75;;;;4857:204;5120:2;5109:9;5105:18;5092:32;-1:-1;;;;;5136:6;5133:30;5130:2;;;5176:1;5173;5166:12;5130:2;5204:64;5260:7;5251:6;5240:9;5236:22;5204:64;;;5194:74;;;;5071:203;4682:602;;;;;;;;;5291:1019;;;;;5518:3;5506:9;5497:7;5493:23;5489:33;5486:2;;;5535:1;5532;5525:12;5486:2;5570:1;5587:53;5632:7;5612:9;5587:53;;;5577:63;;5549:97;5705:2;5694:9;5690:18;5677:32;-1:-1;;;;;5721:6;5718:30;5715:2;;;5761:1;5758;5751:12;5715:2;5781:63;5836:7;5827:6;5816:9;5812:22;5781:63;;;5771:73;;5656:194;5909:2;5898:9;5894:18;5881:32;-1:-1;;;;;5925:6;5922:30;5919:2;;;5965:1;5962;5955:12;5919:2;5985:84;6061:7;6052:6;6041:9;6037:22;5985:84;;;5975:94;;5860:215;6134:2;6123:9;6119:18;6106:32;-1:-1;;;;;6150:6;6147:30;6144:2;;;6190:1;6187;6180:12;6144:2;6210:84;6286:7;6277:6;6266:9;6262:22;6210:84;;;6200:94;;6085:215;5480:830;;;;;;;;6317:1249;;;;;;6570:3;6558:9;6549:7;6545:23;6541:33;6538:2;;;6587:1;6584;6577:12;6538:2;6622:1;6639:53;6684:7;6664:9;6639:53;;;6629:63;;6601:97;6757:2;6746:9;6742:18;6729:32;-1:-1;;;;;6773:6;6770:30;6767:2;;;6813:1;6810;6803:12;6767:2;6833:63;6888:7;6879:6;6868:9;6864:22;6833:63;;;6823:73;;6708:194;6961:2;6950:9;6946:18;6933:32;-1:-1;;;;;6977:6;6974:30;6971:2;;;7017:1;7014;7007:12;6971:2;7037:84;7113:7;7104:6;7093:9;7089:22;7037:84;;;7027:94;;6912:215;7186:2;7175:9;7171:18;7158:32;-1:-1;;;;;7202:6;7199:30;7196:2;;;7242:1;7239;7232:12;7196:2;7262:84;7338:7;7329:6;7318:9;7314:22;7262:84;;;7252:94;;7137:215;7411:3;7400:9;7396:19;7383:33;-1:-1;;;;;7428:6;7425:30;7422:2;;;7468:1;7465;7458:12;7422:2;7488:62;7542:7;7533:6;7522:9;7518:22;7488:62;;;7478:72;;7362:194;6532:1034;;;;;;;;;7573:377;;7702:2;7690:9;7681:7;7677:23;7673:32;7670:2;;;7718:1;7715;7708:12;7670:2;7753:31;;-1:-1;;;;;7793:30;;7790:2;;;7836:1;7833;7826:12;7790:2;7856:78;7926:7;7917:6;7906:9;7902:22;7856:78;;7957:263;;8072:2;8060:9;8051:7;8047:23;8043:32;8040:2;;;8088:1;8085;8078:12;8040:2;8123:1;8140:64;8196:7;8176:9;8140:64;;8228:181;;8341:62;8399:3;8391:6;8341:62;;;8327:76;8320:89;-1:-1;;;8320:89;8417:113;8500:24;8518:5;8500:24;;;8495:3;8488:37;8482:48;;;8566:896;;8723:60;8777:5;8723:60;;;8796:92;8881:6;8876:3;8796:92;;;8789:99;;8911:3;8953:4;8945:6;8941:17;8936:3;8932:27;8980:62;9036:5;8980:62;;;9062:7;9090:1;9075:348;9100:6;9097:1;9094:13;9075:348;;;9162:9;9156:4;9152:20;9147:3;9140:33;9207:6;9201:13;9229:76;9300:4;9285:13;9229:76;;;9221:84;;9322:66;9381:6;9322:66;;;9411:4;9402:14;;;;;9312:76;-1:-1;;9122:1;9115:9;9075:348;;;-1:-1;9436:4;;8702:760;-1:-1;;;;;;;8702:760;9470:104;9547:21;9562:5;9547:21;;9604:297;;9718:70;9781:6;9776:3;9718:70;;;9711:77;;9800:43;9836:6;9831:3;9824:5;9800:43;;;9865:29;9887:6;9865:29;;;9856:39;;;;9704:197;-1:-1;;;9704:197;9909:343;;10019:38;10051:5;10019:38;;;10069:70;10132:6;10127:3;10069:70;;;10062:77;;10144:52;10189:6;10184:3;10177:4;10170:5;10166:16;10144:52;;;10217:29;10239:6;10217:29;;11273:364;;11433:67;11497:2;11492:3;11433:67;;;11533:66;11513:87;;11628:2;11619:12;;11419:218;-1:-1;;11419:218;11646:465;;11806:67;11870:2;11865:3;11806:67;;;11906:66;11886:87;;-1:-1;;;12002:2;11993:12;;11986:88;12102:2;12093:12;;11792:319;-1:-1;;11792:319;12120:465;;12280:67;12344:2;12339:3;12280:67;;;12380:66;12360:87;;-1:-1;;;12476:2;12467:12;;12460:88;12576:2;12567:12;;12266:319;-1:-1;;12266:319;12594:465;;12754:67;12818:2;12813:3;12754:67;;;12854:66;12834:87;;12955:66;12950:2;12941:12;;12934:88;13050:2;13041:12;;12740:319;-1:-1;;12740:319;13068:465;;13228:67;13292:2;13287:3;13228:67;;;13328:66;13308:87;;13429:66;13424:2;13415:12;;13408:88;13524:2;13515:12;;13214:319;-1:-1;;13214:319;13541:113;13624:24;13642:5;13624:24;;13661:432;13837:2;13822:18;;13851:71;13826:9;13895:6;13851:71;;;13970:9;13964:4;13960:20;13955:2;13944:9;13940:18;13933:48;13995:88;14078:4;14069:6;14061;13995:88;;;13987:96;13808:285;-1:-1;;;;;13808:285;14100:647;14332:2;14317:18;;14346:71;14321:9;14390:6;14346:71;;;14465:9;14459:4;14455:20;14450:2;14439:9;14435:18;14428:48;14490:88;14573:4;14564:6;14556;14490:88;;;14482:96;;14626:9;14620:4;14616:20;14611:2;14600:9;14596:18;14589:48;14651:86;14732:4;14723:6;14715;14651:86;;;14643:94;14303:444;-1:-1;;;;;;;14303:444;14754:523;14948:2;14933:18;;14962:71;14937:9;15006:6;14962:71;;;15081:9;15075:4;15071:20;15066:2;15055:9;15051:18;15044:48;15106:78;15179:4;15170:6;15106:78;;;15098:86;;15195:72;15263:2;15252:9;15248:18;15239:6;15195:72;;15284:719;15524:3;15509:19;;15539:71;15513:9;15583:6;15539:71;;;15658:9;15652:4;15648:20;15643:2;15632:9;15628:18;15621:48;15683:78;15756:4;15747:6;15683:78;;;15675:86;;15772:72;15840:2;15829:9;15825:18;15816:6;15772:72;;;15892:9;15886:4;15882:20;15877:2;15866:9;15862:18;15855:48;15917:76;15988:4;15979:6;15917:76;;;15909:84;15495:508;-1:-1;;;;;;15495:508;16010:779;16308:2;16322:47;;;16293:18;;16383:120;16293:18;16489:6;16383:120;;;16375:128;;16551:9;16545:4;16541:20;16536:2;16525:9;16521:18;16514:48;16576:120;16691:4;16682:6;16576:120;;;16568:128;;16707:72;16775:2;16764:9;16760:18;16751:6;16707:72;;16796:201;16908:2;16893:18;;16922:65;16897:9;16960:6;16922:65;;17004:407;17195:2;17209:47;;;17180:18;;17270:131;17180:18;17270:131;;17418:407;17609:2;17623:47;;;17594:18;;17684:131;17594:18;17684:131;;17832:407;18023:2;18037:47;;;18008:18;;18098:131;18008:18;18098:131;;18246:407;18437:2;18451:47;;;18422:18;;18512:131;18422:18;18512:131;;18660:407;18851:2;18865:47;;;18836:18;;18926:131;18836:18;18926:131;;19074:412;19240:2;19225:18;;19254:71;19229:9;19298:6;19254:71;;;19373:9;19367:4;19363:20;19358:2;19347:9;19343:18;19336:48;19398:78;19471:4;19462:6;19398:78;;19493:256;19555:2;19549:9;19581:17;;;-1:-1;;;;;19641:34;;19677:22;;;19638:62;19635:2;;;19713:1;19710;19703:12;19635:2;19729;19722:22;19533:216;;-1:-1;19533:216;19756:304;;-1:-1;;;;;19907:6;19904:30;19901:2;;;19947:1;19944;19937:12;19901:2;-1:-1;19982:4;19970:17;;;20035:15;;19838:222;20384:321;;-1:-1;;;;;20519:6;20516:30;20513:2;;;20559:1;20556;20549:12;20513:2;-1:-1;20690:4;20626;20603:17;;;;-1:-1;;20599:33;20680:15;;20450:255;21366:157;21496:4;21487:14;;21444:79;21530:143;21639:12;;21610:63;22184:184;22308:19;;;22357:4;22348:14;;22301:67;22881:91;;22943:24;22961:5;22943:24;;22979:85;23045:13;23038:21;;23021:43;23071:121;-1:-1;;;;;23133:54;;23116:76;23199:72;23261:5;23244:27;23279:145;23360:6;23355:3;23350;23337:30;-1:-1;23416:1;23398:16;;23391:27;23330:94;23433:268;23498:1;23505:101;23519:6;23516:1;23513:13;23505:101;;;23586:11;;;23580:18;23567:11;;;23560:39;23541:2;23534:10;23505:101;;;23621:6;23618:1;23615:13;23612:2;;;-1:-1;;23686:1;23668:16;;23661:27;23482:219;23709:97;23797:2;23777:14;-1:-1;;23773:28;;23757:49;23814:117;23883:24;23901:5;23883:24;;;23876:5;23873:35;23863:2;;23922:1;23919;23912:12;23938:117;24007:24;24025:5;24007:24;
Swarm Source
bzzr://2015818809abf01d7df619867f5e5e6cf548e7d7f7b02855ff06949ccf08e6bb
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
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.