ERC-721
Overview
Max Total Supply
719 KOE
Holders
122
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 KOELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AdventurersOfEther
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "../interfaces/ITreasury.sol"; import "./adventurer/PublicSale.sol"; import "./adventurer/PreSale.sol"; import "./adventurer/Reveal.sol"; import "./adventurer/WhiteList.sol"; /** * @notice Adventurers Token */ contract AdventurersOfEther is PublicSale, WhiteList, PreSale, Reveal { ITreasury public treasury; constructor() {} function mintBatch(address[] memory _to, uint256[] memory _amount) external onlyOwner returns (uint oldIndex, uint newIndex) { return _mintBatch(_to, _amount); } function burn(uint256[] calldata _tokens) external onlyOwner { _burn(_tokens); } function setTreasury(ITreasury _value) external onlyOwner { treasury = _value; } /** * @notice poll payment to treasury */ function transferToTreasury() external { require(address(treasury) != address(0), "zero treasury address"); treasury.primarySale{value: address(this).balance}(); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "hardhat/console.sol"; interface ITreasury { /** * @notice primary sale (invoked by nft contract on mint) */ function primarySale() external payable; /** * @notice secondary sale (invoked by ERC-2981) */ receive() external payable; }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "./ERC721.sol"; /** * @notice Public sale stage of Adventurers Token workflow */ abstract contract PublicSale is ERC721 { struct PublicSaleConfig { uint128 price; uint32 tokensPerTransaction; } PublicSaleConfig public publicSaleConfig = PublicSaleConfig({ price: 0.145 ether, tokensPerTransaction: 0 // 10 + extra 1 for < }); constructor() {} function mintPublic(uint _count) external payable returns (uint oldIndex, uint newIndex) { PublicSaleConfig memory _cfg = publicSaleConfig; require(_cfg.tokensPerTransaction > 0, "publicsale: disabled"); require(msg.value == _cfg.price * _count, "publicsale: payment amount"); require(_count < _cfg.tokensPerTransaction, "publicsale: invalid count"); return _mint(msg.sender, _count); } function setPublicSaleConfig(uint128 _price, uint32 _tokensPerTransaction) external onlyOwner { if (_tokensPerTransaction > 0) { _tokensPerTransaction += 1; } publicSaleConfig = PublicSaleConfig({ price: _price, tokensPerTransaction: _tokensPerTransaction }); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "./ERC721.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; /** * @notice Presale (Crystal exchange) stage of Adventurers Token workflow */ abstract contract PreSale is ERC721 { using ERC165Checker for address; struct PresaleConfig { uint128 price; uint32 tokensPerCrystal; } /* state */ address public crystal; PresaleConfig public presaleConfig = PresaleConfig({ price: 0.095 ether, tokensPerCrystal: 4 // 3 + extra 1 for < }); constructor() {} function mintCrystalHolders(uint _count, uint _id) external payable returns (uint oldIndex, uint newIndex) { require(crystal != address(0), "presale: disabled"); PresaleConfig memory _cfg = presaleConfig; require(msg.value == _cfg.price * _count, "presale: invalid payment amount"); require(_count > 0 && _count < _cfg.tokensPerCrystal, "presale: invalid count"); IERC1155(crystal).safeTransferFrom(msg.sender, address(this), _id, 1, ""); return _mint(msg.sender, _count); } function setPresaleConfig(uint128 _price, uint32 _tokensPerCrystal) external onlyOwner { presaleConfig = PresaleConfig({ price: _price, tokensPerCrystal: _tokensPerCrystal + 1 }); } function setCrystal(address _value) external onlyOwner { require(_value == address(0) || _value.supportsInterface(type(IERC1155).interfaceId), "presale: 0 or valid IERC1155"); crystal = _value; if (_value != address(0)) { IERC1155(_value).setApprovalForAll(owner(), true); // we want to regift crystals } } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "./ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; /** * @notice EIP-721 reveal logic */ abstract contract Reveal is ERC721 { struct RevealGroup { uint64 startIndex; uint64 lastIndex; } /* state */ uint[] private groupHashes; RevealGroup[] public revealGroups; string public unrevealedBaseUri = ""; constructor() {} function revealHash(uint _tokenIndex) public view returns (uint) { for (uint _groupIndex = 0; _groupIndex < revealGroups.length; _groupIndex++) { RevealGroup memory _revealGroup = revealGroups[_groupIndex]; if (_tokenIndex > _revealGroup.startIndex && _tokenIndex < _revealGroup.lastIndex) { return groupHashes[_groupIndex]; } } return 0; } /** * @dev IERC721Metadata Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint _tokenId) external virtual override(IERC721Metadata) view returns (string memory) { require(exists(_tokenId), "erc721: nonexistent token"); uint _groupHash = revealHash(_tokenId); if (_groupHash > 0) { return string(abi.encodePacked( _groupURI(_groupHash), Strings.toString(_tokenId), ".json" )); } return string(abi.encodePacked( unrevealedBaseUri, Strings.toString(_tokenId), ".json" )); } function _groupURI(uint _groupId) internal pure returns (string memory) { string memory _uri = "ipfs://f01701220"; bytes32 value = bytes32(_groupId); bytes memory alphabet = "0123456789abcdef"; bytes memory str = new bytes(64); for (uint i = 0; i < 32; i++) { bytes1 ix1 = value[i] >> 4; str[i*2] = alphabet[uint8(ix1)]; bytes1 ix2 = value[i] & 0x0f; str[1+i*2] = alphabet[uint8(ix2)]; } return string(abi.encodePacked(_uri, string(str), "/")); } function setRevealHash(uint _groupIndex, uint _revealHash) external onlyOwner { groupHashes[_groupIndex] = _revealHash; } function setUnrevealedBaseUri(string memory _unrevealedBaseUri) external onlyOwner { unrevealedBaseUri = _unrevealedBaseUri; } function reveal(uint16 _tokensCount, uint _revealHash) external onlyOwner { uint _groupIndex = revealGroups.length; RevealGroup memory _prev; if (_groupIndex > 0) { _prev = revealGroups[_groupIndex - 1]; } else { _prev = RevealGroup({ startIndex: 0, lastIndex: 1 }); } revealGroups.push(RevealGroup({ startIndex: _prev.lastIndex - 1, lastIndex: _prev.lastIndex + _tokensCount })); groupHashes.push(_revealHash); } function undoReveal() external onlyOwner() { revealGroups.pop(); groupHashes.pop(); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "./ERC721.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; /** * @notice Whitelist stage of Adventurers Token workflow */ abstract contract WhiteList is ERC721, EIP712 { string public constant EIP712_VERSION = "1.0.0"; /* state */ address public signer; mapping(address /* minter */ => /* minted */ uint) public whitelistMinters; constructor() EIP712(NAME, EIP712_VERSION) { signer = msg.sender; } /* eip-712 */ bytes32 private constant PASS_TYPEHASH = keccak256("MintPass(address wallet,uint256 count)"); /* change eip-712 signer address, set 0 to disable WL */ function setSigner(address _value) external onlyOwner { signer = _value; } function mintSelected(uint _count, uint _signatureCount, bytes memory _signature) external returns (uint from, uint to) { require(signer != address(0), "eip-712: whitelist mint disabled"); bytes32 _digest = _hashTypedDataV4( keccak256(abi.encode(PASS_TYPEHASH, msg.sender, _signatureCount)) ); require(ECDSA.recover(_digest, _signature) == signer, "eip-712: invalid signature"); uint _maxCount = _signatureCount + 1 - whitelistMinters[msg.sender]; require(_count < _maxCount, "eip-712: invalid count"); whitelistMinters[msg.sender] += _count; return _mint(msg.sender, _count); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.11; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/interfaces/IERC165.sol"; /** * @notice EIP-721 implementation of Adventurers Token */ abstract contract ERC721 is IERC721Enumerable, IERC721Metadata, Ownable { string public constant NAME = "Adventurers Of Ether"; string public constant SYMBOL = "KOE"; uint private constant MAX_SUPPLY = 6001; // +1 extra 1 for < /* state */ uint256 public maxSupply = 3000; uint private minted; // count of minted tokens uint private burned; mapping(address /* minter */ => /* minted tokes count */ uint) public minters; address[MAX_SUPPLY] private owners; mapping(address /* owner */ => /* tokens count */ uint) private balances; mapping(uint /* token */ => /* operator */ address) private operatorApprovals; mapping(address /* owner */ => mapping(address /* operator */ => bool)) private forallApprovals; constructor() {} function setMaxSupply(uint256 _maxSupply) external onlyOwner { require(_maxSupply < MAX_SUPPLY, "max supply exceeded"); maxSupply = _maxSupply; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || interfaceId == type(IERC165).interfaceId; } /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() public view returns (uint256) { return minted - burned; } function _mint(address _to, uint256 _amount) internal returns (uint _oldIndex, uint _newIndex) { uint256 _minted = minted; require(_minted + _amount - 1 < maxSupply, "tokens are over"); for (uint256 i = 0; i < _amount; i++){ _minted++; owners[_minted] = _to; emit Transfer(address(0), _to, _minted); } minters[_to] += _amount; balances[_to] += _amount; minted = _minted; return (_minted - _amount, _minted); } function _mintBatch(address[] memory _to, uint[] memory _amounts) internal returns (uint _oldIndex, uint _newIndex) { require(_to.length == _amounts.length, "array lengths mismatch"); uint256 _minted = minted; uint _total = 0; for (uint i = 0; i < _to.length; i++) { uint _amount = _amounts[i]; address _addr = _to[i]; _total += _amount; //minters[_addr] += _amount; balances[_addr] += _amount; for (uint256 j = 0; j < _amount; j++){ _minted++; owners[_minted] = _addr; emit Transfer(address(0), _addr, _minted); } } require(_minted + _total < maxSupply, "tokens are over"); minted = _minted; return (_minted - _total, _minted); } function _burn(uint256[] calldata _tokens) internal { uint _burned; for (uint i = 0; i < _tokens.length; i++) { uint _tokenId = _tokens[i]; address _owner = owners[_tokenId]; if (_owner != address(0)) { _burned ++; balances[_owner] -= 1; owners[_tokenId] = address(0); emit Transfer(_owner, address(0), _tokenId); } } burned += _burned; } function exists(uint256 _tokenId) public view returns (bool) { return ((minted + 1) > _tokenId) && (_tokenId > 0) && owners[_tokenId] != address(0); } /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) { uint _ix = 0; for (uint _tokenId = 1; _tokenId < minted; _tokenId += 1) { if (owners[_tokenId] == _owner) { if (_ix == _index) { return _tokenId; } else { _ix += 1; } } } return 0; } /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 _index) external pure returns (uint256) { return _index; } /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address _owner) public view returns (uint256 _balance) { _balance = balances[_owner]; } /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 _tokenId) public view returns (address _owner) { require(exists(_tokenId), "erc-721: nonexistent token"); _owner = owners[_tokenId]; } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) public { _transfer(_from, _to, _tokenId, _data); } /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address _from, address _to, uint256 _tokenId ) public { _transfer(_from, _to, _tokenId, ""); } function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public { _transfer(_from, _to, _tokenId, ""); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address _from, address _to, uint256 _tokenId, bytes memory ) internal { address _owner = ownerOf(_tokenId); require(msg.sender == _owner || getApproved(_tokenId) == msg.sender || isApprovedForAll(_owner, msg.sender), "erc-721: not owner nor approved"); require(_owner == _from, "erc-721: not owner"); require(_to != address(0), "zero address"); operatorApprovals[_tokenId] = address(0); owners[_tokenId] = _to; balances[_from] -= 1; balances[_to] += 1; emit Transfer(_from, _to, _tokenId); } /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address _to, uint256 _tokenId) external { address _owner = ownerOf(_tokenId); require(exists(_tokenId), "erc-721: nonexistent token"); require(_owner != _to, "erc-721: approve to caller"); require( msg.sender == _owner || isApprovedForAll(_owner, msg.sender), "erc-721: not owner nor approved" ); operatorApprovals[_tokenId] = _to; emit Approval(_owner, _to, _tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 _tokenId) public view returns (address _operator) { require(exists(_tokenId), "erc-721: nonexistent token"); _operator = operatorApprovals[_tokenId]; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address _operator, bool _approved) external { require(msg.sender != _operator, "erc-721: approve to caller"); forallApprovals[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address _owner, address _operator) public view returns (bool) { return forallApprovals[_owner][_operator]; } /** * @dev IERC721Metadata Returns the token collection name. */ function name() external pure returns (string memory) { return NAME; } /** * @dev IERC721Metadata Returns the token collection symbol. */ function symbol() external pure returns (string memory) { return SYMBOL; } }
// 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 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // 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/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 v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); if (result.length < 32) return false; return success && abi.decode(result, (bool)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EIP712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crystal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"_operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"}],"name":"mintBatch","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"mintCrystalHolders","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintPublic","outputs":[{"internalType":"uint256","name":"oldIndex","type":"uint256"},{"internalType":"uint256","name":"newIndex","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256","name":"_signatureCount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mintSelected","outputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleConfig","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint32","name":"tokensPerCrystal","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleConfig","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint32","name":"tokensPerTransaction","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_tokensCount","type":"uint16"},{"internalType":"uint256","name":"_revealHash","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"revealGroups","outputs":[{"internalType":"uint64","name":"startIndex","type":"uint64"},{"internalType":"uint64","name":"lastIndex","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenIndex","type":"uint256"}],"name":"revealHash","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"setCrystal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint32","name":"_tokensPerCrystal","type":"uint32"}],"name":"setPresaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"uint32","name":"_tokensPerTransaction","type":"uint32"}],"name":"setPublicSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groupIndex","type":"uint256"},{"internalType":"uint256","name":"_revealHash","type":"uint256"}],"name":"setRevealHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_value","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITreasury","name":"_value","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_unrevealedBaseUri","type":"string"}],"name":"setUnrevealedBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"contract ITreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"undoReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedBaseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610bb860015567020324bb546e8000610140819052600061016081905261177980546001600160a01b0319908116909317905567015181ff25a980006101805260046101a05261177d805490921670040000000000000000015181ff25a98000179091556101e060408190526101c082905262000081916117809190620001fd565b503480156200008f57600080fd5b506040518060400160405280601481526020017f416476656e747572657273204f66204574686572000000000000000000000000815250604051806040016040528060058152602001640312e302e360dc1b815250620000fe620000f8620001a960201b60201c565b620001ad565b815160208084019190912082518383012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c00190528051940193909320919290916080523060c05261012052505061177a80546001600160a01b0319163317905550620002e09050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200020b90620002a3565b90600052602060002090601f0160209004810192826200022f57600085556200027a565b82601f106200024a57805160ff19168380011785556200027a565b828001600101855582156200027a579182015b828111156200027a5782518255916020019190600101906200025d565b50620002889291506200028c565b5090565b5b808211156200028857600081556001016200028d565b600181811c90821680620002b857607f821691505b60208210811415620002da57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051613c18620003306000396000612ce401526000612d3301526000612d0e01526000612c6701526000612c9101526000612cbb0152613c186000f3fe6080604052600436106103295760003560e01c80638da5cb5b116101a5578063d408234b116100ec578063eccec5a811610095578063f2fde38b1161006f578063f2fde38b146109f5578063f46eccc414610a15578063f76f8d7814610a42578063fd88fa6914610a7157600080fd5b8063eccec5a814610979578063efd0cbf9146109c2578063f0f44260146109d557600080fd5b8063db398744116100c6578063db398744146108fa578063e985e9c51461091a578063eab628421461096457600080fd5b8063d408234b146108af578063d5abeb01146108c4578063d6e5f5b8146108da57600080fd5b8063a3fd2c441161014e578063b88d4fde11610128578063b88d4fde1461084f578063c2eaa5391461086f578063c87b56dd1461088f57600080fd5b8063a3fd2c44146107c8578063aa767a8c1461081c578063b80f55c91461082f57600080fd5b8063971a90911161017f578063971a90911461073e578063a22cb4651461075f578063a3f4df7e1461077f57600080fd5b80638da5cb5b146106d457806393055614146106f257806395d89b411461071257600080fd5b806342842e0e116102745780636c19e7831161021d57806370a08231116101f757806370a0823114610633578063715018a61461066a5780637c88e3d91461067f5780637d5dea17146106b457600080fd5b80636c19e783146105de5780636f8b44b0146105fe5780636ff861621461061e57600080fd5b80634f6ccce71161024e5780634f6ccce71461057f57806361d027b31461059d5780636352211e146105be57600080fd5b806342842e0e146104f15780634aa23021146105315780634f558e791461055f57600080fd5b806318160ddd116102d6578063238ac933116102b0578063238ac933146104d057806323b872dd146104f15780632f745c591461051157600080fd5b806318160ddd1461047b578063199d0819146104905780631eb92fed146104b057600080fd5b806306fdde031161030757806306fdde03146103d2578063081812fc14610421578063095ea7b31461045957600080fd5b806301ffc9a71461032e57806304b1b2c21461036357806306c2e4e4146103a4575b600080fd5b34801561033a57600080fd5b5061034e6103493660046132a4565b610aa1565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e3660046132ce565b610b59565b6040805167ffffffffffffffff93841681529290911660208301520161035a565b3480156103b057600080fd5b506103c46103bf3660046132ce565b610b95565b60405190815260200161035a565b3480156103de57600080fd5b5060408051808201909152601481527f416476656e747572657273204f6620457468657200000000000000000000000060208201525b60405161035a9190613313565b34801561042d57600080fd5b5061044161043c3660046132ce565b610c5c565b6040516001600160a01b03909116815260200161035a565b34801561046557600080fd5b5061047961047436600461335b565b610cd5565b005b34801561048757600080fd5b506103c4610e7d565b34801561049c57600080fd5b506104796104ab366004613387565b610e94565b3480156104bc57600080fd5b506104796104cb3660046133a9565b610f01565b3480156104dc57600080fd5b5061177a54610441906001600160a01b031681565b3480156104fd57600080fd5b5061047961050c3660046133f7565b610faf565b34801561051d57600080fd5b506103c461052c36600461335b565b610fcf565b34801561053d57600080fd5b506103c461054c366004613438565b61177b6020526000908152604090205481565b34801561056b57600080fd5b5061034e61057a3660046132ce565b61104a565b34801561058b57600080fd5b506103c461059a3660046132ce565b90565b3480156105a957600080fd5b5061178154610441906001600160a01b031681565b3480156105ca57600080fd5b506104416105d93660046132ce565b611099565b3480156105ea57600080fd5b506104796105f9366004613438565b611115565b34801561060a57600080fd5b506104796106193660046132ce565b611180565b34801561062a57600080fd5b5061047961121e565b34801561063f57600080fd5b506103c461064e366004613438565b6001600160a01b03166000908152611776602052604090205490565b34801561067657600080fd5b506104796112e3565b34801561068b57600080fd5b5061069f61069a36600461352b565b611337565b6040805192835260208301919091520161035a565b3480156106c057600080fd5b5061069f6106cf366004613665565b611398565b3480156106e057600080fd5b506000546001600160a01b0316610441565b3480156106fe57600080fd5b5061047961070d366004613438565b611579565b34801561071e57600080fd5b506040805180820190915260038152624b4f4560e81b6020820152610414565b34801561074a57600080fd5b5061177c54610441906001600160a01b031681565b34801561076b57600080fd5b5061047961077a3660046136c3565b6116e1565b34801561078b57600080fd5b506104146040518060400160405280601481526020017f416476656e747572657273204f6620457468657200000000000000000000000081525081565b3480156107d457600080fd5b50611779546107f8906001600160801b03811690600160801b900463ffffffff1682565b604080516001600160801b03909316835263ffffffff90911660208301520161035a565b61069f61082a366004613387565b6117a7565b34801561083b57600080fd5b5061047961084a3660046136f1565b6119a0565b34801561085b57600080fd5b5061047961086a366004613766565b6119f6565b34801561087b57600080fd5b5061047961088a3660046137d2565b611a08565b34801561089b57600080fd5b506104146108aa3660046132ce565b611bbd565b3480156108bb57600080fd5b50610479611c7e565b3480156108d057600080fd5b506103c460015481565b3480156108e657600080fd5b506104796108f53660046137f7565b611d2d565b34801561090657600080fd5b506104796109153660046133a9565b611d89565b34801561092657600080fd5b5061034e610935366004613840565b6001600160a01b0391821660009081526117786020908152604080832093909416825291909152205460ff1690565b34801561097057600080fd5b50610414611e3b565b34801561098557600080fd5b506104146040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61069f6109d03660046132ce565b611eca565b3480156109e157600080fd5b506104796109f0366004613438565b61201a565b348015610a0157600080fd5b50610479610a10366004613438565b612085565b348015610a2157600080fd5b506103c4610a30366004613438565b60046020526000908152604090205481565b348015610a4e57600080fd5b50610414604051806040016040528060038152602001624b4f4560e81b81525081565b348015610a7d57600080fd5b5061177d546107f8906001600160801b03811690600160801b900463ffffffff1682565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3857506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610b5357506001600160e01b031982166301ffc9a760e01b145b92915050565b61177f8181548110610b6a57600080fd5b60009182526020909120015467ffffffffffffffff8082169250680100000000000000009091041682565b6000805b61177f54811015610c5357600061177f8281548110610bba57610bba61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff808216808452680100000000000000009092041692820192909252915084118015610c135750806020015167ffffffffffffffff1684105b15610c405761177e8281548110610c2c57610c2c61386e565b906000526020600020015492505050919050565b5080610c4b8161389a565b915050610b99565b50600092915050565b6000610c678261104a565b610cb85760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e00000000000060448201526064015b60405180910390fd5b50600090815261177760205260409020546001600160a01b031690565b6000610ce082611099565b9050610ceb8261104a565b610d375760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b826001600160a01b0316816001600160a01b03161415610d995760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336001600160a01b0382161480610dd457506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b610e205760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b6000828152611777602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000600354600254610e8f91906138b5565b905090565b6000546001600160a01b03163314610edc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b8061177e8381548110610ef157610ef161386e565b6000918252602090912001555050565b6000546001600160a01b03163314610f495760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b63ffffffff811615610f6357610f606001826138cc565b90505b604080518082019091526001600160801b0390921680835263ffffffff90911660209092018290526117798054600160801b9093026001600160a01b0319909316909117919091179055565b610fca83838360405180602001604052806000815250612152565b505050565b60008060015b60025481101561103f57846001600160a01b03166005826117718110610ffd57610ffd61386e565b01546001600160a01b0316141561102d578382141561101f579150610b539050565b61102a6001836138f4565b91505b6110386001826138f4565b9050610fd5565b506000949350505050565b600081600254600161105c91906138f4565b1180156110695750600082115b8015610b535750600060058361177181106110865761108661386e565b01546001600160a01b0316141592915050565b60006110a48261104a565b6110f05760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b60058261177181106111045761110461386e565b01546001600160a01b031692915050565b6000546001600160a01b0316331461115d5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111c85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177181106112195760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610caf565b600155565b611781546001600160a01b03166112775760405162461bcd60e51b815260206004820152601560248201527f7a65726f207472656173757279206164647265737300000000000000000000006044820152606401610caf565b61178160009054906101000a90046001600160a01b03166001600160a01b031663a639ad79476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505050565b6000546001600160a01b0316331461132b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b611335600061239d565b565b6000805481906001600160a01b031633146113825760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61138c84846123ed565b915091505b9250929050565b61177a5460009081906001600160a01b03166113f65760405162461bcd60e51b815260206004820181905260248201527f6569702d3731323a2077686974656c697374206d696e742064697361626c65646044820152606401610caf565b604080517f64a830c71be714ed4ca944cf759cc2c89f283e211e10da9c9b9142b13722422b602082015233918101919091526060810185905260009061145490608001604051602081830303815290604052805190602001206125e3565b61177a549091506001600160a01b031661146e828661264c565b6001600160a01b0316146114c45760405162461bcd60e51b815260206004820152601a60248201527f6569702d3731323a20696e76616c6964207369676e61747572650000000000006044820152606401610caf565b33600090815261177b60205260408120546114e08760016138f4565b6114ea91906138b5565b905080871061153b5760405162461bcd60e51b815260206004820152601660248201527f6569702d3731323a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b33600090815261177b60205260408120805489929061155b9084906138f4565b9091555061156b90503388612670565b935093505050935093915050565b6000546001600160a01b031633146115c15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b038116158061160557506116056001600160a01b0382167fd9b67a26000000000000000000000000000000000000000000000000000000006127e1565b6116515760405162461bcd60e51b815260206004820152601c60248201527f70726573616c653a2030206f722076616c6964204945524331313535000000006044820152606401610caf565b61177c80546001600160a01b0319166001600160a01b038316908117909155156116de57806001600160a01b031663a22cb4656116966000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156112c857600080fd5b50565b336001600160a01b038316141561173a5760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336000818152611778602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177c5460009081906001600160a01b03166118055760405162461bcd60e51b815260206004820152601160248201527f70726573616c653a2064697361626c65640000000000000000000000000000006044820152606401610caf565b6040805180820190915261177d546001600160801b038116808352600160801b90910463ffffffff16602083015261183e90869061390c565b341461188c5760405162461bcd60e51b815260206004820152601f60248201527f70726573616c653a20696e76616c6964207061796d656e7420616d6f756e74006044820152606401610caf565b6000851180156118a55750806020015163ffffffff1685105b6118f15760405162461bcd60e51b815260206004820152601660248201527f70726573616c653a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b61177c546040517ff242432a000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526001606482015260a06084820152600060a48201526001600160a01b039091169063f242432a9060c401600060405180830381600087803b15801561197257600080fd5b505af1158015611986573d6000803e3d6000fd5b505050506119943386612670565b92509250509250929050565b6000546001600160a01b031633146119e85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6119f28282612804565b5050565b611a0284848484612152565b50505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f5460408051808201909152600080825260208201528115611ace5761177f611a7c6001846138b5565b81548110611a8c57611a8c61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff80821683526801000000000000000090910416918101919091529050611ae5565b506040805180820190915260008152600160208201525b61177f604051806040016040528060018460200151611b04919061392b565b67ffffffffffffffff1681526020018661ffff168460200151611b279190613954565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551930180549190950151841668010000000000000000026fffffffffffffffffffffffffffffffff1990911692909316919091179190911790915561177e805491820181559091527f7fe79683751d9389eb55419939a813586ee3a6ec5f91165868f6441cbaaf9b1c0192909255505050565b6060611bc88261104a565b611c145760405162461bcd60e51b815260206004820152601960248201527f6572633732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610caf565b6000611c1f83610b95565b90508015611c6157611c3081612929565b611c3984612b38565b604051602001611c4a929190613993565b604051602081830303815290604052915050919050565b611780611c6d84612b38565b604051602001611c4a929190613a0d565b6000546001600160a01b03163314611cc65760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f805480611cd857611cd8613ac8565b600082815260209020810160001990810180546fffffffffffffffffffffffffffffffff1916905501905561177e805480611d1557611d15613ac8565b60019003818190600052602060002001600090559055565b6000546001600160a01b03163314611d755760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b80516119f29061178090602084019061320b565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6040518060400160405280836001600160801b03168152602001826001611df891906138cc565b63ffffffff908116909152815161177d8054602090940151909216600160801b026001600160a01b03199093166001600160801b03909116179190911790555050565b6117808054611e49906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e75906139d2565b8015611ec25780601f10611e9757610100808354040283529160200191611ec2565b820191906000526020600020905b815481529060010190602001808311611ea557829003601f168201915b505050505081565b60408051808201909152611779546001600160801b0381168252600160801b900463ffffffff16602082018190526000918291611f495760405162461bcd60e51b815260206004820152601460248201527f7075626c696373616c653a2064697361626c65640000000000000000000000006044820152606401610caf565b8051611f5f9085906001600160801b031661390c565b3414611fad5760405162461bcd60e51b815260206004820152601a60248201527f7075626c696373616c653a207061796d656e7420616d6f756e740000000000006044820152606401610caf565b806020015163ffffffff1684106120065760405162461bcd60e51b815260206004820152601960248201527f7075626c696373616c653a20696e76616c696420636f756e74000000000000006044820152606401610caf565b6120103385612670565b9250925050915091565b6000546001600160a01b031633146120625760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61178180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120cd5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b0381166121495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610caf565b6116de8161239d565b600061215d83611099565b9050336001600160a01b038216148061218657503361217b84610c5c565b6001600160a01b0316145b806121b557506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b6122015760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b846001600160a01b0316816001600160a01b0316146122625760405162461bcd60e51b815260206004820152601260248201527f6572632d3732313a206e6f74206f776e657200000000000000000000000000006044820152606401610caf565b6001600160a01b0384166122b85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610caf565b60008381526117776020526040902080546001600160a01b03191690558360058461177181106122ea576122ea61386e565b0180546001600160a01b0319166001600160a01b0392831617905585166000908152611776602052604081208054600192906123279084906138b5565b90915550506001600160a01b0384166000908152611776602052604081208054600192906123569084906138f4565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008082518451146124415760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e67746873206d69736d61746368000000000000000000006044820152606401610caf565b6002546000805b865181101561256d5760008682815181106124655761246561386e565b6020026020010151905060008883815181106124835761248361386e565b60200260200101519050818461249991906138f4565b6001600160a01b038216600090815261177660205260408120805492965084929091906124c79084906138f4565b90915550600090505b8281101561255757856124e28161389a565b9650508160058761177181106124fa576124fa61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405187918416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061254f8161389a565b9150506124d0565b50505080806125659061389a565b915050612448565b5060015461257b82846138f4565b106125c85760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60028290556125d781836138b5565b96919550909350505050565b6000610b536125f0612c5a565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061265b8585612d81565b9150915061266881612dee565b509392505050565b600080600060025490506001546001858361268b91906138f4565b61269591906138b5565b106126e25760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60005b8481101561276c57816126f78161389a565b92505085600583611771811061270f5761270f61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405183918816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806127648161389a565b9150506126e5565b506001600160a01b038516600090815260046020526040812080548692906127959084906138f4565b90915550506001600160a01b03851660009081526117766020526040812080548692906127c39084906138f4565b909155505060028190556127d784826138b5565b9590945092505050565b60006127ec83612fa9565b80156127fd57506127fd8383612fdc565b9392505050565b6000805b8281101561290c5760008484838181106128245761282461386e565b905060200201359050600060058261177181106128435761284361386e565b01546001600160a01b0316905080156128f757836128608161389a565b6001600160a01b0383166000908152611776602052604081208054929750600193509161288e9084906138b5565b909155506000905060058361177181106128aa576128aa61386e565b0180546001600160a01b0319166001600160a01b039283161790556040518391600091908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b505080806129049061389a565b915050612808565b50806003600082825461291f91906138f4565b9091555050505050565b60408051808201825260108082527f697066733a2f2f66303137303132323000000000000000000000000000000000602080840191909152835180850185529182527f3031323334353637383961626364656600000000000000000000000000000000908201528251838152606081810185529385929160009160208201818036833701905050905060005b6020811015612b0a57600060048583602081106129d4576129d461386e565b1a60f81b6001600160f81b031916901c9050838160f81c60ff16815181106129fe576129fe61386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683612a3184600261390c565b81518110612a4157612a4161386e565b60200101906001600160f81b031916908160001a9053506000858360208110612a6c57612a6c61386e565b1a60f81b600f60f81b169050848160f81c60ff1681518110612a9057612a9061386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001684612ac385600261390c565b612ace9060016138f4565b81518110612ade57612ade61386e565b60200101906001600160f81b031916908160001a90535050508080612b029061389a565b9150506129b5565b508381604051602001612b1e929190613ade565b604051602081830303815290604052945050505050919050565b606081612b7857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ba25780612b8c8161389a565b9150612b9b9050600a83613b4b565b9150612b7c565b60008167ffffffffffffffff811115612bbd57612bbd613455565b6040519080825280601f01601f191660200182016040528015612be7576020820181803683370190505b5090505b8415612c5257612bfc6001836138b5565b9150612c09600a86613b5f565b612c149060306138f4565b60f81b818381518110612c2957612c2961386e565b60200101906001600160f81b031916908160001a905350612c4b600a86613b4b565b9450612beb565b949350505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612cb357507f000000000000000000000000000000000000000000000000000000000000000046145b15612cdd57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600080825160411415612db85760208301516040840151606085015160001a612dac878285856130da565b94509450505050611391565b825160401415612de25760208301516040840151612dd78683836131c7565b935093505050611391565b50600090506002611391565b6000816004811115612e0257612e02613b73565b1415612e0b5750565b6001816004811115612e1f57612e1f613b73565b1415612e6d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610caf565b6002816004811115612e8157612e81613b73565b1415612ecf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610caf565b6003816004811115612ee357612ee3613b73565b1415612f3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610caf565b6004816004811115612f5057612f50613b73565b14156116de5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610caf565b6000612fbc826301ffc9a760e01b612fdc565b8015610b535750612fd5826001600160e01b0319612fdc565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090613058908690613b89565b6000604051808303818686fa925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506020815110156130b45760009350505050610b53565b8180156130d05750808060200190518101906130d09190613ba5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561311157506000905060036131be565b8460ff16601b1415801561312957508460ff16601c14155b1561313a57506000905060046131be565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561318e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131b7576000600192509250506131be565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816131fd60ff86901c601b6138f4565b905061156b878288856130da565b828054613217906139d2565b90600052602060002090601f016020900481019282613239576000855561327f565b82601f1061325257805160ff191683800117855561327f565b8280016001018555821561327f579182015b8281111561327f578251825591602001919060010190613264565b5061328b92915061328f565b5090565b5b8082111561328b5760008155600101613290565b6000602082840312156132b657600080fd5b81356001600160e01b0319811681146127fd57600080fd5b6000602082840312156132e057600080fd5b5035919050565b60005b838110156133025781810151838201526020016132ea565b83811115611a025750506000910152565b60208152600082518060208401526133328160408501602087016132e7565b601f01601f19169190910160400192915050565b6001600160a01b03811681146116de57600080fd5b6000806040838503121561336e57600080fd5b823561337981613346565b946020939093013593505050565b6000806040838503121561339a57600080fd5b50508035926020909101359150565b600080604083850312156133bc57600080fd5b82356001600160801b03811681146133d357600080fd5b9150602083013563ffffffff811681146133ec57600080fd5b809150509250929050565b60008060006060848603121561340c57600080fd5b833561341781613346565b9250602084013561342781613346565b929592945050506040919091013590565b60006020828403121561344a57600080fd5b81356127fd81613346565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349457613494613455565b604052919050565b600067ffffffffffffffff8211156134b6576134b6613455565b5060051b60200190565b600082601f8301126134d157600080fd5b813560206134e66134e18361349c565b61346b565b82815260059290921b8401810191818101908684111561350557600080fd5b8286015b848110156135205780358352918301918301613509565b509695505050505050565b6000806040838503121561353e57600080fd5b823567ffffffffffffffff8082111561355657600080fd5b818501915085601f83011261356a57600080fd5b8135602061357a6134e18361349c565b82815260059290921b8401810191818101908984111561359957600080fd5b948201945b838610156135c05785356135b181613346565b8252948201949082019061359e565b965050860135925050808211156135d657600080fd5b506135e3858286016134c0565b9150509250929050565b600067ffffffffffffffff83111561360757613607613455565b61361a601f8401601f191660200161346b565b905082815283838301111561362e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261365657600080fd5b6127fd838335602085016135ed565b60008060006060848603121561367a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561369f57600080fd5b6136ab86828701613645565b9150509250925092565b80151581146116de57600080fd5b600080604083850312156136d657600080fd5b82356136e181613346565b915060208301356133ec816136b5565b6000806020838503121561370457600080fd5b823567ffffffffffffffff8082111561371c57600080fd5b818501915085601f83011261373057600080fd5b81358181111561373f57600080fd5b8660208260051b850101111561375457600080fd5b60209290920196919550909350505050565b6000806000806080858703121561377c57600080fd5b843561378781613346565b9350602085013561379781613346565b925060408501359150606085013567ffffffffffffffff8111156137ba57600080fd5b6137c687828801613645565b91505092959194509250565b600080604083850312156137e557600080fd5b823561ffff8116811461337957600080fd5b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612c52848235602084016135ed565b6000806040838503121561385357600080fd5b823561385e81613346565b915060208301356133ec81613346565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156138ae576138ae613884565b5060010190565b6000828210156138c7576138c7613884565b500390565b600063ffffffff8083168185168083038211156138eb576138eb613884565b01949350505050565b6000821982111561390757613907613884565b500190565b600081600019048311821515161561392657613926613884565b500290565b600067ffffffffffffffff8381169083168181101561394c5761394c613884565b039392505050565b600067ffffffffffffffff8083168185168083038211156138eb576138eb613884565b600081516139898185602086016132e7565b9290920192915050565b600083516139a58184602088016132e7565b8351908301906139b98183602088016132e7565b64173539b7b760d91b9101908152600501949350505050565b600181811c908216806139e657607f821691505b60208210811415613a0757634e487b7160e01b600052602260045260246000fd5b50919050565b600080845481600182811c915080831680613a2957607f831692505b6020808410821415613a4957634e487b7160e01b86526022600452602486fd5b818015613a5d5760018114613a6e57613a9b565b60ff19861689528489019650613a9b565b60008b81526020902060005b86811015613a935781548b820152908501908301613a7a565b505084890196505b505050505050613abf613aae8286613977565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603160045260246000fd5b60008351613af08184602088016132e7565b835190830190613b048183602088016132e7565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613b5a57613b5a613b35565b500490565b600082613b6e57613b6e613b35565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251613b9b8184602087016132e7565b9190910192915050565b600060208284031215613bb757600080fd5b81516127fd816136b556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122030b5c2c5291e057fb89b67a2441651a65d1f8770a0eccbfdd6ec87d0c2a5c15664736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106103295760003560e01c80638da5cb5b116101a5578063d408234b116100ec578063eccec5a811610095578063f2fde38b1161006f578063f2fde38b146109f5578063f46eccc414610a15578063f76f8d7814610a42578063fd88fa6914610a7157600080fd5b8063eccec5a814610979578063efd0cbf9146109c2578063f0f44260146109d557600080fd5b8063db398744116100c6578063db398744146108fa578063e985e9c51461091a578063eab628421461096457600080fd5b8063d408234b146108af578063d5abeb01146108c4578063d6e5f5b8146108da57600080fd5b8063a3fd2c441161014e578063b88d4fde11610128578063b88d4fde1461084f578063c2eaa5391461086f578063c87b56dd1461088f57600080fd5b8063a3fd2c44146107c8578063aa767a8c1461081c578063b80f55c91461082f57600080fd5b8063971a90911161017f578063971a90911461073e578063a22cb4651461075f578063a3f4df7e1461077f57600080fd5b80638da5cb5b146106d457806393055614146106f257806395d89b411461071257600080fd5b806342842e0e116102745780636c19e7831161021d57806370a08231116101f757806370a0823114610633578063715018a61461066a5780637c88e3d91461067f5780637d5dea17146106b457600080fd5b80636c19e783146105de5780636f8b44b0146105fe5780636ff861621461061e57600080fd5b80634f6ccce71161024e5780634f6ccce71461057f57806361d027b31461059d5780636352211e146105be57600080fd5b806342842e0e146104f15780634aa23021146105315780634f558e791461055f57600080fd5b806318160ddd116102d6578063238ac933116102b0578063238ac933146104d057806323b872dd146104f15780632f745c591461051157600080fd5b806318160ddd1461047b578063199d0819146104905780631eb92fed146104b057600080fd5b806306fdde031161030757806306fdde03146103d2578063081812fc14610421578063095ea7b31461045957600080fd5b806301ffc9a71461032e57806304b1b2c21461036357806306c2e4e4146103a4575b600080fd5b34801561033a57600080fd5b5061034e6103493660046132a4565b610aa1565b60405190151581526020015b60405180910390f35b34801561036f57600080fd5b5061038361037e3660046132ce565b610b59565b6040805167ffffffffffffffff93841681529290911660208301520161035a565b3480156103b057600080fd5b506103c46103bf3660046132ce565b610b95565b60405190815260200161035a565b3480156103de57600080fd5b5060408051808201909152601481527f416476656e747572657273204f6620457468657200000000000000000000000060208201525b60405161035a9190613313565b34801561042d57600080fd5b5061044161043c3660046132ce565b610c5c565b6040516001600160a01b03909116815260200161035a565b34801561046557600080fd5b5061047961047436600461335b565b610cd5565b005b34801561048757600080fd5b506103c4610e7d565b34801561049c57600080fd5b506104796104ab366004613387565b610e94565b3480156104bc57600080fd5b506104796104cb3660046133a9565b610f01565b3480156104dc57600080fd5b5061177a54610441906001600160a01b031681565b3480156104fd57600080fd5b5061047961050c3660046133f7565b610faf565b34801561051d57600080fd5b506103c461052c36600461335b565b610fcf565b34801561053d57600080fd5b506103c461054c366004613438565b61177b6020526000908152604090205481565b34801561056b57600080fd5b5061034e61057a3660046132ce565b61104a565b34801561058b57600080fd5b506103c461059a3660046132ce565b90565b3480156105a957600080fd5b5061178154610441906001600160a01b031681565b3480156105ca57600080fd5b506104416105d93660046132ce565b611099565b3480156105ea57600080fd5b506104796105f9366004613438565b611115565b34801561060a57600080fd5b506104796106193660046132ce565b611180565b34801561062a57600080fd5b5061047961121e565b34801561063f57600080fd5b506103c461064e366004613438565b6001600160a01b03166000908152611776602052604090205490565b34801561067657600080fd5b506104796112e3565b34801561068b57600080fd5b5061069f61069a36600461352b565b611337565b6040805192835260208301919091520161035a565b3480156106c057600080fd5b5061069f6106cf366004613665565b611398565b3480156106e057600080fd5b506000546001600160a01b0316610441565b3480156106fe57600080fd5b5061047961070d366004613438565b611579565b34801561071e57600080fd5b506040805180820190915260038152624b4f4560e81b6020820152610414565b34801561074a57600080fd5b5061177c54610441906001600160a01b031681565b34801561076b57600080fd5b5061047961077a3660046136c3565b6116e1565b34801561078b57600080fd5b506104146040518060400160405280601481526020017f416476656e747572657273204f6620457468657200000000000000000000000081525081565b3480156107d457600080fd5b50611779546107f8906001600160801b03811690600160801b900463ffffffff1682565b604080516001600160801b03909316835263ffffffff90911660208301520161035a565b61069f61082a366004613387565b6117a7565b34801561083b57600080fd5b5061047961084a3660046136f1565b6119a0565b34801561085b57600080fd5b5061047961086a366004613766565b6119f6565b34801561087b57600080fd5b5061047961088a3660046137d2565b611a08565b34801561089b57600080fd5b506104146108aa3660046132ce565b611bbd565b3480156108bb57600080fd5b50610479611c7e565b3480156108d057600080fd5b506103c460015481565b3480156108e657600080fd5b506104796108f53660046137f7565b611d2d565b34801561090657600080fd5b506104796109153660046133a9565b611d89565b34801561092657600080fd5b5061034e610935366004613840565b6001600160a01b0391821660009081526117786020908152604080832093909416825291909152205460ff1690565b34801561097057600080fd5b50610414611e3b565b34801561098557600080fd5b506104146040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61069f6109d03660046132ce565b611eca565b3480156109e157600080fd5b506104796109f0366004613438565b61201a565b348015610a0157600080fd5b50610479610a10366004613438565b612085565b348015610a2157600080fd5b506103c4610a30366004613438565b60046020526000908152604090205481565b348015610a4e57600080fd5b50610414604051806040016040528060038152602001624b4f4560e81b81525081565b348015610a7d57600080fd5b5061177d546107f8906001600160801b03811690600160801b900463ffffffff1682565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b3857506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610b5357506001600160e01b031982166301ffc9a760e01b145b92915050565b61177f8181548110610b6a57600080fd5b60009182526020909120015467ffffffffffffffff8082169250680100000000000000009091041682565b6000805b61177f54811015610c5357600061177f8281548110610bba57610bba61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff808216808452680100000000000000009092041692820192909252915084118015610c135750806020015167ffffffffffffffff1684105b15610c405761177e8281548110610c2c57610c2c61386e565b906000526020600020015492505050919050565b5080610c4b8161389a565b915050610b99565b50600092915050565b6000610c678261104a565b610cb85760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e00000000000060448201526064015b60405180910390fd5b50600090815261177760205260409020546001600160a01b031690565b6000610ce082611099565b9050610ceb8261104a565b610d375760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b826001600160a01b0316816001600160a01b03161415610d995760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336001600160a01b0382161480610dd457506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b610e205760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b6000828152611777602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000600354600254610e8f91906138b5565b905090565b6000546001600160a01b03163314610edc5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b8061177e8381548110610ef157610ef161386e565b6000918252602090912001555050565b6000546001600160a01b03163314610f495760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b63ffffffff811615610f6357610f606001826138cc565b90505b604080518082019091526001600160801b0390921680835263ffffffff90911660209092018290526117798054600160801b9093026001600160a01b0319909316909117919091179055565b610fca83838360405180602001604052806000815250612152565b505050565b60008060015b60025481101561103f57846001600160a01b03166005826117718110610ffd57610ffd61386e565b01546001600160a01b0316141561102d578382141561101f579150610b539050565b61102a6001836138f4565b91505b6110386001826138f4565b9050610fd5565b506000949350505050565b600081600254600161105c91906138f4565b1180156110695750600082115b8015610b535750600060058361177181106110865761108661386e565b01546001600160a01b0316141592915050565b60006110a48261104a565b6110f05760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a206e6f6e6578697374656e7420746f6b656e0000000000006044820152606401610caf565b60058261177181106111045761110461386e565b01546001600160a01b031692915050565b6000546001600160a01b0316331461115d5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177a80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146111c85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177181106112195760405162461bcd60e51b815260206004820152601360248201527f6d617820737570706c79206578636565646564000000000000000000000000006044820152606401610caf565b600155565b611781546001600160a01b03166112775760405162461bcd60e51b815260206004820152601560248201527f7a65726f207472656173757279206164647265737300000000000000000000006044820152606401610caf565b61178160009054906101000a90046001600160a01b03166001600160a01b031663a639ad79476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156112c857600080fd5b505af11580156112dc573d6000803e3d6000fd5b5050505050565b6000546001600160a01b0316331461132b5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b611335600061239d565b565b6000805481906001600160a01b031633146113825760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61138c84846123ed565b915091505b9250929050565b61177a5460009081906001600160a01b03166113f65760405162461bcd60e51b815260206004820181905260248201527f6569702d3731323a2077686974656c697374206d696e742064697361626c65646044820152606401610caf565b604080517f64a830c71be714ed4ca944cf759cc2c89f283e211e10da9c9b9142b13722422b602082015233918101919091526060810185905260009061145490608001604051602081830303815290604052805190602001206125e3565b61177a549091506001600160a01b031661146e828661264c565b6001600160a01b0316146114c45760405162461bcd60e51b815260206004820152601a60248201527f6569702d3731323a20696e76616c6964207369676e61747572650000000000006044820152606401610caf565b33600090815261177b60205260408120546114e08760016138f4565b6114ea91906138b5565b905080871061153b5760405162461bcd60e51b815260206004820152601660248201527f6569702d3731323a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b33600090815261177b60205260408120805489929061155b9084906138f4565b9091555061156b90503388612670565b935093505050935093915050565b6000546001600160a01b031633146115c15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b038116158061160557506116056001600160a01b0382167fd9b67a26000000000000000000000000000000000000000000000000000000006127e1565b6116515760405162461bcd60e51b815260206004820152601c60248201527f70726573616c653a2030206f722076616c6964204945524331313535000000006044820152606401610caf565b61177c80546001600160a01b0319166001600160a01b038316908117909155156116de57806001600160a01b031663a22cb4656116966000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260016024820152604401600060405180830381600087803b1580156112c857600080fd5b50565b336001600160a01b038316141561173a5760405162461bcd60e51b815260206004820152601a60248201527f6572632d3732313a20617070726f766520746f2063616c6c65720000000000006044820152606401610caf565b336000818152611778602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61177c5460009081906001600160a01b03166118055760405162461bcd60e51b815260206004820152601160248201527f70726573616c653a2064697361626c65640000000000000000000000000000006044820152606401610caf565b6040805180820190915261177d546001600160801b038116808352600160801b90910463ffffffff16602083015261183e90869061390c565b341461188c5760405162461bcd60e51b815260206004820152601f60248201527f70726573616c653a20696e76616c6964207061796d656e7420616d6f756e74006044820152606401610caf565b6000851180156118a55750806020015163ffffffff1685105b6118f15760405162461bcd60e51b815260206004820152601660248201527f70726573616c653a20696e76616c696420636f756e74000000000000000000006044820152606401610caf565b61177c546040517ff242432a000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018690526001606482015260a06084820152600060a48201526001600160a01b039091169063f242432a9060c401600060405180830381600087803b15801561197257600080fd5b505af1158015611986573d6000803e3d6000fd5b505050506119943386612670565b92509250509250929050565b6000546001600160a01b031633146119e85760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6119f28282612804565b5050565b611a0284848484612152565b50505050565b6000546001600160a01b03163314611a505760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f5460408051808201909152600080825260208201528115611ace5761177f611a7c6001846138b5565b81548110611a8c57611a8c61386e565b60009182526020918290206040805180820190915291015467ffffffffffffffff80821683526801000000000000000090910416918101919091529050611ae5565b506040805180820190915260008152600160208201525b61177f604051806040016040528060018460200151611b04919061392b565b67ffffffffffffffff1681526020018661ffff168460200151611b279190613954565b67ffffffffffffffff908116909152825460018181018555600094855260208086208551930180549190950151841668010000000000000000026fffffffffffffffffffffffffffffffff1990911692909316919091179190911790915561177e805491820181559091527f7fe79683751d9389eb55419939a813586ee3a6ec5f91165868f6441cbaaf9b1c0192909255505050565b6060611bc88261104a565b611c145760405162461bcd60e51b815260206004820152601960248201527f6572633732313a206e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610caf565b6000611c1f83610b95565b90508015611c6157611c3081612929565b611c3984612b38565b604051602001611c4a929190613993565b604051602081830303815290604052915050919050565b611780611c6d84612b38565b604051602001611c4a929190613a0d565b6000546001600160a01b03163314611cc65760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61177f805480611cd857611cd8613ac8565b600082815260209020810160001990810180546fffffffffffffffffffffffffffffffff1916905501905561177e805480611d1557611d15613ac8565b60019003818190600052602060002001600090559055565b6000546001600160a01b03163314611d755760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b80516119f29061178090602084019061320b565b6000546001600160a01b03163314611dd15760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6040518060400160405280836001600160801b03168152602001826001611df891906138cc565b63ffffffff908116909152815161177d8054602090940151909216600160801b026001600160a01b03199093166001600160801b03909116179190911790555050565b6117808054611e49906139d2565b80601f0160208091040260200160405190810160405280929190818152602001828054611e75906139d2565b8015611ec25780601f10611e9757610100808354040283529160200191611ec2565b820191906000526020600020905b815481529060010190602001808311611ea557829003601f168201915b505050505081565b60408051808201909152611779546001600160801b0381168252600160801b900463ffffffff16602082018190526000918291611f495760405162461bcd60e51b815260206004820152601460248201527f7075626c696373616c653a2064697361626c65640000000000000000000000006044820152606401610caf565b8051611f5f9085906001600160801b031661390c565b3414611fad5760405162461bcd60e51b815260206004820152601a60248201527f7075626c696373616c653a207061796d656e7420616d6f756e740000000000006044820152606401610caf565b806020015163ffffffff1684106120065760405162461bcd60e51b815260206004820152601960248201527f7075626c696373616c653a20696e76616c696420636f756e74000000000000006044820152606401610caf565b6120103385612670565b9250925050915091565b6000546001600160a01b031633146120625760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b61178180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120cd5760405162461bcd60e51b81526020600482018190526024820152600080516020613bc38339815191526044820152606401610caf565b6001600160a01b0381166121495760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610caf565b6116de8161239d565b600061215d83611099565b9050336001600160a01b038216148061218657503361217b84610c5c565b6001600160a01b0316145b806121b557506001600160a01b03811660009081526117786020908152604080832033845290915290205460ff165b6122015760405162461bcd60e51b815260206004820152601f60248201527f6572632d3732313a206e6f74206f776e6572206e6f7220617070726f766564006044820152606401610caf565b846001600160a01b0316816001600160a01b0316146122625760405162461bcd60e51b815260206004820152601260248201527f6572632d3732313a206e6f74206f776e657200000000000000000000000000006044820152606401610caf565b6001600160a01b0384166122b85760405162461bcd60e51b815260206004820152600c60248201527f7a65726f206164647265737300000000000000000000000000000000000000006044820152606401610caf565b60008381526117776020526040902080546001600160a01b03191690558360058461177181106122ea576122ea61386e565b0180546001600160a01b0319166001600160a01b0392831617905585166000908152611776602052604081208054600192906123279084906138b5565b90915550506001600160a01b0384166000908152611776602052604081208054600192906123569084906138f4565b909155505060405183906001600160a01b0380871691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008082518451146124415760405162461bcd60e51b815260206004820152601660248201527f6172726179206c656e67746873206d69736d61746368000000000000000000006044820152606401610caf565b6002546000805b865181101561256d5760008682815181106124655761246561386e565b6020026020010151905060008883815181106124835761248361386e565b60200260200101519050818461249991906138f4565b6001600160a01b038216600090815261177660205260408120805492965084929091906124c79084906138f4565b90915550600090505b8281101561255757856124e28161389a565b9650508160058761177181106124fa576124fa61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405187918416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061254f8161389a565b9150506124d0565b50505080806125659061389a565b915050612448565b5060015461257b82846138f4565b106125c85760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60028290556125d781836138b5565b96919550909350505050565b6000610b536125f0612c5a565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061265b8585612d81565b9150915061266881612dee565b509392505050565b600080600060025490506001546001858361268b91906138f4565b61269591906138b5565b106126e25760405162461bcd60e51b815260206004820152600f60248201527f746f6b656e7320617265206f76657200000000000000000000000000000000006044820152606401610caf565b60005b8481101561276c57816126f78161389a565b92505085600583611771811061270f5761270f61386e565b0180546001600160a01b0319166001600160a01b0392831617905560405183918816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4806127648161389a565b9150506126e5565b506001600160a01b038516600090815260046020526040812080548692906127959084906138f4565b90915550506001600160a01b03851660009081526117766020526040812080548692906127c39084906138f4565b909155505060028190556127d784826138b5565b9590945092505050565b60006127ec83612fa9565b80156127fd57506127fd8383612fdc565b9392505050565b6000805b8281101561290c5760008484838181106128245761282461386e565b905060200201359050600060058261177181106128435761284361386e565b01546001600160a01b0316905080156128f757836128608161389a565b6001600160a01b0383166000908152611776602052604081208054929750600193509161288e9084906138b5565b909155506000905060058361177181106128aa576128aa61386e565b0180546001600160a01b0319166001600160a01b039283161790556040518391600091908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b505080806129049061389a565b915050612808565b50806003600082825461291f91906138f4565b9091555050505050565b60408051808201825260108082527f697066733a2f2f66303137303132323000000000000000000000000000000000602080840191909152835180850185529182527f3031323334353637383961626364656600000000000000000000000000000000908201528251838152606081810185529385929160009160208201818036833701905050905060005b6020811015612b0a57600060048583602081106129d4576129d461386e565b1a60f81b6001600160f81b031916901c9050838160f81c60ff16815181106129fe576129fe61386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683612a3184600261390c565b81518110612a4157612a4161386e565b60200101906001600160f81b031916908160001a9053506000858360208110612a6c57612a6c61386e565b1a60f81b600f60f81b169050848160f81c60ff1681518110612a9057612a9061386e565b01602001517fff000000000000000000000000000000000000000000000000000000000000001684612ac385600261390c565b612ace9060016138f4565b81518110612ade57612ade61386e565b60200101906001600160f81b031916908160001a90535050508080612b029061389a565b9150506129b5565b508381604051602001612b1e929190613ade565b604051602081830303815290604052945050505050919050565b606081612b7857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612ba25780612b8c8161389a565b9150612b9b9050600a83613b4b565b9150612b7c565b60008167ffffffffffffffff811115612bbd57612bbd613455565b6040519080825280601f01601f191660200182016040528015612be7576020820181803683370190505b5090505b8415612c5257612bfc6001836138b5565b9150612c09600a86613b5f565b612c149060306138f4565b60f81b818381518110612c2957612c2961386e565b60200101906001600160f81b031916908160001a905350612c4b600a86613b4b565b9450612beb565b949350505050565b6000306001600160a01b037f00000000000000000000000000139fdd8f2bb8b4376aab2435c44981ec34e7e016148015612cb357507f000000000000000000000000000000000000000000000000000000000000000146145b15612cdd57507f65eab696f8bba8a5dd96aab5035144830aa175b4a165bcd3132c048a1864cb8290565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527f210e8c19e84b01767842872981056328a7f24ee00c97f14a515075965321b604828401527f06c015bd22b4c69690933c1058878ebdfef31f9aaae40bbe86d8a09fe1b2972c60608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600080825160411415612db85760208301516040840151606085015160001a612dac878285856130da565b94509450505050611391565b825160401415612de25760208301516040840151612dd78683836131c7565b935093505050611391565b50600090506002611391565b6000816004811115612e0257612e02613b73565b1415612e0b5750565b6001816004811115612e1f57612e1f613b73565b1415612e6d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610caf565b6002816004811115612e8157612e81613b73565b1415612ecf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610caf565b6003816004811115612ee357612ee3613b73565b1415612f3c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610caf565b6004816004811115612f5057612f50613b73565b14156116de5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610caf565b6000612fbc826301ffc9a760e01b612fdc565b8015610b535750612fd5826001600160e01b0319612fdc565b1592915050565b604080516001600160e01b0319831660248083019190915282518083039091018152604490910182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b179052905160009190829081906001600160a01b0387169061753090613058908690613b89565b6000604051808303818686fa925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b50915091506020815110156130b45760009350505050610b53565b8180156130d05750808060200190518101906130d09190613ba5565b9695505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561311157506000905060036131be565b8460ff16601b1415801561312957508460ff16601c14155b1561313a57506000905060046131be565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561318e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131b7576000600192509250506131be565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316816131fd60ff86901c601b6138f4565b905061156b878288856130da565b828054613217906139d2565b90600052602060002090601f016020900481019282613239576000855561327f565b82601f1061325257805160ff191683800117855561327f565b8280016001018555821561327f579182015b8281111561327f578251825591602001919060010190613264565b5061328b92915061328f565b5090565b5b8082111561328b5760008155600101613290565b6000602082840312156132b657600080fd5b81356001600160e01b0319811681146127fd57600080fd5b6000602082840312156132e057600080fd5b5035919050565b60005b838110156133025781810151838201526020016132ea565b83811115611a025750506000910152565b60208152600082518060208401526133328160408501602087016132e7565b601f01601f19169190910160400192915050565b6001600160a01b03811681146116de57600080fd5b6000806040838503121561336e57600080fd5b823561337981613346565b946020939093013593505050565b6000806040838503121561339a57600080fd5b50508035926020909101359150565b600080604083850312156133bc57600080fd5b82356001600160801b03811681146133d357600080fd5b9150602083013563ffffffff811681146133ec57600080fd5b809150509250929050565b60008060006060848603121561340c57600080fd5b833561341781613346565b9250602084013561342781613346565b929592945050506040919091013590565b60006020828403121561344a57600080fd5b81356127fd81613346565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561349457613494613455565b604052919050565b600067ffffffffffffffff8211156134b6576134b6613455565b5060051b60200190565b600082601f8301126134d157600080fd5b813560206134e66134e18361349c565b61346b565b82815260059290921b8401810191818101908684111561350557600080fd5b8286015b848110156135205780358352918301918301613509565b509695505050505050565b6000806040838503121561353e57600080fd5b823567ffffffffffffffff8082111561355657600080fd5b818501915085601f83011261356a57600080fd5b8135602061357a6134e18361349c565b82815260059290921b8401810191818101908984111561359957600080fd5b948201945b838610156135c05785356135b181613346565b8252948201949082019061359e565b965050860135925050808211156135d657600080fd5b506135e3858286016134c0565b9150509250929050565b600067ffffffffffffffff83111561360757613607613455565b61361a601f8401601f191660200161346b565b905082815283838301111561362e57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261365657600080fd5b6127fd838335602085016135ed565b60008060006060848603121561367a57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561369f57600080fd5b6136ab86828701613645565b9150509250925092565b80151581146116de57600080fd5b600080604083850312156136d657600080fd5b82356136e181613346565b915060208301356133ec816136b5565b6000806020838503121561370457600080fd5b823567ffffffffffffffff8082111561371c57600080fd5b818501915085601f83011261373057600080fd5b81358181111561373f57600080fd5b8660208260051b850101111561375457600080fd5b60209290920196919550909350505050565b6000806000806080858703121561377c57600080fd5b843561378781613346565b9350602085013561379781613346565b925060408501359150606085013567ffffffffffffffff8111156137ba57600080fd5b6137c687828801613645565b91505092959194509250565b600080604083850312156137e557600080fd5b823561ffff8116811461337957600080fd5b60006020828403121561380957600080fd5b813567ffffffffffffffff81111561382057600080fd5b8201601f8101841361383157600080fd5b612c52848235602084016135ed565b6000806040838503121561385357600080fd5b823561385e81613346565b915060208301356133ec81613346565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156138ae576138ae613884565b5060010190565b6000828210156138c7576138c7613884565b500390565b600063ffffffff8083168185168083038211156138eb576138eb613884565b01949350505050565b6000821982111561390757613907613884565b500190565b600081600019048311821515161561392657613926613884565b500290565b600067ffffffffffffffff8381169083168181101561394c5761394c613884565b039392505050565b600067ffffffffffffffff8083168185168083038211156138eb576138eb613884565b600081516139898185602086016132e7565b9290920192915050565b600083516139a58184602088016132e7565b8351908301906139b98183602088016132e7565b64173539b7b760d91b9101908152600501949350505050565b600181811c908216806139e657607f821691505b60208210811415613a0757634e487b7160e01b600052602260045260246000fd5b50919050565b600080845481600182811c915080831680613a2957607f831692505b6020808410821415613a4957634e487b7160e01b86526022600452602486fd5b818015613a5d5760018114613a6e57613a9b565b60ff19861689528489019650613a9b565b60008b81526020902060005b86811015613a935781548b820152908501908301613a7a565b505084890196505b505050505050613abf613aae8286613977565b64173539b7b760d91b815260050190565b95945050505050565b634e487b7160e01b600052603160045260246000fd5b60008351613af08184602088016132e7565b835190830190613b048183602088016132e7565b7f2f000000000000000000000000000000000000000000000000000000000000009101908152600101949350505050565b634e487b7160e01b600052601260045260246000fd5b600082613b5a57613b5a613b35565b500490565b600082613b6e57613b6e613b35565b500690565b634e487b7160e01b600052602160045260246000fd5b60008251613b9b8184602087016132e7565b9190910192915050565b600060208284031215613bb757600080fd5b81516127fd816136b556fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122030b5c2c5291e057fb89b67a2441651a65d1f8770a0eccbfdd6ec87d0c2a5c15664736f6c634300080b0033
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.