Overview
APE Balance
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 | |||
---|---|---|---|---|---|---|
7844636 | 74 days ago | Contract Creation | 0 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Migrated721
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2025-01-09 */ // SPDX-License-Identifier: MIT pragma solidity <0.9.0 >=0.8.4 ^0.8.0 ^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/utils/structs/BitMaps.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol) /** * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential. * Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor]. */ library BitMaps { struct BitMap { mapping(uint256 => uint256) _data; } /** * @dev Returns whether the bit at `index` is set. */ function get(BitMap storage bitmap, uint256 index) internal view returns (bool) { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); return bitmap._data[bucket] & mask != 0; } /** * @dev Sets the bit at `index` to the boolean `value`. */ function setTo(BitMap storage bitmap, uint256 index, bool value) internal { if (value) { set(bitmap, index); } else { unset(bitmap, index); } } /** * @dev Sets the bit at `index`. */ function set(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] |= mask; } /** * @dev Unsets the bit at `index`. */ function unset(BitMap storage bitmap, uint256 index) internal { uint256 bucket = index >> 8; uint256 mask = 1 << (index & 0xff); bitmap._data[bucket] &= ~mask; } } // 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/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/Migrated721.sol /** * Author: Lambdalf the White */ contract Migrated721 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 ***** // ************************************** IERC721 public underlyingAsset; // List of burned tokens BitMaps.BitMap private _burned; // *********** // * IERC721 * // *********** /// @dev Identifier of the next token to be minted uint256 private _nextId; /// @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; // *********** // ******************* // * IERC721Metadata * // ******************* /// @dev The token's base URI. string private _baseUri; /// @dev The name of the tokens, for token trackers. string private _name; /// @dev The symbol of the tokens, for token trackers. string private _symbol; // ******************* // ************************************** constructor() { initialize(address(0), address(0), address(0), 0, 0, "", "", ""); } function initialize( address admin_, address asset_, address royaltyRecipient_, uint96 royaltyRate_, uint256 supply_, string memory name_, string memory symbol_, string memory baseUri_ ) public initializer { underlyingAsset = IERC721(asset_); _nextId = supply_ + 1; _name = name_; _symbol = symbol_; _setBaseUri(baseUri_); _init_ERC173(admin_); _init_ERC2981(royaltyRecipient_, royaltyRate_); } function indexTokens(uint256 fromTokenId_, uint256 toTokenId_) public { for (uint256 i = fromTokenId_; i < toTokenId_; ++i) { emit Transfer(address(0), ownerOf(i), i); } } // ************************************** // ***** 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 (!_exists(tokenId_)) { revert IERC721_NONEXISTANT_TOKEN(tokenId_); } _; } // *********** // ************************************** // ************************************** // ***** PUBLIC ***** // ************************************** // *********** // * 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_); } _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_); } BitMaps.set(_burned, tokenId_); _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(); } uint256 _index_; address _currentTokenOwner_; uint256 _supplyMinted_ = _nextId - 1; while (_index_ < _supplyMinted_) { if (_exists(_index_)) { _currentTokenOwner_ = _ownerOf(_index_); if (_currentTokenOwner_ == address(0)) { _currentTokenOwner_ = underlyingAsset.ownerOf(_index_); } if (_currentTokenOwner_ == tokenOwner_) { unchecked { ++ownerBalance; } } } unchecked { ++_index_; } } } /// @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 exists(tokenId_) returns (address approved) { 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 exists(tokenId_) returns (address tokenOwner) { tokenOwner = _ownerOf(tokenId_); if (tokenOwner == address(0)) { tokenOwner = underlyingAsset.ownerOf(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_ >= _nextId) { revert IERC721Enumerable_INDEX_OUT_OF_BOUNDS(index_); } return index_; } /// @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(); } address _currentTokenOwner_; uint256 _index_; uint256 _ownerBalance_; uint256 _supplyMinted_ = _nextId - 1; while (_index_ < _supplyMinted_) { if (_exists(_index_)) { _currentTokenOwner_ = _ownerOf(_index_); if (_currentTokenOwner_ == address(0)) { _currentTokenOwner_ = underlyingAsset.ownerOf(_index_); } if (_currentTokenOwner_ == tokenOwner_) { if (index_ == _ownerBalance_) { return _index_; } unchecked { ++_ownerBalance_; } } } unchecked { ++_index_; } } revert IERC721Enumerable_OWNER_INDEX_OUT_OF_BOUNDS(index_); } /// @notice Count NFTs tracked by this contract /// /// @return supply the number of NFTs in existence function totalSupply() public view virtual override returns (uint256 supply) { uint256 _supplyMinted_ = _nextId - 1; uint256 _index_ = _supplyMinted_; supply = _supplyMinted_; while (_index_ > 0) { if (!_exists(_index_)) { unchecked { --supply; } } unchecked { --_index_; } } } // ********************* // ******************* // * 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) { return _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) { return _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 exists(tokenId_) returns (string memory uri) { 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 a token exists. /// A token exists if it has been minted and is not owned by the zero address. /// /// @param tokenId_ identifier of the NFT being referenced /// /// @return tokenExist whether the token exists function _exists(uint256 tokenId_) internal view virtual returns (bool tokenExist) { return !BitMaps.get(_burned, tokenId_) && tokenId_ < _nextId; } /// @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 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_) internal view virtual returns (address tokenOwner) { tokenOwner = _owners[tokenId_]; } /// @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
Contract ABI
API[{"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":"uint256","name":"fromTokenId_","type":"uint256"},{"internalType":"uint256","name":"toTokenId_","type":"uint256"}],"name":"indexTokens","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"supply_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"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":"supply","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 IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200005a60008060008060006040518060200160405280600081525060405180602001604052806000815250604051806020016040528060008152506200006060201b60201c565b620004e2565b600054610100900460ff1615808015620000815750600054600160ff909116105b806200009d5750303b1580156200009d575060005460ff166001145b620001065760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200012a576000805461ff0019166101001790555b600280546001600160a01b0319166001600160a01b038a161790556200015285600162000347565b600455600962000163858262000416565b50600a62000172848262000416565b506200017e82620001e7565b6200018989620001f9565b6200019587876200027f565b8015620001dc576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6008620001f5828262000416565b5050565b600054610100900460ff16620002555760405162461bcd60e51b815260206004820152602b602482015260008051602062002c1c83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fd565b600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600054610100900460ff16620002db5760405162461bcd60e51b815260206004820152602b602482015260008051602062002c1c83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000fd565b620001f58282612710816001600160601b031611156200030e57604051635b75946560e11b815260040160405180910390fd5b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600155565b808201808211156200036957634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200039a57607f821691505b602082108103620003bb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000411576000816000526020600020601f850160051c81016020861015620003ec5750805b601f850160051c820191505b818110156200040d57828155600101620003f8565b5050505b505050565b81516001600160401b038111156200043257620004326200036f565b6200044a8162000443845462000385565b84620003c1565b602080601f831160018114620004825760008415620004695750858301515b600019600386901b1c1916600185901b1785556200040d565b600085815260208120601f198616915b82811015620004b35788860151825594840194600190910190840162000492565b5085821015620004d25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61272a80620004f26000396000f3fe6080604052600436106101985760003560e01c80634f6ccce7116100e0578063a0bcfc7f11610084578063c1ce4dbf11610061578063c1ce4dbf146104ea578063c87b56dd1461050a578063e985e9c51461052a578063f2fde38b1461058057005b8063a0bcfc7f1461048a578063a22cb465146104aa578063b88d4fde146104ca57005b806370a08231116100bd57806370a08231146103f75780637158da7c146104175780638da5cb5b1461044457806395d89b411461047557005b80634f6ccce7146103a15780635f97036f146103c15780636352211e146103d757005b806318160ddd116101475780632f745c59116101245780632f745c591461032c5780633ccfd60b1461034c57806342842e0e1461036157806342966c681461038157005b806318160ddd1461029d57806323b872dd146102c05780632a55205a146102e057005b806306fdde031161017557806306fdde0314610216578063081812fc14610238578063095ea7b31461027d57005b806301ffc9a7146101a157806302fa7c47146101d6578063067f01e5146101f657005b3661019f57005b005b3480156101ad57600080fd5b506101c16101bc366004611eaf565b6105a0565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b5061019f6101f1366004611f1a565b610769565b34801561020257600080fd5b5061019f610211366004612032565b6107d6565b34801561022257600080fd5b5061022b6109ec565b6040516101cd9190612175565b34801561024457600080fd5b50610258610253366004612188565b610a7e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561028957600080fd5b5061019f6102983660046121a1565b610af1565b3480156102a957600080fd5b506102b2610c34565b6040519081526020016101cd565b3480156102cc57600080fd5b5061019f6102db3660046121cd565b610cb2565b3480156102ec57600080fd5b506103006102fb36600461220e565b610de4565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101cd565b34801561033857600080fd5b506102b26103473660046121a1565b610ec6565b34801561035857600080fd5b5061019f611092565b34801561036d57600080fd5b5061019f61037c3660046121cd565b6111b3565b34801561038d57600080fd5b5061019f61039c366004612188565b6111d3565b3480156103ad57600080fd5b506102b26103bc366004612188565b611255565b3480156103cd57600080fd5b506102b261271081565b3480156103e357600080fd5b506102586103f2366004612188565b611299565b34801561040357600080fd5b506102b2610412366004612230565b6113a4565b34801561042357600080fd5b506002546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561045057600080fd5b5060005462010000900473ffffffffffffffffffffffffffffffffffffffff16610258565b34801561048157600080fd5b5061022b61152f565b34801561049657600080fd5b5061019f6104a536600461224d565b61153e565b3480156104b657600080fd5b5061019f6104c5366004612282565b6115a4565b3480156104d657600080fd5b5061019f6104e53660046122c0565b61168a565b3480156104f657600080fd5b5061019f61050536600461220e565b6116ef565b34801561051657600080fd5b5061022b610525366004612188565b611765565b34801561053657600080fd5b506101c1610545366004612340565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058c57600080fd5b5061019f61059b366004612230565b611801565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061063357507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061067f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106cb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061071757507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061076357507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146107c8576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6107d282826118d9565b5050565b600054610100900460ff16158080156107f65750600054600160ff909116105b806108105750303b158015610810575060005460ff166001145b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bf565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108fa57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905561094585600161239d565b6004556009610954858261244d565b50600a610961848261244d565b5061096b8261197f565b6109748961198b565b61097e8787611a6f565b80156109e157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6060600980546109fb906123b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a27906123b0565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050905090565b600081610a8a81611b06565b610ac3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b60008381526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1691505b50919050565b6000610afc82611299565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b63576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b70823385611b32565b905080610bb2576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018490526044016107bf565b60008381526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000806001600454610c469190612567565b9150819050805b8015610cad57610c5c81611b06565b610c86577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610c4d565b505090565b73ffffffffffffffffffffffffffffffffffffffff8216610d17576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107bf565b6000610d2282611299565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610d89576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d94813384611b32565b610dd3576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b610dde848484611be6565b50505050565b6040805180820190915260015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201526000908190831580610e57575060208101516bffffffffffffffffffffffff16155b80610e775750805173ffffffffffffffffffffffffffffffffffffffff16155b15610e89576000809250925050610ebf565b60006127108583602001516bffffffffffffffffffffffff16610eac919061257a565b610eb69190612591565b91519350909150505b9250929050565b600073ffffffffffffffffffffffffffffffffffffffff8316610f15576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806001600454610f2a9190612567565b90505b8083101561105d57610f3e83611b06565b156110525760008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff16935083611005576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100291906125cc565b93505b8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110525781860361104b5782945050505050610763565b8160010191505b826001019250610f2d565b6040517fd999841b000000000000000000000000000000000000000000000000000000008152600481018790526024016107bf565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146110ec576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b476000819003611128576040517f6cc4466b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090339083908381818185875af1925050503d806000811461116a576040519150601f19603f3d011682016040523d82523d6000602084013e61116f565b606091505b50509050806107d2576040517f84020a7b000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b6111ce8383836040518060200160405280600081525061168a565b505050565b60006111de82611299565b90506111eb813384611b32565b61122a576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b600882901c60009081526003602052604090208054600160ff85161b1790556107d281600084611be6565b60006004548210611295576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016107bf565b5090565b6000816112a581611b06565b6112de576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b60008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff16915081610aeb576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015611379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906125cc565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82166113f3576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600060016004546114079190612567565b90505b808310156115275761141b83611b06565b1561151c5760008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff169150816114e2576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df91906125cc565b91505b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151c578360010193505b82600101925061140a565b505050919050565b6060600a80546109fb906123b0565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314611598576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b6115a18161197f565b50565b3373ffffffffffffffffffffffffffffffffffffffff8316036115f3576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611695848484610cb2565b6116a184848484611c7c565b610dde576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107bf565b815b818110156111ce578061170382611299565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016116f1565b60608161177181611b06565b6117aa576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b6000600880546117b9906123b0565b9050116117ce576117c983611e1f565b61139d565b60086117d984611e1f565b6040516020016117ea9291906125e9565b604051602081830303815290604052915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff6201000090910416331461185b576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b6000805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b612710816bffffffffffffffffffffffff161115611923576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60086107d2828261244d565b600054610100900460ff16611a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bf565b6000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b600054610100900460ff166107c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bf565b600881901c600090815260036020526040812054600160ff84161b161580156107635750506004541190565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611b7282610a7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611bde575073ffffffffffffffffffffffffffffffffffffffff80851660009081526006602090815260408083209387168352929052205460ff165b949350505050565b600081815260056020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556007909252808320805473ffffffffffffffffffffffffffffffffffffffff8781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000833b8015611e13576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290611cde9033908a908990899060040161268e565b6020604051808303816000875af1925050508015611d37575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d34918101906126d7565b60015b611dc6573d808015611d65576040519150601f19603f3d011682016040523d82523d6000602084013e611d6a565b606091505b508051600003611dbe576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016107bf565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150611bde9050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611e3957508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115a157600080fd5b600060208284031215611ec157600080fd5b813561139d81611e81565b73ffffffffffffffffffffffffffffffffffffffff811681146115a157600080fd5b8035611ef981611ecc565b919050565b80356bffffffffffffffffffffffff81168114611ef957600080fd5b60008060408385031215611f2d57600080fd5b8235611f3881611ecc565b9150611f4660208401611efe565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611f9957611f99611f4f565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611fdf57611fdf611f4f565b81604052809350858152868686011115611ff857600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261202357600080fd5b61139d83833560208501611f7e565b600080600080600080600080610100898b03121561204f57600080fd5b61205889611eee565b975061206660208a01611eee565b965061207460408a01611eee565b955061208260608a01611efe565b94506080890135935060a089013567ffffffffffffffff808211156120a657600080fd5b6120b28c838d01612012565b945060c08b01359150808211156120c857600080fd5b6120d48c838d01612012565b935060e08b01359150808211156120ea57600080fd5b506120f78b828c01612012565b9150509295985092959890939650565b60005b8381101561212257818101518382015260200161210a565b50506000910152565b60008151808452612143816020860160208601612107565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061139d602083018461212b565b60006020828403121561219a57600080fd5b5035919050565b600080604083850312156121b457600080fd5b82356121bf81611ecc565b946020939093013593505050565b6000806000606084860312156121e257600080fd5b83356121ed81611ecc565b925060208401356121fd81611ecc565b929592945050506040919091013590565b6000806040838503121561222157600080fd5b50508035926020909101359150565b60006020828403121561224257600080fd5b813561139d81611ecc565b60006020828403121561225f57600080fd5b813567ffffffffffffffff81111561227657600080fd5b611bde84828501612012565b6000806040838503121561229557600080fd5b82356122a081611ecc565b9150602083013580151581146122b557600080fd5b809150509250929050565b600080600080608085870312156122d657600080fd5b84356122e181611ecc565b935060208501356122f181611ecc565b925060408501359150606085013567ffffffffffffffff81111561231457600080fd5b8501601f8101871361232557600080fd5b61233487823560208401611f7e565b91505092959194509250565b6000806040838503121561235357600080fd5b823561235e81611ecc565b915060208301356122b581611ecc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156107635761076361236e565b600181811c908216806123c457607f821691505b602082108103610aeb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f8211156111ce576000816000526020600020601f850160051c810160208610156124265750805b601f850160051c820191505b8181101561244557828155600101612432565b505050505050565b815167ffffffffffffffff81111561246757612467611f4f565b61247b8161247584546123b0565b846123fd565b602080601f8311600181146124ce57600084156124985750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612445565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561251b578886015182559484019460019091019084016124fc565b508582101561255757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156107635761076361236e565b80820281158282048414176107635761076361236e565b6000826125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156125de57600080fd5b815161139d81611ecc565b60008084546125f7816123b0565b6001828116801561260f576001811461264257612671565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612671565b8860005260208060002060005b858110156126685781548a82015290840190820161264f565b50505082870194505b505050508351612685818360208801612107565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526126cd608083018461212b565b9695505050505050565b6000602082840312156126e957600080fd5b815161139d81611e8156fea2646970667358221220bda40f2f22e6c848351daf799527f5efb3044fdf86f65b6c386bd6e78b0200d164736f6c63430008180033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069
Deployed Bytecode
0x6080604052600436106101985760003560e01c80634f6ccce7116100e0578063a0bcfc7f11610084578063c1ce4dbf11610061578063c1ce4dbf146104ea578063c87b56dd1461050a578063e985e9c51461052a578063f2fde38b1461058057005b8063a0bcfc7f1461048a578063a22cb465146104aa578063b88d4fde146104ca57005b806370a08231116100bd57806370a08231146103f75780637158da7c146104175780638da5cb5b1461044457806395d89b411461047557005b80634f6ccce7146103a15780635f97036f146103c15780636352211e146103d757005b806318160ddd116101475780632f745c59116101245780632f745c591461032c5780633ccfd60b1461034c57806342842e0e1461036157806342966c681461038157005b806318160ddd1461029d57806323b872dd146102c05780632a55205a146102e057005b806306fdde031161017557806306fdde0314610216578063081812fc14610238578063095ea7b31461027d57005b806301ffc9a7146101a157806302fa7c47146101d6578063067f01e5146101f657005b3661019f57005b005b3480156101ad57600080fd5b506101c16101bc366004611eaf565b6105a0565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b5061019f6101f1366004611f1a565b610769565b34801561020257600080fd5b5061019f610211366004612032565b6107d6565b34801561022257600080fd5b5061022b6109ec565b6040516101cd9190612175565b34801561024457600080fd5b50610258610253366004612188565b610a7e565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cd565b34801561028957600080fd5b5061019f6102983660046121a1565b610af1565b3480156102a957600080fd5b506102b2610c34565b6040519081526020016101cd565b3480156102cc57600080fd5b5061019f6102db3660046121cd565b610cb2565b3480156102ec57600080fd5b506103006102fb36600461220e565b610de4565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526020830191909152016101cd565b34801561033857600080fd5b506102b26103473660046121a1565b610ec6565b34801561035857600080fd5b5061019f611092565b34801561036d57600080fd5b5061019f61037c3660046121cd565b6111b3565b34801561038d57600080fd5b5061019f61039c366004612188565b6111d3565b3480156103ad57600080fd5b506102b26103bc366004612188565b611255565b3480156103cd57600080fd5b506102b261271081565b3480156103e357600080fd5b506102586103f2366004612188565b611299565b34801561040357600080fd5b506102b2610412366004612230565b6113a4565b34801561042357600080fd5b506002546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561045057600080fd5b5060005462010000900473ffffffffffffffffffffffffffffffffffffffff16610258565b34801561048157600080fd5b5061022b61152f565b34801561049657600080fd5b5061019f6104a536600461224d565b61153e565b3480156104b657600080fd5b5061019f6104c5366004612282565b6115a4565b3480156104d657600080fd5b5061019f6104e53660046122c0565b61168a565b3480156104f657600080fd5b5061019f61050536600461220e565b6116ef565b34801561051657600080fd5b5061022b610525366004612188565b611765565b34801561053657600080fd5b506101c1610545366004612340565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058c57600080fd5b5061019f61059b366004612230565b611801565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061063357507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061067f57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106cb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f7f5828d000000000000000000000000000000000000000000000000000000000145b8061071757507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061076357507fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000145b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146107c8576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6107d282826118d9565b5050565b600054610100900460ff16158080156107f65750600054600160ff909116105b806108105750303b158015610810575060005460ff166001145b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107bf565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108fa57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905561094585600161239d565b6004556009610954858261244d565b50600a610961848261244d565b5061096b8261197f565b6109748961198b565b61097e8787611a6f565b80156109e157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6060600980546109fb906123b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a27906123b0565b8015610a745780601f10610a4957610100808354040283529160200191610a74565b820191906000526020600020905b815481529060010190602001808311610a5757829003601f168201915b5050505050905090565b600081610a8a81611b06565b610ac3576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b60008381526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1691505b50919050565b6000610afc82611299565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b63576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610b70823385611b32565b905080610bb2576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018490526044016107bf565b60008381526005602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918616917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b6000806001600454610c469190612567565b9150819050805b8015610cad57610c5c81611b06565b610c86577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201915b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610c4d565b505090565b73ffffffffffffffffffffffffffffffffffffffff8216610d17576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016107bf565b6000610d2282611299565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610d89576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d94813384611b32565b610dd3576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b610dde848484611be6565b50505050565b6040805180820190915260015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201526000908190831580610e57575060208101516bffffffffffffffffffffffff16155b80610e775750805173ffffffffffffffffffffffffffffffffffffffff16155b15610e89576000809250925050610ebf565b60006127108583602001516bffffffffffffffffffffffff16610eac919061257a565b610eb69190612591565b91519350909150505b9250929050565b600073ffffffffffffffffffffffffffffffffffffffff8316610f15576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000806001600454610f2a9190612567565b90505b8083101561105d57610f3e83611b06565b156110525760008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff16935083611005576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100291906125cc565b93505b8673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110525781860361104b5782945050505050610763565b8160010191505b826001019250610f2d565b6040517fd999841b000000000000000000000000000000000000000000000000000000008152600481018790526024016107bf565b60005473ffffffffffffffffffffffffffffffffffffffff620100009091041633146110ec576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b476000819003611128576040517f6cc4466b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604051600090339083908381818185875af1925050503d806000811461116a576040519150601f19603f3d011682016040523d82523d6000602084013e61116f565b606091505b50509050806107d2576040517f84020a7b000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b6111ce8383836040518060200160405280600081525061168a565b505050565b60006111de82611299565b90506111eb813384611b32565b61122a576040517fea544483000000000000000000000000000000000000000000000000000000008152336004820152602481018390526044016107bf565b600882901c60009081526003602052604090208054600160ff85161b1790556107d281600084611be6565b60006004548210611295576040517f125c19b0000000000000000000000000000000000000000000000000000000008152600481018390526024016107bf565b5090565b6000816112a581611b06565b6112de576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b60008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff16915081610aeb576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa158015611379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906125cc565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82166113f3576040517fa4b5692700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600060016004546114079190612567565b90505b808310156115275761141b83611b06565b1561151c5760008381526007602052604090205473ffffffffffffffffffffffffffffffffffffffff169150816114e2576002546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff90911690636352211e90602401602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df91906125cc565b91505b8473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361151c578360010193505b82600101925061140a565b505050919050565b6060600a80546109fb906123b0565b60005473ffffffffffffffffffffffffffffffffffffffff62010000909104163314611598576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b6115a18161197f565b50565b3373ffffffffffffffffffffffffffffffffffffffff8316036115f3576040517f47f5cd4600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611695848484610cb2565b6116a184848484611c7c565b610dde576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841660048201526024016107bf565b815b818110156111ce578061170382611299565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016116f1565b60608161177181611b06565b6117aa576040517f1cf4d9a4000000000000000000000000000000000000000000000000000000008152600481018290526024016107bf565b6000600880546117b9906123b0565b9050116117ce576117c983611e1f565b61139d565b60086117d984611e1f565b6040516020016117ea9291906125e9565b604051602081830303815290604052915050919050565b60005473ffffffffffffffffffffffffffffffffffffffff6201000090910416331461185b576040517f55932a1b0000000000000000000000000000000000000000000000000000000081523360048201526024016107bf565b6000805473ffffffffffffffffffffffffffffffffffffffff838116620100008181027fffffffffffffffffffff0000000000000000000000000000000000000000ffff851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b612710816bffffffffffffffffffffffff161115611923576040517fb6eb28ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600155565b60086107d2828261244d565b600054610100900460ff16611a22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bf565b6000805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff909216919091179055565b600054610100900460ff166107c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107bf565b600881901c600090815260036020526040812054600160ff84161b161580156107635750506004541190565b60008373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611ba15750611b7282610a7e565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80611bde575073ffffffffffffffffffffffffffffffffffffffff80851660009081526006602090815260408083209387168352929052205460ff165b949350505050565b600081815260056020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556007909252808320805473ffffffffffffffffffffffffffffffffffffffff8781169190941681179091559051849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000833b8015611e13576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063150b7a0290611cde9033908a908990899060040161268e565b6020604051808303816000875af1925050508015611d37575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d34918101906126d7565b60015b611dc6573d808015611d65576040519150601f19603f3d011682016040523d82523d6000602084013e611d6a565b606091505b508051600003611dbe576040517f07a17b9700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff871660048201526024016107bf565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149150611bde9050565b50600195945050505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611e3957508190037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909101908152919050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115a157600080fd5b600060208284031215611ec157600080fd5b813561139d81611e81565b73ffffffffffffffffffffffffffffffffffffffff811681146115a157600080fd5b8035611ef981611ecc565b919050565b80356bffffffffffffffffffffffff81168114611ef957600080fd5b60008060408385031215611f2d57600080fd5b8235611f3881611ecc565b9150611f4660208401611efe565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611f9957611f99611f4f565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611fdf57611fdf611f4f565b81604052809350858152868686011115611ff857600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261202357600080fd5b61139d83833560208501611f7e565b600080600080600080600080610100898b03121561204f57600080fd5b61205889611eee565b975061206660208a01611eee565b965061207460408a01611eee565b955061208260608a01611efe565b94506080890135935060a089013567ffffffffffffffff808211156120a657600080fd5b6120b28c838d01612012565b945060c08b01359150808211156120c857600080fd5b6120d48c838d01612012565b935060e08b01359150808211156120ea57600080fd5b506120f78b828c01612012565b9150509295985092959890939650565b60005b8381101561212257818101518382015260200161210a565b50506000910152565b60008151808452612143816020860160208601612107565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061139d602083018461212b565b60006020828403121561219a57600080fd5b5035919050565b600080604083850312156121b457600080fd5b82356121bf81611ecc565b946020939093013593505050565b6000806000606084860312156121e257600080fd5b83356121ed81611ecc565b925060208401356121fd81611ecc565b929592945050506040919091013590565b6000806040838503121561222157600080fd5b50508035926020909101359150565b60006020828403121561224257600080fd5b813561139d81611ecc565b60006020828403121561225f57600080fd5b813567ffffffffffffffff81111561227657600080fd5b611bde84828501612012565b6000806040838503121561229557600080fd5b82356122a081611ecc565b9150602083013580151581146122b557600080fd5b809150509250929050565b600080600080608085870312156122d657600080fd5b84356122e181611ecc565b935060208501356122f181611ecc565b925060408501359150606085013567ffffffffffffffff81111561231457600080fd5b8501601f8101871361232557600080fd5b61233487823560208401611f7e565b91505092959194509250565b6000806040838503121561235357600080fd5b823561235e81611ecc565b915060208301356122b581611ecc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156107635761076361236e565b600181811c908216806123c457607f821691505b602082108103610aeb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f8211156111ce576000816000526020600020601f850160051c810160208610156124265750805b601f850160051c820191505b8181101561244557828155600101612432565b505050505050565b815167ffffffffffffffff81111561246757612467611f4f565b61247b8161247584546123b0565b846123fd565b602080601f8311600181146124ce57600084156124985750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612445565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561251b578886015182559484019460019091019084016124fc565b508582101561255757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b818103818111156107635761076361236e565b80820281158282048414176107635761076361236e565b6000826125c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602082840312156125de57600080fd5b815161139d81611ecc565b60008084546125f7816123b0565b6001828116801561260f576001811461264257612671565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612671565b8860005260208060002060005b858110156126685781548a82015290840190820161264f565b50505082870194505b505050508351612685818360208801612107565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526126cd608083018461212b565b9695505050505050565b6000602082840312156126e957600080fd5b815161139d81611e8156fea2646970667358221220bda40f2f22e6c848351daf799527f5efb3044fdf86f65b6c386bd6e78b0200d164736f6c63430008180033
Deployed Bytecode Sourcemap
37752:24580:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55288:403;;;;;;;;;;-1:-1:-1;55288:403:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;55288:403:0;;;;;;;;48336:162;;;;;;;;;;-1:-1:-1;48336:162:0;;;;;:::i;:::-;;:::i;39592:475::-;;;;;;;;;;-1:-1:-1;39592:475:0;;;;;:::i;:::-;;:::i;53979:104::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50137:152::-;;;;;;;;;;-1:-1:-1;50137:152:0;;;;;:::i;:::-;;:::i;:::-;;;4847:42:1;4835:55;;;4817:74;;4805:2;4790:18;50137:152:0;4671:226:1;41946:467:0;;;;;;;;;;-1:-1:-1;41946:467:0;;;;;:::i;:::-;;:::i;53358:371::-;;;;;;;;;;;;;:::i;:::-;;;5368:25:1;;;5356:2;5341:18;53358:371:0;5222:177:1;45447:491:0;;;;;;;;;;-1:-1:-1;45447:491:0;;;;;:::i;:::-;;:::i;36245:447::-;;;;;;;;;;-1:-1:-1;36245:447:0;;;;;:::i;:::-;;:::i;:::-;;;;6322:42:1;6310:55;;;6292:74;;6397:2;6382:18;;6375:34;;;;6265:18;36245:447:0;6118:297:1;52311:929:0;;;;;;;;;;-1:-1:-1;52311:929:0;;;;;:::i;:::-;;:::i;47022:356::-;;;;;;;;;;;;;:::i;43100:151::-;;;;;;;;;;-1:-1:-1;43100:151:0;;;;;:::i;:::-;;:::i;46215:321::-;;;;;;;;;;-1:-1:-1;46215:321:0;;;;;:::i;:::-;;:::i;51723:209::-;;;;;;;;;;-1:-1:-1;51723:209:0;;;;;:::i;:::-;;:::i;35133:45::-;;;;;;;;;;;;35172:6;35133:45;;51113:253;;;;;;;;;;-1:-1:-1;51113:253:0;;;;;:::i;:::-;;:::i;49050:735::-;;;;;;;;;;-1:-1:-1;49050:735:0;;;;;:::i;:::-;;:::i;38548:30::-;;;;;;;;;;-1:-1:-1;38548:30:0;;;;;;;;34243:104;;;;;;;;;;-1:-1:-1;34298:21:0;34335:6;;;;;;34243:104;;54214:110;;;;;;;;;;;;;:::i;47656:101::-;;;;;;;;;;-1:-1:-1;47656:101:0;;;;;:::i;:::-;;:::i;44644:297::-;;;;;;;;;;-1:-1:-1;44644:297:0;;;;;:::i;:::-;;:::i;44022:280::-;;;;;;;;;;-1:-1:-1;44022:280:0;;;;;:::i;:::-;;:::i;40073:191::-;;;;;;;;;;-1:-1:-1;40073:191:0;;;;;:::i;:::-;;:::i;54581:236::-;;;;;;;;;;-1:-1:-1;54581:236:0;;;;;:::i;:::-;;:::i;50649:198::-;;;;;;;;;;-1:-1:-1;50649:198:0;;;;;:::i;:::-;50799:31;;;;50768:15;50799:31;;;:18;:31;;;;;;;;:42;;;;;;;;;;;;;;;50649:198;33731:200;;;;;;;;;;-1:-1:-1;33731:200:0;;;;;:::i;:::-;;:::i;55288:403::-;55366:4;55386:41;;;55402:25;55386:41;;:96;;-1:-1:-1;55431:51:0;;;55447:35;55431:51;55386:96;:156;;;-1:-1:-1;55493:49:0;;;55509:33;55493:49;55386:156;:201;;;-1:-1:-1;55546:41:0;;;55562:25;55546:41;55386:201;:253;;;-1:-1:-1;55598:41:0;;;55614:25;55598:41;55386:253;:299;;;-1:-1:-1;55643:42:0;;;55659:26;55643:42;55386:299;55379:306;55288:403;-1:-1:-1;;55288:403:0:o;48336:162::-;34298:21;34335:6;;;;;;;33259:10;33248:21;33244:80;;33287:29;;;;;33305:10;33287:29;;;4817:74:1;4790:18;;33287:29:0;;;;;;;;33244:80;48438:54:::1;48454:20;48476:15;48438;:54::i;:::-;48336:162:::0;;:::o;39592:475::-;29087:19;29110:13;;;;;;29109:14;;29157:34;;;;-1:-1:-1;29175:12:0;;29190:1;29175:12;;;;:16;29157:34;29156:97;;;-1:-1:-1;29225:4:0;16271:19;:23;;;29197:55;;-1:-1:-1;29235:12:0;;;;;:17;29197:55;29134:193;;;;;;;9061:2:1;29134:193:0;;;9043:21:1;9100:2;9080:18;;;9073:30;9139:34;9119:18;;;9112:62;9210:16;9190:18;;;9183:44;9244:19;;29134:193:0;8859:410:1;29134:193:0;29338:12;:16;;;;29353:1;29338:16;;;29365:67;;;;29400:13;:20;;;;;;;;29365:67;39848:15:::1;:33:::0;;;::::1;;::::0;::::1;;::::0;;39898:11:::1;:7:::0;-1:-1:-1;39898:11:0::1;:::i;:::-;39888:7;:21:::0;39916:5:::1;:13;39924:5:::0;39916;:13:::1;:::i;:::-;-1:-1:-1::0;39936:7:0::1;:17;39946:7:::0;39936;:17:::1;:::i;:::-;;39960:21;39972:8;39960:11;:21::i;:::-;39988:20;40001:6;39988:12;:20::i;:::-;40015:46;40029:17;40048:12;40015:13;:46::i;:::-;29458:14:::0;29454:102;;;29505:5;29489:21;;;;;;29530:14;;-1:-1:-1;12561:36:1;;29530:14:0;;12549:2:1;12534:18;29530:14:0;;;;;;;29454:102;29076:487;39592:475;;;;;;;;:::o;53979:104::-;54033:23;54072:5;54065:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53979:104;:::o;50137:152::-;50231:16;50212:8;41023:17;41031:8;41023:7;:17::i;:::-;41018:83;;41058:35;;;;;;;;5368:25:1;;;5341:18;;41058:35:0;5222:177:1;41018:83:0;50263:20:::1;::::0;;;:10:::1;:20;::::0;;;;;::::1;;::::0;-1:-1:-1;41107:1:0::1;50137:152:::0;;;;:::o;41946:467::-;42025:20;42048:17;42056:8;42048:7;:17::i;:::-;42025:40;;42083:12;42076:19;;:3;:19;;;42072:75;;42113:26;;;;;;;;;;;;;;42072:75;42153:17;42173:54;42192:12;42206:10;42218:8;42173:18;:54::i;:::-;42153:74;;42239:12;42234:92;;42269:49;;;;;42297:10;42269:49;;;6292:74:1;6382:18;;;6375:34;;;6265:18;;42269:49:0;6118:297:1;42234:92:0;42332:20;;;;:10;:20;;;;;;:26;;;;;;;;;;;;;;42370:37;;42332:20;;42370:37;;;;;;;42018:395;;41946:467;;:::o;53358:371::-;53419:14;53442:22;53477:1;53467:7;;:11;;;;:::i;:::-;53442:36;-1:-1:-1;53442:36:0;;-1:-1:-1;53442:36:0;53554:170;53561:11;;53554:170;;53588:16;53596:7;53588;:16::i;:::-;53583:86;;53640:8;;;;;53583:86;53698:9;;53554:170;;;53435:294;;53358:371;:::o;45447:491::-;45550:17;;;45546:76;;45585:29;;;;;4847:42:1;4835:55;;45585:29:0;;;4817:74:1;4790:18;;45585:29:0;4671:226:1;45546:76:0;45628:20;45651:17;45659:8;45651:7;:17::i;:::-;45628:40;;45688:12;45679:21;;:5;:21;;;45675:80;;45718:29;;;;;;;;;;;;;;45675:80;45766:54;45785:12;45799:10;45811:8;45766:18;:54::i;:::-;45761:134;;45838:49;;;;;45866:10;45838:49;;;6292:74:1;6382:18;;;6375:34;;;6265:18;;45838:49:0;6118:297:1;45761:134:0;45901:31;45911:5;45918:3;45923:8;45901:9;:31::i;:::-;45539:399;45447:491;;;:::o;36245:447::-;36405:40;;;;;;;;;36433:12;36405:40;;;;;;;;;;;;;;;-1:-1:-1;;;;36456:15:0;;;:35;;-1:-1:-1;36475:11:0;;;;:16;;;36456:35;:69;;;-1:-1:-1;36495:16:0;;:30;;;36456:69;36452:114;;;36552:1;36556;36536:22;;;;;;;36452:114;36572:23;35172:6;36612:10;36598:6;:11;;;:24;;;;;;:::i;:::-;:39;;;;:::i;:::-;36652:16;;;-1:-1:-1;36572:65:0;;-1:-1:-1;;36245:447:0;;;;;;:::o;52311:929::-;52415:7;52435:25;;;52431:84;;52478:29;;;;;;;;;;;;;;52431:84;52521:27;52555:15;52577:22;52606;52641:1;52631:7;;:11;;;;:::i;:::-;52606:36;;52649:521;52666:14;52656:7;:24;52649:521;;;52695:16;52703:7;52695;:16::i;:::-;52691:424;;;59507:18;59547:17;;;:7;:17;;;;;;;;;-1:-1:-1;59547:17:0;52774:118;;52848:15;;:32;;;;;;;;5368:25:1;;;52848:15:0;;;;;:23;;5341:18:1;;52848:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52826:54;;52774:118;52929:11;52906:34;;:19;:34;;;52902:204;;52969:14;52959:6;:24;52955:73;;53007:7;53000:14;;;;;;;;52955:73;53065:16;;;;;52902:204;53144:9;;;;;52649:521;;;53183:51;;;;;;;;5368:25:1;;;5341:18;;53183:51:0;5222:177:1;47022:356:0;34298:21;34335:6;;;;;;;33259:10;33248:21;33244:80;;33287:29;;;;;33305:10;33287:29;;;4817:74:1;4790:18;;33287:29:0;4671:226:1;33244:80:0;47086:21:::1;47066:17;47118:14:::0;;;47114:62:::1;;47150:18;;;;;;;;;;;;;;47114:62;47238:46;::::0;47219:14:::1;::::0;47246:10:::1;::::0;47270:9;;47219:14;47238:46;47219:14;47238:46;47270:9;47246:10;47238:46:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47218:66;;;47296:9;47291:82;;47323:42;::::0;::::1;::::0;;47343:10:::1;47323:42;::::0;::::1;6292:74:1::0;6382:18;;;6375:34;;;6265:18;;47323:42:0::1;6118:297:1::0;43100:151:0;43203:42;43220:5;43227:3;43232:8;43203:42;;;;;;;;;;;;:16;:42::i;:::-;43100:151;;;:::o;46215:321::-;46261:20;46284:17;46292:8;46284:7;:17::i;:::-;46261:40;;46313:54;46332:12;46346:10;46358:8;46313:18;:54::i;:::-;46308:134;;46385:49;;;;;46413:10;46385:49;;;6292:74:1;6382:18;;;6375:34;;;6265:18;;46385:49:0;6118:297:1;46308:134:0;25400:1;25391:10;;;25374:14;25457:20;;;46460:7;25457:20;;;;;:28;;25427:1;25441:4;25433:12;;25427:19;25457:28;;;46485:45;46495:12;46517:1;46521:8;46485:9;:45::i;51723:209::-;51799:7;51829;;51819:6;:17;51815:92;;51854:45;;;;;;;;5368:25:1;;;5341:18;;51854:45:0;5222:177:1;51815:92:0;-1:-1:-1;51920:6:0;51723:209::o;51113:253::-;51203:18;51184:8;41023:17;41031:8;41023:7;:17::i;:::-;41018:83;;41058:35;;;;;;;;5368:25:1;;;5341:18;;41058:35:0;5222:177:1;41018:83:0;59507:18;59547:17;;;:7;:17;;;;;;;;;-1:-1:-1;59547:17:0;51268:93:::1;;51320:15;::::0;:33:::1;::::0;;;;::::1;::::0;::::1;5368:25:1::0;;;51320:15:0::1;::::0;;::::1;::::0;:23:::1;::::0;5341:18:1;;51320:33:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51307:46:::0;51113:253;-1:-1:-1;;;51113:253:0:o;49050:735::-;49128:20;49161:25;;;49157:84;;49204:29;;;;;;;;;;;;;;49157:84;49247:15;49269:27;49303:22;49338:1;49328:7;;:11;;;;:::i;:::-;49303:36;;49346:434;49363:14;49353:7;:24;49346:434;;;49392:16;49400:7;49392;:16::i;:::-;49388:337;;;59507:18;59547:17;;;:7;:17;;;;;;;;;-1:-1:-1;59547:17:0;49471:118;;49545:15;;:32;;;;;;;;5368:25:1;;;49545:15:0;;;;;:23;;5341:18:1;;49545:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49523:54;;49471:118;49626:11;49603:34;;:19;:34;;;49599:117;;49677:14;;;;;49599:117;49754:9;;;;;49346:434;;;49150:635;;;49050:735;;;:::o;54214:110::-;54270:25;54311:7;54304:14;;;;;:::i;47656:101::-;34298:21;34335:6;;;;;;;33259:10;33248:21;33244:80;;33287:29;;;;;33305:10;33287:29;;;4817:74:1;4790:18;;33287:29:0;4671:226:1;33244:80:0;47727:24:::1;47739:11;47727;:24::i;:::-;47656:101:::0;:::o;44644:297::-;44754:10;44741:23;;;;44737:79;;44782:26;;;;;;;;;;;;;;44737:79;44841:10;44822:30;;;;:18;:30;;;;;;;;;:41;;;;;;;;;;;;:53;;;;;;;;;;;;;44887:48;;586:41:1;;;44822::0;;44841:10;44887:48;;559:18:1;44887:48:0;;;;;;;44644:297;;:::o;44022:280::-;44145:34;44158:5;44165:3;44170:8;44145:12;:34::i;:::-;44191:51;44214:5;44221:3;44226:8;44236:5;44191:22;:51::i;:::-;44186:111;;44260:29;;;;;4847:42:1;4835:55;;44260:29:0;;;4817:74:1;4790:18;;44260:29:0;4671:226:1;40073:191:0;40167:12;40150:109;40185:10;40181:1;:14;40150:109;;;40249:1;40237:10;40245:1;40237:7;:10::i;:::-;40216:35;;40233:1;40216:35;;;;;;;;;;;;40197:3;;40150:109;;54581:236;54672:17;54653:8;41023:17;41031:8;41023:7;:17::i;:::-;41018:83;;41058:35;;;;;;;;5368:25:1;;;5341:18;;41058:35:0;5222:177:1;41018:83:0;54730:1:::1;54711:8;54705:22;;;;;:::i;:::-;;;:26;:106;;54792:19;54802:8;54792:9;:19::i;:::-;54705:106;;;54758:8;54768:19;54778:8;54768:9;:19::i;:::-;54741:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54698:113;;54581:236:::0;;;;:::o;33731:200::-;34298:21;34335:6;;;;;;;33259:10;33248:21;33244:80;;33287:29;;;;;33305:10;33287:29;;;4817:74:1;4790:18;;33287:29:0;4671:226:1;33244:80:0;33818:18:::1;33839:6:::0;;::::1;33852:18:::0;;::::1;33839:6:::0;33852:18;;::::1;::::0;;::::1;;::::0;;33882:43:::1;::::0;33839:6;::::1;::::0;;;::::1;::::0;33852:18;;33839:6;;33882:43:::1;::::0;::::1;33811:120;33731:200:::0;:::o;37363:268::-;35172:6;37470:15;:30;;;37466:88;;;37518:28;;;;;;;;;;;;;;37466:88;37575:50;;;;;;;;;;;;;;;;;;;;;;;;;;;37560:65;;;;;:12;:65;37363:268::o;60381:100::-;60453:8;:22;60464:11;60453:8;:22;:::i;32917:92::-;31219:13;;;;;;;31211:69;;;;;;;14945:2:1;31211:69:0;;;14927:21:1;14984:2;14964:18;;;14957:30;15023:34;15003:18;;;14996:62;15094:13;15074:18;;;15067:41;15125:19;;31211:69:0;14743:407:1;31211:69:0;32988:6:::1;:15:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;32917:92::o;35566:158::-;31219:13;;;;;;;31211:69;;;;;;;14945:2:1;31211:69:0;;;14927:21:1;14984:2;14964:18;;;14957:30;15023:34;15003:18;;;14996:62;15094:13;15074:18;;;15067:41;15125:19;;31211:69:0;14743:407:1;58209:156:0;24847:1;24838:10;;;58275:15;24911:20;;;58319:7;24911:20;;;;;;24874:1;24888:4;24880:12;;24874:19;24911:27;:32;;;58306:53;;-1:-1:-1;;58352:7:0;;-1:-1:-1;58341:18:0;58209:156::o;58892:282::-;59029:15;59073:11;59060:24;;:9;:24;;;:62;;;;59101:21;59113:8;59101:11;:21::i;:::-;59088:34;;:9;:34;;;59060:62;:108;;;-1:-1:-1;59126:31:0;;;;;;;;:18;:31;;;;;;;;:42;;;;;;;;;;;;59060:108;59053:115;58892:282;-1:-1:-1;;;;58892:282:0:o;59850:235::-;59984:1;59953:20;;;:10;:20;;;;;;;;:33;;;;;;;;;59993:7;:17;;;;;;:30;;59953:33;59993:30;;;;;;;;;;;;60035:44;;59964:8;;59993:30;;60035:44;;;;;;59850:235;;;:::o;56465:1465::-;56614:20;57322:16;;57443:10;;57439:486;;57468:73;;;;;:37;;;;;;:73;;57506:10;;57518:5;;57525:8;;57535:5;;57468:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57468:73:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57464:420;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57689:6;:13;57706:1;57689:18;57685:190;;57729:29;;;;;4847:42:1;4835:55;;57729:29:0;;;4817:74:1;4790:18;;57729:29:0;4671:226:1;57685:190:0;57843:6;57837:13;57828:6;57824:2;57820:15;57813:38;57464:420;57584:51;;57594:41;57584:51;;-1:-1:-1;57577:58:0;;-1:-1:-1;57577:58:0;57439:486;-1:-1:-1;57913:4:0;;56465:1465;-1:-1:-1;;;;;56465:1465:0:o;60690:1568::-;60756:17;61156:4;61149;61143:11;61139:22;61236:1;61230:4;61223:15;61299:4;61296:1;61292:12;61285:19;;;61369:1;61364:3;61357:14;61461:3;61676:6;61658:392;61750:1;61745:3;61741:11;61734:18;;61897:2;61891:4;61887:13;61883:2;61879:22;61874:3;61866:36;61975:2;61965:13;;62016:25;61658:392;62016:25;-1:-1:-1;62074:13:0;;;62177:14;;;;62227:19;;;62177:14;60690:1568;-1:-1:-1;60690: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;638:154::-;724:42;717:5;713:54;706:5;703:65;693:93;;782:1;779;772:12;797:134;865:20;;894:31;865:20;894:31;:::i;:::-;797:134;;;:::o;936:179::-;1003:20;;1063:26;1052:38;;1042:49;;1032:77;;1105:1;1102;1095:12;1120:319;1187:6;1195;1248:2;1236:9;1227:7;1223:23;1219:32;1216:52;;;1264:1;1261;1254:12;1216:52;1303:9;1290:23;1322:31;1347:5;1322:31;:::i;:::-;1372:5;-1:-1:-1;1396:37:1;1429:2;1414:18;;1396:37;:::i;:::-;1386:47;;1120:319;;;;;:::o;1444:184::-;1496:77;1493:1;1486:88;1593:4;1590:1;1583:15;1617:4;1614:1;1607:15;1633:691;1698:5;1728:18;1769:2;1761:6;1758:14;1755:40;;;1775:18;;:::i;:::-;1909:2;1903:9;1975:2;1963:15;;1814:66;1959:24;;;1985:2;1955:33;1951:42;1939:55;;;2009:18;;;2029:22;;;2006:46;2003:72;;;2055:18;;:::i;:::-;2095:10;2091:2;2084:22;2124:6;2115:15;;2154:6;2146;2139:22;2194:3;2185:6;2180:3;2176:16;2173:25;2170:45;;;2211:1;2208;2201:12;2170:45;2261:6;2256:3;2249:4;2241:6;2237:17;2224:44;2316:1;2309:4;2300:6;2292;2288:19;2284:30;2277:41;;;;1633:691;;;;;:::o;2329:222::-;2372:5;2425:3;2418:4;2410:6;2406:17;2402:27;2392:55;;2443:1;2440;2433:12;2392:55;2465:80;2541:3;2532:6;2519:20;2512:4;2504:6;2500:17;2465:80;:::i;2556:1110::-;2707:6;2715;2723;2731;2739;2747;2755;2763;2816:3;2804:9;2795:7;2791:23;2787:33;2784:53;;;2833:1;2830;2823:12;2784:53;2856:29;2875:9;2856:29;:::i;:::-;2846:39;;2904:38;2938:2;2927:9;2923:18;2904:38;:::i;:::-;2894:48;;2961:38;2995:2;2984:9;2980:18;2961:38;:::i;:::-;2951:48;;3018:37;3051:2;3040:9;3036:18;3018:37;:::i;:::-;3008:47;;3102:3;3091:9;3087:19;3074:33;3064:43;;3158:3;3147:9;3143:19;3130:33;3182:18;3223:2;3215:6;3212:14;3209:34;;;3239:1;3236;3229:12;3209:34;3262:50;3304:7;3295:6;3284:9;3280:22;3262:50;:::i;:::-;3252:60;;3365:3;3354:9;3350:19;3337:33;3321:49;;3395:2;3385:8;3382:16;3379:36;;;3411:1;3408;3401:12;3379:36;3434:52;3478:7;3467:8;3456:9;3452:24;3434:52;:::i;:::-;3424:62;;3539:3;3528:9;3524:19;3511:33;3495:49;;3569:2;3559:8;3556:16;3553:36;;;3585:1;3582;3575:12;3553:36;;3608:52;3652:7;3641:8;3630:9;3626:24;3608:52;:::i;:::-;3598:62;;;2556:1110;;;;;;;;;;;:::o;3671:250::-;3756:1;3766:113;3780:6;3777:1;3774:13;3766:113;;;3856:11;;;3850:18;3837:11;;;3830:39;3802:2;3795:10;3766:113;;;-1:-1:-1;;3913:1:1;3895:16;;3888:27;3671:250::o;3926:330::-;3968:3;4006:5;4000:12;4033:6;4028:3;4021:19;4049:76;4118:6;4111:4;4106:3;4102:14;4095:4;4088:5;4084:16;4049:76;:::i;:::-;4170:2;4158:15;4175:66;4154:88;4145:98;;;;4245:4;4141:109;;3926:330;-1:-1:-1;;3926:330:1:o;4261:220::-;4410:2;4399:9;4392:21;4373:4;4430:45;4471:2;4460:9;4456:18;4448:6;4430:45;:::i;4486:180::-;4545:6;4598:2;4586:9;4577:7;4573:23;4569:32;4566:52;;;4614:1;4611;4604:12;4566:52;-1:-1:-1;4637:23:1;;4486:180;-1:-1:-1;4486:180:1:o;4902:315::-;4970:6;4978;5031:2;5019:9;5010:7;5006:23;5002:32;4999:52;;;5047:1;5044;5037:12;4999:52;5086:9;5073:23;5105:31;5130:5;5105:31;:::i;:::-;5155:5;5207:2;5192:18;;;;5179:32;;-1:-1:-1;;;4902:315:1:o;5404:456::-;5481:6;5489;5497;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;5605:9;5592:23;5624:31;5649:5;5624:31;:::i;:::-;5674:5;-1:-1:-1;5731:2:1;5716:18;;5703:32;5744:33;5703:32;5744:33;:::i;:::-;5404:456;;5796:7;;-1:-1:-1;;;5850:2:1;5835:18;;;;5822:32;;5404:456::o;5865:248::-;5933:6;5941;5994:2;5982:9;5973:7;5969:23;5965:32;5962:52;;;6010:1;6007;6000:12;5962:52;-1:-1:-1;;6033:23:1;;;6103:2;6088:18;;;6075:32;;-1:-1:-1;5865:248:1:o;6420:247::-;6479:6;6532:2;6520:9;6511:7;6507:23;6503:32;6500:52;;;6548:1;6545;6538:12;6500:52;6587:9;6574:23;6606:31;6631:5;6606:31;:::i;6918:322::-;6987:6;7040:2;7028:9;7019:7;7015:23;7011:32;7008:52;;;7056:1;7053;7046:12;7008:52;7096:9;7083:23;7129:18;7121:6;7118:30;7115:50;;;7161:1;7158;7151:12;7115:50;7184;7226:7;7217:6;7206:9;7202:22;7184:50;:::i;7245:416::-;7310:6;7318;7371:2;7359:9;7350:7;7346:23;7342:32;7339:52;;;7387:1;7384;7377:12;7339:52;7426:9;7413:23;7445:31;7470:5;7445:31;:::i;:::-;7495:5;-1:-1:-1;7552:2:1;7537:18;;7524:32;7594:15;;7587:23;7575:36;;7565:64;;7625:1;7622;7615:12;7565:64;7648:7;7638:17;;;7245:416;;;;;:::o;7666:795::-;7761:6;7769;7777;7785;7838:3;7826:9;7817:7;7813:23;7809:33;7806:53;;;7855:1;7852;7845:12;7806:53;7894:9;7881:23;7913:31;7938:5;7913:31;:::i;:::-;7963:5;-1:-1:-1;8020:2:1;8005:18;;7992:32;8033:33;7992:32;8033:33;:::i;:::-;8085:7;-1:-1:-1;8139:2:1;8124:18;;8111:32;;-1:-1:-1;8194:2:1;8179:18;;8166:32;8221:18;8210:30;;8207:50;;;8253:1;8250;8243:12;8207:50;8276:22;;8329:4;8321:13;;8317:27;-1:-1:-1;8307:55:1;;8358:1;8355;8348:12;8307:55;8381:74;8447:7;8442:2;8429:16;8424:2;8420;8416:11;8381:74;:::i;:::-;8371:84;;;7666:795;;;;;;;:::o;8466:388::-;8534:6;8542;8595:2;8583:9;8574:7;8570:23;8566:32;8563:52;;;8611:1;8608;8601:12;8563:52;8650:9;8637:23;8669:31;8694:5;8669:31;:::i;:::-;8719:5;-1:-1:-1;8776:2:1;8761:18;;8748:32;8789:33;8748:32;8789:33;:::i;9274:184::-;9326:77;9323:1;9316:88;9423:4;9420:1;9413:15;9447:4;9444:1;9437:15;9463:125;9528:9;;;9549:10;;;9546:36;;;9562:18;;:::i;9593:437::-;9672:1;9668:12;;;;9715;;;9736:61;;9790:4;9782:6;9778:17;9768:27;;9736:61;9843:2;9835:6;9832:14;9812:18;9809:38;9806:218;;9880:77;9877:1;9870:88;9981:4;9978:1;9971:15;10009:4;10006:1;9999:15;10161:543;10263:2;10258:3;10255:11;10252:446;;;10299:1;10323:5;10320:1;10313:16;10367:4;10364:1;10354:18;10437:2;10425:10;10421:19;10418:1;10414:27;10408:4;10404:38;10473:4;10461:10;10458:20;10455:47;;;-1:-1:-1;10496:4:1;10455:47;10551:2;10546:3;10542:12;10539:1;10535:20;10529:4;10525:31;10515:41;;10606:82;10624:2;10617:5;10614:13;10606:82;;;10669:17;;;10650:1;10639:13;10606:82;;;10610:3;;;10161:543;;;:::o;10940:1464::-;11066:3;11060:10;11093:18;11085:6;11082:30;11079:56;;;11115:18;;:::i;:::-;11144:97;11234:6;11194:38;11226:4;11220:11;11194:38;:::i;:::-;11188:4;11144:97;:::i;:::-;11296:4;;11353:2;11342:14;;11370:1;11365:782;;;;12191:1;12208:6;12205:89;;;-1:-1:-1;12260:19:1;;;12254:26;12205:89;10846:66;10837:1;10833:11;;;10829:84;10825:89;10815:100;10921:1;10917:11;;;10812:117;12307:81;;11335:1063;;11365:782;10108:1;10101:14;;;10145:4;10132:18;;11413:66;11401:79;;;11578:236;11592:7;11589:1;11586:14;11578:236;;;11681:19;;;11675:26;11660:42;;11773:27;;;;11741:1;11729:14;;;;11608:19;;11578:236;;;11582:3;11842:6;11833:7;11830:19;11827:261;;;11903:19;;;11897:26;12004:66;11986:1;11982:14;;;11998:3;11978:24;11974:97;11970:102;11955:118;11940:134;;11827:261;-1:-1:-1;;;;;12134:1:1;12118:14;;;12114:22;12101:36;;-1:-1:-1;10940:1464:1:o;12608:128::-;12675:9;;;12696:11;;;12693:37;;;12710:18;;:::i;12741:168::-;12814:9;;;12845;;12862:15;;;12856:22;;12842:37;12832:71;;12883:18;;:::i;12914:274::-;12954:1;12980;12970:189;;13015:77;13012:1;13005:88;13116:4;13113:1;13106:15;13144:4;13141:1;13134:15;12970:189;-1:-1:-1;13173:9:1;;12914:274::o;13193:251::-;13263:6;13316:2;13304:9;13295:7;13291:23;13287:32;13284:52;;;13332:1;13329;13322:12;13284:52;13364:9;13358:16;13383:31;13408:5;13383:31;:::i;13659:1079::-;13835:3;13864:1;13897:6;13891:13;13927:36;13953:9;13927:36;:::i;:::-;13982:1;13999:17;;;14025:191;;;;14230:1;14225:358;;;;13992:591;;14025:191;14073:66;14062:9;14058:82;14053:3;14046:95;14196:6;14189:14;14182:22;14174:6;14170:35;14165:3;14161:45;14154:52;;14025:191;;14225:358;14256:6;14253:1;14246:17;14286:4;14331;14328:1;14318:18;14358:1;14372:165;14386:6;14383:1;14380:13;14372:165;;;14464:14;;14451:11;;;14444:35;14507:16;;;;14401:10;;14372:165;;;14376:3;;;14566:6;14561:3;14557:16;14550:23;;13992:591;;;;;14614:6;14608:13;14630:68;14689:8;14684:3;14677:4;14669:6;14665:17;14630:68;:::i;:::-;14714:18;;13659:1079;-1:-1:-1;;;;13659:1079:1:o;15155:512::-;15349:4;15378:42;15459:2;15451:6;15447:15;15436:9;15429:34;15511:2;15503:6;15499:15;15494:2;15483:9;15479:18;15472:43;;15551:6;15546:2;15535:9;15531:18;15524:34;15594:3;15589:2;15578:9;15574:18;15567:31;15615:46;15656:3;15645:9;15641:19;15633:6;15615:46;:::i;:::-;15607:54;15155:512;-1:-1:-1;;;;;;15155:512:1:o;15672:249::-;15741:6;15794:2;15782:9;15773:7;15769:23;15765:32;15762:52;;;15810:1;15807;15800:12;15762:52;15842:9;15836:16;15861:30;15885:5;15861:30;:::i
Swarm Source
ipfs://bda40f2f22e6c848351daf799527f5efb3044fdf86f65b6c386bd6e78b0200d1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.