@settlemint/solidity-token-erc721a
Version:
Smart contract set to build an ERC721a token in SettleMint
795 lines • 62.4 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "ExampleERC721a",
"sourceName": "contracts/ExampleERC721a.sol",
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "symbol_",
"type": "string"
},
{
"internalType": "string",
"name": "baseTokenURI_",
"type": "string"
},
{
"internalType": "address payable",
"name": "wallet_",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "ApprovalCallerNotOwnerNorApproved",
"type": "error"
},
{
"inputs": [],
"name": "ApprovalQueryForNonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "BalanceQueryForZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "MintERC2309QuantityExceedsLimit",
"type": "error"
},
{
"inputs": [],
"name": "MintToZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "MintZeroQuantity",
"type": "error"
},
{
"inputs": [],
"name": "NotCompatibleWithSpotMints",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "OwnableInvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "OwnableUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "OwnerQueryForNonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "OwnershipNotInitializedForExtraData",
"type": "error"
},
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"type": "error"
},
{
"inputs": [],
"name": "SequentialMintExceedsLimit",
"type": "error"
},
{
"inputs": [],
"name": "SequentialUpToTooSmall",
"type": "error"
},
{
"inputs": [],
"name": "SpotMintTokenIdTooSmall",
"type": "error"
},
{
"inputs": [],
"name": "TokenAlreadyExists",
"type": "error"
},
{
"inputs": [],
"name": "TransferCallerNotOwnerNorApproved",
"type": "error"
},
{
"inputs": [],
"name": "TransferFromIncorrectOwner",
"type": "error"
},
{
"inputs": [],
"name": "TransferToNonERC721ReceiverImplementer",
"type": "error"
},
{
"inputs": [],
"name": "TransferToZeroAddress",
"type": "error"
},
{
"inputs": [],
"name": "URIQueryForNonexistentToken",
"type": "error"
},
{
"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": "uint256",
"name": "fromTokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "toTokenId",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "ConsecutiveTransfer",
"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": "MAX_PER_TX",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PRICE_IN_WEI_PUBLIC",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PRICE_IN_WEI_WHITELIST",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "RESERVES",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_whiteListMerkleRoot",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "collectReserves",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "disableWhitelistMerkleRoot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "allowance",
"type": "string"
},
{
"internalType": "bytes32[]",
"name": "proof",
"type": "bytes32[]"
}
],
"name": "getAllowance",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "recipients_",
"type": "address[]"
}
],
"name": "gift",
"outputs": [],
"stateMutability": "nonpayable",
"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": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "count",
"type": "uint256"
}
],
"name": "publicMint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"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": "payable",
"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": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "baseTokenURI_",
"type": "string"
}
],
"name": "setBaseURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "whitelistMerkleRoot_",
"type": "bytes32"
}
],
"name": "setWhitelistMerkleRoot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "startPublicSale",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "result",
"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": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "wallet",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "count",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "allowance",
"type": "uint256"
},
{
"internalType": "bytes32[]",
"name": "proof",
"type": "bytes32[]"
}
],
"name": "whitelistMint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "withdraw",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60a0604052346100cd57612fb780380380610019816100e8565b92833981016080828203126100cd5781516001600160401b0381116100cd5781610044918401610112565b60208301519092906001600160401b0381116100cd5782610066918301610112565b60408201519092906001600160401b0381116100cd5760609161008a918401610112565b910151916001600160a01b03831683036100cd576100a793610424565b604051612a0d90816105aa82396080518181816103df01528181610c0e0152610c9e0152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761010d57604052565b6100d2565b81601f820112156100cd578051906001600160401b03821161010d57610141601f8301601f19166020016100e8565b92828452602083830101116100cd5760005b82811061016857505060206000918301015290565b80602080928401015182828701015201610153565b90600182811c921680156101ad575b602083101461019757565b634e487b7160e01b600052602260045260246000fd5b91607f169161018c565b601f81116101c3575050565b60026000526020600020906020601f840160051c83019310610200575b601f0160051c01905b8181106101f4575050565b600081556001016101e9565b90915081906101e0565b601f821161021757505050565b6000526020600020906020601f840160051c83019310610252575b601f0160051c01905b818110610246575050565b6000815560010161023b565b9091508190610232565b80519091906001600160401b03811161010d576102858161027e60035461017d565b600361020a565b602092601f82116001146102c7576102b7929382916000926102bc575b50508160011b916000199060031b1c19161790565b600355565b0151905038806102a2565b6003600052601f198216937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9160005b86811061032e5750836001959610610315575b505050811b01600355565b015160001960f88460031b161c1916905538808061030a565b919260206001819286850151815501940192016102f7565b80519091906001600160401b03811161010d5761036f81610368600c5461017d565b600c61020a565b602092601f82116001146103a5576103a0929382916000926102bc5750508160011b916000199060031b1c19161790565b600c55565b600c600052601f198216937fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79160005b86811061040c57508360019596106103f3575b505050811b01600c55565b015160001960f88460031b161c191690553880806103e8565b919260206001819286850151815501940192016103d5565b8051906001600160401b03821161010d576104498261044460025461017d565b6101b7565b602090601f83116001146104d657918061047e9261048695946000926102bc5750508160011b916000199060031b1c19161790565b60025561025c565b6000805533156104c0576104bb9061049d33610560565b6104a76001600b55565b6104b660ff19600e5416600e55565b610346565b608052565b631e4fbdf760e01b600090815260045260246000fd5b6002600052601f19831691907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9260005b81811061054857509160019391856104869796941061052f575b505050811b0160025561025c565b015160001960f88460031b161c19169055388080610521565b92936020600181928786015181550195019301610507565b600a80546001600160a01b039283166001600160a01b0319821681179092559091167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a356fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610232578063029877b61461022d578063041fa44e1461022857806306fdde0314610223578063081812fc1461021e5780630922f9c514610197578063095ea7b3146102195780630c1c972a14610214578063163e1e611461020f57806318160ddd1461020a57806323b872dd146102055780632db115441461020057806332cb6b0c146101fb5780633ccfd60b146101f657806342842e0e146101f1578063521eb273146101ec57806355f804b3146101e75780636352211e146101e257806366fddfa9146101dd57806370a08231146101d8578063715018a6146101d35780637ad7614d146101ce5780638da5cb5b146101c957806395d89b41146101c4578063a22cb465146101bf578063b4402979146101ba578063b88d4fde146101b5578063bd32fb66146101b0578063c4be5b59146101ab578063c87b56dd146101a6578063e985e9c5146101a1578063f2fde38b1461019c578063f43a22dc146101975763fbd9b92d1461019257600080fd5b611961565b6107a9565b611889565b611805565b611638565b6113cb565b6113aa565b611347565b611327565b611254565b6111ab565b611177565b611155565b6110d5565b611050565b610ede565b610ea2565b610d87565b610c71565b610c4c565b610bd0565b610bb4565b610ace565b610aba565b610a6b565b61097e565b610902565b6107e3565b61072f565b610637565b6105bd565b6103a8565b610266565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361026157565b600080fd5b346102615760206003193601126102615761030560043561028681610237565b7fffffffff000000000000000000000000000000000000000000000000000000008116907f0e08307600000000000000000000000000000000000000000000000000000000821491821561037e575b8215610354575b8215610343575b8215610319575b508115610309575b5060405190151581529081906020820190565b0390f35b61031391506120bf565b386102f2565b7f2baae9fd00000000000000000000000000000000000000000000000000000000149150386102ea565b915061034e816120bf565b916102e3565b7f62e27be700000000000000000000000000000000000000000000000000000000811492506102dc565b7fc21b8f2800000000000000000000000000000000000000000000000000000000811492506102d5565b34610261576000600319360112610261576103c1612167565b60005461055f5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600060405190610410602083610cf1565b8082525473ffffffffffffffffffffffffffffffffffffffff83164260a01b17610444826000526004602052604060002090565b5561046f8373ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b68050000000000000005815401905573ffffffffffffffffffffffffffffffffffffffff831691821561055a5760058201919360015b156104d9575b60008585827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a46104a5565b93600101938285036104ab5782600055803b6104f157005b600054907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb82019160015b15610545575b600061053a610536866001870196866127bc565b1590565b1561051c575b611f8e565b80831061052257925050506000540361026157005b6125a0565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f526573657276657320616c726561647920636f6c6c65637465640000000000006044820152fd5b34610261576000600319360112610261576020600954604051908152f35b60005b8381106105ee5750506000910152565b81810151838201526020016105de565b90601f19601f60209361061c815180928187528780880191016105db565b0116010190565b9060206106349281815201906105fe565b90565b3461026157600060031936011261026157604051600060025461065981611983565b80845290600181169081156106ed575060011461068d575b6103058361068181850382610cf1565b60405191829182610623565b91905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace916000905b8082106106d357509091508101602001610681610671565b9192600181602092548385880101520191019092916106bb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b840190910191506106819050610671565b346102615760206003193601126102615760043561074c81612471565b1561077f576000526006602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b7fcf4700e40000000000000000000000000000000000000000000000000000000060005260046000fd5b3461026157600060031936011261026157602060405160058152f35b73ffffffffffffffffffffffffffffffffffffffff81160361026157565b6040600319360112610261576004356107fb816107c5565b6024359073ffffffffffffffffffffffffffffffffffffffff61081d836125f4565b16908133036108be575b8061089573ffffffffffffffffffffffffffffffffffffffff92610855866000526006602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b81600052600760205260ff6108f73360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416610827576124ce565b346102615760006003193601126102615761091b612167565b6000600955600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b9181601f840112156102615782359167ffffffffffffffff8311610261576020808501948460051b01011161026157565b346102615760206003193601126102615760043567ffffffffffffffff8111610261576109af90369060040161094d565b6109b7612167565b6109c460005415156119d6565b600054818101809111610a6657606f10610a085760005b8181106109e457005b80610a026109fd6109f86001948688611a77565b611ab6565b6121b6565b016109db565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f45786365646573206d617820737570706c7900000000000000000000000000006044820152fd5b611a3b565b346102615760006003193601126102615760206000546001549003604051908152f35b600319606091011261026157600435610aa6816107c5565b90602435610ab3816107c5565b9060443590565b610acc610ac636610a8e565b91611ac0565b005b602060031936011261026157600435610ae56126c0565b610af160095415611d2b565b610aff60ff600e5416611d2b565b610b0c60005415156119d6565b600054818101809111610a6657606f610b26911115611d90565b6005811015610b565780610b46610b3f610b4c93611df5565b3414611e39565b33612318565b610acc6001600b55565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45786365656473206d617820706572207472616e73616374696f6e00000000006044820152fd5b34610261576000600319360112610261576020604051606f8152f35b3461026157600060031936011261026157610be9612167565b600080808047818115610c43575b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690f115610c3757005b6040513d6000823e3d90fd5b506108fc610bf7565b610acc610c5836610a8e565b9060405192610c68602085610cf1565b60008452611f5c565b3461026157600060031936011261026157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff821117610d1457604052565b610cc2565b67ffffffffffffffff8111610d1457601f01601f191660200190565b929192610d4182610d19565b91610d4f6040519384610cf1565b829481845281830111610261578281602093846000960137010152565b9080601f830112156102615781602061063493359101610d35565b346102615760206003193601126102615760043567ffffffffffffffff811161026157610db8903690600401610d6c565b610dc0612167565b805167ffffffffffffffff8111610d1457610de581610de0600c54611983565b611eb3565b602091601f8211600114610e2457610e149260009183610e19575b50506000198260011b9260031b1c19161790565b600c55005b015190503880610e00565b600c600052601f198216927fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79160005b858110610e8a57508360019510610e71575b505050811b01600c55005b015160001960f88460031b161c19169055388080610e66565b91926020600181928685015181550194019201610e54565b3461026157602060031936011261026157602073ffffffffffffffffffffffffffffffffffffffff610ed56004356125f4565b16604051908152f35b346102615760406003193601126102615760043567ffffffffffffffff811161026157610f0f903690600401610d6c565b60243567ffffffffffffffff811161026157610f32610f4691369060040161094d565b9190610f3e84336126fb565b923691611f06565b906009548015610ff257610f599261290b565b15610f6e576103059060405191829182610623565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f57686974656c697374206d65726b6c6520726f6f74206e6f74207365740000006044820152fd5b346102615760206003193601126102615773ffffffffffffffffffffffffffffffffffffffff600435611082816107c5565b1680156110ab576000526005602052602067ffffffffffffffff60406000205416604051908152f35b7f8f4eb6040000000000000000000000000000000000000000000000000000000060005260046000fd5b34610261576000600319360112610261576110ee612167565b600073ffffffffffffffffffffffffffffffffffffffff600a547fffffffffffffffffffffffff00000000000000000000000000000000000000008116600a55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102615760006003193601126102615760206040516618838370f340008152f35b3461026157600060031936011261026157602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b346102615760006003193601126102615760405160006003546111cd81611983565b80845290600181169081156106ed57506001146111f4576103058361068181850382610cf1565b91905060036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b916000905b80821061123a57509091508101602001610681610671565b919260018160209254838588010152019101909291611222565b3461026157604060031936011261026157600435611271816107c5565b602435908115158092036102615773ffffffffffffffffffffffffffffffffffffffff903360005260076020526112cc8160406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff851617905560405192835216907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b3461026157600060031936011261026157611340612167565b6000600955005b60806003193601126102615760043561135f816107c5565b6024359061136c826107c5565b6044356064359267ffffffffffffffff84116102615736602385011215610261576113a4610acc943690602481600401359101610d35565b92611f5c565b34610261576020600319360112610261576004356113c6612167565b600955005b60606003193601126102615760243560043560443567ffffffffffffffff8111610261576113fd90369060040161094d565b926114066126c0565b61141360005415156119d6565b600054838101809111610a6657606f61142d911115611d90565b60009381807a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000811015611610575b806d04ee2d6d415b85acef8100000000600a9210156115f4575b662386f26fc100008110156115df575b6305f5e1008110156115cd575b6127108110156115bd575b60648110156115ae575b10156115a3575b6114f360001960216114bd60018a0161295c565b988901015b01917f3031323334353637383961626364656600000000000000000000000000000000600a82061a8353600a900490565b908115611507576114f390600019906114c2565b50506115356115759361153a92611530611524610b4c99336126fb565b92600954923691611f06565b61290b565b611fb8565b61156e836115683373ffffffffffffffffffffffffffffffffffffffff16600052600d602052604060002090565b54611a6a565b1115612043565b611581610b3f82611e17565b336000908152600d6020526040902061159b828254611a6a565b905533612318565b6001909501946114a9565b600290606490049701966114a2565b6004906127109004970196611498565b6008906305f5e100900497019661148d565b601090662386f26fc100009004970196611480565b6020906d04ee2d6d415b85acef81000000009004970196611470565b50604095507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008304611456565b346102615760206003193601126102615760043561165581612471565b156117db5760405190600082600c549161166e83611983565b808352926001811690811561179e575060011461173d575b61169292500383610cf1565b81511561172e576116bc916116c26116ac6116d09361298d565b60405194859360208501906120a8565b906120a8565b03601f198101835282610cf1565b80511561171d576116f4610681610305926116c260405193849260208401906120a8565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000815260050190565b50610305611729611e9e565b610681565b5050611738611e9e565b6116d0565b5090600c6000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7906000915b81831061178257505090602061169292820101611686565b602091935080600191548385890101520191019091849261176a565b602092506116929491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b820101611686565b7fa14c4b500000000000000000000000000000000000000000000000000000000060005260046000fd5b3461026157604060031936011261026157602060ff61187d600435611829816107c5565b73ffffffffffffffffffffffffffffffffffffffff6024359161184b836107c5565b166000526007845260406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54166040519015158152f35b346102615760206003193601126102615773ffffffffffffffffffffffffffffffffffffffff6004356118bb816107c5565b6118c3612167565b1680156119325773ffffffffffffffffffffffffffffffffffffffff600a54827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600a55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b34610261576000600319360112610261576020604051669536c7089100008152f35b90600182811c921680156119cc575b602083101461199d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611992565b156119dd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5265736572766573206e6f742074616b656e20796574000000000000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211610a6657565b9190811015611a875760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b35610634816107c5565b91909173ffffffffffffffffffffffffffffffffffffffff611ae1836125f4565b9116928373ffffffffffffffffffffffffffffffffffffffff831603611d2657600083815260066020526040902080549290611b3973ffffffffffffffffffffffffffffffffffffffff871633908114908614171590565b611cbc575b73ffffffffffffffffffffffffffffffffffffffff93611cb2575b50611b848573ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b8054600019019055611bb68273ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b8054600101905573ffffffffffffffffffffffffffffffffffffffff82164260a01b177c020000000000000000000000000000000000000000000000000000000017611c0c856000526004602052604060002090565b557c0200000000000000000000000000000000000000000000000000000000811615611c68575b501680927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a415611c6357565b61254c565b60018401611c80816000526004602052604060002090565b5415611c8d575b50611c33565b6000548114611c8757611caa906000526004602052604060002090565b553880611c87565b6000905538611b59565b611d1c610536611d1533611cf08a73ffffffffffffffffffffffffffffffffffffffff166000526007602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5460ff1690565b15611b3e57612522565b6124f8565b15611d3257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f5075626c69632073616c65206e6f7420616374697665000000000000000000006044820152fd5b15611d9757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f45786365656473206d617820737570706c7900000000000000000000000000006044820152fd5b90669536c708910000820291808304669536c7089100001490151715610a6657565b906618838370f340008202918083046618838370f340001490151715610a6657565b15611e4057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e76616c69642066756e64732070726f7669646564000000000000000000006044820152fd5b60405190611ead602083610cf1565b60008252565b601f8111611ebf575050565b600c6000526020600020906020601f840160051c83019310611efc575b601f0160051c01905b818110611ef0575050565b60008155600101611ee5565b9091508190611edc565b9291909267ffffffffffffffff8411610d14578360051b906020604051611f2f82850182610cf1565b809681520191810192831161026157905b828210611f4c57505050565b8135815260209182019101611f40565b929190611f6a828286611ac0565b803b611f77575b50505050565b611f80936128b4565b15611f8e5738808080611f71565b7fd1a57ed60000000000000000000000000000000000000000000000000000000060005260046000fd5b15611fbf57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b1561204a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f457863656564732077686974656c69737420616c6c6f77616e636500000000006044820152fd5b906120bb602092828151948592016105db565b0190565b7fffffffff00000000000000000000000000000000000000000000000000000000167f01ffc9a700000000000000000000000000000000000000000000000000000000811490811561213d575b8115612116575090565b7f5b5e139f0000000000000000000000000000000000000000000000000000000091501490565b7f80ac58cd000000000000000000000000000000000000000000000000000000008114915061210c565b73ffffffffffffffffffffffffffffffffffffffff600a5416330361218857565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b9060006040516121c7602082610cf1565b81815290549073ffffffffffffffffffffffffffffffffffffffff84164260a01b177c02000000000000000000000000000000000000000000000000000000001761221c836000526004602052604060002090565b556122478473ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b68010000000000000001815401905573ffffffffffffffffffffffffffffffffffffffff841692831561055a5760018301929460015b156122b1575b60008686827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a461227d565b946001019483860361228357929194509250600055803b6122d157509050565b6000549160001983019260015b15612302575b60006122f8610536876001880197876127bc565b156122de57611f8e565b8084106122e45792509250506000540361026157565b9160405190612328602083610cf1565b6000825260005491831561246c5773ffffffffffffffffffffffffffffffffffffffff85164260a01b6001861460e11b171761236e846000526004602052604060002090565b556123998573ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b680100000000000000018502815401905573ffffffffffffffffffffffffffffffffffffffff851693841561055a57808401939560015b15612404575b60008787827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a46123d0565b95600101958487036123d65792955092909350600055803b61242557505050565b9091926000549283039260015b15612456575b600061244c610536876001880197876127bc565b1561243257611f8e565b8084106124385792509250506000540361026157565b612576565b9060009160005481106124815750565b9091505b806000526004602052604060002054806124a957508015610a665760001901612485565b7c01000000000000000000000000000000000000000000000000000000009150161590565b7fcfb3b9420000000000000000000000000000000000000000000000000000000060005260046000fd5b7fa11481000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f59c896be0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fea553b340000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb562e8dd0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2e0763000000000000000000000000000000000000000000000000000000000060005260046000fd5b7fdf2d9b420000000000000000000000000000000000000000000000000000000060005260046000fd5b612608816000526004602052604060002090565b5490811561263857507c010000000000000000000000000000000000000000000000000000000081166125ca5790565b90506000548110156125ca57600019905b0161265e816000526004602052604060002090565b549081156126b657507c0100000000000000000000000000000000000000000000000000000000811615610634577fdf2d9b420000000000000000000000000000000000000000000000000000000060005260046000fd5b6000199150612649565b6002600b54146126d1576002600b55565b7f3ee5aeb50000000000000000000000000000000000000000000000000000000060005260046000fd5b906127366116c29160405192839173ffffffffffffffffffffffffffffffffffffffff602084019616865260408084015260608301906105fe565b51902090565b90816020910312610261575161063481610237565b909273ffffffffffffffffffffffffffffffffffffffff608093816106349796168452166020830152604082015281606082015201906105fe565b3d156127b7573d9061279d82610d19565b916127ab6040519384610cf1565b82523d6000602084013e565b606090565b9161281292602092600073ffffffffffffffffffffffffffffffffffffffff6040518097819682957f150b7a02000000000000000000000000000000000000000000000000000000008452853360048601612751565b0393165af160009181612883575b5061283c5761282d61278c565b80511561054057805190602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a02000000000000000000000000000000000000000000000000000000001490565b6128a691925060203d6020116128ad575b61289e8183610cf1565b81019061273c565b9038612820565b503d612894565b90602092600073ffffffffffffffffffffffffffffffffffffffff6128129694604051978896879586937f150b7a020000000000000000000000000000000000000000000000000000000085523360048601612751565b929091906000915b845183101561295457604060019160009060208660051b8901015190818110600014612948578252602052205b920191612913565b90825260205220612940565b915092501490565b9061296682610d19565b6129736040519182610cf1565b828152601f196129838294610d19565b0190602036910137565b9060405160a08101604052600a600019608083019460008652945b01938181066030018553049283156129c557600019600a916129a8565b9250608083601f19920301920191825256fea2646970667358221220578e5f185983daceb4d839b7e51318c6f7aa33fd3db0f0c3df00396dc15a7b2e64736f6c634300081b0033",
"deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610232578063029877b61461022d578063041fa44e1461022857806306fdde0314610223578063081812fc1461021e5780630922f9c514610197578063095ea7b3146102195780630c1c972a14610214578063163e1e611461020f57806318160ddd1461020a57806323b872dd146102055780632db115441461020057806332cb6b0c146101fb5780633ccfd60b146101f657806342842e0e146101f1578063521eb273146101ec57806355f804b3146101e75780636352211e146101e257806366fddfa9146101dd57806370a08231146101d8578063715018a6146101d35780637ad7614d146101ce5780638da5cb5b146101c957806395d89b41146101c4578063a22cb465146101bf578063b4402979146101ba578063b88d4fde146101b5578063bd32fb66146101b0578063c4be5b59146101ab578063c87b56dd146101a6578063e985e9c5146101a1578063f2fde38b1461019c578063f43a22dc146101975763fbd9b92d1461019257600080fd5b611961565b6107a9565b611889565b611805565b611638565b6113cb565b6113aa565b611347565b611327565b611254565b6111ab565b611177565b611155565b6110d5565b611050565b610ede565b610ea2565b610d87565b610c71565b610c4c565b610bd0565b610bb4565b610ace565b610aba565b610a6b565b61097e565b610902565b6107e3565b61072f565b610637565b6105bd565b6103a8565b610266565b7fffffffff0000000000000000000000000000000000000000000000000000000081160361026157565b600080fd5b346102615760206003193601126102615761030560043561028681610237565b7fffffffff000000000000000000000000000000000000000000000000000000008116907f0e08307600000000000000000000000000000000000000000000000000000000821491821561037e575b8215610354575b8215610343575b8215610319575b508115610309575b5060405190151581529081906020820190565b0390f35b61031391506120bf565b386102f2565b7f2baae9fd00000000000000000000000000000000000000000000000000000000149150386102ea565b915061034e816120bf565b916102e3565b7f62e27be700000000000000000000000000000000000000000000000000000000811492506102dc565b7fc21b8f2800000000000000000000000000000000000000000000000000000000811492506102d5565b34610261576000600319360112610261576103c1612167565b60005461055f5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600060405190610410602083610cf1565b8082525473ffffffffffffffffffffffffffffffffffffffff83164260a01b17610444826000526004602052604060002090565b5561046f8373ffffffffffffffffffffffffffffffffffffffff166000526005602052604060002090565b68050000000000000005815401905573ffffffffffffffffffffffffffffffffffffffff831691821561055a5760058201919360015b156104d9575b60008585827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a46104a5565b93600101938285036104ab5782600055803b6104f157005b600054907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb82019160015b15610545575b600061053a610536866001870196866127bc565b1590565b1561051c575b611f8e565b80831061052257925050506000540361026157005b6125a0565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f526573657276657320616c726561647920636f6c6c65637465640000000000006044820152fd5b34610261576000600319360112610261576020600954604051908152f35b60005b8381106105ee5750506000910152565b81810151838201526020016105de565b90601f19601f60209361061c815180928187528780880191016105db565b0116010190565b9060206106349281815201906105fe565b90565b3461026157600060031936011261026157604051600060025461065981611983565b80845290600181169081156106ed575060011461068d575b6103058361068181850382610cf1565b60405191829182610623565b91905060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace916000905b8082106106d357509091508101602001610681610671565b9192600181602092548385880101520191019092916106bb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208086019190915291151560051b840190910191506106819050610671565b346102615760206003193601126102615760043561074c81612471565b1561077f576000526006602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b7fcf4700e40000000000000000000000000000000000000000000000000000000060005260046000fd5b3461026157600060031936011261026157602060405160058152f35b73ffffffffffffffffffffffffffffffffffffffff81160361026157565b6040600319360112610261576004356107fb816107c5565b6024359073ffffffffffffffffffffffffffffffffffffffff61081d836125f4565b16908133036108be575b8061089573ffffffffffffffffffffffffffffffffffffffff92610855866000526006602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4005b81600052600760205260ff6108f73360406000209073ffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b5416610827576124ce565b346102615760006003193601126102615761091b612167565b6000600955600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055005b9181601f840112156102615782359167ffffffffffffffff8311610261576020808501948460051b01011161026157565b346102615760206003193601126102615760043567ffffffffffffffff8111610261576109af90369060040161094d565b6109b7612167565b6109c460005415156119d6565b600054818101809111610a6657606f10610a085760005b8181106109e457005b80610a026109fd6109f86001948688611a77565b611ab6565b6121b6565b016109db565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f45786365646573206d617820737570706c7900000000000000000000000000006044820152fd5b611a3b565b346102615760006003193601126102615760206000546001549003604051908152f35b600319606091011261026157600435610aa6816107c5565b90602435610ab3816107c5565b9060443590565b610acc610ac636610a8e565b91611ac0565b005b602060031936011261026157600435610ae56126c0565b610af160095415611d2b565b610aff60ff600e5416611d2b565b610b0c60005415156119d6565b600054818101809111610a6657606f610b26911115611d90565b6005811015610b565780610b46610b3f610b4c93611df5565b3414611e39565b33612318565b610acc6001600b55565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f45786365656473206d617820706572207472616e73616374696f6e00000000006044820152fd5b34610261576000600319360112610261576020604051606f8152f35b3461026157600060031936011261026157610be9612167565b600080808047818115610c43575b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690f115610c3757005b6040513d6000823e3d90fd5b506108fc610bf7565b610acc610c5836610a8e565b9060405192610c68602085610cf1565b60008452611f5c565b3461026157600060031936011261026157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff821117610d1457604052565b610cc2565b67ffffffffffffffff8111610d1457601f01601f191660200190565b929192610d4182610d19565b91610d4f6040519384610cf1565b829481845281830111610261578281602093846000960137010152565b9080601f830112156102615781602061063493359101610d35565b346102615760206003193601126102615760043567ffffffffffffffff811161026157610db8903690600401610d6c565b610dc0612167565b805167ffffffffffffffff8111610d1457610de581610de0600c54611983565b611eb3565b602091601f8211600114610e2457610e149260009183610e19575b50506000198260011b9260031b1c19161790565b600c55005b015190503880610e00565b600c600052601f198216927fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79160005b858110610e8a57508360019510610e71575b505050811b01600c55005b015160001960f88460031b161c19169055388080610e66565b91926020600181928685015181550194019201610e54565b3461026157602060031936011261026157602073ffffffffffffffffffffffffffffffffffffffff610ed56004356125f4565b16604051908152f35b346102615760406003193601126102615760043567ffffffffffffffff811161026157610f0f903690600401610d6c565b60243567ffffffffffffffff811161026157610f32610f4691369060040161094d565b9190610f3e84336126fb565b923691611f06565b906009548015610ff257610f599261290b565b15610f6e576103059060405191829182610623565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f496e76616c6964204d65726b6c6520547265652070726f6f6620737570706c6960448201527f65642e00000000000000000000000000000000000000000000000000000000006064820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f57686974656c697374206d65726b6c6520726f6f74206e6f74207365740000006044820152fd5b346102615760206003193601126102615773ffffffffffffffffffffffffffffffffffffffff600435611082816107c5565b1680156110ab576000526005602052602067ffffffffffffffff60406000205416604051908152f35b7f8f4eb6040000000000000000000000000000000000000000000000000000000060005260046000fd5b34610261576000600319360112610261576110ee612167565b600073ffffffffffffffffffffffffffffffffffffffff600a547fffffffffffffffffffffffff00000000000000000000000000000000000000008116600a55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102615760006003193601126102615760206040516618838370f340008152f35b3461026157600060031936011261026157602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b346102615760006003193601126102615760405160006003546111cd81611983565b80845290600181169081156106ed5750600114