Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 508 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 21260342 | 34 days ago | IN | 0 ETH | 0.00290143 | ||||
Claim | 21221752 | 40 days ago | IN | 0 ETH | 0.00479644 | ||||
Claim | 21214706 | 40 days ago | IN | 0 ETH | 0.00268109 | ||||
Claim | 21214704 | 40 days ago | IN | 0 ETH | 0.00267924 | ||||
Claim | 21214698 | 40 days ago | IN | 0 ETH | 0.00348088 | ||||
Claim | 21212588 | 41 days ago | IN | 0 ETH | 0.00512868 | ||||
Claim | 21210922 | 41 days ago | IN | 0 ETH | 0.00185201 | ||||
Claim | 21210774 | 41 days ago | IN | 0 ETH | 0.00172704 | ||||
Claim | 21210770 | 41 days ago | IN | 0 ETH | 0.00324418 | ||||
Claim | 21209784 | 41 days ago | IN | 0 ETH | 0.00512157 | ||||
Claim | 21209310 | 41 days ago | IN | 0 ETH | 0.00541741 | ||||
Claim | 21209014 | 41 days ago | IN | 0 ETH | 0.00647418 | ||||
Set List | 21205681 | 42 days ago | IN | 0 ETH | 0.00044506 | ||||
Set Max Drop Sup... | 21205678 | 42 days ago | IN | 0 ETH | 0.00037758 | ||||
Claim | 20194945 | 183 days ago | IN | 0 ETH | 0.00043457 | ||||
Claim | 20148525 | 189 days ago | IN | 0 ETH | 0.00094422 | ||||
Claim | 20142523 | 190 days ago | IN | 0 ETH | 0.00074569 | ||||
Claim | 20133839 | 191 days ago | IN | 0 ETH | 0.00302234 | ||||
Claim | 20123663 | 193 days ago | IN | 0 ETH | 0.0006751 | ||||
Claim | 20118936 | 193 days ago | IN | 0 ETH | 0.00526651 | ||||
Claim | 20114251 | 194 days ago | IN | 0 ETH | 0.00129493 | ||||
Claim | 20113729 | 194 days ago | IN | 0 ETH | 0.00258435 | ||||
Claim | 20111854 | 194 days ago | IN | 0 ETH | 0.00132978 | ||||
Claim | 20111443 | 195 days ago | IN | 0 ETH | 0.00100889 | ||||
Claim | 20111410 | 195 days ago | IN | 0 ETH | 0.00106996 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SkeleDropV3
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// * ————————————————————————————————————————————————————————————————————————————————— * // | | // | SSSSS K K EEEEEE L EEEEEE PPPPP H H U U N N K K SSSSS | // | S K K E L E P P H H U U N N N K K S | // | SSSS KKKK EEE L EEE PPPPP HHHHHH U U N N N KKKK SSSS | // | S K K E L E P H H U U N N N K K S | // | SSSSS K K EEEEEE LLLLLL EEEEEE P H H UUUU N N K K SSSSS | // | | // | * AN ETHEREUM-BASED INDENTITY PLATFORM BROUGHT TO YOU BY NEUROMANTIC INDUSTRIES * | // | | // | @@@@@@@@@@@@@@@@@@@@@@@@ | // | @@@@@@@@@@@@@@@@@@@@@@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@@@@@@@@,,,,,,,,,,@@@@@@,,,,,,,@@@ | // | @@@@@@@@@@,,,,,,,,,,@@@@@@,,,,,,,@@@ | // | @@@@@@@@@@,,,,,,,,,,@@@@@@,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,@@@@@@,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,@@@@@@,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,,,,,,,,,,,@@@@@@@ | // | @@@@@@@@@@@@@@@@@@@@@@@@@@@ | // | @@@@@@@@@@@@@@@@@@@@@@@@@@@ | // | @@@@,,,,,,,,,,,,,,,,@@@@,,,@@@ | // | @@@@@@@@@@@@@@@@,,,,@@@ | // | @@@,,,,,,,,,,@@@ | // | @@@,,,,,,,,,,@@@ | // | @@@,,,,@@@ | // | @@@,,,,,,,,,,@@@ | // | | // | | // | for more information visit skelephunks.com | follow @skelephunks on twitter | // | | // * ————————————————————————————————————————————————————————————————————————————————— * //////////////////////////////////////////////////////////////////////////////////////////////////////// // | // // The SkeleDrop Contract | SkeleDrop is a way to manually airdrop crypt mints // // By Autopsyop,for Neuromantic Industries | The tokens will be randomly selected from whats left // // Part of the Skelephunks Platform | Only the owner of this contract can airdrop tokens // // | // //////////////////////////////////////////////////////////////////////////////////////////////////////// // CHANGELOG // V2: Fixes an issue where remaining claims for a wallet could be calculated incorrectly // V3: Fixes an issue where disableAllLists breaks everything, removes multiple lists concept // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./MerkleProof.sol"; import {SkelephunksController} from "SkelephunksController.sol"; contract SkeleDropV3 is Ownable, SkelephunksController { constructor () { //ENSURE SKELEPHUNKSCONTROLLER.SOL IS SET UP FOR THE RIGHT ENVIRONMENT transferOwnership(skelephunks.owner()); } bytes32 listRoot; uint16 public maxDrops = 666;//limit to the number of drops that can be served from this contract uint16 public totalDrops;//number of drops allocated uint16 public totalClaims;//number of drops that have been claimed (from any source) uint16 listRemaining; uint16 listMaxPer; bool claimsPaused; mapping( address=>uint16) walletDrops; mapping( address=>uint16 ) claims; mapping( address=>mapping( bytes32=>uint16 ) ) claimedFromList; mapping( address=>uint16 ) totalListClaims; /** Math **/ function max( uint16 a, uint16 b ) private pure returns (uint16){ if(a > b)return a; return b; } function min( uint16 a, uint16 b ) private pure returns (uint16){ if(a < b)return a; return b; } // SUPPLY INFO function remainingDropSupply( ) public view returns (uint16) { if (!cryptHasMints() ){ return 0; } return maxDrops - totalDrops; } modifier needsDropSupply{ require(0 < remainingDropSupply()); _; } // SUPPLY COMMANDS function setMaxDropSupply( uint16 maximum ) public onlyOwner { require(totalDrops <= maximum , "Already dropped more than that" ); require(maximum - totalDrops < maxCryptMints() , "Not enough mints in crypt" );//new max cant be supported by crypt maxDrops = maximum; } // CRYPT INFO /** SkeleDrop requires the Crypt to have supply **/ function maxCryptMints( ) private view returns (uint){ return skelephunks.maxReserveSupply() - skelephunks.numMintedReserve() - 666;//after mint-out there must be SOME tokens left in crypt. } function cryptHasMints( ) private view returns (bool){ return 0 < maxCryptMints() ; } // UNCLAIMED DROPS INFO function unclaimedDrops( ) public view returns (uint16){ return totalDrops - totalClaims; } function unclaimedListDrops( ) public view returns (uint16){ return listRemaining; } // DROP INFO FOR WALLET function walletDropsForWallet( address wallet ) public view returns (uint16){ return walletDrops[wallet]; } function isMember( address wallet, bytes32 root, bytes32[] calldata proof )private pure returns (bool){ return MerkleProof.verifyCalldata(proof,root,keccak256(abi.encodePacked(wallet))); } function listDropsForWallet( address wallet, bytes32[] calldata proof ) private view returns (uint16){ uint16 count; if(listRemaining > 0 && isMember(wallet,listRoot,proof)){ count=remainingListDropsForWallet(wallet); } return count; } function remainingListDropsForWallet( address wallet )private view returns(uint16){ return min(listMaxPer - claimedFromList[wallet][listRoot],listRemaining); } function totalDropsForWallet( address wallet, bytes32[] calldata proof )public view returns (uint16){ return totalListClaimsForWallet(wallet) + listDropsForWallet(wallet,proof) + walletDropsForWallet(wallet); } function unclaimedDropsForWallet( address wallet, bytes32[] calldata proof )public view returns (uint16){ return totalDropsForWallet(wallet,proof) - totalClaimsForWallet(wallet); } function claimableDropsForWallet( address wallet, bytes32[] calldata proof ) public view returns (uint16){ return claimsPaused ? 0 : unclaimedDropsForWallet(wallet,proof); } // CLAIMS INFO FOR WALLET function totalClaimsForWallet( address wallet ) public view returns (uint16){ return claims[wallet]; } function walletClaimsForWallet( address wallet ) public view returns (uint){ return totalClaimsForWallet(wallet) - totalListClaimsForWallet(wallet); } function totalListClaimsForWallet(address wallet) private view returns (uint16){ return totalListClaims[wallet]; } function currentListClaimsForWallet( address wallet ) private view returns (uint16){ return claimedFromList[wallet][listRoot]; } function priorListClaimsForWallet( address wallet )public view returns (uint16){ return totalListClaimsForWallet(wallet) - currentListClaimsForWallet(wallet); } // CONTROLS /** drops can be capped instantly using maxDrops to prevent future allocations **/ function capDropSupply( ) public onlyOwner { setMaxDropSupply(totalDrops); } /** claims can be paused **/ function pauseClaims() public onlyOwner{ require(!claimsPaused,"claims already paused");claimsPaused = true;} function unpauseClaims() public onlyOwner{ require(claimsPaused,"claims not paused");claimsPaused = false;} modifier pauseable { require (!claimsPaused,"claimes are paused");_;} // LIST COMMANDS /** skeledrop enables an operator to allocate create a list with access to an allocation of mints **/ function setList( bytes32 root, uint16 amount, uint16 maxPer )public onlyOwner{ require(amount <= remainingDropSupply(),"cannot supply this many drops, please lower the amount"); if(listRemaining > 0){ disableList(); } totalDrops+=amount; listRoot = root; listRemaining = amount; listMaxPer = maxPer; } function quickSetList( bytes32 root, uint16 amount )public onlyOwner{ setList(root,amount,1); } function disableList( )public onlyOwner{ totalDrops -= listRemaining; listRemaining= 0; } // DROP COMMANDS function bulkDrop( address[] calldata tos, uint16 amount ) public onlyOwner needsDropSupply { require(remainingDropSupply() >= tos.length ,"not enuff walletDrops for all that"); for( uint16 i = 0; i < tos.length; i++){ drop(tos[i],amount); } } function quickDrop( address to ) public onlyOwner needsDropSupply { drop(to,1); } function drop( address to, uint16 amount ) public onlyOwner needsDropSupply { require(to != owner(), "WTF scammer"); walletDrops[to]+=amount; totalDrops+=amount; } // CLAIM COMMANDS function mintFromCrypt( address to, uint16 num, uint16 gad ) private requiresSkelephunks { skelephunks.mintReserve(to, num, gad); } function claimMyDrops ( uint16 gad ) public requiresSkelephunks pauseable { require(gad >= 0 && gad < 4, "invalid gender and direction"); uint16 numDrops = walletDrops[msg.sender]; uint16 numClaims = claims[msg.sender]; uint16 dropsLeft = numDrops-numClaims ;// walletDrops left for wallet uint16 claimsRequested = dropsLeft; mintFromCrypt(msg.sender,claimsRequested,gad);// do the mint claims[msg.sender] += claimsRequested;//register the claims for wallet totalClaims += claimsRequested;//register claims to total } function claim ( uint16 quantity, uint16 gad, bytes32[] calldata proof ) public requiresSkelephunks pauseable { require(gad >= 0 && gad < 4, "invalid gender and direction"); uint16 unclaimed = unclaimedDropsForWallet(msg.sender,proof);// all drops left for wallet require(quantity <= unclaimed, "not enough drops for this wallet to claim this quantity"); uint16 requested = quantity == 0 ? unclaimed : quantity; //amount claiming - 0 = claim all uint16 requests = requested; // claim from list first, then walletDrops if( listRemaining > 0 && requests > 0 && claimedFromList[msg.sender][listRoot] < listMaxPer ){//claims remain, was list i max claimed by wallet? uint16 listRemains = remainingListDropsForWallet(msg.sender);//dont claim more than max ever uint16 listClaims = min(requests,listRemains);//we will claim no more than we're requesting from what remains listRemaining-=listClaims;//list remains minus claiming amount claimedFromList[msg.sender][listRoot] += listClaims;// account for wallet claims from list totalListClaims[msg.sender]+=listClaims;//add to wallet lifetime list total require(claimedFromList[msg.sender][listRoot]<=listMaxPer,"attempted to claim more than maxPer from list");//this shouln't be possible requests-=listClaims;// requests less claiming amount } claims[msg.sender] += requested;//register the claims for wallet totalClaims += requested;//register claims to total mintFromCrypt(msg.sender,requested,gad);// do the mint } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {ISkelephunks} from "ISkelephunks.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; abstract contract SkelephunksController is Ownable { ISkelephunks skelephunks; constructor(){ setSkelephunksAddress(0x7db8cD89308A295bb2D7F809B05DB6389e9a6d88); // MAIN // setSkelephunksAddress(0xbaC6C9F6b0d7be7a46EDb82237991Fb990459748); // GOERLI } modifier requiresSkelephunks { require( ISkelephunks(address(0)) != skelephunks, "No Skelephunks contract linked" ); _; } function setSkelephunksAddress(address addr) public onlyOwner { require( address(skelephunks) != addr, "Skelephunks contract already set to this" ); ISkelephunks skele = ISkelephunks(addr); require( keccak256(abi.encodePacked(skele.symbol())) == keccak256(abi.encodePacked("SKELE")), "Not the Skelephunks contract" ); skelephunks = skele; } function getSkelephunksAddress() public view returns (address) { return address(skelephunks); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.20; /** * @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 The multiproof provided is not valid. */ error MerkleProofInvalidMultiproof(); /** * @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} */ 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. */ 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} */ 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. */ 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. */ 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). */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { 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. */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. if (leavesLen + proofLen != totalHashes + 1) { revert MerkleProofInvalidMultiproof(); } // 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 from 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) { if (proofPos != proofLen) { revert MerkleProofInvalidMultiproof(); } unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Sorts the pair (a, b) and hashes the result. */ function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } /** * @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory. */ 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: 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 // 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: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "ISkelephunksToken.sol"; interface ISkelephunks is IERC721Enumerable, IERC721Metadata, ISkelephunksToken { function numMintedReserve() external view returns (uint256); function maxReserveSupply() external view returns (uint256); function mintReserve(address to, uint256 quantity, uint256 genderDirection) external; function mintPrice () external view returns (uint256); function setReserveAuthStatus (address, bool) external; function owner () external view returns (address); }
// 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 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.0; interface ISkelephunksToken { function mintedAt(uint256 tokenId) external view returns (uint256); function minterOf(uint256 tokenId) external view returns (address); function getGenderAndDirection(uint256 tokenId) external view returns (uint256); function setGenderAndDirection(uint256 tokenId, uint256 gad) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; import {IERC721} from "../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 v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.20; import {IERC721} from "../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); }
{ "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":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address[]","name":"tos","type":"address[]"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"bulkDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"capDropSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"quantity","type":"uint16"},{"internalType":"uint16","name":"gad","type":"uint16"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"gad","type":"uint16"}],"name":"claimMyDrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimableDropsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"drop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getSkelephunksAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDrops","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"priorListClaimsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"quickDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"quickSetList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remainingDropSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint16","name":"amount","type":"uint16"},{"internalType":"uint16","name":"maxPer","type":"uint16"}],"name":"setList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"maximum","type":"uint16"}],"name":"setMaxDropSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSkelephunksAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalClaims","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"totalClaimsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDrops","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"totalDropsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unclaimedDrops","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"unclaimedDropsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimedListDrops","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpauseClaims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletClaimsForWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"walletDropsForWallet","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405261029a60035f6101000a81548161ffff021916908361ffff1602179055503480156200002e575f80fd5b506200004f620000436200011b60201b60201c565b6200012260201b60201c565b62000074737db8cd89308a295bb2d7f809b05db6389e9a6d88620001e360201b60201c565b6200011560015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000e3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000109919062000591565b620003d260201b60201c565b62000a5e565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001f36200046760201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362000285576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027c9062000645565b60405180910390fd5b5f8190506040516020016200029a90620006bd565b604051602081830303815290604052805190602001208173ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015620002f9573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019062000323919062000847565b604051602001620003359190620008d6565b60405160208183030381529060405280519060200120146200038e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000385906200093c565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b620003e26200046760201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000453576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044a90620009d0565b60405180910390fd5b62000464816200012260201b60201c565b50565b620004776200011b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200049d620004f860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ed9062000a3e565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200055b8262000530565b9050919050565b6200056d816200054f565b811462000578575f80fd5b50565b5f815190506200058b8162000562565b92915050565b5f60208284031215620005a957620005a862000528565b5b5f620005b8848285016200057b565b91505092915050565b5f82825260208201905092915050565b7f536b656c657068756e6b7320636f6e747261637420616c7265616479207365745f8201527f20746f2074686973000000000000000000000000000000000000000000000000602082015250565b5f6200062d602883620005c1565b91506200063a82620005d1565b604082019050919050565b5f6020820190508181035f8301526200065e816200061f565b9050919050565b5f81905092915050565b7f534b454c450000000000000000000000000000000000000000000000000000005f82015250565b5f620006a560058362000665565b9150620006b2826200066f565b600582019050919050565b5f620006c98262000697565b9150819050919050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200072382620006db565b810181811067ffffffffffffffff82111715620007455762000744620006eb565b5b80604052505050565b5f620007596200051f565b905062000767828262000718565b919050565b5f67ffffffffffffffff821115620007895762000788620006eb565b5b6200079482620006db565b9050602081019050919050565b5f5b83811015620007c0578082015181840152602081019050620007a3565b5f8484015250505050565b5f620007e1620007db846200076c565b6200074e565b9050828152602081018484840111156200080057620007ff620006d7565b5b6200080d848285620007a1565b509392505050565b5f82601f8301126200082c576200082b620006d3565b5b81516200083e848260208601620007cb565b91505092915050565b5f602082840312156200085f576200085e62000528565b5b5f82015167ffffffffffffffff8111156200087f576200087e6200052c565b5b6200088d8482850162000815565b91505092915050565b5f81519050919050565b5f620008ac8262000896565b620008b8818562000665565b9350620008ca818560208601620007a1565b80840191505092915050565b5f620008e38284620008a0565b915081905092915050565b7f4e6f742074686520536b656c657068756e6b7320636f6e7472616374000000005f82015250565b5f62000924601c83620005c1565b91506200093182620008ee565b602082019050919050565b5f6020820190508181035f830152620009558162000916565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f620009b8602683620005c1565b9150620009c5826200095c565b604082019050919050565b5f6020820190508181035f830152620009e981620009aa565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f62000a26602083620005c1565b915062000a3382620009f0565b602082019050919050565b5f6020820190508181035f83015262000a578162000a18565b9050919050565b612ed38062000a6c5f395ff3fe608060405234801561000f575f80fd5b50600436106101d7575f3560e01c806377c86e9111610102578063abc5b780116100a0578063dca7830e1161006f578063dca7830e146104cb578063f2fde38b146104fb578063f45d3cc414610517578063fd82c43f14610535576101d7565b8063abc5b7801461046b578063be36890714610475578063c4c14a1414610491578063c7ae2d46146104af576101d7565b806397ec885f116100dc57806397ec885f146103d3578063a0281b4f146103ef578063a471c8751461041f578063a4f489571461044f576101d7565b806377c86e91146103555780638da5cb5b1461038557806397a06092146103a3576101d7565b80633ee60bcf1161017a578063555461e811610149578063555461e8146102f5578063619f867d14610313578063715018a61461032f5780637415375914610339576101d7565b80633ee60bcf1461028157806341c613831461029f5780634763889a146102bd5780634e339725146102d9576101d7565b806329c6b9c6116101b657806329c6b9c6146102335780633751d8e51461023d57806338163f16146102595780633d8f680614610277576101d7565b80623e6597146101db5780630f3314e7146101f957806325612a4e14610203575b5f80fd5b6101e3610565565b6040516101f09190611e59565b60405180910390f35b610201610597565b005b61021d60048036038101906102189190611f3e565b61060c565b60405161022a9190611e59565b60405180910390f35b61023b610634565b005b6102576004803603810190610252919061201a565b610657565b005b610261610725565b60405161026e9190611e59565b60405180910390f35b61027f610738565b005b6102896107ab565b6040516102969190611e59565b60405180910390f35b6102a76107bf565b6040516102b49190611e59565b60405180910390f35b6102d760048036038101906102d291906120aa565b6107d3565b005b6102f360048036038101906102ee91906120fa565b6108d1565b005b6102fd610b74565b60405161030a9190611e59565b60405180910390f35b61032d60048036038101906103289190612125565b610b8b565b005b610337610cce565b005b610353600480360381019061034e9190612163565b610ce1565b005b61036f600480360381019061036a91906121a1565b610cf9565b60405161037c91906121e4565b60405180910390f35b61038d610d21565b60405161039a919061220c565b60405180910390f35b6103bd60048036038101906103b89190611f3e565b610d48565b6040516103ca9190611e59565b60405180910390f35b6103ed60048036038101906103e891906120fa565b610d78565b005b610409600480360381019061040491906121a1565b610e62565b6040516104169190611e59565b60405180910390f35b61043960048036038101906104349190611f3e565b610e86565b6040516104469190611e59565b60405180910390f35b610469600480360381019061046491906121a1565b610ec1565b005b610473610eed565b005b61048f600480360381019061048a9190612225565b610f5d565b005b61049961147f565b6040516104a69190611e59565b60405180910390f35b6104c960048036038101906104c491906121a1565b6114c5565b005b6104e560048036038101906104e091906121a1565b61169f565b6040516104f29190611e59565b60405180910390f35b610515600480360381019061051091906121a1565b6116f2565b005b61051f611774565b60405161052c919061220c565b60405180910390f35b61054f600480360381019061054a91906121a1565b61179c565b60405161055c9190611e59565b60405180910390f35b5f600360049054906101000a900461ffff16600360029054906101000a900461ffff1661059291906122c3565b905090565b61059f6117ef565b6003600a9054906101000a900460ff16156105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612352565b60405180910390fd5b60016003600a6101000a81548160ff021916908315150217905550565b5f6106168461169f565b610621858585610e86565b61062b91906122c3565b90509392505050565b61063c6117ef565b610655600360029054906101000a900461ffff16610d78565b565b61065f6117ef565b61066761147f565b61ffff165f10610675575f80fd5b8282905061068161147f565b61ffff1610156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906123e0565b60405180910390fd5b5f5b838390508161ffff16101561071f5761070c84848361ffff168181106106f1576106f06123fe565b5b905060200201602081019061070691906121a1565b83610b8b565b80806107179061242b565b9150506106c8565b50505050565b60035f9054906101000a900461ffff1681565b6107406117ef565b6003600a9054906101000a900460ff1661078f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107869061249e565b60405180910390fd5b5f6003600a6101000a81548160ff021916908315150217905550565b600360029054906101000a900461ffff1681565b600360049054906101000a900461ffff1681565b6107db6117ef565b6107e361147f565b61ffff168261ffff16111561082d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108249061252c565b60405180910390fd5b5f600360069054906101000a900461ffff1661ffff16111561085257610851610eed565b5b81600360028282829054906101000a900461ffff16610871919061254a565b92506101000a81548161ffff021916908361ffff1602179055508260028190555081600360066101000a81548161ffff021916908361ffff16021790555080600360086101000a81548161ffff021916908361ffff160217905550505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff1603610960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610957906125c9565b60405180910390fd5b6003600a9054906101000a900460ff16156109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790612631565b60405180910390fd5b5f8161ffff16101580156109c8575060048161ffff16105b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90612699565b60405180910390fd5b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1690505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1690505f8183610ab091906122c3565b90505f819050610ac133828761186d565b8060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16610b1a919061254a565b92506101000a81548161ffff021916908361ffff16021790555080600360048282829054906101000a900461ffff16610b53919061254a565b92506101000a81548161ffff021916908361ffff1602179055505050505050565b5f600360069054906101000a900461ffff16905090565b610b936117ef565b610b9b61147f565b61ffff165f10610ba9575f80fd5b610bb1610d21565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590612701565b60405180910390fd5b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16610c77919061254a565b92506101000a81548161ffff021916908361ffff16021790555080600360028282829054906101000a900461ffff16610cb0919061254a565b92506101000a81548161ffff021916908361ffff1602179055505050565b610cd66117ef565b610cdf5f61198c565b565b610ce96117ef565b610cf5828260016107d3565b5050565b5f610d0382611a4d565b610d0c8361169f565b610d1691906122c3565b61ffff169050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003600a9054906101000a900460ff16610d6d57610d6884848461060c565b610d6f565b5f5b90509392505050565b610d806117ef565b8061ffff16600360029054906101000a900461ffff1661ffff161115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612769565b60405180910390fd5b610de3611aa0565b600360029054906101000a900461ffff1682610dff91906122c3565b61ffff1610610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a906127d1565b60405180910390fd5b8060035f6101000a81548161ffff021916908361ffff16021790555050565b5f610e6c82611bd9565b610e7583611a4d565b610e7f91906122c3565b9050919050565b5f610e908461179c565b610e9b858585611c3d565b610ea486611a4d565b610eae919061254a565b610eb8919061254a565b90509392505050565b610ec96117ef565b610ed161147f565b61ffff165f10610edf575f80fd5b610eea816001610b8b565b50565b610ef56117ef565b600360069054906101000a900461ffff16600360028282829054906101000a900461ffff16610f2491906122c3565b92506101000a81548161ffff021916908361ffff1602179055505f600360066101000a81548161ffff021916908361ffff160217905550565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff1603610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906125c9565b60405180910390fd5b6003600a9054906101000a900460ff161561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390612631565b60405180910390fd5b5f8361ffff1610158015611054575060048361ffff16105b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90612699565b60405180910390fd5b5f61109f33848461060c565b90508061ffff168561ffff1611156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e39061285f565b60405180910390fd5b5f808661ffff16146110fe5785611100565b815b90505f8190505f600360069054906101000a900461ffff1661ffff1611801561112c57505f8161ffff16115b80156111aa5750600360089054906101000a900461ffff1661ffff1660065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff1661ffff16105b156113bf575f6111b933611c88565b90505f6111c68383611d20565b905080600360068282829054906101000a900461ffff166111e791906122c3565b92506101000a81548161ffff021916908361ffff1602179055508060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f8282829054906101000a900461ffff1661126b919061254a565b92506101000a81548161ffff021916908361ffff1602179055508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff166112de919061254a565b92506101000a81548161ffff021916908361ffff160217905550600360089054906101000a900461ffff1661ffff1660065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff1661ffff1611156113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a5906128ed565b60405180910390fd5b80836113ba91906122c3565b925050505b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16611418919061254a565b92506101000a81548161ffff021916908361ffff16021790555081600360048282829054906101000a900461ffff16611451919061254a565b92506101000a81548161ffff021916908361ffff16021790555061147633838861186d565b50505050505050565b5f611488611d43565b611494575f90506114c2565b600360029054906101000a900461ffff1660035f9054906101000a900461ffff166114bf91906122c3565b90505b90565b6114cd6117ef565b8073ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061297b565b60405180910390fd5b5f81905060405160200161156f906129ed565b604051602081830303815290604052805190602001208173ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156115cd573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115f59190612b53565b6040516020016116059190612bd4565b604051602081830303815290604052805190602001201461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290612c34565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b6116fa6117ef565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90612cc2565b60405180910390fd5b6117718161198c565b50565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b6117f7611d53565b73ffffffffffffffffffffffffffffffffffffffff16611815610d21565b73ffffffffffffffffffffffffffffffffffffffff161461186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290612d2a565b60405180910390fd5b565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff16036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906125c9565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330359e5f8484846040518463ffffffff1660e01b815260040161195a93929190612d81565b5f604051808303815f87803b158015611971575f80fd5b505af1158015611983573d5f803e3d5ffd5b50505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b5f61029a60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636095049a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b329190612de0565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cffb47cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc09190612de0565b611bca9190612e0b565b611bd49190612e0b565b905090565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff169050919050565b5f805f600360069054906101000a900461ffff1661ffff16118015611c6c5750611c6b856002548686611d5a565b5b15611c7d57611c7a85611c88565b90505b809150509392505050565b5f611d1960065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff16600360089054906101000a900461ffff16611d0391906122c3565b600360069054906101000a900461ffff16611d20565b9050919050565b5f8161ffff168361ffff161015611d3957829050611d3d565b8190505b92915050565b5f611d4c611aa0565b5f10905090565b5f33905090565b5f611d8d83838688604051602001611d729190612e83565b60405160208183030381529060405280519060200120611d97565b9050949350505050565b5f82611da4868685611daf565b149050949350505050565b5f808290505f5b85859050811015611df357611de482878784818110611dd857611dd76123fe565b5b90506020020135611dff565b91508080600101915050611db6565b50809150509392505050565b5f818310611e1657611e118284611e29565b611e21565b611e208383611e29565b5b905092915050565b5f825f528160205260405f20905092915050565b5f61ffff82169050919050565b611e5381611e3d565b82525050565b5f602082019050611e6c5f830184611e4a565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611eac82611e83565b9050919050565b611ebc81611ea2565b8114611ec6575f80fd5b50565b5f81359050611ed781611eb3565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611efe57611efd611edd565b5b8235905067ffffffffffffffff811115611f1b57611f1a611ee1565b5b602083019150836020820283011115611f3757611f36611ee5565b5b9250929050565b5f805f60408486031215611f5557611f54611e7b565b5b5f611f6286828701611ec9565b935050602084013567ffffffffffffffff811115611f8357611f82611e7f565b5b611f8f86828701611ee9565b92509250509250925092565b5f8083601f840112611fb057611faf611edd565b5b8235905067ffffffffffffffff811115611fcd57611fcc611ee1565b5b602083019150836020820283011115611fe957611fe8611ee5565b5b9250929050565b611ff981611e3d565b8114612003575f80fd5b50565b5f8135905061201481611ff0565b92915050565b5f805f6040848603121561203157612030611e7b565b5b5f84013567ffffffffffffffff81111561204e5761204d611e7f565b5b61205a86828701611f9b565b9350935050602061206d86828701612006565b9150509250925092565b5f819050919050565b61208981612077565b8114612093575f80fd5b50565b5f813590506120a481612080565b92915050565b5f805f606084860312156120c1576120c0611e7b565b5b5f6120ce86828701612096565b93505060206120df86828701612006565b92505060406120f086828701612006565b9150509250925092565b5f6020828403121561210f5761210e611e7b565b5b5f61211c84828501612006565b91505092915050565b5f806040838503121561213b5761213a611e7b565b5b5f61214885828601611ec9565b925050602061215985828601612006565b9150509250929050565b5f806040838503121561217957612178611e7b565b5b5f61218685828601612096565b925050602061219785828601612006565b9150509250929050565b5f602082840312156121b6576121b5611e7b565b5b5f6121c384828501611ec9565b91505092915050565b5f819050919050565b6121de816121cc565b82525050565b5f6020820190506121f75f8301846121d5565b92915050565b61220681611ea2565b82525050565b5f60208201905061221f5f8301846121fd565b92915050565b5f805f806060858703121561223d5761223c611e7b565b5b5f61224a87828801612006565b945050602061225b87828801612006565b935050604085013567ffffffffffffffff81111561227c5761227b611e7f565b5b61228887828801611ee9565b925092505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6122cd82611e3d565b91506122d883611e3d565b9250828203905061ffff8111156122f2576122f1612296565b5b92915050565b5f82825260208201905092915050565b7f636c61696d7320616c72656164792070617573656400000000000000000000005f82015250565b5f61233c6015836122f8565b915061234782612308565b602082019050919050565b5f6020820190508181035f83015261236981612330565b9050919050565b7f6e6f7420656e7566662077616c6c657444726f707320666f7220616c6c2074685f8201527f6174000000000000000000000000000000000000000000000000000000000000602082015250565b5f6123ca6022836122f8565b91506123d582612370565b604082019050919050565b5f6020820190508181035f8301526123f7816123be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61243582611e3d565b915061ffff820361244957612448612296565b5b600182019050919050565b7f636c61696d73206e6f74207061757365640000000000000000000000000000005f82015250565b5f6124886011836122f8565b915061249382612454565b602082019050919050565b5f6020820190508181035f8301526124b58161247c565b9050919050565b7f63616e6e6f7420737570706c792074686973206d616e792064726f70732c20705f8201527f6c65617365206c6f7765722074686520616d6f756e7400000000000000000000602082015250565b5f6125166036836122f8565b9150612521826124bc565b604082019050919050565b5f6020820190508181035f8301526125438161250a565b9050919050565b5f61255482611e3d565b915061255f83611e3d565b9250828201905061ffff81111561257957612578612296565b5b92915050565b7f4e6f20536b656c657068756e6b7320636f6e7472616374206c696e6b656400005f82015250565b5f6125b3601e836122f8565b91506125be8261257f565b602082019050919050565b5f6020820190508181035f8301526125e0816125a7565b9050919050565b7f636c61696d6573206172652070617573656400000000000000000000000000005f82015250565b5f61261b6012836122f8565b9150612626826125e7565b602082019050919050565b5f6020820190508181035f8301526126488161260f565b9050919050565b7f696e76616c69642067656e64657220616e6420646972656374696f6e000000005f82015250565b5f612683601c836122f8565b915061268e8261264f565b602082019050919050565b5f6020820190508181035f8301526126b081612677565b9050919050565b7f575446207363616d6d65720000000000000000000000000000000000000000005f82015250565b5f6126eb600b836122f8565b91506126f6826126b7565b602082019050919050565b5f6020820190508181035f830152612718816126df565b9050919050565b7f416c72656164792064726f70706564206d6f7265207468616e207468617400005f82015250565b5f612753601e836122f8565b915061275e8261271f565b602082019050919050565b5f6020820190508181035f83015261278081612747565b9050919050565b7f4e6f7420656e6f756768206d696e747320696e206372797074000000000000005f82015250565b5f6127bb6019836122f8565b91506127c682612787565b602082019050919050565b5f6020820190508181035f8301526127e8816127af565b9050919050565b7f6e6f7420656e6f7567682064726f707320666f7220746869732077616c6c65745f8201527f20746f20636c61696d2074686973207175616e74697479000000000000000000602082015250565b5f6128496037836122f8565b9150612854826127ef565b604082019050919050565b5f6020820190508181035f8301526128768161283d565b9050919050565b7f617474656d7074656420746f20636c61696d206d6f7265207468616e206d61785f8201527f5065722066726f6d206c69737400000000000000000000000000000000000000602082015250565b5f6128d7602d836122f8565b91506128e28261287d565b604082019050919050565b5f6020820190508181035f830152612904816128cb565b9050919050565b7f536b656c657068756e6b7320636f6e747261637420616c7265616479207365745f8201527f20746f2074686973000000000000000000000000000000000000000000000000602082015250565b5f6129656028836122f8565b91506129708261290b565b604082019050919050565b5f6020820190508181035f83015261299281612959565b9050919050565b5f81905092915050565b7f534b454c450000000000000000000000000000000000000000000000000000005f82015250565b5f6129d7600583612999565b91506129e2826129a3565b600582019050919050565b5f6129f7826129cb565b9150819050919050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612a4b82612a05565b810181811067ffffffffffffffff82111715612a6a57612a69612a15565b5b80604052505050565b5f612a7c611e72565b9050612a888282612a42565b919050565b5f67ffffffffffffffff821115612aa757612aa6612a15565b5b612ab082612a05565b9050602081019050919050565b5f5b83811015612ada578082015181840152602081019050612abf565b5f8484015250505050565b5f612af7612af284612a8d565b612a73565b905082815260208101848484011115612b1357612b12612a01565b5b612b1e848285612abd565b509392505050565b5f82601f830112612b3a57612b39611edd565b5b8151612b4a848260208601612ae5565b91505092915050565b5f60208284031215612b6857612b67611e7b565b5b5f82015167ffffffffffffffff811115612b8557612b84611e7f565b5b612b9184828501612b26565b91505092915050565b5f81519050919050565b5f612bae82612b9a565b612bb88185612999565b9350612bc8818560208601612abd565b80840191505092915050565b5f612bdf8284612ba4565b915081905092915050565b7f4e6f742074686520536b656c657068756e6b7320636f6e7472616374000000005f82015250565b5f612c1e601c836122f8565b9150612c2982612bea565b602082019050919050565b5f6020820190508181035f830152612c4b81612c12565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612cac6026836122f8565b9150612cb782612c52565b604082019050919050565b5f6020820190508181035f830152612cd981612ca0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612d146020836122f8565b9150612d1f82612ce0565b602082019050919050565b5f6020820190508181035f830152612d4181612d08565b9050919050565b5f819050919050565b5f612d6b612d66612d6184611e3d565b612d48565b6121cc565b9050919050565b612d7b81612d51565b82525050565b5f606082019050612d945f8301866121fd565b612da16020830185612d72565b612dae6040830184612d72565b949350505050565b612dbf816121cc565b8114612dc9575f80fd5b50565b5f81519050612dda81612db6565b92915050565b5f60208284031215612df557612df4611e7b565b5b5f612e0284828501612dcc565b91505092915050565b5f612e15826121cc565b9150612e20836121cc565b9250828203905081811115612e3857612e37612296565b5b92915050565b5f8160601b9050919050565b5f612e5482612e3e565b9050919050565b5f612e6582612e4a565b9050919050565b612e7d612e7882611ea2565b612e5b565b82525050565b5f612e8e8284612e6c565b6014820191508190509291505056fea26469706673582212203d1af33fd5d5b1b5c9980d5b09080391aafbb792df9ae5ee422abf8e44a08ca664736f6c63430008160033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101d7575f3560e01c806377c86e9111610102578063abc5b780116100a0578063dca7830e1161006f578063dca7830e146104cb578063f2fde38b146104fb578063f45d3cc414610517578063fd82c43f14610535576101d7565b8063abc5b7801461046b578063be36890714610475578063c4c14a1414610491578063c7ae2d46146104af576101d7565b806397ec885f116100dc57806397ec885f146103d3578063a0281b4f146103ef578063a471c8751461041f578063a4f489571461044f576101d7565b806377c86e91146103555780638da5cb5b1461038557806397a06092146103a3576101d7565b80633ee60bcf1161017a578063555461e811610149578063555461e8146102f5578063619f867d14610313578063715018a61461032f5780637415375914610339576101d7565b80633ee60bcf1461028157806341c613831461029f5780634763889a146102bd5780634e339725146102d9576101d7565b806329c6b9c6116101b657806329c6b9c6146102335780633751d8e51461023d57806338163f16146102595780633d8f680614610277576101d7565b80623e6597146101db5780630f3314e7146101f957806325612a4e14610203575b5f80fd5b6101e3610565565b6040516101f09190611e59565b60405180910390f35b610201610597565b005b61021d60048036038101906102189190611f3e565b61060c565b60405161022a9190611e59565b60405180910390f35b61023b610634565b005b6102576004803603810190610252919061201a565b610657565b005b610261610725565b60405161026e9190611e59565b60405180910390f35b61027f610738565b005b6102896107ab565b6040516102969190611e59565b60405180910390f35b6102a76107bf565b6040516102b49190611e59565b60405180910390f35b6102d760048036038101906102d291906120aa565b6107d3565b005b6102f360048036038101906102ee91906120fa565b6108d1565b005b6102fd610b74565b60405161030a9190611e59565b60405180910390f35b61032d60048036038101906103289190612125565b610b8b565b005b610337610cce565b005b610353600480360381019061034e9190612163565b610ce1565b005b61036f600480360381019061036a91906121a1565b610cf9565b60405161037c91906121e4565b60405180910390f35b61038d610d21565b60405161039a919061220c565b60405180910390f35b6103bd60048036038101906103b89190611f3e565b610d48565b6040516103ca9190611e59565b60405180910390f35b6103ed60048036038101906103e891906120fa565b610d78565b005b610409600480360381019061040491906121a1565b610e62565b6040516104169190611e59565b60405180910390f35b61043960048036038101906104349190611f3e565b610e86565b6040516104469190611e59565b60405180910390f35b610469600480360381019061046491906121a1565b610ec1565b005b610473610eed565b005b61048f600480360381019061048a9190612225565b610f5d565b005b61049961147f565b6040516104a69190611e59565b60405180910390f35b6104c960048036038101906104c491906121a1565b6114c5565b005b6104e560048036038101906104e091906121a1565b61169f565b6040516104f29190611e59565b60405180910390f35b610515600480360381019061051091906121a1565b6116f2565b005b61051f611774565b60405161052c919061220c565b60405180910390f35b61054f600480360381019061054a91906121a1565b61179c565b60405161055c9190611e59565b60405180910390f35b5f600360049054906101000a900461ffff16600360029054906101000a900461ffff1661059291906122c3565b905090565b61059f6117ef565b6003600a9054906101000a900460ff16156105ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e690612352565b60405180910390fd5b60016003600a6101000a81548160ff021916908315150217905550565b5f6106168461169f565b610621858585610e86565b61062b91906122c3565b90509392505050565b61063c6117ef565b610655600360029054906101000a900461ffff16610d78565b565b61065f6117ef565b61066761147f565b61ffff165f10610675575f80fd5b8282905061068161147f565b61ffff1610156106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd906123e0565b60405180910390fd5b5f5b838390508161ffff16101561071f5761070c84848361ffff168181106106f1576106f06123fe565b5b905060200201602081019061070691906121a1565b83610b8b565b80806107179061242b565b9150506106c8565b50505050565b60035f9054906101000a900461ffff1681565b6107406117ef565b6003600a9054906101000a900460ff1661078f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107869061249e565b60405180910390fd5b5f6003600a6101000a81548160ff021916908315150217905550565b600360029054906101000a900461ffff1681565b600360049054906101000a900461ffff1681565b6107db6117ef565b6107e361147f565b61ffff168261ffff16111561082d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108249061252c565b60405180910390fd5b5f600360069054906101000a900461ffff1661ffff16111561085257610851610eed565b5b81600360028282829054906101000a900461ffff16610871919061254a565b92506101000a81548161ffff021916908361ffff1602179055508260028190555081600360066101000a81548161ffff021916908361ffff16021790555080600360086101000a81548161ffff021916908361ffff160217905550505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff1603610960576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610957906125c9565b60405180910390fd5b6003600a9054906101000a900460ff16156109b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a790612631565b60405180910390fd5b5f8161ffff16101580156109c8575060048161ffff16105b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe90612699565b60405180910390fd5b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1690505f60055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff1690505f8183610ab091906122c3565b90505f819050610ac133828761186d565b8060055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16610b1a919061254a565b92506101000a81548161ffff021916908361ffff16021790555080600360048282829054906101000a900461ffff16610b53919061254a565b92506101000a81548161ffff021916908361ffff1602179055505050505050565b5f600360069054906101000a900461ffff16905090565b610b936117ef565b610b9b61147f565b61ffff165f10610ba9575f80fd5b610bb1610d21565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1590612701565b60405180910390fd5b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16610c77919061254a565b92506101000a81548161ffff021916908361ffff16021790555080600360028282829054906101000a900461ffff16610cb0919061254a565b92506101000a81548161ffff021916908361ffff1602179055505050565b610cd66117ef565b610cdf5f61198c565b565b610ce96117ef565b610cf5828260016107d3565b5050565b5f610d0382611a4d565b610d0c8361169f565b610d1691906122c3565b61ffff169050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6003600a9054906101000a900460ff16610d6d57610d6884848461060c565b610d6f565b5f5b90509392505050565b610d806117ef565b8061ffff16600360029054906101000a900461ffff1661ffff161115610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290612769565b60405180910390fd5b610de3611aa0565b600360029054906101000a900461ffff1682610dff91906122c3565b61ffff1610610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a906127d1565b60405180910390fd5b8060035f6101000a81548161ffff021916908361ffff16021790555050565b5f610e6c82611bd9565b610e7583611a4d565b610e7f91906122c3565b9050919050565b5f610e908461179c565b610e9b858585611c3d565b610ea486611a4d565b610eae919061254a565b610eb8919061254a565b90509392505050565b610ec96117ef565b610ed161147f565b61ffff165f10610edf575f80fd5b610eea816001610b8b565b50565b610ef56117ef565b600360069054906101000a900461ffff16600360028282829054906101000a900461ffff16610f2491906122c3565b92506101000a81548161ffff021916908361ffff1602179055505f600360066101000a81548161ffff021916908361ffff160217905550565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff1603610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906125c9565b60405180910390fd5b6003600a9054906101000a900460ff161561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390612631565b60405180910390fd5b5f8361ffff1610158015611054575060048361ffff16105b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90612699565b60405180910390fd5b5f61109f33848461060c565b90508061ffff168561ffff1611156110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e39061285f565b60405180910390fd5b5f808661ffff16146110fe5785611100565b815b90505f8190505f600360069054906101000a900461ffff1661ffff1611801561112c57505f8161ffff16115b80156111aa5750600360089054906101000a900461ffff1661ffff1660065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff1661ffff16105b156113bf575f6111b933611c88565b90505f6111c68383611d20565b905080600360068282829054906101000a900461ffff166111e791906122c3565b92506101000a81548161ffff021916908361ffff1602179055508060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f8282829054906101000a900461ffff1661126b919061254a565b92506101000a81548161ffff021916908361ffff1602179055508060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff166112de919061254a565b92506101000a81548161ffff021916908361ffff160217905550600360089054906101000a900461ffff1661ffff1660065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff1661ffff1611156113ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a5906128ed565b60405180910390fd5b80836113ba91906122c3565b925050505b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282829054906101000a900461ffff16611418919061254a565b92506101000a81548161ffff021916908361ffff16021790555081600360048282829054906101000a900461ffff16611451919061254a565b92506101000a81548161ffff021916908361ffff16021790555061147633838861186d565b50505050505050565b5f611488611d43565b611494575f90506114c2565b600360029054906101000a900461ffff1660035f9054906101000a900461ffff166114bf91906122c3565b90505b90565b6114cd6117ef565b8073ffffffffffffffffffffffffffffffffffffffff1660015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361155c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115539061297b565b60405180910390fd5b5f81905060405160200161156f906129ed565b604051602081830303815290604052805190602001208173ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa1580156115cd573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906115f59190612b53565b6040516020016116059190612bd4565b604051602081830303815290604052805190602001201461165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290612c34565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b6116fa6117ef565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90612cc2565b60405180910390fd5b6117718161198c565b50565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b6117f7611d53565b73ffffffffffffffffffffffffffffffffffffffff16611815610d21565b73ffffffffffffffffffffffffffffffffffffffff161461186b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186290612d2a565b60405180910390fd5b565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff16036118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906125c9565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166330359e5f8484846040518463ffffffff1660e01b815260040161195a93929190612d81565b5f604051808303815f87803b158015611971575f80fd5b505af1158015611983573d5f803e3d5ffd5b50505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900461ffff169050919050565b5f61029a60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636095049a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b329190612de0565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cffb47cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc09190612de0565b611bca9190612e0b565b611bd49190612e0b565b905090565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff169050919050565b5f805f600360069054906101000a900461ffff1661ffff16118015611c6c5750611c6b856002548686611d5a565b5b15611c7d57611c7a85611c88565b90505b809150509392505050565b5f611d1960065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025481526020019081526020015f205f9054906101000a900461ffff16600360089054906101000a900461ffff16611d0391906122c3565b600360069054906101000a900461ffff16611d20565b9050919050565b5f8161ffff168361ffff161015611d3957829050611d3d565b8190505b92915050565b5f611d4c611aa0565b5f10905090565b5f33905090565b5f611d8d83838688604051602001611d729190612e83565b60405160208183030381529060405280519060200120611d97565b9050949350505050565b5f82611da4868685611daf565b149050949350505050565b5f808290505f5b85859050811015611df357611de482878784818110611dd857611dd76123fe565b5b90506020020135611dff565b91508080600101915050611db6565b50809150509392505050565b5f818310611e1657611e118284611e29565b611e21565b611e208383611e29565b5b905092915050565b5f825f528160205260405f20905092915050565b5f61ffff82169050919050565b611e5381611e3d565b82525050565b5f602082019050611e6c5f830184611e4a565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611eac82611e83565b9050919050565b611ebc81611ea2565b8114611ec6575f80fd5b50565b5f81359050611ed781611eb3565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f840112611efe57611efd611edd565b5b8235905067ffffffffffffffff811115611f1b57611f1a611ee1565b5b602083019150836020820283011115611f3757611f36611ee5565b5b9250929050565b5f805f60408486031215611f5557611f54611e7b565b5b5f611f6286828701611ec9565b935050602084013567ffffffffffffffff811115611f8357611f82611e7f565b5b611f8f86828701611ee9565b92509250509250925092565b5f8083601f840112611fb057611faf611edd565b5b8235905067ffffffffffffffff811115611fcd57611fcc611ee1565b5b602083019150836020820283011115611fe957611fe8611ee5565b5b9250929050565b611ff981611e3d565b8114612003575f80fd5b50565b5f8135905061201481611ff0565b92915050565b5f805f6040848603121561203157612030611e7b565b5b5f84013567ffffffffffffffff81111561204e5761204d611e7f565b5b61205a86828701611f9b565b9350935050602061206d86828701612006565b9150509250925092565b5f819050919050565b61208981612077565b8114612093575f80fd5b50565b5f813590506120a481612080565b92915050565b5f805f606084860312156120c1576120c0611e7b565b5b5f6120ce86828701612096565b93505060206120df86828701612006565b92505060406120f086828701612006565b9150509250925092565b5f6020828403121561210f5761210e611e7b565b5b5f61211c84828501612006565b91505092915050565b5f806040838503121561213b5761213a611e7b565b5b5f61214885828601611ec9565b925050602061215985828601612006565b9150509250929050565b5f806040838503121561217957612178611e7b565b5b5f61218685828601612096565b925050602061219785828601612006565b9150509250929050565b5f602082840312156121b6576121b5611e7b565b5b5f6121c384828501611ec9565b91505092915050565b5f819050919050565b6121de816121cc565b82525050565b5f6020820190506121f75f8301846121d5565b92915050565b61220681611ea2565b82525050565b5f60208201905061221f5f8301846121fd565b92915050565b5f805f806060858703121561223d5761223c611e7b565b5b5f61224a87828801612006565b945050602061225b87828801612006565b935050604085013567ffffffffffffffff81111561227c5761227b611e7f565b5b61228887828801611ee9565b925092505092959194509250565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6122cd82611e3d565b91506122d883611e3d565b9250828203905061ffff8111156122f2576122f1612296565b5b92915050565b5f82825260208201905092915050565b7f636c61696d7320616c72656164792070617573656400000000000000000000005f82015250565b5f61233c6015836122f8565b915061234782612308565b602082019050919050565b5f6020820190508181035f83015261236981612330565b9050919050565b7f6e6f7420656e7566662077616c6c657444726f707320666f7220616c6c2074685f8201527f6174000000000000000000000000000000000000000000000000000000000000602082015250565b5f6123ca6022836122f8565b91506123d582612370565b604082019050919050565b5f6020820190508181035f8301526123f7816123be565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61243582611e3d565b915061ffff820361244957612448612296565b5b600182019050919050565b7f636c61696d73206e6f74207061757365640000000000000000000000000000005f82015250565b5f6124886011836122f8565b915061249382612454565b602082019050919050565b5f6020820190508181035f8301526124b58161247c565b9050919050565b7f63616e6e6f7420737570706c792074686973206d616e792064726f70732c20705f8201527f6c65617365206c6f7765722074686520616d6f756e7400000000000000000000602082015250565b5f6125166036836122f8565b9150612521826124bc565b604082019050919050565b5f6020820190508181035f8301526125438161250a565b9050919050565b5f61255482611e3d565b915061255f83611e3d565b9250828201905061ffff81111561257957612578612296565b5b92915050565b7f4e6f20536b656c657068756e6b7320636f6e7472616374206c696e6b656400005f82015250565b5f6125b3601e836122f8565b91506125be8261257f565b602082019050919050565b5f6020820190508181035f8301526125e0816125a7565b9050919050565b7f636c61696d6573206172652070617573656400000000000000000000000000005f82015250565b5f61261b6012836122f8565b9150612626826125e7565b602082019050919050565b5f6020820190508181035f8301526126488161260f565b9050919050565b7f696e76616c69642067656e64657220616e6420646972656374696f6e000000005f82015250565b5f612683601c836122f8565b915061268e8261264f565b602082019050919050565b5f6020820190508181035f8301526126b081612677565b9050919050565b7f575446207363616d6d65720000000000000000000000000000000000000000005f82015250565b5f6126eb600b836122f8565b91506126f6826126b7565b602082019050919050565b5f6020820190508181035f830152612718816126df565b9050919050565b7f416c72656164792064726f70706564206d6f7265207468616e207468617400005f82015250565b5f612753601e836122f8565b915061275e8261271f565b602082019050919050565b5f6020820190508181035f83015261278081612747565b9050919050565b7f4e6f7420656e6f756768206d696e747320696e206372797074000000000000005f82015250565b5f6127bb6019836122f8565b91506127c682612787565b602082019050919050565b5f6020820190508181035f8301526127e8816127af565b9050919050565b7f6e6f7420656e6f7567682064726f707320666f7220746869732077616c6c65745f8201527f20746f20636c61696d2074686973207175616e74697479000000000000000000602082015250565b5f6128496037836122f8565b9150612854826127ef565b604082019050919050565b5f6020820190508181035f8301526128768161283d565b9050919050565b7f617474656d7074656420746f20636c61696d206d6f7265207468616e206d61785f8201527f5065722066726f6d206c69737400000000000000000000000000000000000000602082015250565b5f6128d7602d836122f8565b91506128e28261287d565b604082019050919050565b5f6020820190508181035f830152612904816128cb565b9050919050565b7f536b656c657068756e6b7320636f6e747261637420616c7265616479207365745f8201527f20746f2074686973000000000000000000000000000000000000000000000000602082015250565b5f6129656028836122f8565b91506129708261290b565b604082019050919050565b5f6020820190508181035f83015261299281612959565b9050919050565b5f81905092915050565b7f534b454c450000000000000000000000000000000000000000000000000000005f82015250565b5f6129d7600583612999565b91506129e2826129a3565b600582019050919050565b5f6129f7826129cb565b9150819050919050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612a4b82612a05565b810181811067ffffffffffffffff82111715612a6a57612a69612a15565b5b80604052505050565b5f612a7c611e72565b9050612a888282612a42565b919050565b5f67ffffffffffffffff821115612aa757612aa6612a15565b5b612ab082612a05565b9050602081019050919050565b5f5b83811015612ada578082015181840152602081019050612abf565b5f8484015250505050565b5f612af7612af284612a8d565b612a73565b905082815260208101848484011115612b1357612b12612a01565b5b612b1e848285612abd565b509392505050565b5f82601f830112612b3a57612b39611edd565b5b8151612b4a848260208601612ae5565b91505092915050565b5f60208284031215612b6857612b67611e7b565b5b5f82015167ffffffffffffffff811115612b8557612b84611e7f565b5b612b9184828501612b26565b91505092915050565b5f81519050919050565b5f612bae82612b9a565b612bb88185612999565b9350612bc8818560208601612abd565b80840191505092915050565b5f612bdf8284612ba4565b915081905092915050565b7f4e6f742074686520536b656c657068756e6b7320636f6e7472616374000000005f82015250565b5f612c1e601c836122f8565b9150612c2982612bea565b602082019050919050565b5f6020820190508181035f830152612c4b81612c12565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612cac6026836122f8565b9150612cb782612c52565b604082019050919050565b5f6020820190508181035f830152612cd981612ca0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612d146020836122f8565b9150612d1f82612ce0565b602082019050919050565b5f6020820190508181035f830152612d4181612d08565b9050919050565b5f819050919050565b5f612d6b612d66612d6184611e3d565b612d48565b6121cc565b9050919050565b612d7b81612d51565b82525050565b5f606082019050612d945f8301866121fd565b612da16020830185612d72565b612dae6040830184612d72565b949350505050565b612dbf816121cc565b8114612dc9575f80fd5b50565b5f81519050612dda81612db6565b92915050565b5f60208284031215612df557612df4611e7b565b5b5f612e0284828501612dcc565b91505092915050565b5f612e15826121cc565b9150612e20836121cc565b9250828203905081811115612e3857612e37612296565b5b92915050565b5f8160601b9050919050565b5f612e5482612e3e565b9050919050565b5f612e6582612e4a565b9050919050565b612e7d612e7882611ea2565b612e5b565b82525050565b5f612e8e8284612e6c565b6014820191508190509291505056fea26469706673582212203d1af33fd5d5b1b5c9980d5b09080391aafbb792df9ae5ee422abf8e44a08ca664736f6c63430008160033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.