ERC-721
Overview
Max Total Supply
0 KITTEN
Holders
2,661
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 KITTENLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Kitten
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.13; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/interfaces/IERC20.sol"; import "@openzeppelin/contracts/interfaces/IERC2981.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@rari-capital/solmate/src/tokens/ERC721.sol"; import "./interfaces/IKitten.sol"; import "./interfaces/IMetadata.sol"; /// @title Kitten /// @author kitten devs /// @notice h/t crypto coven for some beautiful ERC721 inspiration. contract Kitten is IKitten, ERC721, IERC2981, Ownable { /// STORAGE /// /// @notice Allowed max supply of Kittens. uint256 public constant MAX_KITTENS = 9500; /// @notice Per-wallet Kitten cap. uint256 public constant MAX_KITTENS_PER_WALLET = 4; /// @notice Public sale. bool public isPublicSaleActive; uint256 public constant PUBLIC_SALE_PRICE = 0.088 ether; /// @notice Community sale (determined in Discord). bool public isCommunitySaleActive; uint256 public constant COMMUNITY_SALE_PRICE = 0.077 ether; /// @notice Merkle root for first community sale claims. bytes32 public communityFirstClaimMerkleRoot; /// @notice Addresses that have claimed a first community mint. mapping(address => bool) public claimedFirst; /// @notice Second community sale list for addresses with two claims. bytes32 public communitySecondClaimMerkleRoot; /// @notice Addresses that have claimed a second community mint. mapping(address => bool) public claimedSecond; /// @notice Counters for addresses that have participated in public sale. mapping(address => bool) public publicSaleParticipants; /// @notice Team + gift kittens. uint256 public numGiftedKittens; uint256 public constant MAX_GIFTED_KITTENS = 400; /// @notice Royalty percentage. Must be an integer percentage. uint8 public royaltyPercent = 5; /// @notice Shifting kitten metadata prereveal. bool public hasShifted = false; uint256 public metadataOffset = 0; /// @notice Metadata reveal trigger. bool public isRevealed = false; /// @notice Mapping of token ID to traits. mapping(uint256 => Kitten) public kittens; /// @notice Mapping of Kittens using special renderer. mapping(uint256 => bool) public specialMode; /// @notice List of probabilities for each trait type. uint16[][9] public traitRarities; /// @notice List of aliases for AJ Walker's Alias Algorithm. uint16[][9] public traitAliases; /// @notice Sauce up the prices. uint256[4] private sauce = [ 0.00002 ether, 0.00006 ether, 0.00001 ether, 0.00007 ether ]; /// @notice Addresses that can perform admin functionality, e.g. gifting. mapping(address => bool) private admins; /// @notice Address of the metadata renderer. address public renderer; /// @notice Used for increased pseudorandomness. bytes32 private entropy; /// @notice Counter of minted tokens. uint256 public tokenCounter; /// CONSTRUCTOR /// constructor() ERC721("WarKitten", "KITTEN") { // This looks insane, but it works. // Backgrounds. traitRarities[0] = [ 232, 201, 77, 70, 47, 136, 174, 93, 110, 232, 77, 115, 118, 117, 198, 121, 56, 61, 62, 106, 106, 255, 52 ]; traitAliases[0] = [ 1, 5, 0, 1, 1, 6, 8, 5, 9, 10, 11, 12, 14, 8, 15, 21, 8, 9, 10, 12, 12, 0, 15 ]; // Bodies. traitRarities[1] = [ 167, 192, 215, 98, 221, 252, 165, 207, 210, 133, 184, 182, 109, 219, 143, 202, 61, 249, 207, 196, 185, 214, 143, 120, 135, 76, 109, 233, 168, 247, 141, 176, 56, 143, 109, 130, 204, 148, 170, 240, 232, 165, 165, 143, 250, 244, 201, 245, 72, 131, 139, 200, 120, 207, 133, 173, 63, 70, 83, 185, 223, 253, 120, 126, 165, 193, 120, 255, 128 ]; traitAliases[1] = [ 1, 2, 4, 1, 8, 2, 2, 2, 9, 10, 15, 2, 4, 4, 4, 17, 8, 21, 9, 9, 9, 27, 9, 9, 15, 17, 21, 28, 29, 30, 38, 21, 28, 29, 29, 30, 38, 38, 39, 45, 38, 38, 39, 45, 45, 46, 47, 48, 51, 45, 46, 54, 47, 47, 55, 60, 48, 54, 61, 61, 61, 63, 63, 65, 65, 67, 65, 0, 67 ]; // Clothes. traitRarities[2] = [ 201, 251, 190, 122, 143, 97, 46, 224, 233, 131, 203, 253, 194, 153, 153, 153, 56, 126, 81, 66, 106, 97, 62, 50, 50, 72, 50, 50, 81, 179, 153, 72, 253, 184, 228, 112, 130, 108, 62, 62, 131, 153, 108, 151, 234, 91, 203, 111, 233, 102, 54, 72, 85, 58, 184, 153, 112, 81, 131, 91, 31, 215, 117, 203, 153, 212, 97, 153, 184, 218, 114, 255 ]; traitAliases[2] = [ 1, 2, 8, 0, 2, 8, 12, 12, 12, 12, 29, 29, 29, 29, 34, 34, 36, 43, 47, 61, 62, 65, 69, 69, 70, 70, 70, 71, 71, 34, 71, 71, 71, 71, 36, 71, 43, 71, 71, 71, 71, 71, 71, 44, 47, 71, 71, 48, 61, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 62, 65, 71, 71, 69, 71, 71, 71, 70, 71, 0 ]; // Ears. traitRarities[3] = [ 23, 26, 52, 35, 152, 158, 200, 107, 157, 30, 87, 189, 255 ]; traitAliases[3] = [ 4, 7, 7, 11, 5, 6, 7, 8, 11, 11, 12, 12, 0 ]; // Eyes. traitRarities[4] = [ 51, 70, 187, 151, 126, 163, 60, 51, 27, 30, 97, 237, 69, 249, 19, 34, 163, 90, 144, 117, 105, 125, 169, 136, 27, 90, 109, 47, 255 ]; traitAliases[4] = [ 4, 28, 28, 28, 5, 22, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 0 ]; // Heads. traitRarities[5] = [ 145, 127, 47, 13, 27, 221, 228, 147, 241, 114, 65, 199, 49, 29, 215, 51, 98, 255, 189, 53, 56, 58, 32, 42, 67, 209, 89, 212, 60, 45, 31, 33, 16, 20, 40, 62, 168, 189, 131, 36, 105, 216, 74, 87, 155, 252, 71, 71, 118, 193, 216, 67, 196, 203, 78, 242, 22, 145, 46, 89, 100, 123, 221, 147, 167, 25, 38, 125, 138, 214, 143, 190, 232, 74, 175, 40, 216, 221, 218, 130, 242, 191, 255 ]; traitAliases[5] = [ 6, 11, 16, 22, 37, 37, 8, 37, 11, 41, 43, 14, 48, 58, 16, 62, 17, 22, 71, 73, 79, 81, 26, 82, 82, 82, 36, 82, 82, 82, 82, 82, 82, 82, 82, 82, 37, 41, 82, 82, 82, 43, 82, 44, 45, 48, 82, 82, 49, 50, 55, 82, 82, 82, 82, 58, 82, 82, 61, 82, 82, 62, 71, 82, 82, 82, 82, 82, 82, 82, 82, 72, 73, 74, 77, 82, 82, 79, 82, 80, 81, 82, 0 ]; // Necks. traitRarities[6] = [ 67, 70, 23, 86, 51, 56, 121, 67, 60, 255 ]; traitAliases[6] = [ 9, 9, 9, 9, 9, 9, 9, 9, 9, 0 ]; // Paws. traitRarities[7] = [ 193, 133, 111, 230, 106, 89, 59, 126, 94, 197, 94, 236, 239, 115, 198, 85, 24, 204, 28, 150, 78, 80, 217, 222, 90, 128, 120, 48, 130, 188, 122, 192, 61, 63, 67, 69, 70, 87, 33, 97, 120, 232, 124, 89, 99, 218, 41, 244, 93, 230, 107, 239, 96, 81, 109, 85, 74, 25, 98, 87, 254, 130, 102, 165, 56, 78, 250, 119, 255 ]; traitAliases[7] = [ 1, 3, 0, 8, 1, 8, 24, 28, 9, 11, 39, 12, 24, 44, 44, 44, 57, 65, 65, 67, 67, 68, 68, 68, 28, 68, 68, 68, 29, 31, 68, 39, 68, 68, 68, 68, 68, 68, 68, 40, 41, 44, 68, 68, 45, 47, 68, 57, 68, 68, 68, 68, 68, 68, 68, 68, 68, 63, 68, 68, 68, 68, 68, 65, 68, 66, 67, 68, 0 ]; // Special. traitRarities[8] = [ 12, 10, 8, 14, 19, 17, 255 ]; traitAliases[8] = [ 6, 6, 6, 6, 6, 6, 0 ]; } /// MODIFIERS /// /// @notice Some anti-bot restrictions. modifier noCheats() { uint256 size = 0; address account = msg.sender; assembly { size := extcodesize(account) } require( admins[msg.sender] || (msg.sender == tx.origin && size == 0), "You're trying to cheat!" ); _; // Use the last caller hash to add entropy to next caller. entropy = keccak256(abi.encodePacked(account, block.coinbase)); } modifier increaseEntropy() { _; // Use the last caller hash to add entropy to next caller. entropy = keccak256(abi.encodePacked(msg.sender, block.coinbase)); } modifier onlyAdmin() { require(admins[msg.sender], "Must be an admin"); _; } modifier publicSaleActive() { require(isPublicSaleActive, "Public sale is not open"); _; } modifier communitySaleActive() { require(isCommunitySaleActive, "Community sale is not open"); _; } modifier canMintKittens(uint256 numberOfTokens) { require(numberOfTokens > 0, "Cannot mint zero"); require(numberOfTokens <= MAX_KITTENS_PER_WALLET, "Max kittens to mint exceeded"); require( tokenCounter + numberOfTokens <= MAX_KITTENS, "Not enough kittens remaining to mint" ); _; } modifier canGiftKittens(uint256 num) { require( numGiftedKittens + num <= MAX_GIFTED_KITTENS, "Not enough kittens remaining to gift" ); require( tokenCounter + num <= MAX_KITTENS, "Not enough kittens remaining to mint" ); _; } modifier isCorrectCommunitySalePayment() { require(msg.value == COMMUNITY_SALE_PRICE, "Incorrect ETH value sent"); _; } modifier isCorrectPublicSalePayment(uint256 number) { require(msg.value == (PUBLIC_SALE_PRICE * number) + sauce[number - 1], "Incorrect ETH value sent"); _; } /// MINTING /// function mint(uint256 amount, address to) external payable publicSaleActive canMintKittens(amount) isCorrectPublicSalePayment(amount) noCheats { require(!publicSaleParticipants[msg.sender], "Already minted"); publicSaleParticipants[msg.sender] = true; uint256 seed = _rand(); for (uint64 i = 0; i < amount; ++i) { _mintKitten(seed, to); } } function mintCommunitySale( address to, bytes32[] calldata merkleProof ) external payable communitySaleActive canMintKittens(1) isCorrectCommunitySalePayment noCheats { // We have two checks here, since some addresses have two claims. if (claimedFirst[to]) { // Check for second claim. require(!claimedSecond[to], "Already claimed"); require(_isValidMerkleProof(merkleProof, communitySecondClaimMerkleRoot, to), "Already claimed"); claimedSecond[to] = true; _mintKitten(_rand(), to); } else { // First claim. require(_isValidMerkleProof(merkleProof, communityFirstClaimMerkleRoot, to), "Address not in list"); claimedFirst[to] = true; _mintKitten(_rand(), to); } } function reserveForGifting(uint256 amount) external onlyAdmin canGiftKittens(amount) increaseEntropy { numGiftedKittens += amount; uint256 seed = _rand(); for (uint256 i = 0; i < amount; i++) { _mintKitten(seed, msg.sender); } } function giftKittens(address[] calldata addresses) external onlyAdmin canGiftKittens(addresses.length) increaseEntropy { uint256 numToGift = addresses.length; numGiftedKittens += numToGift; uint256 seed = _rand(); for (uint256 i = 0; i < numToGift; i++) { _mintKitten(seed, addresses[i]); } } function _mintKitten(uint256 seed, address to) internal { uint256 tokenId = _getNextTokenId(); kittens[tokenId] = selectTraits(_randomize(seed, tokenId)); _safeMint(to, tokenId); } /// IKITTEN /// function getOwner(uint256 tokenId) public view returns (address) { return ownerOf[tokenId]; } function getNextTokenId() public view returns (uint256) { return tokenCounter + 1; } function getKitten(uint256 tokenId) public view returns (Kitten memory) { require(_exists(tokenId), "No such kitten"); return kittens[_getOffsetTokenId(tokenId)]; } /// @notice Returns a single trait value for a Kitten. function getTrait(uint256 tokenId, Trait trait) public view returns (uint8) { require(_exists(tokenId), "No such kitten"); Kitten storage kitten = kittens[_getOffsetTokenId(tokenId)]; if (trait == Trait.Background) return kitten.background; else if (trait == Trait.Body) return kitten.body; else if (trait == Trait.Clothes) return kitten.clothes; else if (trait == Trait.Ears) return kitten.ears; else if (trait == Trait.Eyes) return kitten.eyes; else if (trait == Trait.Head) return kitten.head; else if (trait == Trait.Neck) return kitten.neck; else if (trait == Trait.Special) return kitten.special; else return kitten.weapon; } /// @notice Updates a single trait for a Kitten. /// @dev Used for swapping traits after battles. function updateTrait(uint256 tokenId, Trait trait, uint8 value) public onlyAdmin { require(_exists(tokenId), "No such kitten"); Kitten storage kitten = kittens[_getOffsetTokenId(tokenId)]; if (trait == Trait.Background) kitten.background = value; else if (trait == Trait.Body) kitten.body = value; else if (trait == Trait.Clothes) kitten.clothes = value; else if (trait == Trait.Ears) kitten.ears = value; else if (trait == Trait.Eyes) kitten.eyes = value; else if (trait == Trait.Head) kitten.head = value; else if (trait == Trait.Neck) kitten.neck = value; else if (trait == Trait.Special) kitten.special = value; else if (trait == Trait.Weapon) kitten.weapon = value; } /// @notice Toggle the Kitten's mode. function setKittenMode(uint256 tokenId, bool special) external { // Must be sender's Kitten. require(ownerOf[tokenId] == msg.sender, "Not your kitten"); specialMode[tokenId] = special; } /// HELPERS /// function _isValidMerkleProof( bytes32[] calldata merkleProof, bytes32 root, address account ) internal pure returns (bool) { return MerkleProof.verify( merkleProof, root, keccak256(abi.encodePacked(account)) ); } function _exists(uint256 tokenId) internal view virtual returns (bool) { return ownerOf[tokenId] != address(0) && tokenId <= MAX_KITTENS; } /// @notice Returns a shifted token ID once we've performed the reveal shift. /// @dev Ensure the shift is done *before* reveal is toggled. function _getOffsetTokenId(uint256 tokenId) internal view virtual returns (uint256) { if (!hasShifted || metadataOffset == 0) { return tokenId; } return ((tokenId + metadataOffset) % MAX_KITTENS) + 1; } function _getNextTokenId() private returns (uint256) { ++ tokenCounter; return tokenCounter; } /// TRAITS /// /// @notice Uses AJ Walker's Alias algorithm for O(1) rarity table lookup. /// @notice Ensures O(1) instead of O(n), reduces mint cost. /// @notice Probability & alias tables are generated off-chain beforehand. function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) { uint8 trait = uint8(seed) % uint8(traitRarities[traitType].length); // If a selected random trait probability is selected (biased coin) return that trait. if (seed >> 8 < traitRarities[traitType][trait]) return trait; return uint8(traitAliases[traitType][trait]); } /// @notice Constructs a Kitten with weighted random attributes. function selectTraits(uint256 seed) internal view returns (Kitten memory kitten) { kitten.background = selectTrait(uint16(seed & 0xFFFF), 0) + 1; seed >>= 16; kitten.body = selectTrait(uint16(seed & 0xFFFF), 1) + 1; seed >>= 16; kitten.clothes = selectTrait(uint16(seed & 0xFFFF), 2) + 1; seed >>= 16; kitten.ears = selectTrait(uint16(seed & 0xFFFF), 3) + 1; seed >>= 16; kitten.eyes = selectTrait(uint16(seed & 0xFFFF), 4) + 1; seed >>= 16; kitten.head = selectTrait(uint16(seed & 0xFFFF), 5) + 1; seed >>= 16; kitten.neck = selectTrait(uint16(seed & 0xFFFF), 6) + 1; seed >>= 16; kitten.weapon = selectTrait(uint16(seed & 0xFFFF), 7) + 1; seed >>= 16; kitten.special = selectTrait(uint16(seed & 0xFFFF), 8) + 1; } /// ADMIN /// /// @notice Adds or removes an admin address. function setAdmin(address admin, bool isAdmin) external onlyOwner { admins[admin] = isAdmin; } function setRenderer(address _renderer) external onlyAdmin { renderer = _renderer; } function setIsPublicSaleActive(bool _isPublicSaleActive) external onlyOwner { isPublicSaleActive = _isPublicSaleActive; } function setIsCommunitySaleActive(bool _isCommunitySaleActive) external onlyOwner { isCommunitySaleActive = _isCommunitySaleActive; } function setFirstCommunityListMerkleRoot(bytes32 merkleRoot) external onlyOwner { communityFirstClaimMerkleRoot = merkleRoot; } function setSecondCommunityListMerkleRoot(bytes32 merkleRoot) external onlyOwner { communitySecondClaimMerkleRoot = merkleRoot; } function setRoyaltyPercentage(uint8 percent) external onlyOwner { royaltyPercent = percent; } /// @notice Sets a shifted metadata offset so that Kitten traits aren't mapped precisely to token ID. /// @notice This ensures you can't predict which Kitten traits you'll get at mint time. /// @dev The actual offset ends up being this offset + 1, since we do a modulo on the supply and start with token 1. function setMetadataOffset(uint256 offset) external onlyOwner { if (!hasShifted) { metadataOffset = offset; hasShifted = true; } } /// @notice Resets the metadata shift offset to 0 in case something unexpected happens. /// @dev We wouldn't be able to shift again, since the offset is a one-time setter (no rugs!). function resetMetadataOffset() external onlyOwner { metadataOffset = 0; } function setRevealed() external onlyOwner { isRevealed = true; } /// @notice Break glass in case of emergency. function deSauce() external onlyOwner { sauce = [0, 0, 0, 0]; } /// @notice Send contract balance to owner. function withdraw() external onlyOwner { (bool success, ) = owner().call{value: address(this).balance}(""); require(success, "Withdraw failed"); } /// @notice Do our best to get mistakenly sent ERC20s out of the contract. function withdrawTokens(address token) external onlyOwner { uint256 balance = IERC20(token).balanceOf(address(this)); IERC20(token).transfer(msg.sender, balance); } /// RANDOMNESS /// /// @notice Create a bit more randomness by hashing a seed with another input value. /// @dev We do this to "re-hash" pseudorandom values within the same tx. /// @dev h/t 0xBasset. function _randomize(uint256 rand, uint256 zest) internal pure returns (uint256) { return uint256(keccak256(abi.encode(rand, zest))); } /// @notice Generates a pseudorandom number based on the current block and caller. /// @dev This will be the same if called in the same tx without changing entropy. function _rand() internal view returns (uint256) { return uint256(keccak256(abi.encodePacked(msg.sender, block.timestamp, block.basefee, block.coinbase, entropy))); } /// OVERRIDES /// function supportsInterface(bytes4 interfaceId) public pure virtual override(ERC721, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); if (!isRevealed) { return IMetadata(renderer).getPlaceholderURI(tokenId); } Kitten storage kitten = kittens[_getOffsetTokenId(tokenId)]; return IMetadata(renderer).getTokenURI(tokenId, kitten, specialMode[tokenId]); } /// @notice Royalty metadata. /// @dev See {IERC165-royaltyInfo}. function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override returns (address receiver, uint256 royaltyAmount) { require(_exists(tokenId), "Nonexistent token"); return (address(this), (salePrice * royaltyPercent) / 100); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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 payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) /// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC. 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 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => uint256) public balanceOf; mapping(uint256 => address) public ownerOf; 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 || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender], "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 memory data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*/////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*/////////////////////////////////////////////////////////////// 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(ownerOf[id] != 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/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol) interface ERC721TokenReceiver { function onERC721Received( address operator, address from, uint256 id, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.13; interface IKitten { enum Trait { Background, Body, Clothes, Ears, Eyes, Head, Neck, Special, Weapon } struct Kitten { uint8 background; uint8 body; uint8 clothes; uint8 ears; uint8 eyes; uint8 head; uint8 neck; uint8 special; uint8 weapon; } /// ERC721-like function getOwner(uint256 tokenId) external view returns (address); function getNextTokenId() external view returns (uint256); /// WarKittens function mint(uint256 amount, address to) external payable; function mintCommunitySale(address to, bytes32[] calldata merkleProof) external payable; function reserveForGifting(uint256 amount) external; function giftKittens(address[] calldata addresses) external; function getKitten(uint256 tokenId) external view returns (Kitten memory); function getTrait(uint256 tokenId, Trait trait) external view returns (uint8); function updateTrait(uint256 tokenId, Trait trait, uint8 value) external; }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.13; import "./IKitten.sol"; interface IMetadata { function getPlaceholderURI(uint256 tokenId) external view returns (string memory); function getTokenURI(uint256 tokenId, IKitten.Kitten calldata kitten, bool offChain) external view returns (string memory); function uploadTraits( uint8 trait, uint8[] calldata traitIds, string[] calldata names, string[] calldata images ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"COMMUNITY_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GIFTED_KITTENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KITTENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_KITTENS_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedFirst","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedSecond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityFirstClaimMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communitySecondClaimMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deSauce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getKitten","outputs":[{"components":[{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"clothes","type":"uint8"},{"internalType":"uint8","name":"ears","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"neck","type":"uint8"},{"internalType":"uint8","name":"special","type":"uint8"},{"internalType":"uint8","name":"weapon","type":"uint8"}],"internalType":"struct IKitten.Kitten","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum IKitten.Trait","name":"trait","type":"uint8"}],"name":"getTrait","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"giftKittens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"hasShifted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCommunitySaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"kittens","outputs":[{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"clothes","type":"uint8"},{"internalType":"uint8","name":"ears","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"head","type":"uint8"},{"internalType":"uint8","name":"neck","type":"uint8"},{"internalType":"uint8","name":"special","type":"uint8"},{"internalType":"uint8","name":"weapon","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintCommunitySale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numGiftedKittens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicSaleParticipants","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renderer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserveForGifting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetMetadataOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"address","name":"admin","type":"address"},{"internalType":"bool","name":"isAdmin","type":"bool"}],"name":"setAdmin","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":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setFirstCommunityListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isCommunitySaleActive","type":"bool"}],"name":"setIsCommunitySaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPublicSaleActive","type":"bool"}],"name":"setIsPublicSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"special","type":"bool"}],"name":"setKittenMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"setMetadataOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_renderer","type":"address"}],"name":"setRenderer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"percent","type":"uint8"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setSecondCommunityListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"specialMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitAliases","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitRarities","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum IKitten.Trait","name":"trait","type":"uint8"},{"internalType":"uint8","name":"value","type":"uint8"}],"name":"updateTrait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600d805461ffff191660051790556000600e55600f805460ff191690556101006040526512309ce540006080908152653691d6afc00060a0526509184e72a00060c052653faa2522600060e0526200005c90602490600462001b10565b503480156200006a57600080fd5b5060408051808201825260098152682bb0b925b4ba3a32b760b91b60208083019182528351808501909452600684526525a4aa2a22a760d11b908401528151919291620000ba9160009162001b5d565b508051620000d090600190602084019062001b5d565b505050620000ed620000e762001aba60201b60201c565b62001abe565b604080516102e08101825260e880825260c96020830152604d92820183905260466060830152602f6080830152608860a083015260ae60c0830152605d60e0830152606e6101008301526101208201526101408101919091526073610160820152607661018082015260756101a082015260c66101c082015260796101e08201526038610200820152603d610220820152603e610240820152606a610260820181905261028082015260ff6102a082015260346102c0820152620001b690601290601762001bda565b50604080516102e08101825260018082526005602083018190526000938301849052606083018290526080830191909152600660a0830152600860c0830181905260e083019190915260096101008301819052600a6101208401819052600b610140850152600c6101608501819052600e6101808601526101a08501849052600f6101c0860181905260156101e087015261020086019490945261022085019290925261024084015261026083018190526102808301526102a082018390526102c082015290601b906200028f92910190601762001bda565b50604080516108a08101825260a7815260c06020820181905260d7928201929092526062606082015260dd60808083019190915260fc60a083015260a592820183905260cf60e0830181905260d26101008401526085610120840181905260b861014085015260b6610160850152606d610180850181905260db6101a0860152608f6101c0860181905260ca6101e0870152603d61020087015260f9610220870152610240860184905260c461026087015260b9610280870181905260d66102a08801526102c0870182905260786102e088018190526087610300890152604c610320890152610340880184905260e961036089015260a861038089015260f76103a0890152608d6103c089015260b06103e089015260386104008901526104208801839052610440880193909352608261046088015260cc61048088015260946104a088015260aa6104c088015260f06104e088015260e86105008801526105208701889052610540870188905261056087019190915260fa61058087015260f46105a087015260c96105c087015260f56105e087015260486106008701526083610620870152608b61064087015260c861066087015261068086018290526106a08601939093526106c085019190915260ad6106e0850152603f6107008501526046610720850152605361074085015261076084019190915260df61078084015260fd6107a08401526107c08301819052607e6107e084015261080083019390935260c161082083015261084082019290925260ff610860820152610880810191909152620004e590601390604562001bda565b50604080516108a08101825260018082526002602083018190526004938301849052606083019190915260086080830181905260a0830182905260c0830182905260e0830182905260096101008401819052600a610120850152600f610140850181905261016085019390935261018084018590526101a084018590526101c084019490945260116101e0840181905261020084019190915260156102208401819052610240840185905261026084018590526102808401859052601b6102a08501526102c084018590526102e08401949094526103008301919091526103208201526103408101829052601c6103608201819052601d6103808301819052601e6103a0840181905260266103c085018190526103e08501959095526104008401839052610420840182905261044084019190915261046083015261048082018390526104a0820183905260276104c08301819052602d6104e08401819052610500840185905261052084019490945261054083015261056082018390526105808201839052602e6105a08301819052602f6105c0840181905260306105e0850181905260336106008601526106208501959095526106408401919091526036610660840181905261068084018290526106a084019190915260376106c0840152603c6106e0840152610700830193909352610720820192909252603d61074082018190526107608201819052610780820152603f6107a082018190526107c082015260416107e082018190526108008201819052604361082083018190526108408301919091526000610860830152610880820152620007499190604562001bda565b50604080516109008101825260c9815260fb602082015260be91810191909152607a6060820152608f6080820152606160a08201819052602e60c083015260e08083015260e961010083018190526083610120840181905260cb610140850181905260fd610160860181905260c261018087015260996101a087018190526101c087018190526101e087018190526038610200880152607e610220880152605161024088018190526042610260890152606a6102808901526102a08801879052603e6102c0890181905260326102e08a018190526103008a0181905260486103208b018190526103408b018290526103608b01919091526103808a0183905260b36103a08b01526103c08a018490526103e08a018190526104008a019490945260b86104208a0181905260e46104408b015260706104608b0181905260826104808c0152606c6104a08c018190526104c08c018490526104e08c01939093526105008b018890526105208b018590526105408b019290925260976105608b015260ea6105808b0152605b6105a08b018190526105c08b01879052606f6105e08c01526106008b019890985260666106208b015260366106408b01526106608a019490945260556106808a0152603a6106a08a01526106c089018490526106e08901839052610700890152610720880152610740870193909352610760860193909352601f61078086015260d76107a086015260756107c08601526107e0850152610800840181905260d461082085015261084084019290925261086083019190915261088082015260da6108a082015260726108c082015260ff6108e082015260126002620009bd92910190604862001bda565b506040805161090081018252600181526002602082018190526008928201839052600060608301819052608083019190915260a0820192909252600c60c0820181905260e082018190526101008201819052610120820152601d6101408201819052610160820181905261018082018190526101a0820181905260226101c083018190526101e0830181905260246102008401819052602b6102208501819052602f6102408601819052603d6102608701819052603e610280880181905260416102a0890181905260456102c08a018190526102e08a0181905260466103008b018190526103208b018190526103408b0181905260476103608c018190526103808c018190526103a08c01999099526103c08b018990526103e08b018990526104008b018990526104208b018990526104408b01979097526104608a018890526104808a01959095526104a089018790526104c089018790526104e08901879052610500890187905261052089018790526105408901879052602c6105608a01526105808901939093526105a088018690526105c0880186905260306105e089015261060088019190915261062087018590526106408701859052610660870185905261068087018590526106a087018590526106c087018590526106e08701859052610700870185905261072087018590526107408701859052610760870185905261078087018590526107a08701526107c08601526107e0850183905261080085018390526108208501526108408401829052610860840182905261088084018290526108a08401526108c08301526108e082019290925262000c259190604862001bda565b50604080516101a08101825260178152601a60208201526034918101919091526023606082015260986080820152609e60a082015260c860c0820152606b60e0820152609d610100820152601e610120820152605761014082015260bd61016082015260ff61018082015262000ca090601590600d62001bda565b50604080516101a08101825260048152600760208201819052918101829052600b6060820181905260056080830152600660a083015260c0820192909252600860e08201526101008101829052610120810191909152600c6101408201819052610160820152600061018082015262000d1e90601e90600d62001bda565b50604080516103a08101825260338082526046602083015260bb9282019290925260976060820152607e608082015260a360a08201819052603c60c083015260e0820192909252601b6101008201819052601e610120830152606161014083015260ed610160830152604561018083015260f96101a083015260136101c083015260226101e0830152610200820192909252605a6102208201819052609061024083015260756102608301526069610280830152607d6102a083015260a96102c083015260886102e0830152610300820192909252610320810191909152606d610340820152602f61036082015260ff61038082015262000e2490601690601d62001bda565b50604080516103a08101825260048152601c602082018190529181018290526060810182905260056080820152601660a082015260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101829052610300810182905261032081018290526103408101829052610360810191909152600061038082015262000f1f90601f90601d62001bda565b5060408051610a60810182526091808252607f602080840191909152602f93830193909352600d6060830152601b608083015260dd60a0830181905260e460c0840152609360e0840181905260f16101008501526072610120850152604161014085015260c76101608501526031610180850152601d6101a085015260d76101c085015260336101e0850152606261020085015260ff610220850181905260bd610240860181905260356102608701526038610280870152603a6102a08701526102c0860196909652602a6102e08601526043610300860181905260d16103208701526059610340870181905260d4610360880152603c610380880152602d6103a0880152601f6103c088015260216103e08801526010610400880152601461042088015260286104408801819052603e61046089015260a86104808901526104a088019890985260836104c088015260246104e0880152606961050088015260d86105208801819052604a610540890181905260576105608a0152609b6105808a015260fc6105a08a015260476105c08a018190526105e08a015260766106008a015260c16106208a0152610640890182905261066089019390935260c461068089015260cb6106a0890152604e6106c089015260f26106e0890181905260166107008a0152610720890197909752602e6107408901526107608801919091526064610780880152607b6107a08801526107c087018590526107e087019390935260a761080087015260196108208701526026610840870152607d610860870152608a61088087015260d66108a0870152608f6108c087015260be6108e087015260e861090087015261092086015260af6109408601526109608501959095526109808401526109a083015260da6109c083015260826109e0830152610a0082015260bf610a20820152610a40810191909152620011e390601790605362001bda565b5060408051610a608101825260068152600b6020808301829052601093830184905260166060840181905260256080850181905260a08501819052600860c086015260e0850181905261010085019390935260296101208501819052602b6101408601819052600e61016087015260306101808701819052603a6101a088018190526101c0880198909852603e6101e0880181905260116102008901526102208801949094526047610240880181905260496102608901819052604f6102808a0181905260516102a08b01819052601a6102c08c015260526102e08c018190526103008c018190526103208c0181905260246103408d01526103608c018190526103808c018190526103a08c018190526103c08c018190526103e08c018190526104008c018190526104208c018190526104408c018190526104608c018190526104808c019a909a526104a08b01969096526104c08a018990526104e08a018990526105008a018990526105208a01949094526105408901889052602c6105608a0152602d6105808a01526105a08901929092526105c088018790526105e08801879052603161060089015260326106208901526037610640890152610660880187905261068088018790526106a088018790526106c088018790526106e088019890985261070087018690526107208701869052603d610740880152610760870186905261078087018690526107a08701939093526107c08601969096526107e08501849052610800850184905261082085018490526108408501849052610860850184905261088085018490526108a085018490526108c0850184905260486108e0860152610900850191909152604a610920850152604d610940850152610960840183905261098084018390526109a08401949094526109c0830182905260506109e0840152610a00830193909352610a208201526000610a40820152620014b19190605362001bda565b5060408051610140810182526043808252604660208301526017928201929092526056606082015260336080820152603860a0820152607960c082015260e0810191909152603c61010082015260ff6101208201526200151690601890600a62001bda565b506040805161014081018252600980825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915260006101208201526200157890602190600a62001bda565b50604080516108a08101825260c1815260856020820152606f9181019190915260e66060808301829052606a608080850191909152605960a08501819052603b60c080870191909152607e60e0870152605e610100870181905260c561012088015261014087015260ec61016087015260ef610180870181905260736101a088015260c66101c088015260556101e08801819052601861020089015260cc610220890152601c6102408901526096610260890152604e610280890181905260506102a08a015260d96102c08a015260de6102e08a0152605a6103008a01526103208901959095526078610340890181905260306103608a015260826103808a0181905260bc6103a08b0152607a6103c08b01526103e08a0194909452603d6104008a0152603f6104208a015260436104408a015260456104608a015260466104808a015260576104a08a0181905260216104c08b015260616104e08b01526105008a019190915260e86105208a0152607c6105408a0152610560890194909452606361058089015260da6105a089015260296105c089015260f46105e0890152605d610600890152610620880196909652606b61064088015261066087015261068086019390935260516106a0860152606d6106c08601526106e0850193909352604a6107008501526019610720850152606261074085015261076084019290925260fe6107808401526107a083015260666107c083015260a56107e0830152603861080083015261082082015260fa610840820152607761086082015260ff61088082015260126007620017d292910190604562001bda565b50604080516108a0810182526001808252600360208301526000928201839052600860608301819052608083019190915260a0820152601860c08201819052601c60e083018190526009610100840152600b61012084015260276101408401819052600c610160850152610180840192909252602c6101a084018190526101c084018190526101e084018190526039610200850181905260416102208601819052610240860181905260436102608701819052610280870181905260446102a088018190526102c088018190526102e08801819052610300880195909552610320870185905261034087018590526103608701859052601d610380880152601f6103a08801526103c087018590526103e0870195909552610400860184905261042086018490526104408601849052610460860184905261048086018490526104a086018490526104c0860184905260286104e0870152602961050087015261052086019290925261054085018390526105608501839052602d610580860152602f6105a08601526105c085018390526105e0850152610600840182905261062084018290526106408401829052610660840182905261068084018290526106a084018290526106c084018290526106e084018290526107008401829052603f6107208501526107408401829052610760840182905261078084018290526107a084018290526107c084018290526107e08401526108008301819052604261082084015261084083019190915261086082015261088081019190915262001a1e90602290604562001bda565b506040805160e081018252600c8152600a6020820152600891810191909152600e606082015260136080820152601160a082015260ff60c082015262001a6990601a90600762001bda565b506040805160e081018252600680825260208201819052918101829052606081018290526080810182905260a0810191909152600060c082015262001ab390602390600762001bda565b5062001cd2565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b826004810192821562001b4b579160200282015b8281111562001b4b578251829065ffffffffffff1690559160200191906001019062001b24565b5062001b5992915062001c7f565b5090565b82805462001b6b9062001c96565b90600052602060002090601f01602090048101928262001b8f576000855562001b4b565b82601f1062001baa57805160ff191683800117855562001b4b565b8280016001018555821562001b4b579182015b8281111562001b4b57825182559160200191906001019062001bbd565b82805482825590600052602060002090600f0160109004810192821562001b4b5791602002820160005b8382111562001c4557835183826101000a81548161ffff021916908360ff160217905550926020019260020160208160010104928301926001030262001c04565b801562001c755782816101000a81549061ffff021916905560020160208160010104928301926001030262001c45565b505062001b599291505b5b8082111562001b59576000815560010162001c80565b600181811c9082168062001cab57607f821691505b60208210810362001ccc57634e487b7160e01b600052602260045260246000fd5b50919050565b6145068062001ce26000396000f3fe6080604052600436106103b85760003560e01c8063715018a6116101f2578063bec951071161010d578063e7b9e4af116100a0578063ebe356311161006f578063ebe3563114610b8d578063f2fde38b14610bbd578063f3e64a0214610bdd578063f418ad8e14610cbf57600080fd5b8063e7b9e4af14610ae9578063e985e9c514610b09578063eb4883ab14610b44578063eb4ab9e814610b7757600080fd5b8063caa0f92a116100dc578063caa0f92a14610a79578063d082e38114610a8e578063d32aa21c14610aa4578063e6d740e214610ab957600080fd5b8063bec95107146109f1578063c41a360a14610a0d578063c87b56dd14610a43578063c8e74c6914610a6357600080fd5b806395d89b4111610185578063b88d4fde11610154578063b88d4fde14610985578063b9a7d664146109a5578063bc3fb48c146109bb578063bda66ea3146109d157600080fd5b806395d89b41146109045780639a6dee7f146109195780639f67756d14610939578063a22cb4651461096557600080fd5b80638ada6b0f116101c15780638ada6b0f1461089d5780638da5cb5b146108bd578063936bb7cd146108db57806394bf804d146108f157600080fd5b8063715018a61461082857806378f3c5401461083d57806379a617e81461086a57806386ee73311461087d57600080fd5b806337a2dbe1116102e25780634d4018fa1161027557806356d3163d1161024457806356d3163d146107855780636352211e146107a55780636c3a9b4a146107db57806370a08231146107fb57600080fd5b80634d4018fa146107165780634e86ef0c1461072b5780634fe209f91461074b57806354214f691461076b57600080fd5b806345d1e4b1116102b157806345d1e4b11461069657806349df728c146106b65780634b0bddd2146106d65780634b655731146106f657600080fd5b806337a2dbe11461061c5780633bd649681461064c5780633ccfd60b1461066157806342842e0e1461067657600080fd5b80630fdabb5a1161035a578063235329cc11610329578063235329cc1461056a57806323b872dd1461059d57806328cad13d146105bd5780632a55205a146105dd57600080fd5b80630fdabb5a146104ee57806310bf3bed146105045780631e84c4131461051957806320601b141461054b57600080fd5b8063081812fc11610396578063081812fc1461043e578063095ea7b31461048c5780630d3cf1f2146104ae5780630e15b76a146104ce57600080fd5b806301ffc9a7146103bd57806306fdde03146103f257806307e89ec014610414575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613c12565b610cef565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610d33565b6040516103e99190613c87565b34801561042057600080fd5b50610430670138a388a43c000081565b6040519081526020016103e9565b34801561044a57600080fd5b50610474610459366004613c9a565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103e9565b34801561049857600080fd5b506104ac6104a7366004613ccf565b610dc1565b005b3480156104ba57600080fd5b506104ac6104c9366004613d07565b610ec4565b3480156104da57600080fd5b506104ac6104e9366004613d69565b610f69565b3480156104fa57600080fd5b50610430600e5481565b34801561051057600080fd5b50610430600481565b34801561052557600080fd5b506006546103dd9074010000000000000000000000000000000000000000900460ff1681565b34801561055757600080fd5b50600d546103dd90610100900460ff1681565b34801561057657600080fd5b5061058a610585366004613dab565b6111da565b60405161ffff90911681526020016103e9565b3480156105a957600080fd5b506104ac6105b8366004613dcd565b611224565b3480156105c957600080fd5b506104ac6105d8366004613d07565b611426565b3480156105e957600080fd5b506105fd6105f8366004613dab565b6114ca565b604080516001600160a01b0390931683526020830191909152016103e9565b34801561062857600080fd5b506103dd610637366004613e09565b600a6020526000908152604090205460ff1681565b34801561065857600080fd5b506104ac61154d565b34801561066d57600080fd5b506104ac6115b6565b34801561068257600080fd5b506104ac610691366004613dcd565b6116c7565b3480156106a257600080fd5b506104ac6106b1366004613c9a565b6117cc565b3480156106c257600080fd5b506104ac6106d1366004613e09565b611849565b3480156106e257600080fd5b506104ac6106f1366004613e24565b6119b4565b34801561070257600080fd5b506104ac610711366004613e7b565b611a39565b34801561072257600080fd5b506104ac611d41565b34801561073757600080fd5b506104ac610746366004613c9a565b611da2565b34801561075757600080fd5b5061058a610766366004613dab565b611e01565b34801561077757600080fd5b50600f546103dd9060ff1681565b34801561079157600080fd5b506104ac6107a0366004613e09565b611e11565b3480156107b157600080fd5b506104746107c0366004613c9a565b6003602052600090815260409020546001600160a01b031681565b3480156107e757600080fd5b506104ac6107f6366004613c9a565b611e9f565b34801561080757600080fd5b50610430610816366004613e09565b60026020526000908152604090205481565b34801561083457600080fd5b506104ac6120e1565b34801561084957600080fd5b5061085d610858366004613c9a565b612147565b6040516103e99190613eb7565b6104ac610878366004613f64565b6122a1565b34801561088957600080fd5b506104ac610898366004613fb7565b6126f2565b3480156108a957600080fd5b50602954610474906001600160a01b031681565b3480156108c957600080fd5b506006546001600160a01b0316610474565b3480156108e757600080fd5b5061043061251c81565b6104ac6108ff366004613fdc565b612778565b34801561091057600080fd5b50610407612b2f565b34801561092557600080fd5b506104ac610934366004614008565b612b3c565b34801561094557600080fd5b50600d546109539060ff1681565b60405160ff90911681526020016103e9565b34801561097157600080fd5b506104ac610980366004613e24565b612bac565b34801561099157600080fd5b506104ac6109a0366004614092565b612c18565b3480156109b157600080fd5b5061043060095481565b3480156109c757600080fd5b5061043060075481565b3480156109dd57600080fd5b506109536109ec36600461413d565b612d04565b3480156109fd57600080fd5b506104306701118f178fb4800081565b348015610a1957600080fd5b50610474610a28366004613c9a565b6000908152600360205260409020546001600160a01b031690565b348015610a4f57600080fd5b50610407610a5e366004613c9a565b612eec565b348015610a6f57600080fd5b50610430600c5481565b348015610a8557600080fd5b506104306130a7565b348015610a9a57600080fd5b50610430602b5481565b348015610ab057600080fd5b506104ac6130bd565b348015610ac557600080fd5b506103dd610ad4366004613c9a565b60116020526000908152604090205460ff1681565b348015610af557600080fd5b506104ac610b04366004613c9a565b613149565b348015610b1557600080fd5b506103dd610b24366004614160565b600560209081526000928352604080842090915290825290205460ff1681565b348015610b5057600080fd5b506006546103dd907501000000000000000000000000000000000000000000900460ff1681565b348015610b8357600080fd5b5061043061019081565b348015610b9957600080fd5b506103dd610ba8366004613e09565b60086020526000908152604090205460ff1681565b348015610bc957600080fd5b506104ac610bd8366004613e09565b6131a8565b348015610be957600080fd5b50610c6b610bf8366004613c9a565b60106020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691680100000000000000009091041689565b6040805160ff9a8b168152988a1660208a01529689169688019690965293871660608701529186166080860152851660a0850152841660c0840152831660e0830152909116610100820152610120016103e9565b348015610ccb57600080fd5b506103dd610cda366004613e09565b600b6020526000908152604090205460ff1681565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610d2d5750610d2d82613287565b92915050565b60008054610d409061418a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6c9061418a565b8015610db95780601f10610d8e57610100808354040283529160200191610db9565b820191906000526020600020905b815481529060010190602001808311610d9c57829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610e0a57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610e5b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b03163314610f1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600680549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b3360009081526028602052604090205460ff16610fc85760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b600c54819061019090610fdc9083906141da565b111561104f5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f2060448201527f67696674000000000000000000000000000000000000000000000000000000006064820152608401610e52565b61251c81602b5461106091906141da565b11156110ba5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b600c8054839182916000906110d09084906141da565b909155506000905061113d602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b8281101561118c5761117a82878784818110611160576111606141f2565b90506020020160208101906111759190613e09565b613320565b8061118481614208565b915050611142565b50506040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152604801905060408051601f198184030181529190528051602090910120602a55505050565b601282600981106111ea57600080fd5b0181815481106111f957600080fd5b9060005260206000209060109182820401919006600202915091509054906101000a900461ffff1681565b6000818152600360205260409020546001600160a01b0384811691161461128d5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610e52565b6001600160a01b0382166112e35760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610e52565b336001600160a01b038416148061131057506000818152600460205260409020546001600160a01b031633145b8061133e57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b61138a5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610e52565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b031633146114805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000806114d6846134e2565b6115225760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006044820152606401610e52565b600d5430906064906115379060ff1686614222565b6115419190614257565b915091505b9250929050565b6006546001600160a01b031633146115a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600f805460ff19166001179055565b6006546001600160a01b031633146116105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b60006116246006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461166e576040519150601f19603f3d011682016040523d82523d6000602084013e611673565b606091505b50509050806116c45760405162461bcd60e51b815260206004820152600f60248201527f5769746864726177206661696c656400000000000000000000000000000000006044820152606401610e52565b50565b6116d2838383611224565b6001600160a01b0382163b158061177b5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af115801561174b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176f919061426b565b6001600160e01b031916145b6117c75760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b505050565b6006546001600160a01b031633146118265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600d54610100900460ff166116c457600e55600d805461ff001916610100179055565b6006546001600160a01b031633146118a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190614288565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c791906142a1565b6006546001600160a01b03163314611a0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b3360009081526028602052604090205460ff16611a985760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b611aa1836134e2565b611aed5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b600060106000611afc8661350c565b8152602081019190915260400160009081209150836008811115611b2257611b226142be565b03611b3957805460ff191660ff8316178155611d3b565b6001836008811115611b4d57611b4d6142be565b03611b6957805461ff00191661010060ff841602178155611d3b565b6002836008811115611b7d57611b7d6142be565b03611bb75780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000060ff841602178155611d3b565b6003836008811115611bcb57611bcb6142be565b03611beb57805463ff0000001916630100000060ff841602178155611d3b565b6004836008811115611bff57611bff6142be565b03611c3b5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000060ff841602178155611d3b565b6005836008811115611c4f57611c4f6142be565b03611c7357805465ff000000000019166501000000000060ff841602178155611d3b565b6006836008811115611c8757611c876142be565b03611cc55780547fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff16660100000000000060ff841602178155611d3b565b6007836008811115611cd957611cd96142be565b03611d0157805467ff00000000000000191667010000000000000060ff841602178155611d3b565b6008836008811115611d1557611d156142be565b03611d3b57805468ff000000000000000019166801000000000000000060ff8416021781555b50505050565b6006546001600160a01b03163314611d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6000600e55565b6006546001600160a01b03163314611dfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600755565b601b82600981106111ea57600080fd5b3360009081526028602052604090205460ff16611e705760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b6029805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3360009081526028602052604090205460ff16611efe5760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b8061019081600c54611f1091906141da565b1115611f835760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f2060448201527f67696674000000000000000000000000000000000000000000000000000000006064820152608401610e52565b61251c81602b54611f9491906141da565b1115611fee5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b81600c600082825461200091906141da565b909155506000905061206d602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b83811015612096576120848233613320565b8061208e81614208565b915050612072565b50506040516bffffffffffffffffffffffff1933606090811b8216602084015241901b16603482015260480160408051601f198184030181529190528051602090910120602a555050565b6006546001600160a01b0316331461213b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6121456000613555565b565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152612199826134e2565b6121e55760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b601060006121f28461350c565b81526020808201929092526040908101600020815161012081018352905460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152650100000000008104831660a083015266010000000000008104831660c08301526701000000000000008104831660e08301526801000000000000000090049091169181019190915292915050565b6006547501000000000000000000000000000000000000000000900460ff1661230c5760405162461bcd60e51b815260206004820152601a60248201527f436f6d6d756e6974792073616c65206973206e6f74206f70656e0000000000006044820152606401610e52565b600161251c81602b5461231f91906141da565b11156123795760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b6701118f178fb4800034146123d05760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374204554482076616c75652073656e7400000000000000006044820152606401610e52565b33600081815260286020526040902054813b919060ff16806123fa575033321480156123fa575081155b6124465760405162461bcd60e51b815260206004820152601760248201527f596f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610e52565b6001600160a01b03861660009081526008602052604090205460ff16156125c0576001600160a01b0386166000908152600a602052604090205460ff16156124d05760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610e52565b6124de8585600954896135b4565b61252a5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610e52565b6001600160a01b0386166000908152600a60205260409020805460ff191660011790556125bb6125b5602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b87613320565b6126a5565b6125ce8585600754896135b4565b61261a5760405162461bcd60e51b815260206004820152601360248201527f41646472657373206e6f7420696e206c697374000000000000000000000000006044820152606401610e52565b6001600160a01b0386166000908152600860205260409020805460ff191660011790556126a56125b5602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048015b60408051601f198184030181529190528051602090910120602a55505050505050565b6000828152600360205260409020546001600160a01b031633146127585760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420796f7572206b697474656e00000000000000000000000000000000006044820152606401610e52565b600091825260116020526040909120805460ff1916911515919091179055565b60065474010000000000000000000000000000000000000000900460ff166127e25760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610e52565b81600081116128335760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f74206d696e74207a65726f000000000000000000000000000000006044820152606401610e52565b60048111156128845760405162461bcd60e51b815260206004820152601c60248201527f4d6178206b697474656e7320746f206d696e74206578636565646564000000006044820152606401610e52565b61251c81602b5461289591906141da565b11156128ef5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b8260246128fd6001836142d4565b6004811061290d5761290d6141f2565b015461292182670138a388a43c0000614222565b61292b91906141da565b34146129795760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374204554482076616c75652073656e7400000000000000006044820152606401610e52565b33600081815260286020526040902054813b919060ff16806129a3575033321480156129a3575081155b6129ef5760405162461bcd60e51b815260206004820152601760248201527f596f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610e52565b336000908152600b602052604090205460ff1615612a4f5760405162461bcd60e51b815260206004820152600e60248201527f416c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610e52565b336000908152600b60205260408120805460ff19166001179055612ace602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b878167ffffffffffffffff161015612aff57612aef8288613320565b612af8816142eb565b9050612ad3565b50506040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048016126cf565b60018054610d409061418a565b6006546001600160a01b03163314612b965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600d805460ff191660ff92909216919091179055565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612c23848484611224565b6001600160a01b0383163b1580612cb85750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290612c69903390899088908890600401614312565b6020604051808303816000875af1158015612c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cac919061426b565b6001600160e01b031916145b611d3b5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b6000612d0f836134e2565b612d5b5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b600060106000612d6a8661350c565b8152602081019190915260400160009081209150836008811115612d9057612d906142be565b03612da0575460ff169050610d2d565b6001836008811115612db457612db46142be565b03612dc95754610100900460ff169050610d2d565b6002836008811115612ddd57612ddd6142be565b03612df3575462010000900460ff169050610d2d565b6003836008811115612e0757612e076142be565b03612e1e57546301000000900460ff169050610d2d565b6004836008811115612e3257612e326142be565b03612e4a5754640100000000900460ff169050610d2d565b6005836008811115612e5e57612e5e6142be565b03612e77575465010000000000900460ff169050610d2d565b6006836008811115612e8b57612e8b6142be565b03612ea557546601000000000000900460ff169050610d2d565b6007836008811115612eb957612eb96142be565b03612ed45754670100000000000000900460ff169050610d2d565b5468010000000000000000900460ff16905092915050565b6060612ef7826134e2565b612f435760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006044820152606401610e52565b600f5460ff16612fd7576029546040517f3278a957000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690633278a95790602401600060405180830381865afa158015612faf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2d919081019061434e565b600060106000612fe68561350c565b8152602080820192909252604090810160009081206029548783526011909452908290205491517fca9da47a0000000000000000000000000000000000000000000000000000000081529093506001600160a01b039092169163ca9da47a9161305b918791869160ff909116906004016143c5565b600060405180830381865afa158015613078573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130a0919081019061434e565b9392505050565b6000602b5460016130b891906141da565b905090565b6006546001600160a01b031633146131175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6040805160808101825260008082526020820181905291810182905260608101919091526116c4906024906004613ba4565b6006546001600160a01b031633146131a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600955565b6006546001600160a01b031633146132025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6001600160a01b03811661327e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e52565b6116c481613555565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806132ea57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d2d5750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b600061332a613634565b6040805160208082018790528183018490528251808303840181526060909201909252805191012090915061335e90613650565b6000828152601060209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160e08a01516101009a8b015160ff9788167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909a1699909917998716909a02989098177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff16620100009486169490940263ff000000191693909317630100000092851692909202919091177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff166401000000009184169190910265ff00000000001916176501000000000091831691909102177fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff1666010000000000009482169490940267ff00000000000000191693909317670100000000000000948416949094029390931768ff000000000000000019166801000000000000000092909116919091021790556117c78282613806565b6000818152600360205260408120546001600160a01b031615801590610d2d57505061251c101590565b600d54600090610100900460ff1615806135265750600e54155b1561352f575090565b61251c600e548361354091906141da565b61354a9190614475565b610d2d9060016141da565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613629858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff19606088901b166020820152879250603401905060405160208183030381529060405280519060200120613906565b90505b949350505050565b6000602b6000815461364590614208565b9091555050602b5490565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091526136a88261ffff16600061391c565b6136b3906001614489565b60ff16815260109190911c906136ce61ffff8316600161391c565b6136d9906001614489565b60ff16602082015260109190911c906136f761ffff8316600261391c565b613702906001614489565b60ff16604082015260109190911c9061372061ffff8316600361391c565b61372b906001614489565b60ff16606082015260109190911c9061374961ffff8316600461391c565b613754906001614489565b60ff16608082015260109190911c9061377261ffff8316600561391c565b61377d906001614489565b60ff1660a082015260109190911c9061379b61ffff8316600661391c565b6137a6906001614489565b60ff1660c082015260109190911c906137c461ffff8316600761391c565b6137cf906001614489565b60ff1661010082015260109190911c906137ee61ffff8316600861391c565b6137f9906001614489565b60ff1660e0820152919050565b61381082826139fd565b6001600160a01b0382163b15806138b65750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015613886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138aa919061426b565b6001600160e01b031916145b6139025760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b5050565b6000826139138584613b30565b14949350505050565b60008060128360ff1660098110613935576139356141f2565b015461394190856144ae565b905060128360ff1660098110613959576139596141f2565b018160ff168154811061396e5761396e6141f2565b60009182526020909120601082040154600f9091166002026101000a900461ffff16600885901c60ff1610156139a5579050610d2d565b601b8360ff16600981106139bb576139bb6141f2565b018160ff16815481106139d0576139d06141f2565b90600052602060002090601091828204019190066002029054906101000a900461ffff1691505092915050565b6001600160a01b038216613a535760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610e52565b6000818152600360205260409020546001600160a01b031615613ab85760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610e52565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015613b9c576000858281518110613b5257613b526141f2565b60200260200101519050808311613b785760008381526020829052604090209250613b89565b600081815260208490526040902092505b5080613b9481614208565b915050613b35565b509392505050565b8260048101928215613bd7579160200282015b82811115613bd7578251829060ff16905591602001919060010190613bb7565b50613be3929150613be7565b5090565b5b80821115613be35760008155600101613be8565b6001600160e01b0319811681146116c457600080fd5b600060208284031215613c2457600080fd5b81356130a081613bfc565b60005b83811015613c4a578181015183820152602001613c32565b83811115611d3b5750506000910152565b60008151808452613c73816020860160208601613c2f565b601f01601f19169290920160200192915050565b6020815260006130a06020830184613c5b565b600060208284031215613cac57600080fd5b5035919050565b80356001600160a01b0381168114613cca57600080fd5b919050565b60008060408385031215613ce257600080fd5b613ceb83613cb3565b946020939093013593505050565b80151581146116c457600080fd5b600060208284031215613d1957600080fd5b81356130a081613cf9565b60008083601f840112613d3657600080fd5b50813567ffffffffffffffff811115613d4e57600080fd5b6020830191508360208260051b850101111561154657600080fd5b60008060208385031215613d7c57600080fd5b823567ffffffffffffffff811115613d9357600080fd5b613d9f85828601613d24565b90969095509350505050565b60008060408385031215613dbe57600080fd5b50508035926020909101359150565b600080600060608486031215613de257600080fd5b613deb84613cb3565b9250613df960208501613cb3565b9150604084013590509250925092565b600060208284031215613e1b57600080fd5b6130a082613cb3565b60008060408385031215613e3757600080fd5b613e4083613cb3565b91506020830135613e5081613cf9565b809150509250929050565b803560098110613cca57600080fd5b803560ff81168114613cca57600080fd5b600080600060608486031215613e9057600080fd5b83359250613ea060208501613e5b565b9150613eae60408501613e6a565b90509250925092565b60006101208201905060ff835116825260ff60208401511660208301526040830151613ee8604084018260ff169052565b506060830151613efd606084018260ff169052565b506080830151613f12608084018260ff169052565b5060a0830151613f2760a084018260ff169052565b5060c0830151613f3c60c084018260ff169052565b5060e0830151613f5160e084018260ff169052565b506101009283015160ff16919092015290565b600080600060408486031215613f7957600080fd5b613f8284613cb3565b9250602084013567ffffffffffffffff811115613f9e57600080fd5b613faa86828701613d24565b9497909650939450505050565b60008060408385031215613fca57600080fd5b823591506020830135613e5081613cf9565b60008060408385031215613fef57600080fd5b82359150613fff60208401613cb3565b90509250929050565b60006020828403121561401a57600080fd5b6130a082613e6a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561406257614062614023565b604052919050565b600067ffffffffffffffff82111561408457614084614023565b50601f01601f191660200190565b600080600080608085870312156140a857600080fd5b6140b185613cb3565b93506140bf60208601613cb3565b925060408501359150606085013567ffffffffffffffff8111156140e257600080fd5b8501601f810187136140f357600080fd5b80356141066141018261406a565b614039565b81815288602083850101111561411b57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561415057600080fd5b82359150613fff60208401613e5b565b6000806040838503121561417357600080fd5b61417c83613cb3565b9150613fff60208401613cb3565b600181811c9082168061419e57607f821691505b6020821081036141be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156141ed576141ed6141c4565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019820361421b5761421b6141c4565b5060010190565b600081600019048311821515161561423c5761423c6141c4565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261426657614266614241565b500490565b60006020828403121561427d57600080fd5b81516130a081613bfc565b60006020828403121561429a57600080fd5b5051919050565b6000602082840312156142b357600080fd5b81516130a081613cf9565b634e487b7160e01b600052602160045260246000fd5b6000828210156142e6576142e66141c4565b500390565b600067ffffffffffffffff808316818103614308576143086141c4565b6001019392505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526143446080830184613c5b565b9695505050505050565b60006020828403121561436057600080fd5b815167ffffffffffffffff81111561437757600080fd5b8201601f8101841361438857600080fd5b80516143966141018261406a565b8181528560208385010111156143ab57600080fd5b6143bc826020830160208601613c2f565b95945050505050565b838152825460ff8082166020840152600882901c81166040840152601082901c81166060840152601882901c811660808401526101608301919061441360a08501828460201c1660ff169052565b61442760c08501828460281c1660ff169052565b61443b60e08501828460301c1660ff169052565b6144506101008501828460381c1660ff169052565b6144656101208501828460401c1660ff169052565b505082151561014083015261362c565b60008261448457614484614241565b500690565b600060ff821660ff84168060ff038211156144a6576144a66141c4565b019392505050565b600060ff8316806144c1576144c1614241565b8060ff8416069150509291505056fea264697066735822122099456596653435b1e299f2e0acad374df6b5be1204d9232652b73507bda4e57a64736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106103b85760003560e01c8063715018a6116101f2578063bec951071161010d578063e7b9e4af116100a0578063ebe356311161006f578063ebe3563114610b8d578063f2fde38b14610bbd578063f3e64a0214610bdd578063f418ad8e14610cbf57600080fd5b8063e7b9e4af14610ae9578063e985e9c514610b09578063eb4883ab14610b44578063eb4ab9e814610b7757600080fd5b8063caa0f92a116100dc578063caa0f92a14610a79578063d082e38114610a8e578063d32aa21c14610aa4578063e6d740e214610ab957600080fd5b8063bec95107146109f1578063c41a360a14610a0d578063c87b56dd14610a43578063c8e74c6914610a6357600080fd5b806395d89b4111610185578063b88d4fde11610154578063b88d4fde14610985578063b9a7d664146109a5578063bc3fb48c146109bb578063bda66ea3146109d157600080fd5b806395d89b41146109045780639a6dee7f146109195780639f67756d14610939578063a22cb4651461096557600080fd5b80638ada6b0f116101c15780638ada6b0f1461089d5780638da5cb5b146108bd578063936bb7cd146108db57806394bf804d146108f157600080fd5b8063715018a61461082857806378f3c5401461083d57806379a617e81461086a57806386ee73311461087d57600080fd5b806337a2dbe1116102e25780634d4018fa1161027557806356d3163d1161024457806356d3163d146107855780636352211e146107a55780636c3a9b4a146107db57806370a08231146107fb57600080fd5b80634d4018fa146107165780634e86ef0c1461072b5780634fe209f91461074b57806354214f691461076b57600080fd5b806345d1e4b1116102b157806345d1e4b11461069657806349df728c146106b65780634b0bddd2146106d65780634b655731146106f657600080fd5b806337a2dbe11461061c5780633bd649681461064c5780633ccfd60b1461066157806342842e0e1461067657600080fd5b80630fdabb5a1161035a578063235329cc11610329578063235329cc1461056a57806323b872dd1461059d57806328cad13d146105bd5780632a55205a146105dd57600080fd5b80630fdabb5a146104ee57806310bf3bed146105045780631e84c4131461051957806320601b141461054b57600080fd5b8063081812fc11610396578063081812fc1461043e578063095ea7b31461048c5780630d3cf1f2146104ae5780630e15b76a146104ce57600080fd5b806301ffc9a7146103bd57806306fdde03146103f257806307e89ec014610414575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613c12565b610cef565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b50610407610d33565b6040516103e99190613c87565b34801561042057600080fd5b50610430670138a388a43c000081565b6040519081526020016103e9565b34801561044a57600080fd5b50610474610459366004613c9a565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103e9565b34801561049857600080fd5b506104ac6104a7366004613ccf565b610dc1565b005b3480156104ba57600080fd5b506104ac6104c9366004613d07565b610ec4565b3480156104da57600080fd5b506104ac6104e9366004613d69565b610f69565b3480156104fa57600080fd5b50610430600e5481565b34801561051057600080fd5b50610430600481565b34801561052557600080fd5b506006546103dd9074010000000000000000000000000000000000000000900460ff1681565b34801561055757600080fd5b50600d546103dd90610100900460ff1681565b34801561057657600080fd5b5061058a610585366004613dab565b6111da565b60405161ffff90911681526020016103e9565b3480156105a957600080fd5b506104ac6105b8366004613dcd565b611224565b3480156105c957600080fd5b506104ac6105d8366004613d07565b611426565b3480156105e957600080fd5b506105fd6105f8366004613dab565b6114ca565b604080516001600160a01b0390931683526020830191909152016103e9565b34801561062857600080fd5b506103dd610637366004613e09565b600a6020526000908152604090205460ff1681565b34801561065857600080fd5b506104ac61154d565b34801561066d57600080fd5b506104ac6115b6565b34801561068257600080fd5b506104ac610691366004613dcd565b6116c7565b3480156106a257600080fd5b506104ac6106b1366004613c9a565b6117cc565b3480156106c257600080fd5b506104ac6106d1366004613e09565b611849565b3480156106e257600080fd5b506104ac6106f1366004613e24565b6119b4565b34801561070257600080fd5b506104ac610711366004613e7b565b611a39565b34801561072257600080fd5b506104ac611d41565b34801561073757600080fd5b506104ac610746366004613c9a565b611da2565b34801561075757600080fd5b5061058a610766366004613dab565b611e01565b34801561077757600080fd5b50600f546103dd9060ff1681565b34801561079157600080fd5b506104ac6107a0366004613e09565b611e11565b3480156107b157600080fd5b506104746107c0366004613c9a565b6003602052600090815260409020546001600160a01b031681565b3480156107e757600080fd5b506104ac6107f6366004613c9a565b611e9f565b34801561080757600080fd5b50610430610816366004613e09565b60026020526000908152604090205481565b34801561083457600080fd5b506104ac6120e1565b34801561084957600080fd5b5061085d610858366004613c9a565b612147565b6040516103e99190613eb7565b6104ac610878366004613f64565b6122a1565b34801561088957600080fd5b506104ac610898366004613fb7565b6126f2565b3480156108a957600080fd5b50602954610474906001600160a01b031681565b3480156108c957600080fd5b506006546001600160a01b0316610474565b3480156108e757600080fd5b5061043061251c81565b6104ac6108ff366004613fdc565b612778565b34801561091057600080fd5b50610407612b2f565b34801561092557600080fd5b506104ac610934366004614008565b612b3c565b34801561094557600080fd5b50600d546109539060ff1681565b60405160ff90911681526020016103e9565b34801561097157600080fd5b506104ac610980366004613e24565b612bac565b34801561099157600080fd5b506104ac6109a0366004614092565b612c18565b3480156109b157600080fd5b5061043060095481565b3480156109c757600080fd5b5061043060075481565b3480156109dd57600080fd5b506109536109ec36600461413d565b612d04565b3480156109fd57600080fd5b506104306701118f178fb4800081565b348015610a1957600080fd5b50610474610a28366004613c9a565b6000908152600360205260409020546001600160a01b031690565b348015610a4f57600080fd5b50610407610a5e366004613c9a565b612eec565b348015610a6f57600080fd5b50610430600c5481565b348015610a8557600080fd5b506104306130a7565b348015610a9a57600080fd5b50610430602b5481565b348015610ab057600080fd5b506104ac6130bd565b348015610ac557600080fd5b506103dd610ad4366004613c9a565b60116020526000908152604090205460ff1681565b348015610af557600080fd5b506104ac610b04366004613c9a565b613149565b348015610b1557600080fd5b506103dd610b24366004614160565b600560209081526000928352604080842090915290825290205460ff1681565b348015610b5057600080fd5b506006546103dd907501000000000000000000000000000000000000000000900460ff1681565b348015610b8357600080fd5b5061043061019081565b348015610b9957600080fd5b506103dd610ba8366004613e09565b60086020526000908152604090205460ff1681565b348015610bc957600080fd5b506104ac610bd8366004613e09565b6131a8565b348015610be957600080fd5b50610c6b610bf8366004613c9a565b60106020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691680100000000000000009091041689565b6040805160ff9a8b168152988a1660208a01529689169688019690965293871660608701529186166080860152851660a0850152841660c0840152831660e0830152909116610100820152610120016103e9565b348015610ccb57600080fd5b506103dd610cda366004613e09565b600b6020526000908152604090205460ff1681565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610d2d5750610d2d82613287565b92915050565b60008054610d409061418a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6c9061418a565b8015610db95780601f10610d8e57610100808354040283529160200191610db9565b820191906000526020600020905b815481529060010190602001808311610d9c57829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610e0a57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610e5b5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b03163314610f1e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600680549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b3360009081526028602052604090205460ff16610fc85760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b600c54819061019090610fdc9083906141da565b111561104f5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f2060448201527f67696674000000000000000000000000000000000000000000000000000000006064820152608401610e52565b61251c81602b5461106091906141da565b11156110ba5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b600c8054839182916000906110d09084906141da565b909155506000905061113d602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b8281101561118c5761117a82878784818110611160576111606141f2565b90506020020160208101906111759190613e09565b613320565b8061118481614208565b915050611142565b50506040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152604801905060408051601f198184030181529190528051602090910120602a55505050565b601282600981106111ea57600080fd5b0181815481106111f957600080fd5b9060005260206000209060109182820401919006600202915091509054906101000a900461ffff1681565b6000818152600360205260409020546001600160a01b0384811691161461128d5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610e52565b6001600160a01b0382166112e35760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610e52565b336001600160a01b038416148061131057506000818152600460205260409020546001600160a01b031633145b8061133e57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b61138a5760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610e52565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b031633146114805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6000806114d6846134e2565b6115225760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006044820152606401610e52565b600d5430906064906115379060ff1686614222565b6115419190614257565b915091505b9250929050565b6006546001600160a01b031633146115a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600f805460ff19166001179055565b6006546001600160a01b031633146116105760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b60006116246006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d806000811461166e576040519150601f19603f3d011682016040523d82523d6000602084013e611673565b606091505b50509050806116c45760405162461bcd60e51b815260206004820152600f60248201527f5769746864726177206661696c656400000000000000000000000000000000006044820152606401610e52565b50565b6116d2838383611224565b6001600160a01b0382163b158061177b5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af115801561174b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176f919061426b565b6001600160e01b031916145b6117c75760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b505050565b6006546001600160a01b031633146118265760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600d54610100900460ff166116c457600e55600d805461ff001916610100179055565b6006546001600160a01b031633146118a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611903573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119279190614288565b6040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c791906142a1565b6006546001600160a01b03163314611a0e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b3360009081526028602052604090205460ff16611a985760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b611aa1836134e2565b611aed5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b600060106000611afc8661350c565b8152602081019190915260400160009081209150836008811115611b2257611b226142be565b03611b3957805460ff191660ff8316178155611d3b565b6001836008811115611b4d57611b4d6142be565b03611b6957805461ff00191661010060ff841602178155611d3b565b6002836008811115611b7d57611b7d6142be565b03611bb75780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff166201000060ff841602178155611d3b565b6003836008811115611bcb57611bcb6142be565b03611beb57805463ff0000001916630100000060ff841602178155611d3b565b6004836008811115611bff57611bff6142be565b03611c3b5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffff1664010000000060ff841602178155611d3b565b6005836008811115611c4f57611c4f6142be565b03611c7357805465ff000000000019166501000000000060ff841602178155611d3b565b6006836008811115611c8757611c876142be565b03611cc55780547fffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffff16660100000000000060ff841602178155611d3b565b6007836008811115611cd957611cd96142be565b03611d0157805467ff00000000000000191667010000000000000060ff841602178155611d3b565b6008836008811115611d1557611d156142be565b03611d3b57805468ff000000000000000019166801000000000000000060ff8416021781555b50505050565b6006546001600160a01b03163314611d9b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6000600e55565b6006546001600160a01b03163314611dfc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600755565b601b82600981106111ea57600080fd5b3360009081526028602052604090205460ff16611e705760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b6029805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b3360009081526028602052604090205460ff16611efe5760405162461bcd60e51b815260206004820152601060248201527f4d75737420626520616e2061646d696e000000000000000000000000000000006044820152606401610e52565b8061019081600c54611f1091906141da565b1115611f835760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f2060448201527f67696674000000000000000000000000000000000000000000000000000000006064820152608401610e52565b61251c81602b54611f9491906141da565b1115611fee5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b81600c600082825461200091906141da565b909155506000905061206d602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b83811015612096576120848233613320565b8061208e81614208565b915050612072565b50506040516bffffffffffffffffffffffff1933606090811b8216602084015241901b16603482015260480160408051601f198184030181529190528051602090910120602a555050565b6006546001600160a01b0316331461213b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6121456000613555565b565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152612199826134e2565b6121e55760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b601060006121f28461350c565b81526020808201929092526040908101600020815161012081018352905460ff80821683526101008083048216958401959095526201000082048116938301939093526301000000810483166060830152640100000000810483166080830152650100000000008104831660a083015266010000000000008104831660c08301526701000000000000008104831660e08301526801000000000000000090049091169181019190915292915050565b6006547501000000000000000000000000000000000000000000900460ff1661230c5760405162461bcd60e51b815260206004820152601a60248201527f436f6d6d756e6974792073616c65206973206e6f74206f70656e0000000000006044820152606401610e52565b600161251c81602b5461231f91906141da565b11156123795760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b6701118f178fb4800034146123d05760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374204554482076616c75652073656e7400000000000000006044820152606401610e52565b33600081815260286020526040902054813b919060ff16806123fa575033321480156123fa575081155b6124465760405162461bcd60e51b815260206004820152601760248201527f596f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610e52565b6001600160a01b03861660009081526008602052604090205460ff16156125c0576001600160a01b0386166000908152600a602052604090205460ff16156124d05760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610e52565b6124de8585600954896135b4565b61252a5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920636c61696d656400000000000000000000000000000000006044820152606401610e52565b6001600160a01b0386166000908152600a60205260409020805460ff191660011790556125bb6125b5602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b87613320565b6126a5565b6125ce8585600754896135b4565b61261a5760405162461bcd60e51b815260206004820152601360248201527f41646472657373206e6f7420696e206c697374000000000000000000000000006044820152606401610e52565b6001600160a01b0386166000908152600860205260409020805460ff191660011790556126a56125b5602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b6040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048015b60408051601f198184030181529190528051602090910120602a55505050505050565b6000828152600360205260409020546001600160a01b031633146127585760405162461bcd60e51b815260206004820152600f60248201527f4e6f7420796f7572206b697474656e00000000000000000000000000000000006044820152606401610e52565b600091825260116020526040909120805460ff1916911515919091179055565b60065474010000000000000000000000000000000000000000900460ff166127e25760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610e52565b81600081116128335760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f74206d696e74207a65726f000000000000000000000000000000006044820152606401610e52565b60048111156128845760405162461bcd60e51b815260206004820152601c60248201527f4d6178206b697474656e7320746f206d696e74206578636565646564000000006044820152606401610e52565b61251c81602b5461289591906141da565b11156128ef5760405162461bcd60e51b8152602060048201526024808201527f4e6f7420656e6f756768206b697474656e732072656d61696e696e6720746f206044820152631b5a5b9d60e21b6064820152608401610e52565b8260246128fd6001836142d4565b6004811061290d5761290d6141f2565b015461292182670138a388a43c0000614222565b61292b91906141da565b34146129795760405162461bcd60e51b815260206004820152601860248201527f496e636f7272656374204554482076616c75652073656e7400000000000000006044820152606401610e52565b33600081815260286020526040902054813b919060ff16806129a3575033321480156129a3575081155b6129ef5760405162461bcd60e51b815260206004820152601760248201527f596f7527726520747279696e6720746f206368656174210000000000000000006044820152606401610e52565b336000908152600b602052604090205460ff1615612a4f5760405162461bcd60e51b815260206004820152600e60248201527f416c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610e52565b336000908152600b60205260408120805460ff19166001179055612ace602a546040516bffffffffffffffffffffffff1933606090811b8216602084015242603484015248605484015241901b166074820152608881019190915260009060a8016040516020818303038152906040528051906020012060001c905090565b905060005b878167ffffffffffffffff161015612aff57612aef8288613320565b612af8816142eb565b9050612ad3565b50506040516bffffffffffffffffffffffff19606083811b8216602084015241901b1660348201526048016126cf565b60018054610d409061418a565b6006546001600160a01b03163314612b965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600d805460ff191660ff92909216919091179055565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612c23848484611224565b6001600160a01b0383163b1580612cb85750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290612c69903390899088908890600401614312565b6020604051808303816000875af1158015612c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cac919061426b565b6001600160e01b031916145b611d3b5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b6000612d0f836134e2565b612d5b5760405162461bcd60e51b815260206004820152600e60248201527f4e6f2073756368206b697474656e0000000000000000000000000000000000006044820152606401610e52565b600060106000612d6a8661350c565b8152602081019190915260400160009081209150836008811115612d9057612d906142be565b03612da0575460ff169050610d2d565b6001836008811115612db457612db46142be565b03612dc95754610100900460ff169050610d2d565b6002836008811115612ddd57612ddd6142be565b03612df3575462010000900460ff169050610d2d565b6003836008811115612e0757612e076142be565b03612e1e57546301000000900460ff169050610d2d565b6004836008811115612e3257612e326142be565b03612e4a5754640100000000900460ff169050610d2d565b6005836008811115612e5e57612e5e6142be565b03612e77575465010000000000900460ff169050610d2d565b6006836008811115612e8b57612e8b6142be565b03612ea557546601000000000000900460ff169050610d2d565b6007836008811115612eb957612eb96142be565b03612ed45754670100000000000000900460ff169050610d2d565b5468010000000000000000900460ff16905092915050565b6060612ef7826134e2565b612f435760405162461bcd60e51b815260206004820152601160248201527f4e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006044820152606401610e52565b600f5460ff16612fd7576029546040517f3278a957000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b0390911690633278a95790602401600060405180830381865afa158015612faf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2d919081019061434e565b600060106000612fe68561350c565b8152602080820192909252604090810160009081206029548783526011909452908290205491517fca9da47a0000000000000000000000000000000000000000000000000000000081529093506001600160a01b039092169163ca9da47a9161305b918791869160ff909116906004016143c5565b600060405180830381865afa158015613078573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130a0919081019061434e565b9392505050565b6000602b5460016130b891906141da565b905090565b6006546001600160a01b031633146131175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6040805160808101825260008082526020820181905291810182905260608101919091526116c4906024906004613ba4565b6006546001600160a01b031633146131a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b600955565b6006546001600160a01b031633146132025760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610e52565b6001600160a01b03811661327e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610e52565b6116c481613555565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614806132ea57507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610d2d5750506001600160e01b0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b600061332a613634565b6040805160208082018790528183018490528251808303840181526060909201909252805191012090915061335e90613650565b6000828152601060209081526040918290208351815492850151938501516060860151608087015160a088015160c089015160e08a01516101009a8b015160ff9788167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909a1699909917998716909a02989098177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff16620100009486169490940263ff000000191693909317630100000092851692909202919091177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff166401000000009184169190910265ff00000000001916176501000000000091831691909102177fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff1666010000000000009482169490940267ff00000000000000191693909317670100000000000000948416949094029390931768ff000000000000000019166801000000000000000092909116919091021790556117c78282613806565b6000818152600360205260408120546001600160a01b031615801590610d2d57505061251c101590565b600d54600090610100900460ff1615806135265750600e54155b1561352f575090565b61251c600e548361354091906141da565b61354a9190614475565b610d2d9060016141da565b600680546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000613629858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff19606088901b166020820152879250603401905060405160208183030381529060405280519060200120613906565b90505b949350505050565b6000602b6000815461364590614208565b9091555050602b5490565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101919091526136a88261ffff16600061391c565b6136b3906001614489565b60ff16815260109190911c906136ce61ffff8316600161391c565b6136d9906001614489565b60ff16602082015260109190911c906136f761ffff8316600261391c565b613702906001614489565b60ff16604082015260109190911c9061372061ffff8316600361391c565b61372b906001614489565b60ff16606082015260109190911c9061374961ffff8316600461391c565b613754906001614489565b60ff16608082015260109190911c9061377261ffff8316600561391c565b61377d906001614489565b60ff1660a082015260109190911c9061379b61ffff8316600661391c565b6137a6906001614489565b60ff1660c082015260109190911c906137c461ffff8316600761391c565b6137cf906001614489565b60ff1661010082015260109190911c906137ee61ffff8316600861391c565b6137f9906001614489565b60ff1660e0820152919050565b61381082826139fd565b6001600160a01b0382163b15806138b65750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af1158015613886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138aa919061426b565b6001600160e01b031916145b6139025760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610e52565b5050565b6000826139138584613b30565b14949350505050565b60008060128360ff1660098110613935576139356141f2565b015461394190856144ae565b905060128360ff1660098110613959576139596141f2565b018160ff168154811061396e5761396e6141f2565b60009182526020909120601082040154600f9091166002026101000a900461ffff16600885901c60ff1610156139a5579050610d2d565b601b8360ff16600981106139bb576139bb6141f2565b018160ff16815481106139d0576139d06141f2565b90600052602060002090601091828204019190066002029054906101000a900461ffff1691505092915050565b6001600160a01b038216613a535760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610e52565b6000818152600360205260409020546001600160a01b031615613ab85760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610e52565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015613b9c576000858281518110613b5257613b526141f2565b60200260200101519050808311613b785760008381526020829052604090209250613b89565b600081815260208490526040902092505b5080613b9481614208565b915050613b35565b509392505050565b8260048101928215613bd7579160200282015b82811115613bd7578251829060ff16905591602001919060010190613bb7565b50613be3929150613be7565b5090565b5b80821115613be35760008155600101613be8565b6001600160e01b0319811681146116c457600080fd5b600060208284031215613c2457600080fd5b81356130a081613bfc565b60005b83811015613c4a578181015183820152602001613c32565b83811115611d3b5750506000910152565b60008151808452613c73816020860160208601613c2f565b601f01601f19169290920160200192915050565b6020815260006130a06020830184613c5b565b600060208284031215613cac57600080fd5b5035919050565b80356001600160a01b0381168114613cca57600080fd5b919050565b60008060408385031215613ce257600080fd5b613ceb83613cb3565b946020939093013593505050565b80151581146116c457600080fd5b600060208284031215613d1957600080fd5b81356130a081613cf9565b60008083601f840112613d3657600080fd5b50813567ffffffffffffffff811115613d4e57600080fd5b6020830191508360208260051b850101111561154657600080fd5b60008060208385031215613d7c57600080fd5b823567ffffffffffffffff811115613d9357600080fd5b613d9f85828601613d24565b90969095509350505050565b60008060408385031215613dbe57600080fd5b50508035926020909101359150565b600080600060608486031215613de257600080fd5b613deb84613cb3565b9250613df960208501613cb3565b9150604084013590509250925092565b600060208284031215613e1b57600080fd5b6130a082613cb3565b60008060408385031215613e3757600080fd5b613e4083613cb3565b91506020830135613e5081613cf9565b809150509250929050565b803560098110613cca57600080fd5b803560ff81168114613cca57600080fd5b600080600060608486031215613e9057600080fd5b83359250613ea060208501613e5b565b9150613eae60408501613e6a565b90509250925092565b60006101208201905060ff835116825260ff60208401511660208301526040830151613ee8604084018260ff169052565b506060830151613efd606084018260ff169052565b506080830151613f12608084018260ff169052565b5060a0830151613f2760a084018260ff169052565b5060c0830151613f3c60c084018260ff169052565b5060e0830151613f5160e084018260ff169052565b506101009283015160ff16919092015290565b600080600060408486031215613f7957600080fd5b613f8284613cb3565b9250602084013567ffffffffffffffff811115613f9e57600080fd5b613faa86828701613d24565b9497909650939450505050565b60008060408385031215613fca57600080fd5b823591506020830135613e5081613cf9565b60008060408385031215613fef57600080fd5b82359150613fff60208401613cb3565b90509250929050565b60006020828403121561401a57600080fd5b6130a082613e6a565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561406257614062614023565b604052919050565b600067ffffffffffffffff82111561408457614084614023565b50601f01601f191660200190565b600080600080608085870312156140a857600080fd5b6140b185613cb3565b93506140bf60208601613cb3565b925060408501359150606085013567ffffffffffffffff8111156140e257600080fd5b8501601f810187136140f357600080fd5b80356141066141018261406a565b614039565b81815288602083850101111561411b57600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6000806040838503121561415057600080fd5b82359150613fff60208401613e5b565b6000806040838503121561417357600080fd5b61417c83613cb3565b9150613fff60208401613cb3565b600181811c9082168061419e57607f821691505b6020821081036141be57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156141ed576141ed6141c4565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019820361421b5761421b6141c4565b5060010190565b600081600019048311821515161561423c5761423c6141c4565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261426657614266614241565b500490565b60006020828403121561427d57600080fd5b81516130a081613bfc565b60006020828403121561429a57600080fd5b5051919050565b6000602082840312156142b357600080fd5b81516130a081613cf9565b634e487b7160e01b600052602160045260246000fd5b6000828210156142e6576142e66141c4565b500390565b600067ffffffffffffffff808316818103614308576143086141c4565b6001019392505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526143446080830184613c5b565b9695505050505050565b60006020828403121561436057600080fd5b815167ffffffffffffffff81111561437757600080fd5b8201601f8101841361438857600080fd5b80516143966141018261406a565b8181528560208385010111156143ab57600080fd5b6143bc826020830160208601613c2f565b95945050505050565b838152825460ff8082166020840152600882901c81166040840152601082901c81166060840152601882901c811660808401526101608301919061441360a08501828460201c1660ff169052565b61442760c08501828460281c1660ff169052565b61443b60e08501828460301c1660ff169052565b6144506101008501828460381c1660ff169052565b6144656101208501828460401c1660ff169052565b505082151561014083015261362c565b60008261448457614484614241565b500690565b600060ff821660ff84168060ff038211156144a6576144a66141c4565b019392505050565b600060ff8316806144c1576144c1614241565b8060ff8416069150509291505056fea264697066735822122099456596653435b1e299f2e0acad374df6b5be1204d9232652b73507bda4e57a64736f6c634300080d0033
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.