Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
50 AFFINITY
Holders
45
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AFFINITYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
AffinityCollective
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-29 */ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// 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 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } 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 calldata 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" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view 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 } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } } // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // 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); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) /** * @dev These functions deal with verification of Merkle Tree 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. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } contract MerkleDistributor { bytes32 public merkleRoot; bool public allowListActive = false; mapping(address => uint256) private _allowListNumMinted; /** * @dev emitted when an account has claimed some tokens */ event Claimed(address indexed account, uint256 amount); /** * @dev emitted when the merkle root has changed */ event MerkleRootChanged(bytes32 merkleRoot); /** * @dev throws when allow list is not active */ modifier isAllowListActive() { require(allowListActive, 'Allow list is not active'); _; } /** * @dev throws when number of tokens exceeds total token amount */ modifier tokensAvailable( address to, uint256 numberOfTokens, uint256 totalTokenAmount ) { uint256 claimed = getAllowListMinted(to); require(claimed + numberOfTokens <= totalTokenAmount, 'Purchase would exceed number of tokens allotted'); _; } /** * @dev throws when parameters sent by claimer is incorrect */ modifier ableToClaim(address claimer, bytes32[] memory proof) { require(onAllowList(claimer, proof), 'Not on allow list'); _; } /** * @dev sets the state of the allow list */ function _setAllowListActive(bool allowListActive_) internal virtual { allowListActive = allowListActive_; } /** * @dev sets the merkle root */ function _setAllowList(bytes32 merkleRoot_) internal virtual { merkleRoot = merkleRoot_; emit MerkleRootChanged(merkleRoot); } /** * @dev adds the number of tokens to the incoming address */ function _setAllowListMinted(address to, uint256 numberOfTokens) internal virtual { _allowListNumMinted[to] += numberOfTokens; emit Claimed(to, numberOfTokens); } /** * @dev gets the number of tokens from the address */ function getAllowListMinted(address from) public view virtual returns (uint256) { return _allowListNumMinted[from]; } /** * @dev checks if the claimer has a valid proof */ function onAllowList(address claimer, bytes32[] memory proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(claimer)); return MerkleProof.verify(proof, merkleRoot, leaf); } } error MintPriceNotPaid(); error PublicSaleNotActive(); error MaxSupply(); error MaxMintPerAddress(); error NonExistentTokenURI(); error WithdrawTransfer(); contract AffinityCollective is ERC721, ERC2981, Ownable, MerkleDistributor, ReentrancyGuard { using Strings for uint256; uint256 public constant TOTAL_SUPPLY = 1000; uint256 public constant MAX_MINT_PER_ADDRESS = 5; uint256 public MINT_PRICE; bool public publiSaleActive; uint256 public currentTokenId; string public founderURI; string public memberURI; /** * @notice premint founder NFT's */ constructor( uint256 _mintPrice, string memory _founderURI, string memory _memberURI ) ERC721("Affinity Collective", "AFFINITY") { founderURI = _founderURI; memberURI = _memberURI; publiSaleActive = false; MINT_PRICE = _mintPrice; } /** * @dev checks to see whether publiSaleActive is true */ modifier isPublicSaleActive() { if (!publiSaleActive) revert PublicSaleNotActive(); _; } /** * @notice airdrop founding members NFT's */ function airdropFounders(address _foundersAirdrop) external onlyOwner { require(currentTokenId == 0, "Airdrop already completed"); uint256 index; for (index = 0; index < 50; index++) { _safeMint(_foundersAirdrop, index); } currentTokenId = index; } /** * @notice Public mint */ function mint(uint256 _amount) public payable nonReentrant isPublicSaleActive { if (_amount > MAX_MINT_PER_ADDRESS) revert MaxMintPerAddress(); if (currentTokenId >= TOTAL_SUPPLY) revert MaxSupply(); if (msg.value != MINT_PRICE * _amount) revert MintPriceNotPaid(); for (uint256 index = 0; index < _amount; index++) { _safeMint(msg.sender, currentTokenId); currentTokenId++; } } /** * @notice White list mint */ function whitelistMint( address _to, uint256 _amount, bytes32[] memory _proof ) public payable nonReentrant isAllowListActive ableToClaim(_to, _proof) tokensAvailable(_to, _amount, MAX_MINT_PER_ADDRESS) { if (msg.value != MINT_PRICE * _amount) revert MintPriceNotPaid(); if (currentTokenId + _amount > TOTAL_SUPPLY) revert MaxSupply(); for (uint256 index = 0; index < _amount; index++) { _safeMint(_to, currentTokenId); currentTokenId++; } } /** * @notice Return token uri of the given token id. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (ownerOf(tokenId) == address(0)) { revert NonExistentTokenURI(); } if (tokenId < 50) return founderURI; return memberURI; } /** * @notice Return current token count. */ function totalSupply() public view returns (uint256) { return currentTokenId; } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC2981) returns (bool) { return ERC721.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId); } /** * @notice Set the token URI's. */ function setTokenURI(string memory _founder, string memory _member) external onlyOwner { founderURI = _founder; memberURI = _member; } /** * @dev sets the merkle root for the allow list */ function setAllowList(bytes32 merkleRoot) external onlyOwner { _setAllowList(merkleRoot); } /** * @dev sets mint price */ function setMintPrice(uint256 _mintPrice) external onlyOwner { MINT_PRICE = _mintPrice; } /** * @dev allows minting from a list of addresses */ function setAllowListActive(bool allowListActive) external onlyOwner { _setAllowListActive(allowListActive); } /** * @dev Enable public sale */ function setPublicSale(bool state) external onlyOwner { publiSaleActive = state; } /** * @dev Set royalties */ function setRoyaltyInfo(address receiver, uint96 feeBasisPoints) external onlyOwner { _setDefaultRoyalty(receiver, feeBasisPoints); } /** * @dev Withdraw contract balance. */ function withdraw(address _to) external onlyOwner { uint256 balance = address(this).balance; (bool transferTx, ) = _to.call{value: balance}(""); if (!transferTx) { revert WithdrawTransfer(); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"string","name":"_founderURI","type":"string"},{"internalType":"string","name":"_memberURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MaxMintPerAddress","type":"error"},{"inputs":[],"name":"MaxSupply","type":"error"},{"inputs":[],"name":"MintPriceNotPaid","type":"error"},{"inputs":[],"name":"NonExistentTokenURI","type":"error"},{"inputs":[],"name":"PublicSaleNotActive","type":"error"},{"inputs":[],"name":"WithdrawTransfer","type":"error"},{"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"MerkleRootChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT_PER_ADDRESS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_foundersAirdrop","type":"address"}],"name":"airdropFounders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"memberURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publiSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allowListActive","type":"bool"}],"name":"setAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeBasisPoints","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_founder","type":"string"},{"internalType":"string","name":"_member","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a805460ff191690553480156200001b57600080fd5b5060405162002446380380620024468339810160408190526200003e91620002e5565b604080518082018252601381527f416666696e69747920436f6c6c65637469766500000000000000000000000000602080830191825283518085019094526008845267414646494e49545960c01b908401528151919291620000a39160009162000172565b508051620000b990600190602084019062000172565b505050620000d6620000d06200011c60201b60201c565b62000120565b6001600c558151620000f090601090602085019062000172565b5080516200010690601190602084019062000172565b5050600e805460ff1916905550600d5562000395565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001809062000359565b90600052602060002090601f016020900481019282620001a45760008555620001ef565b82601f10620001bf57805160ff1916838001178555620001ef565b82800160010185558215620001ef579182015b82811115620001ef578251825591602001919060010190620001d2565b50620001fd92915062000201565b5090565b5b80821115620001fd576000815560010162000202565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200024057600080fd5b81516001600160401b03808211156200025d576200025d62000218565b604051601f8301601f19908116603f0116810190828211818310171562000288576200028862000218565b81604052838152602092508683858801011115620002a557600080fd5b600091505b83821015620002c95785820183015181830184015290820190620002aa565b83821115620002db5760008385830101525b9695505050505050565b600080600060608486031215620002fb57600080fd5b835160208501519093506001600160401b03808211156200031b57600080fd5b62000329878388016200022e565b935060408601519150808211156200034057600080fd5b506200034f868287016200022e565b9150509250925092565b600181811c908216806200036e57607f821691505b6020821081036200038f57634e487b7160e01b600052602260045260246000fd5b50919050565b6120a180620003a56000396000f3fe60806040526004361061022f5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e05eb28b1161006f578063e05eb28b14610672578063e985e9c51461068c578063f2fde38b146106c7578063f4a0a528146106e7578063fc0840ed1461070757600080fd5b8063b88d4fde146105e7578063c002d23d14610607578063c87b56dd1461061d578063d48ede991461063d578063d7c8962c1461065d57600080fd5b806393151300116100f2578063931513001461056a57806395d89b411461057f578063a0712d6814610594578063a22cb465146105a7578063b32c5680146105c757600080fd5b806370a08231146104e1578063715018a61461050157806384584d07146105165780638da5cb5b14610536578063902d55a51461055457600080fd5b80632eb4a7ab116101bc5780634b11faaf116101805780634b11faaf1461043857806351cff8d91461044b5780635aca1bb61461046b5780635ea1ef521461048b5780636352211e146104c157600080fd5b80632eb4a7ab146103b35780633a73c58d146103c95780633acd6cb2146103e957806342842e0e146103fe578063457dbf211461041e57600080fd5b8063081812fc11610203578063081812fc146102d1578063095ea7b31461031f57806318160ddd1461033f57806323b872dd146103545780632a55205a1461037457600080fd5b80629a9b7b1461023457806301ffc9a71461025d57806302fa7c471461028d57806306fdde03146102af575b600080fd5b34801561024057600080fd5b5061024a600f5481565b6040519081526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004611a17565b610727565b6040519015158152602001610254565b34801561029957600080fd5b506102ad6102a8366004611a4b565b610747565b005b3480156102bb57600080fd5b506102c461075d565b6040516102549190611a8e565b3480156102dd57600080fd5b506103076102ec366004611ae3565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610254565b34801561032b57600080fd5b506102ad61033a366004611afc565b6107eb565b34801561034b57600080fd5b50600f5461024a565b34801561036057600080fd5b506102ad61036f366004611b26565b6108d2565b34801561038057600080fd5b5061039461038f366004611b62565b610a99565b604080516001600160a01b039093168352602083019190915201610254565b3480156103bf57600080fd5b5061024a60095481565b3480156103d557600080fd5b506102ad6103e4366004611b94565b610b45565b3480156103f557600080fd5b5061024a600581565b34801561040a57600080fd5b506102ad610419366004611b26565b610b61565b34801561042a57600080fd5b50600a5461027d9060ff1681565b6102ad610446366004611c76565b610c36565b34801561045757600080fd5b506102ad610466366004611ccd565b610e21565b34801561047757600080fd5b506102ad610486366004611b94565b610e9d565b34801561049757600080fd5b5061024a6104a6366004611ccd565b6001600160a01b03166000908152600b602052604090205490565b3480156104cd57600080fd5b506103076104dc366004611ae3565b610eb8565b3480156104ed57600080fd5b5061024a6104fc366004611ccd565b610f0f565b34801561050d57600080fd5b506102ad610f72565b34801561052257600080fd5b506102ad610531366004611ae3565b610f86565b34801561054257600080fd5b506008546001600160a01b0316610307565b34801561056057600080fd5b5061024a6103e881565b34801561057657600080fd5b506102c4610f97565b34801561058b57600080fd5b506102c4610fa4565b6102ad6105a2366004611ae3565b610fb1565b3480156105b357600080fd5b506102ad6105c2366004611ce8565b611099565b3480156105d357600080fd5b5061027d6105e2366004611d1b565b611105565b3480156105f357600080fd5b506102ad610602366004611d69565b611156565b34801561061357600080fd5b5061024a600d5481565b34801561062957600080fd5b506102c4610638366004611ae3565b61121b565b34801561064957600080fd5b506102ad610658366004611e74565b6112f7565b34801561066957600080fd5b506102c4611326565b34801561067e57600080fd5b50600e5461027d9060ff1681565b34801561069857600080fd5b5061027d6106a7366004611ece565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106d357600080fd5b506102ad6106e2366004611ccd565b611333565b3480156106f357600080fd5b506102ad610702366004611ae3565b6113a9565b34801561071357600080fd5b506102ad610722366004611ccd565b6113b6565b60006107328261143c565b8061074157506107418261148a565b92915050565b61074f6114bf565b6107598282611519565b5050565b6000805461076a90611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461079690611ef8565b80156107e35780601f106107b8576101008083540402835291602001916107e3565b820191906000526020600020905b8154815290600101906020018083116107c657829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061083457506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108765760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b038481169116146109285760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161086d565b6001600160a01b0382166109725760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b336001600160a01b03841614806109ac57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109cd57506000818152600460205260409020546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161086d565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b0e5750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b2d906001600160601b031687611f48565b610b379190611f67565b915196919550909350505050565b610b4d6114bf565b600a805460ff191682151517905550565b50565b610b6c8383836108d2565b6001600160a01b0382163b1580610c155750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190611f89565b6001600160e01b031916145b610c315760405162461bcd60e51b815260040161086d90611fa6565b505050565b610c3e611616565b600a5460ff16610c905760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f74206163746976650000000000000000604482015260640161086d565b8281610c9c8282611105565b610cdc5760405162461bcd60e51b8152602060048201526011602482015270139bdd081bdb88185b1b1bddc81b1a5cdd607a1b604482015260640161086d565b848460056000610d01846001600160a01b03166000908152600b602052604090205490565b905081610d0e8483611fd0565b1115610d745760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206e756d626572206f662060448201526e1d1bdad95b9cc8185b1b1bdd1d1959608a1b606482015260840161086d565b87600d54610d829190611f48565b3414610da1576040516310f0c8f160e11b815260040160405180910390fd5b6103e888600f54610db29190611fd0565b1115610dd157604051632cdb04a160e21b815260040160405180910390fd5b60005b88811015610e1057610de88a600f5461166f565b600f8054906000610df883611fe8565b91905055508080610e0890611fe8565b915050610dd4565b50505050505050610c316001600c55565b610e296114bf565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114610e76576040519150601f19603f3d011682016040523d82523d6000602084013e610e7b565b606091505b5050905080610c315760405163d23a9e8960e01b815260040160405180910390fd5b610ea56114bf565b600e805460ff1916911515919091179055565b6000818152600260205260409020546001600160a01b031680610f0a5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161086d565b919050565b60006001600160a01b038216610f565760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161086d565b506001600160a01b031660009081526003602052604090205490565b610f7a6114bf565b610f84600061173b565b565b610f8e6114bf565b610b5e8161178d565b6011805461076a90611ef8565b6001805461076a90611ef8565b610fb9611616565b600e5460ff16610fdc576040516331f423c160e21b815260040160405180910390fd5b6005811115610ffe576040516369f0a9d960e11b815260040160405180910390fd5b6103e8600f541061102257604051632cdb04a160e21b815260040160405180910390fd5b80600d546110309190611f48565b341461104f576040516310f0c8f160e11b815260040160405180910390fd5b60005b8181101561108e5761106633600f5461166f565b600f805490600061107683611fe8565b9190505550808061108690611fe8565b915050611052565b50610b5e6001600c55565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905061114e83600954836117c8565b949350505050565b6111618585856108d2565b6001600160a01b0384163b15806111f85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111a99033908a90899089908990600401612001565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190611f89565b6001600160e01b031916145b6112145760405162461bcd60e51b815260040161086d90611fa6565b5050505050565b6060600061122883610eb8565b6001600160a01b03160361124f5760405163d872946b60e01b815260040160405180910390fd5b60328210156112ea576010805461126590611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461129190611ef8565b80156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b50505050509050919050565b6011805461126590611ef8565b6112ff6114bf565b8151611312906010906020850190611968565b508051610c31906011906020840190611968565b6010805461076a90611ef8565b61133b6114bf565b6001600160a01b0381166113a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b610b5e8161173b565b6113b16114bf565b600d55565b6113be6114bf565b600f541561140e5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020616c726561647920636f6d706c6574656400000000000000604482015260640161086d565b60005b603281101561143657611424828261166f565b8061142e81611fe8565b915050611411565b600f5550565b60006301ffc9a760e01b6001600160e01b03198316148061146d57506380ac58cd60e01b6001600160e01b03198316145b806107415750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061074157506301ffc9a760e01b6001600160e01b0319831614610741565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161086d565b6127106001600160601b03821611156115875760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161086d565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161086d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6002600c54036116685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600c55565b61167982826117de565b6001600160a01b0382163b158061171f5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190611f89565b6001600160e01b031916145b6107595760405162461bcd60e51b815260040161086d90611fa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60098190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c9060200160405180910390a150565b6000826117d585846118e9565b14949350505050565b6001600160a01b0382166118285760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561187e5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161086d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561192e5761191a8286838151811061190d5761190d612055565b6020026020010151611936565b91508061192681611fe8565b9150506118ee565b509392505050565b6000818310611952576000828152602084905260409020611961565b60008381526020839052604090205b9392505050565b82805461197490611ef8565b90600052602060002090601f01602090048101928261199657600085556119dc565b82601f106119af57805160ff19168380011785556119dc565b828001600101855582156119dc579182015b828111156119dc5782518255916020019190600101906119c1565b506119e89291506119ec565b5090565b5b808211156119e857600081556001016119ed565b6001600160e01b031981168114610b5e57600080fd5b600060208284031215611a2957600080fd5b813561196181611a01565b80356001600160a01b0381168114610f0a57600080fd5b60008060408385031215611a5e57600080fd5b611a6783611a34565b915060208301356001600160601b0381168114611a8357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015611abb57858101830151858201604001528201611a9f565b81811115611acd576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215611af557600080fd5b5035919050565b60008060408385031215611b0f57600080fd5b611b1883611a34565b946020939093013593505050565b600080600060608486031215611b3b57600080fd5b611b4484611a34565b9250611b5260208501611a34565b9150604084013590509250925092565b60008060408385031215611b7557600080fd5b50508035926020909101359150565b80358015158114610f0a57600080fd5b600060208284031215611ba657600080fd5b61196182611b84565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611bee57611bee611baf565b604052919050565b600082601f830112611c0757600080fd5b8135602067ffffffffffffffff821115611c2357611c23611baf565b8160051b611c32828201611bc5565b9283528481018201928281019087851115611c4c57600080fd5b83870192505b84831015611c6b57823582529183019190830190611c52565b979650505050505050565b600080600060608486031215611c8b57600080fd5b611c9484611a34565b925060208401359150604084013567ffffffffffffffff811115611cb757600080fd5b611cc386828701611bf6565b9150509250925092565b600060208284031215611cdf57600080fd5b61196182611a34565b60008060408385031215611cfb57600080fd5b611d0483611a34565b9150611d1260208401611b84565b90509250929050565b60008060408385031215611d2e57600080fd5b611d3783611a34565b9150602083013567ffffffffffffffff811115611d5357600080fd5b611d5f85828601611bf6565b9150509250929050565b600080600080600060808688031215611d8157600080fd5b611d8a86611a34565b9450611d9860208701611a34565b935060408601359250606086013567ffffffffffffffff80821115611dbc57600080fd5b818801915088601f830112611dd057600080fd5b813581811115611ddf57600080fd5b896020828501011115611df157600080fd5b9699959850939650602001949392505050565b600082601f830112611e1557600080fd5b813567ffffffffffffffff811115611e2f57611e2f611baf565b611e42601f8201601f1916602001611bc5565b818152846020838601011115611e5757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611e8757600080fd5b823567ffffffffffffffff80821115611e9f57600080fd5b611eab86838701611e04565b93506020850135915080821115611ec157600080fd5b50611d5f85828601611e04565b60008060408385031215611ee157600080fd5b611eea83611a34565b9150611d1260208401611a34565b600181811c90821680611f0c57607f821691505b602082108103611f2c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f6257611f62611f32565b500290565b600082611f8457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611f9b57600080fd5b815161196181611a01565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b60008219821115611fe357611fe3611f32565b500190565b600060018201611ffa57611ffa611f32565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c1a021c7fde431a0b81be49d6b527699983203ebe986fc9717338262b181df1264736f6c634300080d003300000000000000000000000000000000000000000000000010a741a462780000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d524454766a763673576a55626541767a7642597641735647775a6141744c4633594e355136394a3833756a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e4252356163384a6f5047716b4b5a48676641387a56350000000000000000000000
Deployed Bytecode
0x60806040526004361061022f5760003560e01c806370a082311161012e578063b88d4fde116100ab578063e05eb28b1161006f578063e05eb28b14610672578063e985e9c51461068c578063f2fde38b146106c7578063f4a0a528146106e7578063fc0840ed1461070757600080fd5b8063b88d4fde146105e7578063c002d23d14610607578063c87b56dd1461061d578063d48ede991461063d578063d7c8962c1461065d57600080fd5b806393151300116100f2578063931513001461056a57806395d89b411461057f578063a0712d6814610594578063a22cb465146105a7578063b32c5680146105c757600080fd5b806370a08231146104e1578063715018a61461050157806384584d07146105165780638da5cb5b14610536578063902d55a51461055457600080fd5b80632eb4a7ab116101bc5780634b11faaf116101805780634b11faaf1461043857806351cff8d91461044b5780635aca1bb61461046b5780635ea1ef521461048b5780636352211e146104c157600080fd5b80632eb4a7ab146103b35780633a73c58d146103c95780633acd6cb2146103e957806342842e0e146103fe578063457dbf211461041e57600080fd5b8063081812fc11610203578063081812fc146102d1578063095ea7b31461031f57806318160ddd1461033f57806323b872dd146103545780632a55205a1461037457600080fd5b80629a9b7b1461023457806301ffc9a71461025d57806302fa7c471461028d57806306fdde03146102af575b600080fd5b34801561024057600080fd5b5061024a600f5481565b6040519081526020015b60405180910390f35b34801561026957600080fd5b5061027d610278366004611a17565b610727565b6040519015158152602001610254565b34801561029957600080fd5b506102ad6102a8366004611a4b565b610747565b005b3480156102bb57600080fd5b506102c461075d565b6040516102549190611a8e565b3480156102dd57600080fd5b506103076102ec366004611ae3565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610254565b34801561032b57600080fd5b506102ad61033a366004611afc565b6107eb565b34801561034b57600080fd5b50600f5461024a565b34801561036057600080fd5b506102ad61036f366004611b26565b6108d2565b34801561038057600080fd5b5061039461038f366004611b62565b610a99565b604080516001600160a01b039093168352602083019190915201610254565b3480156103bf57600080fd5b5061024a60095481565b3480156103d557600080fd5b506102ad6103e4366004611b94565b610b45565b3480156103f557600080fd5b5061024a600581565b34801561040a57600080fd5b506102ad610419366004611b26565b610b61565b34801561042a57600080fd5b50600a5461027d9060ff1681565b6102ad610446366004611c76565b610c36565b34801561045757600080fd5b506102ad610466366004611ccd565b610e21565b34801561047757600080fd5b506102ad610486366004611b94565b610e9d565b34801561049757600080fd5b5061024a6104a6366004611ccd565b6001600160a01b03166000908152600b602052604090205490565b3480156104cd57600080fd5b506103076104dc366004611ae3565b610eb8565b3480156104ed57600080fd5b5061024a6104fc366004611ccd565b610f0f565b34801561050d57600080fd5b506102ad610f72565b34801561052257600080fd5b506102ad610531366004611ae3565b610f86565b34801561054257600080fd5b506008546001600160a01b0316610307565b34801561056057600080fd5b5061024a6103e881565b34801561057657600080fd5b506102c4610f97565b34801561058b57600080fd5b506102c4610fa4565b6102ad6105a2366004611ae3565b610fb1565b3480156105b357600080fd5b506102ad6105c2366004611ce8565b611099565b3480156105d357600080fd5b5061027d6105e2366004611d1b565b611105565b3480156105f357600080fd5b506102ad610602366004611d69565b611156565b34801561061357600080fd5b5061024a600d5481565b34801561062957600080fd5b506102c4610638366004611ae3565b61121b565b34801561064957600080fd5b506102ad610658366004611e74565b6112f7565b34801561066957600080fd5b506102c4611326565b34801561067e57600080fd5b50600e5461027d9060ff1681565b34801561069857600080fd5b5061027d6106a7366004611ece565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106d357600080fd5b506102ad6106e2366004611ccd565b611333565b3480156106f357600080fd5b506102ad610702366004611ae3565b6113a9565b34801561071357600080fd5b506102ad610722366004611ccd565b6113b6565b60006107328261143c565b8061074157506107418261148a565b92915050565b61074f6114bf565b6107598282611519565b5050565b6000805461076a90611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461079690611ef8565b80156107e35780601f106107b8576101008083540402835291602001916107e3565b820191906000526020600020905b8154815290600101906020018083116107c657829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061083457506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108765760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b038481169116146109285760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161086d565b6001600160a01b0382166109725760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b336001600160a01b03841614806109ac57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109cd57506000818152600460205260409020546001600160a01b031633145b610a0a5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161086d565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008281526007602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b0e5750604080518082019091526006546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610b2d906001600160601b031687611f48565b610b379190611f67565b915196919550909350505050565b610b4d6114bf565b600a805460ff191682151517905550565b50565b610b6c8383836108d2565b6001600160a01b0382163b1580610c155750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c099190611f89565b6001600160e01b031916145b610c315760405162461bcd60e51b815260040161086d90611fa6565b505050565b610c3e611616565b600a5460ff16610c905760405162461bcd60e51b815260206004820152601860248201527f416c6c6f77206c697374206973206e6f74206163746976650000000000000000604482015260640161086d565b8281610c9c8282611105565b610cdc5760405162461bcd60e51b8152602060048201526011602482015270139bdd081bdb88185b1b1bddc81b1a5cdd607a1b604482015260640161086d565b848460056000610d01846001600160a01b03166000908152600b602052604090205490565b905081610d0e8483611fd0565b1115610d745760405162461bcd60e51b815260206004820152602f60248201527f507572636861736520776f756c6420657863656564206e756d626572206f662060448201526e1d1bdad95b9cc8185b1b1bdd1d1959608a1b606482015260840161086d565b87600d54610d829190611f48565b3414610da1576040516310f0c8f160e11b815260040160405180910390fd5b6103e888600f54610db29190611fd0565b1115610dd157604051632cdb04a160e21b815260040160405180910390fd5b60005b88811015610e1057610de88a600f5461166f565b600f8054906000610df883611fe8565b91905055508080610e0890611fe8565b915050610dd4565b50505050505050610c316001600c55565b610e296114bf565b60405147906000906001600160a01b0384169083908381818185875af1925050503d8060008114610e76576040519150601f19603f3d011682016040523d82523d6000602084013e610e7b565b606091505b5050905080610c315760405163d23a9e8960e01b815260040160405180910390fd5b610ea56114bf565b600e805460ff1916911515919091179055565b6000818152600260205260409020546001600160a01b031680610f0a5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161086d565b919050565b60006001600160a01b038216610f565760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161086d565b506001600160a01b031660009081526003602052604090205490565b610f7a6114bf565b610f84600061173b565b565b610f8e6114bf565b610b5e8161178d565b6011805461076a90611ef8565b6001805461076a90611ef8565b610fb9611616565b600e5460ff16610fdc576040516331f423c160e21b815260040160405180910390fd5b6005811115610ffe576040516369f0a9d960e11b815260040160405180910390fd5b6103e8600f541061102257604051632cdb04a160e21b815260040160405180910390fd5b80600d546110309190611f48565b341461104f576040516310f0c8f160e11b815260040160405180910390fd5b60005b8181101561108e5761106633600f5461166f565b600f805490600061107683611fe8565b9190505550808061108690611fe8565b915050611052565b50610b5e6001600c55565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905061114e83600954836117c8565b949350505050565b6111618585856108d2565b6001600160a01b0384163b15806111f85750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111a99033908a90899089908990600401612001565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190611f89565b6001600160e01b031916145b6112145760405162461bcd60e51b815260040161086d90611fa6565b5050505050565b6060600061122883610eb8565b6001600160a01b03160361124f5760405163d872946b60e01b815260040160405180910390fd5b60328210156112ea576010805461126590611ef8565b80601f016020809104026020016040519081016040528092919081815260200182805461129190611ef8565b80156112de5780601f106112b3576101008083540402835291602001916112de565b820191906000526020600020905b8154815290600101906020018083116112c157829003601f168201915b50505050509050919050565b6011805461126590611ef8565b6112ff6114bf565b8151611312906010906020850190611968565b508051610c31906011906020840190611968565b6010805461076a90611ef8565b61133b6114bf565b6001600160a01b0381166113a05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161086d565b610b5e8161173b565b6113b16114bf565b600d55565b6113be6114bf565b600f541561140e5760405162461bcd60e51b815260206004820152601960248201527f41697264726f7020616c726561647920636f6d706c6574656400000000000000604482015260640161086d565b60005b603281101561143657611424828261166f565b8061142e81611fe8565b915050611411565b600f5550565b60006301ffc9a760e01b6001600160e01b03198316148061146d57506380ac58cd60e01b6001600160e01b03198316145b806107415750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061074157506301ffc9a760e01b6001600160e01b0319831614610741565b6008546001600160a01b03163314610f845760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161086d565b6127106001600160601b03821611156115875760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b606482015260840161086d565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161086d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600655565b6002600c54036116685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161086d565b6002600c55565b61167982826117de565b6001600160a01b0382163b158061171f5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af11580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117139190611f89565b6001600160e01b031916145b6107595760405162461bcd60e51b815260040161086d90611fa6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60098190556040518181527f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c9060200160405180910390a150565b6000826117d585846118e9565b14949350505050565b6001600160a01b0382166118285760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161086d565b6000818152600260205260409020546001600160a01b03161561187e5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161086d565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b845181101561192e5761191a8286838151811061190d5761190d612055565b6020026020010151611936565b91508061192681611fe8565b9150506118ee565b509392505050565b6000818310611952576000828152602084905260409020611961565b60008381526020839052604090205b9392505050565b82805461197490611ef8565b90600052602060002090601f01602090048101928261199657600085556119dc565b82601f106119af57805160ff19168380011785556119dc565b828001600101855582156119dc579182015b828111156119dc5782518255916020019190600101906119c1565b506119e89291506119ec565b5090565b5b808211156119e857600081556001016119ed565b6001600160e01b031981168114610b5e57600080fd5b600060208284031215611a2957600080fd5b813561196181611a01565b80356001600160a01b0381168114610f0a57600080fd5b60008060408385031215611a5e57600080fd5b611a6783611a34565b915060208301356001600160601b0381168114611a8357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015611abb57858101830151858201604001528201611a9f565b81811115611acd576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215611af557600080fd5b5035919050565b60008060408385031215611b0f57600080fd5b611b1883611a34565b946020939093013593505050565b600080600060608486031215611b3b57600080fd5b611b4484611a34565b9250611b5260208501611a34565b9150604084013590509250925092565b60008060408385031215611b7557600080fd5b50508035926020909101359150565b80358015158114610f0a57600080fd5b600060208284031215611ba657600080fd5b61196182611b84565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611bee57611bee611baf565b604052919050565b600082601f830112611c0757600080fd5b8135602067ffffffffffffffff821115611c2357611c23611baf565b8160051b611c32828201611bc5565b9283528481018201928281019087851115611c4c57600080fd5b83870192505b84831015611c6b57823582529183019190830190611c52565b979650505050505050565b600080600060608486031215611c8b57600080fd5b611c9484611a34565b925060208401359150604084013567ffffffffffffffff811115611cb757600080fd5b611cc386828701611bf6565b9150509250925092565b600060208284031215611cdf57600080fd5b61196182611a34565b60008060408385031215611cfb57600080fd5b611d0483611a34565b9150611d1260208401611b84565b90509250929050565b60008060408385031215611d2e57600080fd5b611d3783611a34565b9150602083013567ffffffffffffffff811115611d5357600080fd5b611d5f85828601611bf6565b9150509250929050565b600080600080600060808688031215611d8157600080fd5b611d8a86611a34565b9450611d9860208701611a34565b935060408601359250606086013567ffffffffffffffff80821115611dbc57600080fd5b818801915088601f830112611dd057600080fd5b813581811115611ddf57600080fd5b896020828501011115611df157600080fd5b9699959850939650602001949392505050565b600082601f830112611e1557600080fd5b813567ffffffffffffffff811115611e2f57611e2f611baf565b611e42601f8201601f1916602001611bc5565b818152846020838601011115611e5757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611e8757600080fd5b823567ffffffffffffffff80821115611e9f57600080fd5b611eab86838701611e04565b93506020850135915080821115611ec157600080fd5b50611d5f85828601611e04565b60008060408385031215611ee157600080fd5b611eea83611a34565b9150611d1260208401611a34565b600181811c90821680611f0c57607f821691505b602082108103611f2c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611f6257611f62611f32565b500290565b600082611f8457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611f9b57600080fd5b815161196181611a01565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b60008219821115611fe357611fe3611f32565b500190565b600060018201611ffa57611ffa611f32565b5060010190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220c1a021c7fde431a0b81be49d6b527699983203ebe986fc9717338262b181df1264736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000010a741a462780000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d524454766a763673576a55626541767a7642597641735647775a6141744c4633594e355136394a3833756a6100000000000000000000000000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e4252356163384a6f5047716b4b5a48676641387a56350000000000000000000000
-----Decoded View---------------
Arg [0] : _mintPrice (uint256): 1200000000000000000
Arg [1] : _founderURI (string): ipfs://QmRDTvjv6sWjUbeAvzvBYvAsVGwZaAtLF3YN5Q69J83uja
Arg [2] : _memberURI (string): ipfs://QmRouXe95Hzg1JCnMHdSGrZnBR5ac8JoPGqkKZHgfA8zV5
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000010a741a462780000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [4] : 697066733a2f2f516d524454766a763673576a55626541767a76425976417356
Arg [5] : 47775a6141744c4633594e355136394a3833756a610000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [7] : 697066733a2f2f516d526f7558653935487a67314a436e4d48645347725a6e42
Arg [8] : 52356163384a6f5047716b4b5a48676641387a56350000000000000000000000
Deployed Bytecode Sourcemap
34215:4904:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34543:29;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;34543:29:0;;;;;;;;37364:272;;;;;;;;;;-1:-1:-1;37364:272:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;37364:272:0;582:187:1;38632:170:0;;;;;;;;;;-1:-1:-1;38632:170:0;;;;;:::i;:::-;;:::i;:::-;;922:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1895:46::-;;;;;;;;;;-1:-1:-1;1895:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1895:46:0;;;;;;-1:-1:-1;;;;;2274:32:1;;;2256:51;;2244:2;2229:18;1895:46:0;2110:203:1;2521:290:0;;;;;;;;;;-1:-1:-1;2521:290:0;;;;;:::i;:::-;;:::i;37263:93::-;;;;;;;;;;-1:-1:-1;37334:14:0;;37263:93;;3034:768;;;;;;;;;;-1:-1:-1;3034:768:0;;;;;:::i;:::-;;:::i;11753:442::-;;;;;;;;;;-1:-1:-1;11753:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3355:32:1;;;3337:51;;3419:2;3404:18;;3397:34;;;;3310:18;11753:442:0;3163:274:1;31622:25:0;;;;;;;;;;;;;;;;38300:124;;;;;;;;;;-1:-1:-1;38300:124:0;;;;;:::i;:::-;;:::i;34422:48::-;;;;;;;;;;;;34469:1;34422:48;;3810:409;;;;;;;;;;-1:-1:-1;3810:409:0;;;;;:::i;:::-;;:::i;31654:35::-;;;;;;;;;;-1:-1:-1;31654:35:0;;;;;;;;36192:599;;;;;;:::i;:::-;;:::i;38868:248::-;;;;;;;;;;-1:-1:-1;38868:248:0;;;;;:::i;:::-;;:::i;38482:96::-;;;;;;;;;;-1:-1:-1;38482:96:0;;;;;:::i;:::-;;:::i;33614:131::-;;;;;;;;;;-1:-1:-1;33614:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;33712:25:0;33685:7;33712:25;;;:19;:25;;;;;;;33614:131;1364:151;;;;;;;;;;-1:-1:-1;1364:151:0;;;;;:::i;:::-;;:::i;1523:172::-;;;;;;;;;;-1:-1:-1;1523:172:0;;;;;:::i;:::-;;:::i;16871:103::-;;;;;;;;;;;;;:::i;37958:105::-;;;;;;;;;;-1:-1:-1;37958:105:0;;;;;:::i;:::-;;:::i;16223:87::-;;;;;;;;;;-1:-1:-1;16296:6:0;;-1:-1:-1;;;;;16296:6:0;16223:87;;34372:43;;;;;;;;;;;;34411:4;34372:43;;34610:23;;;;;;;;;;;;;:::i;949:20::-;;;;;;;;;;;;;:::i;35639:495::-;;;;;;:::i;:::-;;:::i;2819:207::-;;;;;;;;;;-1:-1:-1;2819:207:0;;;;;:::i;:::-;;:::i;33824:220::-;;;;;;;;;;-1:-1:-1;33824:220:0;;;;;:::i;:::-;;:::i;4227:441::-;;;;;;;;;;-1:-1:-1;4227:441:0;;;;;:::i;:::-;;:::i;34477:25::-;;;;;;;;;;;;;;;;36873:320;;;;;;;;;;-1:-1:-1;36873:320:0;;;;;:::i;:::-;;:::i;37699:180::-;;;;;;;;;;-1:-1:-1;37699:180:0;;;;;:::i;:::-;;:::i;34579:24::-;;;;;;;;;;;;;:::i;34509:27::-;;;;;;;;;;-1:-1:-1;34509:27:0;;;;;;;;1950:68;;;;;;;;;;-1:-1:-1;1950:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17129:201;;;;;;;;;;-1:-1:-1;17129:201:0;;;;;:::i;:::-;;:::i;38118:103::-;;;;;;;;;;-1:-1:-1;38118:103:0;;;;;:::i;:::-;;:::i;35274:311::-;;;;;;;;;;-1:-1:-1;35274:311:0;;;;;:::i;:::-;;:::i;37364:272::-;37494:4;37536:37;37561:11;37536:24;:37::i;:::-;:92;;;;37590:38;37616:11;37590:25;:38::i;:::-;37516:112;37364:272;-1:-1:-1;;37364:272:0:o;38632:170::-;16109:13;:11;:13::i;:::-;38750:44:::1;38769:8;38779:14;38750:18;:44::i;:::-;38632:170:::0;;:::o;922:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2521:290::-;2593:13;2609:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2609:12:0;2642:10;:19;;;:58;;-1:-1:-1;;;;;;2665:23:0;;;;;;:16;:23;;;;;;;;2689:10;2665:35;;;;;;;;;;2642:58;2634:85;;;;-1:-1:-1;;;2634:85:0;;9409:2:1;2634:85:0;;;9391:21:1;9448:2;9428:18;;;9421:30;-1:-1:-1;;;9467:18:1;;;9460:44;9521:18;;2634:85:0;;;;;;;;;2732:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2732:25:0;-1:-1:-1;;;;;2732:25:0;;;;;;;;;2775:28;;2732:15;;2775:28;;;;;;;2582:229;2521:290;;:::o;3034:768::-;3170:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3162:20:0;;;3170:12;;3162:20;3154:43;;;;-1:-1:-1;;;3154:43:0;;9752:2:1;3154:43:0;;;9734:21:1;9791:2;9771:18;;;9764:30;-1:-1:-1;;;9810:18:1;;;9803:40;9860:18;;3154:43:0;9550:334:1;3154:43:0;-1:-1:-1;;;;;3218:16:0;;3210:46;;;;-1:-1:-1;;;3210:46:0;;10091:2:1;3210:46:0;;;10073:21:1;10130:2;10110:18;;;10103:30;-1:-1:-1;;;10149:18:1;;;10142:47;10206:18;;3210:46:0;9889:341:1;3210:46:0;3291:10;-1:-1:-1;;;;;3291:18:0;;;;:56;;-1:-1:-1;;;;;;3313:22:0;;;;;;:16;:22;;;;;;;;3336:10;3313:34;;;;;;;;;;3291:56;:89;;;-1:-1:-1;3365:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;3365:15:0;3351:10;:29;3291:89;3269:153;;;;-1:-1:-1;;;3269:153:0;;9409:2:1;3269:153:0;;;9391:21:1;9448:2;9428:18;;;9421:30;-1:-1:-1;;;9467:18:1;;;9460:44;9521:18;;3269:153:0;9207:338:1;3269:153:0;-1:-1:-1;;;;;3627:16:0;;;;;;;:10;:16;;;;;;;;:18;;-1:-1:-1;;3627:18:0;;;3662:14;;;;;;;;;:16;;3627:18;3662:16;;;3702:12;;;:8;:12;;;;;:17;;-1:-1:-1;;;;;;3702:17:0;;;;;;;;3739:11;:15;;;;;;3732:22;;;;;;;;3772;;3711:2;;3662:14;3627:16;3772:22;;;3034:768;;;:::o;11753:442::-;11850:7;11908:27;;;:17;:27;;;;;;;;11879:56;;;;;;;;;-1:-1:-1;;;;;11879:56:0;;;;;-1:-1:-1;;;11879:56:0;;;-1:-1:-1;;;;;11879:56:0;;;;;;;;11850:7;;11948:92;;-1:-1:-1;11999:29:0;;;;;;;;;12009:19;11999:29;-1:-1:-1;;;;;11999:29:0;;;;-1:-1:-1;;;11999:29:0;;-1:-1:-1;;;;;11999:29:0;;;;;11948:92;12090:23;;;;12052:21;;12561:5;;12077:36;;-1:-1:-1;;;;;12077:36:0;:10;:36;:::i;:::-;12076:58;;;;:::i;:::-;12155:16;;;;;-1:-1:-1;11753:442:0;;-1:-1:-1;;;;11753:442:0:o;38300:124::-;16109:13;:11;:13::i;:::-;33003:15;:34;;-1:-1:-1;;33003:34:0;;;;;;;38300:124;:::o;38380:36::-:1;38300:124:::0;:::o;3810:409::-;3934:26;3947:4;3953:2;3957;3934:12;:26::i;:::-;-1:-1:-1;;;;;3995:14:0;;;:19;;:172;;-1:-1:-1;4035:66:0;;-1:-1:-1;;;4035:66:0;;;4076:10;4035:66;;;11067:34:1;-1:-1:-1;;;;;11137:15:1;;;11117:18;;;11110:43;11169:18;;;11162:34;;;11232:3;11212:18;;;11205:31;-1:-1:-1;11252:19:1;;;11245:30;4122:45:0;;4035:40;;;;4122:45;;11292:19:1;;4035:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4035:132:0;;3995:172;3973:238;;;;-1:-1:-1;;;3973:238:0;;;;;;;:::i;:::-;3810:409;;;:::o;36192:599::-;22350:21;:19;:21::i;:::-;32144:15:::1;::::0;::::1;;32136:52;;;::::0;-1:-1:-1;;;32136:52:0;;12123:2:1;32136:52:0::1;::::0;::::1;12105:21:1::0;12162:2;12142:18;;;12135:30;12201:26;12181:18;;;12174:54;12245:18;;32136:52:0::1;11921:348:1::0;32136:52:0::1;36407:3:::2;36412:6;32782:27;32794:7;32803:5;32782:11;:27::i;:::-;32774:57;;;::::0;-1:-1:-1;;;32774:57:0;;12476:2:1;32774:57:0::2;::::0;::::2;12458:21:1::0;12515:2;12495:18;;;12488:30;-1:-1:-1;;;12534:18:1;;;12527:47;12591:18;;32774:57:0::2;12274:341:1::0;32774:57:0::2;36445:3:::3;36450:7;34469:1;32435:15;32453:22;32472:2;-1:-1:-1::0;;;;;33712:25:0;33685:7;33712:25;;;:19;:25;;;;;;;33614:131;32453:22:::3;32435:40:::0;-1:-1:-1;32522:16:0;32494:24:::3;32504:14:::0;32435:40;32494:24:::3;:::i;:::-;:44;;32486:104;;;::::0;-1:-1:-1;;;32486:104:0;;12955:2:1;32486:104:0::3;::::0;::::3;12937:21:1::0;12994:2;12974:18;;;12967:30;13033:34;13013:18;;;13006:62;-1:-1:-1;;;13084:18:1;;;13077:45;13139:19;;32486:104:0::3;12753:411:1::0;32486:104:0::3;36527:7:::4;36514:10;;:20;;;;:::i;:::-;36501:9;:33;36497:64;;36543:18;;-1:-1:-1::0;;;36543:18:0::4;;;;;;;;;;;36497:64;34411:4;36593:7;36576:14;;:24;;;;:::i;:::-;:39;36572:63;;;36624:11;;-1:-1:-1::0;;;36624:11:0::4;;;;;;;;;;;36572:63;36651:13;36646:138;36678:7;36670:5;:15;36646:138;;;36711:30;36721:3;36726:14;;36711:9;:30::i;:::-;36756:14;:16:::0;;;:14:::4;:16;::::0;::::4;:::i;:::-;;;;;;36687:7;;;;;:::i;:::-;;;;36646:138;;;;32424:186:::3;32842:1;;;32199::::2;;22394:20:::0;21788:1;22910:7;:22;22727:213;38868:248;16109:13;:11;:13::i;:::-;39001:28:::1;::::0;38947:21:::1;::::0;38929:15:::1;::::0;-1:-1:-1;;;;;39001:8:0;::::1;::::0;38947:21;;38929:15;39001:28;38929:15;39001:28;38947:21;39001:8;:28:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38979:50;;;39045:10;39040:69;;39079:18;;-1:-1:-1::0;;;39079:18:0::1;;;;;;;;;;;38482:96:::0;16109:13;:11;:13::i;:::-;38547:15:::1;:23:::0;;-1:-1:-1;;38547:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38482:96::o;1364:151::-;1422:13;1465:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1465:12:0;;1448:59;;;;-1:-1:-1;;;1448:59:0;;13721:2:1;1448:59:0;;;13703:21:1;13760:2;13740:18;;;13733:30;-1:-1:-1;;;13779:18:1;;;13772:40;13829:18;;1448:59:0;13519:334:1;1448:59:0;1364:151;;;:::o;1523:172::-;1586:7;-1:-1:-1;;;;;1614:19:0;;1606:44;;;;-1:-1:-1;;;1606:44:0;;14060:2:1;1606:44:0;;;14042:21:1;14099:2;14079:18;;;14072:30;-1:-1:-1;;;14118:18:1;;;14111:42;14170:18;;1606:44:0;13858:336:1;1606:44:0;-1:-1:-1;;;;;;1670:17:0;;;;;:10;:17;;;;;;;1523:172::o;16871:103::-;16109:13;:11;:13::i;:::-;16936:30:::1;16963:1;16936:18;:30::i;:::-;16871:103::o:0;37958:105::-;16109:13;:11;:13::i;:::-;38030:25:::1;38044:10;38030:13;:25::i;34610:23::-:0;;;;;;;:::i;949:20::-;;;;;;;:::i;35639:495::-;22350:21;:19;:21::i;:::-;35136:15:::1;::::0;::::1;;35131:50;;35160:21;;-1:-1:-1::0;;;35160:21:0::1;;;;;;;;;;;35131:50;34469:1:::2;35773:7;:30;35769:62;;;35812:19;;-1:-1:-1::0;;;35812:19:0::2;;;;;;;;;;;35769:62;34411:4;35846:14;;:30;35842:54;;35885:11;;-1:-1:-1::0;;;35885:11:0::2;;;;;;;;;;;35842:54;35937:7;35924:10;;:20;;;;:::i;:::-;35911:9;:33;35907:64;;35953:18;;-1:-1:-1::0;;;35953:18:0::2;;;;;;;;;;;35907:64;35987:13;35982:145;36014:7;36006:5;:15;35982:145;;;36047:37;36057:10;36069:14;;36047:9;:37::i;:::-;36099:14;:16:::0;;;:14:::2;:16;::::0;::::2;:::i;:::-;;;;;;36023:7;;;;;:::i;:::-;;;;35982:145;;;;22394:20:::0;21788:1;22910:7;:22;22727:213;2819:207;2922:10;2905:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2905:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;2905:49:0;;;;;;;;;;2972:46;;722:41:1;;;2905:38:0;;2922:10;2972:46;;695:18:1;2972:46:0;;;;;;;2819:207;;:::o;33824:220::-;33949:25;;-1:-1:-1;;14348:2:1;14344:15;;;14340:53;33949:25:0;;;14328:66:1;33907:4:0;;;;14410:12:1;;33949:25:0;;;;;;;;;;;;33939:36;;;;;;33924:51;;33993:43;34012:5;34019:10;;34031:4;33993:18;:43::i;:::-;33986:50;33824:220;-1:-1:-1;;;;33824:220:0:o;4227:441::-;4381:26;4394:4;4400:2;4404;4381:12;:26::i;:::-;-1:-1:-1;;;;;4442:14:0;;;:19;;:174;;-1:-1:-1;4482:68:0;;-1:-1:-1;;;4482:68:0;;;4571:45;-1:-1:-1;;;;;4482:40:0;;;4571:45;;4482:68;;4523:10;;4535:4;;4541:2;;4545:4;;;;4482:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4482:134:0;;4442:174;4420:240;;;;-1:-1:-1;;;4420:240:0;;;;;;;:::i;:::-;4227:441;;;;;:::o;36873:320::-;36991:13;37054:1;37026:16;37034:7;37026;:16::i;:::-;-1:-1:-1;;;;;37026:30:0;;37022:91;;37080:21;;-1:-1:-1;;;37080:21:0;;;;;;;;;;;37022:91;37137:2;37127:7;:12;37123:35;;;37148:10;37141:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36873:320;;;:::o;37123:35::-;37176:9;37169:16;;;;;:::i;37699:180::-;16109:13;:11;:13::i;:::-;37820:21;;::::1;::::0;:10:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;37852:19:0;;::::1;::::0;:9:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;34579:24::-:0;;;;;;;:::i;17129:201::-;16109:13;:11;:13::i;:::-;-1:-1:-1;;;;;17218:22:0;::::1;17210:73;;;::::0;-1:-1:-1;;;17210:73:0;;15302:2:1;17210:73:0::1;::::0;::::1;15284:21:1::0;15341:2;15321:18;;;15314:30;15380:34;15360:18;;;15353:62;-1:-1:-1;;;15431:18:1;;;15424:36;15477:19;;17210:73:0::1;15100:402:1::0;17210:73:0::1;17294:28;17313:8;17294:18;:28::i;38118:103::-:0;16109:13;:11;:13::i;:::-;38190:10:::1;:23:::0;38118:103::o;35274:311::-;16109:13;:11;:13::i;:::-;35363:14:::1;::::0;:19;35355:57:::1;;;::::0;-1:-1:-1;;;35355:57:0;;15709:2:1;35355:57:0::1;::::0;::::1;15691:21:1::0;15748:2;15728:18;;;15721:30;15787:27;15767:18;;;15760:55;15832:18;;35355:57:0::1;15507:349:1::0;35355:57:0::1;35423:13;35447:98;35471:2;35463:5;:10;35447:98;;;35499:34;35509:16;35527:5;35499:9;:34::i;:::-;35475:7:::0;::::1;::::0;::::1;:::i;:::-;;;;35447:98;;;35555:14;:22:::0;-1:-1:-1;35274:311:0:o;4862:340::-;4938:4;-1:-1:-1;;;;;;;;;4975:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;5051:25:0;;;4975:101;:177;;;-1:-1:-1;;;;;;;;5127:25:0;-1:-1:-1;;;5127:25:0;;4862:340::o;11483:215::-;11585:4;-1:-1:-1;;;;;;11609:41:0;;-1:-1:-1;;;11609:41:0;;:81;;-1:-1:-1;;;;;;;;;;10212:40:0;;;11654:36;10103:157;16388:132;16296:6;;-1:-1:-1;;;;;16296:6:0;15010:10;16452:23;16444:68;;;;-1:-1:-1;;;16444:68:0;;16063:2:1;16444:68:0;;;16045:21:1;;;16082:18;;;16075:30;16141:34;16121:18;;;16114:62;16193:18;;16444:68:0;15861:356:1;12845:332:0;12561:5;-1:-1:-1;;;;;12948:33:0;;;;12940:88;;;;-1:-1:-1;;;12940:88:0;;16424:2:1;12940:88:0;;;16406:21:1;16463:2;16443:18;;;16436:30;16502:34;16482:18;;;16475:62;-1:-1:-1;;;16553:18:1;;;16546:40;16603:19;;12940:88:0;16222:406:1;12940:88:0;-1:-1:-1;;;;;13047:22:0;;13039:60;;;;-1:-1:-1;;;13039:60:0;;16835:2:1;13039:60:0;;;16817:21:1;16874:2;16854:18;;;16847:30;16913:27;16893:18;;;16886:55;16958:18;;13039:60:0;16633:349:1;13039:60:0;13134:35;;;;;;;;;-1:-1:-1;;;;;13134:35:0;;;;;;-1:-1:-1;;;;;13134:35:0;;;;;;;;;;-1:-1:-1;;;13112:57:0;;;;:19;:57;12845:332::o;22430:289::-;21832:1;22560:7;;:19;22552:63;;;;-1:-1:-1;;;22552:63:0;;17189:2:1;22552:63:0;;;17171:21:1;17228:2;17208:18;;;17201:30;17267:33;17247:18;;;17240:61;17318:18;;22552:63:0;16987:355:1;22552:63:0;21832:1;22693:7;:18;22430:289::o;6380:349::-;6451:13;6457:2;6461;6451:5;:13::i;:::-;-1:-1:-1;;;;;6499:14:0;;;:19;;:178;;-1:-1:-1;6539:72:0;;-1:-1:-1;;;6539:72:0;;;6580:10;6539:72;;;11067:34:1;6600:1:0;11117:18:1;;;11110:43;;;11169:18;;;11162:34;;;11232:3;11212:18;;;11205:31;11252:19;;;11245:30;6632:45:0;-1:-1:-1;;;;;6539:40:0;;;6632:45;;11292:19:1;;6539:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6539:138:0;;6499:178;6477:244;;;;-1:-1:-1;;;6477:244:0;;;;;;;:::i;17490:191::-;17583:6;;;-1:-1:-1;;;;;17600:17:0;;;-1:-1:-1;;;;;;17600:17:0;;;;;;;17633:40;;17583:6;;;17600:17;17583:6;;17633:40;;17564:16;;17633:40;17553:128;17490:191;:::o;33105:151::-;33177:10;:24;;;33219:29;;160:25:1;;;33219:29:0;;148:2:1;133:18;33219:29:0;;;;;;;33105:151;:::o;24080:190::-;24205:4;24258;24229:25;24242:5;24249:4;24229:12;:25::i;:::-;:33;;24080:190;-1:-1:-1;;;;24080:190:0:o;5402:384::-;-1:-1:-1;;;;;5477:16:0;;5469:46;;;;-1:-1:-1;;;5469:46:0;;10091:2:1;5469:46:0;;;10073:21:1;10130:2;10110:18;;;10103:30;-1:-1:-1;;;10149:18:1;;;10142:47;10206:18;;5469:46:0;9889:341:1;5469:46:0;5560:1;5536:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5536:12:0;:26;5528:53;;;;-1:-1:-1;;;5528:53:0;;17549:2:1;5528:53:0;;;17531:21:1;17588:2;17568:18;;;17561:30;-1:-1:-1;;;17607:18:1;;;17600:44;17661:18;;5528:53:0;17347:338:1;5528:53:0;-1:-1:-1;;;;;5675:14:0;;;;;;:10;:14;;;;;;;;:16;;;;;;5715:12;;;:8;:12;;;;;;:17;;-1:-1:-1;;;;;;5715:17:0;;;;;5750:28;5724:2;;5675:14;;5750:28;;5675:14;;5750:28;5402:384;;:::o;24947:296::-;25030:7;25073:4;25030:7;25088:118;25112:5;:12;25108:1;:16;25088:118;;;25161:33;25171:12;25185:5;25191:1;25185:8;;;;;;;;:::i;:::-;;;;;;;25161:9;:33::i;:::-;25146:48;-1:-1:-1;25126:3:0;;;;:::i;:::-;;;;25088:118;;;-1:-1:-1;25223:12:0;24947:296;-1:-1:-1;;;24947:296:0:o;31154:149::-;31217:7;31248:1;31244;:5;:51;;31379:13;31473:15;;;31509:4;31502:15;;;31556:4;31540:21;;31244:51;;;31379:13;31473:15;;;31509:4;31502:15;;;31556:4;31540:21;;31252:20;31237:58;31154:149;-1:-1:-1;;;31154:149:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;774:173::-;842:20;;-1:-1:-1;;;;;891:31:1;;881:42;;871:70;;937:1;934;927:12;952:366;1019:6;1027;1080:2;1068:9;1059:7;1055:23;1051:32;1048:52;;;1096:1;1093;1086:12;1048:52;1119:29;1138:9;1119:29;:::i;:::-;1109:39;;1198:2;1187:9;1183:18;1170:32;-1:-1:-1;;;;;1235:5:1;1231:38;1224:5;1221:49;1211:77;;1284:1;1281;1274:12;1211:77;1307:5;1297:15;;;952:366;;;;;:::o;1323:597::-;1435:4;1464:2;1493;1482:9;1475:21;1525:6;1519:13;1568:6;1563:2;1552:9;1548:18;1541:34;1593:1;1603:140;1617:6;1614:1;1611:13;1603:140;;;1712:14;;;1708:23;;1702:30;1678:17;;;1697:2;1674:26;1667:66;1632:10;;1603:140;;;1761:6;1758:1;1755:13;1752:91;;;1831:1;1826:2;1817:6;1806:9;1802:22;1798:31;1791:42;1752:91;-1:-1:-1;1904:2:1;1883:15;-1:-1:-1;;1879:29:1;1864:45;;;;1911:2;1860:54;;1323:597;-1:-1:-1;;;1323:597:1:o;1925:180::-;1984:6;2037:2;2025:9;2016:7;2012:23;2008:32;2005:52;;;2053:1;2050;2043:12;2005:52;-1:-1:-1;2076:23:1;;1925:180;-1:-1:-1;1925:180:1:o;2318:254::-;2386:6;2394;2447:2;2435:9;2426:7;2422:23;2418:32;2415:52;;;2463:1;2460;2453:12;2415:52;2486:29;2505:9;2486:29;:::i;:::-;2476:39;2562:2;2547:18;;;;2534:32;;-1:-1:-1;;;2318:254:1:o;2577:328::-;2654:6;2662;2670;2723:2;2711:9;2702:7;2698:23;2694:32;2691:52;;;2739:1;2736;2729:12;2691:52;2762:29;2781:9;2762:29;:::i;:::-;2752:39;;2810:38;2844:2;2833:9;2829:18;2810:38;:::i;:::-;2800:48;;2895:2;2884:9;2880:18;2867:32;2857:42;;2577:328;;;;;:::o;2910:248::-;2978:6;2986;3039:2;3027:9;3018:7;3014:23;3010:32;3007:52;;;3055:1;3052;3045:12;3007:52;-1:-1:-1;;3078:23:1;;;3148:2;3133:18;;;3120:32;;-1:-1:-1;2910:248:1:o;3624:160::-;3689:20;;3745:13;;3738:21;3728:32;;3718:60;;3774:1;3771;3764:12;3789:180;3845:6;3898:2;3886:9;3877:7;3873:23;3869:32;3866:52;;;3914:1;3911;3904:12;3866:52;3937:26;3953:9;3937:26;:::i;3974:127::-;4035:10;4030:3;4026:20;4023:1;4016:31;4066:4;4063:1;4056:15;4090:4;4087:1;4080:15;4106:275;4177:2;4171:9;4242:2;4223:13;;-1:-1:-1;;4219:27:1;4207:40;;4277:18;4262:34;;4298:22;;;4259:62;4256:88;;;4324:18;;:::i;:::-;4360:2;4353:22;4106:275;;-1:-1:-1;4106:275:1:o;4386:712::-;4440:5;4493:3;4486:4;4478:6;4474:17;4470:27;4460:55;;4511:1;4508;4501:12;4460:55;4547:6;4534:20;4573:4;4596:18;4592:2;4589:26;4586:52;;;4618:18;;:::i;:::-;4664:2;4661:1;4657:10;4687:28;4711:2;4707;4703:11;4687:28;:::i;:::-;4749:15;;;4819;;;4815:24;;;4780:12;;;;4851:15;;;4848:35;;;4879:1;4876;4869:12;4848:35;4915:2;4907:6;4903:15;4892:26;;4927:142;4943:6;4938:3;4935:15;4927:142;;;5009:17;;4997:30;;4960:12;;;;5047;;;;4927:142;;;5087:5;4386:712;-1:-1:-1;;;;;;;4386:712:1:o;5103:490::-;5205:6;5213;5221;5274:2;5262:9;5253:7;5249:23;5245:32;5242:52;;;5290:1;5287;5280:12;5242:52;5313:29;5332:9;5313:29;:::i;:::-;5303:39;;5389:2;5378:9;5374:18;5361:32;5351:42;;5444:2;5433:9;5429:18;5416:32;5471:18;5463:6;5460:30;5457:50;;;5503:1;5500;5493:12;5457:50;5526:61;5579:7;5570:6;5559:9;5555:22;5526:61;:::i;:::-;5516:71;;;5103:490;;;;;:::o;5598:186::-;5657:6;5710:2;5698:9;5689:7;5685:23;5681:32;5678:52;;;5726:1;5723;5716:12;5678:52;5749:29;5768:9;5749:29;:::i;5974:254::-;6039:6;6047;6100:2;6088:9;6079:7;6075:23;6071:32;6068:52;;;6116:1;6113;6106:12;6068:52;6139:29;6158:9;6139:29;:::i;:::-;6129:39;;6187:35;6218:2;6207:9;6203:18;6187:35;:::i;:::-;6177:45;;5974:254;;;;;:::o;6233:422::-;6326:6;6334;6387:2;6375:9;6366:7;6362:23;6358:32;6355:52;;;6403:1;6400;6393:12;6355:52;6426:29;6445:9;6426:29;:::i;:::-;6416:39;;6506:2;6495:9;6491:18;6478:32;6533:18;6525:6;6522:30;6519:50;;;6565:1;6562;6555:12;6519:50;6588:61;6641:7;6632:6;6621:9;6617:22;6588:61;:::i;:::-;6578:71;;;6233:422;;;;;:::o;6660:808::-;6757:6;6765;6773;6781;6789;6842:3;6830:9;6821:7;6817:23;6813:33;6810:53;;;6859:1;6856;6849:12;6810:53;6882:29;6901:9;6882:29;:::i;:::-;6872:39;;6930:38;6964:2;6953:9;6949:18;6930:38;:::i;:::-;6920:48;;7015:2;7004:9;7000:18;6987:32;6977:42;;7070:2;7059:9;7055:18;7042:32;7093:18;7134:2;7126:6;7123:14;7120:34;;;7150:1;7147;7140:12;7120:34;7188:6;7177:9;7173:22;7163:32;;7233:7;7226:4;7222:2;7218:13;7214:27;7204:55;;7255:1;7252;7245:12;7204:55;7295:2;7282:16;7321:2;7313:6;7310:14;7307:34;;;7337:1;7334;7327:12;7307:34;7382:7;7377:2;7368:6;7364:2;7360:15;7356:24;7353:37;7350:57;;;7403:1;7400;7393:12;7350:57;6660:808;;;;-1:-1:-1;6660:808:1;;-1:-1:-1;7434:2:1;7426:11;;7456:6;6660:808;-1:-1:-1;;;6660:808:1:o;7473:531::-;7516:5;7569:3;7562:4;7554:6;7550:17;7546:27;7536:55;;7587:1;7584;7577:12;7536:55;7623:6;7610:20;7649:18;7645:2;7642:26;7639:52;;;7671:18;;:::i;:::-;7715:55;7758:2;7739:13;;-1:-1:-1;;7735:27:1;7764:4;7731:38;7715:55;:::i;:::-;7795:2;7786:7;7779:19;7841:3;7834:4;7829:2;7821:6;7817:15;7813:26;7810:35;7807:55;;;7858:1;7855;7848:12;7807:55;7923:2;7916:4;7908:6;7904:17;7897:4;7888:7;7884:18;7871:55;7971:1;7946:16;;;7964:4;7942:27;7935:38;;;;7950:7;7473:531;-1:-1:-1;;;7473:531:1:o;8009:543::-;8097:6;8105;8158:2;8146:9;8137:7;8133:23;8129:32;8126:52;;;8174:1;8171;8164:12;8126:52;8214:9;8201:23;8243:18;8284:2;8276:6;8273:14;8270:34;;;8300:1;8297;8290:12;8270:34;8323:50;8365:7;8356:6;8345:9;8341:22;8323:50;:::i;:::-;8313:60;;8426:2;8415:9;8411:18;8398:32;8382:48;;8455:2;8445:8;8442:16;8439:36;;;8471:1;8468;8461:12;8439:36;;8494:52;8538:7;8527:8;8516:9;8512:24;8494:52;:::i;8557:260::-;8625:6;8633;8686:2;8674:9;8665:7;8661:23;8657:32;8654:52;;;8702:1;8699;8692:12;8654:52;8725:29;8744:9;8725:29;:::i;:::-;8715:39;;8773:38;8807:2;8796:9;8792:18;8773:38;:::i;8822:380::-;8901:1;8897:12;;;;8944;;;8965:61;;9019:4;9011:6;9007:17;8997:27;;8965:61;9072:2;9064:6;9061:14;9041:18;9038:38;9035:161;;9118:10;9113:3;9109:20;9106:1;9099:31;9153:4;9150:1;9143:15;9181:4;9178:1;9171:15;9035:161;;8822:380;;;:::o;10235:127::-;10296:10;10291:3;10287:20;10284:1;10277:31;10327:4;10324:1;10317:15;10351:4;10348:1;10341:15;10367:168;10407:7;10473:1;10469;10465:6;10461:14;10458:1;10455:21;10450:1;10443:9;10436:17;10432:45;10429:71;;;10480:18;;:::i;:::-;-1:-1:-1;10520:9:1;;10367:168::o;10540:217::-;10580:1;10606;10596:132;;10650:10;10645:3;10641:20;10638:1;10631:31;10685:4;10682:1;10675:15;10713:4;10710:1;10703:15;10596:132;-1:-1:-1;10742:9:1;;10540:217::o;11322:249::-;11391:6;11444:2;11432:9;11423:7;11419:23;11415:32;11412:52;;;11460:1;11457;11450:12;11412:52;11492:9;11486:16;11511:30;11535:5;11511:30;:::i;11576:340::-;11778:2;11760:21;;;11817:2;11797:18;;;11790:30;-1:-1:-1;;;11851:2:1;11836:18;;11829:46;11907:2;11892:18;;11576:340::o;12620:128::-;12660:3;12691:1;12687:6;12684:1;12681:13;12678:39;;;12697:18;;:::i;:::-;-1:-1:-1;12733:9:1;;12620:128::o;13169:135::-;13208:3;13229:17;;;13226:43;;13249:18;;:::i;:::-;-1:-1:-1;13296:1:1;13285:13;;13169:135::o;14433:662::-;-1:-1:-1;;;;;14712:15:1;;;14694:34;;14764:15;;14759:2;14744:18;;14737:43;14811:2;14796:18;;14789:34;;;14859:3;14854:2;14839:18;;14832:31;;;14879:19;;14872:35;;;14637:4;14900:6;14950;14674:3;14929:19;;14916:49;15015:1;15009:3;15000:6;14989:9;14985:22;14981:32;14974:43;15085:3;15078:2;15074:7;15069:2;15061:6;15057:15;15053:29;15042:9;15038:45;15034:55;15026:63;;14433:662;;;;;;;;:::o;17690:127::-;17751:10;17746:3;17742:20;17739:1;17732:31;17782:4;17779:1;17772:15;17806:4;17803:1;17796:15
Swarm Source
ipfs://c1a021c7fde431a0b81be49d6b527699983203ebe986fc9717338262b181df12
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.