ERC-721
Overview
Max Total Supply
7,007 GOON
Holders
1,265
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 GOONLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Maxigoons
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "./NFT.sol"; contract Maxigoons is NFT { constructor(address vrfCoordinator, address linkToken) ERC721a("Maxigoons", "GOON") NFT( 7007, // Max supply 707, // Reserve amount 100, // Max per wallet "bafybeicxiym4ou5ephvt4j66if3axll3s3uq7axspgcdjr5tvrtrfboqsa", // Content ID (CID) "bab93ab37b236a32545c4bb2239ac9da276bc18324bcdcf0d86e0d225299db7b", // Provenance Hash 0x9d14CAea98d6Ef30Ae169c361D2540dd680Bc280, // Vault address vrfCoordinator, linkToken ) {} function claim(bytes32[] memory proof) public { _sell(0, 1, 0, proof); } function presale(uint256 amount, bytes32[] memory proof) public payable { _sell(1, amount, msg.value, proof); } function buy(uint256 amount) public payable { _sell(2, amount, msg.value, new bytes32[](0)); } function mint( uint256 index, uint256 amount, bytes32[] memory proof ) public payable { _sell(index, amount, msg.value, proof); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol"; import "./ERC721a.sol"; abstract contract NFT is ERC721a, VRFConsumerBase { struct Sale { uint256 unitPrice; uint256 maxAmount; bytes32 treeRoot; } event OwnerUpdated(address indexed user, address indexed newOwner); event Revealed(uint256 seed, bytes32 requestId); bool public enabled; address public owner; address public vault; string public contentId; string public provenance; uint256 public maxSupply; uint256 public maxPerWallet; uint256 public reserveAmount; uint256 public seed; uint256 public level; uint256 public vrfFee = 2 * 10**18; bytes32 public vrfHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445; Sale[] public sales; mapping(uint256 => mapping(address => uint256)) public balanceOfSale; constructor( uint256 _maxSupply, uint256 _reserveAmount, uint256 _maxPerWallet, string memory _contentId, string memory _provenance, address _vault, address vrfCoordinator, address linkToken ) VRFConsumerBase(vrfCoordinator, linkToken) { maxSupply = _maxSupply; reserveAmount = _reserveAmount; maxPerWallet = _maxPerWallet; contentId = _contentId; provenance = _provenance; vault = _vault; owner = msg.sender; } modifier onlyOwner() { require(msg.sender == owner, "401"); _; } function updateOwner(address newOwner) external onlyOwner { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } function setVRF(uint256 fee, bytes32 _hash) external onlyOwner { vrfFee = fee; vrfHash = _hash; } function setSale( uint256 index, uint256 unitPrice, uint256 maxAmount, bytes32 treeRoot ) external onlyOwner { require(index <= sales.length, "422"); if (index == sales.length) { // Create sales.push(Sale(unitPrice, maxAmount, treeRoot)); } else { // Update Sale storage sale = sales[index]; sale.unitPrice = unitPrice; sale.maxAmount = maxAmount; sale.treeRoot = treeRoot; } } function setLevel(uint256 index) external onlyOwner { require(sales.length > 0 && index < sales.length, "422"); level = index; } function enable() external onlyOwner { enabled = true; } function disable() external onlyOwner { enabled = false; } function reveal() public onlyOwner returns (bytes32) { require(seed == 0, "403"); require(LINK.balanceOf(address(this)) >= vrfFee, "402"); return requestRandomness(vrfHash, vrfFee); } function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { require(seed == 0, "403"); seed = randomness; emit Revealed(randomness, requestId); } function hasLevel( uint256 index, address candidate, bytes32[] memory proof ) public view returns (bool) { require(index < sales.length, "404"); Sale memory sale = sales[index]; return MerkleProof.verify( proof, sale.treeRoot, keccak256(abi.encodePacked(candidate)) ); } function withdraw() external onlyOwner { payable(vault).transfer(address(this).balance); } function baseURI() public view virtual returns (string memory) { return string(abi.encodePacked("ipfs://", contentId, "/metadata/")); } function tokenURI(uint256 id) public view override returns (string memory) { require(_ownerOf(id) != address(0), "404"); uint256 metaId; if (seed == 0) { // Conceal metaId = 0; } else { // Reveal metaId = _metadataOf(id); } return string(abi.encodePacked(baseURI(), toString(metaId), ".json")); } function contractURI() public view virtual returns (string memory) { return string(abi.encodePacked(baseURI(), "contract.json")); } function reserve(uint256 amount) public virtual onlyOwner { require(seed == 0, "403"); require(totalSupply + amount <= maxSupply, "403"); require(balanceOf[vault] + amount <= reserveAmount, "403"); _safeMintBatch(vault, amount); } function _metadataOf(uint256 id) internal view returns (uint256) { uint256 seed_ = seed; uint256 max = maxSupply; uint256[] memory idToMeta = new uint256[](max); for (uint256 i = 0; i < max; i++) { idToMeta[i] = i; } for (uint256 i = 0; i < max - 1; i++) { uint256 j = i + (uint256(keccak256(abi.encode(seed_, i))) % (max - i)); (idToMeta[i], idToMeta[j]) = (idToMeta[j], idToMeta[i]); } // Token ID starts at #1 return idToMeta[id - 1] + 1; } function _sell( uint256 index, uint256 amount, uint256 value, bytes32[] memory proof ) internal { Sale memory sale = sales[index]; bool isProtected = sale.treeRoot != 0; // Unauthorized require(enabled && sales.length > 0, "401"); if (isProtected) { require(hasLevel(index, msg.sender, proof), "401"); } // Payment required require(amount * sale.unitPrice == value, "402"); // Forbidden require(index <= level, "403"); require(balanceOf[msg.sender] + amount <= maxPerWallet, "403"); require(totalSupply + amount <= maxSupply, "403"); if (isProtected) { balanceOfSale[index][msg.sender] += amount; require(balanceOfSale[index][msg.sender] <= sale.maxAmount, "403"); } else { // Open sale // Trick `sale.maxAmount` becomes `maxPerTx` require(amount <= sale.maxAmount, "403"); } _safeMintBatch(msg.sender, amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./interfaces/LinkTokenInterface.sol"; import "./VRFRequestIDBase.sol"; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator, _link) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously.) * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. */ abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 private constant USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface internal immutable LINK; address private immutable vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 => uint256) /* keyHash */ /* nonce */ private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor(address _vrfCoordinator, address _link) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import "./ERC721TokenReceiver.sol"; /// @notice Credits: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol /// @dev Note Assumes serials are sequentially minted starting at 1 (e.g. 1, 2, 3, 4...). /// @dev Note Does not support burning tokens to address(0). /// @author Modified from solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721a { /*/////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /*/////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*/////////////////////////////////////////////////////////////// ERC721 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; mapping(uint256 => address) internal owners; /*/////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*/////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes memory data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*/////////////////////////////////////////////////////////////// ERC721a LOGIC //////////////////////////////////////////////////////////////*/ function ownerOf(uint256 id) public view returns (address) { return _ownerOf(id); } function approve(address spender, uint256 id) public { address owner = _ownerOf(id); require( msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED" ); getApproved[id] = spender; emit Approval(owner, spender, id); } function transferFrom( address from, address to, uint256 id ) public { address owner = _ownerOf(id); require(from == owner, "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED" ); // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L395 unchecked { balanceOf[from]--; balanceOf[to]++; } owners[id] = to; // https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol#L405 if (id + 1 <= totalSupply && owners[id + 1] == address(0)) { owners[id + 1] = owner; } delete getApproved[id]; emit Transfer(from, to, id); } function _safeMintBatch(address to, uint256 amount) internal { _safeMintBatch(to, amount, ""); } function _safeMintBatch( address to, uint256 amount, bytes memory data ) internal { _mintBatch(to, amount, data, true); } function _mintBatch(address to, uint256 amount) internal { _mintBatch(to, amount, "", false); } function _mintBatch( address to, uint256 amount, bytes memory data ) internal { _mintBatch(to, amount, data, false); } function _mintBatch( address to, uint256 amount, bytes memory data, bool safe ) internal { require(to != address(0), "INVALID_RECIPIENT"); unchecked { uint256 id = totalSupply + 1; totalSupply += amount; balanceOf[to] += amount; owners[id] = to; for (uint256 i = 0; i < amount; i++) { emit Transfer(address(0), to, id); if (safe) { require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received( msg.sender, address(0), id, data ) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } id++; } } } function _ownerOf(uint256 id) internal view returns (address) { if (id > totalSupply) { return address(0); } unchecked { while (id > 0) { if (owners[id] != address(0)) { return owners[id]; } id--; } } // Happens only when `id == 0` return address(0); } /// @notice Credits: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol#L15 function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /*/////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance(address owner, address spender) external view returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external view returns (uint256 balance); function decimals() external view returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external view returns (string memory tokenName); function symbol() external view returns (string memory tokenSymbol); function totalSupply() external view returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns (bool success); function transferFrom( address from, address to, uint256 value ) external returns (bool success); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns (uint256) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) interface ERC721TokenReceiver { function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external returns (bytes4); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"vrfCoordinator","type":"address"},{"internalType":"address","name":"linkToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"seed","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"requestId","type":"bytes32"}],"name":"Revealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balanceOfSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contentId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"hasLevel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"level","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sales","outputs":[{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"unitPrice","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"bytes32","name":"treeRoot","type":"bytes32"}],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setVRF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vrfHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052671bc16d674ec800006011557faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44560001b6012553480156200004457600080fd5b50604051620051963803806200519683398181016040528101906200006a91906200036f565b611b5f6102c360646040518060600160405280603b81526020016200511b603b91396040518060600160405280604081526020016200515660409139739d14caea98d6ef30ae169c361d2540dd680bc280878781816040518060400160405280600981526020017f4d617869676f6f6e7300000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474f4f4e00000000000000000000000000000000000000000000000000000000815250816000908051906020019062000143929190620002a8565b5080600190805190602001906200015c929190620002a8565b5050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505087600c8190555086600e8190555085600d8190555084600a9080519060200190620001fc929190620002a8565b5083600b908051906020019062000215929190620002a8565b5082600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505062000463565b828054620002b690620003e4565b90600052602060002090601f016020900481019282620002da576000855562000326565b82601f10620002f557805160ff191683800117855562000326565b8280016001018555821562000326579182015b828111156200032557825182559160200191906001019062000308565b5b50905062000335919062000339565b5090565b5b80821115620003545760008160009055506001016200033a565b5090565b600081519050620003698162000449565b92915050565b600080604083850312156200038357600080fd5b6000620003938582860162000358565b9250506020620003a68582860162000358565b9150509250929050565b6000620003bd82620003c4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003fd57607f821691505b602082108114156200041457620004136200041a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6200045481620003b0565b81146200046057600080fd5b50565b60805160601c60a05160601c614c7e6200049d60003960008181611de0015261288201526000818161218e01526128460152614c7e6000f3fe6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c6343000804003362616679626569637869796d346f75356570687674346a363669663361786c6c337333757137617873706763646a7235747672747266626f71736162616239336162333762323336613332353435633462623232333961633964613237366263313833323462636463663064383665306432323532393964623762000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Deployed Bytecode
0x6080604052600436106102725760003560e01c80637d94792a1161014f578063b391c508116100c1578063d96a094a1161007a578063d96a094a14610933578063d97aa9771461094f578063e6d37b881461097a578063e8a3d48514610996578063e985e9c5146109c1578063fbfa77cf146109fe57610272565b8063b391c5081461081e578063b5f522f714610847578063b88d4fde14610886578063c13bd95c146108af578063c87b56dd146108cb578063d5abeb011461090857610272565b8063907316d011610113578063907316d01461073457806394985ddd1461075f57806395d89b4114610788578063a22cb465146107b3578063a3907d71146107dc578063a475b5dd146107f357610272565b80637d94792a1461064f578063819b25ba1461067a57806381e3e88a146106a3578063880cdc31146106e05780638da5cb5b1461070957610272565b80632f2770db116101e85780634b09b72a116101ac5780634b09b72a146105175780635feb1446146105425780636352211e1461057f5780636c0360eb146105bc5780636fd5ae15146105e757806370a082311461061257610272565b80632f2770db1461046c5780633ccfd60b1461048357806342842e0e1461049a578063453c2310146104c357806349f2f929146104ee57610272565b80631017507d1161023a5780631017507d1461037057806318160ddd1461039b57806319f428fa146103c6578063238dafe0146103ef57806323b872dd1461041a57806327a5428b1461044357610272565b806301ffc9a71461027757806306fdde03146102b4578063081812fc146102df578063095ea7b31461031c5780630f7309e814610345575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613a47565b610a29565b6040516102ab919061424c565b60405180910390f35b3480156102c057600080fd5b506102c9610abb565b6040516102d691906142f0565b60405180910390f35b3480156102eb57600080fd5b5061030660048036038101906103019190613a99565b610b49565b604051610313919061415d565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613965565b610b7c565b005b34801561035157600080fd5b5061035a610d3a565b60405161036791906142f0565b60405180910390f35b34801561037c57600080fd5b50610385610dc8565b6040516103929190614452565b60405180910390f35b3480156103a757600080fd5b506103b0610dce565b6040516103bd9190614452565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190613be2565b610dd4565b005b3480156103fb57600080fd5b50610404610e76565b604051610411919061424c565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c919061385f565b610e89565b005b34801561044f57600080fd5b5061046a60048036038101906104659190613a99565b611351565b005b34801561047857600080fd5b50610481611443565b005b34801561048f57600080fd5b506104986114f0565b005b3480156104a657600080fd5b506104c160048036038101906104bc919061385f565b6115eb565b005b3480156104cf57600080fd5b506104d8611732565b6040516104e59190614452565b60405180910390f35b3480156104fa57600080fd5b5061051560048036038101906105109190613c85565b611738565b005b34801561052357600080fd5b5061052c6118f7565b6040516105399190614452565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613aeb565b6118fd565b6040516105769190614452565b60405180910390f35b34801561058b57600080fd5b506105a660048036038101906105a19190613a99565b611922565b6040516105b3919061415d565b60405180910390f35b3480156105c857600080fd5b506105d1611934565b6040516105de91906142f0565b60405180910390f35b3480156105f357600080fd5b506105fc61195c565b6040516106099190614452565b60405180910390f35b34801561061e57600080fd5b50610639600480360381019061063491906137fa565b611962565b6040516106469190614452565b60405180910390f35b34801561065b57600080fd5b5061066461197a565b6040516106719190614452565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613a99565b611980565b005b3480156106af57600080fd5b506106ca60048036038101906106c59190613b27565b611b87565b6040516106d7919061424c565b60405180910390f35b3480156106ec57600080fd5b50610707600480360381019061070291906137fa565b611c84565b005b34801561071557600080fd5b5061071e611db2565b60405161072b919061415d565b60405180910390f35b34801561074057600080fd5b50610749611dd8565b6040516107569190614267565b60405180910390f35b34801561076b57600080fd5b5061078660048036038101906107819190613a0b565b611dde565b005b34801561079457600080fd5b5061079d611e7a565b6040516107aa91906142f0565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613929565b611f08565b005b3480156107e857600080fd5b506107f1612005565b005b3480156107ff57600080fd5b506108086120b2565b6040516108159190614267565b60405180910390f35b34801561082a57600080fd5b50610845600480360381019061084091906139a1565b612289565b005b34801561085357600080fd5b5061086e60048036038101906108699190613a99565b61229b565b60405161087d939291906144bf565b60405180910390f35b34801561089257600080fd5b506108ad60048036038101906108a891906138ae565b6122d5565b005b6108c960048036038101906108c49190613b8e565b61241f565b005b3480156108d757600080fd5b506108f260048036038101906108ed9190613a99565b612430565b6040516108ff91906142f0565b60405180910390f35b34801561091457600080fd5b5061091d612504565b60405161092a9190614452565b60405180910390f35b61094d60048036038101906109489190613a99565b61250a565b005b34801561095b57600080fd5b50610964612589565b60405161097191906142f0565b60405180910390f35b610994600480360381019061098f9190613c1e565b612617565b005b3480156109a257600080fd5b506109ab612628565b6040516109b891906142f0565b60405180910390f35b3480156109cd57600080fd5b506109e860048036038101906109e39190613823565b612656565b6040516109f5919061424c565b60405180910390f35b348015610a0a57600080fd5b50610a13612685565b604051610a20919061415d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60008054610ac8906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610af4906147a5565b8015610b415780601f10610b1657610100808354040283529160200191610b41565b820191906000526020600020905b815481529060010190602001808311610b2457829003601f168201915b505050505081565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b87826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c495750600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90614412565b60405180910390fd5b826004600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b8054610d47906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d73906147a5565b8015610dc05780601f10610d9557610100808354040283529160200191610dc0565b820191906000526020600020905b815481529060010190602001808311610da357829003601f168201915b505050505081565b60115481565b60025481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90614332565b60405180910390fd5b81601181905550806012819055505050565b600860009054906101000a900460ff1681565b6000610e94826126ab565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610f04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efb90614432565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6b90614372565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061100c57506004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061109d5750600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390614412565b60405180910390fd5b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002546001836111dd91906145d0565b111580156112565750600073ffffffffffffffffffffffffffffffffffffffff166006600060018561120f91906145d0565b815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b156112ba57806006600060018561126d91906145d0565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d890614332565b60405180910390fd5b60006013805490501180156113fa575060138054905081105b611439576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143090614352565b60405180910390fd5b8060108190555050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ca90614332565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790614332565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156115e8573d6000803e3d6000fd5b50565b6115f6838383610e89565b60008273ffffffffffffffffffffffffffffffffffffffff163b14806116ee575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161167b939291906141c4565b602060405180830381600087803b15801561169557600080fd5b505af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61172d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611724906143b2565b60405180910390fd5b505050565b600d5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf90614332565b60405180910390fd5b601380549050841115611810576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180790614352565b60405180910390fd5b601380549050841415611888576013604051806060016040528085815260200184815260200183815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000155602082015181600101556040820151816002015550506118f1565b6000601385815481106118c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302019050838160000181905550828160010181905550818160020181905550505b50505050565b600e5481565b6014602052816000526040600020602052806000526040600020600091509150505481565b600061192d826126ab565b9050919050565b6060600a6040516020016119489190614130565b604051602081830303815290604052905090565b60105481565b60036020528060005260406000206000915090505481565b600f5481565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790614332565b60405180910390fd5b6000600f5414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90614312565b60405180910390fd5b600c5481600254611a6691906145d0565b1115611aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9e90614312565b60405180910390fd5b600e548160036000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b1791906145d0565b1115611b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4f90614312565b60405180910390fd5b611b84600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612784565b50565b60006013805490508410611bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc7906143f2565b60405180910390fd5b600060138581548110611c0c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250509050611c7a83826040015186604051602001611c5f9190614098565b604051602081830303815290604052805190602001206127a2565b9150509392505050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b90614332565b60405180910390fd5b80600860016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7660405160405180910390a350565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125481565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e63906143d2565b60405180910390fd5b611e7682826127b9565b5050565b60018054611e87906147a5565b80601f0160208091040260200160405190810160405280929190818152602001828054611eb3906147a5565b8015611f005780601f10611ed557610100808354040283529160200191611f00565b820191906000526020600020905b815481529060010190602001808311611ee357829003601f168201915b505050505081565b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ff9919061424c565b60405180910390a35050565b600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612095576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208c90614332565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b6000600860019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213b90614332565b60405180910390fd5b6000600f5414612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614312565b60405180910390fd5b6011547f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121e5919061415d565b60206040518083038186803b1580156121fd57600080fd5b505afa158015612211573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122359190613ac2565b1015612276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d90614392565b60405180910390fd5b612284601254601154612842565b905090565b612298600060016000846129a4565b50565b601381815481106122ab57600080fd5b90600052602060002090600302016000915090508060000154908060010154908060020154905083565b6122e0848484610e89565b60008373ffffffffffffffffffffffffffffffffffffffff163b14806123da575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b81526004016123679493929190614178565b602060405180830381600087803b15801561238157600080fd5b505af1158015612395573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b99190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b612419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612410906143b2565b60405180910390fd5b50505050565b61242c60018334846129a4565b5050565b6060600073ffffffffffffffffffffffffffffffffffffffff16612453836126ab565b73ffffffffffffffffffffffffffffffffffffffff1614156124aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a1906143f2565b60405180910390fd5b600080600f5414156124bf57600090506124cb565b6124c883612db3565b90505b6124d3611934565b6124dc82613086565b6040516020016124ed9291906140df565b604051602081830303815290604052915050919050565b600c5481565b61258660028234600067ffffffffffffffff811115612552577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156125805781602001602082028036833780820191505090505b506129a4565b50565b600a8054612596906147a5565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906147a5565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b505050505081565b612623838334846129a4565b505050565b6060612632611934565b604051602001612642919061410e565b604051602081830303815290604052905090565b60056020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006002548211156126c0576000905061277f565b5b600082111561277a57600073ffffffffffffffffffffffffffffffffffffffff166006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461276c576006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061277f565b8180600190039250506126c1565b600090505b919050565b61279e828260405180602001604052806000815250613233565b5050565b6000826127af8584613245565b1490509392505050565b6000600f54146127fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f590614312565b60405180910390fd5b80600f819055507f7d69e344e8948ee2d0ae2411f140ed9d811e9281db0368d2f77a802d9d8346f5818360405161283692919061446d565b60405180910390a15050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016128b6929190614282565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016128e39392919061420e565b602060405180830381600087803b1580156128fd57600080fd5b505af1158015612911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061293591906139e2565b5060006129588460003060076000898152602001908152602001600020546132e0565b90506001600760008681526020019081526020016000205461297a91906145d0565b600760008681526020019081526020016000208190555061299b848261331c565b91505092915050565b6000601385815481106129e0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905060008060001b826040015114159050600860009054906101000a900460ff168015612a4957506000601380549050115b612a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7f90614332565b60405180910390fd5b8015612ad957612a99863385611b87565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614332565b60405180910390fd5b5b83826000015186612aea9190614657565b14612b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2190614392565b60405180910390fd5b601054861115612b6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6690614312565b60405180910390fd5b600d5485600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612bbd91906145d0565b1115612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf590614312565b60405180910390fd5b600c5485600254612c0f91906145d0565b1115612c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4790614312565b60405180910390fd5b8015612d5957846014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cb691906145d0565b9250508190555081602001516014600088815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115612d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4b90614312565b60405180910390fd5b612da1565b8160200151851115612da0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9790614312565b60405180910390fd5b5b612dab3386612784565b505050505050565b600080600f5490506000600c54905060008167ffffffffffffffff811115612e04577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612e325781602001602082028036833780820191505090505b50905060005b82811015612e995780828281518110612e7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612e9190614808565b915050612e38565b5060005b600183612eaa91906146b1565b8110156130225760008184612ebf91906146b1565b8583604051602001612ed2929190614496565b6040516020818303038152906040528051906020012060001c612ef59190614889565b82612f0091906145d0565b9050828181518110612f3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110612f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151848481518110612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101858481518110612ffd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018281525082815250505050808061301a90614808565b915050612e9d565b5060018160018761303391906146b1565b8151811061306a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161307c91906145d0565b9350505050919050565b606060008214156130ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061322e565b600082905060005b600082146131005780806130e990614808565b915050600a826130f99190614626565b91506130d6565b60008167ffffffffffffffff811115613142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156131745781602001600182028036833780820191505090505b5090505b600085146132275760018261318d91906146b1565b9150600a8561319c9190614889565b60306131a891906145d0565b60f81b8183815181106131e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132209190614626565b9450613178565b8093505050505b919050565b613240838383600161334f565b505050565b60008082905060005b84518110156132d5576000858281518110613292577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508083116132b4576132ad838261363d565b92506132c1565b6132be818461363d565b92505b5080806132cd90614808565b91505061324e565b508091505092915050565b6000848484846040516020016132f994939291906142ab565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016133319291906140b3565b60405160208183030381529060405280519060200120905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b690614372565b60405180910390fd5b600060016002540190508360026000828254019250508190555083600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550846006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b8481101561363557818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a482156136205760008673ffffffffffffffffffffffffffffffffffffffff163b14806135e0575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168673ffffffffffffffffffffffffffffffffffffffff1663150b7a0233600086896040518563ffffffff1660e01b815260040161356d9493929190614178565b602060405180830381600087803b15801561358757600080fd5b505af115801561359b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bf9190613a70565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61361f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613616906143b2565b60405180910390fd5b5b8180600101925050808060010191505061347b565b505050505050565b600082600052816020526040600020905092915050565b60006136676136628461451b565b6144f6565b9050808382526020820190508285602086028201111561368657600080fd5b60005b858110156136b6578161369c8882613767565b845260208401935060208301925050600181019050613689565b5050509392505050565b60006136d36136ce84614547565b6144f6565b9050828152602081018484840111156136eb57600080fd5b6136f6848285614763565b509392505050565b60008135905061370d81614bd5565b92915050565b600082601f83011261372457600080fd5b8135613734848260208601613654565b91505092915050565b60008135905061374c81614bec565b92915050565b60008151905061376181614bec565b92915050565b60008135905061377681614c03565b92915050565b60008135905061378b81614c1a565b92915050565b6000815190506137a081614c1a565b92915050565b600082601f8301126137b757600080fd5b81356137c78482602086016136c0565b91505092915050565b6000813590506137df81614c31565b92915050565b6000815190506137f481614c31565b92915050565b60006020828403121561380c57600080fd5b600061381a848285016136fe565b91505092915050565b6000806040838503121561383657600080fd5b6000613844858286016136fe565b9250506020613855858286016136fe565b9150509250929050565b60008060006060848603121561387457600080fd5b6000613882868287016136fe565b9350506020613893868287016136fe565b92505060406138a4868287016137d0565b9150509250925092565b600080600080608085870312156138c457600080fd5b60006138d2878288016136fe565b94505060206138e3878288016136fe565b93505060406138f4878288016137d0565b925050606085013567ffffffffffffffff81111561391157600080fd5b61391d878288016137a6565b91505092959194509250565b6000806040838503121561393c57600080fd5b600061394a858286016136fe565b925050602061395b8582860161373d565b9150509250929050565b6000806040838503121561397857600080fd5b6000613986858286016136fe565b9250506020613997858286016137d0565b9150509250929050565b6000602082840312156139b357600080fd5b600082013567ffffffffffffffff8111156139cd57600080fd5b6139d984828501613713565b91505092915050565b6000602082840312156139f457600080fd5b6000613a0284828501613752565b91505092915050565b60008060408385031215613a1e57600080fd5b6000613a2c85828601613767565b9250506020613a3d858286016137d0565b9150509250929050565b600060208284031215613a5957600080fd5b6000613a678482850161377c565b91505092915050565b600060208284031215613a8257600080fd5b6000613a9084828501613791565b91505092915050565b600060208284031215613aab57600080fd5b6000613ab9848285016137d0565b91505092915050565b600060208284031215613ad457600080fd5b6000613ae2848285016137e5565b91505092915050565b60008060408385031215613afe57600080fd5b6000613b0c858286016137d0565b9250506020613b1d858286016136fe565b9150509250929050565b600080600060608486031215613b3c57600080fd5b6000613b4a868287016137d0565b9350506020613b5b868287016136fe565b925050604084013567ffffffffffffffff811115613b7857600080fd5b613b8486828701613713565b9150509250925092565b60008060408385031215613ba157600080fd5b6000613baf858286016137d0565b925050602083013567ffffffffffffffff811115613bcc57600080fd5b613bd885828601613713565b9150509250929050565b60008060408385031215613bf557600080fd5b6000613c03858286016137d0565b9250506020613c1485828601613767565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c41868287016137d0565b9350506020613c52868287016137d0565b925050604084013567ffffffffffffffff811115613c6f57600080fd5b613c7b86828701613713565b9150509250925092565b60008060008060808587031215613c9b57600080fd5b6000613ca9878288016137d0565b9450506020613cba878288016137d0565b9350506040613ccb878288016137d0565b9250506060613cdc87828801613767565b91505092959194509250565b613cf1816146e5565b82525050565b613d08613d03826146e5565b614851565b82525050565b613d17816146f7565b82525050565b613d2681614703565b82525050565b613d3d613d3882614703565b614863565b82525050565b6000613d4e8261458d565b613d5881856145a3565b9350613d68818560208601614772565b613d7181614976565b840191505092915050565b6000613d8782614598565b613d9181856145b4565b9350613da1818560208601614772565b613daa81614976565b840191505092915050565b6000613dc082614598565b613dca81856145c5565b9350613dda818560208601614772565b80840191505092915050565b60008154613df3816147a5565b613dfd81866145c5565b94506001821660008114613e185760018114613e2957613e5c565b60ff19831686528186019350613e5c565b613e3285614578565b60005b83811015613e5457815481890152600182019150602081019050613e35565b838801955050505b50505092915050565b6000613e726003836145b4565b9150613e7d82614994565b602082019050919050565b6000613e95600d836145c5565b9150613ea0826149bd565b600d82019050919050565b6000613eb86003836145b4565b9150613ec3826149e6565b602082019050919050565b6000613edb600a836145c5565b9150613ee682614a0f565b600a82019050919050565b6000613efe6003836145b4565b9150613f0982614a38565b602082019050919050565b6000613f216011836145b4565b9150613f2c82614a61565b602082019050919050565b6000613f446007836145c5565b9150613f4f82614a8a565b600782019050919050565b6000613f676003836145b4565b9150613f7282614ab3565b602082019050919050565b6000613f8a6010836145b4565b9150613f9582614adc565b602082019050919050565b6000613fad6005836145c5565b9150613fb882614b05565b600582019050919050565b6000613fd0601f836145b4565b9150613fdb82614b2e565b602082019050919050565b6000613ff36000836145a3565b9150613ffe82614b57565b600082019050919050565b60006140166003836145b4565b915061402182614b5a565b602082019050919050565b6000614039600e836145b4565b915061404482614b83565b602082019050919050565b600061405c600a836145b4565b915061406782614bac565b602082019050919050565b61407b81614759565b82525050565b61409261408d82614759565b61487f565b82525050565b60006140a48284613cf7565b60148201915081905092915050565b60006140bf8285613d2c565b6020820191506140cf8284614081565b6020820191508190509392505050565b60006140eb8285613db5565b91506140f78284613db5565b915061410282613fa0565b91508190509392505050565b600061411a8284613db5565b915061412582613e88565b915081905092915050565b600061413b82613f37565b91506141478284613de6565b915061415282613ece565b915081905092915050565b60006020820190506141726000830184613ce8565b92915050565b600060808201905061418d6000830187613ce8565b61419a6020830186613ce8565b6141a76040830185614072565b81810360608301526141b98184613d43565b905095945050505050565b60006080820190506141d96000830186613ce8565b6141e66020830185613ce8565b6141f36040830184614072565b818103606083015261420481613fe6565b9050949350505050565b60006060820190506142236000830186613ce8565b6142306020830185614072565b81810360408301526142428184613d43565b9050949350505050565b60006020820190506142616000830184613d0e565b92915050565b600060208201905061427c6000830184613d1d565b92915050565b60006040820190506142976000830185613d1d565b6142a46020830184614072565b9392505050565b60006080820190506142c06000830187613d1d565b6142cd6020830186614072565b6142da6040830185613ce8565b6142e76060830184614072565b95945050505050565b6000602082019050818103600083015261430a8184613d7c565b905092915050565b6000602082019050818103600083015261432b81613e65565b9050919050565b6000602082019050818103600083015261434b81613eab565b9050919050565b6000602082019050818103600083015261436b81613ef1565b9050919050565b6000602082019050818103600083015261438b81613f14565b9050919050565b600060208201905081810360008301526143ab81613f5a565b9050919050565b600060208201905081810360008301526143cb81613f7d565b9050919050565b600060208201905081810360008301526143eb81613fc3565b9050919050565b6000602082019050818103600083015261440b81614009565b9050919050565b6000602082019050818103600083015261442b8161402c565b9050919050565b6000602082019050818103600083015261444b8161404f565b9050919050565b60006020820190506144676000830184614072565b92915050565b60006040820190506144826000830185614072565b61448f6020830184613d1d565b9392505050565b60006040820190506144ab6000830185614072565b6144b86020830184614072565b9392505050565b60006060820190506144d46000830186614072565b6144e16020830185614072565b6144ee6040830184613d1d565b949350505050565b6000614500614511565b905061450c82826147d7565b919050565b6000604051905090565b600067ffffffffffffffff82111561453657614535614947565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561456257614561614947565b5b61456b82614976565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145db82614759565b91506145e683614759565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561461b5761461a6148ba565b5b828201905092915050565b600061463182614759565b915061463c83614759565b92508261464c5761464b6148e9565b5b828204905092915050565b600061466282614759565b915061466d83614759565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146a6576146a56148ba565b5b828202905092915050565b60006146bc82614759565b91506146c783614759565b9250828210156146da576146d96148ba565b5b828203905092915050565b60006146f082614739565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614790578082015181840152602081019050614775565b8381111561479f576000848401525b50505050565b600060028204905060018216806147bd57607f821691505b602082108114156147d1576147d0614918565b5b50919050565b6147e082614976565b810181811067ffffffffffffffff821117156147ff576147fe614947565b5b80604052505050565b600061481382614759565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614846576148456148ba565b5b600182019050919050565b600061485c8261486d565b9050919050565b6000819050919050565b600061487882614987565b9050919050565b6000819050919050565b600061489482614759565b915061489f83614759565b9250826148af576148ae6148e9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3430330000000000000000000000000000000000000000000000000000000000600082015250565b7f636f6e74726163742e6a736f6e00000000000000000000000000000000000000600082015250565b7f3430310000000000000000000000000000000000000000000000000000000000600082015250565b7f2f6d657461646174612f00000000000000000000000000000000000000000000600082015250565b7f3432320000000000000000000000000000000000000000000000000000000000600082015250565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b7f697066733a2f2f00000000000000000000000000000000000000000000000000600082015250565b7f3430320000000000000000000000000000000000000000000000000000000000600082015250565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b50565b7f3430340000000000000000000000000000000000000000000000000000000000600082015250565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b614bde816146e5565b8114614be957600080fd5b50565b614bf5816146f7565b8114614c0057600080fd5b50565b614c0c81614703565b8114614c1757600080fd5b50565b614c238161470d565b8114614c2e57600080fd5b50565b614c3a81614759565b8114614c4557600080fd5b5056fea264697066735822122033f5b2e2c305daab558a54fe73ecc6627545d3b396b6309d3c6ccd37815aaeaf64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
-----Decoded View---------------
Arg [0] : vrfCoordinator (address): 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
Arg [1] : linkToken (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952
Arg [1] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.