Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 16 from a total of 16 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register With Pr... | 16172589 | 581 days ago | IN | 0.00437323 ETH | 0.00565139 | ||||
Register With Pr... | 16070725 | 595 days ago | IN | 0.00474217 ETH | 0.00456677 | ||||
Register With Pr... | 16069819 | 595 days ago | IN | 0.00474935 ETH | 0.00680489 | ||||
Register With Pr... | 16069596 | 595 days ago | IN | 0.00478077 ETH | 0.00827842 | ||||
Register With Pr... | 16069031 | 595 days ago | IN | 0.00474647 ETH | 0.00512851 | ||||
Register With Pr... | 16068831 | 595 days ago | IN | 0.00475329 ETH | 0.0053884 | ||||
Register With Pr... | 16068727 | 595 days ago | IN | 0.00475329 ETH | 0.00468642 | ||||
Register With Pr... | 16068608 | 595 days ago | IN | 0.00665089 ETH | 0.00402249 | ||||
Register With Pr... | 16063433 | 596 days ago | IN | 0.00456592 ETH | 0.00712344 | ||||
Register With Pr... | 16063281 | 596 days ago | IN | 0.00456592 ETH | 0.00458138 | ||||
Register With Pr... | 16063156 | 596 days ago | IN | 0.00457397 ETH | 0.00384992 | ||||
Register With Pr... | 16062783 | 596 days ago | IN | 0.00457581 ETH | 0.00536125 | ||||
Register With Pr... | 16062679 | 596 days ago | IN | 0.00457581 ETH | 0.0044187 | ||||
Enable | 16017275 | 602 days ago | IN | 0 ETH | 0.00038317 | ||||
Grant Role | 16017273 | 602 days ago | IN | 0 ETH | 0.00071245 | ||||
0x60c06040 | 16017199 | 602 days ago | IN | Create: LeasingAgent | 0 ETH | 0.03021026 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16172589 | 581 days ago | 0.00043732 ETH | ||||
16172589 | 581 days ago | 0.0039359 ETH | ||||
16070725 | 595 days ago | 0.00047421 ETH | ||||
16070725 | 595 days ago | 0.00426795 ETH | ||||
16069819 | 595 days ago | 0.00047493 ETH | ||||
16069819 | 595 days ago | 0.00427441 ETH | ||||
16069596 | 595 days ago | 0.00047807 ETH | ||||
16069596 | 595 days ago | 0.00430269 ETH | ||||
16069031 | 595 days ago | 0.00047464 ETH | ||||
16069031 | 595 days ago | 0.00427182 ETH | ||||
16068831 | 595 days ago | 0.00047532 ETH | ||||
16068831 | 595 days ago | 0.00427796 ETH | ||||
16068727 | 595 days ago | 0.00047532 ETH | ||||
16068727 | 595 days ago | 0.00427796 ETH | ||||
16068608 | 595 days ago | 0.00066508 ETH | ||||
16068608 | 595 days ago | 0.0059858 ETH | ||||
16063433 | 596 days ago | 0.00045659 ETH | ||||
16063433 | 596 days ago | 0.00410933 ETH | ||||
16063281 | 596 days ago | 0.00045659 ETH | ||||
16063281 | 596 days ago | 0.00410933 ETH | ||||
16063156 | 596 days ago | 0.00045739 ETH | ||||
16063156 | 596 days ago | 0.00411658 ETH | ||||
16062783 | 596 days ago | 0.00045758 ETH | ||||
16062783 | 596 days ago | 0.00411823 ETH | ||||
16062679 | 596 days ago | 0.00045758 ETH |
Loading...
Loading
Contract Name:
LeasingAgent
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-21 */ //SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: contracts/Domain.sol pragma solidity ^0.8.3; interface ContractRegistryInterface { function get(string memory contractName) external view returns (address); } interface NamespaceInterface { function checkName(uint256 id, uint256 name, bytes memory constraintsData) external view; } contract Domain is ERC1155, AccessControl, Ownable { uint256 private _currentTokenID = 0; mapping (uint256 => address) public creators; uint256 public tokenSupply; /** * @dev Require msg.sender to be the creator of the token id */ modifier creatorOnly(uint256 _id) { require(creators[_id] == msg.sender, "creatorOnly: ONLY_CREATOR_ALLOWED"); _; } /** * @dev Require msg.sender to own more than 0 of the token id */ modifier ownersOnly(uint256 _id) { require(balanceOf(msg.sender, _id) > 0, "ownersOnly: ONLY_OWNERS_ALLOWED"); _; } // Contract name string public name; // Contract symbol string public symbol; // Contract base url string public _baseURI; ContractRegistryInterface public immutable _contractRegistry; // which namespace does the domain belong to? mapping(uint256 => uint256) _domainToNamespace; // which domains are suspended? // users of the system should disregard suspended domains mapping(uint256 => bool) _suspensions; // ===== // ROLES // ===== // can update metadata bytes32 public constant ADMIN_AGENT = keccak256("1"); // can mark domains as suspended. bytes32 public constant SUSPENSION_AGENT = keccak256("2"); // can lease domains that are currently available or within the grace period bytes32 public constant LEASING_AGENT = keccak256("3"); // can transfer domains at any time bytes32 public constant REVOCATION_AGENT = keccak256("5"); event Register(address agent, address indexed registrant, uint256 indexed name); event Suspend(address agent, uint256 indexed name, bool suspended); event Revoke(address agent, address indexed holder, uint256 indexed name); function getRoleForNamespace(bytes32 role, uint256 namespaceId) public pure returns (bytes32) { bytes32 _role = keccak256(abi.encodePacked(role, namespaceId)); return _role; } function _hasRoleForNamespace(bytes32 role, uint256 namespaceId) internal view returns (bool) { return hasRole(getRoleForNamespace(role, namespaceId), msg.sender); } function _checkNameMatchesNamespace(uint256 _name, uint256 namespaceId) internal view { require(_domainToNamespace[_name] == namespaceId, "Domain: Namespace mismatch"); } function getNamespaceId( uint256 domainId ) external view returns (uint256) { return _domainToNamespace[domainId]; } function suspend( uint256 namespaceId, uint256 _name, bool suspended ) external { require(_hasRoleForNamespace(SUSPENSION_AGENT, namespaceId), "Domain: Invalid permissions"); _checkNameMatchesNamespace(_name, namespaceId); _suspensions[_name] = suspended; emit Suspend(msg.sender, _name, suspended); } function isSuspended( uint256 _name ) external view returns (bool suspended) { return _suspensions[_name]; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, AccessControl) returns (bool) { return ( ERC1155.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId) ); } function revoke( address from, address to, uint256 namespaceId, uint256 _name ) external { require( _hasRoleForNamespace(REVOCATION_AGENT, namespaceId), "Domain: Invalid permissions" ); _checkNameMatchesNamespace(_name, namespaceId); _safeTransferFrom(from, to, _name, 1, ''); emit Revoke(msg.sender, to, _name); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) override internal virtual { bool invalidTransfer = false; for (uint i = 0; i < ids.length; i ++) { if (_suspensions[ids[i]]) invalidTransfer = true; } require(!invalidTransfer, "Domain: Cannot transfer suspended domain"); super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } // used by the leasing agent to register domains function register( address registrant, uint256 namespaceId, uint256 _name ) external { require( _hasRoleForNamespace(LEASING_AGENT, namespaceId), "Domain: Invalid permissions" ); require(!_suspensions[_name], "Domain: Cannot register suspended domain"); bool tokenExists = _exists(_name); if (tokenExists) { _checkNameMatchesNamespace(_name, namespaceId); } emit Register(msg.sender, registrant, _name); // if the domain hasn't been minted already, // let's proceed with minting if (!tokenExists) { _domainToNamespace[_name] = namespaceId; creators[_name] = registrant; mint(registrant, _name, 1, ""); } } function setBaseURI(string memory _uri) public onlyOwner { _baseURI = _uri; } function tokenURI(uint256 _tokenId) public view returns (string memory) { return string(abi.encodePacked(_baseURI, Strings.toString(_tokenId))); } /** * @dev Returns the total quantity for a token ID * @return amount of token in existence */ function totalSupply( ) public view returns (uint256) { return tokenSupply; } /** * @dev Mints some amount of tokens to an address * @param _to Address of the future owner of the token * @param _id Token ID to mint * @param _quantity Amount of tokens to mint * @param _data Data to pass if receiver is contract */ function mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) internal { _mint(_to, _id, _quantity, _data); tokenSupply = tokenSupply + _quantity; } /** * @dev Mint tokens for each id in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _quantities Array of amounts of tokens to mint per id * @param _data Data to pass if receiver is contract */ function batchMint( address _to, uint256[] memory _ids, uint256[] memory _quantities, bytes memory _data ) internal { for (uint256 i = 0; i < _ids.length; i++) { uint256 _id = _ids[i]; require(creators[_id] == msg.sender, "batchMint: ONLY_CREATOR_ALLOWED"); uint256 quantity = _quantities[i]; tokenSupply = tokenSupply + quantity; } batchMint(_to, _ids, _quantities, _data); } /** * @dev Returns whether the specified token exists by checking to see if it has a creator * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists( uint256 _id ) internal view returns (bool) { return creators[_id] != address(0); } function exists( uint256 _id ) public view returns (bool) { return _exists(_id); } constructor(string memory _name, string memory _symbol, string memory uri, ContractRegistryInterface contractRegistry) ERC1155(uri) { _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _contractRegistry = contractRegistry; name = _name; symbol = _symbol; } } // File: contracts/LeasingAgent.sol pragma solidity ^0.8.3; // File contracts/PricingOracleInterface.sol pragma solidity ^0.8.3; interface PricingOracleInterface { function getPriceForName(uint256 name) external view returns (uint256 price, uint256 priceCentsUsd); function convertWeiToUsdCents(uint256 amount) external view returns (uint256 usdCents); } // File contracts/RainbowTableInterface.sol pragma solidity ^0.8.3; interface RainbowTableInterface { function reveal(uint256[] memory preimage, uint256 hash) external; function lookup(uint256 hash) external returns (uint256[] memory preimage); function getHash(uint256 hash, uint256[] calldata preimage) external view returns (uint256); function isRevealed(uint256 hash) external view returns (bool); } contract LeasingAgent is AccessControl { bytes32 public constant MANAGER_ROLE = keccak256("MANAGER"); ContractRegistryInterface immutable public _contractRegistry; uint256 immutable public _namespaceId; bool public _enabled = true; uint256 public _premiumStartTime; uint256 public _premiumEndTime; uint256[] public _premiumPricePoints; event Enabled(bool enabled); event RegistrationPremiumSet(uint256 premiumStartTime, uint256 premiumEndTime, uint256[] premiumPricePoints); event Registered(uint256[] names, uint256[] quantities, uint256 payment); function enable(bool enabled) external onlyRole(MANAGER_ROLE) { _enabled = enabled; emit Enabled(enabled); } function setRegistrationPremiumDetails(uint256 premiumStartTime, uint256 premiumEndTime, uint256[] calldata premiumPricePoints) external onlyRole(MANAGER_ROLE) { require(premiumEndTime > premiumStartTime, "LeasingAgent: premiumEndTime must be larger than premiumStartTime"); // each premiumPricePoint should be smaller than the previous for (uint256 i = 0; i < premiumPricePoints.length; i += 1) { if (i > 0) { require(premiumPricePoints[i] < premiumPricePoints[i-1], "LeasingAgent: premiumPricePoint[i] must be smaller than premiumPricePoint[i-1]"); } } _premiumStartTime = premiumStartTime; _premiumEndTime = premiumEndTime; _premiumPricePoints = premiumPricePoints; emit RegistrationPremiumSet(premiumStartTime, premiumEndTime, premiumPricePoints); } function _registerName( uint256 name, uint256 quantity, Domain domain ) internal { require(quantity > 0, "LeasingAgent: invalid quantity"); domain.register( msg.sender, // to _namespaceId, // namespace name // name id ); } function _transferToTreasury(uint256 total) internal { address payable _treasuryAddress = payable(_contractRegistry.get('Treasury')); (bool sent,) = _treasuryAddress.call{value: total}(""); require(sent, "LeasingAgent: payment not sent"); } // attempt to register the name. // compare it to hash details provided in commit function register( uint256[] calldata names, uint256[] calldata lengths, uint256[] calldata quantities ) public payable { require(_enabled, "LeasingAgent: registration disabled"); require(names.length == quantities.length, "LeasingAgent: quantities length mismatch"); PricingOracleInterface _pricingOracle = PricingOracleInterface(_contractRegistry.get('PricingOracle')); Domain _domain = Domain(_contractRegistry.get('Domain')); uint256 total = 0; uint256 price; uint256 i; // get pricing for names for (i = 0; i < names.length; i += 1) { (price, /* priceCentsUsd */) = _pricingOracle.getPriceForName(lengths[i]); total += price * quantities[i]; } require(msg.value >= total, "LeasingAgent: insufficient payment"); uint256 diff = msg.value - total; _transferToTreasury(total); // return over-payment to sender if (diff > 0) { payable(msg.sender).transfer(diff); } // register names emit Registered(names, quantities, msg.value); for (i = 0; i < names.length; i += 1) { _registerName(names[i], quantities[i], _domain); } } function registerWithPreimage( uint256[] calldata names, uint256[] calldata quantities, uint256[] calldata lengths, uint256[] calldata preimages ) external payable { require(preimages.length % 4 == 0, "LeasingAgent: incorrect preimage length"); require(preimages.length / names.length == 4, "LeasingAgent: incorrect preimage length"); revealImage(names, preimages); register(names, lengths, quantities); } function revealImage(uint256[] calldata names, uint256[] calldata preimages) internal { RainbowTableInterface rainbowTable = RainbowTableInterface(_contractRegistry.get('RainbowTable')); for (uint256 i = 0; i < names.length; i += 1) { if (!rainbowTable.isRevealed(names[i])) { rainbowTable.reveal(preimages[i * 4:i * 4 + 4], names[i]); } } } constructor(address contractRegistryAddress, uint256 namespaceId) { _contractRegistry = ContractRegistryInterface(contractRegistryAddress); _namespaceId = namespaceId; _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"contractRegistryAddress","type":"address"},{"internalType":"uint256","name":"namespaceId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"Enabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"names","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"premiumStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premiumEndTime","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"premiumPricePoints","type":"uint256[]"}],"name":"RegistrationPremiumSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractRegistry","outputs":[{"internalType":"contract ContractRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_namespaceId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_premiumEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_premiumPricePoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_premiumStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"names","type":"uint256[]"},{"internalType":"uint256[]","name":"lengths","type":"uint256[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"names","type":"uint256[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"},{"internalType":"uint256[]","name":"lengths","type":"uint256[]"},{"internalType":"uint256[]","name":"preimages","type":"uint256[]"}],"name":"registerWithPreimage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"premiumStartTime","type":"uint256"},{"internalType":"uint256","name":"premiumEndTime","type":"uint256"},{"internalType":"uint256[]","name":"premiumPricePoints","type":"uint256[]"}],"name":"setRegistrationPremiumDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405260018060006101000a81548160ff0219169083151502179055503480156200002b57600080fd5b5060405162002f0d38038062002f0d833981810160405281019062000051919062000254565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250508060a08181525050620000a56000801b33620000ad60201b60201c565b505062000312565b620000bf8282620000c360201b60201c565b5050565b620000d58282620001b460201b60201c565b620001b057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001556200021e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b6000815190506200023781620002de565b92915050565b6000815190506200024e81620002f8565b92915050565b600080604083850312156200026e576200026d620002d9565b5b60006200027e8582860162000226565b925050602062000291858286016200023d565b9150509250929050565b6000620002a882620002af565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b620002e9816200029b565b8114620002f557600080fd5b50565b6200030381620002cf565b81146200030f57600080fd5b50565b60805160601c60a051612baf6200035e60003960008181610d9e01526113fc015260008181610902015281816109ad01528181610d220152818161100b01526112420152612baf6000f3fe6080604052600436106101095760003560e01c80634df68ada11610095578063c1058b8f11610064578063c1058b8f1461035f578063c36be4961461038a578063d547741f146103b5578063ec87621c146103de578063f1be14611461040957610109565b80634df68ada146102b257806378f3db88146102db57806391d14854146102f7578063a217fddf1461033457610109565b806326634d20116100dc57806326634d20146101dc5780632f2ff15d1461021957806336568abe146102425780633ab7ff221461026b5780634630d1131461028757610109565b806301ffc9a71461010e578063037a561d1461014b57806317ae321314610176578063248a9ca31461019f575b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190611b43565b610434565b60405161014291906120b6565b60405180910390f35b34801561015757600080fd5b506101606104ae565b60405161016d91906122e9565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190611bdd565b6104b4565b005b3480156101ab57600080fd5b506101c660048036038101906101c19190611ad6565b610631565b6040516101d391906120d1565b60405180910390f35b3480156101e857600080fd5b5061020360048036038101906101fe9190611b70565b610650565b60405161021091906122e9565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190611b03565b610674565b005b34801561024e57600080fd5b5061026960048036038101906102649190611b03565b610695565b005b61028560048036038101906102809190611993565b610718565b005b34801561029357600080fd5b5061029c6107e2565b6040516102a991906122e9565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190611a7c565b6107e8565b005b6102f560048036038101906102f091906118df565b610867565b005b34801561030357600080fd5b5061031e60048036038101906103199190611b03565b610caf565b60405161032b91906120b6565b60405180910390f35b34801561034057600080fd5b50610349610d19565b60405161035691906120d1565b60405180910390f35b34801561036b57600080fd5b50610374610d20565b60405161038191906120ec565b60405180910390f35b34801561039657600080fd5b5061039f610d44565b6040516103ac91906120b6565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d79190611b03565b610d57565b005b3480156103ea57600080fd5b506103f3610d78565b60405161040091906120d1565b60405180910390f35b34801561041557600080fd5b5061041e610d9c565b60405161042b91906122e9565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104a757506104a682610dc0565b5b9050919050565b60025481565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c6104de81610e2a565b848411610520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610517906121a9565b60405180910390fd5b60005b838390508110156105cc5760008111156105b857838360018361054691906124a3565b81811061055657610555612686565b5b905060200201358484838181106105705761056f612686565b5b90506020020135106105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ae906121e9565b60405180910390fd5b5b6001816105c591906123c2565b9050610523565b5084600281905550836003819055508282600491906105ec92919061174a565b507f3bed3244e6743d5945578f85ef626f0df265038562d9376fe3182a00bcd7adc0858585856040516106229493929190612304565b60405180910390a15050505050565b6000806000838152602001908152602001600020600101549050919050565b6004818154811061066057600080fd5b906000526020600020016000915090505481565b61067d82610631565b61068681610e2a565b6106908383610e3e565b505050565b61069d610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461070a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610701906122c9565b60405180910390fd5b6107148282610f26565b5050565b600060048383905061072a91906125f7565b1461076a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076190612209565b60405180910390fd5b6004888890508383905061077e9190612418565b146107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612209565b60405180910390fd5b6107ca88888484611007565b6107d8888886868a8a610867565b5050505050505050565b60035481565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c61081281610e2a565b81600160006101000a81548160ff0219169083151502179055507f54ca1f89aee2b8d11c89b7813c6aa99caa0f8c55c8eccf8b70c3bb42029fa1348260405161085b91906120b6565b60405180910390a15050565b600160009054906101000a900460ff166108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90612149565b60405180910390fd5b8181905086869050146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590612269565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161095790612249565b60206040518083038186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a791906118b2565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b8152600401610a0290612289565b60206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5291906118b2565b905060008080600090505b8a8a9050811015610b54578473ffffffffffffffffffffffffffffffffffffffff1663cb27d31e8a8a84818110610a9757610a96612686565b5b905060200201356040518263ffffffff1660e01b8152600401610aba91906122e9565b604080518083038186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b099190611b9d565b5080925050868682818110610b2157610b20612686565b5b9050602002013582610b339190612449565b83610b3e91906123c2565b9250600181610b4d91906123c2565b9050610a5d565b82341015610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90612229565b60405180910390fd5b60008334610ba591906124a3565b9050610bb08461123e565b6000811115610c01573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b505b7f56e633e09b0a624ca11db9196c2f48c5a7b4421dc876324d3774c1df2efed6508c8c8a8a34604051610c3895949392919061206d565b60405180910390a1600091505b8b8b9050821015610ca157610c8d8c8c84818110610c6657610c65612686565b5b90506020020135898985818110610c8057610c7f612686565b5b905060200201358761139a565b600182610c9a91906123c2565b9150610c45565b505050505050505050505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b600160009054906101000a900460ff1681565b610d6082610631565b610d6981610e2a565b610d738383610f26565b505050565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e3b81610e36610f1e565b611471565b50565b610e488282610caf565b610f1a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ebf610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b610f308282610caf565b1561100357600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fa8610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161106090612169565b60206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b091906118b2565b905060005b85859050811015611236578173ffffffffffffffffffffffffffffffffffffffff16635055fbc38787848181106110ef576110ee612686565b5b905060200201356040518263ffffffff1660e01b815260040161111291906122e9565b60206040518083038186803b15801561112a57600080fd5b505afa15801561113e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111629190611aa9565b611222578173ffffffffffffffffffffffffffffffffffffffff166307461df185856004856111919190612449565b90600480876111a09190612449565b6111aa91906123c2565b926111b793929190612387565b8989868181106111ca576111c9612686565b5b905060200201356040518463ffffffff1660e01b81526004016111ef9392919061203b565b600060405180830381600087803b15801561120957600080fd5b505af115801561121d573d6000803e3d6000fd5b505050505b60018161122f91906123c2565b90506110b5565b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161129790612189565b60206040518083038186803b1580156112af57600080fd5b505afa1580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e791906118b2565b905060008173ffffffffffffffffffffffffffffffffffffffff168360405161130f90611fb5565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906121c9565b60405180910390fd5b505050565b600082116113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906122a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663f9454f3f337f0000000000000000000000000000000000000000000000000000000000000000866040518463ffffffff1660e01b815260040161143a93929190612004565b600060405180830381600087803b15801561145457600080fd5b505af1158015611468573d6000803e3d6000fd5b50505050505050565b61147b8282610caf565b61150a576114a08173ffffffffffffffffffffffffffffffffffffffff16601461150e565b6114ae8360001c602061150e565b6040516020016114bf929190611fca565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019190612107565b60405180910390fd5b5050565b6060600060028360026115219190612449565b61152b91906123c2565b67ffffffffffffffff811115611544576115436126b5565b5b6040519080825280601f01601f1916602001820160405280156115765781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106115ae576115ad612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061161257611611612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026116529190612449565b61165c91906123c2565b90505b60018111156116fc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061169e5761169d612686565b5b1a60f81b8282815181106116b5576116b4612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806116f5906125cd565b905061165f565b5060008414611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790612129565b60405180910390fd5b8091505092915050565b828054828255906000526020600020908101928215611786579160200282015b8281111561178557823582559160200191906001019061176a565b5b5090506117939190611797565b5090565b5b808211156117b0576000816000905550600101611798565b5090565b6000813590506117c381612b06565b92915050565b6000815190506117d881612b06565b92915050565b60008083601f8401126117f4576117f36126e9565b5b8235905067ffffffffffffffff811115611811576118106126e4565b5b60208301915083602082028301111561182d5761182c6126f8565b5b9250929050565b60008135905061184381612b1d565b92915050565b60008151905061185881612b1d565b92915050565b60008135905061186d81612b34565b92915050565b60008135905061188281612b4b565b92915050565b60008135905061189781612b62565b92915050565b6000815190506118ac81612b62565b92915050565b6000602082840312156118c8576118c7612707565b5b60006118d6848285016117c9565b91505092915050565b600080600080600080606087890312156118fc576118fb612707565b5b600087013567ffffffffffffffff81111561191a576119196126fd565b5b61192689828a016117de565b9650965050602087013567ffffffffffffffff811115611949576119486126fd565b5b61195589828a016117de565b9450945050604087013567ffffffffffffffff811115611978576119776126fd565b5b61198489828a016117de565b92509250509295509295509295565b6000806000806000806000806080898b0312156119b3576119b2612707565b5b600089013567ffffffffffffffff8111156119d1576119d06126fd565b5b6119dd8b828c016117de565b9850985050602089013567ffffffffffffffff811115611a00576119ff6126fd565b5b611a0c8b828c016117de565b9650965050604089013567ffffffffffffffff811115611a2f57611a2e6126fd565b5b611a3b8b828c016117de565b9450945050606089013567ffffffffffffffff811115611a5e57611a5d6126fd565b5b611a6a8b828c016117de565b92509250509295985092959890939650565b600060208284031215611a9257611a91612707565b5b6000611aa084828501611834565b91505092915050565b600060208284031215611abf57611abe612707565b5b6000611acd84828501611849565b91505092915050565b600060208284031215611aec57611aeb612707565b5b6000611afa8482850161185e565b91505092915050565b60008060408385031215611b1a57611b19612707565b5b6000611b288582860161185e565b9250506020611b39858286016117b4565b9150509250929050565b600060208284031215611b5957611b58612707565b5b6000611b6784828501611873565b91505092915050565b600060208284031215611b8657611b85612707565b5b6000611b9484828501611888565b91505092915050565b60008060408385031215611bb457611bb3612707565b5b6000611bc28582860161189d565b9250506020611bd38582860161189d565b9150509250929050565b60008060008060608587031215611bf757611bf6612707565b5b6000611c0587828801611888565b9450506020611c1687828801611888565b935050604085013567ffffffffffffffff811115611c3757611c366126fd565b5b611c43878288016117de565b925092505092959194509250565b611c5a816124d7565b82525050565b6000611c6c838561234f565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c9f57611c9e612702565b5b602083029250611cb083858461258b565b82840190509392505050565b611cc5816124e9565b82525050565b611cd4816124f5565b82525050565b611ce381612555565b82525050565b6000611cf482612344565b611cfe818561236b565b9350611d0e81856020860161259a565b611d178161270c565b840191505092915050565b6000611d2d82612344565b611d37818561237c565b9350611d4781856020860161259a565b80840191505092915050565b6000611d6060208361236b565b9150611d6b8261271d565b602082019050919050565b6000611d8360238361236b565b9150611d8e82612746565b604082019050919050565b6000611da6600c8361236b565b9150611db182612795565b602082019050919050565b6000611dc960088361236b565b9150611dd4826127be565b602082019050919050565b6000611dec60418361236b565b9150611df7826127e7565b606082019050919050565b6000611e0f601e8361236b565b9150611e1a8261285c565b602082019050919050565b6000611e32604e8361236b565b9150611e3d82612885565b606082019050919050565b6000611e5560278361236b565b9150611e60826128fa565b604082019050919050565b6000611e7860228361236b565b9150611e8382612949565b604082019050919050565b6000611e9b600d8361236b565b9150611ea682612998565b602082019050919050565b6000611ebe600083612360565b9150611ec9826129c1565b600082019050919050565b6000611ee160288361236b565b9150611eec826129c4565b604082019050919050565b6000611f0460068361236b565b9150611f0f82612a13565b602082019050919050565b6000611f27601e8361236b565b9150611f3282612a3c565b602082019050919050565b6000611f4a60178361237c565b9150611f5582612a65565b601782019050919050565b6000611f6d60118361237c565b9150611f7882612a8e565b601182019050919050565b6000611f90602f8361236b565b9150611f9b82612ab7565b604082019050919050565b611faf8161254b565b82525050565b6000611fc082611eb1565b9150819050919050565b6000611fd582611f3d565b9150611fe18285611d22565b9150611fec82611f60565b9150611ff88284611d22565b91508190509392505050565b60006060820190506120196000830186611c51565b6120266020830185611fa6565b6120336040830184611fa6565b949350505050565b60006040820190508181036000830152612056818587611c60565b90506120656020830184611fa6565b949350505050565b60006060820190508181036000830152612088818789611c60565b9050818103602083015261209d818587611c60565b90506120ac6040830184611fa6565b9695505050505050565b60006020820190506120cb6000830184611cbc565b92915050565b60006020820190506120e66000830184611ccb565b92915050565b60006020820190506121016000830184611cda565b92915050565b600060208201905081810360008301526121218184611ce9565b905092915050565b6000602082019050818103600083015261214281611d53565b9050919050565b6000602082019050818103600083015261216281611d76565b9050919050565b6000602082019050818103600083015261218281611d99565b9050919050565b600060208201905081810360008301526121a281611dbc565b9050919050565b600060208201905081810360008301526121c281611ddf565b9050919050565b600060208201905081810360008301526121e281611e02565b9050919050565b6000602082019050818103600083015261220281611e25565b9050919050565b6000602082019050818103600083015261222281611e48565b9050919050565b6000602082019050818103600083015261224281611e6b565b9050919050565b6000602082019050818103600083015261226281611e8e565b9050919050565b6000602082019050818103600083015261228281611ed4565b9050919050565b600060208201905081810360008301526122a281611ef7565b9050919050565b600060208201905081810360008301526122c281611f1a565b9050919050565b600060208201905081810360008301526122e281611f83565b9050919050565b60006020820190506122fe6000830184611fa6565b92915050565b60006060820190506123196000830187611fa6565b6123266020830186611fa6565b8181036040830152612339818486611c60565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000808585111561239b5761239a6126f3565b5b838611156123ac576123ab6126ee565b5b6020850283019150848603905094509492505050565b60006123cd8261254b565b91506123d88361254b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561240d5761240c612628565b5b828201905092915050565b60006124238261254b565b915061242e8361254b565b92508261243e5761243d612657565b5b828204905092915050565b60006124548261254b565b915061245f8361254b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561249857612497612628565b5b828202905092915050565b60006124ae8261254b565b91506124b98361254b565b9250828210156124cc576124cb612628565b5b828203905092915050565b60006124e28261252b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061256082612567565b9050919050565b600061257282612579565b9050919050565b60006125848261252b565b9050919050565b82818337600083830152505050565b60005b838110156125b857808201518184015260208101905061259d565b838111156125c7576000848401525b50505050565b60006125d88261254b565b915060008214156125ec576125eb612628565b5b600182039050919050565b60006126028261254b565b915061260d8361254b565b92508261261d5761261c612657565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c656173696e674167656e743a20726567697374726174696f6e20646973616260008201527f6c65640000000000000000000000000000000000000000000000000000000000602082015250565b7f5261696e626f775461626c650000000000000000000000000000000000000000600082015250565b7f5472656173757279000000000000000000000000000000000000000000000000600082015250565b7f4c656173696e674167656e743a207072656d69756d456e6454696d65206d757360008201527f74206265206c6172676572207468616e207072656d69756d537461727454696d60208201527f6500000000000000000000000000000000000000000000000000000000000000604082015250565b7f4c656173696e674167656e743a207061796d656e74206e6f742073656e740000600082015250565b7f4c656173696e674167656e743a207072656d69756d5072696365506f696e745b60008201527f695d206d75737420626520736d616c6c6572207468616e207072656d69756d5060208201527f72696365506f696e745b692d315d000000000000000000000000000000000000604082015250565b7f4c656173696e674167656e743a20696e636f727265637420707265696d61676560008201527f206c656e67746800000000000000000000000000000000000000000000000000602082015250565b7f4c656173696e674167656e743a20696e73756666696369656e74207061796d6560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726963696e674f7261636c6500000000000000000000000000000000000000600082015250565b50565b7f4c656173696e674167656e743a207175616e746974696573206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f446f6d61696e0000000000000000000000000000000000000000000000000000600082015250565b7f4c656173696e674167656e743a20696e76616c6964207175616e746974790000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b612b0f816124d7565b8114612b1a57600080fd5b50565b612b26816124e9565b8114612b3157600080fd5b50565b612b3d816124f5565b8114612b4857600080fd5b50565b612b54816124ff565b8114612b5f57600080fd5b50565b612b6b8161254b565b8114612b7657600080fd5b5056fea2646970667358221220de553eedfbc0756116855bfb22bed079921692e26ea4fef5bc7f0c0d8ab3f5f364736f6c6343000807003300000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d122763a0d8b511af688da5810c3fd3d16610cf825ed9a54b826b61ed88576a0937
Deployed Bytecode
0x6080604052600436106101095760003560e01c80634df68ada11610095578063c1058b8f11610064578063c1058b8f1461035f578063c36be4961461038a578063d547741f146103b5578063ec87621c146103de578063f1be14611461040957610109565b80634df68ada146102b257806378f3db88146102db57806391d14854146102f7578063a217fddf1461033457610109565b806326634d20116100dc57806326634d20146101dc5780632f2ff15d1461021957806336568abe146102425780633ab7ff221461026b5780634630d1131461028757610109565b806301ffc9a71461010e578063037a561d1461014b57806317ae321314610176578063248a9ca31461019f575b600080fd5b34801561011a57600080fd5b5061013560048036038101906101309190611b43565b610434565b60405161014291906120b6565b60405180910390f35b34801561015757600080fd5b506101606104ae565b60405161016d91906122e9565b60405180910390f35b34801561018257600080fd5b5061019d60048036038101906101989190611bdd565b6104b4565b005b3480156101ab57600080fd5b506101c660048036038101906101c19190611ad6565b610631565b6040516101d391906120d1565b60405180910390f35b3480156101e857600080fd5b5061020360048036038101906101fe9190611b70565b610650565b60405161021091906122e9565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190611b03565b610674565b005b34801561024e57600080fd5b5061026960048036038101906102649190611b03565b610695565b005b61028560048036038101906102809190611993565b610718565b005b34801561029357600080fd5b5061029c6107e2565b6040516102a991906122e9565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190611a7c565b6107e8565b005b6102f560048036038101906102f091906118df565b610867565b005b34801561030357600080fd5b5061031e60048036038101906103199190611b03565b610caf565b60405161032b91906120b6565b60405180910390f35b34801561034057600080fd5b50610349610d19565b60405161035691906120d1565b60405180910390f35b34801561036b57600080fd5b50610374610d20565b60405161038191906120ec565b60405180910390f35b34801561039657600080fd5b5061039f610d44565b6040516103ac91906120b6565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d79190611b03565b610d57565b005b3480156103ea57600080fd5b506103f3610d78565b60405161040091906120d1565b60405180910390f35b34801561041557600080fd5b5061041e610d9c565b60405161042b91906122e9565b60405180910390f35b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104a757506104a682610dc0565b5b9050919050565b60025481565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c6104de81610e2a565b848411610520576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610517906121a9565b60405180910390fd5b60005b838390508110156105cc5760008111156105b857838360018361054691906124a3565b81811061055657610555612686565b5b905060200201358484838181106105705761056f612686565b5b90506020020135106105b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ae906121e9565b60405180910390fd5b5b6001816105c591906123c2565b9050610523565b5084600281905550836003819055508282600491906105ec92919061174a565b507f3bed3244e6743d5945578f85ef626f0df265038562d9376fe3182a00bcd7adc0858585856040516106229493929190612304565b60405180910390a15050505050565b6000806000838152602001908152602001600020600101549050919050565b6004818154811061066057600080fd5b906000526020600020016000915090505481565b61067d82610631565b61068681610e2a565b6106908383610e3e565b505050565b61069d610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461070a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610701906122c9565b60405180910390fd5b6107148282610f26565b5050565b600060048383905061072a91906125f7565b1461076a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076190612209565b60405180910390fd5b6004888890508383905061077e9190612418565b146107be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b590612209565b60405180910390fd5b6107ca88888484611007565b6107d8888886868a8a610867565b5050505050505050565b60035481565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c61081281610e2a565b81600160006101000a81548160ff0219169083151502179055507f54ca1f89aee2b8d11c89b7813c6aa99caa0f8c55c8eccf8b70c3bb42029fa1348260405161085b91906120b6565b60405180910390a15050565b600160009054906101000a900460ff166108b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ad90612149565b60405180910390fd5b8181905086869050146108fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f590612269565b60405180910390fd5b60007f00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d1273ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161095790612249565b60206040518083038186803b15801561096f57600080fd5b505afa158015610983573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a791906118b2565b905060007f00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d1273ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b8152600401610a0290612289565b60206040518083038186803b158015610a1a57600080fd5b505afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5291906118b2565b905060008080600090505b8a8a9050811015610b54578473ffffffffffffffffffffffffffffffffffffffff1663cb27d31e8a8a84818110610a9757610a96612686565b5b905060200201356040518263ffffffff1660e01b8152600401610aba91906122e9565b604080518083038186803b158015610ad157600080fd5b505afa158015610ae5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b099190611b9d565b5080925050868682818110610b2157610b20612686565b5b9050602002013582610b339190612449565b83610b3e91906123c2565b9250600181610b4d91906123c2565b9050610a5d565b82341015610b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8e90612229565b60405180910390fd5b60008334610ba591906124a3565b9050610bb08461123e565b6000811115610c01573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610bff573d6000803e3d6000fd5b505b7f56e633e09b0a624ca11db9196c2f48c5a7b4421dc876324d3774c1df2efed6508c8c8a8a34604051610c3895949392919061206d565b60405180910390a1600091505b8b8b9050821015610ca157610c8d8c8c84818110610c6657610c65612686565b5b90506020020135898985818110610c8057610c7f612686565b5b905060200201358761139a565b600182610c9a91906123c2565b9150610c45565b505050505050505050505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b7f00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d1281565b600160009054906101000a900460ff1681565b610d6082610631565b610d6981610e2a565b610d738383610f26565b505050565b7faf290d8680820aad922855f39b306097b20e28774d6c1ad35a20325630c3a02c81565b7f2763a0d8b511af688da5810c3fd3d16610cf825ed9a54b826b61ed88576a093781565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610e3b81610e36610f1e565b611471565b50565b610e488282610caf565b610f1a57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610ebf610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b610f308282610caf565b1561100357600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610fa8610f1e565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60007f00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d1273ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161106090612169565b60206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b091906118b2565b905060005b85859050811015611236578173ffffffffffffffffffffffffffffffffffffffff16635055fbc38787848181106110ef576110ee612686565b5b905060200201356040518263ffffffff1660e01b815260040161111291906122e9565b60206040518083038186803b15801561112a57600080fd5b505afa15801561113e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111629190611aa9565b611222578173ffffffffffffffffffffffffffffffffffffffff166307461df185856004856111919190612449565b90600480876111a09190612449565b6111aa91906123c2565b926111b793929190612387565b8989868181106111ca576111c9612686565b5b905060200201356040518463ffffffff1660e01b81526004016111ef9392919061203b565b600060405180830381600087803b15801561120957600080fd5b505af115801561121d573d6000803e3d6000fd5b505050505b60018161122f91906123c2565b90506110b5565b505050505050565b60007f00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d1273ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff1660e01b815260040161129790612189565b60206040518083038186803b1580156112af57600080fd5b505afa1580156112c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e791906118b2565b905060008173ffffffffffffffffffffffffffffffffffffffff168360405161130f90611fb5565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c906121c9565b60405180910390fd5b505050565b600082116113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906122a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663f9454f3f337f2763a0d8b511af688da5810c3fd3d16610cf825ed9a54b826b61ed88576a0937866040518463ffffffff1660e01b815260040161143a93929190612004565b600060405180830381600087803b15801561145457600080fd5b505af1158015611468573d6000803e3d6000fd5b50505050505050565b61147b8282610caf565b61150a576114a08173ffffffffffffffffffffffffffffffffffffffff16601461150e565b6114ae8360001c602061150e565b6040516020016114bf929190611fca565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115019190612107565b60405180910390fd5b5050565b6060600060028360026115219190612449565b61152b91906123c2565b67ffffffffffffffff811115611544576115436126b5565b5b6040519080825280601f01601f1916602001820160405280156115765781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106115ae576115ad612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061161257611611612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026116529190612449565b61165c91906123c2565b90505b60018111156116fc577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061169e5761169d612686565b5b1a60f81b8282815181106116b5576116b4612686565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806116f5906125cd565b905061165f565b5060008414611740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173790612129565b60405180910390fd5b8091505092915050565b828054828255906000526020600020908101928215611786579160200282015b8281111561178557823582559160200191906001019061176a565b5b5090506117939190611797565b5090565b5b808211156117b0576000816000905550600101611798565b5090565b6000813590506117c381612b06565b92915050565b6000815190506117d881612b06565b92915050565b60008083601f8401126117f4576117f36126e9565b5b8235905067ffffffffffffffff811115611811576118106126e4565b5b60208301915083602082028301111561182d5761182c6126f8565b5b9250929050565b60008135905061184381612b1d565b92915050565b60008151905061185881612b1d565b92915050565b60008135905061186d81612b34565b92915050565b60008135905061188281612b4b565b92915050565b60008135905061189781612b62565b92915050565b6000815190506118ac81612b62565b92915050565b6000602082840312156118c8576118c7612707565b5b60006118d6848285016117c9565b91505092915050565b600080600080600080606087890312156118fc576118fb612707565b5b600087013567ffffffffffffffff81111561191a576119196126fd565b5b61192689828a016117de565b9650965050602087013567ffffffffffffffff811115611949576119486126fd565b5b61195589828a016117de565b9450945050604087013567ffffffffffffffff811115611978576119776126fd565b5b61198489828a016117de565b92509250509295509295509295565b6000806000806000806000806080898b0312156119b3576119b2612707565b5b600089013567ffffffffffffffff8111156119d1576119d06126fd565b5b6119dd8b828c016117de565b9850985050602089013567ffffffffffffffff811115611a00576119ff6126fd565b5b611a0c8b828c016117de565b9650965050604089013567ffffffffffffffff811115611a2f57611a2e6126fd565b5b611a3b8b828c016117de565b9450945050606089013567ffffffffffffffff811115611a5e57611a5d6126fd565b5b611a6a8b828c016117de565b92509250509295985092959890939650565b600060208284031215611a9257611a91612707565b5b6000611aa084828501611834565b91505092915050565b600060208284031215611abf57611abe612707565b5b6000611acd84828501611849565b91505092915050565b600060208284031215611aec57611aeb612707565b5b6000611afa8482850161185e565b91505092915050565b60008060408385031215611b1a57611b19612707565b5b6000611b288582860161185e565b9250506020611b39858286016117b4565b9150509250929050565b600060208284031215611b5957611b58612707565b5b6000611b6784828501611873565b91505092915050565b600060208284031215611b8657611b85612707565b5b6000611b9484828501611888565b91505092915050565b60008060408385031215611bb457611bb3612707565b5b6000611bc28582860161189d565b9250506020611bd38582860161189d565b9150509250929050565b60008060008060608587031215611bf757611bf6612707565b5b6000611c0587828801611888565b9450506020611c1687828801611888565b935050604085013567ffffffffffffffff811115611c3757611c366126fd565b5b611c43878288016117de565b925092505092959194509250565b611c5a816124d7565b82525050565b6000611c6c838561234f565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115611c9f57611c9e612702565b5b602083029250611cb083858461258b565b82840190509392505050565b611cc5816124e9565b82525050565b611cd4816124f5565b82525050565b611ce381612555565b82525050565b6000611cf482612344565b611cfe818561236b565b9350611d0e81856020860161259a565b611d178161270c565b840191505092915050565b6000611d2d82612344565b611d37818561237c565b9350611d4781856020860161259a565b80840191505092915050565b6000611d6060208361236b565b9150611d6b8261271d565b602082019050919050565b6000611d8360238361236b565b9150611d8e82612746565b604082019050919050565b6000611da6600c8361236b565b9150611db182612795565b602082019050919050565b6000611dc960088361236b565b9150611dd4826127be565b602082019050919050565b6000611dec60418361236b565b9150611df7826127e7565b606082019050919050565b6000611e0f601e8361236b565b9150611e1a8261285c565b602082019050919050565b6000611e32604e8361236b565b9150611e3d82612885565b606082019050919050565b6000611e5560278361236b565b9150611e60826128fa565b604082019050919050565b6000611e7860228361236b565b9150611e8382612949565b604082019050919050565b6000611e9b600d8361236b565b9150611ea682612998565b602082019050919050565b6000611ebe600083612360565b9150611ec9826129c1565b600082019050919050565b6000611ee160288361236b565b9150611eec826129c4565b604082019050919050565b6000611f0460068361236b565b9150611f0f82612a13565b602082019050919050565b6000611f27601e8361236b565b9150611f3282612a3c565b602082019050919050565b6000611f4a60178361237c565b9150611f5582612a65565b601782019050919050565b6000611f6d60118361237c565b9150611f7882612a8e565b601182019050919050565b6000611f90602f8361236b565b9150611f9b82612ab7565b604082019050919050565b611faf8161254b565b82525050565b6000611fc082611eb1565b9150819050919050565b6000611fd582611f3d565b9150611fe18285611d22565b9150611fec82611f60565b9150611ff88284611d22565b91508190509392505050565b60006060820190506120196000830186611c51565b6120266020830185611fa6565b6120336040830184611fa6565b949350505050565b60006040820190508181036000830152612056818587611c60565b90506120656020830184611fa6565b949350505050565b60006060820190508181036000830152612088818789611c60565b9050818103602083015261209d818587611c60565b90506120ac6040830184611fa6565b9695505050505050565b60006020820190506120cb6000830184611cbc565b92915050565b60006020820190506120e66000830184611ccb565b92915050565b60006020820190506121016000830184611cda565b92915050565b600060208201905081810360008301526121218184611ce9565b905092915050565b6000602082019050818103600083015261214281611d53565b9050919050565b6000602082019050818103600083015261216281611d76565b9050919050565b6000602082019050818103600083015261218281611d99565b9050919050565b600060208201905081810360008301526121a281611dbc565b9050919050565b600060208201905081810360008301526121c281611ddf565b9050919050565b600060208201905081810360008301526121e281611e02565b9050919050565b6000602082019050818103600083015261220281611e25565b9050919050565b6000602082019050818103600083015261222281611e48565b9050919050565b6000602082019050818103600083015261224281611e6b565b9050919050565b6000602082019050818103600083015261226281611e8e565b9050919050565b6000602082019050818103600083015261228281611ed4565b9050919050565b600060208201905081810360008301526122a281611ef7565b9050919050565b600060208201905081810360008301526122c281611f1a565b9050919050565b600060208201905081810360008301526122e281611f83565b9050919050565b60006020820190506122fe6000830184611fa6565b92915050565b60006060820190506123196000830187611fa6565b6123266020830186611fa6565b8181036040830152612339818486611c60565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000808585111561239b5761239a6126f3565b5b838611156123ac576123ab6126ee565b5b6020850283019150848603905094509492505050565b60006123cd8261254b565b91506123d88361254b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561240d5761240c612628565b5b828201905092915050565b60006124238261254b565b915061242e8361254b565b92508261243e5761243d612657565b5b828204905092915050565b60006124548261254b565b915061245f8361254b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561249857612497612628565b5b828202905092915050565b60006124ae8261254b565b91506124b98361254b565b9250828210156124cc576124cb612628565b5b828203905092915050565b60006124e28261252b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061256082612567565b9050919050565b600061257282612579565b9050919050565b60006125848261252b565b9050919050565b82818337600083830152505050565b60005b838110156125b857808201518184015260208101905061259d565b838111156125c7576000848401525b50505050565b60006125d88261254b565b915060008214156125ec576125eb612628565b5b600182039050919050565b60006126028261254b565b915061260d8361254b565b92508261261d5761261c612657565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4c656173696e674167656e743a20726567697374726174696f6e20646973616260008201527f6c65640000000000000000000000000000000000000000000000000000000000602082015250565b7f5261696e626f775461626c650000000000000000000000000000000000000000600082015250565b7f5472656173757279000000000000000000000000000000000000000000000000600082015250565b7f4c656173696e674167656e743a207072656d69756d456e6454696d65206d757360008201527f74206265206c6172676572207468616e207072656d69756d537461727454696d60208201527f6500000000000000000000000000000000000000000000000000000000000000604082015250565b7f4c656173696e674167656e743a207061796d656e74206e6f742073656e740000600082015250565b7f4c656173696e674167656e743a207072656d69756d5072696365506f696e745b60008201527f695d206d75737420626520736d616c6c6572207468616e207072656d69756d5060208201527f72696365506f696e745b692d315d000000000000000000000000000000000000604082015250565b7f4c656173696e674167656e743a20696e636f727265637420707265696d61676560008201527f206c656e67746800000000000000000000000000000000000000000000000000602082015250565b7f4c656173696e674167656e743a20696e73756666696369656e74207061796d6560008201527f6e74000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726963696e674f7261636c6500000000000000000000000000000000000000600082015250565b50565b7f4c656173696e674167656e743a207175616e746974696573206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f446f6d61696e0000000000000000000000000000000000000000000000000000600082015250565b7f4c656173696e674167656e743a20696e76616c6964207175616e746974790000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b612b0f816124d7565b8114612b1a57600080fd5b50565b612b26816124e9565b8114612b3157600080fd5b50565b612b3d816124f5565b8114612b4857600080fd5b50565b612b54816124ff565b8114612b5f57600080fd5b50565b612b6b8161254b565b8114612b7657600080fd5b5056fea2646970667358221220de553eedfbc0756116855bfb22bed079921692e26ea4fef5bc7f0c0d8ab3f5f364736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d122763a0d8b511af688da5810c3fd3d16610cf825ed9a54b826b61ed88576a0937
-----Decoded View---------------
Arg [0] : contractRegistryAddress (address): 0x16dCfF55D6fb94B31709A63a27ac0918D72A4D12
Arg [1] : namespaceId (uint256): 17816229075993215846759527713510517151474369758522418446609974478566370969911
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000016dcff55d6fb94b31709a63a27ac0918d72a4d12
Arg [1] : 2763a0d8b511af688da5810c3fd3d16610cf825ed9a54b826b61ed88576a0937
Deployed Bytecode Sourcemap
61447:4462:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47298:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61696:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62162:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49134:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61768:36;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49575:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50719:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64827:452;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61733:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62033:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63628:1193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47594:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46699:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61557:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61664:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50015:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61491:59;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61622:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47298:204;47383:4;47422:32;47407:47;;;:11;:47;;;;:87;;;;47458:36;47482:11;47458:23;:36::i;:::-;47407:87;47400:94;;47298:204;;;:::o;61696:32::-;;;;:::o;62162:823::-;61530:20;47190:16;47201:4;47190:10;:16::i;:::-;62354::::1;62337:14;:33;62329:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;62521:9;62516:245;62540:18;;:25;;62536:1;:29;62516:245;;;62592:1;62588;:5;62584:170;;;62638:18;;62659:1;62657;:3;;;;:::i;:::-;62638:23;;;;;;;:::i;:::-;;;;;;;;62614:18;;62633:1;62614:21;;;;;;;:::i;:::-;;;;;;;;:47;62606:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;62584:170;62572:1;62567:6;;;;;:::i;:::-;;;62516:245;;;;62789:16;62769:17;:36;;;;62830:14;62812:15;:32;;;;62873:18;;62851:19;:40;;;;;;;:::i;:::-;;62903:76;62926:16;62944:14;62960:18;;62903:76;;;;;;;;;:::i;:::-;;;;;;;;62162:823:::0;;;;;:::o;49134:131::-;49208:7;49235:6;:12;49242:4;49235:12;;;;;;;;;;;:22;;;49228:29;;49134:131;;;:::o;61768:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49575:147::-;49658:18;49671:4;49658:12;:18::i;:::-;47190:16;47201:4;47190:10;:16::i;:::-;49689:25:::1;49700:4;49706:7;49689:10;:25::i;:::-;49575:147:::0;;;:::o;50719:218::-;50826:12;:10;:12::i;:::-;50815:23;;:7;:23;;;50807:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50903:26;50915:4;50921:7;50903:11;:26::i;:::-;50719:218;;:::o;64827:452::-;65054:1;65049;65030:9;;:16;;:20;;;;:::i;:::-;:25;65022:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;65149:1;65133:5;;:12;;65114:9;;:16;;:31;;;;:::i;:::-;:36;65106:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;65201:29;65213:5;;65220:9;;65201:11;:29::i;:::-;65237:36;65246:5;;65253:7;;65262:10;;65237:8;:36::i;:::-;64827:452;;;;;;;;:::o;61733:30::-;;;;:::o;62033:121::-;61530:20;47190:16;47201:4;47190:10;:16::i;:::-;62113:7:::1;62102:8;;:18;;;;;;;;;;;;;;;;;;62132:16;62140:7;62132:16;;;;;;:::i;:::-;;;;;;;;62033:121:::0;;:::o;63628:1193::-;63783:8;;;;;;;;;;;63775:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;63862:10;;:17;;63846:5;;:12;;:33;63838:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;63933:37;63996:17;:21;;;:38;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63933:102;;64042:14;64066:17;:21;;;:31;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64042:56;;64107:13;64131;64151:9;64208:1;64204:5;;64199:167;64215:5;;:12;;64211:1;:16;64199:167;;;64277:14;:30;;;64308:7;;64316:1;64308:10;;;;;;;:::i;:::-;;;;;;;;64277:42;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64246:73;;;;;64345:10;;64356:1;64345:13;;;;;;;:::i;:::-;;;;;;;;64337:5;:21;;;;:::i;:::-;64328:30;;;;;:::i;:::-;;;64234:1;64229:6;;;;;:::i;:::-;;;64199:167;;;64399:5;64386:9;:18;;64378:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;64450:12;64477:5;64465:9;:17;;;;:::i;:::-;64450:32;;64489:26;64509:5;64489:19;:26::i;:::-;64575:1;64568:4;:8;64564:67;;;64597:10;64589:28;;:34;64618:4;64589:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64564:67;64667:40;64678:5;;64685:10;;64697:9;64667:40;;;;;;;;;;:::i;:::-;;;;;;;;64723:1;64719:5;;64714:102;64730:5;;:12;;64726:1;:16;64714:102;;;64761:47;64775:5;;64781:1;64775:8;;;;;;;:::i;:::-;;;;;;;;64785:10;;64796:1;64785:13;;;;;;;:::i;:::-;;;;;;;;64800:7;64761:13;:47::i;:::-;64749:1;64744:6;;;;;:::i;:::-;;;64714:102;;;63768:1053;;;;;;63628:1193;;;;;;:::o;47594:147::-;47680:4;47704:6;:12;47711:4;47704:12;;;;;;;;;;;:20;;:29;47725:7;47704:29;;;;;;;;;;;;;;;;;;;;;;;;;47697:36;;47594:147;;;;:::o;46699:49::-;46744:4;46699:49;;;:::o;61557:60::-;;;:::o;61664:27::-;;;;;;;;;;;;;:::o;50015:149::-;50099:18;50112:4;50099:12;:18::i;:::-;47190:16;47201:4;47190:10;:16::i;:::-;50130:26:::1;50142:4;50148:7;50130:11;:26::i;:::-;50015:149:::0;;;:::o;61491:59::-;61530:20;61491:59;:::o;61622:37::-;;;:::o;17830:157::-;17915:4;17954:25;17939:40;;;:11;:40;;;;17932:47;;17830:157;;;:::o;48045:105::-;48112:30;48123:4;48129:12;:10;:12::i;:::-;48112:10;:30::i;:::-;48045:105;:::o;52316:238::-;52400:22;52408:4;52414:7;52400;:22::i;:::-;52395:152;;52471:4;52439:6;:12;52446:4;52439:12;;;;;;;;;;;:20;;:29;52460:7;52439:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;52522:12;:10;:12::i;:::-;52495:40;;52513:7;52495:40;;52507:4;52495:40;;;;;;;;;;52395:152;52316:238;;:::o;21170:98::-;21223:7;21250:10;21243:17;;21170:98;:::o;52734:239::-;52818:22;52826:4;52832:7;52818;:22::i;:::-;52814:152;;;52889:5;52857:6;:12;52864:4;52857:12;;;;;;;;;;;:20;;:29;52878:7;52857:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;52941:12;:10;:12::i;:::-;52914:40;;52932:7;52914:40;;52926:4;52914:40;;;;;;;;;;52814:152;52734:239;;:::o;65287:382::-;65380:34;65439:17;:21;;;:37;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65380:97;;65489:9;65484:180;65508:5;;:12;;65504:1;:16;65484:180;;;65544:12;:23;;;65568:5;;65574:1;65568:8;;;;;;;:::i;:::-;;;;;;;;65544:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65539:118;;65590:12;:19;;;65610:9;;65624:1;65620;:5;;;;:::i;:::-;65610:26;65634:1;65630;65626;:5;;;;:::i;:::-;:9;;;;:::i;:::-;65610:26;;;;;;;:::i;:::-;65638:5;;65644:1;65638:8;;;;;;;:::i;:::-;;;;;;;;65590:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65539:118;65527:1;65522:6;;;;;:::i;:::-;;;65484:180;;;;65373:296;65287:382;;;;:::o;63276:258::-;63336:32;63379:17;:21;;;:33;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63336:77;;63421:9;63435:16;:21;;63464:5;63435:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63420:54;;;63489:4;63481:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;63329:205;;63276:258;:::o;62991:279::-;63116:1;63105:8;:12;63097:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;63159:6;:15;;;63183:10;63208:12;63242:4;63159:105;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62991:279;;;:::o;48440:505::-;48529:22;48537:4;48543:7;48529;:22::i;:::-;48524:414;;48717:41;48745:7;48717:41;;48755:2;48717:19;:41::i;:::-;48831:38;48859:4;48851:13;;48866:2;48831:19;:38::i;:::-;48622:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48568:358;;;;;;;;;;;:::i;:::-;;;;;;;;48524:414;48440:505;;:::o;19725:451::-;19800:13;19826:19;19871:1;19862:6;19858:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19848:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19826:47;;19884:15;:6;19891:1;19884:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19910;:6;19917:1;19910:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19941:9;19966:1;19957:6;19953:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19941:26;;19936:135;19973:1;19969;:5;19936:135;;;20008:12;20029:3;20021:5;:11;20008:25;;;;;;;:::i;:::-;;;;;19996:6;20003:1;19996:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;20058:1;20048:11;;;;;19976:3;;;;:::i;:::-;;;19936:135;;;;20098:1;20089:5;:10;20081:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20161:6;20147:21;;;19725:451;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;318:568::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:122;;459:79;;:::i;:::-;418:122;572:6;559:20;549:30;;602:18;594:6;591:30;588:117;;;624:79;;:::i;:::-;588:117;738:4;730:6;726:17;714:29;;792:3;784:4;776:6;772:17;762:8;758:32;755:41;752:128;;;799:79;;:::i;:::-;752:128;318:568;;;;;:::o;892:133::-;935:5;973:6;960:20;951:29;;989:30;1013:5;989:30;:::i;:::-;892:133;;;;:::o;1031:137::-;1085:5;1116:6;1110:13;1101:22;;1132:30;1156:5;1132:30;:::i;:::-;1031:137;;;;:::o;1174:139::-;1220:5;1258:6;1245:20;1236:29;;1274:33;1301:5;1274:33;:::i;:::-;1174:139;;;;:::o;1319:137::-;1364:5;1402:6;1389:20;1380:29;;1418:32;1444:5;1418:32;:::i;:::-;1319:137;;;;:::o;1462:139::-;1508:5;1546:6;1533:20;1524:29;;1562:33;1589:5;1562:33;:::i;:::-;1462:139;;;;:::o;1607:143::-;1664:5;1695:6;1689:13;1680:22;;1711:33;1738:5;1711:33;:::i;:::-;1607:143;;;;:::o;1756:351::-;1826:6;1875:2;1863:9;1854:7;1850:23;1846:32;1843:119;;;1881:79;;:::i;:::-;1843:119;2001:1;2026:64;2082:7;2073:6;2062:9;2058:22;2026:64;:::i;:::-;2016:74;;1972:128;1756:351;;;;:::o;2113:1309::-;2271:6;2279;2287;2295;2303;2311;2360:2;2348:9;2339:7;2335:23;2331:32;2328:119;;;2366:79;;:::i;:::-;2328:119;2514:1;2503:9;2499:17;2486:31;2544:18;2536:6;2533:30;2530:117;;;2566:79;;:::i;:::-;2530:117;2679:80;2751:7;2742:6;2731:9;2727:22;2679:80;:::i;:::-;2661:98;;;;2457:312;2836:2;2825:9;2821:18;2808:32;2867:18;2859:6;2856:30;2853:117;;;2889:79;;:::i;:::-;2853:117;3002:80;3074:7;3065:6;3054:9;3050:22;3002:80;:::i;:::-;2984:98;;;;2779:313;3159:2;3148:9;3144:18;3131:32;3190:18;3182:6;3179:30;3176:117;;;3212:79;;:::i;:::-;3176:117;3325:80;3397:7;3388:6;3377:9;3373:22;3325:80;:::i;:::-;3307:98;;;;3102:313;2113:1309;;;;;;;;:::o;3428:1685::-;3622:6;3630;3638;3646;3654;3662;3670;3678;3727:3;3715:9;3706:7;3702:23;3698:33;3695:120;;;3734:79;;:::i;:::-;3695:120;3882:1;3871:9;3867:17;3854:31;3912:18;3904:6;3901:30;3898:117;;;3934:79;;:::i;:::-;3898:117;4047:80;4119:7;4110:6;4099:9;4095:22;4047:80;:::i;:::-;4029:98;;;;3825:312;4204:2;4193:9;4189:18;4176:32;4235:18;4227:6;4224:30;4221:117;;;4257:79;;:::i;:::-;4221:117;4370:80;4442:7;4433:6;4422:9;4418:22;4370:80;:::i;:::-;4352:98;;;;4147:313;4527:2;4516:9;4512:18;4499:32;4558:18;4550:6;4547:30;4544:117;;;4580:79;;:::i;:::-;4544:117;4693:80;4765:7;4756:6;4745:9;4741:22;4693:80;:::i;:::-;4675:98;;;;4470:313;4850:2;4839:9;4835:18;4822:32;4881:18;4873:6;4870:30;4867:117;;;4903:79;;:::i;:::-;4867:117;5016:80;5088:7;5079:6;5068:9;5064:22;5016:80;:::i;:::-;4998:98;;;;4793:313;3428:1685;;;;;;;;;;;:::o;5119:323::-;5175:6;5224:2;5212:9;5203:7;5199:23;5195:32;5192:119;;;5230:79;;:::i;:::-;5192:119;5350:1;5375:50;5417:7;5408:6;5397:9;5393:22;5375:50;:::i;:::-;5365:60;;5321:114;5119:323;;;;:::o;5448:345::-;5515:6;5564:2;5552:9;5543:7;5539:23;5535:32;5532:119;;;5570:79;;:::i;:::-;5532:119;5690:1;5715:61;5768:7;5759:6;5748:9;5744:22;5715:61;:::i;:::-;5705:71;;5661:125;5448:345;;;;:::o;5799:329::-;5858:6;5907:2;5895:9;5886:7;5882:23;5878:32;5875:119;;;5913:79;;:::i;:::-;5875:119;6033:1;6058:53;6103:7;6094:6;6083:9;6079:22;6058:53;:::i;:::-;6048:63;;6004:117;5799:329;;;;:::o;6134:474::-;6202:6;6210;6259:2;6247:9;6238:7;6234:23;6230:32;6227:119;;;6265:79;;:::i;:::-;6227:119;6385:1;6410:53;6455:7;6446:6;6435:9;6431:22;6410:53;:::i;:::-;6400:63;;6356:117;6512:2;6538:53;6583:7;6574:6;6563:9;6559:22;6538:53;:::i;:::-;6528:63;;6483:118;6134:474;;;;;:::o;6614:327::-;6672:6;6721:2;6709:9;6700:7;6696:23;6692:32;6689:119;;;6727:79;;:::i;:::-;6689:119;6847:1;6872:52;6916:7;6907:6;6896:9;6892:22;6872:52;:::i;:::-;6862:62;;6818:116;6614:327;;;;:::o;6947:329::-;7006:6;7055:2;7043:9;7034:7;7030:23;7026:32;7023:119;;;7061:79;;:::i;:::-;7023:119;7181:1;7206:53;7251:7;7242:6;7231:9;7227:22;7206:53;:::i;:::-;7196:63;;7152:117;6947:329;;;;:::o;7282:507::-;7361:6;7369;7418:2;7406:9;7397:7;7393:23;7389:32;7386:119;;;7424:79;;:::i;:::-;7386:119;7544:1;7569:64;7625:7;7616:6;7605:9;7601:22;7569:64;:::i;:::-;7559:74;;7515:128;7682:2;7708:64;7764:7;7755:6;7744:9;7740:22;7708:64;:::i;:::-;7698:74;;7653:129;7282:507;;;;;:::o;7795:849::-;7899:6;7907;7915;7923;7972:2;7960:9;7951:7;7947:23;7943:32;7940:119;;;7978:79;;:::i;:::-;7940:119;8098:1;8123:53;8168:7;8159:6;8148:9;8144:22;8123:53;:::i;:::-;8113:63;;8069:117;8225:2;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8196:118;8381:2;8370:9;8366:18;8353:32;8412:18;8404:6;8401:30;8398:117;;;8434:79;;:::i;:::-;8398:117;8547:80;8619:7;8610:6;8599:9;8595:22;8547:80;:::i;:::-;8529:98;;;;8324:313;7795:849;;;;;;;:::o;8650:118::-;8737:24;8755:5;8737:24;:::i;:::-;8732:3;8725:37;8650:118;;:::o;8804:537::-;8932:3;8953:86;9032:6;9027:3;8953:86;:::i;:::-;8946:93;;9063:66;9055:6;9052:78;9049:165;;;9133:79;;:::i;:::-;9049:165;9245:4;9237:6;9233:17;9223:27;;9260:43;9296:6;9291:3;9284:5;9260:43;:::i;:::-;9328:6;9323:3;9319:16;9312:23;;8804:537;;;;;:::o;9347:109::-;9428:21;9443:5;9428:21;:::i;:::-;9423:3;9416:34;9347:109;;:::o;9462:118::-;9549:24;9567:5;9549:24;:::i;:::-;9544:3;9537:37;9462:118;;:::o;9586:199::-;9707:71;9772:5;9707:71;:::i;:::-;9702:3;9695:84;9586:199;;:::o;9791:364::-;9879:3;9907:39;9940:5;9907:39;:::i;:::-;9962:71;10026:6;10021:3;9962:71;:::i;:::-;9955:78;;10042:52;10087:6;10082:3;10075:4;10068:5;10064:16;10042:52;:::i;:::-;10119:29;10141:6;10119:29;:::i;:::-;10114:3;10110:39;10103:46;;9883:272;9791:364;;;;:::o;10161:377::-;10267:3;10295:39;10328:5;10295:39;:::i;:::-;10350:89;10432:6;10427:3;10350:89;:::i;:::-;10343:96;;10448:52;10493:6;10488:3;10481:4;10474:5;10470:16;10448:52;:::i;:::-;10525:6;10520:3;10516:16;10509:23;;10271:267;10161:377;;;;:::o;10544:366::-;10686:3;10707:67;10771:2;10766:3;10707:67;:::i;:::-;10700:74;;10783:93;10872:3;10783:93;:::i;:::-;10901:2;10896:3;10892:12;10885:19;;10544:366;;;:::o;10916:::-;11058:3;11079:67;11143:2;11138:3;11079:67;:::i;:::-;11072:74;;11155:93;11244:3;11155:93;:::i;:::-;11273:2;11268:3;11264:12;11257:19;;10916:366;;;:::o;11288:::-;11430:3;11451:67;11515:2;11510:3;11451:67;:::i;:::-;11444:74;;11527:93;11616:3;11527:93;:::i;:::-;11645:2;11640:3;11636:12;11629:19;;11288:366;;;:::o;11660:365::-;11802:3;11823:66;11887:1;11882:3;11823:66;:::i;:::-;11816:73;;11898:93;11987:3;11898:93;:::i;:::-;12016:2;12011:3;12007:12;12000:19;;11660:365;;;:::o;12031:366::-;12173:3;12194:67;12258:2;12253:3;12194:67;:::i;:::-;12187:74;;12270:93;12359:3;12270:93;:::i;:::-;12388:2;12383:3;12379:12;12372:19;;12031:366;;;:::o;12403:::-;12545:3;12566:67;12630:2;12625:3;12566:67;:::i;:::-;12559:74;;12642:93;12731:3;12642:93;:::i;:::-;12760:2;12755:3;12751:12;12744:19;;12403:366;;;:::o;12775:::-;12917:3;12938:67;13002:2;12997:3;12938:67;:::i;:::-;12931:74;;13014:93;13103:3;13014:93;:::i;:::-;13132:2;13127:3;13123:12;13116:19;;12775:366;;;:::o;13147:::-;13289:3;13310:67;13374:2;13369:3;13310:67;:::i;:::-;13303:74;;13386:93;13475:3;13386:93;:::i;:::-;13504:2;13499:3;13495:12;13488:19;;13147:366;;;:::o;13519:::-;13661:3;13682:67;13746:2;13741:3;13682:67;:::i;:::-;13675:74;;13758:93;13847:3;13758:93;:::i;:::-;13876:2;13871:3;13867:12;13860:19;;13519:366;;;:::o;13891:::-;14033:3;14054:67;14118:2;14113:3;14054:67;:::i;:::-;14047:74;;14130:93;14219:3;14130:93;:::i;:::-;14248:2;14243:3;14239:12;14232:19;;13891:366;;;:::o;14263:398::-;14422:3;14443:83;14524:1;14519:3;14443:83;:::i;:::-;14436:90;;14535:93;14624:3;14535:93;:::i;:::-;14653:1;14648:3;14644:11;14637:18;;14263:398;;;:::o;14667:366::-;14809:3;14830:67;14894:2;14889:3;14830:67;:::i;:::-;14823:74;;14906:93;14995:3;14906:93;:::i;:::-;15024:2;15019:3;15015:12;15008:19;;14667:366;;;:::o;15039:365::-;15181:3;15202:66;15266:1;15261:3;15202:66;:::i;:::-;15195:73;;15277:93;15366:3;15277:93;:::i;:::-;15395:2;15390:3;15386:12;15379:19;;15039:365;;;:::o;15410:366::-;15552:3;15573:67;15637:2;15632:3;15573:67;:::i;:::-;15566:74;;15649:93;15738:3;15649:93;:::i;:::-;15767:2;15762:3;15758:12;15751:19;;15410:366;;;:::o;15782:402::-;15942:3;15963:85;16045:2;16040:3;15963:85;:::i;:::-;15956:92;;16057:93;16146:3;16057:93;:::i;:::-;16175:2;16170:3;16166:12;16159:19;;15782:402;;;:::o;16190:::-;16350:3;16371:85;16453:2;16448:3;16371:85;:::i;:::-;16364:92;;16465:93;16554:3;16465:93;:::i;:::-;16583:2;16578:3;16574:12;16567:19;;16190:402;;;:::o;16598:366::-;16740:3;16761:67;16825:2;16820:3;16761:67;:::i;:::-;16754:74;;16837:93;16926:3;16837:93;:::i;:::-;16955:2;16950:3;16946:12;16939:19;;16598:366;;;:::o;16970:118::-;17057:24;17075:5;17057:24;:::i;:::-;17052:3;17045:37;16970:118;;:::o;17094:379::-;17278:3;17300:147;17443:3;17300:147;:::i;:::-;17293:154;;17464:3;17457:10;;17094:379;;;:::o;17479:967::-;17861:3;17883:148;18027:3;17883:148;:::i;:::-;17876:155;;18048:95;18139:3;18130:6;18048:95;:::i;:::-;18041:102;;18160:148;18304:3;18160:148;:::i;:::-;18153:155;;18325:95;18416:3;18407:6;18325:95;:::i;:::-;18318:102;;18437:3;18430:10;;17479:967;;;;;:::o;18452:442::-;18601:4;18639:2;18628:9;18624:18;18616:26;;18652:71;18720:1;18709:9;18705:17;18696:6;18652:71;:::i;:::-;18733:72;18801:2;18790:9;18786:18;18777:6;18733:72;:::i;:::-;18815;18883:2;18872:9;18868:18;18859:6;18815:72;:::i;:::-;18452:442;;;;;;:::o;18900:509::-;19087:4;19125:2;19114:9;19110:18;19102:26;;19174:9;19168:4;19164:20;19160:1;19149:9;19145:17;19138:47;19202:118;19315:4;19306:6;19298;19202:118;:::i;:::-;19194:126;;19330:72;19398:2;19387:9;19383:18;19374:6;19330:72;:::i;:::-;18900:509;;;;;;:::o;19415:784::-;19684:4;19722:2;19711:9;19707:18;19699:26;;19771:9;19765:4;19761:20;19757:1;19746:9;19742:17;19735:47;19799:118;19912:4;19903:6;19895;19799:118;:::i;:::-;19791:126;;19964:9;19958:4;19954:20;19949:2;19938:9;19934:18;19927:48;19992:118;20105:4;20096:6;20088;19992:118;:::i;:::-;19984:126;;20120:72;20188:2;20177:9;20173:18;20164:6;20120:72;:::i;:::-;19415:784;;;;;;;;:::o;20205:210::-;20292:4;20330:2;20319:9;20315:18;20307:26;;20343:65;20405:1;20394:9;20390:17;20381:6;20343:65;:::i;:::-;20205:210;;;;:::o;20421:222::-;20514:4;20552:2;20541:9;20537:18;20529:26;;20565:71;20633:1;20622:9;20618:17;20609:6;20565:71;:::i;:::-;20421:222;;;;:::o;20649:290::-;20776:4;20814:2;20803:9;20799:18;20791:26;;20827:105;20929:1;20918:9;20914:17;20905:6;20827:105;:::i;:::-;20649:290;;;;:::o;20945:313::-;21058:4;21096:2;21085:9;21081:18;21073:26;;21145:9;21139:4;21135:20;21131:1;21120:9;21116:17;21109:47;21173:78;21246:4;21237:6;21173:78;:::i;:::-;21165:86;;20945:313;;;;:::o;21264:419::-;21430:4;21468:2;21457:9;21453:18;21445:26;;21517:9;21511:4;21507:20;21503:1;21492:9;21488:17;21481:47;21545:131;21671:4;21545:131;:::i;:::-;21537:139;;21264:419;;;:::o;21689:::-;21855:4;21893:2;21882:9;21878:18;21870:26;;21942:9;21936:4;21932:20;21928:1;21917:9;21913:17;21906:47;21970:131;22096:4;21970:131;:::i;:::-;21962:139;;21689:419;;;:::o;22114:::-;22280:4;22318:2;22307:9;22303:18;22295:26;;22367:9;22361:4;22357:20;22353:1;22342:9;22338:17;22331:47;22395:131;22521:4;22395:131;:::i;:::-;22387:139;;22114:419;;;:::o;22539:::-;22705:4;22743:2;22732:9;22728:18;22720:26;;22792:9;22786:4;22782:20;22778:1;22767:9;22763:17;22756:47;22820:131;22946:4;22820:131;:::i;:::-;22812:139;;22539:419;;;:::o;22964:::-;23130:4;23168:2;23157:9;23153:18;23145:26;;23217:9;23211:4;23207:20;23203:1;23192:9;23188:17;23181:47;23245:131;23371:4;23245:131;:::i;:::-;23237:139;;22964:419;;;:::o;23389:::-;23555:4;23593:2;23582:9;23578:18;23570:26;;23642:9;23636:4;23632:20;23628:1;23617:9;23613:17;23606:47;23670:131;23796:4;23670:131;:::i;:::-;23662:139;;23389:419;;;:::o;23814:::-;23980:4;24018:2;24007:9;24003:18;23995:26;;24067:9;24061:4;24057:20;24053:1;24042:9;24038:17;24031:47;24095:131;24221:4;24095:131;:::i;:::-;24087:139;;23814:419;;;:::o;24239:::-;24405:4;24443:2;24432:9;24428:18;24420:26;;24492:9;24486:4;24482:20;24478:1;24467:9;24463:17;24456:47;24520:131;24646:4;24520:131;:::i;:::-;24512:139;;24239:419;;;:::o;24664:::-;24830:4;24868:2;24857:9;24853:18;24845:26;;24917:9;24911:4;24907:20;24903:1;24892:9;24888:17;24881:47;24945:131;25071:4;24945:131;:::i;:::-;24937:139;;24664:419;;;:::o;25089:::-;25255:4;25293:2;25282:9;25278:18;25270:26;;25342:9;25336:4;25332:20;25328:1;25317:9;25313:17;25306:47;25370:131;25496:4;25370:131;:::i;:::-;25362:139;;25089:419;;;:::o;25514:::-;25680:4;25718:2;25707:9;25703:18;25695:26;;25767:9;25761:4;25757:20;25753:1;25742:9;25738:17;25731:47;25795:131;25921:4;25795:131;:::i;:::-;25787:139;;25514:419;;;:::o;25939:::-;26105:4;26143:2;26132:9;26128:18;26120:26;;26192:9;26186:4;26182:20;26178:1;26167:9;26163:17;26156:47;26220:131;26346:4;26220:131;:::i;:::-;26212:139;;25939:419;;;:::o;26364:::-;26530:4;26568:2;26557:9;26553:18;26545:26;;26617:9;26611:4;26607:20;26603:1;26592:9;26588:17;26581:47;26645:131;26771:4;26645:131;:::i;:::-;26637:139;;26364:419;;;:::o;26789:::-;26955:4;26993:2;26982:9;26978:18;26970:26;;27042:9;27036:4;27032:20;27028:1;27017:9;27013:17;27006:47;27070:131;27196:4;27070:131;:::i;:::-;27062:139;;26789:419;;;:::o;27214:222::-;27307:4;27345:2;27334:9;27330:18;27322:26;;27358:71;27426:1;27415:9;27411:17;27402:6;27358:71;:::i;:::-;27214:222;;;;:::o;27442:613::-;27651:4;27689:2;27678:9;27674:18;27666:26;;27702:71;27770:1;27759:9;27755:17;27746:6;27702:71;:::i;:::-;27783:72;27851:2;27840:9;27836:18;27827:6;27783:72;:::i;:::-;27902:9;27896:4;27892:20;27887:2;27876:9;27872:18;27865:48;27930:118;28043:4;28034:6;28026;27930:118;:::i;:::-;27922:126;;27442:613;;;;;;;:::o;28142:99::-;28194:6;28228:5;28222:12;28212:22;;28142:99;;;:::o;28247:184::-;28346:11;28380:6;28375:3;28368:19;28420:4;28415:3;28411:14;28396:29;;28247:184;;;;:::o;28437:147::-;28538:11;28575:3;28560:18;;28437:147;;;;:::o;28590:169::-;28674:11;28708:6;28703:3;28696:19;28748:4;28743:3;28739:14;28724:29;;28590:169;;;;:::o;28765:148::-;28867:11;28904:3;28889:18;;28765:148;;;;:::o;28919:486::-;29040:9;29051;29089:8;29077:10;29074:24;29071:111;;;29101:79;;:::i;:::-;29071:111;29207:6;29197:8;29194:20;29191:107;;;29217:79;;:::i;:::-;29191:107;29348:2;29336:10;29332:19;29324:6;29320:32;29307:45;;29388:10;29378:8;29374:25;29361:38;;28919:486;;;;;;;:::o;29411:305::-;29451:3;29470:20;29488:1;29470:20;:::i;:::-;29465:25;;29504:20;29522:1;29504:20;:::i;:::-;29499:25;;29658:1;29590:66;29586:74;29583:1;29580:81;29577:107;;;29664:18;;:::i;:::-;29577:107;29708:1;29705;29701:9;29694:16;;29411:305;;;;:::o;29722:185::-;29762:1;29779:20;29797:1;29779:20;:::i;:::-;29774:25;;29813:20;29831:1;29813:20;:::i;:::-;29808:25;;29852:1;29842:35;;29857:18;;:::i;:::-;29842:35;29899:1;29896;29892:9;29887:14;;29722:185;;;;:::o;29913:348::-;29953:7;29976:20;29994:1;29976:20;:::i;:::-;29971:25;;30010:20;30028:1;30010:20;:::i;:::-;30005:25;;30198:1;30130:66;30126:74;30123:1;30120:81;30115:1;30108:9;30101:17;30097:105;30094:131;;;30205:18;;:::i;:::-;30094:131;30253:1;30250;30246:9;30235:20;;29913:348;;;;:::o;30267:191::-;30307:4;30327:20;30345:1;30327:20;:::i;:::-;30322:25;;30361:20;30379:1;30361:20;:::i;:::-;30356:25;;30400:1;30397;30394:8;30391:34;;;30405:18;;:::i;:::-;30391:34;30450:1;30447;30443:9;30435:17;;30267:191;;;;:::o;30464:96::-;30501:7;30530:24;30548:5;30530:24;:::i;:::-;30519:35;;30464:96;;;:::o;30566:90::-;30600:7;30643:5;30636:13;30629:21;30618:32;;30566:90;;;:::o;30662:77::-;30699:7;30728:5;30717:16;;30662:77;;;:::o;30745:149::-;30781:7;30821:66;30814:5;30810:78;30799:89;;30745:149;;;:::o;30900:126::-;30937:7;30977:42;30970:5;30966:54;30955:65;;30900:126;;;:::o;31032:77::-;31069:7;31098:5;31087:16;;31032:77;;;:::o;31115:160::-;31199:9;31232:37;31263:5;31232:37;:::i;:::-;31219:50;;31115:160;;;:::o;31281:126::-;31331:9;31364:37;31395:5;31364:37;:::i;:::-;31351:50;;31281:126;;;:::o;31413:113::-;31463:9;31496:24;31514:5;31496:24;:::i;:::-;31483:37;;31413:113;;;:::o;31532:154::-;31616:6;31611:3;31606;31593:30;31678:1;31669:6;31664:3;31660:16;31653:27;31532:154;;;:::o;31692:307::-;31760:1;31770:113;31784:6;31781:1;31778:13;31770:113;;;31869:1;31864:3;31860:11;31854:18;31850:1;31845:3;31841:11;31834:39;31806:2;31803:1;31799:10;31794:15;;31770:113;;;31901:6;31898:1;31895:13;31892:101;;;31981:1;31972:6;31967:3;31963:16;31956:27;31892:101;31741:258;31692:307;;;:::o;32005:171::-;32044:3;32067:24;32085:5;32067:24;:::i;:::-;32058:33;;32113:4;32106:5;32103:15;32100:41;;;32121:18;;:::i;:::-;32100:41;32168:1;32161:5;32157:13;32150:20;;32005:171;;;:::o;32182:176::-;32214:1;32231:20;32249:1;32231:20;:::i;:::-;32226:25;;32265:20;32283:1;32265:20;:::i;:::-;32260:25;;32304:1;32294:35;;32309:18;;:::i;:::-;32294:35;32350:1;32347;32343:9;32338:14;;32182:176;;;;:::o;32364:180::-;32412:77;32409:1;32402:88;32509:4;32506:1;32499:15;32533:4;32530:1;32523:15;32550:180;32598:77;32595:1;32588:88;32695:4;32692:1;32685:15;32719:4;32716:1;32709:15;32736:180;32784:77;32781:1;32774:88;32881:4;32878:1;32871:15;32905:4;32902:1;32895:15;32922:180;32970:77;32967:1;32960:88;33067:4;33064:1;33057:15;33091:4;33088:1;33081:15;33108:117;33217:1;33214;33207:12;33231:117;33340:1;33337;33330:12;33354:117;33463:1;33460;33453:12;33477:117;33586:1;33583;33576:12;33600:117;33709:1;33706;33699:12;33723:117;33832:1;33829;33822:12;33846:117;33955:1;33952;33945:12;33969:117;34078:1;34075;34068:12;34092:102;34133:6;34184:2;34180:7;34175:2;34168:5;34164:14;34160:28;34150:38;;34092:102;;;:::o;34200:182::-;34340:34;34336:1;34328:6;34324:14;34317:58;34200:182;:::o;34388:222::-;34528:34;34524:1;34516:6;34512:14;34505:58;34597:5;34592:2;34584:6;34580:15;34573:30;34388:222;:::o;34616:162::-;34756:14;34752:1;34744:6;34740:14;34733:38;34616:162;:::o;34784:158::-;34924:10;34920:1;34912:6;34908:14;34901:34;34784:158;:::o;34948:289::-;35088:34;35084:1;35076:6;35072:14;35065:58;35157:34;35152:2;35144:6;35140:15;35133:59;35226:3;35221:2;35213:6;35209:15;35202:28;34948:289;:::o;35243:180::-;35383:32;35379:1;35371:6;35367:14;35360:56;35243:180;:::o;35429:302::-;35569:34;35565:1;35557:6;35553:14;35546:58;35638:34;35633:2;35625:6;35621:15;35614:59;35707:16;35702:2;35694:6;35690:15;35683:41;35429:302;:::o;35737:226::-;35877:34;35873:1;35865:6;35861:14;35854:58;35946:9;35941:2;35933:6;35929:15;35922:34;35737:226;:::o;35969:221::-;36109:34;36105:1;36097:6;36093:14;36086:58;36178:4;36173:2;36165:6;36161:15;36154:29;35969:221;:::o;36196:163::-;36336:15;36332:1;36324:6;36320:14;36313:39;36196:163;:::o;36365:114::-;;:::o;36485:227::-;36625:34;36621:1;36613:6;36609:14;36602:58;36694:10;36689:2;36681:6;36677:15;36670:35;36485:227;:::o;36718:156::-;36858:8;36854:1;36846:6;36842:14;36835:32;36718:156;:::o;36880:180::-;37020:32;37016:1;37008:6;37004:14;36997:56;36880:180;:::o;37066:173::-;37206:25;37202:1;37194:6;37190:14;37183:49;37066:173;:::o;37245:167::-;37385:19;37381:1;37373:6;37369:14;37362:43;37245:167;:::o;37418:234::-;37558:34;37554:1;37546:6;37542:14;37535:58;37627:17;37622:2;37614:6;37610:15;37603:42;37418:234;:::o;37658:122::-;37731:24;37749:5;37731:24;:::i;:::-;37724:5;37721:35;37711:63;;37770:1;37767;37760:12;37711:63;37658:122;:::o;37786:116::-;37856:21;37871:5;37856:21;:::i;:::-;37849:5;37846:32;37836:60;;37892:1;37889;37882:12;37836:60;37786:116;:::o;37908:122::-;37981:24;37999:5;37981:24;:::i;:::-;37974:5;37971:35;37961:63;;38020:1;38017;38010:12;37961:63;37908:122;:::o;38036:120::-;38108:23;38125:5;38108:23;:::i;:::-;38101:5;38098:34;38088:62;;38146:1;38143;38136:12;38088:62;38036:120;:::o;38162:122::-;38235:24;38253:5;38235:24;:::i;:::-;38228:5;38225:35;38215:63;;38274:1;38271;38264:12;38215:63;38162:122;:::o
Swarm Source
ipfs://de553eedfbc0756116855bfb22bed079921692e26ea4fef5bc7f0c0d8ab3f5f3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.