Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7844637 | 29 hrs ago | Contract Creation | 0 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Wrapped721
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-01-10 */ // SPDX-License-Identifier: MIT pragma solidity <0.9.0 >=0.8.4 ^0.8.1 ^0.8.2; // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC165.sol /** * @dev Required interface of an ERC165 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * Note: the ERC-165 identifier for this interface is 0x01ffc9a7. */ interface IERC165 { // ************************************** // ***** VIEW ***** // ************************************** /// @dev Returns if a contract implements an interface. /// Interface identification is specified in ERC-165. This function uses less than 30,000 gas. function supportsInterface(bytes4 interfaceId_) external view returns (bool); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC173.sol // import "./IERC165.sol"; /** * @dev Required interface of an ERC173 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-173[EIP]. * Note: the ERC-165 identifier for this interface is 0x7f5828d0. */ interface IERC173 /* is IERC165 */ { // ************************************** // ***** ERRORS ***** // ************************************** /// @dev Thrown when `operator` is not the contract owner. /// /// @param operator address trying to use a function reserved to contract owner without authorization error IERC173_NOT_OWNER(address operator); // ************************************** // ************************************** // ***** EVENTS ***** // ************************************** /// @dev This emits when ownership of a contract changes. /// /// @param previousOwner the previous contract owner /// @param newOwner the new contract owner event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /// @dev Set the address of the new owner of the contract. /// Set `newOwner_` to address(0) to renounce any ownership. function transferOwnership(address newOwner_) external; // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /// @dev Returns the address of the owner. function owner() external view returns(address); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC2981.sol // import "./IERC165.sol"; /** * @dev Required interface of an ERC2981 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-2981[EIP]. * Note: the ERC-165 identifier for this interface is 0x2a55205a. */ interface IERC2981 /* is IERC165 */ { // ************************************** // ***** ERRORS ***** // ************************************** /// @dev Thrown when the desired royalty rate is higher than 10,000 error IERC2981_INVALID_ROYALTIES(); // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /// @dev Called with the sale price to determine how much royalty is owed and to whom. function royaltyInfo(uint256 tokenId_, uint256 salePrice_) external view returns (address receiver, uint256 royaltyAmount); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721.sol // import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-721[EIP]. * Note: the ERC-165 identifier for this interface is 0x80ac58cd. */ interface IERC721 /* is IERC165 */ { // ************************************** // ***** ERRORS ***** // ************************************** /// @dev Thrown when `operator` is not allowed to manage `tokenId`. /// /// @param operator address trying to manage the token /// @param tokenId identifier of the NFT being referenced error IERC721_CALLER_NOT_APPROVED(address operator, uint256 tokenId); /// @dev Thrown when user tries to approve themselves for managing a token they own. error IERC721_INVALID_APPROVAL(); /// @dev Thrown when a token is being transferred to a contract unable to handle it or the zero address. /// /// @param receiver address unable to receive the token error IERC721_INVALID_RECEIVER(address receiver); /// @dev Thrown when checking ownership of the wrong token owner. error IERC721_INVALID_TOKEN_OWNER(); /// @dev Thrown when the requested token doesn"t exist. /// /// @param tokenId identifier of the NFT being referenced error IERC721_NONEXISTANT_TOKEN(uint256 tokenId); // ************************************** // ************************************** // ***** EVENTS ***** // ************************************** /// @dev This emits when the approved address for an NFT is changed or reaffirmed. /// The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved address for that NFT (if any) is reset to none. /// /// @param owner address that owns the token /// @param approved address that is allowed to manage the token /// @param tokenId identifier of the token being approved event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. The operator can manage all NFTs of the owner. /// /// @param owner address that owns the tokens /// @param operator address that is allowed or not to manage the tokens /// @param approved whether the operator is allowed or not event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed (`to` == 0). /// Exception: during contract creation, any number of NFTs may be created and assigned without emitting Transfer. /// At the time of any transfer, the approved address for that NFT (if any) is reset to none. /// /// @param from address the token is being transferred from /// @param to address the token is being transferred to /// @param tokenId identifier of the token being transferred event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. function approve(address approved_, uint256 tokenId_) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. /// Throws if `from_` is not the current owner. /// Throws if `to_` is the zero address. /// Throws if `tokenId_` is not a valid NFT. /// When transfer is complete, this function checks if `to_` is a smart contract (code size > 0). /// If so, it calls {onERC721Received} on `to_` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes calldata data_) external; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". function safeTransferFrom(address from_, address to_, uint256 tokenId_) external; /// @notice Enable or disable approval for a third party ("operator") to manage all of `msg.sender`'s assets. /// @dev Emits the ApprovalForAll event. The contract MUST allow multiple operators per owner. function setApprovalForAll(address operator_, bool approved_) external; /// @notice Transfer ownership of an NFT. /// The caller is responsible to confirm that `to_` is capable of receiving nfts or /// else they may be permanently lost /// @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. /// Throws if `from_` is not the current owner. /// Throws if `to_` is the zero address. /// Throws if `tokenId_` is not a valid NFT. function transferFrom(address from_, address to_, uint256 tokenId_) external; // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid. Throws for queries about the zero address. function balanceOf(address owner_) external view returns (uint256); /// @notice Get the approved address for a single NFT /// @dev Throws if `tokenId_` is not a valid NFT. function getApproved(uint256 tokenId_) external view returns (address); /// @notice Query if an address is an authorized operator for another address function isApprovedForAll(address owner_, address operator_) external view returns (bool); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. function ownerOf(uint256 tokenId_) external view returns (address); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Enumerable.sol // import "./IERC721.sol"; /** * @dev Required interface of an ERC721 compliant contract, optional enumeration extension, as defined in the * https://eips.ethereum.org/EIPS/eip-721[EIP]. * Note: the ERC-165 identifier for this interface is 0x780e9d63. */ interface IERC721Enumerable /* is IERC721 */ { // ************************************** // ***** ERRORS ***** // ************************************** /// @dev Thrown when trying to get the token at an index that doesn"t exist. /// /// @param index the inexistant index error IERC721Enumerable_INDEX_OUT_OF_BOUNDS(uint256 index); /// @dev Thrown when trying to get the token owned by `tokenOwner` at an index that doesn"t exist. /// /// @param index the inexistant index error IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS(uint256 index); // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /// @dev Enumerate valid NFTs /// Throws if `index_` >= {totalSupply()}. function tokenByIndex(uint256 index_) external view returns (uint256); /// @dev Enumerate NFTs assigned to an owner /// Throws if `index_` >= {balanceOf(owner_)} or if `owner_` is the zero address, representing invalid NFTs. function tokenOfOwnerByIndex(address owner_, uint256 index_) external view returns (uint256); /// @dev Count NFTs tracked by this contract function totalSupply() external view returns (uint256); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Metadata.sol // import "./IERC721.sol"; /** * @dev Required interface of an ERC721 compliant contract, optional metadata extension, as defined in the * https://eips.ethereum.org/EIPS/eip-721[EIP]. * Note: the ERC-165 identifier for this interface is 0x5b5e139f. */ interface IERC721Metadata /* is IERC721 */ { // ************************************** // ***** VIEW ***** // ************************************** /// @dev A descriptive name for a collection of NFTs in this contract function name() external view returns (string memory); /// @dev An abbreviated name for NFTs in this contract function symbol() external view returns (string memory); /// @dev A distinct Uniform Resource Identifier (URI) for a given asset. /// Throws if `tokenId_` is not a valid NFT. URIs are defined in RFC 3986. /// The URI may point to a JSON file that conforms to the "ERC721 Metadata JSON Schema". function tokenURI(uint256 tokenId_) external view returns (string memory); // ************************************** } // node_modules/@lambdalf-dev/ethereum-contracts/contracts/interfaces/IERC721Receiver.sol /** * @dev Required interface of an ERC721 receiver compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-721[EIP]. * Note: the ERC-165 identifier for this interface is 0x150b7a02. */ interface IERC721Receiver { // ************************************** // ***** VIEW ***** // ************************************** /// @dev Handle the receipt of an NFT /// The ERC721 smart contract calls this function on the recipient after a `transfer`. /// This function MAY throw to revert and reject the transfer. /// Return of other than the magic value MUST result in the transaction being reverted. /// Note: the contract address is always the message sender. function onERC721Received( address operator_, address from_, uint256 tokenId_, bytes calldata data_ ) external returns(bytes4); // ************************************** } // node_modules/@openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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); } } } // node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // src/interfaces/IAsset.sol interface IAsset is IERC721, IERC721Metadata {} // src/ERC173Initializable.sol /** * Author: Lambdalf the White */ abstract contract ERC173Initializable is IERC173, Initializable { // ************************************** // ***** STORAGE VARIABLES ***** // ************************************** /// @dev The current contract owner. address private _owner; // ************************************** function _init_ERC173(address owner_) internal onlyInitializing { _owner = owner_; } // ************************************** // ***** MODIFIERS ***** // ************************************** /// @dev Throws if called by any account other than the owner. modifier onlyOwner() { if (owner() != msg.sender) { revert IERC173_NOT_OWNER(msg.sender); } _; } // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /// @dev Transfers ownership of the contract to `newOwner_`. /// /// @param newOwner_ address of the new contract owner /// /// Requirements: /// /// - Caller must be the contract owner. function transferOwnership(address newOwner_) public virtual override onlyOwner { address _oldOwner_ = _owner; _owner = newOwner_; emit OwnershipTransferred(_oldOwner_, newOwner_); } // ************************************** // ************************************** // ***** VIEW ***** // ************************************** /// @dev Returns the address of the current contract owner. /// /// @return contractOwner the current contract owner function owner() public view virtual override returns (address contractOwner) { return _owner; } // ************************************** } // src/ERC2981Initializable.sol /** * Author: Lambdalf the White */ abstract contract ERC2981Initializable is IERC2981, Initializable { // ************************************** // ***** DATA TYPES ***** // ************************************** /// @dev A structure representing royalties struct RoyaltyData { address recipient; uint96 rate; } // ************************************** // ************************************** // ***** BYTECODE VARIABLES ***** // ************************************** /// @dev Royalty rate is stored out of 10,000 instead of a percentage /// to allow for up to two digits below the unit such as 2.5% or 1.25%. uint256 public constant ROYALTY_BASE = 10_000; // ************************************** // ************************************** // ***** STORAGE VARIABLES ***** // ************************************** /// @dev Represents the royalties on each sale on secondary markets. /// Set rate to 0 to have no royalties. RoyaltyData private _royaltyData; // ************************************** function _init_ERC2981(address royaltyRecipient_, uint96 royaltyRate_) internal onlyInitializing { _setRoyaltyInfo(royaltyRecipient_, royaltyRate_); } // ************************************** // ***** VIEW ***** // ************************************** /// @dev Called with the sale price to determine how much royalty is owed and to whom. /// /// @param tokenId_ identifier of the NFT being referenced /// @param salePrice_ the sale price of the token sold /// /// @return receiver the address receiving the royalties /// @return royaltyAmount the royalty payment amount /* solhint-disable no-unused-vars */ function royaltyInfo( uint256 tokenId_, uint256 salePrice_ ) public view virtual override returns (address receiver, uint256 royaltyAmount) { RoyaltyData memory _data_ = _royaltyData; if (salePrice_ == 0 || _data_.rate == 0 || _data_.recipient == address(0)) { return (address(0), 0); } uint256 _royaltyAmount_ = _data_.rate * salePrice_ / ROYALTY_BASE; return (_data_.recipient, _royaltyAmount_); } /* solhint-enable no-unused-vars */ // ************************************** // ************************************** // ***** INTERNAL ***** // ************************************** /// @dev Sets the royalty rate to `newRoyaltyRate_` and the royalty recipient to `newRoyaltyRecipient_`. /// /// @param newRoyaltyRecipient_ the address that will receive royalty payments /// @param newRoyaltyRate_ the percentage of the sale price that will be taken off as royalties, /// expressed in Basis Points (100 BP = 1%) /// /// Requirements: /// /// - `newRoyaltyRate_` cannot be higher than {ROYALTY_BASE}; function _setRoyaltyInfo(address newRoyaltyRecipient_, uint96 newRoyaltyRate_) internal virtual { if (newRoyaltyRate_ > ROYALTY_BASE) { revert IERC2981_INVALID_ROYALTIES(); } _royaltyData = RoyaltyData(newRoyaltyRecipient_, newRoyaltyRate_); } // ************************************** } // src/Wrapped721.sol /** * Author: Lambdalf the White */ contract Wrapped721 is IERC165, ERC173Initializable, ERC2981Initializable, IERC721, IERC721Metadata, IERC721Enumerable { // ************************************** // ***** ERRORS ***** // ************************************** /// @dev Thrown when trying to withdraw from the contract with no balance. error ETHER_NO_BALANCE(); /// @dev Thrown when contract fails to send ether to recipient. /// /// @param to the recipient of the ether /// @param amount the amount of ether being sent error ETHER_TRANSFER_FAIL(address to, uint256 amount); // ************************************** // ************************************** // ***** STORAGE VARIABLES ***** // ************************************** IAsset public underlyingAsset; // *********** // * IERC721 * // *********** /// @dev Number of NFT tracked by this contract uint256 public totalSupply; /// @dev Token ID mapped to approved address mapping(uint256 => address) private _approvals; /// @dev Token owner mapped to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /// @dev List of owner addresses mapping(uint256 => address) private _owners; /// @dev List of owner balances mapping(address => uint256) private _balances; // *********** // ******************* // * IERC721Metadata * // ******************* /// @dev The token's base URI. string private _baseUri; // ******************* // ************************************** constructor() { initialize(address(0), address(0), address(0), 0, ""); } function initialize( address admin_, address asset_, address royaltyRecipient_, uint96 royaltyRate_, string memory baseUri_ ) public initializer { underlyingAsset = IAsset(asset_); _setBaseUri(baseUri_); _init_ERC173(admin_); _init_ERC2981(royaltyRecipient_, royaltyRate_); } // ************************************** // ***** FALLBACK ***** // ************************************** fallback() external payable {} // solhint-disable no-empty-blocks receive() external payable {} // solhint-disable no-empty-blocks // ************************************** // ************************************** // ***** MODIFIER ***** // ************************************** // *********** // * IERC721 * // *********** /// @dev Throws if `tokenId_` doesn't exist. /// A token exists if it has been minted and is not owned by the zero address. /// /// @param tokenId_ identifier of the NFT being referenced modifier exists(uint256 tokenId_) { if (_owners[tokenId_] == address(0)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } _; } // *********** // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** /// @dev Wraps a token from the underlying collection and transfers it to `toAddress_`. /// /// @param tokenIds_ list of identifiers of the NFT being referenced /// /// Requirements: /// /// - The token number `tokenId_` must exist in the underlying collection. /// - The caller must own the token in the underlying collection. /// - This contract must be allowed to transfer `tokenId_` from the underlying collection on behalf of the caller. function wrap(uint256[] calldata tokenIds_) public { unchecked { totalSupply += tokenIds_.length; _balances[msg.sender] += tokenIds_.length; } for (uint256 i; i < tokenIds_.length; ++i) { _owners[tokenIds_[i]] = msg.sender; emit Transfer(address(0), msg.sender, tokenIds_[i]); underlyingAsset.transferFrom(msg.sender, address(this), tokenIds_[i]); } } /// @dev Unwraps a token from the underlying collection and transfers it to `toAddress_`. /// /// @param tokenIds_ list of identifiers of the NFT being referenced /// /// Requirements: /// /// - The token number `tokenId_` must exist in the underlying collection. /// - The caller must own the token or be an approved operator. function unwrap(uint256[] calldata tokenIds_) public { unchecked { totalSupply -= tokenIds_.length; _balances[msg.sender] -= tokenIds_.length; } for (uint256 i; i < tokenIds_.length; ++i) { if (_owners[tokenIds_[i]] != msg.sender) { revert IERC721_CALLER_NOT_APPROVED(msg.sender, tokenIds_[i]); } _owners[tokenIds_[i]] = address(0); emit Transfer(msg.sender, address(0), tokenIds_[i]); underlyingAsset.transferFrom(address(this), msg.sender, tokenIds_[i]); } } // *********** // * IERC721 * // *********** /// @dev Gives permission to `to_` to transfer the token number `tokenId_` on behalf of its owner. /// The approval is cleared when the token is transferred. /// /// Only a single account can be approved at a time, so approving the zero address clears previous approvals. /// /// @param to_ The new approved NFT controller /// @param tokenId_ The NFT to approve /// /// Requirements: /// /// - The token number `tokenId_` must exist. /// - The caller must own the token or be an approved operator. /// - Must emit an {Approval} event. function approve(address to_, uint256 tokenId_) public virtual override { address _tokenOwner_ = ownerOf(tokenId_); if (to_ == _tokenOwner_) { revert IERC721_INVALID_APPROVAL(); } bool _isApproved_ = _isApprovedOrOwner(_tokenOwner_, msg.sender, tokenId_); if (!_isApproved_) { revert IERC721_CALLER_NOT_APPROVED(msg.sender, tokenId_); } _approvals[tokenId_] = to_; emit Approval(_tokenOwner_, to_, tokenId_); } /// @dev Transfers the token number `tokenId_` from `from_` to `to_`. /// /// @param from_ The current owner of the NFT /// @param to_ The new owner /// @param tokenId_ identifier of the NFT being referenced /// /// Requirements: /// /// - The token number `tokenId_` must exist. /// - `from_` must be the token owner. /// - The caller must own the token or be an approved operator. /// - `to_` must not be the zero address. /// - If `to_` is a contract, it must implement {IERC721Receiver-onERC721Received} with a return value of `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, /// - Must emit a {Transfer} event. function safeTransferFrom(address from_, address to_, uint256 tokenId_) public virtual override { safeTransferFrom(from_, to_, tokenId_, ""); } /// @dev Transfers the token number `tokenId_` from `from_` to `to_`. /// /// @param from_ The current owner of the NFT /// @param to_ The new owner /// @param tokenId_ identifier of the NFT being referenced /// @param data_ Additional data with no specified format, sent in call to `to_` /// /// Requirements: /// /// - The token number `tokenId_` must exist. /// - `from_` must be the token owner. /// - The caller must own the token or be an approved operator. /// - `to_` must not be the zero address. /// - If `to_` is a contract, it must implement {IERC721Receiver-onERC721Received} with a return value of `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, /// - Must emit a {Transfer} event. function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public virtual override { transferFrom(from_, to_, tokenId_); if (!_checkOnERC721Received(from_, to_, tokenId_, data_)) { revert IERC721_INVALID_RECEIVER(to_); } } /// @dev Allows or disallows `operator_` to manage the caller's tokens on their behalf. /// /// @param operator_ Address to add to the set of authorized operators /// @param approved_ True if the operator is approved, false to revoke approval /// /// Requirements: /// /// - Must emit an {ApprovalForAll} event. function setApprovalForAll(address operator_, bool approved_) public virtual override { if (operator_ == msg.sender) { revert IERC721_INVALID_APPROVAL(); } _operatorApprovals[msg.sender][operator_] = approved_; emit ApprovalForAll(msg.sender, operator_, approved_); } /// @dev Transfers the token number `tokenId_` from `from_` to `to_`. /// /// @param from_ the current owner of the NFT /// @param to_ the new owner /// @param tokenId_ identifier of the NFT being referenced /// /// Requirements: /// /// - The token number `tokenId_` must exist. /// - `from_` must be the token owner. /// - The caller must own the token or be an approved operator. /// - `to_` must not be the zero address. /// - Must emit a {Transfer} event. function transferFrom(address from_, address to_, uint256 tokenId_) public virtual override { if (to_ == address(0)) { revert IERC721_INVALID_RECEIVER(to_); } address _tokenOwner_ = ownerOf(tokenId_); if (from_ != _tokenOwner_) { revert IERC721_INVALID_TOKEN_OWNER(); } if (!_isApprovedOrOwner(_tokenOwner_, msg.sender, tokenId_)) { revert IERC721_CALLER_NOT_APPROVED(msg.sender, tokenId_); } unchecked { --_balances[from_]; ++_balances[to_]; } _transfer(from_, to_, tokenId_); } // *********** // *********************** // * ERC721BatchBurnable * // *********************** /// @dev Burns `tokenId_`. /// /// Requirements: /// /// - `tokenId_` must exist /// - The caller must own `tokenId_` or be an approved operator function burn(uint256 tokenId_) public { address _tokenOwner_ = ownerOf(tokenId_); if (!_isApprovedOrOwner(_tokenOwner_, msg.sender, tokenId_)) { revert IERC721_CALLER_NOT_APPROVED(msg.sender, tokenId_); } unchecked { --totalSupply; --_balances[msg.sender]; } _transfer(_tokenOwner_, address(0), tokenId_); } // *********************** // ************************************** // ************************************** // ***** CONTRACT_OWNER ***** // ************************************** /// @notice Withdraws all the money stored in the contract and sends it to the treasury. /// /// Requirements: /// /// - Caller must be the contract owner. /// - Contract must have a positive balance. /// - Caller must be able to receive the funds. function withdraw() public onlyOwner { uint256 _balance_ = address(this).balance; if (_balance_ == 0) { revert ETHER_NO_BALANCE(); } // solhint-disable-next-line (bool _success_,) = payable(msg.sender).call{value: _balance_}(""); if (!_success_) { revert ETHER_TRANSFER_FAIL(msg.sender, _balance_); } } // ******************* // * IERC721Metadata * // ******************* /// @notice Updates the baseUri for the tokens. /// /// @param newBaseUri_ the new baseUri for the tokens /// /// Requirements: /// /// - Caller must be the contract owner. function setBaseUri(string memory newBaseUri_) public onlyOwner { _setBaseUri(newBaseUri_); } // ******************* // ************ // * IERC2981 * // ************ /// @dev Sets the royalty rate to `newRoyaltyRate_` and the royalty recipient to `newRoyaltyRecipient_`. /// /// @param newRoyaltyRecipient_ the address that will receive royalty payments /// @param newRoyaltyRate_ the percentage of the sale price that will be taken off as royalties, /// expressed in Basis Points (100 BP = 1%) /// /// Requirements: /// /// - Caller must be the contract owner. /// - `newRoyaltyRate_` cannot be higher than {ROYALTY_BASE}; function setRoyaltyInfo(address newRoyaltyRecipient_, uint96 newRoyaltyRate_) public onlyOwner { _setRoyaltyInfo(newRoyaltyRecipient_, newRoyaltyRate_); } // ************ // ************************************** // ************************************** // ***** VIEW ***** // ************************************** // *********** // * IERC721 * // *********** /// @dev Returns the number of tokens in `tokenOwner_`'s account. /// /// @param tokenOwner_ address that owns tokens /// /// @return ownerBalance the nomber of tokens owned by `tokenOwner_` /// /// Requirements: /// /// - `tokenOwner_` must not be the zero address function balanceOf(address tokenOwner_) public view virtual override returns (uint256 ownerBalance) { if (tokenOwner_ == address(0)) { revert IERC721_INVALID_TOKEN_OWNER(); } ownerBalance = _balances[tokenOwner_]; } /// @dev Returns the address that has been specifically allowed to manage `tokenId_` on behalf of its owner. /// /// @param tokenId_ the NFT that has been approved /// /// @return approved the address allowed to manage `tokenId_` /// /// Requirements: /// /// - `tokenId_` must exist. /// /// Note: See {Approve} function getApproved(uint256 tokenId_) public view virtual override returns (address approved) { if (_owners[tokenId_] == address(0)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } return _approvals[tokenId_]; } /// @dev Returns whether `operator_` is allowed to manage tokens on behalf of `tokenOwner_`. /// /// @param tokenOwner_ address that owns tokens /// @param operator_ address that tries to manage tokens /// /// @return isApproved whether `operator_` is allowed to handle `tokenOwner`'s tokens /// /// Note: See {setApprovalForAll} function isApprovedForAll( address tokenOwner_, address operator_ ) public view virtual override returns (bool isApproved) { return _operatorApprovals[tokenOwner_][operator_]; } /// @dev Returns the owner of the token number `tokenId_`. /// /// @param tokenId_ the NFT to verify ownership of /// /// @return tokenOwner the owner of token number `tokenId_` /// /// Requirements: /// /// - `tokenId_` must exist. function ownerOf(uint256 tokenId_) public view virtual override returns (address tokenOwner) { tokenOwner = _owners[tokenId_]; if (tokenOwner == address(0)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } } // *********** // ********************* // * IERC721Enumerable * // ********************* /// @dev Enumerate valid NFTs /// /// @param index_ the index requested /// /// @return tokenId the identifier of the token at the specified index /// /// Requirements: /// /// - `index_` must be less than {totalSupply} function tokenByIndex(uint256 index_) public view virtual override returns (uint256) { if (index_ >= totalSupply) { revert IERC721Enumerable_INDEX_OUT_OF_BOUNDS(index_); } uint256 _count_; uint256 _id_; while (_count_ <= index_) { if (_owners[_id_] != address(0)) { if (index_ == _count_) { return _id_; } unchecked { ++_count_; } } unchecked { ++_id_; } } } /// @dev Enumerate NFTs assigned to an owner /// /// @param tokenOwner_ the address requested /// @param index_ the index requested /// /// @return tokenId the identifier of the token at the specified index /// /// Requirements: /// /// - `index_` must be less than {balanceOf(tokenOwner_)} /// - `tokenOwner_` must not be the zero address function tokenOfOwnerByIndex(address tokenOwner_, uint256 index_) public view virtual override returns (uint256) { if (tokenOwner_ == address(0)) { revert IERC721_INVALID_TOKEN_OWNER(); } if (index_ >= _balances[tokenOwner_]) { revert IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS(index_); } uint256 _count_; uint256 _id_; while (_count_ <= index_) { if (_owners[_id_] == tokenOwner_) { if (index_ == _count_) { return _id_; } unchecked { ++_count_; } } unchecked { ++_id_; } } } // ********************* // ******************* // * IERC721Metadata * // ******************* /// @dev A descriptive name for a collection of NFTs in this contract /// /// @return tokenName The descriptive name of the NFTs function name() public view virtual override returns (string memory tokenName) { tokenName = underlyingAsset.name(); } /// @dev An abbreviated name for NFTs in this contract /// /// @return tokenSymbol The abbreviated name of the NFTs function symbol() public view virtual override returns (string memory tokenSymbol) { tokenSymbol = underlyingAsset.symbol(); } /// @dev A distinct Uniform Resource Identifier (URI) for a given asset. /// /// @param tokenId_ the NFT that has been approved /// /// @return uri the URI of the token /// /// Requirements: /// /// - `tokenId_` must exist. function tokenURI(uint256 tokenId_) public view virtual override returns (string memory uri) { if (_owners[tokenId_] == address(0)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } return bytes(_baseUri).length > 0 ? string(abi.encodePacked(_baseUri, _toString(tokenId_))) : _toString(tokenId_); } // ******************* // *********** // * IERC165 * // *********** /// @dev Query if a contract implements an interface. /// @dev see https://eips.ethereum.org/EIPS/eip-165 /// /// @param interfaceId_ the interface identifier, as specified in ERC-165 /// /// @return bool true if the contract implements the specified interface, false otherwise /// /// Requirements: /// /// - This function must use less than 30,000 gas. function supportsInterface(bytes4 interfaceId_) public pure override returns (bool) { return interfaceId_ == type(IERC721).interfaceId || interfaceId_ == type(IERC721Enumerable).interfaceId || interfaceId_ == type(IERC721Metadata).interfaceId || interfaceId_ == type(IERC173).interfaceId || interfaceId_ == type(IERC165).interfaceId || interfaceId_ == type(IERC2981).interfaceId; } // *********** // ************************************** // ************************************** // ***** INTERNAL ***** // ************************************** // *********** // * IERC721 * // *********** /// @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. /// The call is not executed if the target address is not a contract. /// /// @param from_ address owning the token being transferred /// @param to_ address the token is being transferred to /// @param tokenId_ identifier of the NFT being referenced /// @param data_ optional data to send along with the call /// /// @return isValidReceiver whether the call correctly returned the expected value function _checkOnERC721Received( address from_, address to_, uint256 tokenId_, bytes memory data_ ) internal virtual returns (bool isValidReceiver) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // // IMPORTANT // It is unsafe to assume that an address not flagged by this method // is an externally-owned account (EOA) and not a contract. // // Among others, the following types of addresses will not be flagged: // // - 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 uint256 _size_; assembly { _size_ := extcodesize(to_) } // If address is a contract, check that it is aware of how to handle ERC721 tokens if (_size_ > 0) { try IERC721Receiver(to_).onERC721Received(msg.sender, from_, tokenId_, data_) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert IERC721_INVALID_RECEIVER(to_); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /// @dev Internal function returning whether `operator_` is allowed to handle `tokenId_` /// /// Note: To avoid multiple checks for the same data, it is assumed /// that existence of `tokenId_` has been verified prior via {_exists} /// If it hasn't been verified, this function might panic /// /// @param operator_ address that tries to handle the token /// @param tokenId_ identifier of the NFT being referenced /// /// @return isApproved whether `operator_` is allowed to manage the token function _isApprovedOrOwner( address tokenOwner_, address operator_, uint256 tokenId_ ) internal view virtual returns (bool isApproved) { return operator_ == tokenOwner_ || operator_ == getApproved(tokenId_) || _operatorApprovals[tokenOwner_][operator_]; } /// @dev Transfers `tokenId_` from `fromAddress_` to `toAddress_`. /// /// Emits a {Transfer} event. /// /// @param fromAddress_ the current owner of the NFT /// @param toAddress_ the new owner /// @param tokenId_ identifier of the NFT being referenced function _transfer(address fromAddress_, address toAddress_, uint256 tokenId_) internal virtual { _approvals[tokenId_] = address(0); _owners[tokenId_] = toAddress_; emit Transfer(fromAddress_, toAddress_, tokenId_); } // *********** // ******************* // * IERC721Metadata * // ******************* /// @notice Updates the baseUri for the tokens. /// /// @param newBaseUri_ the new baseUri for the tokens /// /// Requirements: /// /// - Caller must be the contract owner. function _setBaseUri(string memory newBaseUri_) internal virtual { _baseUri = newBaseUri_; } /// @dev Converts a `uint256` to its ASCII `string` decimal representation. /// /// @param value_ the value to convert to string. /// /// @return str the string representation of `value_` function _toString(uint256 value_) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value_ } 1 {} { // solhint-disable-line str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } // ******************* // ************************************** }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ETHER_NO_BALANCE","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHER_TRANSFER_FAIL","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"IERC173_NOT_OWNER","type":"error"},{"inputs":[],"name":"IERC2981_INVALID_ROYALTIES","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_CALLER_NOT_APPROVED","type":"error"},{"inputs":[],"name":"IERC721_INVALID_APPROVAL","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"IERC721_INVALID_RECEIVER","type":"error"},{"inputs":[],"name":"IERC721_INVALID_TOKEN_OWNER","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IERC721_NONEXISTANT_TOKEN","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ROYALTY_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"ownerBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"approved","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"asset_","type":"address"},{"internalType":"address","name":"royaltyRecipient_","type":"address"},{"internalType":"uint96","name":"royaltyRate_","type":"uint96"},{"internalType":"string","name":"baseUri_","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"address","name":"operator_","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"tokenName","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"contractOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"uint256","name":"salePrice_","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseUri_","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltyRecipient_","type":"address"},{"internalType":"uint96","name":"newRoyaltyRate_","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"tokenSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner_","type":"address"},{"internalType":"uint256","name":"index_","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlyingAsset","outputs":[{"internalType":"contract IAsset","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000038600080600080604051806020016040528060008152506200003e60201b60201c565b62000463565b600054610100900460ff16158080156200005f5750600054600160ff909116105b806200007b5750303b1580156200007b575060005460ff166001145b620000e45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000108576000805461ff0019166101001790555b600280546001600160a01b0319166001600160a01b0387161790556200012e8262000194565b6200013986620001a6565b6200014584846200022c565b80156200018c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b6008620001a2828262000397565b5050565b600054610100900460ff16620002025760405162461bcd60e51b815260206004820152602b602482015260008051602062002e9383398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000db565b600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600054610100900460ff16620002885760405162461bcd60e51b815260206004820152602b602482015260008051602062002e9383398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000db565b620001a28282612710816001600160601b03161115620002bb57604051635b75946560e11b815260040160405180910390fd5b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200031f57607f821691505b6020821081036200034057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000392576000816000526020600020601f850160051c81016020861015620003715750805b601f850160051c820191505b818110156200018c578281556001016200037d565b505050565b81516001600160401b03811115620003b357620003b3620002f4565b620003cb81620003c484546200030a565b8462000346565b602080601f831160018114620004035760008415620003ea5750858301515b600019600386901b1c1916600185901b1785556200018c565b600085815260208120601f198616915b82811015620004345788860151825594840194600190910190840162000413565b5085821015620004535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612a2080620004736000396000f3fe6080604052600436106101a35760003560e01c80636352211e116100e0578063a0bcfc7f11610084578063c87b56dd11610061578063c87b56dd14610516578063cc17a5bf14610536578063e985e9c514610556578063f2fde38b146105ac57005b8063a0bcfc7f146104b6578063a22cb465146104d6578063b88d4fde146104f657005b806370a08231116100bd57806370a08231146104235780637158da7c146104435780638da5cb5b1461047057806395d89b41146104a157005b80636352211e146103c357806363ac2a4c146103e3578063696487741461040357005b80632a55205a1161014757806342842e0e1161012457806342842e0e1461034d57806342966c681461036d5780634f6ccce71461038d5780635f97036f146103ad57005b80632a55205a146102cc5780632f745c59146103185780633ccfd60b1461033857005b8063081812fc11610180578063081812fc14610223578063095ea7b31461026857806318160ddd1461028857806323b872dd146102ac57005b806301ffc9a7146101ac57806302fa7c47146101e157806306fdde031461020157005b366101aa57005b005b3480156101b857600080fd5b506101cc6101c7366004612109565b6105cc565b60405190151581526020015b60405180910390f35b3480156101ed57600080fd5b506101aa6101fc36600461216d565b610795565b34801561020d57600080fd5b50610216610802565b6040516101d8919061220e565b34801561022f57600080fd5b5061024361023e366004612221565b6108bd565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d8565b34801561027457600080fd5b506101aa61028336600461223a565b610944565b34801561029457600080fd5b5061029e60035481565b6040519081526020016101d8565b3480156102b857600080fd5b506101aa6102c7366004612264565b610a87565b3480156102d857600080fd5b506102ec6102e73660046122a0565b610c13565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101d8565b34801561032457600080fd5b5061029e61033336600461223a565b610cf5565b34801561034457600080fd5b506101aa610e05565b34801561035957600080fd5b506101aa610368366004612264565b610f26565b34801561037957600080fd5b506101aa610388366004612221565b610f46565b34801561039957600080fd5b5061029e6103a8366004612221565b610feb565b3480156103b957600080fd5b5061029e61271081565b3480156103cf57600080fd5b506102436103de366004612221565b611084565b3480156103ef57600080fd5b506101aa6103fe3660046122c2565b6110e8565b34801561040f57600080fd5b506101aa61041e366004612459565b611378565b34801561042f57600080fd5b5061029e61043e3660046124d9565b611563565b34801561044f57600080fd5b506002546102439073ffffffffffffffffffffffffffffffffffffffff1681565b34801561047c57600080fd5b5060005462010000900473ffffffffffffffffffffffffffffffffffffffff16610243565b3480156104ad57600080fd5b506102166115db565b3480156104c257600080fd5b506101aa6104d13660046124f4565b61164b565b3480156104e257600080fd5b506101aa6104f1366004612529565b6116b1565b34801561050257600080fd5b506101aa610511366004612565565b611797565b34801561052257600080fd5b50610216610531366004612221565b6117fc565b34801561054257600080fd5b506101aa6105513660046122c2565b6118b2565b34801561056257600080fd5b506101cc6105713660046125e1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105b857600080fd5b506101aa6105c73660046124d9565b611a87565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061065f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b806106ab57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106f757507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061074357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061078f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146107f4576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6107fe8282611b5f565b5050565b600254604080517f06fdde03000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff16916306fdde039160048083019260009291908290030181865afa158015610872573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108b8919081019061260b565b905090565b60008181526006602052604081205473ffffffffffffffffffffffffffffffffffffffff1661091b576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061094f82611084565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b6576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109c3823385611c05565b905080610a05576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018490526044016107eb565b60008381526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b73ffffffffffffffffffffffffffffffffffffffff8216610aec576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107eb565b6000610af782611084565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b69813384611c05565b610ba8576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526007602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905591851681522080546001019055610c0d848484611cb9565b50505050565b6040805180820190915260015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201526000908190831580610c86575060208101516bffffffffffffffffffffffff16155b80610ca65750805173ffffffffffffffffffffffffffffffffffffffff16155b15610cb8576000809250925050610cee565b60006127108583602001516bffffffffffffffffffffffff16610cdb9190612682565b610ce591906126c0565b91519350909150505b9250929050565b600073ffffffffffffffffffffffffffffffffffffffff8316610d44576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020548210610da5576040517fd999841b000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b6000805b838211610dfd5760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff808716911603610df557818403610dee57915061078f9050565b8160010191505b600101610da9565b505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314610e5f576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b476000819003610e9b576040517f6cc4466b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090339083908381818185875af1925050503d8060008114610edd576040519150601f19603f3d011682016040523d82523d6000602084013e610ee2565b606091505b50509050806107fe576040517f84020a7b000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b610f4183838360405180602001604052806000815250611797565b505050565b6000610f5182611084565b9050610f5e813384611c05565b610f9d576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810190915533600090815260076020526040812080549092019091556107fe90829084611cb9565b6000600354821061102b576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b6000805b83821161107d5760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff16156110755781840361106e579392505050565b8160010191505b60010161102f565b5050919050565b60008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110e3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b919050565b600380548290039055336000908152600760205260408120805483900390555b81811015610f41573360066000858585818110611127576111276126fb565b602090810292909201358352508101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff16146111c8573383838381811061116f5761116f6126fb565b6040517fea54448300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909416600485015260200291909101356024830152506044016107eb565b6000600660008585858181106111e0576111e06126fb565b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828282818110611245576112456126fb565b90506020020135600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460025473ffffffffffffffffffffffffffffffffffffffff166323b872dd30338686868181106112d9576112d96126fb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b50505050806001019050611108565b600054610100900460ff16158080156113985750600054600160ff909116105b806113b25750303b1580156113b2575060005460ff166001145b61143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107eb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561149c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790556114e582611d4f565b6114ee86611d5b565b6114f88484611e3f565b801561155b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82166115b2576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205490565b600254604080517f95d89b41000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff16916395d89b419160048083019260009291908290030181865afa158015610872573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146116a5576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b6116ae81611d4f565b50565b3373ffffffffffffffffffffffffffffffffffffffff831603611700576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117a2848484610a87565b6117ae84848484611ed6565b610c0d576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107eb565b60008181526006602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661185d576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b60006008805461186c9061272a565b9050116118815761187c82612079565b61078f565b600861188c83612079565b60405160200161189d92919061277d565b60405160208183030381529060405292915050565b60038054820190553360009081526007602052604081208054830190555b81811015610f415733600660008585858181106118ef576118ef6126fb565b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828282818110611954576119546126fb565b905060200201353373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460025473ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106119e8576119e86126fb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611a6457600080fd5b505af1158015611a78573d6000803e3d6000fd5b505050508060010190506118d0565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314611ae1576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b6000805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b612710816bffffffffffffffffffffffff161115611ba9576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c745750611c45826108bd565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611cb1575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556006909252808320805473ffffffffffffffffffffffffffffffffffffffff8781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60086107fe828261286a565b600054610100900460ff16611df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107eb565b6000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b600054610100900460ff166107f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107eb565b6000833b801561206d576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290611f389033908a9089908990600401612984565b6020604051808303816000875af1925050508015611f91575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f8e918101906129cd565b60015b612020573d808015611fbf576040519150601f19603f3d011682016040523d82523d6000602084013e611fc4565b606091505b508051600003612018576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016107eb565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150611cb19050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061209357508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146116ae57600080fd5b60006020828403121561211b57600080fd5b8135612126816120db565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110e357600080fd5b80356bffffffffffffffffffffffff811681146110e357600080fd5b6000806040838503121561218057600080fd5b6121898361212d565b915061219760208401612151565b90509250929050565b60005b838110156121bb5781810151838201526020016121a3565b50506000910152565b600081518084526121dc8160208601602086016121a0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061212660208301846121c4565b60006020828403121561223357600080fd5b5035919050565b6000806040838503121561224d57600080fd5b6122568361212d565b946020939093013593505050565b60008060006060848603121561227957600080fd5b6122828461212d565b92506122906020850161212d565b9150604084013590509250925092565b600080604083850312156122b357600080fd5b50508035926020909101359150565b600080602083850312156122d557600080fd5b823567ffffffffffffffff808211156122ed57600080fd5b818501915085601f83011261230157600080fd5b81358181111561231057600080fd5b8660208260051b850101111561232557600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156123ad576123ad612337565b604052919050565b600067ffffffffffffffff8211156123cf576123cf612337565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061240e612409846123b5565b612366565b905082815283838301111561242257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261244a57600080fd5b612126838335602085016123fb565b600080600080600060a0868803121561247157600080fd5b61247a8661212d565b94506124886020870161212d565b93506124966040870161212d565b92506124a460608701612151565b9150608086013567ffffffffffffffff8111156124c057600080fd5b6124cc88828901612439565b9150509295509295909350565b6000602082840312156124eb57600080fd5b6121268261212d565b60006020828403121561250657600080fd5b813567ffffffffffffffff81111561251d57600080fd5b611cb184828501612439565b6000806040838503121561253c57600080fd5b6125458361212d565b91506020830135801515811461255a57600080fd5b809150509250929050565b6000806000806080858703121561257b57600080fd5b6125848561212d565b93506125926020860161212d565b925060408501359150606085013567ffffffffffffffff8111156125b557600080fd5b8501601f810187136125c657600080fd5b6125d5878235602084016123fb565b91505092959194509250565b600080604083850312156125f457600080fd5b6125fd8361212d565b91506121976020840161212d565b60006020828403121561261d57600080fd5b815167ffffffffffffffff81111561263457600080fd5b8201601f8101841361264557600080fd5b8051612653612409826123b5565b81815285602083850101111561266857600080fd5b6126798260208301602086016121a0565b95945050505050565b808202811582820484141761078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826126f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061273e57607f821691505b602082108103612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600080845461278b8161272a565b600182811680156127a357600181146127d657612805565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612805565b8860005260208060002060005b858110156127fc5781548a8201529084019082016127e3565b50505082870194505b5050505083516128198183602088016121a0565b01949350505050565b601f821115610f41576000816000526020600020601f850160051c8101602086101561284b5750805b601f850160051c820191505b8181101561155b57828155600101612857565b815167ffffffffffffffff81111561288457612884612337565b61289881612892845461272a565b84612822565b602080601f8311600181146128eb57600084156128b55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561155b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561293857888601518255948401946001909101908401612919565b508582101561297457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526129c360808301846121c4565b9695505050505050565b6000602082840312156129df57600080fd5b8151612126816120db56fea2646970667358221220bb65a2127937d4d78187b8361c6858a49d64f7f534dcf38e1e9c7d066c29022764736f6c63430008180033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069
Deployed Bytecode
0x6080604052600436106101a35760003560e01c80636352211e116100e0578063a0bcfc7f11610084578063c87b56dd11610061578063c87b56dd14610516578063cc17a5bf14610536578063e985e9c514610556578063f2fde38b146105ac57005b8063a0bcfc7f146104b6578063a22cb465146104d6578063b88d4fde146104f657005b806370a08231116100bd57806370a08231146104235780637158da7c146104435780638da5cb5b1461047057806395d89b41146104a157005b80636352211e146103c357806363ac2a4c146103e3578063696487741461040357005b80632a55205a1161014757806342842e0e1161012457806342842e0e1461034d57806342966c681461036d5780634f6ccce71461038d5780635f97036f146103ad57005b80632a55205a146102cc5780632f745c59146103185780633ccfd60b1461033857005b8063081812fc11610180578063081812fc14610223578063095ea7b31461026857806318160ddd1461028857806323b872dd146102ac57005b806301ffc9a7146101ac57806302fa7c47146101e157806306fdde031461020157005b366101aa57005b005b3480156101b857600080fd5b506101cc6101c7366004612109565b6105cc565b60405190151581526020015b60405180910390f35b3480156101ed57600080fd5b506101aa6101fc36600461216d565b610795565b34801561020d57600080fd5b50610216610802565b6040516101d8919061220e565b34801561022f57600080fd5b5061024361023e366004612221565b6108bd565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d8565b34801561027457600080fd5b506101aa61028336600461223a565b610944565b34801561029457600080fd5b5061029e60035481565b6040519081526020016101d8565b3480156102b857600080fd5b506101aa6102c7366004612264565b610a87565b3480156102d857600080fd5b506102ec6102e73660046122a0565b610c13565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101d8565b34801561032457600080fd5b5061029e61033336600461223a565b610cf5565b34801561034457600080fd5b506101aa610e05565b34801561035957600080fd5b506101aa610368366004612264565b610f26565b34801561037957600080fd5b506101aa610388366004612221565b610f46565b34801561039957600080fd5b5061029e6103a8366004612221565b610feb565b3480156103b957600080fd5b5061029e61271081565b3480156103cf57600080fd5b506102436103de366004612221565b611084565b3480156103ef57600080fd5b506101aa6103fe3660046122c2565b6110e8565b34801561040f57600080fd5b506101aa61041e366004612459565b611378565b34801561042f57600080fd5b5061029e61043e3660046124d9565b611563565b34801561044f57600080fd5b506002546102439073ffffffffffffffffffffffffffffffffffffffff1681565b34801561047c57600080fd5b5060005462010000900473ffffffffffffffffffffffffffffffffffffffff16610243565b3480156104ad57600080fd5b506102166115db565b3480156104c257600080fd5b506101aa6104d13660046124f4565b61164b565b3480156104e257600080fd5b506101aa6104f1366004612529565b6116b1565b34801561050257600080fd5b506101aa610511366004612565565b611797565b34801561052257600080fd5b50610216610531366004612221565b6117fc565b34801561054257600080fd5b506101aa6105513660046122c2565b6118b2565b34801561056257600080fd5b506101cc6105713660046125e1565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156105b857600080fd5b506101aa6105c73660046124d9565b611a87565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061065f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b806106ab57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106f757507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061074357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061078f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146107f4576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6107fe8282611b5f565b5050565b600254604080517f06fdde03000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff16916306fdde039160048083019260009291908290030181865afa158015610872573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526108b8919081019061260b565b905090565b60008181526006602052604081205473ffffffffffffffffffffffffffffffffffffffff1661091b576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600061094f82611084565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b6576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109c3823385611c05565b905080610a05576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018490526044016107eb565b60008381526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b73ffffffffffffffffffffffffffffffffffffffff8216610aec576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107eb565b6000610af782611084565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610b5e576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b69813384611c05565b610ba8576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526007602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905591851681522080546001019055610c0d848484611cb9565b50505050565b6040805180820190915260015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201526000908190831580610c86575060208101516bffffffffffffffffffffffff16155b80610ca65750805173ffffffffffffffffffffffffffffffffffffffff16155b15610cb8576000809250925050610cee565b60006127108583602001516bffffffffffffffffffffffff16610cdb9190612682565b610ce591906126c0565b91519350909150505b9250929050565b600073ffffffffffffffffffffffffffffffffffffffff8316610d44576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600760205260409020548210610da5576040517fd999841b000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b6000805b838211610dfd5760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff808716911603610df557818403610dee57915061078f9050565b8160010191505b600101610da9565b505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314610e5f576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b476000819003610e9b576040517f6cc4466b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090339083908381818185875af1925050503d8060008114610edd576040519150601f19603f3d011682016040523d82523d6000602084013e610ee2565b606091505b50509050806107fe576040517f84020a7b000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b610f4183838360405180602001604052806000815250611797565b505050565b6000610f5182611084565b9050610f5e813384611c05565b610f9d576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107eb565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810190915533600090815260076020526040812080549092019091556107fe90829084611cb9565b6000600354821061102b576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b6000805b83821161107d5760008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff16156110755781840361106e579392505050565b8160010191505b60010161102f565b5050919050565b60008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110e3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b919050565b600380548290039055336000908152600760205260408120805483900390555b81811015610f41573360066000858585818110611127576111276126fb565b602090810292909201358352508101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff16146111c8573383838381811061116f5761116f6126fb565b6040517fea54448300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909416600485015260200291909101356024830152506044016107eb565b6000600660008585858181106111e0576111e06126fb565b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828282818110611245576112456126fb565b90506020020135600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460025473ffffffffffffffffffffffffffffffffffffffff166323b872dd30338686868181106112d9576112d96126fb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561135557600080fd5b505af1158015611369573d6000803e3d6000fd5b50505050806001019050611108565b600054610100900460ff16158080156113985750600054600160ff909116105b806113b25750303b1580156113b2575060005460ff166001145b61143e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107eb565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561149c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87161790556114e582611d4f565b6114ee86611d5b565b6114f88484611e3f565b801561155b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82166115b2576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205490565b600254604080517f95d89b41000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff16916395d89b419160048083019260009291908290030181865afa158015610872573d6000803e3d6000fd5b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146116a5576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b6116ae81611d4f565b50565b3373ffffffffffffffffffffffffffffffffffffffff831603611700576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6117a2848484610a87565b6117ae84848484611ed6565b610c0d576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107eb565b60008181526006602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661185d576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018390526024016107eb565b60006008805461186c9061272a565b9050116118815761187c82612079565b61078f565b600861188c83612079565b60405160200161189d92919061277d565b60405160208183030381529060405292915050565b60038054820190553360009081526007602052604081208054830190555b81811015610f415733600660008585858181106118ef576118ef6126fb565b90506020020135815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828282818110611954576119546126fb565b905060200201353373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460025473ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106119e8576119e86126fb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815273ffffffffffffffffffffffffffffffffffffffff958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015611a6457600080fd5b505af1158015611a78573d6000803e3d6000fd5b505050508060010190506118d0565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314611ae1576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107eb565b6000805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b612710816bffffffffffffffffffffffff161115611ba9576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611c745750611c45826108bd565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611cb1575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556006909252808320805473ffffffffffffffffffffffffffffffffffffffff8781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60086107fe828261286a565b600054610100900460ff16611df2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107eb565b6000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b600054610100900460ff166107f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107eb565b6000833b801561206d576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290611f389033908a9089908990600401612984565b6020604051808303816000875af1925050508015611f91575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f8e918101906129cd565b60015b612020573d808015611fbf576040519150601f19603f3d011682016040523d82523d6000602084013e611fc4565b606091505b508051600003612018576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016107eb565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150611cb19050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061209357508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146116ae57600080fd5b60006020828403121561211b57600080fd5b8135612126816120db565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110e357600080fd5b80356bffffffffffffffffffffffff811681146110e357600080fd5b6000806040838503121561218057600080fd5b6121898361212d565b915061219760208401612151565b90509250929050565b60005b838110156121bb5781810151838201526020016121a3565b50506000910152565b600081518084526121dc8160208601602086016121a0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061212660208301846121c4565b60006020828403121561223357600080fd5b5035919050565b6000806040838503121561224d57600080fd5b6122568361212d565b946020939093013593505050565b60008060006060848603121561227957600080fd5b6122828461212d565b92506122906020850161212d565b9150604084013590509250925092565b600080604083850312156122b357600080fd5b50508035926020909101359150565b600080602083850312156122d557600080fd5b823567ffffffffffffffff808211156122ed57600080fd5b818501915085601f83011261230157600080fd5b81358181111561231057600080fd5b8660208260051b850101111561232557600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156123ad576123ad612337565b604052919050565b600067ffffffffffffffff8211156123cf576123cf612337565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600061240e612409846123b5565b612366565b905082815283838301111561242257600080fd5b828260208301376000602084830101529392505050565b600082601f83011261244a57600080fd5b612126838335602085016123fb565b600080600080600060a0868803121561247157600080fd5b61247a8661212d565b94506124886020870161212d565b93506124966040870161212d565b92506124a460608701612151565b9150608086013567ffffffffffffffff8111156124c057600080fd5b6124cc88828901612439565b9150509295509295909350565b6000602082840312156124eb57600080fd5b6121268261212d565b60006020828403121561250657600080fd5b813567ffffffffffffffff81111561251d57600080fd5b611cb184828501612439565b6000806040838503121561253c57600080fd5b6125458361212d565b91506020830135801515811461255a57600080fd5b809150509250929050565b6000806000806080858703121561257b57600080fd5b6125848561212d565b93506125926020860161212d565b925060408501359150606085013567ffffffffffffffff8111156125b557600080fd5b8501601f810187136125c657600080fd5b6125d5878235602084016123fb565b91505092959194509250565b600080604083850312156125f457600080fd5b6125fd8361212d565b91506121976020840161212d565b60006020828403121561261d57600080fd5b815167ffffffffffffffff81111561263457600080fd5b8201601f8101841361264557600080fd5b8051612653612409826123b5565b81815285602083850101111561266857600080fd5b6126798260208301602086016121a0565b95945050505050565b808202811582820484141761078f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000826126f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c9082168061273e57607f821691505b602082108103612777577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600080845461278b8161272a565b600182811680156127a357600181146127d657612805565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612805565b8860005260208060002060005b858110156127fc5781548a8201529084019082016127e3565b50505082870194505b5050505083516128198183602088016121a0565b01949350505050565b601f821115610f41576000816000526020600020601f850160051c8101602086101561284b5750805b601f850160051c820191505b8181101561155b57828155600101612857565b815167ffffffffffffffff81111561288457612884612337565b61289881612892845461272a565b84612822565b602080601f8311600181146128eb57600084156128b55750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561155b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561293857888601518255948401946001909101908401612919565b508582101561297457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526129c360808301846121c4565b9695505050505050565b6000602082840312156129df57600080fd5b8151612126816120db56fea2646970667358221220bb65a2127937d4d78187b8361c6858a49d64f7f534dcf38e1e9c7d066c29022764736f6c63430008180033
Deployed Bytecode Sourcemap
36203:24337:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54327:403;;;;;;;;;;-1:-1:-1;54327:403:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;54327:403:0;;;;;;;;48179:162;;;;;;;;;;-1:-1:-1;48179:162:0;;;;;:::i;:::-;;:::i;52887:126::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49485:237::-;;;;;;;;;;-1:-1:-1;49485:237:0;;;;;:::i;:::-;;:::i;:::-;;;2462:42:1;2450:55;;;2432:74;;2420:2;2405:18;49485:237:0;2286:226:1;41672:467:0;;;;;;;;;;-1:-1:-1;41672:467:0;;;;;:::i;:::-;;:::i;37120:26::-;;;;;;;;;;;;;;;;;;;2922:25:1;;;2910:2;2895:18;37120:26:0;2776:177:1;45173:567:0;;;;;;;;;;-1:-1:-1;45173:567:0;;;;;:::i;:::-;;:::i;34697:447::-;;;;;;;;;;-1:-1:-1;34697:447:0;;;;;:::i;:::-;;:::i;:::-;;;;3748:42:1;3736:55;;;3718:74;;3823:2;3808:18;;3801:34;;;;3691:18;34697:447:0;3544:297:1;52006:631:0;;;;;;;;;;-1:-1:-1;52006:631:0;;;;;:::i;:::-;;:::i;46865:356::-;;;;;;;;;;;;;:::i;42826:151::-;;;;;;;;;;-1:-1:-1;42826:151:0;;;;;:::i;:::-;;:::i;46017:362::-;;;;;;;;;;-1:-1:-1;46017:362:0;;;;;:::i;:::-;;:::i;51132:495::-;;;;;;;;;;-1:-1:-1;51132:495:0;;;;;:::i;:::-;;:::i;33585:45::-;;;;;;;;;;;;33624:6;33585:45;;50546:231;;;;;;;;;;-1:-1:-1;50546:231:0;;;;;:::i;:::-;;:::i;40497:541::-;;;;;;;;;;-1:-1:-1;40497:541:0;;;;;:::i;:::-;;:::i;37867:326::-;;;;;;;;;;-1:-1:-1;37867:326:0;;;;;:::i;:::-;;:::i;48893:240::-;;;;;;;;;;-1:-1:-1;48893:240:0;;;;;:::i;:::-;;:::i;36979:29::-;;;;;;;;;;-1:-1:-1;36979:29:0;;;;;;;;32695:104;;;;;;;;;;-1:-1:-1;32750:21:0;32787:6;;;;;;32695:104;;53144:134;;;;;;;;;;;;;:::i;47499:101::-;;;;;;;;;;-1:-1:-1;47499:101:0;;;;;:::i;:::-;;:::i;44370:297::-;;;;;;;;;;-1:-1:-1;44370:297:0;;;;;:::i;:::-;;:::i;43748:280::-;;;;;;;;;;-1:-1:-1;43748:280:0;;;;;:::i;:::-;;:::i;53535:321::-;;;;;;;;;;-1:-1:-1;53535:321:0;;;;;:::i;:::-;;:::i;39730:409::-;;;;;;;;;;-1:-1:-1;39730:409:0;;;;;:::i;:::-;;:::i;50082:198::-;;;;;;;;;;-1:-1:-1;50082:198:0;;;;;:::i;:::-;50232:31;;;;50201:15;50232:31;;;:18;:31;;;;;;;;:42;;;;;;;;;;;;;;;50082:198;32183:200;;;;;;;;;;-1:-1:-1;32183:200:0;;;;;:::i;:::-;;:::i;54327:403::-;54405:4;54425:41;;;54441:25;54425:41;;:96;;-1:-1:-1;54470:51:0;;;54486:35;54470:51;54425:96;:156;;;-1:-1:-1;54532:49:0;;;54548:33;54532:49;54425:156;:201;;;-1:-1:-1;54585:41:0;;;54601:25;54585:41;54425:201;:253;;;-1:-1:-1;54637:41:0;;;54653:25;54637:41;54425:253;:299;;;-1:-1:-1;54682:42:0;;;54698:26;54682:42;54425:299;54418:306;54327:403;-1:-1:-1;;54327:403:0:o;48179:162::-;32750:21;32787:6;;;;;;;31711:10;31700:21;31696:80;;31739:29;;;;;31757:10;31739:29;;;2432:74:1;2405:18;;31739:29:0;;;;;;;;31696:80;48281:54:::1;48297:20;48319:15;48281;:54::i;:::-;48179:162:::0;;:::o;52887:126::-;52985:15;;:22;;;;;;;;52941:23;;52985:15;;;:20;;:22;;;;;:15;;:22;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52973:34;;52887:126;:::o;49485:237::-;49562:16;49591:17;;;:7;:17;;;;;;:31;:17;49587:96;;49640:35;;;;;;;;2922:25:1;;;2895:18;;49640:35:0;2776:177:1;49587:96:0;-1:-1:-1;49696:20:0;;;;:10;:20;;;;;;;;;49485:237::o;41672:467::-;41751:20;41774:17;41782:8;41774:7;:17::i;:::-;41751:40;;41809:12;41802:19;;:3;:19;;;41798:75;;41839:26;;;;;;;;;;;;;;41798:75;41879:17;41899:54;41918:12;41932:10;41944:8;41899:18;:54::i;:::-;41879:74;;41965:12;41960:92;;41995:49;;;;;42023:10;41995:49;;;3718:74:1;3808:18;;;3801:34;;;3691:18;;41995:49:0;3544:297:1;41960:92:0;42058:20;;;;:10;:20;;;;;;:26;;;;;;;;;;;;;;42096:37;;42058:20;;42096:37;;;;;;;41744:395;;41672:467;;:::o;45173:567::-;45276:17;;;45272:76;;45311:29;;;;;2462:42:1;2450:55;;45311:29:0;;;2432:74:1;2405:18;;45311:29:0;2286:226:1;45272:76:0;45354:20;45377:17;45385:8;45377:7;:17::i;:::-;45354:40;;45414:12;45405:21;;:5;:21;;;45401:80;;45444:29;;;;;;;;;;;;;;45401:80;45492:54;45511:12;45525:10;45537:8;45492:18;:54::i;:::-;45487:134;;45564:49;;;;;45592:10;45564:49;;;3718:74:1;3808:18;;;3801:34;;;3691:18;;45564:49:0;3544:297:1;45487:134:0;45648:16;;;;;;;;:9;:16;;;;;;45646:18;;;;;;45675:14;;;;;;45673:16;;45646:18;45673:16;;;45703:31;45658:5;45685:3;45725:8;45703:9;:31::i;:::-;45265:475;45173:567;;;:::o;34697:447::-;34857:40;;;;;;;;;34885:12;34857:40;;;;;;;;;;;;;;;-1:-1:-1;;;;34908:15:0;;;:35;;-1:-1:-1;34927:11:0;;;;:16;;;34908:35;:69;;;-1:-1:-1;34947:16:0;;:30;;;34908:69;34904:114;;;35004:1;35008;34988:22;;;;;;;34904:114;35024:23;33624:6;35064:10;35050:6;:11;;;:24;;;;;;:::i;:::-;:39;;;;:::i;:::-;35104:16;;;-1:-1:-1;35024:65:0;;-1:-1:-1;;34697:447:0;;;;;;:::o;52006:631::-;52110:7;52130:25;;;52126:84;;52173:29;;;;;;;;;;;;;;52126:84;52230:22;;;;;;;:9;:22;;;;;;52220:32;;52216:113;;52270:51;;;;;;;;2922:25:1;;;2895:18;;52270:51:0;2776:177:1;52216:113:0;52337:15;52359:12;52378:254;52396:6;52385:7;:17;52378:254;;52417:13;;;;:7;:13;;;;;;:28;;;;:13;;:28;52413:167;;52472:7;52462:6;:17;52458:59;;52501:4;-1:-1:-1;52494:11:0;;-1:-1:-1;52494:11:0;52458:59;52550:9;;;;;52413:167;52609:6;;52378:254;;;52119:518;;52006:631;;;;:::o;46865:356::-;32750:21;32787:6;;;;;;;31711:10;31700:21;31696:80;;31739:29;;;;;31757:10;31739:29;;;2432:74:1;2405:18;;31739:29:0;2286:226:1;31696:80:0;46929:21:::1;46909:17;46961:14:::0;;;46957:62:::1;;46993:18;;;;;;;;;;;;;;46957:62;47081:46;::::0;47062:14:::1;::::0;47089:10:::1;::::0;47113:9;;47062:14;47081:46;47062:14;47081:46;47113:9;47089:10;47081:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47061:66;;;47139:9;47134:82;;47166:42;::::0;::::1;::::0;;47186:10:::1;47166:42;::::0;::::1;3718:74:1::0;3808:18;;;3801:34;;;3691:18;;47166:42:0::1;3544:297:1::0;42826:151:0;42929:42;42946:5;42953:3;42958:8;42929:42;;;;;;;;;;;;:16;:42::i;:::-;42826:151;;;:::o;46017:362::-;46063:20;46086:17;46094:8;46086:7;:17::i;:::-;46063:40;;46115:54;46134:12;46148:10;46160:8;46115:18;:54::i;:::-;46110:134;;46187:49;;;;;46215:10;46187:49;;;3718:74:1;3808:18;;;3801:34;;;3691:18;;46187:49:0;3544:297:1;46110:134:0;46271:11;46269:13;;;;;;;;;46303:10;46271:11;46293:21;;;:9;:21;;;;;46291:23;;;;;;;;46328:45;;46338:12;;46364:8;46328:9;:45::i;51132:495::-;51208:7;51238:11;;51228:6;:21;51224:96;;51267:45;;;;;;;;2922:25:1;;;2895:18;;51267:45:0;2776:177:1;51224:96:0;51328:15;51350:12;51369:253;51387:6;51376:7;:17;51369:253;;51433:1;51408:13;;;:7;:13;;;;;;:27;:13;:27;51404:166;;51462:7;51452:6;:17;51448:59;;51491:4;51132:495;-1:-1:-1;;;51132:495:0:o;51448:59::-;51540:9;;;;;51404:166;51599:6;;51369:253;;;51217:410;;51132:495;;;:::o;50546:231::-;50619:18;50659:17;;;:7;:17;;;;;;;;;50683:89;;50729:35;;;;;;;;2922:25:1;;;2895:18;;50729:35:0;2776:177:1;50683:89:0;50546:231;;;:::o;40497:541::-;40576:11;:31;;;;;;;40626:10;40576:11;40616:21;;;:9;:21;;;;;:41;;;;;;;40671:362;40687:20;;;40671:362;;;40752:10;40727:7;:21;40735:9;;40745:1;40735:12;;;;;;;:::i;:::-;;;;;;;;;;40727:21;;-1:-1:-1;40727:21:0;;;;;;;;-1:-1:-1;40727:21:0;;;;:35;40723:122;;40810:10;40822:9;;40832:1;40822:12;;;;;;;:::i;:::-;40782:53;;;;;3748:42:1;3736:55;;;40782:53:0;;;3718:74:1;40822:12:0;;;;;;;3808:18:1;;;3801:34;-1:-1:-1;3691:18:1;;40782:53:0;3544:297:1;40723:122:0;40885:1;40853:7;:21;40861:9;;40871:1;40861:12;;;;;;;:::i;:::-;;;;;;;40853:21;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;40934:9;;40944:1;40934:12;;;;;;;:::i;:::-;;;;;;;40930:1;40901:46;;40910:10;40901:46;;;;;;;;;;;;40956:15;;;;:28;40993:4;41000:10;41012:9;;41022:1;41012:12;;;;;;;:::i;:::-;40956:69;;;;;;;;;;10361:42:1;10430:15;;;40956:69:0;;;10412:34:1;10482:15;;;;10462:18;;;10455:43;-1:-1:-1;41012:12:0;;;;;;10514:18:1;;;10507:34;10324:18;;40956:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40709:3;;;;;40671:362;;37867:326;27456:19;27479:13;;;;;;27478:14;;27526:34;;;;-1:-1:-1;27544:12:0;;27559:1;27544:12;;;;:16;27526:34;27525:97;;;-1:-1:-1;27594:4:0;16264:19;:23;;;27566:55;;-1:-1:-1;27604:12:0;;;;;:17;27566:55;27503:193;;;;;;;10754:2:1;27503:193:0;;;10736:21:1;10793:2;10773:18;;;10766:30;10832:34;10812:18;;;10805:62;10903:16;10883:18;;;10876:44;10937:19;;27503:193:0;10552:410:1;27503:193:0;27707:12;:16;;;;27722:1;27707:16;;;27734:67;;;;27769:13;:20;;;;;;;;27734:67;38047:15:::1;:32:::0;;;::::1;;::::0;::::1;;::::0;;38086:21:::1;38098:8:::0;38086:11:::1;:21::i;:::-;38114:20;38127:6;38114:12;:20::i;:::-;38141:46;38155:17;38174:12;38141:13;:46::i;:::-;27827:14:::0;27823:102;;;27874:5;27858:21;;;;;;27899:14;;-1:-1:-1;11119:36:1;;27899:14:0;;11107:2:1;11092:18;27899:14:0;;;;;;;27823:102;27445:487;37867:326;;;;;:::o;48893:240::-;48971:20;49004:25;;;49000:84;;49047:29;;;;;;;;;;;;;;49000:84;-1:-1:-1;49105:22:0;;;;;;:9;:22;;;;;;;48893:240::o;53144:134::-;53248:15;;:24;;;;;;;;53200:25;;53248:15;;;:22;;:24;;;;;:15;;:24;;;;;;;:15;:24;;;;;;;;;;;;;;47499:101;32750:21;32787:6;;;;;;;31711:10;31700:21;31696:80;;31739:29;;;;;31757:10;31739:29;;;2432:74:1;2405:18;;31739:29:0;2286:226:1;31696:80:0;47570:24:::1;47582:11;47570;:24::i;:::-;47499:101:::0;:::o;44370:297::-;44480:10;44467:23;;;;44463:79;;44508:26;;;;;;;;;;;;;;44463:79;44567:10;44548:30;;;;:18;:30;;;;;;;;;:41;;;;;;;;;;;;:53;;;;;;;;;;;;;44613:48;;586:41:1;;;44548::0;;44567:10;44613:48;;559:18:1;44613:48:0;;;;;;;44370:297;;:::o;43748:280::-;43871:34;43884:5;43891:3;43896:8;43871:12;:34::i;:::-;43917:51;43940:5;43947:3;43952:8;43962:5;43917:22;:51::i;:::-;43912:111;;43986:29;;;;;2462:42:1;2450:55;;43986:29:0;;;2432:74:1;2405:18;;43986:29:0;2286:226:1;53535:321:0;53668:1;53639:17;;;:7;:17;;;;;;53609;;53639:31;:17;53635:96;;53688:35;;;;;;;;2922:25:1;;;2895:18;;53688:35:0;2776:177:1;53635:96:0;53769:1;53750:8;53744:22;;;;;:::i;:::-;;;:26;:106;;53831:19;53841:8;53831:9;:19::i;:::-;53744:106;;;53797:8;53807:19;53817:8;53807:9;:19::i;:::-;53780:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53737:113;53535:321;-1:-1:-1;;53535:321:0:o;39730:409::-;39807:11;:31;;;;;;39857:10;39807:11;39847:21;;;:9;:21;;;;;:41;;;;;;39902:232;39918:20;;;39902:232;;;39978:10;39954:7;:21;39962:9;;39972:1;39962:12;;;;;;;:::i;:::-;;;;;;;39954:21;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;40035:9;;40045:1;40035:12;;;;;;;:::i;:::-;;;;;;;40023:10;40002:46;;40019:1;40002:46;;;;;;;;;;;;40057:15;;;;:28;40086:10;40106:4;40113:9;;40123:1;40113:12;;;;;;;:::i;:::-;40057:69;;;;;;;;;;10361:42:1;10430:15;;;40057:69:0;;;10412:34:1;10482:15;;;;10462:18;;;10455:43;-1:-1:-1;40113:12:0;;;;;;10514:18:1;;;10507:34;10324:18;;40057:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39940:3;;;;;39902:232;;32183:200;32750:21;32787:6;;;;;;;31711:10;31700:21;31696:80;;31739:29;;;;;31757:10;31739:29;;;2432:74:1;2405:18;;31739:29:0;2286:226:1;31696:80:0;32270:18:::1;32291:6:::0;;::::1;32304:18:::0;;::::1;32291:6:::0;32304:18;;::::1;::::0;;::::1;;::::0;;32334:43:::1;::::0;32291:6;::::1;::::0;;;::::1;::::0;32304:18;;32291:6;;32334:43:::1;::::0;::::1;32263:120;32183:200:::0;:::o;35815:268::-;33624:6;35922:15;:30;;;35918:88;;;35970:28;;;;;;;;;;;;;;35918:88;36027:50;;;;;;;;;;;;;;;;;;;;;;;;;;;36012:65;;;;;:12;:65;35815:268::o;57496:282::-;57633:15;57677:11;57664:24;;:9;:24;;;:62;;;;57705:21;57717:8;57705:11;:21::i;:::-;57692:34;;:9;:34;;;57664:62;:108;;;-1:-1:-1;57730:31:0;;;;;;;;:18;:31;;;;;;;;:42;;;;;;;;;;;;57664:108;57657:115;57496:282;-1:-1:-1;;;;57496:282:0:o;58058:235::-;58192:1;58161:20;;;:10;:20;;;;;;;;:33;;;;;;;;;58201:7;:17;;;;;;:30;;58161:33;58201:30;;;;;;;;;;;;58243:44;;58172:8;;58201:30;;58243:44;;;;;;58058:235;;;:::o;58589:100::-;58661:8;:22;58672:11;58661:8;:22;:::i;31369:92::-;29588:13;;;;;;;29580:69;;;;;;;15268:2:1;29580:69:0;;;15250:21:1;15307:2;15287:18;;;15280:30;15346:34;15326:18;;;15319:62;15417:13;15397:18;;;15390:41;15448:19;;29580:69:0;15066:407:1;29580:69:0;31440:6:::1;:15:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;31369:92::o;34018:158::-;29588:13;;;;;;;29580:69;;;;;;;15268:2:1;29580:69:0;;;15250:21:1;15307:2;15287:18;;;15280:30;15346:34;15326:18;;;15319:62;15417:13;15397:18;;;15390:41;15448:19;;29580:69:0;15066:407:1;55504:1465:0;55653:20;56361:16;;56482:10;;56478:486;;56507:73;;;;;:37;;;;;;:73;;56545:10;;56557:5;;56564:8;;56574:5;;56507:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56507:73:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56503:420;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56728:6;:13;56745:1;56728:18;56724:190;;56768:29;;;;;2462:42:1;2450:55;;56768:29:0;;;2432:74:1;2405:18;;56768:29:0;2286:226:1;56724:190:0;56882:6;56876:13;56867:6;56863:2;56859:15;56852:38;56503:420;56623:51;;56633:41;56623:51;;-1:-1:-1;56616:58:0;;-1:-1:-1;56616:58:0;56478:486;-1:-1:-1;56952:4:0;;55504:1465;-1:-1:-1;;;;;55504:1465:0:o;58898:1568::-;58964:17;59364:4;59357;59351:11;59347:22;59444:1;59438:4;59431:15;59507:4;59504:1;59500:12;59493:19;;;59577:1;59572:3;59565:14;59669:3;59884:6;59866:392;59958:1;59953:3;59949:11;59942:18;;60105:2;60099:4;60095:13;60091:2;60087:22;60082:3;60074:36;60183:2;60173:13;;60224:25;59866:392;60224:25;-1:-1:-1;60282:13:0;;;60385:14;;;;60435:19;;;60385:14;58898:1568;-1:-1:-1;58898:1568:0:o;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:196::-;706:20;;766:42;755:54;;745:65;;735:93;;824:1;821;814:12;839:179;906:20;;966:26;955:38;;945:49;;935:77;;1008:1;1005;998:12;1023:258;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1190:29;1209:9;1190:29;:::i;:::-;1180:39;;1238:37;1271:2;1260:9;1256:18;1238:37;:::i;:::-;1228:47;;1023:258;;;;;:::o;1286:250::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;-1:-1:-1;;1528:1:1;1510:16;;1503:27;1286:250::o;1541:330::-;1583:3;1621:5;1615:12;1648:6;1643:3;1636:19;1664:76;1733:6;1726:4;1721:3;1717:14;1710:4;1703:5;1699:16;1664:76;:::i;:::-;1785:2;1773:15;1790:66;1769:88;1760:98;;;;1860:4;1756:109;;1541:330;-1:-1:-1;;1541:330:1:o;1876:220::-;2025:2;2014:9;2007:21;1988:4;2045:45;2086:2;2075:9;2071:18;2063:6;2045:45;:::i;2101:180::-;2160:6;2213:2;2201:9;2192:7;2188:23;2184:32;2181:52;;;2229:1;2226;2219:12;2181:52;-1:-1:-1;2252:23:1;;2101:180;-1:-1:-1;2101:180:1:o;2517:254::-;2585:6;2593;2646:2;2634:9;2625:7;2621:23;2617:32;2614:52;;;2662:1;2659;2652:12;2614:52;2685:29;2704:9;2685:29;:::i;:::-;2675:39;2761:2;2746:18;;;;2733:32;;-1:-1:-1;;;2517:254:1:o;2958:328::-;3035:6;3043;3051;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;3143:29;3162:9;3143:29;:::i;:::-;3133:39;;3191:38;3225:2;3214:9;3210:18;3191:38;:::i;:::-;3181:48;;3276:2;3265:9;3261:18;3248:32;3238:42;;2958:328;;;;;:::o;3291:248::-;3359:6;3367;3420:2;3408:9;3399:7;3395:23;3391:32;3388:52;;;3436:1;3433;3426:12;3388:52;-1:-1:-1;;3459:23:1;;;3529:2;3514:18;;;3501:32;;-1:-1:-1;3291:248:1:o;3846:615::-;3932:6;3940;3993:2;3981:9;3972:7;3968:23;3964:32;3961:52;;;4009:1;4006;3999:12;3961:52;4049:9;4036:23;4078:18;4119:2;4111:6;4108:14;4105:34;;;4135:1;4132;4125:12;4105:34;4173:6;4162:9;4158:22;4148:32;;4218:7;4211:4;4207:2;4203:13;4199:27;4189:55;;4240:1;4237;4230:12;4189:55;4280:2;4267:16;4306:2;4298:6;4295:14;4292:34;;;4322:1;4319;4312:12;4292:34;4375:7;4370:2;4360:6;4357:1;4353:14;4349:2;4345:23;4341:32;4338:45;4335:65;;;4396:1;4393;4386:12;4335:65;4427:2;4419:11;;;;;4449:6;;-1:-1:-1;3846:615:1;;-1:-1:-1;;;;3846:615:1:o;4466:184::-;4518:77;4515:1;4508:88;4615:4;4612:1;4605:15;4639:4;4636:1;4629:15;4655:334;4726:2;4720:9;4782:2;4772:13;;4787:66;4768:86;4756:99;;4885:18;4870:34;;4906:22;;;4867:62;4864:88;;;4932:18;;:::i;:::-;4968:2;4961:22;4655:334;;-1:-1:-1;4655:334:1:o;4994:246::-;5043:4;5076:18;5068:6;5065:30;5062:56;;;5098:18;;:::i;:::-;-1:-1:-1;5155:2:1;5143:15;5160:66;5139:88;5229:4;5135:99;;4994:246::o;5245:338::-;5310:5;5339:53;5355:36;5384:6;5355:36;:::i;:::-;5339:53;:::i;:::-;5330:62;;5415:6;5408:5;5401:21;5455:3;5446:6;5441:3;5437:16;5434:25;5431:45;;;5472:1;5469;5462:12;5431:45;5521:6;5516:3;5509:4;5502:5;5498:16;5485:43;5575:1;5568:4;5559:6;5552:5;5548:18;5544:29;5537:40;5245:338;;;;;:::o;5588:222::-;5631:5;5684:3;5677:4;5669:6;5665:17;5661:27;5651:55;;5702:1;5699;5692:12;5651:55;5724:80;5800:3;5791:6;5778:20;5771:4;5763:6;5759:17;5724:80;:::i;5815:618::-;5919:6;5927;5935;5943;5951;6004:3;5992:9;5983:7;5979:23;5975:33;5972:53;;;6021:1;6018;6011:12;5972:53;6044:29;6063:9;6044:29;:::i;:::-;6034:39;;6092:38;6126:2;6115:9;6111:18;6092:38;:::i;:::-;6082:48;;6149:38;6183:2;6172:9;6168:18;6149:38;:::i;:::-;6139:48;;6206:37;6239:2;6228:9;6224:18;6206:37;:::i;:::-;6196:47;;6294:3;6283:9;6279:19;6266:33;6322:18;6314:6;6311:30;6308:50;;;6354:1;6351;6344:12;6308:50;6377;6419:7;6410:6;6399:9;6395:22;6377:50;:::i;:::-;6367:60;;;5815:618;;;;;;;;:::o;6438:186::-;6497:6;6550:2;6538:9;6529:7;6525:23;6521:32;6518:52;;;6566:1;6563;6556:12;6518:52;6589:29;6608:9;6589:29;:::i;6874:322::-;6943:6;6996:2;6984:9;6975:7;6971:23;6967:32;6964:52;;;7012:1;7009;7002:12;6964:52;7052:9;7039:23;7085:18;7077:6;7074:30;7071:50;;;7117:1;7114;7107:12;7071:50;7140;7182:7;7173:6;7162:9;7158:22;7140:50;:::i;7201:347::-;7266:6;7274;7327:2;7315:9;7306:7;7302:23;7298:32;7295:52;;;7343:1;7340;7333:12;7295:52;7366:29;7385:9;7366:29;:::i;:::-;7356:39;;7445:2;7434:9;7430:18;7417:32;7492:5;7485:13;7478:21;7471:5;7468:32;7458:60;;7514:1;7511;7504:12;7458:60;7537:5;7527:15;;;7201:347;;;;;:::o;7553:667::-;7648:6;7656;7664;7672;7725:3;7713:9;7704:7;7700:23;7696:33;7693:53;;;7742:1;7739;7732:12;7693:53;7765:29;7784:9;7765:29;:::i;:::-;7755:39;;7813:38;7847:2;7836:9;7832:18;7813:38;:::i;:::-;7803:48;;7898:2;7887:9;7883:18;7870:32;7860:42;;7953:2;7942:9;7938:18;7925:32;7980:18;7972:6;7969:30;7966:50;;;8012:1;8009;8002:12;7966:50;8035:22;;8088:4;8080:13;;8076:27;-1:-1:-1;8066:55:1;;8117:1;8114;8107:12;8066:55;8140:74;8206:7;8201:2;8188:16;8183:2;8179;8175:11;8140:74;:::i;:::-;8130:84;;;7553:667;;;;;;;:::o;8225:260::-;8293:6;8301;8354:2;8342:9;8333:7;8329:23;8325:32;8322:52;;;8370:1;8367;8360:12;8322:52;8393:29;8412:9;8393:29;:::i;:::-;8383:39;;8441:38;8475:2;8464:9;8460:18;8441:38;:::i;8490:649::-;8570:6;8623:2;8611:9;8602:7;8598:23;8594:32;8591:52;;;8639:1;8636;8629:12;8591:52;8672:9;8666:16;8705:18;8697:6;8694:30;8691:50;;;8737:1;8734;8727:12;8691:50;8760:22;;8813:4;8805:13;;8801:27;-1:-1:-1;8791:55:1;;8842:1;8839;8832:12;8791:55;8871:2;8865:9;8896:49;8912:32;8941:2;8912:32;:::i;8896:49::-;8968:2;8961:5;8954:17;9008:7;9003:2;8998;8994;8990:11;8986:20;8983:33;8980:53;;;9029:1;9026;9019:12;8980:53;9042:67;9106:2;9101;9094:5;9090:14;9085:2;9081;9077:11;9042:67;:::i;:::-;9128:5;8490:649;-1:-1:-1;;;;;8490:649:1:o;9144:322::-;9217:9;;;9248;;9265:15;;;9259:22;;9245:37;9235:225;;9316:77;9313:1;9306:88;9417:4;9414:1;9407:15;9445:4;9442:1;9435:15;9471:274;9511:1;9537;9527:189;;9572:77;9569:1;9562:88;9673:4;9670:1;9663:15;9701:4;9698:1;9691:15;9527:189;-1:-1:-1;9730:9:1;;9471:274::o;9960:184::-;10012:77;10009:1;10002:88;10109:4;10106:1;10099:15;10133:4;10130:1;10123:15;11166:437;11245:1;11241:12;;;;11288;;;11309:61;;11363:4;11355:6;11351:17;11341:27;;11309:61;11416:2;11408:6;11405:14;11385:18;11382:38;11379:218;;11453:77;11450:1;11443:88;11554:4;11551:1;11544:15;11582:4;11579:1;11572:15;11379:218;;11166:437;;;:::o;11734:1079::-;11910:3;11939:1;11972:6;11966:13;12002:36;12028:9;12002:36;:::i;:::-;12057:1;12074:17;;;12100:191;;;;12305:1;12300:358;;;;12067:591;;12100:191;12148:66;12137:9;12133:82;12128:3;12121:95;12271:6;12264:14;12257:22;12249:6;12245:35;12240:3;12236:45;12229:52;;12100:191;;12300:358;12331:6;12328:1;12321:17;12361:4;12406;12403:1;12393:18;12433:1;12447:165;12461:6;12458:1;12455:13;12447:165;;;12539:14;;12526:11;;;12519:35;12582:16;;;;12476:10;;12447:165;;;12451:3;;;12641:6;12636:3;12632:16;12625:23;;12067:591;;;;;12689:6;12683:13;12705:68;12764:8;12759:3;12752:4;12744:6;12740:17;12705:68;:::i;:::-;12789:18;;11734:1079;-1:-1:-1;;;;11734:1079:1:o;12818:543::-;12920:2;12915:3;12912:11;12909:446;;;12956:1;12980:5;12977:1;12970:16;13024:4;13021:1;13011:18;13094:2;13082:10;13078:19;13075:1;13071:27;13065:4;13061:38;13130:4;13118:10;13115:20;13112:47;;;-1:-1:-1;13153:4:1;13112:47;13208:2;13203:3;13199:12;13196:1;13192:20;13186:4;13182:31;13172:41;;13263:82;13281:2;13274:5;13271:13;13263:82;;;13326:17;;;13307:1;13296:13;13263:82;;13597:1464;13723:3;13717:10;13750:18;13742:6;13739:30;13736:56;;;13772:18;;:::i;:::-;13801:97;13891:6;13851:38;13883:4;13877:11;13851:38;:::i;:::-;13845:4;13801:97;:::i;:::-;13953:4;;14010:2;13999:14;;14027:1;14022:782;;;;14848:1;14865:6;14862:89;;;-1:-1:-1;14917:19:1;;;14911:26;14862:89;13503:66;13494:1;13490:11;;;13486:84;13482:89;13472:100;13578:1;13574:11;;;13469:117;14964:81;;13992:1063;;14022:782;11681:1;11674:14;;;11718:4;11705:18;;14070:66;14058:79;;;14235:236;14249:7;14246:1;14243:14;14235:236;;;14338:19;;;14332:26;14317:42;;14430:27;;;;14398:1;14386:14;;;;14265:19;;14235:236;;;14239:3;14499:6;14490:7;14487:19;14484:261;;;14560:19;;;14554:26;14661:66;14643:1;14639:14;;;14655:3;14635:24;14631:97;14627:102;14612:118;14597:134;;14484:261;-1:-1:-1;;;;;14791:1:1;14775:14;;;14771:22;14758:36;;-1:-1:-1;13597:1464:1:o;15478:512::-;15672:4;15701:42;15782:2;15774:6;15770:15;15759:9;15752:34;15834:2;15826:6;15822:15;15817:2;15806:9;15802:18;15795:43;;15874:6;15869:2;15858:9;15854:18;15847:34;15917:3;15912:2;15901:9;15897:18;15890:31;15938:46;15979:3;15968:9;15964:19;15956:6;15938:46;:::i;:::-;15930:54;15478:512;-1:-1:-1;;;;;;15478:512:1:o;15995:249::-;16064:6;16117:2;16105:9;16096:7;16092:23;16088:32;16085:52;;;16133:1;16130;16123:12;16085:52;16165:9;16159:16;16184:30;16208:5;16184:30;:::i
Swarm Source
ipfs://bb65a2127937d4d78187b8361c6858a49d64f7f534dcf38e1e9c7d066c290227
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.