Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 242 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21260487 | 5 days ago | IN | 0 ETH | 0.00025133 | ||||
Set Approval For... | 21260344 | 5 days ago | IN | 0 ETH | 0.00038438 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357560 | 836 days ago | IN | 0 ETH | 0.00135391 | ||||
Giveaway | 15357240 | 836 days ago | IN | 0 ETH | 0.0007595 | ||||
Giveaway | 15357240 | 836 days ago | IN | 0 ETH | 0.0007595 | ||||
Giveaway | 15357239 | 836 days ago | IN | 0 ETH | 0.00069257 | ||||
Giveaway | 15357239 | 836 days ago | IN | 0 ETH | 0.00069257 | ||||
Giveaway | 15357239 | 836 days ago | IN | 0 ETH | 0.00069257 | ||||
Giveaway | 15357224 | 836 days ago | IN | 0 ETH | 0.000832 | ||||
Giveaway | 15357224 | 836 days ago | IN | 0 ETH | 0.000832 | ||||
Giveaway | 15357224 | 836 days ago | IN | 0 ETH | 0.000832 | ||||
Giveaway | 15357220 | 836 days ago | IN | 0 ETH | 0.00082411 | ||||
Giveaway | 15357220 | 836 days ago | IN | 0 ETH | 0.00080939 | ||||
Giveaway | 15357180 | 836 days ago | IN | 0 ETH | 0.00130232 | ||||
Giveaway | 15357178 | 836 days ago | IN | 0 ETH | 0.00119596 | ||||
Giveaway | 15357177 | 836 days ago | IN | 0 ETH | 0.00112306 | ||||
Withdraw | 15357057 | 836 days ago | IN | 0 ETH | 0.00065993 | ||||
Set Approval For... | 15214987 | 858 days ago | IN | 0 ETH | 0.0032757 | ||||
Set Approval For... | 15019014 | 889 days ago | IN | 0 ETH | 0.00175457 |
Loading...
Loading
Contract Name:
Crumliasbakery
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 20 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "./ClaimableByPreviousOwners.sol"; import "./common/meta-transactions/ContentMixin.sol"; import "./common/meta-transactions/NativeMetaTransaction.sol"; contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } abstract contract CrumliasbakeryMinting is ERC721Enumerable { function _mintToken(address owner, uint256 startingIndex, uint16 number) internal { for (uint i = 0; i < number; i++) { _safeMint(owner, startingIndex + i); } } } abstract contract CrumliasbakerySelling is CrumliasbakeryMinting, Pausable, ContextMixin, NativeMetaTransaction, ClaimableByPreviousOwners, PausableClaim { uint256 constant maxToken = 5555; uint constant sellableTokensStartingIndex = 1101; uint constant giveawayTokenStartingIndex = 1001; uint constant claimTokenStartingIndex = 1; uint16 constant maxTokensToBuyAtOnce = 20; uint constant singleTokenPrice = 30000000 gwei; // 0.03 eth for one crumlia uint256 public nextTokenForSale; uint public nextTokenToGiveaway; uint public nextClaimToken; constructor() { nextTokenForSale = sellableTokensStartingIndex; nextTokenToGiveaway = giveawayTokenStartingIndex; nextClaimToken = claimTokenStartingIndex; } function claim() public whenClaimNotPaused { uint16 tokensToMint = howManyFreeTokens(); require(tokensToMint > 0, "You cannot claim tokens"); require(leftForClaim() >= tokensToMint, "Not enough tokens left for claim"); _mintToken(msg.sender, nextClaimToken, tokensToMint); cannotClaimAnymore(msg.sender); nextClaimToken += tokensToMint; } function buy(uint16 tokensToBuy) public payable whenNotPaused { require(tokensToBuy > 0, "Cannot buy 0 tokens"); require(leftForSale() >= tokensToBuy, "Not enough tokens left on sale"); require(tokensToBuy <= maxTokensToBuyAtOnce, "Cannot buy that many tokens at once"); require(msg.value >= singleTokenPrice * tokensToBuy, "Insufficient funds sent."); _mintToken(msg.sender, nextTokenForSale, tokensToBuy); nextTokenForSale += tokensToBuy; } function leftForSale() public view returns(uint256) { return maxToken - nextTokenForSale + 1; } function leftForGiveaway() public view returns(uint) { return sellableTokensStartingIndex - nextTokenToGiveaway; } function leftForClaim() public view returns(uint) { return giveawayTokenStartingIndex - nextClaimToken; } function giveaway(address to) public onlyOwner { require(leftForGiveaway() >= 1); _mintToken(to, nextTokenToGiveaway++, 1); } function startSale() public onlyOwner whenPaused { _unpause(); } function pauseSale() public onlyOwner whenNotPaused { _pause(); } function pauseClaim() public onlyOwner whenClaimNotPaused { _pauseClaim(); } function unpauseClaim() public onlyOwner whenClaimPaused { _unpauseClaim(); } } contract Crumliasbakery is CrumliasbakerySelling { string _provenanceHash; string baseURI_; address proxyRegistryAddress; string _contractURI; address constant devsAddress = 0xdca119aB841e632f8bC9AA003Dccdeba9C6d2907; constructor(address _proxyRegistryAddress) ERC721("Crumlias Bakery", "CB") { proxyRegistryAddress = _proxyRegistryAddress; _pause(); setBaseURI("https://crumliasbakery.herokuapp.com/api/metadata/"); setContractURI("https://crumliasbakery.herokuapp.com/contract"); } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory contractURI_) public onlyOwner { _contractURI = contractURI_; } function withdraw() public payable onlyOwner { uint balance = address(this).balance; uint forDevs = balance / 2; // 50% for devs uint forOwner = balance - forDevs; payable(msg.sender).transfer(forOwner); payable(devsAddress).transfer(forDevs); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { _provenanceHash = provenanceHash; } function setBaseURI(string memory baseURI) public onlyOwner { baseURI_ = baseURI; } function _baseURI() internal view override returns (string memory) { return baseURI_; } function isApprovedOrOwner(address target, uint256 tokenId) public view returns (bool) { return _isApprovedOrOwner(target, tokenId); } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function tokensInWallet(address wallet) public view returns (uint256[] memory) { uint256[] memory tokens = new uint256[](balanceOf(wallet)); for (uint i = 0; i < tokens.length; i++) { tokens[i] = tokenOfOwnerByIndex(wallet, i); } return tokens; } function burn(uint256 tokenId) public virtual { require(_isApprovedOrOwner(_msgSender(), tokenId), "Crumliasbakery: caller is not owner nor approved"); _burn(tokenId); } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) override public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /** * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea. */ function _msgSender() internal override view returns (address sender) { return ContextMixin.msgSender(); } }
pragma solidity ^0.8.0; import "openzeppelin-solidity/contracts/access/Ownable.sol"; import "./common/meta-transactions/ContentMixin.sol"; abstract contract PausableClaim is Context { bool private _claimPaused; event ClaimUnpaused(address account); event ClaimPaused(address account); constructor() { _claimPaused = true; } function claimPaused() public view virtual returns (bool) { return _claimPaused; } modifier whenClaimNotPaused() { require(!claimPaused(), "Claim is paused"); _; } modifier whenClaimPaused() { require(claimPaused(), "Claim is not paused"); _; } function _pauseClaim() internal virtual whenClaimNotPaused { _claimPaused = true; emit ClaimPaused(_msgSender()); } function _unpauseClaim() internal virtual whenClaimPaused { _claimPaused = false; emit ClaimUnpaused(_msgSender()); } } abstract contract ClaimableByPreviousOwners is Ownable { mapping(address => uint16) _balances; constructor() { initBalances(); } function initBalances() internal { _balances[0x0FD522AA67B0b5d9429aBA6F6BF828454d0Ef03C] = 1; _balances[0xae8277ddb7D9EF0913520F3579bf155c591C6d44] = 1; _balances[0x1fB4b19861Ef7bb4De78d90fee2ce6d09D8E0BF7] = 4; _balances[0xe635B15291F31c1ba6C7a6C3D26cBdf6C0f77204] = 27; _balances[0x4EbE3AA1B6a599Cc1c338F9D32C8Aa747b7c8e51] = 15; _balances[0x4DF00689952974eDbE1Cc05D2710Ea1B2b6E185F] = 11; _balances[0x61e309F348F1AFb007d92dA348aA0cA006BE11a5] = 2; _balances[0xF69bC34B73DA823e18A6960975fB865a29B218A1] = 1; _balances[0xfd6230b8956b7F0f828bd1a58941396E256a19FB] = 6; _balances[0x0F7d51c5aBa85246CE83CaD6669C70b02910F910] = 3; _balances[0x297F9B53C6F7FCe35c7ACE6499Bf9ddfA6B8B5C9] = 1; _balances[0x8679DE11BE15aB60f718Da5eE77d8fa75604Ac16] = 8; _balances[0xC5CcBc1a97C508D46060f266c4814e05269E43d2] = 6; _balances[0xDc62e941fDDBDdDFc666B133E24E0C1aFae11847] = 12; _balances[0xa88235065D97A56719Ea7D4Fe72F8f953C984C0B] = 7; _balances[0x7f0413995EcF9E921CD9c0658afECa39d59289B3] = 3; _balances[0x55A5705453Ee82c742274154136Fce8149597058] = 3; _balances[0x827DeDC7D8f1FEe249fDf95123Ced9d03Cb2ab3B] = 2; _balances[0xa08F235264EC058333DBbDF2be8dc57751dC2210] = 1; _balances[0x167BF4636FA1C196807915C32845d0a55E53482F] = 2; _balances[0xA6311952D5E6273074977Cf9491965800FbC9233] = 3; _balances[0xbF590F3F6ee928e910a15F797ECeF239c83B39E7] = 1; _balances[0xBB1515279cF32eDddE0341241c2edf54866859cF] = 1; _balances[0xAe051E32Df2Facb1B1CaE583fD10481b6deaAc73] = 12; _balances[0xbC022950EC0aaEe835e49060cDB97739c51618be] = 1; _balances[0xB77e94369E4fF7CAF9c6fB955f8FA7Ffd32A5E94] = 1; _balances[0xC8b1F17000C85B56ea663A92cc17049D5419C5C4] = 1; _balances[0xf56D5F85C7557f65fE8Dd8090907a7117c048295] = 2; _balances[0x82B47799859E354eac6dBA1D0f6Dd5b45124c14b] = 2; _balances[0x27C934Ea235abD41bDd7Cfb48f7B1Bb9e629dB57] = 2; _balances[0x6d06eF9F663C0dDfD00126afb379eBe17C927794] = 1; _balances[0xcfaE6215009b5069DCc82d8498994B3Dd32a2DE1] = 1; _balances[0xAFF516744DDd9e285BFFa384c2Ef1b295e47ffFC] = 2; _balances[0x590534CbE8B5aC2890F77652fB5F0d334F18A0a3] = 4; _balances[0xC9fcE24f72B5F390E3f7bb2CF5D67fd144E51a89] = 1; _balances[0xb8A1E33F2A5D78225639Eb3283EA0a11a178225B] = 1; _balances[0x8d454e8f00D44aAd56Cccf12A3Cbe608fa58C6e0] = 6; _balances[0x765d46f2d42a21fa7C79294D84a45a5328a2a6Fd] = 2; _balances[0xCfF9Da0cA651dB868b95eeE4a74E46d43f115331] = 2; _balances[0x14E8F54f35eE42Cdf436A19086659B34dA6D9D47] = 1; _balances[0x397065ffeC392dA1C3b0D10a0C9fe946eCC91581] = 1; _balances[0xCDEb7C898602ABbfBC3966E7ce13A8b498b79Ec1] = 2; _balances[0xB5619CA0Bdd458EBfbc2b8B4b823E23D5717ea67] = 12; _balances[0xB3a5dA02664030Fe55f7bB0A16D1dCA1202F2868] = 2; _balances[0x91F227B05664f73cdEc5Dc78c37C91FcB7ABE956] = 1; _balances[0x29305910D110E24776053BA1376fb85A2Ae2Bf05] = 2; _balances[0xaA4681293F717Ec3118892bC475D601ca793D840] = 3; _balances[0x1802a514921e9Bd0a564E3F6720Aa3181d6eA46d] = 4; _balances[0x9AB7ADae1579eA2843742e6618433995b0F51044] = 3; _balances[0xc37Cc77B2E54f33e20A6EF42A52621F76EdD7Cc2] = 4; _balances[0x5D9FdfaACF5bC2e759fA210F6de3D7de5457B385] = 2; _balances[0x413eE671f3351f54CDeC60BFabfFca7E7E5A32f7] = 2; _balances[0xf7c32dc50685a75bfC58d0c3e642756BbFD3625B] = 1; _balances[0x179d872918135cD08122A16F7e2d52dDC8dB739D] = 2; _balances[0xED87aA0f671Cc6A5183bDD4Ca62878953142644A] = 2; _balances[0xe86dE2E2159090325429F20a77E051DAf97BA713] = 1; _balances[0x2EddB9CAb9EEb5AB229b956caC87479923C88C11] = 3; _balances[0x8725914eD034ca5d448443773A52ccd61C70281c] = 1; _balances[0x1F5Db7e50B086E89d8377fb2c4F22C7ea718A294] = 2; _balances[0x70d31251EFA31Bca4cfD370dB44f0a28Fc73662C] = 2; _balances[0x3faE9be26e14d789BCCb78Afb7DF4e9B288BEC73] = 2; _balances[0x315AE5C7F9B834616A5b5F2De5a7aefC79573FBf] = 1; _balances[0x67A095e00BB529374a6D4a35dfe41FAc82721b38] = 1; _balances[0x48a6ceaBf9998f11d97c304a4d38e7743DA4C9D4] = 2; _balances[0x7F16EC6D12ae3dFD255A022b52655A58Bdf75619] = 4; _balances[0x1B88a333a687F1608fdC71711b9DaCebD75D23dd] = 1; _balances[0x66C81E6222a01a67433746f018b3335Cad64D725] = 1; _balances[0x45Ebc55C3D90787F8379EC50c50ACb3fa1d51dfE] = 1; _balances[0x4E920B5721f4cf771452AE0bb013465261a4Ac11] = 1; _balances[0x66Ec34310bD83BE9cfa1A4d52C12Bdf4Fa6958C8] = 1; _balances[0x84341bD75AF5abe84E825601540F6F5649F0c2C4] = 1; _balances[0xDfC8a3e6fE8251E05c484f302858D36B1BED3e38] = 7; _balances[0x460D25dEC453926B861bD30ee55b6e6694e23508] = 1; _balances[0xE082e2da3E7AdD94F3Ac7C43828025174Be309bd] = 1; _balances[0xcc4803F3409A9A6405DFA39D9E29822e4414a3fD] = 1; _balances[0xD80775766186eF44c73422fDF97D92701C27f70E] = 1; _balances[0x8dFf027daADEacC7898851C4e750078aba53b922] = 1; _balances[0xa1559B0E3DFFF3fdDA0c45cA6d7C4C75188A90cE] = 1; _balances[0x8F64C199659612133A354cA289f355709E16eb47] = 1; _balances[0x8868d9eD819ebb22717c2Efc24deb864AF0988F1] = 1; _balances[0xDE861b1eE25D1dd7389d6A39d7aA6AB7868F16Fa] = 1; _balances[0x02C545e7E16afbBe405FaD98a8a5a9a9fEeCe114] = 1; _balances[0x79c800Da3577CCFA8813EDc5aBd91d328bC44bEE] = 1; _balances[0xC49786d5546edef7659621FF1746Ca6bAF6C50A4] = 1; _balances[0x0866e68B37CEc2517a7dB3b26BDCe0D7F5ca8CB6] = 5; _balances[0xa0Ff708151943D407ff866232e971471b0F1aD9a] = 2; _balances[0xA0625F017259a8F85C7501c6b4D7AD276FE59993] = 1; _balances[0x811c1aB500966bAE6eF3451c2c1820d89C3A9F0A] = 3; _balances[0x25f9454ABf96C656A151D85cD74EFD008838Aa54] = 2; _balances[0x823a76F7047b9d85e0220684Ac5e5752CC7AE494] = 2; _balances[0x0dF154Dcb67b92fF07e52f69A30BD4290B01C44B] = 3; _balances[0x9F696C668758C033a8EfFF03F73D8f8aC7fEAe08] = 1; _balances[0xEE74c2B604650FE6468f9f09Fb0685719Aeb735B] = 2; _balances[0x7e00f4110Fb7D02A91632895FB93cd09af3209c6] = 34; _balances[0x6bF866997112eEbF2B4F78F5840b218B2F6259e2] = 2; _balances[0x8C96838603Ee0620d6d970D415714E674ed20522] = 2; _balances[0xb16B295C3E174e650660e74B5Ec4aBe44c29849B] = 1; _balances[0xE8075d7B965e8BA4938ed158DE944E1E02A21D30] = 4; _balances[0x8E808a12345F954D6323d96a140D85daeaff82a9] = 14; _balances[0x5DCF136F33b537E0Ccc557e527276354C3CaB489] = 1; _balances[0xaeD49bF1C006Fed7a0C27a0C382a2f086019cDC3] = 2; _balances[0xbBcFf58f9707a419AD7a06A3993415B880c3Bf04] = 1; _balances[0x78Db105632eD69dB8a8c528559dC9d9f220d8171] = 11; _balances[0x9F5259Fe40F34941AcD627388Dc24d4DCf9b117C] = 1; _balances[0x704460AF51b7352cfe7b519CB18F9dfC4E6F52C7] = 11; _balances[0xf02Cd6f7b3d001b3f81E747e73A06Ad73CbD5E5b] = 1; _balances[0x6CB5c9fd6df9Ec4fd1B61C611A88161965E0D7D0] = 2; _balances[0xA021Da3af846EAdF9539Bba8D0d5Ac59C87B3ed7] = 1; _balances[0x0E5a1d84eD69067C078596bc6A17452425B005F1] = 3; _balances[0xA68d1Edd58Af7ceFe8F11DFDa18Db25C78206257] = 1; _balances[0x8E49b61Be4F02D68Eb620954730B5cC74Ef53b92] = 1; _balances[0x1A4999048a9Fa13125edCE959De4A5713B76735f] = 1; _balances[0xEA6F17757172B189342852744D17577408d0f6af] = 2; _balances[0xf4055bc28cb7Fa396A08FC0e8575fCF8498a4Dc6] = 1; _balances[0x9d80eDefb33F7Fa40DcFF768E15A173F0498d183] = 2; _balances[0xADAae0CF49B422fB24cB988d669e77F4E015608c] = 1; _balances[0x7B75BC70b928472856047FDEf0D08D5B5816AEFD] = 1; _balances[0xB6461bF5223dFe357745895ef4473024E9dC2E20] = 1; _balances[0xF521152c5fa16d2759E5D8885Db2Fb4DBE776647] = 1; _balances[0x2C13ccA4F78cE2e725111Bf9ed75cEdF51277061] = 1; _balances[0x635540C2BBf977d940bFb2C392BEf54b5449a313] = 6; _balances[0xbb434f639E9D56D15143A4cd4E6FB4b3310023dC] = 2; _balances[0xdAd37D1703872cF66d2C9aE521ea4a78C1d9Bcd1] = 2; _balances[0x4f2fF081BCc048fD9ADFA008453f1Bb017221150] = 1; _balances[0x1824655211eF781631C89372fE56f030Cbb137DC] = 5; _balances[0xB3f14DdE153F1f400fC4534041A8ccb293E8f123] = 1; _balances[0xd559eb2bdF862d7a82d716050D56599F03Ef44E7] = 5; _balances[0x9d156bc7c8768294510A4A41883d5A4EB15b15E3] = 1; _balances[0x34223719D75CBC336b77cCd8af6B9342bd6Af1cB] = 1; _balances[0x233b329780074a3A0fA4E90CD1f5e0Bf528F8736] = 3; _balances[0xac85b2C302e26E5a994a88203CaFE3797D1361e4] = 1; _balances[0xc1a880D8e488c16541E76EDA6e6aE9a1495F2DBF] = 1; _balances[0x69816eA28F78395c19770585c9C2eBb516500a7d] = 3; _balances[0xf09B1BCFFaD71B71eE0ef587dE93cE05E5C65cC3] = 2; _balances[0x869139316d79117003D69bD41DEaeCA22eA6cE18] = 2; _balances[0x8D23c2dc93bE2C90728c45Eade4d574E04F82Ec3] = 1; _balances[0x68d506515278069558C3AbD6790E111Fa6993E9B] = 2; _balances[0x17024bb9827221f6D9DAbaDed36F850c8cB522c2] = 1; _balances[0xF061Ef570e84Eff26dAA32017f63f3016636DC99] = 5; _balances[0xFC502A09854F5685171F6766F22f92121999248F] = 1; _balances[0x15F7320adb990020956D29Edb6ba17f3D468001e] = 1; _balances[0x726022a9fe1322fA9590FB244b8164936bB00489] = 6; _balances[0x82466928c6cf6984B723A653b3faA3E8206e09c8] = 1; _balances[0x16E397096381Ea03a02c4435a8118B3603C55C79] = 1; _balances[0x5c35B34610343bF51C30B3f5C590d972D9FAe97f] = 1; _balances[0xa0ba9d15Defb5E4667Fd14d2A65be5B4B191948E] = 1; _balances[0x295B0128e6a5a10d44dc6E079b419f1D21B075F6] = 3; _balances[0x6e8eE4656308297DdfeCE05b32f12aC24b1608e2] = 3; _balances[0x9f03f1a9Ea78741e8B741688Dd07768D347E24D5] = 1; _balances[0x7D112B3216455499f848ad9371df0667a0d87Eb6] = 6; _balances[0xB00CD8e790eC45971A04695849a17a647eB74463] = 2; _balances[0x65f7E3EA4c1507F50467B7334E6d8f7547bb41D3] = 1; _balances[0x581bD489306dF3fD5095b79d914D0db0F52eebD5] = 3; _balances[0xBf96b053003F62c67DAbD3d5fB64757033141Ba3] = 5; _balances[0x9C2355b55f2C6a4Da56731AAd78BB4b5a69e271A] = 3; _balances[0xA1E58AB88494Cd42F6902F6A2d6F3a35B92449B2] = 2; _balances[0xd065e59ba15836a50cd473AF4E51C77Fb2c3E1Bd] = 2; _balances[0x9C7b82c0302C7c945F9Cf45A5c73E6f48Ab84B14] = 1; _balances[0x8d174461277169979E7b5a48Eb94E85C9D62C220] = 1; _balances[0xA2ccdba148D69acb8e6054bAEFfCb564093bb6f6] = 1; _balances[0xdab13b3dBE8A3Ce3F864D1184Db9ddA24bB1D88c] = 1; _balances[0xd81be2Dd1fE5E3F9aAda3fFea6d64e62506edAcc] = 7; _balances[0x484749B9d349B3053DfE23BAD67137821D128433] = 1; _balances[0x38a63b0ae13d0d42BfF525f7766Bb3BDd7C2F68B] = 1; _balances[0xf71596193FbbCd97e42643C3112984b5e0355D3D] = 1; _balances[0xa85819617a048287Ae2f5bA42740D7d71C9e439C] = 1; _balances[0xbf38B42a96B0e33BE5F7eD18f14ffF7Aef14c99F] = 1; _balances[0x661f4B2c3675a4c1D4CD1DA8B7975357B01ec2Fa] = 2; _balances[0x528eDB13C46fF3Ff67C02ad23ebe230bF49f0b0A] = 2; _balances[0x9D0242be6a359935a594101B6E197EF008524239] = 1; _balances[0x414826bEb718F2b204Bca67b949604bdC739fCBA] = 1; _balances[0x3D5c457920Ff88a7a42D2aF63d450E5F2da61d14] = 1; _balances[0x90eBBdcd83B62C5528b4c95C58cfc5c054159836] = 2; _balances[0xEA06c7B29fEbe294C934eB8BFdEc476399063A5f] = 1; _balances[0xe77F50BB4734131b9dAc49Ae9bA243164030d1CF] = 3; _balances[0x49131F1A71414cc29fE5a8d408DD6AaFe0E48C4D] = 7; _balances[0x09800064d8321571e657C507e62cA92faf5c039B] = 1; _balances[0xe1dE917A6089f7c01ACCFb42695e2411d3B1DfD3] = 2; _balances[0xaa6CaA910C45FC7994bc5130F0bDE78b0Ff5E9c2] = 1; _balances[0xEEb6Faae3094b31859f6B7b34a183Ae212e43cfb] = 2; _balances[0xC006562812F7Adf75FA0aDCE5f02C33E070e0ada] = 1; _balances[0x71bE73dc95f816F69c9fB95EB985D1F1723f2392] = 1; _balances[0xE545C4A3f3265AA61366fda81f9c5f4f07A94c7f] = 1; _balances[0x12269196C57e800824762E5ed667b5b8BA5e364E] = 1; _balances[0x7d7d7F1A2aD27c110f91Eb89FF9c724B0Fd738F1] = 2; _balances[0x9b353523F266b3E1740f4077F5cA6A5aD070Cd8d] = 3; _balances[0x347d60941302bcB2E8AcBA3Bd78a8102413D14d4] = 1; _balances[0xa2f8ae5AF7Bd75d54ED172B3b9E557d104D3913C] = 1; _balances[0xbd16Ea350f19025ad2B92C3325a4D90e1205c7be] = 1; _balances[0x537b8e05b64D4af48d872F4251fb17a6A495E2e3] = 1; _balances[0x135b123FB59914DD7ff8cb8d2E92130D7BCB7bb8] = 1; _balances[0xC1117743CDE4dF3613A21a68Ab67CCF2cf040a54] = 1; _balances[0xFd186097B50370f400d0B428B9D5fF30b445a1aD] = 3; _balances[0xF3729461EB8fA31b078E4d6942c8c7f8Dd980989] = 1; _balances[0x0E944b6dEfBE18cb96a23AFA89325d1bfb01C5D7] = 1; _balances[0x782dCFDF065DFf4E80AfF38DAF6Df56A140181F4] = 1; _balances[0xDDB78a9f19Dd30246f53C947EC2eDB9dbAFF620F] = 2; _balances[0x5346A77C05FeEB4212Ae787bf3FDdFC48ffBcaC7] = 1; _balances[0x60aE12cDa66dab717d6Ab827148BC27eA22790a8] = 1; _balances[0xeE1CeDC52b268AB57844D0713657755af36671F2] = 1; _balances[0x4caDFE63af96404BcB3FbEF877Dc7AAf2593156d] = 1; _balances[0xa115201E245f16CcA90Ee1039290b690dddB5ef5] = 2; _balances[0xed01D36c1e315bb44b83d28bd78e78fFAE907ecf] = 1; _balances[0xBd852165A6fF4A4C04c1e378BDc90d6801929457] = 1; _balances[0xF9EAaC7E3ADa891F96CcF670cc3317A77CB5C7f7] = 1; _balances[0xc2587a1685b194831C0e4a8927DF0c33437fca3F] = 1; _balances[0x14A0adF86EE9b596f93DBb7dA5AFf6Fd7d3Ff160] = 1; _balances[0xb622772dddb59a9939458D8322e28a54e2ac1E89] = 1; _balances[0x8A274082CB26FE745374d4Def69C2432EADf2495] = 1; _balances[0x0Be2eA1A4b1a4098Ba535fC92F2352d103B5FFA0] = 2; _balances[0x3558B79D7503c0eCEd3B76CbF1894Aef327b0e76] = 1; _balances[0xf86780EdE26501CfC4649B4c1D7629e68A10F314] = 3; _balances[0xCEFD0E73cC48B0b9d4C8683E52B7d7396600AbB2] = 5; _balances[0xcB63958cAff1b3b94CB0D6875cD23e945B06A9dd] = 1; _balances[0xC7f8e17a84a8B18fDBe539C62A02A2709a044c65] = 3; _balances[0xEF610520a1ebB4c1F91d5A94D636a3274204D74c] = 5; _balances[0xb75ade59b0B962f90d1428B7024Dd628cC993Acc] = 2; _balances[0x10C342c1188Ce7c8b3444D8c7b99765Dadd5026e] = 1; _balances[0x88Dc672624B511DBF08881624629a13AF10aCFCE] = 1; _balances[0x1c70D3a0A945a5146cB852C47C9f93cA0b59aFb1] = 1; _balances[0x8F18d6a49Bb392a84A4A4c03B69D29179e333946] = 3; _balances[0x4c8ad72f93C7BD2131701F3790e6D06cc56c651F] = 1; _balances[0xE79Dc3C65cDd6B7a443297D2f412e27ff43eaA6C] = 1; _balances[0xEa88d663E8cC803bE8713199437355Ee50f68EBF] = 2; _balances[0x48d89aA6A0340Fb6dF240bB04611eA4d3dD4fa96] = 1; _balances[0x8719CC70152c03B0282216f4B97051467b2654Ec] = 1; _balances[0xCb7f2Fb6f83654E769e037C8d937f96Ea55658a4] = 2; _balances[0x790d5818D56F5a7a8e214A42797752822117BF3D] = 1; _balances[0xb104371D5a2680fB0d47eA9A3aA2348392454186] = 2; _balances[0xa9DE88886d114a4D7abdb43aD3a5F4BFeEdB5557] = 1; _balances[0xB26c7C84456241A8a48b5C7177f71A84Dba7B084] = 2; _balances[0x7d7EA735b7287D844c3A9312bC1114C6131781D0] = 1; _balances[0x7217BC604476859303A27f111b187526231A300C] = 1; _balances[0xfeEdAad550576fD983e20f7215D220983CC04b92] = 1; _balances[0x9130f074D25a3c9FD6C24e16e3d03CFd2dD6dD7c] = 1; _balances[0x5BfDF0CFC4Ade055f4aA63c31D3B2558E3a5fd80] = 1; _balances[0x4bd824E420f205A83eaB91875EBA1F7387f7516B] = 1; _balances[0x288eC12Df523Fb9C5D980d069746bA51886F93b6] = 1; _balances[0xe54CF30A3F31f3076e9Ab5bd122379545a137B4c] = 1; _balances[0x316b26cBe75864e84533751a80Ddd761d46115Ce] = 1; _balances[0xD56e53c1889E0ac25A6f7035419067dC7471d71F] = 1; _balances[0x912A7354832505C84F908EdB0061E8f240594A0e] = 1; _balances[0x12417A1213D1863dCA5BA87eE6Fb4da479772e3f] = 1; _balances[0x9D1A1d3ba33FFc81346f7c608d82073a3e640fa5] = 1; _balances[0xD9311FECd70dd1e5878142C97D87A93261209221] = 1; _balances[0x0A19eA2E5e48DFbe5d794F0afd22e65Bf01e89D6] = 1; _balances[0x078ad2Aa3B4527e4996D087906B2a3DA51BbA122] = 5; _balances[0x29a054470Eed146B0733D688d820363d83C1863A] = 1; _balances[0x23d291F1b610B9881B99f300C5D70012739a9ef6] = 1; _balances[0xe4E89064840e7b11764Daa866bCc5F60Ab7B873e] = 1; _balances[0xC4e245226537A0B1c5AF30079Eb0251504b42793] = 5; _balances[0x943b58912ffC9667c93F3F70e08A797F7CfB6d9e] = 1; _balances[0x41357F986bec5e47e196e902439528dfE1Ad5051] = 3; _balances[0x7a6A9596Af512a7E5B1EF331A70015CD3Defa1f2] = 1; _balances[0xe8BC84d644506930013217e1a6E903d5Da8F906f] = 2; _balances[0x9762dd2c12127Ac104AD18cf6742Ec95c6D3CE1B] = 1; _balances[0x001511D1CF99D0287f65945498d34e526cc40849] = 1; _balances[0xc4C6C27B2259794a1Dd35D438E703281C0e4A004] = 2; _balances[0x9e35Da209b7b1410e00A5E6349462D343D934E90] = 1; _balances[0x7310E939c0A814F15065cE27aFA8d493e30c899B] = 1; _balances[0x77d550883410f4D1D88c2bf79132f375cFED31EF] = 7; _balances[0x28a23f0679D435fA70D41A5A9F782F04134cd0D4] = 1; _balances[0xFcaE89f3319C760d4F481A522aa717AF81e93E77] = 1; _balances[0x8A1a6616253cb617D92F5e539b3570A9EB483127] = 1; _balances[0x6FFba0f70a845Fd5e714257b4C4b8625f108eDc6] = 2; _balances[0x81DB7282709C313bee4075A0184D9E42fe304AaB] = 1; _balances[0x379c8800dD777EF5fbAbaB6689f42d3B31d09BB9] = 1; _balances[0x94A468FCB53A043Bf5Cd95EF21892E02C71134Be] = 1; _balances[0xbc8492a5815218920b0C28Fd558d427D77C91aB2] = 1; _balances[0xc3A0559C8A02330ef46f84426d752d4ea06ab49F] = 1; _balances[0xAC773459cCb746FF1f057D5B0c9147293Cdf4c26] = 1; _balances[0x36Bb8b403846CdAB5721601b008630Eae76d0079] = 1; _balances[0x1927ab7DE3947BE39Ed9A092C34A3b58eFa2adF7] = 1; _balances[0xA93755a6A7cb1CCddE8dCea4B81Bb34ab1c83a5E] = 1; _balances[0xBc58AE47B94DC703b07Ea7883c2715FE7125f946] = 1; _balances[0xdc2D5126c0147863E97E2A5C91553AC45FfA5374] = 1; _balances[0xe8240357Ae853ADB09D311aFf07b26563aAB6720] = 1; _balances[0xa326893162444C043D16f885731F93C60710a369] = 1; _balances[0xf09000ABe7ceBA60947768793038d05b9678DDC8] = 1; _balances[0x02d53ac91ef54bCA4F557aE776579799D6fB4DA3] = 1; _balances[0x2bcBA14f244928B2f9d78a5727DCc109B541e39f] = 1; _balances[0xa80a64A4Dc392AaC25253F0fFAC0a09347092184] = 1; _balances[0xfF0c68CdC0Dd46A6eD8ba68e887A2a673C46F4E6] = 1; _balances[0x6dA0da6Ad472b35deEC827F5bA6e8963Fb98a742] = 2; _balances[0xf15bB9bd837416219586F8B9Fcf3f1458961286E] = 2; _balances[0x09d520c793dd698bd910984adB4c4718bb20bEdA] = 1; _balances[0xa6766e0e6C72895040aD2b0308E8959e413Df04e] = 1; _balances[0x9675B8C97D377D28C11fa7e3a147946b758CAa15] = 1; _balances[0x36a59B5CBFe6F593085Cfac605500A598De8aa13] = 1; _balances[0x77e4DA86C3A075cD46284710065E34b4973663D7] = 1; _balances[0x280e11896Ea1D822305B9b30EBF72409A3AC3586] = 1; _balances[0x708C183E39FCFDE0917Bbf0848056A896686831e] = 1; _balances[0xdE9961151F88FE5060C3621E042ab7d3aDA7140F] = 1; _balances[0xFE44ed35c5900dbdb70E4B91EAED92B6F339c8B0] = 1; _balances[0xfC9dD877930e9799BeB663523BD31EefE3C99597] = 1; _balances[0x288Ce7710D778f584B7De68eddb14ea3D89fA464] = 1; _balances[0xb6B3b211830bAD036a78bC196d70B2A45Eb05d7b] = 1; _balances[0x398c36795063dE7D7C268C61C3361016115FaaA6] = 1; _balances[0x9aAb81A1070cF0e25D15c210Ab2c66FfCe071470] = 1; _balances[0x888eaac3021E5eFA79F9A431cB32c59acF047957] = 1; _balances[0x1888440bcBE9ef9Cbe85a3d11Cb6B2Ff9A7Ebe86] = 1; _balances[0x5efdB6D8c798c2c2Bea5b1961982a5944F92a5C1] = 1; _balances[0xB819bf611D4051959BfFfB75b8F81e19127C3660] = 1; _balances[0xbF146E9b90297470Ae466800e365AFC08C9af9ac] = 1; _balances[0x5E049c452DCa0F1991C3B8c6EB38A5AC472EeAA3] = 1; _balances[0xA465eE4B2FB82FD27B06D1356D55aCE9B747D67F] = 1; _balances[0x2B92376Dc4F1Cd3F7c07ecFC3579354B2f20AbFF] = 1; } function howManyFreeTokens() public view returns (uint16) { return howManyFreeTokensForAddress(msg.sender); } function howManyFreeTokensForAddress(address target) public view returns (uint16) { uint16 balanceForTarget = _balances[target]; if (balanceForTarget >= 1) { return balanceForTarget; } return 0; } function cannotClaimAnymore(address target) internal { _balances[target] = 0; } function setBalanceForOwnerOfPreviousCollection(address target, uint16 amountToSet) public onlyOwner { _balances[target] = amountToSet; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {Initializable} from "./Initializable.sol"; contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contracts that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {SafeMath} from "openzeppelin-solidity/contracts/utils/math/SafeMath.sol"; import {EIP712Base} from "./EIP712Base.sol"; contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } }
// SPDX-License-Identifier: MIT 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), 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) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT 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 tokenId); /** * @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 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 pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 20 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"ClaimPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ClaimUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ERC712_VERSION","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":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokensToBuy","type":"uint16"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","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":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"giveaway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"howManyFreeTokens","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"howManyFreeTokensForAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftForClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftForGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leftForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextClaimToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenToGiveaway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":"target","type":"address"},{"internalType":"uint16","name":"amountToSet","type":"uint16"}],"name":"setBalanceForOwnerOfPreviousCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"wallet","type":"address"}],"name":"tokensInWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"unpauseClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
6080604052600a805461ff00191690553480156200001c57600080fd5b5060405162006a3a38038062006a3a8339810160408190526200003f91620035f7565b604080518082018252600f81526e4372756d6c6961732042616b65727960881b60208083019182528351808501909452600284526121a160f11b908401528151919291620000909160009162003551565b508051620000a690600190602084019062003551565b5050600a805460ff19169055506000620000bf6200332d565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35062003299600e60208190527f8f69c3005e73069609cd9ba3a58773d93f951c6cc1dd7df79b78af33e4f79cb9805461ffff1990811660019081179092557fda9c9802704612c00821ea8f22bdbef17ab8237f360924d4a9ab5b8506892b2880548216831790557f398d994f2f0ee8ead48a751dcabe654d21091628878fe529ab494dfb4656e56d8054821660049081179091557f6cf5988c098d08d0d44086cdc32d18c23549f9106d96ea48cd87ee3368fe8be380548316601b1790557f82fa3a624cda40035fc5fbec496e9cf092636c0102bb2d8a1aaef75545c02aff80548316600f1790557f7e22675e4bba69a7014f829a1f20ee5f47eae4018f2425b592b6c07b2a11195380548316600b9081179091557ff0dc21c8aedc705df88b90ee99dcb562197f73437bcf28d7e36809c19d1968c08054841660029081179091557fef76e61bb427c3f8c148a8baa13177855066704220ced007c921568bc790fd7a80548516861790557f34f3829b19863890d4722a1b25126d1c7696d3edb1fec43ed4866ad950d01db98054851660069081179091557f4273d8e45a2ea92936883a90891d83dab6f4e5cb7209cfc2c4863613f0f8f1678054861660039081179091557fa3f0cd7d43bb9e8829c9b842edad2da4111dd651d67e6df09b735189f172549880548716881790557fe1b41af85a40a0cca2da39c7b5f8bf89c3aca99b8994bde016f2a8927cb309408054871660081790557f18481630fa8f1239a5dcf0dfa8c29325f909c51218731e548fa3cdb47f58df6a80548716831790557fdf2c05ad0e1fa056105c780420555fd5d7c59b352ff02087f89b1461a1a67d8d80548716600c9081179091557fc214b466cfaae1727367b2810bcdb5291cbd2130b9256b4c6844b5e59faa04dd8054881660079081179091557ffa811cebc64301318f5bfea82a0400f313a7bf1c9af6d5c20a4725e3a093b00f80548916841790557ff0ab5e42c54ba46f0aa628d7ee0a8aa937c265dbbdd33e6e812f8c219e92f69780548916841790557f09e38682c274b52408fdddc3dae2f1678d996692dfdbcb59f2082070ae75367e80548916861790557f802bc382dfbc6c25d98aa2ff9d02d025989d811a4a6d7a2bd309108a36cff295805489168a1790557fade1db805571da1de5e4052e3102ce59ed84de4e5310253711cbd15559d4b70080548916861790557fba992120e893fedc44a8568de9ff84254470919233ddbaeb0c7b4c901807ef7480548916841790557fc8904ec928fe66bc6c25e5b54f6f32434b2da395bdb76f372c9593cbc9ce06be805489168a1790557f1148a8e1ad1b80986c4f28635b25ee8a6a86c8234197cd3aac53e1fdbe0c210f805489168a1790557fd1e4615f6d830d3c88f0d6ee22f6d28d156db0dcf27dc5b06619e584bd3927a780548916831790557f2909705cb9a86f471a3aa2efea4a7ba70bbcbc24837252ad37bde6eda8209ca6805489168a1790557f133904f15c98de37706eb684cd7cc87684bba56635429ae7ad0df785994fdf2f805489168a1790557f94e735a4172190ba827cb23c7acf9142f4f867d12488c21b787b7360c97d37c0805489168a1790557f21ad5ebc49d5430ae7d65c4582219c91bab675b33e897595063f3682d10170e180548916861790557f23a25b405c205116463b4528a617f5e75bdd90ff9ad8154e31fbd4dbff70d52480548916861790557f690f099f145ed922bc70b4e4f6d2161e81752b4da74690b14c6efb3eaa921adc80548916861790557ffc5bfaad1f26ff6f86e9a7d843e34a768c9a30df5d8a24c01aede67b6f26b3ed805489168a1790557f3a90f8154aac4d0e6ecf0e3fa7085b2eca5afb987ba9aeb7288f82b14dd0d71b805489168a1790557fd2d7628cbdcde44709a09e938d50e1385fe5551a7fd9e3d05415bd21cb49c4ce80548916861790557f7968f0b3e9a8d1b8e673d87226f841cd4cab1057df0178b2671606049c9cc6f280548916881790557f3a8486fd89663826cde596e6c2afae0b6b8c1a8ca34a2011ad8eb9e7fa688d36805489168a1790557f899d678dca3a2086f721889d858a6773aeb60931ad88ee05a29fcd1cdc6e4e28805489168a1790557ffa7a7b13421be2fc3d82d40ce19afb71c59924bf9295289b590feb8dcac6c57c80548916851790557fc2c5bf0731def58609c2450b629f0eca19178d6aef48153e6fbf9c0e9ade2f4580548916861790557fa0c9ac8f80ebd26fa0f77a34c1a7199a4f692f3c7c62a9e79a316ee92525ef2280548916861790557f5e5c28b100b6e3f2bf06d4ee1a76b51538c86d680f54510a9f131132cddf3230805489168a1790557f570d8c1177ca549301fc4be2ebfa1f745c3b572dc159db62c4df4c3ffa908d38805489168a1790557fa539f906c12900889ef6cc777bea3ae8caf9da8cfdcfa72d512a9878d5f2e51a80548916861790557f8d746dd6ec45e2c76f34cf04c5d4c6bb81194fa5d7c0b73487409b8881c41f74805489169092179091557f37164b6c5d1e24a3b93105648b491037bc0c37c388fce11a92d98cd97a2bc5b780548816851790557f97caad2a2e52a20800cbb60f49c40fbe4557b8a1f5ea3ff3414e0735c477931680548816891790557fd69e12acc41d8b115682d39f535e3a21eff63f7df3431da4db822df36c2dbfd880548816851790557f2594444c9fdbbd013e72944307961ccbe96777298eb94488bee9e5ce7dd5c3a180548816831790557fd40ff18a9634abb0859d8d85b9289face84a46c23ad48f6f5272a8447af30c8c80548816871790557ffae539fd964e76e2aaef076791dc424261eade7faccbfcbd1e35f23d7077e15d80548816831790557f6ff1c783ee824ef7d4e22fc45ce2d3869080279ba922e64ade58f66515966c3d80548816871790557f74daf06512cc8c1390fd1ca50dc73337bbfdb91d5bfc24bed55347f980b0e4e180548816851790557fa6912808adb3db54af14253265c0c66dc1946291fb78f223d46923eebd316e8280548816851790557f2b4c163e9ec3548674ab9aa5e90274ffc7fa26342919bf3234ded6a18f6abb1980548816891790557f155aed0261b610de516cb768090ed78eac12e0063084c62f2e8ff412a7d20a7680548816851790557f16a9ca7bf8d90bc2ba9fb9e9403edba386be6999b09759556c6fee1218d3ef8d80548816851790557f60b23796e4fb4e2356118d34066d2a93fc57de9675d964ccf53e4328463e380180548816891790557f0edafe835814b1f6bc5fa18c2694c3946b9a6746542016866da0d4d15d346b3b80548816831790557ffaf5ee572a82469ff2c4fbf11af063bad3c1aa5081a0dc07954f83a395f6966780548816891790557fba59bed4633e0cf581e983186be51d5316bfad507cbd4144a293b48676cc3b7f80548816851790557f0a12c4d221527947d4077f8917bdfc7a0453f108fef00ab0c18dbdeffe3dbe4f80548816851790557f733a999819c5fda76c8fef621a4921cbd4c5923f552cdd4498950323bdff368280548816851790557f2e4ad1718a41ea4a1257806aacfd9f5a48e99a77bbaddca132652cf2e4ac89e480548816891790557f3a84d518e3e2509bde2a28151b0b708805c6436ee38bf5cc87c0530577e64bbd80548816891790557f579a46e840e3fab1fbc3b4bc9aedac36f9eda44a527f7d033e0803e1cdfbada480548816851790557fcf75e19e1dbb9f05f3cb9b7ceefb486f17314b06cf5afa619bdec0d82866566080548816871790557fc730772ca81143a972b239e6d044179babee839ba20aba8af74c24663f513d9980548816891790557f15682ca732bbcd5acb38faa8b58879a6c6f7c466b6276349b0cd917dde89b30a80548816891790557f0a2d4cfbdff41fdf4867c2329d187d81f60cd253ed401fffb24ca9d2c71646f980548816891790557fa659c63f4887cf96c4cc989affa1d5aa33b86c6d653241c81ad35a3273c8636080548816891790557f02b224a66c9230fbb91a5b705823ec05474b52536679b4f4b4fbca12cc9d058280548816891790557f72e6e38a39991824a004393fbd20005f4f6b177de3058774ed26afc1792ab67580548816891790557f8e82668c53c784152a3e3b36b8e3b503f58d48bb621caf650776a267c8a2cddf80548816821790557f5b9dfe0aa8ea296b23ccdbe1dfb383d94ca2e754498bcc6eb27599b04ed3a05880548816891790557f6fd6b6c24d47d5137cdf26a01227bf6d411c50e52e4de58834ee85285db5781980548816891790557ff8cf09c9eb5d5559811012a816e6e2422c56eeaed02ba6625718196d7581981380548816891790557f3a47a0b14ddd0ca2647eed939c7c8c1e26b2d6f2886b3b96c3fc1d31ac81d94280548816891790557f9be818b9b3550de80d0a3fc659a01d272fd4bb568620af03642140c2697983f380548816891790557fa2adcd6be7d90e10c225f92fd1a592f5e1417efca7c3111c9d03fcd345a540b280548816891790557f7762b34f786305bb79a0b04b94bdebd18cf8074edd54ee1979d5bdcea955d48380548816891790557f67eba617edf932f324c05f0457fdc2b46f370cc0e2110ce767456933a42915c280548816891790557f46ae4ddb068d8d817d2cc53ddbdd656698e48eebb29a30a04a053fcc78f5fc7280548816891790557f9d8d03cff9f5cadca6a7c7dfad022ca7439d9a4cbd4e1411b2c36bed57a0101780548816891790557f6396c1ae28d5459e4ecf1c2a53e89b444846a3df709183d7123da263735ecd3680548816891790557f3af473e006331b26d34a9b2ff446f9516486c4f24f9d6870f7ec1b5ccc86c00180548816891790557f2dc0b583b4fc00c5703ed8a1980f47ed74b96e5a174db53f911d35982b7174238054881660059081179091557f2f279b82dd6998543a6151913590df0c235b4ed818410bab28b59ce5e23f76f280548916861790557fcf8413ada8fd0d010396745a330ffc6cfa92c4346a0c0f71fc052567cb6d88a5805489168a1790557fc57ce175384201b429939ecad7f2a5e6ccbf41e0cdb18dcff5a5f9b37618cdfb80548916841790557ff493ca9dac152037af172ba1477797f6c62990c664eefe5dfefe541e714b3e8b80548916861790557f5e5ed442c75e30b0671c4342a799089cf9ff0d2a147af58bb1489d4344b0005180548916861790557fad4fa8c5c933ee3f97aad6e79fd8b388162b62a3d9fe2068632495feb14de59380548916841790557fa0d9ca56d94482415201034f602ae19a050d3e9d4f007b7bc61df76e42cfab8f805489168a1790557ffec4925d03c4450e624be952db4d348adc7e384669ba6fde80fee687bb32a84b80548916861790557f7a405412b5dcff02e8f6082dc67af05e8ee4d3232e33584e2911a624796a40918054891660221790557f2b2cea30559059424803f21584404184c0f2e81c0dc97179e3f234e3681dd36480548916861790557fc6f44c1474766b97e36f1170ea0fef998235bfbe2fc6c126ea91c73c0d0167b780548916861790557f453ed75ae398e120463e28895599772fe10c533f9cb00c99bc0512895a2a58a6805489168a1790557f09b7ddb8b1b7c6d0a797957978d6a17f7885e4fc66127b258a8f209708fe1d09805489169097179096557f847e97b13a9556aa3e2b857f1a0811d74a19102dc97e35669dd7803e29d31af8805488169099179098557fb48b2c3ce3368b7f6b5990699deb42f5386acfea6e3019d08843dcf7bed65cb880548716881790557f223b972cb4fabcfdd4573483f4954aaba46f2cac08eff2b82382e54036556a6780548716841790557fda4832feae9df3a141662a025e97764538696c172f1f1bea620716c39f14d48a80548716881790557f6ede4b6ddcef1579dc6aa542a0c5ddb749ea8088fdd554553fb95c07f074c91180548716851790557f069ce839533c77a735376c4a9c85ab6413feaab7e4666300117bbff988c8b79480548716881790557f7d68c4922c130527de93f6905506bcb3d4d61cb5c78dd45ccba9313a966f3a97805487169094179093557f5f0ee277b281c1e119f739736ea02c90286f057a689a47952abf1157af2f6a6380548616871790557f9db9bf66826e7de917e4a67d84845dffd19e58ca333030294ee5190e18869cff80548616831790557f19800ea17384b13b24d330dfdd221e400a2f13b577a7d002fc9ce5f52fa98b2180548616871790557f289be84ae715f646e29978672e37195cce69d8aa5b3c05a9627ff6021455f10e80548616841790557fea6568625de083502464e20cc25ea60979e65175ac5e97237852a35e731913e380548616871790557f7a9a8d80dd70666a4e1ad8fdc39ba07a7f49b9e4ec2c0d6ac5dedfe618b5985780548616871790557f1b2ad0c205e93e8e17970cd5c446835b7e9ad192cfe038ad59b236067ed6092380548616871790557f4382dd4a3d1b33d836ba13e00ef1a163ed9996b4c531ec89e366dfcf16f1e06580548616831790557f36a4d32fa78b43f3cbe033682ab20cc67148229a16fda4b886408c105be0a83d80548616871790557f6b8b2d6b80d2f96cbe74c1dafb072135393ff6ae400a17fed825a84aae52f9a780548616831790557f63131b59af380feda5056671dfeed3d0e5fe7db69727d4c898b25c4663049d8280548616871790557f961ba2e67b50b82f5acd8950a872d67b2ad7dab08a20783acc6ddc04d78c77e180548616871790557f59a2e032bc4c0ed1c0f46186435b012d50a8efb9f96a797f504bdc9c3624750280548616871790557f9d704fe7f069929cc0a16449d4f9fa4df6ca84561dc22243af0b64ac81e162e480548616871790557f412d20039cb2c68c7038c0f43d92b86017475fe4d96e021ae2bc49746dcb28a580548616871790557fb6a1eec5fc9a23a6d2b7a0710b7740148e8d3ec14245b6cd1baaf8d40266144780548616821790557f6fed1907ae123c096ffe1cc5d5c89095dfa36c032aef344be2ecf69902e1786780548616831790557ff2cc32faed1734b20cbbff15b53b6baababdcbedb249b847b0b379b60076a26880548616831790557ff4396c4b3b70f13b23b5ba21af464789b865e331468d6da56971ab3f3ef035d880548616871790557fd6743131793ddce7316a024dd6370a09b705c8b52310844c53a9be2bae9a247580548616851790557f8038c2ee47191002f13633cc0fe2699a6ec0c8ff3b0ecaf38d6b3145e5ff98fc80548616871790557f63b246cc405de7c7cd0114163bfc05ec5db848722bf441723015ea83a5cd974080548616851790557fd2fe8a79e5246f16a14cb599863ed39ad81c2406b04e1373463ee5aeeeaaf92280548616871790557f77b04650e705d1b6c67d3b0bdc9eed8aaf50ef4aa88f035ed027640b1be4c31180548616871790557f0494ecfebe504347ee66f78df253619fe87f3442a93b4d854669c090b439904d80548616841790557ffa7c23fed2cf21d7113b5fa4a626fba401442cd36d11678f767fc9b40be8ab6d80548616871790557f80b11e4b3a1ea3ed11b5fb7515d2bd9ab290147ba5276878a55e137740532b0280548616871790557f5541c52d15a733f3732aa3b1726c59447885b1f262d54ab9bc4dfea4f0e5484580548616841790557fba2ea2d3afc5af64a3cf78bef8de32236093b65f1cf5f294cdbca8b93593224f80548616831790557f7176da81dd66e576a87e5f489275574b7d8b5a5f238a91c2258a89e75aa3653d80548616831790557f091d8a44da8854f297a4bc9c8e2df5a8f38752c24d141e6303986ee6008cf48c80548616871790557f2cba35688b40f6e8ba22c25391dcbf688b9f334ecd12b043c6a917d5031e5f9a80548616831790557fe8ded27bdfa84288d381901d0bb7a11e7bcf83cb0bd75e47fc05654ba59f7efd80548616871790557ff21adf8ef92a9b89794e5b8ca62fbd05f79fa1ca958d798adb57276d4b3262b480548616851790557fbd604be8c62c6d38fc2c42a07bc2e3945ee1f3bcaec7b784f9de62e08001368f80548616871790557f88cd0a8beebeded06e9f91ee97baca249d729978d72df9951b7fbdb9740653ab80548616871790557f8be799ff691c86c10067ab409895637c01d7c98805672bf81cf498bf0763b19080548616821790557f44e1472c8fee0ef297ce64d5ded8ecc8fe05884ebda9864ae9fabb282af1deee80548616871790557f33f5400cda9aaa121a3094b9bc4b8ca0aa758701166eef98936b050c07ad989f80548616871790557f053326b8b675e6d34cfe604c865358021aaf9c7813870774f3748b791ab0780d80548616871790557f8df66d18f01aaf619e448204162b7e70a056a349bb5736f198ade84177eede0280548616871790557f6a28a30b18bcbd7c4165e81d837486a70aa10864958a38fa7bee77e5a32faf6780548616841790557f03328dffa0930c7fba19484caee987a88e722400745f155448a4bcfd9fda099580548616841790557f6187260e9cc22f48e0459a232c6074e1469c063afb8874b4e3ca95c36c021abe80548616871790557f69f16f6cc25a08115f571e82c327c42217f6c655ed66d6d1867f62e454e808b18054861690911790557fb1c17411d199e4731e008c15602e50ec53feabd01623169393e03e89661be9a180548516821790557f615d8a82882ddda33983bfc1c54458e3b1f6ff28b8c8d1d2424ba6ac1d0a801580548516861790557fe28e08713be429099090fb15633f9975bccb66077099e98530132dee20461f2b80548516831790557fb3b521151d99e7390e2bc35b8f1da3d774f36149eb9005b32ed3ddf93b54994280548516841790557fbe8f902bf79fb401794f4046354ce7c53659a332020aaf9235613612b09da79480548516831790557f5ae7e2632a94999710f65fb076575129b4d1404d73dbb3ee8dc236f659ab01d080548516821790557f186a0f2c0e958b8b76ddc4a575e005c810b3815ed4cdf85722701cde74334e0c80548516821790557f81ef34b567c0bd7336f2d6380e1628c64eae2d83b5e27d97a7c2770afbbe446d80548516861790557f2b5b2cede3f2e213d9d5c5f13567c05a153d7879cae654f80118aab7bcfba53780548516861790557ff4a507fad5054c4acd58b81f7f763718934520e95c620cf4dc8f0ad8a4a2bd6880548516861790557f5270cd5ff6eea2bcb1bd811c33b7b92bd6de9a1c4186526e296e8ba786b770e680548516861790557f779c72ee843210fcfca9d395e157667044f7ac2fde24c825f0354b0ed1af905a80548516871790557fd2ddc399aeff32a0eed7b6090ee669c0e72ee7c8e63cf0016274f2f8c6ca210380548516861790557f2e929dfd36e2e281b16c21a54816c4acb42dbc57dd28dfa69f0388af1f42cd5180548516861790557fc7b207102e722b55993842ee613fec245afe143f6598a46b7327a78ac1d7c3e480548516861790557f9389277e8fbbe98d8f5733b196371c8cad49157719325f999fe9e93cf34b4a7e80548516861790557f8273351b1d74dcc4ab2514f6bed0ed1db0f5cb229f9d7b6b2bcacfd2798e67a680548516861790557fcc6717c7c9989d21035820117114d51d5aa52937f93abc0bd324f4dfd87d306980548516821790557f39c458c22f9a3dd6e04295b6cfbe443cefc808dac3542982a554d52e59e5d8cc80548516821790557f2fcaea5c6fb5da6af7c74eba0352541bce8db42dbf9b58ae24fba6dfef3ccd3380548516861790557f967051e20663d70033aa2ae09850c6dbcdc66a518f457466a3bb7148a4f359f980548516861790557ff4aaef70da93a02cfd8d005eb5f88bbede57889aaff65424e25cbf4ee1b4e03980548516861790557fb8ed399b88003212c2922a05bf2635996fb1f129c218e87ae0bf9cafe51177b480548516821790557f0cd4d255fa5ec8b3293fc30051a82ab7bb505cf49e03600eb4cdb4bd53ce89e980548516861790557f1cd6f28f168820ba854d8fa45a518d4110e0a628df73b81be9b123e98c9f345280548516831790557f17110e302732357ceb0500a10c5b663bfe515277a9b15bda442bceab156c3a5780548516871790557f386fef0dd3c4c815d0506739ceb5ceb376d20c00f5edbf0ad4f91f41e9e575bf80548516861790557f8140f2f36000b575cd97506679cae2dc7ce460c80ff4e0efde0920c1fa6c5ab480548516821790557fc508353b9ea0a528da755425669f251ee7d8cde6d2e0a6690764137ae4ac1ed780548516861790557f29c160bb6af82e202acf75b3353c4cab6586ea5566778ba824a9af8dfc2e5ea680548516821790557f37b40b733405c0bf6c1edf4e6cc931da93d9382da841e54d0369eb7d511c5adc80548516861790557fe3cc0cc3db9b15b524def86b16d9166cb03794eabbb1d4089ba381417e63ffb480548516861790557fabcca061cebb66e7064088cb08c575f75f1ce0e99a7ca84e691037a01031e7e480548516861790557f1bf14747ff8cf320de447dd8f7345a8ab7cabdb1f824146c3d92b9a5f461babe80548516861790557fb98683685b3f56b2f959b4819ed01f8cf47c9a2e4df9636ac5d62310412dfdfa80548516821790557ff3d9db6020cd7340684e836d3616f38e2db9f111c86d3b54a25a82e36515788080548516831790557f90224e20eb1a288d7b3e8fd5f197e0c46d7053b609de3f4b051e4a6c6e18679180548516861790557f6be82b3a989ac934f701ffebc1f3384592b41c6ebb324097cebd3d65fbfe42e080548516861790557f3719ddb799b50062a60a9ad35c63be6d4008ffb08a3791313164d1166023ee4c80548516861790557f436c49a7e01d3d675b6b597532735a42c4d059aa8983919d75eed2bfb68b95db80548516861790557f5bff12d43284d77c5c2e93faa5c2e7c1a50594e26951eae0184811106c47354880548516861790557f61acdd37e9eab5ce8d7b798ace73ee5115532df2966ebe0642802b6c83958a4080548516861790557fb4cb9ca321123fc9c00f1befe2b3b28734d650905557aea98b3a8d92e0c8ad5880548516831790557f759eb338f3c4d2e6e1a3adf29c0eb6e3f4ce77308c085622b24494784e7f8a0580548516861790557f2e181b4f56b558860ff2af416a051d0fc372746cc6d6717be2d4800152d093bf80548516861790557fae578f647705333a2dad4f3715bac1062dd678f1075fb54ebd6a5b71aceae70980548516861790557f03cf771cd86a42ed59bc8a6a27d390ed2af1d51f315cbdb7dc466477eea5eaba80548516821790557f985f75c21c01a7cac2f544d9d9a46bb078dbe9e1f059cc61ed8a8a1f3632870780548516861790557fdfc6e4e181eac13f9b656604868c04682633355075565fdaa8d83b66e0d8a04280548516861790557f1b99ce11ae64ddbe5139f7920c77f15047aad7c27c9ebc0dedd2da95e9592daa80548516861790557fea9f32b74da67112c866222a0fa048ef03533cc23dff30ed8866f012dea79d0b80548516861790557f0b0b726a3d09c03ac8d524de0ffd4f0c2703fcd01724b6b59925ca6f83e52b4380548516821790557ffebcbda615f4910eb03686237259ea28a491e4c371567950aa5f8aa3c88907d480548516861790557fdae2c7dbed3b7d890389e5c5d671317c5367a5ff7c567e04c909555376fef91e80548516861790557f087546662b730f4af05a6edf127df706459ab155702122325db1cb9ee0ee1de880548516861790557f4f3189c56653c9871871dff1aa0d878c5fec0111908ab43b1295d1bbaab7015780548516861790557f1dc4f1c5a0bd822d584cde53048308cae93e3e37234d49b7d8647fba008e33ce80548516861790557fc7c9b9aa3871eb3856bb567d8394012209c2bbab583e8b09f4209cf61d45b91380548516861790557f20c8117dc68f9e9c3291e8af56b49c4368fe1ad117ea2dd926f0d7572b6297ca80548516861790557f93a60bf64c64b343574ba36c8cb9b01bd89462bf2c81f1cb17b2a209cb8fbb4a80548516821790557fc9ef0d59d608b274f3499952529f82b18d318a9e5513b308a7826c7bb8f0d5a180548516861790557f7f05dcdcab3de41bcc39e5665e8d02a0666ce9ac3e7bb061eee10eabc7ab321180548516831790557f9dbae9193202ec0a6d2fb1fbf8cbd0dee474654265be2c18570dcb3e994910bd80548516841790557fb95f5330d90f9956e42edf0593614a1c9c8893330d6fae00f00b0d882a62127180548516861790557f5749368018f5c93d7b167f2f8a2e7550d6fb3801b0d4c8fb151a2decbebd03fd80548516831790557f637c4889cad22e74cb81cca1491da96e64cc0e1379c18b2e6661f1cb285bf8c880548516841790557fdc6594df2566670a6a18ca6564828256d721f4b7ddd5b8f1340023c0d6f37b1f80548516821790557f34494912871cd3531f022aa8a8fdd3044c5d8e8da00ac727f35207682d738cbf80548516861790557fa57c712a8ff76d4a838bf525e6ab27838f20d595a6e7c7fd22aa390764ba883e80548516861790557fb27e74824e74f28f7039f37b9b9ea7887fba6ab012816664b3226134993125e080548516861790557f8f1ade5231f43bd5e807c3c6d34479f0370d81cb70678db45da4256ec0392cc480548516831790557ffd51ad7ca6ad6dcf849ffe93b089143f6da4e19d450b1e24b4cb41fc9aeaf54780548516861790557fb40e5f9a7cfd1c1d3c1fed616dd461a1c53324c23be1354cd45b03cdebf5ebcc80548516861790557fe049cda5345beaa168d1c45dd3fe4998418d92e42c647ef3e2231618959a1c7980548516821790557fc72f6345ad88b6340a4965ff540cd3c33901e65d6ec332883bb83fef49bc622c80548516861790557f68ac7b016969b13a930b8cd27b5f3ec63c078d4cfb031a6b6a64602b88dd853880548516861790557f76fc542114f8b818a86ab2372e107b5735e21753f4cad452751f11c5bf1ce43580548516821790557f05eddfb5da8e1f5c655efdc746949527cd0edae7ffb47f03fda6c700eaedc5e180548516861790557f799d7e5f9353716959dd1ad471efaa9bd9b302128ea0b9b4c80ae6f5f2e78a6d80548516821790557fcbb6d6d16f15b83ea10a095ea96b8cc106251f20cec345337b169fa25e279b8a80548516861790557f03840b8e7d10936cdb4a1999cc913e2cb88cfb538c04a9c6769bf6edecdf793b80548516821790557f4588b94266c45c6608fd93b5e6e8b19c6dba00110d2018863af63469896b8faa80548516861790557fd532a6947967c84e2e7e6f3802559c927dde013b3e6468ec982cb6327a06e7bb80548516861790557e8742fa81673e2b922408a74ba304e128e1448bc0974af3a4ad938005d7a89280548516861790557fe0dc7fc98096f844c249199f4afa91f92aaa70f749300a5a24d9ab885083f30980548516861790557f94c013066bf7bc1908bf886406391b0171a457330fd082fb5318287c0a08f29b80548516861790557fd15880f3b9146d5c7c939fb21183b8c27e3f475d101a55e7957989183e717d8080548516861790557f08f232ce7c2a7d7b0a463fe79351e01a6e8ecb2f899cb9e35a91ab87ada6479380548516861790557fdfa8890c460dbe6bd918f2e425b079e97807c4c2e5306ca8e6bfd7517e511b4380548516861790557fed9754ef212c16d6aaef0a7ab02dc36426237a8be53a45984242f48e9713d68880548516861790557f9f3d502c797bdf9cab0319459250cfe197904316b9ad82e6f5722a65ce69c61a80548516861790557feea534e8e42b00177d22d458479f3f6cda65896090aa542bf8589ad8bd4a3c3a80548516861790557f53a906701f8d6532727eb00532470b97b9ca3cf31eb58976e3e146d09fa3b6d280548516861790557f1a8e13307678e2fb39787f5552374e07d4761327e086779f98c9d428f7eb6bbb80548516861790557f04a4bf10b47dae3119c576789199156d73360d76faa31656911354b62942e42480548516861790557f3d1b29662e0db39bcf4b52c7e56a773361587605852ff97c4fcec6cf0bd52b7180548516861790557fab93d1f882a2e2967e7cbc65dc02d0ff59a532936e63c7985036e2aaeca64ddb80548516841790557f3e17c24f29e9f2d580f258aafece07cecc09ee2f78ad3b0a924fc808d3230a9780548516861790557f1dbc68bf40da5cdcbc2c8cb07e14ac639e54eb2a206c2d10f06502d7688435c480548516861790557f7c392828b5944a647ae7bccf9876f4dad0e70eb7eebb2460a74f133db531de4b80548516861790557f04182672440cb363bd606e367436ef0b88573a174b00e94710f995f44df0411d805485169093179092557f34aaf2e328e2a23f6cc6af2c24e0b363055eed5beaa5f67d5883ad5840c1391c80548416851790557f038be2a252cd03ab06a536c0b310d178904efe4c9b24e5d84e99184bc5fd87fc8054841690911790557f0b15f8b9ffb27b01f736927cfd6ad1d208323c06cd0c40a1589d978fd7cad32780548316841790557f5d2b9829bb77aa7fef5cd163f302b3536707d595fbfd497be5eb051c0b338ad680548316821790557ffb6af7b3ef99494b072439744300c9df89ad700882d9214785d3df6cd6b776ba80548316841790557fba5a6f7186d52983b0daafd0d0d9ef5718d26f2a29b1293fc6462584188d03fc80548316841790557fd46ee5222253a7cc0a20d09b5e8c7ccd135700d52587364de45408f42147b85e80548316821790557f9a1cd051d59ed54d21429de576faa08339508d307b2e83efdfbbfbfce608e0d780548316841790557f8e6292d290586aa62897ea67a051ed5e5ef34cec11765f28ec902e971638d21a80548316841790557fe2c5fa61d4d931dde118097f6d7c52276880bce8f690bcd35292abfc8b22fb4b805483169094179093557f6d803f1ede56bc592ca3b5ac64283b803d5c87b24d6bdd2450c3c2ee759f0d8480548216831790557f0b8ab90e93b585e2ebc700c0dc6d28fc193f7fac5fbec5bd82f6864675e7f28280548216831790557f44e7ed5c70b5f8e9e3674282486dd2fa75c0f749d084f36fe8979af593d323c680548216831790557f2768cb90652eb3ae4b3c305bde3f33039474b0ed99312618e714b83c6ac86c8180548216841790557fcfddf1df5a972457b8c9e3ede6e0a80857d018c214a357abd3f68a92b745ec6b80548216831790557ffee0b7de19d01b941e8cc85dbaf53bf15211844970effdd72db4bf9c058b916180548216831790557fe1518765465fe0358709fecc8a681e94b6a36ebb163e616f97223b39de9fe86780548216831790557f53ac5f4408d8598b567fafb300c4e1f7eb4cfb573d24e7f7505b34e0e1c1d3f080548216831790557fb9a4211f4de728af7b7e144e8b51668ae4e7a5b1bdff6f32787447290d2da05d80548216831790557fb593cec612fa10eb4224e6b275ec626e0d6a2d8ba043a3d9ed4b9fd5581eda4780548216831790557f285a1f96fa9458ddd82265ea4b046f5df382354d611f2e77f32fdde099cd51f780548216831790557f5b10f475b4aedf1a65adaa4cea64c6158d359c6f272708676cd5390b236d09af80548216831790557f387d4acaf45f8a8a304905fa077e661efe56ca9e068176148e327cdfc152b10180548216831790557f6f4f22608a08f4ead7bfd1c199d1ee34363117484d8b1273934f3fc68a01158b80548216831790557ff4f7ce326b858574db5d1ea1f69064e6a201bbe13c1510a26f780443595be4e380548216831790557fdfd2d5cf46064358b336c4092c202e11cb9c77092c0517b5258df0a489409d7580548216831790557f40009ed06045118e89aa4b6894d88a64d91cedd9c3def470435ecb0a08756c6680548216831790557f04eb86b279483dec0760fa65779c2f5412491a5bedd7bf5e591ebb9207712ae680548216831790557fd129f432483ba6c2d26fa740fd8675a733152fb84af10c7fc528cd8da976016180548216831790557fd8b982e6218cb8b5bcbc39f73703b7cd6b34114dcc2ddd14e22eb9babd25f21f80548216831790557fded79f78fe831f5d596eb35492c1c6c0e775ce1ac28ad76dc0316b4d3ee3e02a80548216831790557fed6a522ea985146e90afea64475c4eca0c1e3822014a9bf94a297f8d584a49b280548216831790557f4fe0aee2cc3232f1cc66f40e13bdab71dcdd38dde7fd317a4d8d5c78ef9a803f80548216841790557fc21ed6c7e488dc75c883f1d32a03fa58175268ff638d9709923acabb3d59c544805482169093179092557f1449474d3a5ad2baea7193eda4e726ceace02418e6bcb0a7e8d5c6de49eb86b480548316821790557f22d31d6ca2d94af2d4d9681572250f7ba6073747109b379dc5c286377fd773ce80548316821790557f3b962463408e27427640c7365f6ea3d90753e744a6bcb90a068fd4d7acb8e63c80548316821790557ff01ed14e89658cc9326570010c3d729b7174b511ae394f0c1df1c7783e66e30180548316821790557f4b1447687b5a06c9c6c0697125c8fdb33b86e3e06fd62fb2f81a11fb66002b8f80548316821790557f4f5a114f5238b749153a20be7d67d1d2520c5b92854ea34620974ef3b9eacc4c80548316821790557f1a93d3b239101a42fcca8691c37700339b152ad0bc03aec2bdf8987c29130e1680548316821790557f35d6ee699b435dd5cfced4683ff204c92e06cafb3fb7ddfa08f1b6ae0f1bfb4880548316821790557f76d811d74cadb671abca3e376bf55866e724b143d126457a0ec4e69fdca30d3a80548316821790557fbdced13a98175140c25b1cb64e32fa320e92a2d3ce6bb0143ce4743914331b2780548316821790557f7b219a64ffe8d4b16d2803882ef74d3e7e7544f3745a38d2248b54b17053a38780548316821790557f196f10d16fd24cbbadd21396838849cab3ff80870f6d481d2896c14593b5ddd980548316821790557fdb1abff431989dce2753d8f363e840b2b9708bbd1158dd5589ae7788d84db57580548316821790557f7f6589c38b111ce0473cec550eaa8bd4af67687e8a7712b0823c5059ba03ebb980548316821790557f9d6622bc756f88d40bb26f5624de1f89e7551282d532122ae9ca66d9f38381bc80548316821790557f83eb20c3691d5afc33068d6b99b9c8a142b5c250096930c527dc50d0c5c78ea380548316821790557f1dd447bac244ff084264bec46778eb4c9b8a197e28d1fb3552017bc26184eefa80548316821790557f20739aec762f25765120316c826fa928739d5a91895549e9fb88aa2003a6b28780548316821790557f5fd6662dd06f254932d4c0a84cb7c275b530d9bb10e5e98b49c25a47d4e80b4980548316821790557fca4b2af49e889919978b8d44145e5c3e35a0e5f042c4ba5938d80f10afda48e480548316821790557f27a3672a11898538e77a3921cc1a17babc168908cdfe2ffd1c6b2e1682bfdf578054831682179055732b92376dc4f1cd3f7c07ecfc3579354b2f20abff6000527f8ea244e815b936bb4905d1f3b7cf41df13f0dba77ebad8b45539c6c4e4d560718054909216179055565b600f8054600160ff19909116811790915561044d6010556103e9601155601255601580546001600160a01b0319166001600160a01b038316179055620032de62003349565b62003302604051806060016040528060328152602001620069bb60329139620033ea565b620033266040518060600160405280602d815260200162006a0d602d913962003470565b5062003666565b600062003344620034f260201b62001c4e1760201c565b905090565b600a5460ff1615620033955760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064015b60405180910390fd5b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620033cd6200332d565b6040516001600160a01b03909116815260200160405180910390a1565b620033f46200332d565b6001600160a01b031662003410600d546001600160a01b031690565b6001600160a01b031614620034575760405162461bcd60e51b81526020600482018190526024820152600080516020620069ed83398151915260448201526064016200338c565b80516200346c90601490602084019062003551565b5050565b6200347a6200332d565b6001600160a01b031662003496600d546001600160a01b031690565b6001600160a01b031614620034dd5760405162461bcd60e51b81526020600482018190526024820152600080516020620069ed83398151915260448201526064016200338c565b80516200346c90601690602084019062003551565b6000333014156200354b57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200354e9050565b50335b90565b8280546200355f9062003629565b90600052602060002090601f016020900481019282620035835760008555620035ce565b82601f106200359e57805160ff1916838001178555620035ce565b82800160010185558215620035ce579182015b82811115620035ce578251825591602001919060010190620035b1565b50620035dc929150620035e0565b5090565b5b80821115620035dc5760008155600101620035e1565b6000602082840312156200360a57600080fd5b81516001600160a01b03811681146200362257600080fd5b9392505050565b600181811c908216806200363e57607f821691505b602082108114156200366057634e487b7160e01b600052602260045260246000fd5b50919050565b61334580620036766000396000f3fe6080604052600436106102545760003560e01c806355f804b31161014057806355f804b31461055f5780635c975abb1461057f57806361c5c935146105975780636352211e146105c45780636d870108146105e457806370a08231146105fa578063715018a61461061a5780638257146f1461062f57806385b6b6a1146106445780638da5cb5b146106645780638ff095f914610679578063938e3d7b1461068e57806395d89b41146106ae578063a22cb465146106c3578063a414ff5b146106e3578063ab5e124a146106f8578063b66a0e5d14610710578063b88d4fde14610725578063c87b56dd14610745578063d1e6a64f14610765578063de065caa1461077a578063dfd233dd1461078f578063e6c47cfd146107af578063e8a3d485146107c5578063e985e9c5146107da578063f2fde38b146107fa57600080fd5b806301ffc9a71461025957806306fdde031461028e578063081812fc146102b0578063095ea7b3146102dd5780630c53c51c146102ff5780630f7e597014610312578063109695231461033f57806318160ddd1461035f5780631eabc1161461037e57806320379ee51461039157806323b872dd146103a65780632d0335ab146103c65780632f745c59146103fc57806333ad8fc51461041c5780633408e470146104325780633c0b1edf146104455780633ccfd60b1461046d57806342842e0e1461047557806342966c6814610495578063430c2081146104b55780634e71d92d146104d55780634f558e79146104ea5780634f6ccce71461050a57806350e342361461052a57806355367ba91461054a575b600080fd5b34801561026557600080fd5b50610279610274366004612d3c565b61081a565b60405190151581526020015b60405180910390f35b34801561029a57600080fd5b506102a3610845565b6040516102859190612f82565b3480156102bc57600080fd5b506102d06102cb366004612df6565b6108d7565b6040516102859190612eb8565b3480156102e957600080fd5b506102fd6102f8366004612d10565b610964565b005b6102a361030d366004612c5e565b610a87565b34801561031e57600080fd5b506102a3604051806040016040528060018152602001603160f81b81525081565b34801561034b57600080fd5b506102fd61035a366004612d93565b610c70565b34801561036b57600080fd5b506008545b604051908152602001610285565b6102fd61038c366004612ddb565b610cc6565b34801561039d57600080fd5b50600b54610370565b3480156103b257600080fd5b506102fd6103c1366004612b7f565b610e79565b3480156103d257600080fd5b506103706103e1366004612b29565b6001600160a01b03166000908152600c602052604090205490565b34801561040857600080fd5b50610370610417366004612d10565b610eb1565b34801561042857600080fd5b5061037060125481565b34801561043e57600080fd5b5046610370565b34801561045157600080fd5b5061045a610f47565b60405161ffff9091168152602001610285565b6102fd610f57565b34801561048157600080fd5b506102fd610490366004612b7f565b61102a565b3480156104a157600080fd5b506102fd6104b0366004612df6565b611045565b3480156104c157600080fd5b506102796104d0366004612d10565b6110c1565b3480156104e157600080fd5b506102fd6110d4565b3480156104f657600080fd5b50610279610505366004612df6565b6111e7565b34801561051657600080fd5b50610370610525366004612df6565b6111f2565b34801561053657600080fd5b5061045a610545366004612b29565b611285565b34801561055657600080fd5b506102fd6112b9565b34801561056b57600080fd5b506102fd61057a366004612d93565b611325565b34801561058b57600080fd5b50600a5460ff16610279565b3480156105a357600080fd5b506105b76105b2366004612b29565b611377565b6040516102859190612f3e565b3480156105d057600080fd5b506102d06105df366004612df6565b611413565b3480156105f057600080fd5b5061037060105481565b34801561060657600080fd5b50610370610615366004612b29565b61148a565b34801561062657600080fd5b506102fd611511565b34801561063b57600080fd5b5061037061159a565b34801561065057600080fd5b506102fd61065f366004612cdb565b6115ac565b34801561067057600080fd5b506102d061161a565b34801561068557600080fd5b506102fd611629565b34801561069a57600080fd5b506102fd6106a9366004612d93565b611693565b3480156106ba57600080fd5b506102a36116e5565b3480156106cf57600080fd5b506102fd6106de366004612c2b565b6116f4565b3480156106ef57600080fd5b506103706117f2565b34801561070457600080fd5b50600f5460ff16610279565b34801561071c57600080fd5b506102fd611804565b34801561073157600080fd5b506102fd610740366004612bc0565b61186d565b34801561075157600080fd5b506102a3610760366004612df6565b6118a6565b34801561077157600080fd5b50610370611970565b34801561078657600080fd5b506102fd61198d565b34801561079b57600080fd5b506102fd6107aa366004612b29565b6119f6565b3480156107bb57600080fd5b5061037060115481565b3480156107d157600080fd5b506102a3611a6b565b3480156107e657600080fd5b506102796107f5366004612b46565b611a7a565b34801561080657600080fd5b506102fd610815366004612b29565b611b4e565b60006001600160e01b0319821663780e9d6360e01b148061083f575061083f82611cab565b92915050565b606060008054610854906131a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610880906131a9565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e282611cfb565b6109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82611413565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b806001600160a01b03166109ef611d18565b6001600160a01b03161480610a0b5750610a0b816107f5611d18565b610a785760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161093f565b610a828383611d22565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610ac58782878787611d90565b610b1b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b606482015260840161093f565b6001600160a01b0387166000908152600c6020526040902054610b3f906001611e80565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610b8f90899033908a90612ecc565b60405180910390a1600080306001600160a01b0316888a604051602001610bb7929190612e57565b60408051601f1981840301815290829052610bd191612e3b565b6000604051808303816000865af19150503d8060008114610c0e576040519150601f19603f3d011682016040523d82523d6000602084013e610c13565b606091505b509150915081610c645760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b604482015260640161093f565b98975050505050505050565b610c78611d18565b6001600160a01b0316610c8961161a565b6001600160a01b031614610caf5760405162461bcd60e51b815260040161093f90613068565b8051610cc29060139060208401906129e4565b5050565b600a5460ff1615610ce95760405162461bcd60e51b815260040161093f90613015565b60008161ffff1611610d335760405162461bcd60e51b815260206004820152601360248201527243616e6e6f7420627579203020746f6b656e7360681b604482015260640161093f565b8061ffff16610d40611970565b1015610d8e5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c656674206f6e2073616c650000604482015260640161093f565b601461ffff82161115610def5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206275792074686174206d616e7920746f6b656e73206174206f6044820152626e636560e81b606482015260840161093f565b610e0461ffff8216666a94d74f430000613147565b341015610e4e5760405162461bcd60e51b815260206004820152601860248201527724b739bab33334b1b4b2b73a10333ab732399039b2b73a1760411b604482015260640161093f565b610e5b3360105483611e8c565b8061ffff1660106000828254610e71919061311b565b909155505050565b610e8a610e84611d18565b82611ec0565b610ea65760405162461bcd60e51b815260040161093f906130ca565b610a82838383611f82565b6000610ebc8361148a565b8210610f1e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f5233611285565b905090565b610f5f611d18565b6001600160a01b0316610f7061161a565b6001600160a01b031614610f965760405162461bcd60e51b815260040161093f90613068565b476000610fa4600283613133565b90506000610fb28284613166565b604051909150339082156108fc029083906000818181858888f19350505050158015610fe2573d6000803e3d6000fd5b5060405173dca119ab841e632f8bc9aa003dccdeba9c6d29079083156108fc029084906000818181858888f19350505050158015611024573d6000803e3d6000fd5b50505050565b610a828383836040518060200160405280600081525061186d565b611050610e84611d18565b6110b55760405162461bcd60e51b815260206004820152603060248201527f4372756d6c69617362616b6572793a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161093f565b6110be8161211b565b50565b60006110cd8383611ec0565b9392505050565b600f5460ff16156110f75760405162461bcd60e51b815260040161093f9061303f565b6000611101610f47565b905060008161ffff16116111515760405162461bcd60e51b8152602060048201526017602482015276596f752063616e6e6f7420636c61696d20746f6b656e7360481b604482015260640161093f565b8061ffff1661115e6117f2565b10156111ac5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e73206c65667420666f7220636c61696d604482015260640161093f565b6111b93360125483611e8c565b336000908152600e60205260409020805461ffff191690558061ffff1660126000828254610e71919061311b565b600061083f82611cfb565b60006111fd60085490565b82106112605760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b6008828154811061127357611273613255565b90600052602060002001549050919050565b6001600160a01b0381166000908152600e602052604081205461ffff16600181106112b05792915050565b50600092915050565b6112c1611d18565b6001600160a01b03166112d261161a565b6001600160a01b0316146112f85760405162461bcd60e51b815260040161093f90613068565b600a5460ff161561131b5760405162461bcd60e51b815260040161093f90613015565b6113236121b0565b565b61132d611d18565b6001600160a01b031661133e61161a565b6001600160a01b0316146113645760405162461bcd60e51b815260040161093f90613068565b8051610cc29060149060208401906129e4565b606060006113848361148a565b6001600160401b0381111561139b5761139b61326b565b6040519080825280602002602001820160405280156113c4578160200160208202803683370190505b50905060005b815181101561140c576113dd8482610eb1565b8282815181106113ef576113ef613255565b602090810291909101015280611404816131e4565b9150506113ca565b5092915050565b6000818152600260205260408120546001600160a01b03168061083f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b0382166114f55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b611519611d18565b6001600160a01b031661152a61161a565b6001600160a01b0316146115505760405162461bcd60e51b815260040161093f90613068565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600060115461044d610f529190613166565b6115b4611d18565b6001600160a01b03166115c561161a565b6001600160a01b0316146115eb5760405162461bcd60e51b815260040161093f90613068565b6001600160a01b03919091166000908152600e60205260409020805461ffff191661ffff909216919091179055565b600d546001600160a01b031690565b611631611d18565b6001600160a01b031661164261161a565b6001600160a01b0316146116685760405162461bcd60e51b815260040161093f90613068565b600f5460ff161561168b5760405162461bcd60e51b815260040161093f9061303f565b611323612220565b61169b611d18565b6001600160a01b03166116ac61161a565b6001600160a01b0316146116d25760405162461bcd60e51b815260040161093f90613068565b8051610cc29060169060208401906129e4565b606060018054610854906131a9565b6116fc611d18565b6001600160a01b0316826001600160a01b031614156117595760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161093f565b8060056000611766611d18565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117aa611d18565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e6911515815260200190565b60405180910390a35050565b60006012546103e9610f529190613166565b61180c611d18565b6001600160a01b031661181d61161a565b6001600160a01b0316146118435760405162461bcd60e51b815260040161093f90613068565b600a5460ff166118655760405162461bcd60e51b815260040161093f90612f95565b611323612279565b61187e611878611d18565b83611ec0565b61189a5760405162461bcd60e51b815260040161093f906130ca565b611024848484846122ce565b60606118b182611cfb565b6119155760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093f565b600061191f612301565b9050600081511161193f57604051806020016040528060008152506110cd565b8061194984612310565b60405160200161195a929190612e89565b6040516020818303038152906040529392505050565b60006010546115b36119829190613166565b610f5290600161311b565b611995611d18565b6001600160a01b03166119a661161a565b6001600160a01b0316146119cc5760405162461bcd60e51b815260040161093f90613068565b600f5460ff166119ee5760405162461bcd60e51b815260040161093f9061309d565b61132361240d565b6119fe611d18565b6001600160a01b0316611a0f61161a565b6001600160a01b031614611a355760405162461bcd60e51b815260040161093f90613068565b6001611a3f61159a565b1015611a4a57600080fd5b601180546110be918391906000611a60836131e4565b919050556001611e8c565b606060168054610854906131a9565b60155460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190611ab3908890600401612eb8565b60206040518083038186803b158015611acb57600080fd5b505afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b039190612d76565b6001600160a01b03161415611b1c57600191505061083f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611b56611d18565b6001600160a01b0316611b6761161a565b6001600160a01b031614611b8d5760405162461bcd60e51b815260040161093f90613068565b6001600160a01b038116611bf25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093f565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600033301415611ca557600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611ca89050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611cdc57506001600160e01b03198216635b5e139f60e01b145b8061083f57506301ffc9a760e01b6001600160e01b031983161461083f565b6000908152600260205260409020546001600160a01b0316151590565b6000610f52611c4e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d5782611413565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611df65760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b606482015260840161093f565b6001611e09611e0487612462565b6124df565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611e57573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006110cd828461311b565b60005b8161ffff1681101561102457611eae84611ea9838661311b565b61250f565b80611eb8816131e4565b915050611e8f565b6000611ecb82611cfb565b611f2c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b6000611f3783611413565b9050806001600160a01b0316846001600160a01b03161480611f725750836001600160a01b0316611f67846108d7565b6001600160a01b0316145b80611b465750611b468185611a7a565b826001600160a01b0316611f9582611413565b6001600160a01b031614611ffd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b03821661205f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b61206a838383612529565b612075600082611d22565b6001600160a01b038316600090815260036020526040812080546001929061209e908490613166565b90915550506001600160a01b03821660009081526003602052604081208054600192906120cc90849061311b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206132f083398151915291a4505050565b600061212682611413565b905061213481600084612529565b61213f600083611d22565b6001600160a01b0381166000908152600360205260408120805460019290612168908490613166565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416906000805160206132f0833981519152908390a45050565b600a5460ff16156121d35760405162461bcd60e51b815260040161093f90613015565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612209611d18565b6040516122169190612eb8565b60405180910390a1565b600f5460ff16156122435760405162461bcd60e51b815260040161093f9061303f565b600f805460ff191660011790557fcfe438f248d3757132817fd95e4dd5bede068f8f6db5595c5ecb816b7cca1c7e612209611d18565b600a5460ff1661229b5760405162461bcd60e51b815260040161093f90612f95565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612209611d18565b6122d9848484611f82565b6122e5848484846125e1565b6110245760405162461bcd60e51b815260040161093f90612fc3565b606060148054610854906131a9565b6060816123345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561235e5780612348816131e4565b91506123579050600a83613133565b9150612338565b6000816001600160401b038111156123785761237861326b565b6040519080825280601f01601f1916602001820160405280156123a2576020820181803683370190505b5090505b8415611b46576123b7600183613166565b91506123c4600a866131ff565b6123cf90603061311b565b60f81b8183815181106123e4576123e4613255565b60200101906001600160f81b031916908160001a905350612406600a86613133565b94506123a6565b600f5460ff1661242f5760405162461bcd60e51b815260040161093f9061309d565b600f805460ff191690557f283a148c0482d064fbf794e0d297192b1854c7edf96c8397dbc1ebd950f232b1612209611d18565b60006040518060800160405280604381526020016132ad60439139805160209182012083518483015160408087015180519086012090516124c2950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006124ea600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016124c2565b610cc28282604051806020016040528060008152506126f5565b6001600160a01b0383166125845761257f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6125a7565b816001600160a01b0316836001600160a01b0316146125a7576125a78382612728565b6001600160a01b0382166125be57610a82816127c5565b826001600160a01b0316826001600160a01b031614610a8257610a828282612874565b60006001600160a01b0384163b156126ea57836001600160a01b031663150b7a0261260a611d18565b8786866040518563ffffffff1660e01b815260040161262c9493929190612f01565b602060405180830381600087803b15801561264657600080fd5b505af1925050508015612676575060408051601f3d908101601f1916820190925261267391810190612d59565b60015b6126d0573d8080156126a4576040519150601f19603f3d011682016040523d82523d6000602084013e6126a9565b606091505b5080516126c85760405162461bcd60e51b815260040161093f90612fc3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b46565b506001949350505050565b6126ff83836128b8565b61270c60008484846125e1565b610a825760405162461bcd60e51b815260040161093f90612fc3565b600060016127358461148a565b61273f9190613166565b600083815260076020526040902054909150808214612792576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127d790600190613166565b600083815260096020526040812054600880549394509092849081106127ff576127ff613255565b90600052602060002001549050806008838154811061282057612820613255565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128585761285861323f565b6001900381819060005260206000200160009055905550505050565b600061287f8361148a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661290e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b61291781611cfb565b156129635760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604482015260640161093f565b61296f60008383612529565b6001600160a01b038216600090815260036020526040812080546001929061299890849061311b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206132f0833981519152908290a45050565b8280546129f0906131a9565b90600052602060002090601f016020900481019282612a125760008555612a58565b82601f10612a2b57805160ff1916838001178555612a58565b82800160010185558215612a58579182015b82811115612a58578251825591602001919060010190612a3d565b50612a64929150612a68565b5090565b5b80821115612a645760008155600101612a69565b60006001600160401b0380841115612a9757612a9761326b565b604051601f8501601f19908116603f01168101908282118183101715612abf57612abf61326b565b81604052809350858152868686011115612ad857600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612b0357600080fd5b6110cd83833560208501612a7d565b803561ffff81168114612b2457600080fd5b919050565b600060208284031215612b3b57600080fd5b81356110cd81613281565b60008060408385031215612b5957600080fd5b8235612b6481613281565b91506020830135612b7481613281565b809150509250929050565b600080600060608486031215612b9457600080fd5b8335612b9f81613281565b92506020840135612baf81613281565b929592945050506040919091013590565b60008060008060808587031215612bd657600080fd5b8435612be181613281565b93506020850135612bf181613281565b92506040850135915060608501356001600160401b03811115612c1357600080fd5b612c1f87828801612af2565b91505092959194509250565b60008060408385031215612c3e57600080fd5b8235612c4981613281565b915060208301358015158114612b7457600080fd5b600080600080600060a08688031215612c7657600080fd5b8535612c8181613281565b945060208601356001600160401b03811115612c9c57600080fd5b612ca888828901612af2565b9450506040860135925060608601359150608086013560ff81168114612ccd57600080fd5b809150509295509295909350565b60008060408385031215612cee57600080fd5b8235612cf981613281565b9150612d0760208401612b12565b90509250929050565b60008060408385031215612d2357600080fd5b8235612d2e81613281565b946020939093013593505050565b600060208284031215612d4e57600080fd5b81356110cd81613296565b600060208284031215612d6b57600080fd5b81516110cd81613296565b600060208284031215612d8857600080fd5b81516110cd81613281565b600060208284031215612da557600080fd5b81356001600160401b03811115612dbb57600080fd5b8201601f81018413612dcc57600080fd5b611b4684823560208401612a7d565b600060208284031215612ded57600080fd5b6110cd82612b12565b600060208284031215612e0857600080fd5b5035919050565b60008151808452612e2781602086016020860161317d565b601f01601f19169290920160200192915050565b60008251612e4d81846020870161317d565b9190910192915050565b60008351612e6981846020880161317d565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351612e9b81846020880161317d565b835190830190612eaf81836020880161317d565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090612ef890830184612e0f565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3490830184612e0f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7657835183529284019291840191600101612f5a565b50909695505050505050565b6020815260006110cd6020830184612e0f565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e10db185a5b481a5cc81c185d5cd959608a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527210db185a5b481a5cc81b9bdd081c185d5cd959606a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561312e5761312e613213565b500190565b60008261314257613142613229565b500490565b600081600019048311821515161561316157613161613213565b500290565b60008282101561317857613178613213565b500390565b60005b83811015613198578181015183820152602001613180565b838111156110245750506000910152565b600181811c908216806131bd57607f821691505b602082108114156131de57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131f8576131f8613213565b5060010190565b60008261320e5761320e613229565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110be57600080fd5b6001600160e01b0319811681146110be57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a951addf30c5e554ecb12120b5c05f7f06cfeb85c4e18a4f26baf9be1abcc5064736f6c6343000807003368747470733a2f2f6372756d6c69617362616b6572792e6865726f6b756170702e636f6d2f6170692f6d657461646174612f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657268747470733a2f2f6372756d6c69617362616b6572792e6865726f6b756170702e636f6d2f636f6e7472616374000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode
0x6080604052600436106102545760003560e01c806355f804b31161014057806355f804b31461055f5780635c975abb1461057f57806361c5c935146105975780636352211e146105c45780636d870108146105e457806370a08231146105fa578063715018a61461061a5780638257146f1461062f57806385b6b6a1146106445780638da5cb5b146106645780638ff095f914610679578063938e3d7b1461068e57806395d89b41146106ae578063a22cb465146106c3578063a414ff5b146106e3578063ab5e124a146106f8578063b66a0e5d14610710578063b88d4fde14610725578063c87b56dd14610745578063d1e6a64f14610765578063de065caa1461077a578063dfd233dd1461078f578063e6c47cfd146107af578063e8a3d485146107c5578063e985e9c5146107da578063f2fde38b146107fa57600080fd5b806301ffc9a71461025957806306fdde031461028e578063081812fc146102b0578063095ea7b3146102dd5780630c53c51c146102ff5780630f7e597014610312578063109695231461033f57806318160ddd1461035f5780631eabc1161461037e57806320379ee51461039157806323b872dd146103a65780632d0335ab146103c65780632f745c59146103fc57806333ad8fc51461041c5780633408e470146104325780633c0b1edf146104455780633ccfd60b1461046d57806342842e0e1461047557806342966c6814610495578063430c2081146104b55780634e71d92d146104d55780634f558e79146104ea5780634f6ccce71461050a57806350e342361461052a57806355367ba91461054a575b600080fd5b34801561026557600080fd5b50610279610274366004612d3c565b61081a565b60405190151581526020015b60405180910390f35b34801561029a57600080fd5b506102a3610845565b6040516102859190612f82565b3480156102bc57600080fd5b506102d06102cb366004612df6565b6108d7565b6040516102859190612eb8565b3480156102e957600080fd5b506102fd6102f8366004612d10565b610964565b005b6102a361030d366004612c5e565b610a87565b34801561031e57600080fd5b506102a3604051806040016040528060018152602001603160f81b81525081565b34801561034b57600080fd5b506102fd61035a366004612d93565b610c70565b34801561036b57600080fd5b506008545b604051908152602001610285565b6102fd61038c366004612ddb565b610cc6565b34801561039d57600080fd5b50600b54610370565b3480156103b257600080fd5b506102fd6103c1366004612b7f565b610e79565b3480156103d257600080fd5b506103706103e1366004612b29565b6001600160a01b03166000908152600c602052604090205490565b34801561040857600080fd5b50610370610417366004612d10565b610eb1565b34801561042857600080fd5b5061037060125481565b34801561043e57600080fd5b5046610370565b34801561045157600080fd5b5061045a610f47565b60405161ffff9091168152602001610285565b6102fd610f57565b34801561048157600080fd5b506102fd610490366004612b7f565b61102a565b3480156104a157600080fd5b506102fd6104b0366004612df6565b611045565b3480156104c157600080fd5b506102796104d0366004612d10565b6110c1565b3480156104e157600080fd5b506102fd6110d4565b3480156104f657600080fd5b50610279610505366004612df6565b6111e7565b34801561051657600080fd5b50610370610525366004612df6565b6111f2565b34801561053657600080fd5b5061045a610545366004612b29565b611285565b34801561055657600080fd5b506102fd6112b9565b34801561056b57600080fd5b506102fd61057a366004612d93565b611325565b34801561058b57600080fd5b50600a5460ff16610279565b3480156105a357600080fd5b506105b76105b2366004612b29565b611377565b6040516102859190612f3e565b3480156105d057600080fd5b506102d06105df366004612df6565b611413565b3480156105f057600080fd5b5061037060105481565b34801561060657600080fd5b50610370610615366004612b29565b61148a565b34801561062657600080fd5b506102fd611511565b34801561063b57600080fd5b5061037061159a565b34801561065057600080fd5b506102fd61065f366004612cdb565b6115ac565b34801561067057600080fd5b506102d061161a565b34801561068557600080fd5b506102fd611629565b34801561069a57600080fd5b506102fd6106a9366004612d93565b611693565b3480156106ba57600080fd5b506102a36116e5565b3480156106cf57600080fd5b506102fd6106de366004612c2b565b6116f4565b3480156106ef57600080fd5b506103706117f2565b34801561070457600080fd5b50600f5460ff16610279565b34801561071c57600080fd5b506102fd611804565b34801561073157600080fd5b506102fd610740366004612bc0565b61186d565b34801561075157600080fd5b506102a3610760366004612df6565b6118a6565b34801561077157600080fd5b50610370611970565b34801561078657600080fd5b506102fd61198d565b34801561079b57600080fd5b506102fd6107aa366004612b29565b6119f6565b3480156107bb57600080fd5b5061037060115481565b3480156107d157600080fd5b506102a3611a6b565b3480156107e657600080fd5b506102796107f5366004612b46565b611a7a565b34801561080657600080fd5b506102fd610815366004612b29565b611b4e565b60006001600160e01b0319821663780e9d6360e01b148061083f575061083f82611cab565b92915050565b606060008054610854906131a9565b80601f0160208091040260200160405190810160405280929190818152602001828054610880906131a9565b80156108cd5780601f106108a2576101008083540402835291602001916108cd565b820191906000526020600020905b8154815290600101906020018083116108b057829003601f168201915b5050505050905090565b60006108e282611cfb565b6109485760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061096f82611413565b9050806001600160a01b0316836001600160a01b031614156109dd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161093f565b806001600160a01b03166109ef611d18565b6001600160a01b03161480610a0b5750610a0b816107f5611d18565b610a785760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260840161093f565b610a828383611d22565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610ac58782878787611d90565b610b1b5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b606482015260840161093f565b6001600160a01b0387166000908152600c6020526040902054610b3f906001611e80565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610b8f90899033908a90612ecc565b60405180910390a1600080306001600160a01b0316888a604051602001610bb7929190612e57565b60408051601f1981840301815290829052610bd191612e3b565b6000604051808303816000865af19150503d8060008114610c0e576040519150601f19603f3d011682016040523d82523d6000602084013e610c13565b606091505b509150915081610c645760405162461bcd60e51b815260206004820152601c60248201527b119d5b98dd1a5bdb8818d85b1b081b9bdd081cdd58d8d95cdcd99d5b60221b604482015260640161093f565b98975050505050505050565b610c78611d18565b6001600160a01b0316610c8961161a565b6001600160a01b031614610caf5760405162461bcd60e51b815260040161093f90613068565b8051610cc29060139060208401906129e4565b5050565b600a5460ff1615610ce95760405162461bcd60e51b815260040161093f90613015565b60008161ffff1611610d335760405162461bcd60e51b815260206004820152601360248201527243616e6e6f7420627579203020746f6b656e7360681b604482015260640161093f565b8061ffff16610d40611970565b1015610d8e5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f75676820746f6b656e73206c656674206f6e2073616c650000604482015260640161093f565b601461ffff82161115610def5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206275792074686174206d616e7920746f6b656e73206174206f6044820152626e636560e81b606482015260840161093f565b610e0461ffff8216666a94d74f430000613147565b341015610e4e5760405162461bcd60e51b815260206004820152601860248201527724b739bab33334b1b4b2b73a10333ab732399039b2b73a1760411b604482015260640161093f565b610e5b3360105483611e8c565b8061ffff1660106000828254610e71919061311b565b909155505050565b610e8a610e84611d18565b82611ec0565b610ea65760405162461bcd60e51b815260040161093f906130ca565b610a82838383611f82565b6000610ebc8361148a565b8210610f1e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161093f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000610f5233611285565b905090565b610f5f611d18565b6001600160a01b0316610f7061161a565b6001600160a01b031614610f965760405162461bcd60e51b815260040161093f90613068565b476000610fa4600283613133565b90506000610fb28284613166565b604051909150339082156108fc029083906000818181858888f19350505050158015610fe2573d6000803e3d6000fd5b5060405173dca119ab841e632f8bc9aa003dccdeba9c6d29079083156108fc029084906000818181858888f19350505050158015611024573d6000803e3d6000fd5b50505050565b610a828383836040518060200160405280600081525061186d565b611050610e84611d18565b6110b55760405162461bcd60e51b815260206004820152603060248201527f4372756d6c69617362616b6572793a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161093f565b6110be8161211b565b50565b60006110cd8383611ec0565b9392505050565b600f5460ff16156110f75760405162461bcd60e51b815260040161093f9061303f565b6000611101610f47565b905060008161ffff16116111515760405162461bcd60e51b8152602060048201526017602482015276596f752063616e6e6f7420636c61696d20746f6b656e7360481b604482015260640161093f565b8061ffff1661115e6117f2565b10156111ac5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f75676820746f6b656e73206c65667420666f7220636c61696d604482015260640161093f565b6111b93360125483611e8c565b336000908152600e60205260409020805461ffff191690558061ffff1660126000828254610e71919061311b565b600061083f82611cfb565b60006111fd60085490565b82106112605760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161093f565b6008828154811061127357611273613255565b90600052602060002001549050919050565b6001600160a01b0381166000908152600e602052604081205461ffff16600181106112b05792915050565b50600092915050565b6112c1611d18565b6001600160a01b03166112d261161a565b6001600160a01b0316146112f85760405162461bcd60e51b815260040161093f90613068565b600a5460ff161561131b5760405162461bcd60e51b815260040161093f90613015565b6113236121b0565b565b61132d611d18565b6001600160a01b031661133e61161a565b6001600160a01b0316146113645760405162461bcd60e51b815260040161093f90613068565b8051610cc29060149060208401906129e4565b606060006113848361148a565b6001600160401b0381111561139b5761139b61326b565b6040519080825280602002602001820160405280156113c4578160200160208202803683370190505b50905060005b815181101561140c576113dd8482610eb1565b8282815181106113ef576113ef613255565b602090810291909101015280611404816131e4565b9150506113ca565b5092915050565b6000818152600260205260408120546001600160a01b03168061083f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161093f565b60006001600160a01b0382166114f55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161093f565b506001600160a01b031660009081526003602052604090205490565b611519611d18565b6001600160a01b031661152a61161a565b6001600160a01b0316146115505760405162461bcd60e51b815260040161093f90613068565b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600060115461044d610f529190613166565b6115b4611d18565b6001600160a01b03166115c561161a565b6001600160a01b0316146115eb5760405162461bcd60e51b815260040161093f90613068565b6001600160a01b03919091166000908152600e60205260409020805461ffff191661ffff909216919091179055565b600d546001600160a01b031690565b611631611d18565b6001600160a01b031661164261161a565b6001600160a01b0316146116685760405162461bcd60e51b815260040161093f90613068565b600f5460ff161561168b5760405162461bcd60e51b815260040161093f9061303f565b611323612220565b61169b611d18565b6001600160a01b03166116ac61161a565b6001600160a01b0316146116d25760405162461bcd60e51b815260040161093f90613068565b8051610cc29060169060208401906129e4565b606060018054610854906131a9565b6116fc611d18565b6001600160a01b0316826001600160a01b031614156117595760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b604482015260640161093f565b8060056000611766611d18565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556117aa611d18565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117e6911515815260200190565b60405180910390a35050565b60006012546103e9610f529190613166565b61180c611d18565b6001600160a01b031661181d61161a565b6001600160a01b0316146118435760405162461bcd60e51b815260040161093f90613068565b600a5460ff166118655760405162461bcd60e51b815260040161093f90612f95565b611323612279565b61187e611878611d18565b83611ec0565b61189a5760405162461bcd60e51b815260040161093f906130ca565b611024848484846122ce565b60606118b182611cfb565b6119155760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161093f565b600061191f612301565b9050600081511161193f57604051806020016040528060008152506110cd565b8061194984612310565b60405160200161195a929190612e89565b6040516020818303038152906040529392505050565b60006010546115b36119829190613166565b610f5290600161311b565b611995611d18565b6001600160a01b03166119a661161a565b6001600160a01b0316146119cc5760405162461bcd60e51b815260040161093f90613068565b600f5460ff166119ee5760405162461bcd60e51b815260040161093f9061309d565b61132361240d565b6119fe611d18565b6001600160a01b0316611a0f61161a565b6001600160a01b031614611a355760405162461bcd60e51b815260040161093f90613068565b6001611a3f61159a565b1015611a4a57600080fd5b601180546110be918391906000611a60836131e4565b919050556001611e8c565b606060168054610854906131a9565b60155460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190611ab3908890600401612eb8565b60206040518083038186803b158015611acb57600080fd5b505afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b039190612d76565b6001600160a01b03161415611b1c57600191505061083f565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b611b56611d18565b6001600160a01b0316611b6761161a565b6001600160a01b031614611b8d5760405162461bcd60e51b815260040161093f90613068565b6001600160a01b038116611bf25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093f565b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600033301415611ca557600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611ca89050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611cdc57506001600160e01b03198216635b5e139f60e01b145b8061083f57506301ffc9a760e01b6001600160e01b031983161461083f565b6000908152600260205260409020546001600160a01b0316151590565b6000610f52611c4e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d5782611413565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611df65760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b606482015260840161093f565b6001611e09611e0487612462565b6124df565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611e57573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006110cd828461311b565b60005b8161ffff1681101561102457611eae84611ea9838661311b565b61250f565b80611eb8816131e4565b915050611e8f565b6000611ecb82611cfb565b611f2c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161093f565b6000611f3783611413565b9050806001600160a01b0316846001600160a01b03161480611f725750836001600160a01b0316611f67846108d7565b6001600160a01b0316145b80611b465750611b468185611a7a565b826001600160a01b0316611f9582611413565b6001600160a01b031614611ffd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161093f565b6001600160a01b03821661205f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161093f565b61206a838383612529565b612075600082611d22565b6001600160a01b038316600090815260036020526040812080546001929061209e908490613166565b90915550506001600160a01b03821660009081526003602052604081208054600192906120cc90849061311b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716916000805160206132f083398151915291a4505050565b600061212682611413565b905061213481600084612529565b61213f600083611d22565b6001600160a01b0381166000908152600360205260408120805460019290612168908490613166565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416906000805160206132f0833981519152908390a45050565b600a5460ff16156121d35760405162461bcd60e51b815260040161093f90613015565b600a805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612209611d18565b6040516122169190612eb8565b60405180910390a1565b600f5460ff16156122435760405162461bcd60e51b815260040161093f9061303f565b600f805460ff191660011790557fcfe438f248d3757132817fd95e4dd5bede068f8f6db5595c5ecb816b7cca1c7e612209611d18565b600a5460ff1661229b5760405162461bcd60e51b815260040161093f90612f95565b600a805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612209611d18565b6122d9848484611f82565b6122e5848484846125e1565b6110245760405162461bcd60e51b815260040161093f90612fc3565b606060148054610854906131a9565b6060816123345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561235e5780612348816131e4565b91506123579050600a83613133565b9150612338565b6000816001600160401b038111156123785761237861326b565b6040519080825280601f01601f1916602001820160405280156123a2576020820181803683370190505b5090505b8415611b46576123b7600183613166565b91506123c4600a866131ff565b6123cf90603061311b565b60f81b8183815181106123e4576123e4613255565b60200101906001600160f81b031916908160001a905350612406600a86613133565b94506123a6565b600f5460ff1661242f5760405162461bcd60e51b815260040161093f9061309d565b600f805460ff191690557f283a148c0482d064fbf794e0d297192b1854c7edf96c8397dbc1ebd950f232b1612209611d18565b60006040518060800160405280604381526020016132ad60439139805160209182012083518483015160408087015180519086012090516124c2950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006124ea600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016124c2565b610cc28282604051806020016040528060008152506126f5565b6001600160a01b0383166125845761257f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6125a7565b816001600160a01b0316836001600160a01b0316146125a7576125a78382612728565b6001600160a01b0382166125be57610a82816127c5565b826001600160a01b0316826001600160a01b031614610a8257610a828282612874565b60006001600160a01b0384163b156126ea57836001600160a01b031663150b7a0261260a611d18565b8786866040518563ffffffff1660e01b815260040161262c9493929190612f01565b602060405180830381600087803b15801561264657600080fd5b505af1925050508015612676575060408051601f3d908101601f1916820190925261267391810190612d59565b60015b6126d0573d8080156126a4576040519150601f19603f3d011682016040523d82523d6000602084013e6126a9565b606091505b5080516126c85760405162461bcd60e51b815260040161093f90612fc3565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b46565b506001949350505050565b6126ff83836128b8565b61270c60008484846125e1565b610a825760405162461bcd60e51b815260040161093f90612fc3565b600060016127358461148a565b61273f9190613166565b600083815260076020526040902054909150808214612792576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127d790600190613166565b600083815260096020526040812054600880549394509092849081106127ff576127ff613255565b90600052602060002001549050806008838154811061282057612820613255565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806128585761285861323f565b6001900381819060005260206000200160009055905550505050565b600061287f8361148a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661290e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161093f565b61291781611cfb565b156129635760405162461bcd60e51b815260206004820152601c60248201527b115490cdcc8c4e881d1bdad95b88185b1c9958591e481b5a5b9d195960221b604482015260640161093f565b61296f60008383612529565b6001600160a01b038216600090815260036020526040812080546001929061299890849061311b565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392906000805160206132f0833981519152908290a45050565b8280546129f0906131a9565b90600052602060002090601f016020900481019282612a125760008555612a58565b82601f10612a2b57805160ff1916838001178555612a58565b82800160010185558215612a58579182015b82811115612a58578251825591602001919060010190612a3d565b50612a64929150612a68565b5090565b5b80821115612a645760008155600101612a69565b60006001600160401b0380841115612a9757612a9761326b565b604051601f8501601f19908116603f01168101908282118183101715612abf57612abf61326b565b81604052809350858152868686011115612ad857600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112612b0357600080fd5b6110cd83833560208501612a7d565b803561ffff81168114612b2457600080fd5b919050565b600060208284031215612b3b57600080fd5b81356110cd81613281565b60008060408385031215612b5957600080fd5b8235612b6481613281565b91506020830135612b7481613281565b809150509250929050565b600080600060608486031215612b9457600080fd5b8335612b9f81613281565b92506020840135612baf81613281565b929592945050506040919091013590565b60008060008060808587031215612bd657600080fd5b8435612be181613281565b93506020850135612bf181613281565b92506040850135915060608501356001600160401b03811115612c1357600080fd5b612c1f87828801612af2565b91505092959194509250565b60008060408385031215612c3e57600080fd5b8235612c4981613281565b915060208301358015158114612b7457600080fd5b600080600080600060a08688031215612c7657600080fd5b8535612c8181613281565b945060208601356001600160401b03811115612c9c57600080fd5b612ca888828901612af2565b9450506040860135925060608601359150608086013560ff81168114612ccd57600080fd5b809150509295509295909350565b60008060408385031215612cee57600080fd5b8235612cf981613281565b9150612d0760208401612b12565b90509250929050565b60008060408385031215612d2357600080fd5b8235612d2e81613281565b946020939093013593505050565b600060208284031215612d4e57600080fd5b81356110cd81613296565b600060208284031215612d6b57600080fd5b81516110cd81613296565b600060208284031215612d8857600080fd5b81516110cd81613281565b600060208284031215612da557600080fd5b81356001600160401b03811115612dbb57600080fd5b8201601f81018413612dcc57600080fd5b611b4684823560208401612a7d565b600060208284031215612ded57600080fd5b6110cd82612b12565b600060208284031215612e0857600080fd5b5035919050565b60008151808452612e2781602086016020860161317d565b601f01601f19169290920160200192915050565b60008251612e4d81846020870161317d565b9190910192915050565b60008351612e6981846020880161317d565b60609390931b6001600160601b0319169190920190815260140192915050565b60008351612e9b81846020880161317d565b835190830190612eaf81836020880161317d565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152606060408201819052600090612ef890830184612e0f565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612f3490830184612e0f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612f7657835183529284019291840191600101612f5a565b50909695505050505050565b6020815260006110cd6020830184612e0f565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e10db185a5b481a5cc81c185d5cd959608a1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527210db185a5b481a5cc81b9bdd081c185d5cd959606a1b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561312e5761312e613213565b500190565b60008261314257613142613229565b500490565b600081600019048311821515161561316157613161613213565b500290565b60008282101561317857613178613213565b500390565b60005b83811015613198578181015183820152602001613180565b838111156110245750506000910152565b600181811c908216806131bd57607f821691505b602082108114156131de57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156131f8576131f8613213565b5060010190565b60008261320e5761320e613229565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146110be57600080fd5b6001600160e01b0319811681146110be57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202a951addf30c5e554ecb12120b5c05f7f06cfeb85c4e18a4f26baf9be1abcc5064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.