Overview
ETH Balance
0.02 ETH
Eth Value
$53.82 (@ $2,690.88/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17083671 | 495 days ago | IN | 0 ETH | 0.00400201 | ||||
Safe Transfer Fr... | 17022049 | 504 days ago | IN | 0 ETH | 0.00086833 | ||||
Mint | 17022040 | 504 days ago | IN | 0.02 ETH | 0.00354022 | ||||
Withdraw | 17000689 | 507 days ago | IN | 0 ETH | 0.0008585 | ||||
Set Approval For... | 16999445 | 507 days ago | IN | 0 ETH | 0.00118185 | ||||
Set Approval For... | 16996203 | 507 days ago | IN | 0 ETH | 0.00141563 | ||||
Mint | 16970010 | 511 days ago | IN | 0.01 ETH | 0.00228095 | ||||
Safe Transfer Fr... | 16965051 | 512 days ago | IN | 0 ETH | 0.00068378 | ||||
Mint | 16965030 | 512 days ago | IN | 0.03 ETH | 0.00418 | ||||
Mint | 16964924 | 512 days ago | IN | 0.01 ETH | 0.00161256 | ||||
Set Approval For... | 16963838 | 512 days ago | IN | 0 ETH | 0.00116185 | ||||
Mint | 16963811 | 512 days ago | IN | 0.01 ETH | 0.00189417 | ||||
Set Approval For... | 16963673 | 512 days ago | IN | 0 ETH | 0.00128278 | ||||
Mint | 16963641 | 512 days ago | IN | 0.02 ETH | 0.00305523 | ||||
Mint | 16963628 | 512 days ago | IN | 0.01 ETH | 0.00198409 | ||||
Mint | 16963294 | 512 days ago | IN | 0.01 ETH | 0.00206145 | ||||
Mint | 16963180 | 512 days ago | IN | 0.01 ETH | 0.00176611 | ||||
Mint | 16963140 | 512 days ago | IN | 0.02 ETH | 0.00309101 | ||||
Mint | 16960573 | 512 days ago | IN | 0.01 ETH | 0.0018068 | ||||
Mint | 16960542 | 512 days ago | IN | 0.02 ETH | 0.00362513 | ||||
0x60806040 | 16882075 | 523 days ago | IN | 0 ETH | 0.06517307 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17000689 | 507 days ago | 0.16 ETH |
Loading...
Loading
Contract Name:
UFOS
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // 000000000 UUUUUUUU UUUUUUUUFFFFFFFFFFFFFFFFFFFFFF OOOOOOOOO SSSSSSSSSSSSSSS // 00:::::::::00 U::::::U U::::::UF::::::::::::::::::::F OO:::::::::OO SS:::::::::::::::S //00:::::::::::::00 U::::::U U::::::UF::::::::::::::::::::F OO:::::::::::::OO S:::::SSSSSS::::::S //0:::::::000:::::::0 UU:::::U U:::::UUFF::::::FFFFFFFFF::::FO:::::::OOO:::::::OS:::::S SSSSSSS //0::::::0 0::::::0xxxxxxx xxxxxxxU:::::U U:::::U F:::::F FFFFFFO::::::O O::::::OS:::::S //0:::::0 0:::::0 x:::::x x:::::x U:::::D D:::::U F:::::F O:::::O O:::::OS:::::S //0:::::0 0:::::0 x:::::x x:::::x U:::::D D:::::U F::::::FFFFFFFFFF O:::::O O:::::O S::::SSSS //0:::::0 000 0:::::0 x:::::xx:::::x U:::::D D:::::U F:::::::::::::::F O:::::O O:::::O SS::::::SSSSS //0:::::0 000 0:::::0 x::::::::::x U:::::D D:::::U F:::::::::::::::F O:::::O O:::::O SSS::::::::SS //0:::::0 0:::::0 x::::::::x U:::::D D:::::U F::::::FFFFFFFFFF O:::::O O:::::O SSSSSS::::S //0:::::0 0:::::0 x::::::::x U:::::D D:::::U F:::::F O:::::O O:::::O S:::::S //0::::::0 0::::::0 x::::::::::x U::::::U U::::::U F:::::F O::::::O O::::::O S:::::S //0:::::::000:::::::0 x:::::xx:::::x U:::::::UUU:::::::U FF:::::::FF O:::::::OOO:::::::OSSSSSSS S:::::S //00:::::::::::::00 x:::::x x:::::x UU:::::::::::::UU F::::::::FF OO:::::::::::::OO S::::::SSSSSS:::::S // 00:::::::::00 x:::::x x:::::x UU:::::::::UU F::::::::FF OO:::::::::OO S:::::::::::::::SS // 000000000 xxxxxxx xxxxxxx UUUUUUUUU FFFFFFFFFFF OOOOOOOOO SSSSSSSSSSSSSSS //Fully Generated on Chain Animated UFO NFTs @0xUFOs pragma solidity ^0.8.19; import "../lib/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./IUFOIdentifier.sol"; import "../extension/Royalty.sol"; import "../extension/DefaultOperatorFilterer.sol"; import "../extension/ContractMetadata.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; contract UFOS is ERC721Enumerable, ContractMetadata, Royalty, ReentrancyGuard, Ownable, DefaultOperatorFilterer { event SeedUpdated(uint256 indexed tokenId, uint256 seed); event MintPublicSale(address indexed minter, uint256 indexed tokens); event ReserveTokens(uint256 indexed tokens); event MintPreSale(address indexed minter, uint256 indexed tokens); event SetPreSaleMerkleRoot(bytes32 indexed root); event SetSaleState(SaleState indexed state); mapping(uint256 => uint256) internal seeds; mapping(address => uint256) public preSaleMintCounts; uint256 public MAX_TOTAL_SUPPLY = 851; uint256 public numReservedTokens; uint256 public constant MAX_RESERVE_TOKENS = 0; uint256 public constant MAX_PRE_SALE_MINTS = 1; uint256 public PRE_SALE_PRICE = 0 ether; uint256 public PUBLIC_SALE_PRICE = 0.01 ether; uint256 nextTokenId = _owners.length; IUFOIdentifier public identifier; address public vault; bool public canUpdateSeed = true; string public provenanceHash; bytes32 private preSaleListMerkleRoot; enum SaleState { Inactive, PreSale, PublicSale } SaleState public saleState = SaleState.PublicSale; constructor( IUFOIdentifier newIdentifier, address _vault, string memory _name, string memory _symbol, address _royaltyRecipient, uint128 _royaltyBps ) ERC721(_name, _symbol) { _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); _setOperatorRestriction(true); identifier = newIdentifier; vault = _vault; } modifier preSaleActive() { require(saleState == SaleState.PreSale, "Pre sale is not open"); _; } modifier publicSaleActive() { require(saleState == SaleState.PublicSale, "Public sale is not open"); _; } modifier maxTokensPerPreSaleMint(uint256 numberOfTokens) { require( preSaleMintCounts[msg.sender] + numberOfTokens <= MAX_PRE_SALE_MINTS, "Exceeds pre sale mint max number" ); _; } modifier canMint(uint256 numberOfTokens) { require( nextTokenId + numberOfTokens <= MAX_TOTAL_SUPPLY - MAX_RESERVE_TOKENS + numReservedTokens, "Insufficient UFOs remaining" ); _; } modifier canReserveTokens(uint256 numberOfTokens) { require( numReservedTokens + numberOfTokens <= MAX_RESERVE_TOKENS, "Insufficient token reserve" ); require( nextTokenId + numberOfTokens <= MAX_TOTAL_SUPPLY, "Insufficient tokens remaining" ); _; } modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) { require( price * numberOfTokens == msg.value, "Incorrect ETH value sent" ); _; } modifier hasAddresses(address[] calldata addresses) { require(addresses.length > 0, "Addresses array empty"); _; } modifier isValidPreSaleAddress(bytes32[] calldata merkleProof) { require( MerkleProof.verify( merkleProof, preSaleListMerkleRoot, keccak256(abi.encodePacked(msg.sender)) ), "Address not in list" ); _; } modifier isExistingToken(uint256 tokenId) { require(_exists(tokenId), "Non-existent token"); _; } /*////////////////////////////////////////////////////////////// ERC165 Logic //////////////////////////////////////////////////////////////*/ /// @dev See ERC165: https://eips.ethereum.org/EIPS/eip-165 function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC721Metadata interfaceId == type(IERC2981).interfaceId; // ERC165 ID for ERC2981 } /// @notice Returns whether a given address is the owner, or approved to transfer an NFT. function isApprovedOrOwner(address _operator, uint256 _tokenId) public view virtual returns (bool isApprovedOrOwnerOf) { address owner = ownerOf(_tokenId); isApprovedOrOwnerOf = (_operator == owner || isApprovedForAll(owner, _operator) || getApproved(_tokenId) == _operator); } /*////////////////////////////////////////////////////////////// ERC-721 overrides //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public virtual override(ERC721, IERC721) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom( address from, address to, uint256 tokenId ) public virtual override(ERC721, IERC721) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override(ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override(ERC721, IERC721) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } /*////////////////////////////////////////////////////////////// Mint Functions //////////////////////////////////////////////////////////////*/ function mint(uint32 numberOfTokens) external payable nonReentrant publicSaleActive isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens) canMint(numberOfTokens) { for (uint32 i = 0; i < numberOfTokens; i++) { seeds[nextTokenId] = generateSeed(nextTokenId); _mint(_msgSender(), nextTokenId); nextTokenId++; } } function mintPreSale(uint32 numberOfTokens, bytes32[] calldata merkleProof) external payable nonReentrant preSaleActive isCorrectPayment(PRE_SALE_PRICE, numberOfTokens) canMint(numberOfTokens) isValidPreSaleAddress(merkleProof) maxTokensPerPreSaleMint(numberOfTokens) { preSaleMintCounts[msg.sender] = preSaleMintCounts[msg.sender] + numberOfTokens; for (uint32 i = 0; i < numberOfTokens; i++) { seeds[nextTokenId] = generateSeed(nextTokenId); _mint(_msgSender(), nextTokenId); nextTokenId++; } emit MintPreSale(msg.sender, numberOfTokens); } function burn(uint256 tokenId) public { require(_isApprovedOrOwner(_msgSender(), tokenId), "Not approved to burn."); delete seeds[tokenId]; _burn(tokenId); } function getSeed(uint256 tokenId) public view returns (uint256) { require(_exists(tokenId), "UFO does not exist."); return seeds[tokenId]; } function tokenURI(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), "UFO does not exist."); uint256 seed = seeds[tokenId]; return identifier.tokenURI(tokenId, seed); } function generateSeed(uint256 tokenId) private view returns (uint256) { uint256 r = random(tokenId); uint256 domeSeed = 100 * (r % 11 + 10) + ((r >> 48) % 20 + 10); uint256 hullSeed = 100 * ((r >> 96) % 11 + 10) + ((r >> 96) % 20 + 10); uint256 powercoreSeed = 100 * ((r >> 144) % 11 + 10) + ((r >> 144) % 20 + 10); uint256 propulsionSeed = 100 * ((r >> 192) % 7 + 10) + ((r >> 192) % 20 + 10); return 10000 * (10000 * (10000 * domeSeed + hullSeed) + powercoreSeed) + propulsionSeed; } function random(uint256 tokenId) private view returns (uint256 pseudoRandomness) { pseudoRandomness = uint256( keccak256(abi.encodePacked(blockhash(block.number - 1), tokenId)) ); return pseudoRandomness; } /*////////////////////////////////////////////////////////////// Owner Only Functions //////////////////////////////////////////////////////////////*/ function setPublicSaleActive() external onlyOwner { saleState = SaleState.PublicSale; emit SetSaleState(SaleState.PublicSale); } function setPreSaleActive() external onlyOwner { saleState = SaleState.PreSale; emit SetSaleState(SaleState.PreSale); } function setSaleInactive() external onlyOwner { saleState = SaleState.Inactive; emit SetSaleState(SaleState.Inactive); } function setPreSaleListMerkleRoot(bytes32 merkleRoot) external onlyOwner { preSaleListMerkleRoot = merkleRoot; emit SetPreSaleMerkleRoot(merkleRoot); } function setIdentifier (IUFOIdentifier newIdentifier) external onlyOwner { identifier = newIdentifier; } function withdraw() external onlyOwner { (bool success,) = vault.call{value: address(this).balance}(""); require(success, "Withdrawal failed"); } function updateSeed(uint256 tokenId, uint256 seed) external onlyOwner { require(canUpdateSeed, "Update Seed is False"); seeds[tokenId] = seed; emit SeedUpdated(tokenId, seed); } function disableSeedUpdate() external onlyOwner { canUpdateSeed = false; } function setCost(uint256 _cost) public onlyOwner { PUBLIC_SALE_PRICE = _cost; } function setPresaleCost(uint256 _PreCost) public onlyOwner { PRE_SALE_PRICE = _PreCost; } function _canSetRoyaltyInfo() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @dev Returns whether operator restriction can be set in the given execution context. function _canSetOperatorRestriction() internal virtual override returns (bool) { return msg.sender == owner(); } function _canSetContractURI() internal view virtual override returns (bool) { return msg.sender == owner(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "./interface/IContractMetadata.sol"; /** * @title Contract Metadata * @notice Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ abstract contract ContractMetadata is IContractMetadata { /// @notice Returns the contract metadata URI. string public override contractURI; /** * @notice Lets a contract admin set the URI for contract-level metadata. * @dev Caller should be authorized to setup contractURI, e.g. contract admin. * See {_canSetContractURI}. * Emits {ContractURIUpdated Event}. * * @param _uri keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function setContractURI(string memory _uri) external override { if (!_canSetContractURI()) { revert("Not authorized"); } _setupContractURI(_uri); } /// @dev Lets a contract admin set the URI for contract-level metadata. function _setupContractURI(string memory _uri) internal { string memory prevURI = contractURI; contractURI = _uri; emit ContractURIUpdated(prevURI, _uri); } /// @dev Returns whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view virtual returns (bool); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb import { OperatorFilterer } from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "./interface/IRoyalty.sol"; /** * @title Royalty * @notice Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic * that uses information about royalty fees, if desired. * * @dev The `Royalty` contract is ERC2981 compliant. */ abstract contract Royalty is IRoyalty { /// @dev The (default) address that receives all royalty value. address private royaltyRecipient; /// @dev The (default) % of a sale to take as royalty (in basis points). uint16 private royaltyBps; /// @dev Token ID => royalty recipient and bps for token mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken; /** * @notice View royalty info for a given token and sale price. * @dev Returns royalty amount and recipient for `tokenId` and `salePrice`. * @param tokenId The tokenID of the NFT for which to query royalty info. * @param salePrice Sale price of the token. * * @return receiver Address of royalty recipient account. * @return royaltyAmount Royalty amount calculated at current royaltyBps value. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view virtual override returns (address receiver, uint256 royaltyAmount) { (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId); receiver = recipient; royaltyAmount = (salePrice * bps) / 10_000; } /** * @notice View royalty info for a given token. * @dev Returns royalty recipient and bps for `_tokenId`. * @param _tokenId The tokenID of the NFT for which to query royalty info. */ function getRoyaltyInfoForToken(uint256 _tokenId) public view override returns (address, uint16) { RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId]; return royaltyForToken.recipient == address(0) ? (royaltyRecipient, uint16(royaltyBps)) : (royaltyForToken.recipient, uint16(royaltyForToken.bps)); } /** * @notice Returns the defualt royalty recipient and BPS for this contract's NFTs. */ function getDefaultRoyaltyInfo() external view override returns (address, uint16) { return (royaltyRecipient, uint16(royaltyBps)); } /** * @notice Updates default royalty recipient and bps. * @dev Caller should be authorized to set royalty info. * See {_canSetRoyaltyInfo}. * Emits {DefaultRoyalty Event}; See {_setupDefaultRoyaltyInfo}. * * @param _royaltyRecipient Address to be set as default royalty recipient. * @param _royaltyBps Updated royalty bps. */ function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external override { if (!_canSetRoyaltyInfo()) { revert("Not authorized"); } _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps); } /// @dev Lets a contract admin update the default royalty recipient and bps. function _setupDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) internal { if (_royaltyBps > 10_000) { revert("Exceeds max bps"); } royaltyRecipient = _royaltyRecipient; royaltyBps = uint16(_royaltyBps); emit DefaultRoyalty(_royaltyRecipient, _royaltyBps); } /** * @notice Updates default royalty recipient and bps for a particular token. * @dev Sets royalty info for `_tokenId`. Caller should be authorized to set royalty info. * See {_canSetRoyaltyInfo}. * Emits {RoyaltyForToken Event}; See {_setupRoyaltyInfoForToken}. * * @param _recipient Address to be set as royalty recipient for given token Id. * @param _bps Updated royalty bps for the token Id. */ function setRoyaltyInfoForToken( uint256 _tokenId, address _recipient, uint256 _bps ) external override { if (!_canSetRoyaltyInfo()) { revert("Not authorized"); } _setupRoyaltyInfoForToken(_tokenId, _recipient, _bps); } /// @dev Lets a contract admin set the royalty recipient and bps for a particular token Id. function _setupRoyaltyInfoForToken( uint256 _tokenId, address _recipient, uint256 _bps ) internal { if (_bps > 10_000) { revert("Exceeds max bps"); } royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps }); emit RoyaltyForToken(_tokenId, _recipient, _bps); } /// @dev Returns whether royalty info can be set in the given execution context. function _canSetRoyaltyInfo() internal view virtual returns (bool); }
// SPDX-License-Identifier: MIT // 000000000 UUUUUUUU UUUUUUUUFFFFFFFFFFFFFFFFFFFFFF OOOOOOOOO SSSSSSSSSSSSSSS // 00:::::::::00 U::::::U U::::::UF::::::::::::::::::::F OO:::::::::OO SS:::::::::::::::S //00:::::::::::::00 U::::::U U::::::UF::::::::::::::::::::F OO:::::::::::::OO S:::::SSSSSS::::::S //0:::::::000:::::::0 UU:::::U U:::::UUFF::::::FFFFFFFFF::::FO:::::::OOO:::::::OS:::::S SSSSSSS //0::::::0 0::::::0xxxxxxx xxxxxxxU:::::U U:::::U F:::::F FFFFFFO::::::O O::::::OS:::::S //0:::::0 0:::::0 x:::::x x:::::x U:::::D D:::::U F:::::F O:::::O O:::::OS:::::S //0:::::0 0:::::0 x:::::x x:::::x U:::::D D:::::U F::::::FFFFFFFFFF O:::::O O:::::O S::::SSSS //0:::::0 000 0:::::0 x:::::xx:::::x U:::::D D:::::U F:::::::::::::::F O:::::O O:::::O SS::::::SSSSS //0:::::0 000 0:::::0 x::::::::::x U:::::D D:::::U F:::::::::::::::F O:::::O O:::::O SSS::::::::SS //0:::::0 0:::::0 x::::::::x U:::::D D:::::U F::::::FFFFFFFFFF O:::::O O:::::O SSSSSS::::S //0:::::0 0:::::0 x::::::::x U:::::D D:::::U F:::::F O:::::O O:::::O S:::::S //0::::::0 0::::::0 x::::::::::x U::::::U U::::::U F:::::F O::::::O O::::::O S:::::S //0:::::::000:::::::0 x:::::xx:::::x U:::::::UUU:::::::U FF:::::::FF O:::::::OOO:::::::OSSSSSSS S:::::S //00:::::::::::::00 x:::::x x:::::x UU:::::::::::::UU F::::::::FF OO:::::::::::::OO S::::::SSSSSS:::::S // 00:::::::::00 x:::::x x:::::x UU:::::::::UU F::::::::FF OO:::::::::OO S:::::::::::::::SS // 000000000 xxxxxxx xxxxxxx UUUUUUUUU FFFFFFFFFFF OOOOOOOOO SSSSSSSSSSSSSSS // 10,000 Fully Generated on Chain Animated UFO NFTs @0xUFOs pragma solidity ^0.8.13; interface IUFOIdentifier { function tokenURI(uint256 tokenId, uint256 seed) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "./ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function totalSupply() public view virtual override returns (uint256) { uint256 count; for (uint256 i; i < _owners.length;) { if (_owners[i] != address(0)) { unchecked { ++count; } } unchecked { ++i; } } return count; } function tokenByIndex(uint256 index) public view virtual override returns (uint256 tokenId) { require(index < _owners.length, "ERC721Enumerable: global index out of bounds"); return index; } function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint256 count; for(uint256 i; i < _owners.length;){ if(owner == _owners[i]) { if(count == index) return i; else { unchecked { ++count; } } } unchecked { ++i; } } revert("ERC721Enumerable: owner index out of bounds"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "./Address.sol"; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private _name; string private _symbol; address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); uint256 count; for (uint256 i; i < _owners.length;) { if (owner == _owners[i]) { unchecked { ++count; } } unchecked { ++i; } } return count; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: invalid token ID"); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public virtual override { require(_msgSender() != operator, "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom(address from, address to, uint256 tokenId) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } function _exists(uint256 tokenId) internal view virtual returns (bool) { return tokenId < _owners.length && _owners[tokenId] != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } function _mint(address to, uint256 tokenId) internal virtual { require(!_exists(tokenId), "ERC721: token already minted"); _owners.push(to); emit Transfer(address(0), to, tokenId); } function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); delete _tokenApprovals[tokenId]; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } return true; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb import "../../eip/interface/IERC2981.sol"; /** * Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading * the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic * that uses information about royalty fees, if desired. * * The `Royalty` contract is ERC2981 compliant. */ interface IRoyalty is IERC2981 { struct RoyaltyInfo { address recipient; uint256 bps; } /// @dev Returns the royalty recipient and fee bps. function getDefaultRoyaltyInfo() external view returns (address, uint16); /// @dev Lets a module admin update the royalty bps and recipient. function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external; /// @dev Lets a module admin set the royalty recipient for a particular token Id. function setRoyaltyInfoForToken( uint256 tokenId, address recipient, uint256 bps ) external; /// @dev Returns the royalty recipient for a particular token Id. function getRoyaltyInfoForToken(uint256 tokenId) external view returns (address, uint16); /// @dev Emitted when royalty info is updated. event DefaultRoyalty(address indexed newRoyaltyRecipient, uint256 newRoyaltyBps); /// @dev Emitted when royalty recipient for tokenId is set event RoyaltyForToken(uint256 indexed tokenId, address indexed royaltyRecipient, uint256 royaltyBps); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb import "./interface/IOperatorFilterRegistry.sol"; import "./OperatorFilterToggle.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer is OperatorFilterToggle { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (operatorRestriction) { if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ interface IContractMetadata { /// @dev Returns the metadata URI of the contract. function contractURI() external view returns (string memory); /** * @dev Sets contract URI for the storefront-level metadata of the contract. * Only module admin can call this function. */ function setContractURI(string calldata _uri) external; /// @dev Emitted when the contract URI is updated. event ContractURIUpdated(string prevURI, string newURI); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; library Address { function isContract(address account) internal view returns (bool) { uint size; assembly { size := extcodesize(account) } return size > 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * 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. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb import "./interface/IOperatorFilterToggle.sol"; abstract contract OperatorFilterToggle is IOperatorFilterToggle { bool public operatorRestriction; function setOperatorRestriction(bool _restriction) external { require(_canSetOperatorRestriction(), "Not authorized to set operator restriction."); _setOperatorRestriction(_restriction); } function _setOperatorRestriction(bool _restriction) internal { operatorRestriction = _restriction; emit OperatorRestriction(_restriction); } function _canSetOperatorRestriction() internal virtual returns (bool); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator( address registrant, address operator, bool filtered ) external; function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// SPDX-License-Identifier: Apache 2.0 pragma solidity ^0.8.0; /// @author thirdweb interface IOperatorFilterToggle { event OperatorRestriction(bool restriction); function operatorRestriction() external view returns (bool); function setOperatorRestriction(bool restriction) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IUFOIdentifier","name":"newIdentifier","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint128","name":"_royaltyBps","type":"uint128"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRoyaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"DefaultRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"MintPreSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"MintPublicSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"restriction","type":"bool"}],"name":"OperatorRestriction","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":"uint256","name":"tokens","type":"uint256"}],"name":"ReserveTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyBps","type":"uint256"}],"name":"RoyaltyForToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"}],"name":"SeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"SetPreSaleMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"enum UFOS.SaleState","name":"state","type":"uint8"}],"name":"SetSaleState","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"},{"inputs":[],"name":"MAX_PRE_SALE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVE_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRE_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canUpdateSeed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableSeedUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultRoyaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRoyaltyInfoForToken","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"identifier","outputs":[{"internalType":"contract IUFOIdentifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"isApprovedOrOwnerOf","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"numberOfTokens","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"numberOfTokens","type":"uint32"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorRestriction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preSaleMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleState","outputs":[{"internalType":"enum UFOS.SaleState","name":"","type":"uint8"}],"stateMutability":"view","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":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"}],"name":"setDefaultRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUFOIdentifier","name":"newIdentifier","type":"address"}],"name":"setIdentifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_restriction","type":"bool"}],"name":"setOperatorRestriction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPreSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setPreSaleListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_PreCost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_bps","type":"uint256"}],"name":"setRoyaltyInfoForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSaleInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"updateSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610353600c556000600e55662386f26fc10000600f556002805490506010556001601260146101000a81548160ff0219169083151502179055506002601560006101000a81548160ff02191690836002811115620000675762000066620005df565b5b02179055503480156200007957600080fd5b5060405162006a5538038062006a5583398181016040528101906200009f919062000898565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600185858160009081620000c9919062000bbd565b508060019081620000db919062000bbd565b505050600160088190555062000106620000fa620003c160201b60201c565b620003c960201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002fb578015620001c1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200018792919062000cb5565b600060405180830381600087803b158015620001a257600080fd5b505af1158015620001b7573d6000803e3d6000fd5b50505050620002fa565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200027b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200024192919062000cb5565b600060405180830381600087803b1580156200025c57600080fd5b505af115801562000271573d6000803e3d6000fd5b50505050620002f9565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002c4919062000ce2565b600060405180830381600087803b158015620002df57600080fd5b505af1158015620002f4573d6000803e3d6000fd5b505050505b5b5b50506200032182826fffffffffffffffffffffffffffffffff166200048f60201b60201c565b6200033360016200058960201b60201c565b85601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505062000dea565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710811115620004d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ce9062000d60565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660146101000a81548161ffff021916908361ffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb826040516200057d919062000d93565b60405180910390a25050565b80600960146101000a81548160ff0219169083151502179055507f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba7809681604051620005d4919062000dcd565b60405180910390a150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200064f8262000622565b9050919050565b6000620006638262000642565b9050919050565b620006758162000656565b81146200068157600080fd5b50565b60008151905062000695816200066a565b92915050565b620006a68162000642565b8114620006b257600080fd5b50565b600081519050620006c6816200069b565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200072182620006d6565b810181811067ffffffffffffffff82111715620007435762000742620006e7565b5b80604052505050565b6000620007586200060e565b905062000766828262000716565b919050565b600067ffffffffffffffff821115620007895762000788620006e7565b5b6200079482620006d6565b9050602081019050919050565b60005b83811015620007c1578082015181840152602081019050620007a4565b60008484015250505050565b6000620007e4620007de846200076b565b6200074c565b905082815260208101848484011115620008035762000802620006d1565b5b62000810848285620007a1565b509392505050565b600082601f83011262000830576200082f620006cc565b5b815162000842848260208601620007cd565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b62000872816200084b565b81146200087e57600080fd5b50565b600081519050620008928162000867565b92915050565b60008060008060008060c08789031215620008b857620008b762000618565b5b6000620008c889828a0162000684565b9650506020620008db89828a01620006b5565b955050604087015167ffffffffffffffff811115620008ff57620008fe6200061d565b5b6200090d89828a0162000818565b945050606087015167ffffffffffffffff8111156200093157620009306200061d565b5b6200093f89828a0162000818565b93505060806200095289828a01620006b5565b92505060a06200096589828a0162000881565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009c557607f821691505b602082108103620009db57620009da6200097d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000a457fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a06565b62000a51868362000a06565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000a9e62000a9862000a928462000a69565b62000a73565b62000a69565b9050919050565b6000819050919050565b62000aba8362000a7d565b62000ad262000ac98262000aa5565b84845462000a13565b825550505050565b600090565b62000ae962000ada565b62000af681848462000aaf565b505050565b5b8181101562000b1e5762000b1260008262000adf565b60018101905062000afc565b5050565b601f82111562000b6d5762000b3781620009e1565b62000b4284620009f6565b8101602085101562000b52578190505b62000b6a62000b6185620009f6565b83018262000afb565b50505b505050565b600082821c905092915050565b600062000b926000198460080262000b72565b1980831691505092915050565b600062000bad838362000b7f565b9150826002028217905092915050565b62000bc88262000972565b67ffffffffffffffff81111562000be45762000be3620006e7565b5b62000bf08254620009ac565b62000bfd82828562000b22565b600060209050601f83116001811462000c35576000841562000c20578287015190505b62000c2c858262000b9f565b86555062000c9c565b601f19841662000c4586620009e1565b60005b8281101562000c6f5784890151825560018201915060208501945060208101905062000c48565b8683101562000c8f578489015162000c8b601f89168262000b7f565b8355505b6001600288020188555050505b505050505050565b62000caf8162000642565b82525050565b600060408201905062000ccc600083018562000ca4565b62000cdb602083018462000ca4565b9392505050565b600060208201905062000cf9600083018462000ca4565b92915050565b600082825260208201905092915050565b7f45786365656473206d6178206270730000000000000000000000000000000000600082015250565b600062000d48600f8362000cff565b915062000d558262000d10565b602082019050919050565b6000602082019050818103600083015262000d7b8162000d39565b9050919050565b62000d8d8162000a69565b82525050565b600060208201905062000daa600083018462000d82565b92915050565b60008115159050919050565b62000dc78162000db0565b82525050565b600060208201905062000de4600083018462000dbc565b92915050565b615c5b8062000dfa6000396000f3fe60806040526004361061036b5760003560e01c8063600dd5ea116101c65780639dd85f17116100f7578063c87b56dd11610095578063e8a3d4851161006f578063e8a3d48514610c53578063e985e9c514610c7e578063f2fde38b14610cbb578063fbfa77cf14610ce45761036b565b8063c87b56dd14610bb0578063dea4775214610bed578063e0d4ea3714610c165761036b565b8063af42d82d116100d1578063af42d82d14610b07578063b24f2d3914610b30578063b88d4fde14610b5c578063c6ab67a314610b855761036b565b80639dd85f1714610a97578063a22cb46514610ac2578063a71bbebe14610aeb5761036b565b806385e863e5116101645780638fdcf9421161013e5780638fdcf942146109f1578063938e3d7b14610a1a57806395d89b4114610a435780639bcf7a1514610a6e5761036b565b806385e863e51461096d5780638a8fe819146109895780638da5cb5b146109c65761036b565b806363ff5e17116101a057806363ff5e17146108c357806370a08231146108ee578063715018a61461092b5780637998a1c4146109425761036b565b8063600dd5ea14610832578063603f4d521461085b5780636352211e146108865761036b565b806332f0cd64116102a057806342842e0e1161023e57806344a0d68a1161021857806344a0d68a146107635780634cc157df1461078c5780634f6ccce7146107ca578063504c6e01146108075761036b565b806342842e0e146106d457806342966c68146106fd578063430c2081146107265761036b565b80633bb2c9381161027a5780633bb2c938146106645780633ccfd60b1461067b5780633e11ab3f1461069257806341f43434146106a95761036b565b806332f0cd64146105e557806333039d3d1461060e57806333101e1f146106395761036b565b8063176b72b41161030d57806320fe418a116102e757806320fe418a1461052a57806323b872dd146105415780632a55205a1461056a5780632f745c59146105a85761036b565b8063176b72b4146104ab57806318160ddd146104d4578063193402bb146104ff5761036b565b8063081812fc11610349578063081812fc14610403578063095ea7b3146104405780630cd6fba91461046957806311e3dbca146104805761036b565b806301ffc9a71461037057806306fdde03146103ad57806307e89ec0146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613bae565b610d0f565b6040516103a49190613bf6565b60405180910390f35b3480156103b957600080fd5b506103c2610e09565b6040516103cf9190613ca1565b60405180910390f35b3480156103e457600080fd5b506103ed610e9b565b6040516103fa9190613cdc565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613d23565b610ea1565b6040516104379190613d91565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613dd8565b610f26565b005b34801561047557600080fd5b5061047e610f3f565b005b34801561048c57600080fd5b50610495610fb4565b6040516104a29190613cdc565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613e18565b610fba565b005b3480156104e057600080fd5b506104e9611065565b6040516104f69190613cdc565b60405180910390f35b34801561050b57600080fd5b50610514611104565b6040516105219190613cdc565b60405180910390f35b34801561053657600080fd5b5061053f61110a565b005b34801561054d57600080fd5b5061056860048036038101906105639190613e58565b61117f565b005b34801561057657600080fd5b50610591600480360381019061058c9190613e18565b6111ce565b60405161059f929190613eab565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613dd8565b61120c565b6040516105dc9190613cdc565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613f00565b61133f565b005b34801561061a57600080fd5b50610623611392565b6040516106309190613cdc565b60405180910390f35b34801561064557600080fd5b5061064e611398565b60405161065b9190613bf6565b60405180910390f35b34801561067057600080fd5b506106796113ab565b005b34801561068757600080fd5b506106906113d0565b005b34801561069e57600080fd5b506106a76114a9565b005b3480156106b557600080fd5b506106be61151d565b6040516106cb9190613f8c565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190613e58565b61152f565b005b34801561070957600080fd5b50610724600480360381019061071f9190613d23565b61157e565b005b34801561073257600080fd5b5061074d60048036038101906107489190613dd8565b6115f1565b60405161075a9190613bf6565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613d23565b611686565b005b34801561079857600080fd5b506107b360048036038101906107ae9190613d23565b611698565b6040516107c1929190613fc4565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613d23565b6117a3565b6040516107fe9190613cdc565b60405180910390f35b34801561081357600080fd5b5061081c6117f4565b6040516108299190613bf6565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613dd8565b611807565b005b34801561086757600080fd5b5061087061185c565b60405161087d9190614064565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a89190613d23565b61186f565b6040516108ba9190613d91565b60405180910390f35b3480156108cf57600080fd5b506108d861192b565b6040516108e59190613cdc565b60405180910390f35b3480156108fa57600080fd5b506109156004803603810190610910919061407f565b611930565b6040516109229190613cdc565b60405180910390f35b34801561093757600080fd5b50610940611a3e565b005b34801561094e57600080fd5b50610957611a52565b60405161096491906140cd565b60405180910390f35b61098760048036038101906109829190614189565b611a78565b005b34801561099557600080fd5b506109b060048036038101906109ab919061407f565b611e74565b6040516109bd9190613cdc565b60405180910390f35b3480156109d257600080fd5b506109db611e8c565b6040516109e89190613d91565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613d23565b611eb6565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190614319565b611ec8565b005b348015610a4f57600080fd5b50610a58611f1b565b604051610a659190613ca1565b60405180910390f35b348015610a7a57600080fd5b50610a956004803603810190610a909190614362565b611fad565b005b348015610aa357600080fd5b50610aac612004565b604051610ab99190613cdc565b60405180910390f35b348015610ace57600080fd5b50610ae96004803603810190610ae491906143b5565b612009565b005b610b056004803603810190610b0091906143f5565b612022565b005b348015610b1357600080fd5b50610b2e6004803603810190610b299190614458565b6121f0565b005b348015610b3c57600080fd5b50610b4561222f565b604051610b53929190613fc4565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e9190614526565b61226e565b005b348015610b9157600080fd5b50610b9a6122bf565b604051610ba79190613ca1565b60405180910390f35b348015610bbc57600080fd5b50610bd76004803603810190610bd29190613d23565b61234d565b604051610be49190613ca1565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906145e7565b61245a565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190613d23565b6124a6565b604051610c4a9190613cdc565b60405180910390f35b348015610c5f57600080fd5b50610c6861250b565b604051610c759190613ca1565b60405180910390f35b348015610c8a57600080fd5b50610ca56004803603810190610ca09190614614565b612599565b604051610cb29190613bf6565b60405180910390f35b348015610cc757600080fd5b50610ce26004803603810190610cdd919061407f565b61262d565b005b348015610cf057600080fd5b50610cf96126b0565b604051610d069190613d91565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d6a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d9a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0257507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610e1890614683565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4490614683565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b600f5481565b6000610eac826126d6565b610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290614700565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610f308161275e565b610f3a8383612871565b505050565b610f47612988565b6000601560006101000a81548160ff02191690836002811115610f6d57610f6c613fed565b5b021790555060006002811115610f8657610f85613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b600d5481565b610fc2612988565b601260149054906101000a900460ff16611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061476c565b60405180910390fd5b80600a600084815260200190815260200160002081905550817faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e0826040516110599190613cdc565b60405180910390a25050565b60008060005b6002805490508110156110fc57600073ffffffffffffffffffffffffffffffffffffffff16600282815481106110a4576110a361478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110f1578160010191505b80600101905061106b565b508091505090565b600e5481565b611112612988565b6001601560006101000a81548160ff0219169083600281111561113857611137613fed565b5b02179055506001600281111561115157611150613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111bd576111bc3361275e565b5b6111c8848484612a06565b50505050565b6000806000806111dd86611698565b61ffff169150915081935061271081866111f791906147ea565b611201919061485b565b925050509250929050565b600061121783611930565b8210611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f906148fe565b60405180910390fd5b6000805b6002805490508110156112fd576002818154811061127d5761127c61478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112f2578382036112eb578092505050611339565b8160010191505b80600101905061125c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611330906148fe565b60405180910390fd5b92915050565b611347612a66565b611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614990565b60405180910390fd5b61138f81612aa3565b50565b600c5481565b601260149054906101000a900460ff1681565b6113b3612988565b6000601260146101000a81548160ff021916908315150217905550565b6113d8612988565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611420906149e1565b60006040518083038185875af1925050503d806000811461145d576040519150601f19603f3d011682016040523d82523d6000602084013e611462565b606091505b50509050806114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90614a42565b60405180910390fd5b50565b6114b1612988565b6002601560006101000a81548160ff021916908360028111156114d7576114d6613fed565b5b02179055506002808111156114ef576114ee613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461156d5761156c3361275e565b5b611578848484612af7565b50505050565b61158f611589612b17565b82612b1f565b6115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614aae565b60405180910390fd5b600a6000828152602001908152602001600020600090556115ee81612bb4565b50565b6000806115fd8361186f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061163f575061163e8185612599565b5b8061167d57508373ffffffffffffffffffffffffffffffffffffffff1661166584610ea1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b61168e612988565b80600f8190555050565b6000806000600760008581526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117645780600001518160200151611799565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660149054906101000a900461ffff165b9250925050915091565b600060028054905082106117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614b40565b60405180910390fd5b819050919050565b600960149054906101000a900460ff1681565b61180f612c98565b61184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614bac565b60405180910390fd5b6118588282612cd5565b5050565b601560009054906101000a900460ff1681565b600080600283815481106118865761188561478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614700565b60405180910390fd5b80915050919050565b600081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790614c3e565b60405180910390fd5b6000805b600280549050811015611a3457600281815481106119c5576119c461478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a29578160010191505b8060010190506119a4565b5080915050919050565b611a46612988565b611a506000612dca565b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a80612e90565b60016002811115611a9457611a93613fed565b5b601560009054906101000a900460ff166002811115611ab657611ab5613fed565b5b14611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614caa565b60405180910390fd5b600e548363ffffffff16348183611b0d91906147ea565b14611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4490614d16565b60405180910390fd5b8463ffffffff16600d546000600c54611b669190614d36565b611b709190614d6a565b81601054611b7e9190614d6a565b1115611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690614dea565b60405180910390fd5b8484611c35828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001611c1a9190614e52565b60405160208183030381529060405280519060200120612edf565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90614eb9565b60405180910390fd5b8763ffffffff16600181600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc89190614d6a565b1115611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614f25565b60405180910390fd5b8863ffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a9190614d6a565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8963ffffffff168163ffffffff161015611e1657611dbf601054612ef6565b600a6000601054815260200190815260200160002081905550611deb611de3612b17565b6010546130a5565b60106000815480929190611dfe90614f45565b91905055508080611e0e90614f8d565b915050611da0565b508863ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7ecbc6c2508739b8cb9f4ce243de4345253602f1ea2f8ba5e0ac26f1eecc63aa60405160405180910390a3505050505050611e6f6131b1565b505050565b600b6020528060005260406000206000915090505481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ebe612988565b80600e8190555050565b611ed06131bb565b611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690614bac565b60405180910390fd5b611f18816131f8565b50565b606060018054611f2a90614683565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5690614683565b8015611fa35780601f10611f7857610100808354040283529160200191611fa3565b820191906000526020600020905b815481529060010190602001808311611f8657829003601f168201915b5050505050905090565b611fb5612c98565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90614bac565b60405180910390fd5b611fff8383836132d4565b505050565b600181565b816120138161275e565b61201d83836133ff565b505050565b61202a612e90565b60028081111561203d5761203c613fed565b5b601560009054906101000a900460ff16600281111561205f5761205e613fed565b5b1461209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690615005565b60405180910390fd5b600f548163ffffffff163481836120b691906147ea565b146120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614d16565b60405180910390fd5b8263ffffffff16600d546000600c5461210f9190614d36565b6121199190614d6a565b816010546121279190614d6a565b1115612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90614dea565b60405180910390fd5b60005b8463ffffffff168163ffffffff1610156121e15761218a601054612ef6565b600a60006010548152602001908152602001600020819055506121b66121ae612b17565b6010546130a5565b601060008154809291906121c990614f45565b919050555080806121d990614f8d565b91505061216b565b505050506121ed6131b1565b50565b6121f8612988565b80601481905550807f2965d6e68e4e35cf06fce0f92ff1ee28e7d29bde2bf6b0557d8f22e78171432d60405160405180910390a250565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660149054906101000a900461ffff16915091509091565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122ac576122ab3361275e565b5b6122b88585858561357f565b5050505050565b601380546122cc90614683565b80601f01602080910402602001604051908101604052809291908181526020018280546122f890614683565b80156123455780601f1061231a57610100808354040283529160200191612345565b820191906000526020600020905b81548152906001019060200180831161232857829003601f168201915b505050505081565b6060612358826126d6565b612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90615071565b60405180910390fd5b6000600a6000848152602001908152602001600020549050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d84836040518363ffffffff1660e01b815260040161240c929190615091565b600060405180830381865afa158015612429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612452919061512a565b915050919050565b612462612988565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006124b1826126d6565b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e790615071565b60405180910390fd5b600a6000838152602001908152602001600020549050919050565b6005805461251890614683565b80601f016020809104026020016040519081016040528092919081815260200182805461254490614683565b80156125915780601f1061256657610100808354040283529160200191612591565b820191906000526020600020905b81548152906001019060200180831161257457829003601f168201915b505050505081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612635612988565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b906151e5565b60405180910390fd5b6126ad81612dca565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280549050821080156127575750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106127135761271261478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600960149054906101000a900460ff161561286e5760006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561286d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016127ea929190615205565b602060405180830381865afa158015612807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282b9190615243565b61286c57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016128639190613d91565b60405180910390fd5b5b5b50565b600061287c8261186f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906152e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661290b612b17565b73ffffffffffffffffffffffffffffffffffffffff16148061293a575061293981612934612b17565b612599565b5b612979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297090615374565b60405180910390fd5b61298383836135e1565b505050565b612990612b17565b73ffffffffffffffffffffffffffffffffffffffff166129ae611e8c565b73ffffffffffffffffffffffffffffffffffffffff1614612a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fb906153e0565b60405180910390fd5b565b612a17612a11612b17565b82612b1f565b612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90615472565b60405180910390fd5b612a6183838361369a565b505050565b6000612a70611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b80600960146101000a81548160ff0219169083151502179055507f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba7809681604051612aec9190613bf6565b60405180910390a150565b612b128383836040518060200160405280600081525061226e565b505050565b600033905090565b600080612b2b8361186f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b6d5750612b6c8185612599565b5b80612bab57508373ffffffffffffffffffffffffffffffffffffffff16612b9384610ea1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000612bbf8261186f565b90506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028281548110612c0b57612c0a61478c565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ca2611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b612710811115612d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d11906154de565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660146101000a81548161ffff021916908361ffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb82604051612dbe9190613cdc565b60405180910390a25050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260085403612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc9061554a565b60405180910390fd5b6002600881905550565b600082612eec8584613872565b1490509392505050565b600080612f02836138c8565b90506000600a6014603084901c612f19919061556a565b612f239190614d6a565b600a600b84612f32919061556a565b612f3c9190614d6a565b6064612f4891906147ea565b612f529190614d6a565b90506000600a6014606085901c612f69919061556a565b612f739190614d6a565b600a600b606086901c612f86919061556a565b612f909190614d6a565b6064612f9c91906147ea565b612fa69190614d6a565b90506000600a6014609086901c612fbd919061556a565b612fc79190614d6a565b600a600b609087901c612fda919061556a565b612fe49190614d6a565b6064612ff091906147ea565b612ffa9190614d6a565b90506000600a601460c087901c613011919061556a565b61301b9190614d6a565b600a600760c088901c61302e919061556a565b6130389190614d6a565b606461304491906147ea565b61304e9190614d6a565b90508082848661271061306191906147ea565b61306b9190614d6a565b61271061307891906147ea565b6130829190614d6a565b61271061308f91906147ea565b6130999190614d6a565b95505050505050919050565b6130ae816126d6565b156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e5906155e7565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001600881905550565b60006131c5611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006005805461320790614683565b80601f016020809104026020016040519081016040528092919081815260200182805461323390614683565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b50505050509050816005908161329691906157a9565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516132c892919061587b565b60405180910390a15050565b612710811115613319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613310906154de565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506007600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff16837f7365cf4122f072a3365c20d54eff9b38d73c096c28e1892ec8f5b0e403a0f12d836040516133f29190613cdc565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff1661341e612b17565b73ffffffffffffffffffffffffffffffffffffffff1603613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906158fe565b60405180910390fd5b8060046000613481612b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661352e612b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135739190613bf6565b60405180910390a35050565b61359061358a612b17565b83612b1f565b6135cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c690615472565b60405180910390fd5b6135db8484848461390a565b50505050565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166136548361186f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff166136ba8261186f565b73ffffffffffffffffffffffffffffffffffffffff1614613710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370790615990565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377690615a22565b60405180910390fd5b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600282815481106137ca576137c961478c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b84518110156138bd576138a88286838151811061389b5761389a61478c565b5b6020026020010151613966565b915080806138b590614f45565b91505061387b565b508091505092915050565b60006001436138d79190614d36565b40826040516020016138ea929190615a84565b6040516020818303038152906040528051906020012060001c9050919050565b61391584848461369a565b61392184848484613991565b613960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395790615b22565b60405180910390fd5b50505050565b600081831061397e576139798284613b18565b613989565b6139888383613b18565b5b905092915050565b60006139b28473ffffffffffffffffffffffffffffffffffffffff16613b2f565b15613b0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139db612b17565b8786866040518563ffffffff1660e01b81526004016139fd9493929190615b97565b6020604051808303816000875af1925050508015613a3957506040513d601f19601f82011682018060405250810190613a369190615bf8565b60015b613abb573d8060008114613a69576040519150601f19603f3d011682016040523d82523d6000602084013e613a6e565b606091505b506000815103613ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaa90615b22565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b10565b600190505b949350505050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8b81613b56565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc3613b4c565b5b6000613bd284828501613b99565b91505092915050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c4b578082015181840152602081019050613c30565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c7382613c11565b613c7d8185613c1c565b9350613c8d818560208601613c2d565b613c9681613c57565b840191505092915050565b60006020820190508181036000830152613cbb8184613c68565b905092915050565b6000819050919050565b613cd681613cc3565b82525050565b6000602082019050613cf16000830184613ccd565b92915050565b613d0081613cc3565b8114613d0b57600080fd5b50565b600081359050613d1d81613cf7565b92915050565b600060208284031215613d3957613d38613b4c565b5b6000613d4784828501613d0e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d7b82613d50565b9050919050565b613d8b81613d70565b82525050565b6000602082019050613da66000830184613d82565b92915050565b613db581613d70565b8114613dc057600080fd5b50565b600081359050613dd281613dac565b92915050565b60008060408385031215613def57613dee613b4c565b5b6000613dfd85828601613dc3565b9250506020613e0e85828601613d0e565b9150509250929050565b60008060408385031215613e2f57613e2e613b4c565b5b6000613e3d85828601613d0e565b9250506020613e4e85828601613d0e565b9150509250929050565b600080600060608486031215613e7157613e70613b4c565b5b6000613e7f86828701613dc3565b9350506020613e9086828701613dc3565b9250506040613ea186828701613d0e565b9150509250925092565b6000604082019050613ec06000830185613d82565b613ecd6020830184613ccd565b9392505050565b613edd81613bdb565b8114613ee857600080fd5b50565b600081359050613efa81613ed4565b92915050565b600060208284031215613f1657613f15613b4c565b5b6000613f2484828501613eeb565b91505092915050565b6000819050919050565b6000613f52613f4d613f4884613d50565b613f2d565b613d50565b9050919050565b6000613f6482613f37565b9050919050565b6000613f7682613f59565b9050919050565b613f8681613f6b565b82525050565b6000602082019050613fa16000830184613f7d565b92915050565b600061ffff82169050919050565b613fbe81613fa7565b82525050565b6000604082019050613fd96000830185613d82565b613fe66020830184613fb5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061402d5761402c613fed565b5b50565b600081905061403e8261401c565b919050565b600061404e82614030565b9050919050565b61405e81614043565b82525050565b60006020820190506140796000830184614055565b92915050565b60006020828403121561409557614094613b4c565b5b60006140a384828501613dc3565b91505092915050565b60006140b782613f59565b9050919050565b6140c7816140ac565b82525050565b60006020820190506140e260008301846140be565b92915050565b600063ffffffff82169050919050565b614101816140e8565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261414957614148614124565b5b8235905067ffffffffffffffff81111561416657614165614129565b5b6020830191508360208202830111156141825761418161412e565b5b9250929050565b6000806000604084860312156141a2576141a1613b4c565b5b60006141b08682870161410f565b935050602084013567ffffffffffffffff8111156141d1576141d0613b51565b5b6141dd86828701614133565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422682613c57565b810181811067ffffffffffffffff82111715614245576142446141ee565b5b80604052505050565b6000614258613b42565b9050614264828261421d565b919050565b600067ffffffffffffffff821115614284576142836141ee565b5b61428d82613c57565b9050602081019050919050565b82818337600083830152505050565b60006142bc6142b784614269565b61424e565b9050828152602081018484840111156142d8576142d76141e9565b5b6142e384828561429a565b509392505050565b600082601f830112614300576142ff614124565b5b81356143108482602086016142a9565b91505092915050565b60006020828403121561432f5761432e613b4c565b5b600082013567ffffffffffffffff81111561434d5761434c613b51565b5b614359848285016142eb565b91505092915050565b60008060006060848603121561437b5761437a613b4c565b5b600061438986828701613d0e565b935050602061439a86828701613dc3565b92505060406143ab86828701613d0e565b9150509250925092565b600080604083850312156143cc576143cb613b4c565b5b60006143da85828601613dc3565b92505060206143eb85828601613eeb565b9150509250929050565b60006020828403121561440b5761440a613b4c565b5b60006144198482850161410f565b91505092915050565b6000819050919050565b61443581614422565b811461444057600080fd5b50565b6000813590506144528161442c565b92915050565b60006020828403121561446e5761446d613b4c565b5b600061447c84828501614443565b91505092915050565b600067ffffffffffffffff8211156144a05761449f6141ee565b5b6144a982613c57565b9050602081019050919050565b60006144c96144c484614485565b61424e565b9050828152602081018484840111156144e5576144e46141e9565b5b6144f084828561429a565b509392505050565b600082601f83011261450d5761450c614124565b5b813561451d8482602086016144b6565b91505092915050565b600080600080608085870312156145405761453f613b4c565b5b600061454e87828801613dc3565b945050602061455f87828801613dc3565b935050604061457087828801613d0e565b925050606085013567ffffffffffffffff81111561459157614590613b51565b5b61459d878288016144f8565b91505092959194509250565b60006145b482613d70565b9050919050565b6145c4816145a9565b81146145cf57600080fd5b50565b6000813590506145e1816145bb565b92915050565b6000602082840312156145fd576145fc613b4c565b5b600061460b848285016145d2565b91505092915050565b6000806040838503121561462b5761462a613b4c565b5b600061463985828601613dc3565b925050602061464a85828601613dc3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061469b57607f821691505b6020821081036146ae576146ad614654565b5b50919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146ea601883613c1c565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f55706461746520536565642069732046616c7365000000000000000000000000600082015250565b6000614756601483613c1c565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147f582613cc3565b915061480083613cc3565b925082820261480e81613cc3565b91508282048414831517614825576148246147bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061486682613cc3565b915061487183613cc3565b9250826148815761488061482c565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006148e8602b83613c1c565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4e6f7420617574686f72697a656420746f20736574206f70657261746f72207260008201527f65737472696374696f6e2e000000000000000000000000000000000000000000602082015250565b600061497a602b83613c1c565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b600081905092915050565b50565b60006149cb6000836149b0565b91506149d6826149bb565b600082019050919050565b60006149ec826149be565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614a2c601183613c1c565b9150614a37826149f6565b602082019050919050565b60006020820190508181036000830152614a5b81614a1f565b9050919050565b7f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000600082015250565b6000614a98601583613c1c565b9150614aa382614a62565b602082019050919050565b60006020820190508181036000830152614ac781614a8b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614b2a602c83613c1c565b9150614b3582614ace565b604082019050919050565b60006020820190508181036000830152614b5981614b1d565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614b96600e83613c1c565b9150614ba182614b60565b602082019050919050565b60006020820190508181036000830152614bc581614b89565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c28602983613c1c565b9150614c3382614bcc565b604082019050919050565b60006020820190508181036000830152614c5781614c1b565b9050919050565b7f5072652073616c65206973206e6f74206f70656e000000000000000000000000600082015250565b6000614c94601483613c1c565b9150614c9f82614c5e565b602082019050919050565b60006020820190508181036000830152614cc381614c87565b9050919050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000614d00601883613c1c565b9150614d0b82614cca565b602082019050919050565b60006020820190508181036000830152614d2f81614cf3565b9050919050565b6000614d4182613cc3565b9150614d4c83613cc3565b9250828203905081811115614d6457614d636147bb565b5b92915050565b6000614d7582613cc3565b9150614d8083613cc3565b9250828201905080821115614d9857614d976147bb565b5b92915050565b7f496e73756666696369656e742055464f732072656d61696e696e670000000000600082015250565b6000614dd4601b83613c1c565b9150614ddf82614d9e565b602082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b60008160601b9050919050565b6000614e2282614e0a565b9050919050565b6000614e3482614e17565b9050919050565b614e4c614e4782613d70565b614e29565b82525050565b6000614e5e8284614e3b565b60148201915081905092915050565b7f41646472657373206e6f7420696e206c69737400000000000000000000000000600082015250565b6000614ea3601383613c1c565b9150614eae82614e6d565b602082019050919050565b60006020820190508181036000830152614ed281614e96565b9050919050565b7f45786365656473207072652073616c65206d696e74206d6178206e756d626572600082015250565b6000614f0f602083613c1c565b9150614f1a82614ed9565b602082019050919050565b60006020820190508181036000830152614f3e81614f02565b9050919050565b6000614f5082613cc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f8257614f816147bb565b5b600182019050919050565b6000614f98826140e8565b915063ffffffff8203614fae57614fad6147bb565b5b600182019050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000614fef601783613c1c565b9150614ffa82614fb9565b602082019050919050565b6000602082019050818103600083015261501e81614fe2565b9050919050565b7f55464f20646f6573206e6f742065786973742e00000000000000000000000000600082015250565b600061505b601383613c1c565b915061506682615025565b602082019050919050565b6000602082019050818103600083015261508a8161504e565b9050919050565b60006040820190506150a66000830185613ccd565b6150b36020830184613ccd565b9392505050565b60006150cd6150c884614269565b61424e565b9050828152602081018484840111156150e9576150e86141e9565b5b6150f4848285613c2d565b509392505050565b600082601f83011261511157615110614124565b5b81516151218482602086016150ba565b91505092915050565b6000602082840312156151405761513f613b4c565b5b600082015167ffffffffffffffff81111561515e5761515d613b51565b5b61516a848285016150fc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151cf602683613c1c565b91506151da82615173565b604082019050919050565b600060208201905081810360008301526151fe816151c2565b9050919050565b600060408201905061521a6000830185613d82565b6152276020830184613d82565b9392505050565b60008151905061523d81613ed4565b92915050565b60006020828403121561525957615258613b4c565b5b60006152678482850161522e565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006152cc602183613c1c565b91506152d782615270565b604082019050919050565b600060208201905081810360008301526152fb816152bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061535e603883613c1c565b915061536982615302565b604082019050919050565b6000602082019050818103600083015261538d81615351565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153ca602083613c1c565b91506153d582615394565b602082019050919050565b600060208201905081810360008301526153f9816153bd565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061545c602d83613c1c565b915061546782615400565b604082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f45786365656473206d6178206270730000000000000000000000000000000000600082015250565b60006154c8600f83613c1c565b91506154d382615492565b602082019050919050565b600060208201905081810360008301526154f7816154bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615534601f83613c1c565b915061553f826154fe565b602082019050919050565b6000602082019050818103600083015261556381615527565b9050919050565b600061557582613cc3565b915061558083613cc3565b9250826155905761558f61482c565b5b828206905092915050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006155d1601c83613c1c565b91506155dc8261559b565b602082019050919050565b60006020820190508181036000830152615600816155c4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026156697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261562c565b615673868361562c565b95508019841693508086168417925050509392505050565b60006156a66156a161569c84613cc3565b613f2d565b613cc3565b9050919050565b6000819050919050565b6156c08361568b565b6156d46156cc826156ad565b848454615639565b825550505050565b600090565b6156e96156dc565b6156f48184846156b7565b505050565b5b818110156157185761570d6000826156e1565b6001810190506156fa565b5050565b601f82111561575d5761572e81615607565b6157378461561c565b81016020851015615746578190505b61575a6157528561561c565b8301826156f9565b50505b505050565b600082821c905092915050565b600061578060001984600802615762565b1980831691505092915050565b6000615799838361576f565b9150826002028217905092915050565b6157b282613c11565b67ffffffffffffffff8111156157cb576157ca6141ee565b5b6157d58254614683565b6157e082828561571c565b600060209050601f8311600181146158135760008415615801578287015190505b61580b858261578d565b865550615873565b601f19841661582186615607565b60005b8281101561584957848901518255600182019150602085019450602081019050615824565b868310156158665784890151615862601f89168261576f565b8355505b6001600288020188555050505b505050505050565b600060408201905081810360008301526158958185613c68565b905081810360208301526158a98184613c68565b90509392505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158e8601983613c1c565b91506158f3826158b2565b602082019050919050565b60006020820190508181036000830152615917816158db565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061597a602583613c1c565b91506159858261591e565b604082019050919050565b600060208201905081810360008301526159a98161596d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a0c602483613c1c565b9150615a17826159b0565b604082019050919050565b60006020820190508181036000830152615a3b816159ff565b9050919050565b6000819050919050565b615a5d615a5882614422565b615a42565b82525050565b6000819050919050565b615a7e615a7982613cc3565b615a63565b82525050565b6000615a908285615a4c565b602082019150615aa08284615a6d565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b0c603283613c1c565b9150615b1782615ab0565b604082019050919050565b60006020820190508181036000830152615b3b81615aff565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b6982615b42565b615b738185615b4d565b9350615b83818560208601613c2d565b615b8c81613c57565b840191505092915050565b6000608082019050615bac6000830187613d82565b615bb96020830186613d82565b615bc66040830185613ccd565b8181036060830152615bd88184615b5e565b905095945050505050565b600081519050615bf281613b82565b92915050565b600060208284031215615c0e57615c0d613b4c565b5b6000615c1c84828501615be3565b9150509291505056fea2646970667358221220722f328c7d2f912f788cd757c816860a469d4427e3fb65ace5707c54edac5be964736f6c6343000813003300000000000000000000000053dcc7b9403a1c3101162b1ba0a714fb268377c4000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af1800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af1800000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000006307855464f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006307855464f730000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061036b5760003560e01c8063600dd5ea116101c65780639dd85f17116100f7578063c87b56dd11610095578063e8a3d4851161006f578063e8a3d48514610c53578063e985e9c514610c7e578063f2fde38b14610cbb578063fbfa77cf14610ce45761036b565b8063c87b56dd14610bb0578063dea4775214610bed578063e0d4ea3714610c165761036b565b8063af42d82d116100d1578063af42d82d14610b07578063b24f2d3914610b30578063b88d4fde14610b5c578063c6ab67a314610b855761036b565b80639dd85f1714610a97578063a22cb46514610ac2578063a71bbebe14610aeb5761036b565b806385e863e5116101645780638fdcf9421161013e5780638fdcf942146109f1578063938e3d7b14610a1a57806395d89b4114610a435780639bcf7a1514610a6e5761036b565b806385e863e51461096d5780638a8fe819146109895780638da5cb5b146109c65761036b565b806363ff5e17116101a057806363ff5e17146108c357806370a08231146108ee578063715018a61461092b5780637998a1c4146109425761036b565b8063600dd5ea14610832578063603f4d521461085b5780636352211e146108865761036b565b806332f0cd64116102a057806342842e0e1161023e57806344a0d68a1161021857806344a0d68a146107635780634cc157df1461078c5780634f6ccce7146107ca578063504c6e01146108075761036b565b806342842e0e146106d457806342966c68146106fd578063430c2081146107265761036b565b80633bb2c9381161027a5780633bb2c938146106645780633ccfd60b1461067b5780633e11ab3f1461069257806341f43434146106a95761036b565b806332f0cd64146105e557806333039d3d1461060e57806333101e1f146106395761036b565b8063176b72b41161030d57806320fe418a116102e757806320fe418a1461052a57806323b872dd146105415780632a55205a1461056a5780632f745c59146105a85761036b565b8063176b72b4146104ab57806318160ddd146104d4578063193402bb146104ff5761036b565b8063081812fc11610349578063081812fc14610403578063095ea7b3146104405780630cd6fba91461046957806311e3dbca146104805761036b565b806301ffc9a71461037057806306fdde03146103ad57806307e89ec0146103d8575b600080fd5b34801561037c57600080fd5b5061039760048036038101906103929190613bae565b610d0f565b6040516103a49190613bf6565b60405180910390f35b3480156103b957600080fd5b506103c2610e09565b6040516103cf9190613ca1565b60405180910390f35b3480156103e457600080fd5b506103ed610e9b565b6040516103fa9190613cdc565b60405180910390f35b34801561040f57600080fd5b5061042a60048036038101906104259190613d23565b610ea1565b6040516104379190613d91565b60405180910390f35b34801561044c57600080fd5b5061046760048036038101906104629190613dd8565b610f26565b005b34801561047557600080fd5b5061047e610f3f565b005b34801561048c57600080fd5b50610495610fb4565b6040516104a29190613cdc565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd9190613e18565b610fba565b005b3480156104e057600080fd5b506104e9611065565b6040516104f69190613cdc565b60405180910390f35b34801561050b57600080fd5b50610514611104565b6040516105219190613cdc565b60405180910390f35b34801561053657600080fd5b5061053f61110a565b005b34801561054d57600080fd5b5061056860048036038101906105639190613e58565b61117f565b005b34801561057657600080fd5b50610591600480360381019061058c9190613e18565b6111ce565b60405161059f929190613eab565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca9190613dd8565b61120c565b6040516105dc9190613cdc565b60405180910390f35b3480156105f157600080fd5b5061060c60048036038101906106079190613f00565b61133f565b005b34801561061a57600080fd5b50610623611392565b6040516106309190613cdc565b60405180910390f35b34801561064557600080fd5b5061064e611398565b60405161065b9190613bf6565b60405180910390f35b34801561067057600080fd5b506106796113ab565b005b34801561068757600080fd5b506106906113d0565b005b34801561069e57600080fd5b506106a76114a9565b005b3480156106b557600080fd5b506106be61151d565b6040516106cb9190613f8c565b60405180910390f35b3480156106e057600080fd5b506106fb60048036038101906106f69190613e58565b61152f565b005b34801561070957600080fd5b50610724600480360381019061071f9190613d23565b61157e565b005b34801561073257600080fd5b5061074d60048036038101906107489190613dd8565b6115f1565b60405161075a9190613bf6565b60405180910390f35b34801561076f57600080fd5b5061078a60048036038101906107859190613d23565b611686565b005b34801561079857600080fd5b506107b360048036038101906107ae9190613d23565b611698565b6040516107c1929190613fc4565b60405180910390f35b3480156107d657600080fd5b506107f160048036038101906107ec9190613d23565b6117a3565b6040516107fe9190613cdc565b60405180910390f35b34801561081357600080fd5b5061081c6117f4565b6040516108299190613bf6565b60405180910390f35b34801561083e57600080fd5b5061085960048036038101906108549190613dd8565b611807565b005b34801561086757600080fd5b5061087061185c565b60405161087d9190614064565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a89190613d23565b61186f565b6040516108ba9190613d91565b60405180910390f35b3480156108cf57600080fd5b506108d861192b565b6040516108e59190613cdc565b60405180910390f35b3480156108fa57600080fd5b506109156004803603810190610910919061407f565b611930565b6040516109229190613cdc565b60405180910390f35b34801561093757600080fd5b50610940611a3e565b005b34801561094e57600080fd5b50610957611a52565b60405161096491906140cd565b60405180910390f35b61098760048036038101906109829190614189565b611a78565b005b34801561099557600080fd5b506109b060048036038101906109ab919061407f565b611e74565b6040516109bd9190613cdc565b60405180910390f35b3480156109d257600080fd5b506109db611e8c565b6040516109e89190613d91565b60405180910390f35b3480156109fd57600080fd5b50610a186004803603810190610a139190613d23565b611eb6565b005b348015610a2657600080fd5b50610a416004803603810190610a3c9190614319565b611ec8565b005b348015610a4f57600080fd5b50610a58611f1b565b604051610a659190613ca1565b60405180910390f35b348015610a7a57600080fd5b50610a956004803603810190610a909190614362565b611fad565b005b348015610aa357600080fd5b50610aac612004565b604051610ab99190613cdc565b60405180910390f35b348015610ace57600080fd5b50610ae96004803603810190610ae491906143b5565b612009565b005b610b056004803603810190610b0091906143f5565b612022565b005b348015610b1357600080fd5b50610b2e6004803603810190610b299190614458565b6121f0565b005b348015610b3c57600080fd5b50610b4561222f565b604051610b53929190613fc4565b60405180910390f35b348015610b6857600080fd5b50610b836004803603810190610b7e9190614526565b61226e565b005b348015610b9157600080fd5b50610b9a6122bf565b604051610ba79190613ca1565b60405180910390f35b348015610bbc57600080fd5b50610bd76004803603810190610bd29190613d23565b61234d565b604051610be49190613ca1565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f91906145e7565b61245a565b005b348015610c2257600080fd5b50610c3d6004803603810190610c389190613d23565b6124a6565b604051610c4a9190613cdc565b60405180910390f35b348015610c5f57600080fd5b50610c6861250b565b604051610c759190613ca1565b60405180910390f35b348015610c8a57600080fd5b50610ca56004803603810190610ca09190614614565b612599565b604051610cb29190613bf6565b60405180910390f35b348015610cc757600080fd5b50610ce26004803603810190610cdd919061407f565b61262d565b005b348015610cf057600080fd5b50610cf96126b0565b604051610d069190613d91565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d6a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d9a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610e0257507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060008054610e1890614683565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4490614683565b8015610e915780601f10610e6657610100808354040283529160200191610e91565b820191906000526020600020905b815481529060010190602001808311610e7457829003601f168201915b5050505050905090565b600f5481565b6000610eac826126d6565b610eeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee290614700565b60405180910390fd5b6003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610f308161275e565b610f3a8383612871565b505050565b610f47612988565b6000601560006101000a81548160ff02191690836002811115610f6d57610f6c613fed565b5b021790555060006002811115610f8657610f85613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b600d5481565b610fc2612988565b601260149054906101000a900460ff16611011576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110089061476c565b60405180910390fd5b80600a600084815260200190815260200160002081905550817faabfe5e8bccf1a1352f72b557ce580211305c37f88d5783ae467a1ba5e0761e0826040516110599190613cdc565b60405180910390a25050565b60008060005b6002805490508110156110fc57600073ffffffffffffffffffffffffffffffffffffffff16600282815481106110a4576110a361478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110f1578160010191505b80600101905061106b565b508091505090565b600e5481565b611112612988565b6001601560006101000a81548160ff0219169083600281111561113857611137613fed565b5b02179055506001600281111561115157611150613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111bd576111bc3361275e565b5b6111c8848484612a06565b50505050565b6000806000806111dd86611698565b61ffff169150915081935061271081866111f791906147ea565b611201919061485b565b925050509250929050565b600061121783611930565b8210611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f906148fe565b60405180910390fd5b6000805b6002805490508110156112fd576002818154811061127d5761127c61478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036112f2578382036112eb578092505050611339565b8160010191505b80600101905061125c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611330906148fe565b60405180910390fd5b92915050565b611347612a66565b611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90614990565b60405180910390fd5b61138f81612aa3565b50565b600c5481565b601260149054906101000a900460ff1681565b6113b3612988565b6000601260146101000a81548160ff021916908315150217905550565b6113d8612988565b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051611420906149e1565b60006040518083038185875af1925050503d806000811461145d576040519150601f19603f3d011682016040523d82523d6000602084013e611462565b606091505b50509050806114a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149d90614a42565b60405180910390fd5b50565b6114b1612988565b6002601560006101000a81548160ff021916908360028111156114d7576114d6613fed565b5b02179055506002808111156114ef576114ee613fed565b5b7f784851bf4f56ebb482b14174b5fcc43c006ca236a47dcb14d8eedcf0eddc503e60405160405180910390a2565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461156d5761156c3361275e565b5b611578848484612af7565b50505050565b61158f611589612b17565b82612b1f565b6115ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c590614aae565b60405180910390fd5b600a6000828152602001908152602001600020600090556115ee81612bb4565b50565b6000806115fd8361186f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061163f575061163e8185612599565b5b8061167d57508373ffffffffffffffffffffffffffffffffffffffff1661166584610ea1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b61168e612988565b80600f8190555050565b6000806000600760008581526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146117645780600001518160200151611799565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660149054906101000a900461ffff165b9250925050915091565b600060028054905082106117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e390614b40565b60405180910390fd5b819050919050565b600960149054906101000a900460ff1681565b61180f612c98565b61184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184590614bac565b60405180910390fd5b6118588282612cd5565b5050565b601560009054906101000a900460ff1681565b600080600283815481106118865761188561478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191990614700565b60405180910390fd5b80915050919050565b600081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199790614c3e565b60405180910390fd5b6000805b600280549050811015611a3457600281815481106119c5576119c461478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a29578160010191505b8060010190506119a4565b5080915050919050565b611a46612988565b611a506000612dca565b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a80612e90565b60016002811115611a9457611a93613fed565b5b601560009054906101000a900460ff166002811115611ab657611ab5613fed565b5b14611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614caa565b60405180910390fd5b600e548363ffffffff16348183611b0d91906147ea565b14611b4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4490614d16565b60405180910390fd5b8463ffffffff16600d546000600c54611b669190614d36565b611b709190614d6a565b81601054611b7e9190614d6a565b1115611bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb690614dea565b60405180910390fd5b8484611c35828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001611c1a9190614e52565b60405160208183030381529060405280519060200120612edf565b611c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6b90614eb9565b60405180910390fd5b8763ffffffff16600181600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611cc89190614d6a565b1115611d09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0090614f25565b60405180910390fd5b8863ffffffff16600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611d5a9190614d6a565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8963ffffffff168163ffffffff161015611e1657611dbf601054612ef6565b600a6000601054815260200190815260200160002081905550611deb611de3612b17565b6010546130a5565b60106000815480929190611dfe90614f45565b91905055508080611e0e90614f8d565b915050611da0565b508863ffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7ecbc6c2508739b8cb9f4ce243de4345253602f1ea2f8ba5e0ac26f1eecc63aa60405160405180910390a3505050505050611e6f6131b1565b505050565b600b6020528060005260406000206000915090505481565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ebe612988565b80600e8190555050565b611ed06131bb565b611f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0690614bac565b60405180910390fd5b611f18816131f8565b50565b606060018054611f2a90614683565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5690614683565b8015611fa35780601f10611f7857610100808354040283529160200191611fa3565b820191906000526020600020905b815481529060010190602001808311611f8657829003601f168201915b5050505050905090565b611fb5612c98565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb90614bac565b60405180910390fd5b611fff8383836132d4565b505050565b600181565b816120138161275e565b61201d83836133ff565b505050565b61202a612e90565b60028081111561203d5761203c613fed565b5b601560009054906101000a900460ff16600281111561205f5761205e613fed565b5b1461209f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209690615005565b60405180910390fd5b600f548163ffffffff163481836120b691906147ea565b146120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614d16565b60405180910390fd5b8263ffffffff16600d546000600c5461210f9190614d36565b6121199190614d6a565b816010546121279190614d6a565b1115612168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215f90614dea565b60405180910390fd5b60005b8463ffffffff168163ffffffff1610156121e15761218a601054612ef6565b600a60006010548152602001908152602001600020819055506121b66121ae612b17565b6010546130a5565b601060008154809291906121c990614f45565b919050555080806121d990614f8d565b91505061216b565b505050506121ed6131b1565b50565b6121f8612988565b80601481905550807f2965d6e68e4e35cf06fce0f92ff1ee28e7d29bde2bf6b0557d8f22e78171432d60405160405180910390a250565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660149054906101000a900461ffff16915091509091565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146122ac576122ab3361275e565b5b6122b88585858561357f565b5050505050565b601380546122cc90614683565b80601f01602080910402602001604051908101604052809291908181526020018280546122f890614683565b80156123455780601f1061231a57610100808354040283529160200191612345565b820191906000526020600020905b81548152906001019060200180831161232857829003601f168201915b505050505081565b6060612358826126d6565b612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e90615071565b60405180910390fd5b6000600a6000848152602001908152602001600020549050601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166392cb829d84836040518363ffffffff1660e01b815260040161240c929190615091565b600060405180830381865afa158015612429573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612452919061512a565b915050919050565b612462612988565b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006124b1826126d6565b6124f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e790615071565b60405180910390fd5b600a6000838152602001908152602001600020549050919050565b6005805461251890614683565b80601f016020809104026020016040519081016040528092919081815260200182805461254490614683565b80156125915780601f1061256657610100808354040283529160200191612591565b820191906000526020600020905b81548152906001019060200180831161257457829003601f168201915b505050505081565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612635612988565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036126a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269b906151e5565b60405180910390fd5b6126ad81612dca565b50565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280549050821080156127575750600073ffffffffffffffffffffffffffffffffffffffff16600283815481106127135761271261478c565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600960149054906101000a900460ff161561286e5760006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561286d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016127ea929190615205565b602060405180830381865afa158015612807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282b9190615243565b61286c57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016128639190613d91565b60405180910390fd5b5b5b50565b600061287c8261186f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906152e2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661290b612b17565b73ffffffffffffffffffffffffffffffffffffffff16148061293a575061293981612934612b17565b612599565b5b612979576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297090615374565b60405180910390fd5b61298383836135e1565b505050565b612990612b17565b73ffffffffffffffffffffffffffffffffffffffff166129ae611e8c565b73ffffffffffffffffffffffffffffffffffffffff1614612a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fb906153e0565b60405180910390fd5b565b612a17612a11612b17565b82612b1f565b612a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4d90615472565b60405180910390fd5b612a6183838361369a565b505050565b6000612a70611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b80600960146101000a81548160ff0219169083151502179055507f38475885990d8dfe9ca01f0ef160a1b5514426eab9ddbc953a3353410ba7809681604051612aec9190613bf6565b60405180910390a150565b612b128383836040518060200160405280600081525061226e565b505050565b600033905090565b600080612b2b8361186f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612b6d5750612b6c8185612599565b5b80612bab57508373ffffffffffffffffffffffffffffffffffffffff16612b9384610ea1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b6000612bbf8261186f565b90506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560028281548110612c0b57612c0a61478c565b5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612ca2611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b612710811115612d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d11906154de565b60405180910390fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660146101000a81548161ffff021916908361ffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f90d7ec04bcb8978719414f82e52e4cb651db41d0e6f8cea6118c2191e6183adb82604051612dbe9190613cdc565b60405180910390a25050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260085403612ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ecc9061554a565b60405180910390fd5b6002600881905550565b600082612eec8584613872565b1490509392505050565b600080612f02836138c8565b90506000600a6014603084901c612f19919061556a565b612f239190614d6a565b600a600b84612f32919061556a565b612f3c9190614d6a565b6064612f4891906147ea565b612f529190614d6a565b90506000600a6014606085901c612f69919061556a565b612f739190614d6a565b600a600b606086901c612f86919061556a565b612f909190614d6a565b6064612f9c91906147ea565b612fa69190614d6a565b90506000600a6014609086901c612fbd919061556a565b612fc79190614d6a565b600a600b609087901c612fda919061556a565b612fe49190614d6a565b6064612ff091906147ea565b612ffa9190614d6a565b90506000600a601460c087901c613011919061556a565b61301b9190614d6a565b600a600760c088901c61302e919061556a565b6130389190614d6a565b606461304491906147ea565b61304e9190614d6a565b90508082848661271061306191906147ea565b61306b9190614d6a565b61271061307891906147ea565b6130829190614d6a565b61271061308f91906147ea565b6130999190614d6a565b95505050505050919050565b6130ae816126d6565b156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e5906155e7565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001600881905550565b60006131c5611e8c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006005805461320790614683565b80601f016020809104026020016040519081016040528092919081815260200182805461323390614683565b80156132805780601f1061325557610100808354040283529160200191613280565b820191906000526020600020905b81548152906001019060200180831161326357829003601f168201915b50505050509050816005908161329691906157a9565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516132c892919061587b565b60405180910390a15050565b612710811115613319576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613310906154de565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152506007600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101559050508173ffffffffffffffffffffffffffffffffffffffff16837f7365cf4122f072a3365c20d54eff9b38d73c096c28e1892ec8f5b0e403a0f12d836040516133f29190613cdc565b60405180910390a3505050565b8173ffffffffffffffffffffffffffffffffffffffff1661341e612b17565b73ffffffffffffffffffffffffffffffffffffffff1603613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906158fe565b60405180910390fd5b8060046000613481612b17565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661352e612b17565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135739190613bf6565b60405180910390a35050565b61359061358a612b17565b83612b1f565b6135cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c690615472565b60405180910390fd5b6135db8484848461390a565b50505050565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166136548361186f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b8273ffffffffffffffffffffffffffffffffffffffff166136ba8261186f565b73ffffffffffffffffffffffffffffffffffffffff1614613710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161370790615990565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377690615a22565b60405180910390fd5b6003600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600282815481106137ca576137c961478c565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008082905060005b84518110156138bd576138a88286838151811061389b5761389a61478c565b5b6020026020010151613966565b915080806138b590614f45565b91505061387b565b508091505092915050565b60006001436138d79190614d36565b40826040516020016138ea929190615a84565b6040516020818303038152906040528051906020012060001c9050919050565b61391584848461369a565b61392184848484613991565b613960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161395790615b22565b60405180910390fd5b50505050565b600081831061397e576139798284613b18565b613989565b6139888383613b18565b5b905092915050565b60006139b28473ffffffffffffffffffffffffffffffffffffffff16613b2f565b15613b0b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026139db612b17565b8786866040518563ffffffff1660e01b81526004016139fd9493929190615b97565b6020604051808303816000875af1925050508015613a3957506040513d601f19601f82011682018060405250810190613a369190615bf8565b60015b613abb573d8060008114613a69576040519150601f19603f3d011682016040523d82523d6000602084013e613a6e565b606091505b506000815103613ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaa90615b22565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b10565b600190505b949350505050565b600082600052816020526040600020905092915050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613b8b81613b56565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc3613b4c565b5b6000613bd284828501613b99565b91505092915050565b60008115159050919050565b613bf081613bdb565b82525050565b6000602082019050613c0b6000830184613be7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c4b578082015181840152602081019050613c30565b60008484015250505050565b6000601f19601f8301169050919050565b6000613c7382613c11565b613c7d8185613c1c565b9350613c8d818560208601613c2d565b613c9681613c57565b840191505092915050565b60006020820190508181036000830152613cbb8184613c68565b905092915050565b6000819050919050565b613cd681613cc3565b82525050565b6000602082019050613cf16000830184613ccd565b92915050565b613d0081613cc3565b8114613d0b57600080fd5b50565b600081359050613d1d81613cf7565b92915050565b600060208284031215613d3957613d38613b4c565b5b6000613d4784828501613d0e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d7b82613d50565b9050919050565b613d8b81613d70565b82525050565b6000602082019050613da66000830184613d82565b92915050565b613db581613d70565b8114613dc057600080fd5b50565b600081359050613dd281613dac565b92915050565b60008060408385031215613def57613dee613b4c565b5b6000613dfd85828601613dc3565b9250506020613e0e85828601613d0e565b9150509250929050565b60008060408385031215613e2f57613e2e613b4c565b5b6000613e3d85828601613d0e565b9250506020613e4e85828601613d0e565b9150509250929050565b600080600060608486031215613e7157613e70613b4c565b5b6000613e7f86828701613dc3565b9350506020613e9086828701613dc3565b9250506040613ea186828701613d0e565b9150509250925092565b6000604082019050613ec06000830185613d82565b613ecd6020830184613ccd565b9392505050565b613edd81613bdb565b8114613ee857600080fd5b50565b600081359050613efa81613ed4565b92915050565b600060208284031215613f1657613f15613b4c565b5b6000613f2484828501613eeb565b91505092915050565b6000819050919050565b6000613f52613f4d613f4884613d50565b613f2d565b613d50565b9050919050565b6000613f6482613f37565b9050919050565b6000613f7682613f59565b9050919050565b613f8681613f6b565b82525050565b6000602082019050613fa16000830184613f7d565b92915050565b600061ffff82169050919050565b613fbe81613fa7565b82525050565b6000604082019050613fd96000830185613d82565b613fe66020830184613fb5565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061402d5761402c613fed565b5b50565b600081905061403e8261401c565b919050565b600061404e82614030565b9050919050565b61405e81614043565b82525050565b60006020820190506140796000830184614055565b92915050565b60006020828403121561409557614094613b4c565b5b60006140a384828501613dc3565b91505092915050565b60006140b782613f59565b9050919050565b6140c7816140ac565b82525050565b60006020820190506140e260008301846140be565b92915050565b600063ffffffff82169050919050565b614101816140e8565b811461410c57600080fd5b50565b60008135905061411e816140f8565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261414957614148614124565b5b8235905067ffffffffffffffff81111561416657614165614129565b5b6020830191508360208202830111156141825761418161412e565b5b9250929050565b6000806000604084860312156141a2576141a1613b4c565b5b60006141b08682870161410f565b935050602084013567ffffffffffffffff8111156141d1576141d0613b51565b5b6141dd86828701614133565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422682613c57565b810181811067ffffffffffffffff82111715614245576142446141ee565b5b80604052505050565b6000614258613b42565b9050614264828261421d565b919050565b600067ffffffffffffffff821115614284576142836141ee565b5b61428d82613c57565b9050602081019050919050565b82818337600083830152505050565b60006142bc6142b784614269565b61424e565b9050828152602081018484840111156142d8576142d76141e9565b5b6142e384828561429a565b509392505050565b600082601f830112614300576142ff614124565b5b81356143108482602086016142a9565b91505092915050565b60006020828403121561432f5761432e613b4c565b5b600082013567ffffffffffffffff81111561434d5761434c613b51565b5b614359848285016142eb565b91505092915050565b60008060006060848603121561437b5761437a613b4c565b5b600061438986828701613d0e565b935050602061439a86828701613dc3565b92505060406143ab86828701613d0e565b9150509250925092565b600080604083850312156143cc576143cb613b4c565b5b60006143da85828601613dc3565b92505060206143eb85828601613eeb565b9150509250929050565b60006020828403121561440b5761440a613b4c565b5b60006144198482850161410f565b91505092915050565b6000819050919050565b61443581614422565b811461444057600080fd5b50565b6000813590506144528161442c565b92915050565b60006020828403121561446e5761446d613b4c565b5b600061447c84828501614443565b91505092915050565b600067ffffffffffffffff8211156144a05761449f6141ee565b5b6144a982613c57565b9050602081019050919050565b60006144c96144c484614485565b61424e565b9050828152602081018484840111156144e5576144e46141e9565b5b6144f084828561429a565b509392505050565b600082601f83011261450d5761450c614124565b5b813561451d8482602086016144b6565b91505092915050565b600080600080608085870312156145405761453f613b4c565b5b600061454e87828801613dc3565b945050602061455f87828801613dc3565b935050604061457087828801613d0e565b925050606085013567ffffffffffffffff81111561459157614590613b51565b5b61459d878288016144f8565b91505092959194509250565b60006145b482613d70565b9050919050565b6145c4816145a9565b81146145cf57600080fd5b50565b6000813590506145e1816145bb565b92915050565b6000602082840312156145fd576145fc613b4c565b5b600061460b848285016145d2565b91505092915050565b6000806040838503121561462b5761462a613b4c565b5b600061463985828601613dc3565b925050602061464a85828601613dc3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061469b57607f821691505b6020821081036146ae576146ad614654565b5b50919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b60006146ea601883613c1c565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f55706461746520536565642069732046616c7365000000000000000000000000600082015250565b6000614756601483613c1c565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147f582613cc3565b915061480083613cc3565b925082820261480e81613cc3565b91508282048414831517614825576148246147bb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061486682613cc3565b915061487183613cc3565b9250826148815761488061482c565b5b828204905092915050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006148e8602b83613c1c565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4e6f7420617574686f72697a656420746f20736574206f70657261746f72207260008201527f65737472696374696f6e2e000000000000000000000000000000000000000000602082015250565b600061497a602b83613c1c565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b600081905092915050565b50565b60006149cb6000836149b0565b91506149d6826149bb565b600082019050919050565b60006149ec826149be565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000614a2c601183613c1c565b9150614a37826149f6565b602082019050919050565b60006020820190508181036000830152614a5b81614a1f565b9050919050565b7f4e6f7420617070726f76656420746f206275726e2e0000000000000000000000600082015250565b6000614a98601583613c1c565b9150614aa382614a62565b602082019050919050565b60006020820190508181036000830152614ac781614a8b565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614b2a602c83613c1c565b9150614b3582614ace565b604082019050919050565b60006020820190508181036000830152614b5981614b1d565b9050919050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000614b96600e83613c1c565b9150614ba182614b60565b602082019050919050565b60006020820190508181036000830152614bc581614b89565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614c28602983613c1c565b9150614c3382614bcc565b604082019050919050565b60006020820190508181036000830152614c5781614c1b565b9050919050565b7f5072652073616c65206973206e6f74206f70656e000000000000000000000000600082015250565b6000614c94601483613c1c565b9150614c9f82614c5e565b602082019050919050565b60006020820190508181036000830152614cc381614c87565b9050919050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b6000614d00601883613c1c565b9150614d0b82614cca565b602082019050919050565b60006020820190508181036000830152614d2f81614cf3565b9050919050565b6000614d4182613cc3565b9150614d4c83613cc3565b9250828203905081811115614d6457614d636147bb565b5b92915050565b6000614d7582613cc3565b9150614d8083613cc3565b9250828201905080821115614d9857614d976147bb565b5b92915050565b7f496e73756666696369656e742055464f732072656d61696e696e670000000000600082015250565b6000614dd4601b83613c1c565b9150614ddf82614d9e565b602082019050919050565b60006020820190508181036000830152614e0381614dc7565b9050919050565b60008160601b9050919050565b6000614e2282614e0a565b9050919050565b6000614e3482614e17565b9050919050565b614e4c614e4782613d70565b614e29565b82525050565b6000614e5e8284614e3b565b60148201915081905092915050565b7f41646472657373206e6f7420696e206c69737400000000000000000000000000600082015250565b6000614ea3601383613c1c565b9150614eae82614e6d565b602082019050919050565b60006020820190508181036000830152614ed281614e96565b9050919050565b7f45786365656473207072652073616c65206d696e74206d6178206e756d626572600082015250565b6000614f0f602083613c1c565b9150614f1a82614ed9565b602082019050919050565b60006020820190508181036000830152614f3e81614f02565b9050919050565b6000614f5082613cc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614f8257614f816147bb565b5b600182019050919050565b6000614f98826140e8565b915063ffffffff8203614fae57614fad6147bb565b5b600182019050919050565b7f5075626c69632073616c65206973206e6f74206f70656e000000000000000000600082015250565b6000614fef601783613c1c565b9150614ffa82614fb9565b602082019050919050565b6000602082019050818103600083015261501e81614fe2565b9050919050565b7f55464f20646f6573206e6f742065786973742e00000000000000000000000000600082015250565b600061505b601383613c1c565b915061506682615025565b602082019050919050565b6000602082019050818103600083015261508a8161504e565b9050919050565b60006040820190506150a66000830185613ccd565b6150b36020830184613ccd565b9392505050565b60006150cd6150c884614269565b61424e565b9050828152602081018484840111156150e9576150e86141e9565b5b6150f4848285613c2d565b509392505050565b600082601f83011261511157615110614124565b5b81516151218482602086016150ba565b91505092915050565b6000602082840312156151405761513f613b4c565b5b600082015167ffffffffffffffff81111561515e5761515d613b51565b5b61516a848285016150fc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151cf602683613c1c565b91506151da82615173565b604082019050919050565b600060208201905081810360008301526151fe816151c2565b9050919050565b600060408201905061521a6000830185613d82565b6152276020830184613d82565b9392505050565b60008151905061523d81613ed4565b92915050565b60006020828403121561525957615258613b4c565b5b60006152678482850161522e565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006152cc602183613c1c565b91506152d782615270565b604082019050919050565b600060208201905081810360008301526152fb816152bf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061535e603883613c1c565b915061536982615302565b604082019050919050565b6000602082019050818103600083015261538d81615351565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006153ca602083613c1c565b91506153d582615394565b602082019050919050565b600060208201905081810360008301526153f9816153bd565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b600061545c602d83613c1c565b915061546782615400565b604082019050919050565b6000602082019050818103600083015261548b8161544f565b9050919050565b7f45786365656473206d6178206270730000000000000000000000000000000000600082015250565b60006154c8600f83613c1c565b91506154d382615492565b602082019050919050565b600060208201905081810360008301526154f7816154bb565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000615534601f83613c1c565b915061553f826154fe565b602082019050919050565b6000602082019050818103600083015261556381615527565b9050919050565b600061557582613cc3565b915061558083613cc3565b9250826155905761558f61482c565b5b828206905092915050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006155d1601c83613c1c565b91506155dc8261559b565b602082019050919050565b60006020820190508181036000830152615600816155c4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026156697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261562c565b615673868361562c565b95508019841693508086168417925050509392505050565b60006156a66156a161569c84613cc3565b613f2d565b613cc3565b9050919050565b6000819050919050565b6156c08361568b565b6156d46156cc826156ad565b848454615639565b825550505050565b600090565b6156e96156dc565b6156f48184846156b7565b505050565b5b818110156157185761570d6000826156e1565b6001810190506156fa565b5050565b601f82111561575d5761572e81615607565b6157378461561c565b81016020851015615746578190505b61575a6157528561561c565b8301826156f9565b50505b505050565b600082821c905092915050565b600061578060001984600802615762565b1980831691505092915050565b6000615799838361576f565b9150826002028217905092915050565b6157b282613c11565b67ffffffffffffffff8111156157cb576157ca6141ee565b5b6157d58254614683565b6157e082828561571c565b600060209050601f8311600181146158135760008415615801578287015190505b61580b858261578d565b865550615873565b601f19841661582186615607565b60005b8281101561584957848901518255600182019150602085019450602081019050615824565b868310156158665784890151615862601f89168261576f565b8355505b6001600288020188555050505b505050505050565b600060408201905081810360008301526158958185613c68565b905081810360208301526158a98184613c68565b90509392505050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006158e8601983613c1c565b91506158f3826158b2565b602082019050919050565b60006020820190508181036000830152615917816158db565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061597a602583613c1c565b91506159858261591e565b604082019050919050565b600060208201905081810360008301526159a98161596d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a0c602483613c1c565b9150615a17826159b0565b604082019050919050565b60006020820190508181036000830152615a3b816159ff565b9050919050565b6000819050919050565b615a5d615a5882614422565b615a42565b82525050565b6000819050919050565b615a7e615a7982613cc3565b615a63565b82525050565b6000615a908285615a4c565b602082019150615aa08284615a6d565b6020820191508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b0c603283613c1c565b9150615b1782615ab0565b604082019050919050565b60006020820190508181036000830152615b3b81615aff565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615b6982615b42565b615b738185615b4d565b9350615b83818560208601613c2d565b615b8c81613c57565b840191505092915050565b6000608082019050615bac6000830187613d82565b615bb96020830186613d82565b615bc66040830185613ccd565b8181036060830152615bd88184615b5e565b905095945050505050565b600081519050615bf281613b82565b92915050565b600060208284031215615c0e57615c0d613b4c565b5b6000615c1c84828501615be3565b9150509291505056fea2646970667358221220722f328c7d2f912f788cd757c816860a469d4427e3fb65ace5707c54edac5be964736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000053dcc7b9403a1c3101162b1ba0a714fb268377c4000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af1800000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af1800000000000000000000000000000000000000000000000000000000000001f40000000000000000000000000000000000000000000000000000000000000006307855464f7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006307855464f730000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : newIdentifier (address): 0x53Dcc7b9403A1c3101162b1Ba0A714Fb268377C4
Arg [1] : _vault (address): 0x986883d5B7219706993f1DCB8d4DE9aCBa68AF18
Arg [2] : _name (string): 0xUFOs
Arg [3] : _symbol (string): 0xUFOs
Arg [4] : _royaltyRecipient (address): 0x986883d5B7219706993f1DCB8d4DE9aCBa68AF18
Arg [5] : _royaltyBps (uint128): 500
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000053dcc7b9403a1c3101162b1ba0a714fb268377c4
Arg [1] : 000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af18
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000986883d5b7219706993f1dcb8d4de9acba68af18
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 307855464f730000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 307855464f730000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,690.5 | 0.02 | $53.81 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.