Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x2B56E485E62791ca18cB4fEc63646117005095E9
Balance 0 ETH
Nonce 1
Code Size 11424 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

11424 bytes
0x60806040526004361061014d575f3560e01c8063adc1686c116100b5578063e086e5ec1161006e578063e086e5ec1461044b578063e21ead3c14610461578063f3fef3a31461048d578063f9ba9f71146104b5578063fb690dcc146104dd578063feda925b1461051957610167565b8063adc1686c14610342578063b3e089a21461037e578063b66a0e5d146103a6578063c1436415146103bc578063ca0cdea8146103e6578063d3418ad71461042357610167565b8063893d20e811610107578063893d20e81461026857806389a30271146102925780638b4c40b0146102bc578063909f8724146102c65780639561a365146102f0578063a6f9dae11461031a57610167565b8062b370441461016b5780631762df8614610195578063260f298f146101c0578063380d831b146101fe57806344691f7e1461021457806364b2e2d91461023e57610167565b366101675761015a610541565b61016533345f6105a5565b005b5f80fd5b348015610176575f80fd5b5061017f610673565b60405161018c919061206c565b60405180910390f35b3480156101a0575f80fd5b506101a9610679565b6040516101b7929190612085565b60405180910390f35b3480156101cb575f80fd5b506101e660048036038101906101e191906120da565b610689565b6040516101f5939291906122b6565b60405180910390f35b348015610209575f80fd5b506102126109d4565b005b34801561021f575f80fd5b50610228610a7c565b604051610235919061231a565b60405180910390f35b348015610249575f80fd5b50610252610a8e565b60405161025f919061206c565b60405180910390f35b348015610273575f80fd5b5061027c610a9a565b6040516102899190612342565b60405180910390f35b34801561029d575f80fd5b506102a6610ac1565b6040516102b39190612342565b60405180910390f35b6102c4610ae7565b005b3480156102d1575f80fd5b506102da610afc565b6040516102e7919061235b565b60405180910390f35b3480156102fb575f80fd5b50610304610b87565b604051610311919061206c565b60405180910390f35b348015610325575f80fd5b50610340600480360381019061033b91906123a5565b610b8d565b005b34801561034d575f80fd5b50610368600480360381019061036391906123d0565b610cd5565b6040516103759190612342565b60405180910390f35b348015610389575f80fd5b506103a4600480360381019061039f91906123a5565b610d19565b005b3480156103b1575f80fd5b506103ba610dea565b005b3480156103c7575f80fd5b506103d0610e93565b6040516103dd9190612342565b60405180910390f35b3480156103f1575f80fd5b5061040c600480360381019061040791906123a5565b610eb8565b60405161041a929190612085565b60405180910390f35b34801561042e575f80fd5b50610449600480360381019061044491906123a5565b610ed8565b005b348015610456575f80fd5b5061045f611018565b005b34801561046c575f80fd5b506104756110d2565b604051610484939291906122b6565b60405180910390f35b348015610498575f80fd5b506104b360048036038101906104ae91906123fb565b6113aa565b005b3480156104c0575f80fd5b506104db60048036038101906104d691906123d0565b611446565b005b3480156104e8575f80fd5b5061050360048036038101906104fe91906123a5565b611485565b6040516105109190612466565b60405180910390f35b348015610524575f80fd5b5061053f600480360381019061053a91906123a5565b6114ef565b005b61057860025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a4761057391906124d9565b61162d565b6105a360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff164761162d565b565b60075f9054906101000a900460ff166105f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ea90612563565b60405180910390fd5b5f8211610635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062c906125cb565b60405180910390fd5b61063e83611728565b5f8160ff160361065757610652838361181e565b61066e565b60018160ff160361066d5761066c83836118f7565b5b5b505050565b60055481565b5f80600554600654915091509091565b60608060608385106106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c790612633565b60405180910390fd5b6004805490508411156106e65760048054905093505b5f85856106f39190612651565b90505f8167ffffffffffffffff8111156107105761070f612684565b5b60405190808252806020026020018201604052801561073e5781602001602082028036833780820191505090505b5090505f8267ffffffffffffffff81111561075c5761075b612684565b5b60405190808252806020026020018201604052801561078a5781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff8111156107a8576107a7612684565b5b6040519080825280602002602001820160405280156107d65781602001602082028036833780820191505090505b5090505f8990505b888110156109bf575f8a826107f39190612651565b905060048281548110610809576108086126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16858281518110610844576108436126b1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060035f60048481548110610895576108946126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015484828151811061090c5761090b6126b1565b5b60200260200101818152505060035f6004848154811061092f5761092e6126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548382815181106109a7576109a66126b1565b5b602002602001018181525050816001019150506107de565b50828282965096509650505050509250925092565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5890612728565b60405180910390fd5b5f60075f6101000a81548160ff021916908315150217905550565b60075f9054906101000a900460ff1681565b5f600480549050905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610aef610541565b610afa33345f6105a5565b565b60606004805480602002602001604051908101604052809291908181526020018280548015610b7d57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610b34575b5050505050905090565b60065481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1190612728565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f342827c97908e5e2f71151c08502a66d44b6f758e3ac2f1de95f02eb95f0a73560405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f60048281548110610cea57610ce96126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90612728565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e90612728565b60405180910390fd5b600160075f6101000a81548160ff021916908315150217905550565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6003602052805f5260405f205f91509050805f0154908060010154905082565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5e90612790565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcc906127f8565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109c90612728565b60405180910390fd5b6110d060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff164761162d565b565b60608060605f60048054905090505f8167ffffffffffffffff8111156110fb576110fa612684565b5b6040519080825280602002602001820160405280156111295781602001602082028036833780820191505090505b5090505f8267ffffffffffffffff81111561114757611146612684565b5b6040519080825280602002602001820160405280156111755781602001602082028036833780820191505090505b5090505f8367ffffffffffffffff81111561119357611192612684565b5b6040519080825280602002602001820160405280156111c15781602001602082028036833780820191505090505b5090505f5b8481101561139757600481815481106111e2576111e16126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684828151811061121d5761121c6126b1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060035f6004838154811061126e5761126d6126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01548382815181106112e5576112e46126b1565b5b60200260200101818152505060035f60048381548110611308576113076126b1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548282815181106113805761137f6126b1565b5b6020026020010181815250508060010190506111c6565b5082828296509650965050505050909192565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142e90612728565b60405180910390fd5b6114428233836119d2565b5050565b5f611473600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611b02565b9050611481338260016105a5565b5050565b61148d61203c565b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060400160405290815f82015481526020016001820154815250509050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461157c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157390612728565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906127f8565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f8273ffffffffffffffffffffffffffffffffffffffff16825f67ffffffffffffffff8111156116605761165f612684565b5b6040519080825280601f01601f1916602001820160405280156116925781602001600182028036833780820191505090505b506040516116a09190612882565b5f6040518083038185875af1925050503d805f81146116da576040519150601f19603f3d011682016040523d82523d5f602084013e6116df565b606091505b5050905080611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a90612908565b60405180910390fd5b505050565b5f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541480156117b557505f60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154145b1561181b57600481908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f82825401925050819055508060055f82825401925050819055507f459b57a145a19d4c0cd719600b7150b3ab862fb447013c99c16dee5f1f858678828260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01546040516118eb93929190612926565b60405180910390a15050565b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f82825401925050819055508060065f82825401925050819055507fbae8f3550c1821555786dd15944cba81611b8a49348a3ad5b56f4c6e9d024bdc828260035f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101546040516119c693929190612926565b60405180910390a15050565b5f808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611a0392919061295b565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611a519190612882565b5f604051808303815f865af19150503d805f8114611a8a576040519150601f19603f3d011682016040523d82523d5f602084013e611a8f565b606091505b5091509150818015611abc57505f81511480611abb575080806020019051810190611aba91906129ac565b5b5b611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af290612a47565b60405180910390fd5b5050505050565b5f818373ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b3d9190612342565b602060405180830381865afa158015611b58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b7c9190612a79565b1015611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490612aee565b60405180910390fd5b5f8373ffffffffffffffffffffffffffffffffffffffff166370a0823160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611c189190612342565b602060405180830381865afa158015611c33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c579190612a79565b8473ffffffffffffffffffffffffffffffffffffffff166370a0823160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611cb19190612342565b602060405180830381865afa158015611ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf09190612a79565b611cfa9190612b0c565b90505f600a84611d0a91906124d9565b9050611d39853360025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611f09565b611d71853360015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168488611d6c9190612651565b611f09565b5f8573ffffffffffffffffffffffffffffffffffffffff166370a0823160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611dcc9190612342565b602060405180830381865afa158015611de7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0b9190612a79565b8673ffffffffffffffffffffffffffffffffffffffff166370a0823160015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611e659190612342565b602060405180830381865afa158015611e80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea49190612a79565b611eae9190612b0c565b9050828111611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990612b89565b60405180910390fd5b8281611efe9190612651565b935050505092915050565b5f808573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611f3c93929190612ba7565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611f8a9190612882565b5f604051808303815f865af19150503d805f8114611fc3576040519150601f19603f3d011682016040523d82523d5f602084013e611fc8565b606091505b5091509150818015611ff557505f81511480611ff4575080806020019051810190611ff391906129ac565b5b5b612034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202b90612c4c565b60405180910390fd5b505050505050565b60405180604001604052805f81526020015f81525090565b5f819050919050565b61206681612054565b82525050565b5f60208201905061207f5f83018461205d565b92915050565b5f6040820190506120985f83018561205d565b6120a5602083018461205d565b9392505050565b5f80fd5b6120b981612054565b81146120c3575f80fd5b50565b5f813590506120d4816120b0565b92915050565b5f80604083850312156120f0576120ef6120ac565b5b5f6120fd858286016120c6565b925050602061210e858286016120c6565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61216a82612141565b9050919050565b61217a81612160565b82525050565b5f61218b8383612171565b60208301905092915050565b5f602082019050919050565b5f6121ad82612118565b6121b78185612122565b93506121c283612132565b805f5b838110156121f25781516121d98882612180565b97506121e483612197565b9250506001810190506121c5565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61223181612054565b82525050565b5f6122428383612228565b60208301905092915050565b5f602082019050919050565b5f612264826121ff565b61226e8185612209565b935061227983612219565b805f5b838110156122a95781516122908882612237565b975061229b8361224e565b92505060018101905061227c565b5085935050505092915050565b5f6060820190508181035f8301526122ce81866121a3565b905081810360208301526122e2818561225a565b905081810360408301526122f6818461225a565b9050949350505050565b5f8115159050919050565b61231481612300565b82525050565b5f60208201905061232d5f83018461230b565b92915050565b61233c81612160565b82525050565b5f6020820190506123555f830184612333565b92915050565b5f6020820190508181035f83015261237381846121a3565b905092915050565b61238481612160565b811461238e575f80fd5b50565b5f8135905061239f8161237b565b92915050565b5f602082840312156123ba576123b96120ac565b5b5f6123c784828501612391565b91505092915050565b5f602082840312156123e5576123e46120ac565b5b5f6123f2848285016120c6565b91505092915050565b5f8060408385031215612411576124106120ac565b5b5f61241e85828601612391565b925050602061242f858286016120c6565b9150509250929050565b604082015f82015161244d5f850182612228565b5060208201516124606020850182612228565b50505050565b5f6040820190506124795f830184612439565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6124e382612054565b91506124ee83612054565b9250826124fe576124fd61247f565b5b828204905092915050565b5f82825260208201905092915050565b7f53616c6520486173204e6f7420537461727465640000000000000000000000005f82015250565b5f61254d601483612509565b915061255882612519565b602082019050919050565b5f6020820190508181035f83015261257a81612541565b9050919050565b7f5a65726f20416d6f756e740000000000000000000000000000000000000000005f82015250565b5f6125b5600b83612509565b91506125c082612581565b602082019050919050565b5f6020820190508181035f8301526125e2816125a9565b9050919050565b7f496e76616c696420496e646578657300000000000000000000000000000000005f82015250565b5f61261d600f83612509565b9150612628826125e9565b602082019050919050565b5f6020820190508181035f83015261264a81612611565b9050919050565b5f61265b82612054565b915061266683612054565b925082820390508181111561267e5761267d6124ac565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f43616c6c6572206973206e6f74206f776e6572000000000000000000000000005f82015250565b5f612712601383612509565b915061271d826126de565b602082019050919050565b5f6020820190508181035f83015261273f81612706565b9050919050565b7f4f6e6c79204465763000000000000000000000000000000000000000000000005f82015250565b5f61277a600983612509565b915061278582612746565b602082019050919050565b5f6020820190508181035f8301526127a78161276e565b9050919050565b7f5a65726f204164647265737300000000000000000000000000000000000000005f82015250565b5f6127e2600c83612509565b91506127ed826127ae565b602082019050919050565b5f6020820190508181035f83015261280f816127d6565b9050919050565b5f81519050919050565b5f81905092915050565b5f5b8381101561284757808201518184015260208101905061282c565b5f8484015250505050565b5f61285c82612816565b6128668185612820565b935061287681856020860161282a565b80840191505092915050565b5f61288d8284612852565b915081905092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665724554483a5f8201527f20455448207472616e73666572206661696c6564000000000000000000000000602082015250565b5f6128f2603483612509565b91506128fd82612898565b604082019050919050565b5f6020820190508181035f83015261291f816128e6565b9050919050565b5f6060820190506129395f830186612333565b612946602083018561205d565b612953604083018461205d565b949350505050565b5f60408201905061296e5f830185612333565b61297b602083018461205d565b9392505050565b61298b81612300565b8114612995575f80fd5b50565b5f815190506129a681612982565b92915050565b5f602082840312156129c1576129c06120ac565b5b5f6129ce84828501612998565b91505092915050565b7f5472616e7366657248656c7065723a3a736166655472616e736665723a2074725f8201527f616e73666572206661696c656400000000000000000000000000000000000000602082015250565b5f612a31602d83612509565b9150612a3c826129d7565b604082019050919050565b5f6020820190508181035f830152612a5e81612a25565b9050919050565b5f81519050612a73816120b0565b92915050565b5f60208284031215612a8e57612a8d6120ac565b5b5f612a9b84828501612a65565b91505092915050565b7f496e73756666696369656e742042616c616e63650000000000000000000000005f82015250565b5f612ad8601483612509565b9150612ae382612aa4565b602082019050919050565b5f6020820190508181035f830152612b0581612acc565b9050919050565b5f612b1682612054565b9150612b2183612054565b9250828201905080821115612b3957612b386124ac565b5b92915050565b7f5472616e7366657220496e204661696c656400000000000000000000000000005f82015250565b5f612b73601283612509565b9150612b7e82612b3f565b602082019050919050565b5f6020820190508181035f830152612ba081612b67565b9050919050565b5f606082019050612bba5f830186612333565b612bc76020830185612333565b612bd4604083018461205d565b949350505050565b7f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a2074725f8201527f616e7366657246726f6d206661696c6564000000000000000000000000000000602082015250565b5f612c36603183612509565b9150612c4182612bdc565b604082019050919050565b5f6020820190508181035f830152612c6381612c2a565b905091905056fea26469706673582212207dd1e9fa321245c8f17eb98d8628111dadd387fc0358a13ab8b609df3cee1fed64736f6c63430008140033

Verified Source Code Partial Match

Compiler: v0.8.20+commit.a1b79de6 EVM: shanghai Optimization: No
Presale.sol 392 lines
//SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

/**
 * @title Owner
 * @dev Set & change owner
 */
contract Ownable {

    address private owner;
    
    // event for EVM logging
    event OwnerSet(address indexed oldOwner, address indexed newOwner);
    
    // modifier to check if caller is owner
    modifier onlyOwner() {
        // If the first argument of 'require' evaluates to 'false', execution terminates and all
        // changes to the state and to Ether balances are reverted.
        // This used to consume all gas in old EVM versions, but not anymore.
        // It is often a good idea to use 'require' to check if functions are called correctly.
        // As a second argument, you can also provide an explanation about what went wrong.
        require(msg.sender == owner, "Caller is not owner");
        _;
    }
    
    /**
     * @dev Set contract deployer as owner
     */
    constructor() {
        owner = msg.sender; // 'msg.sender' is sender of current call, contract deployer for a constructor
        emit OwnerSet(address(0), owner);
    }

    /**
     * @dev Change owner
     * @param newOwner address of new owner
     */
    function changeOwner(address newOwner) public onlyOwner {
        emit OwnerSet(owner, newOwner);
        owner = newOwner;
    }

    /**
     * @dev Return owner address 
     * @return address of owner
     */
    function getOwner() external view returns (address) {
        return owner;
    }
}

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
    }
}

interface IERC20 {

    function totalSupply() external view returns (uint256);
    
    function symbol() external view returns(string memory);
    
    function name() external view returns(string memory);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);
    
    /**
     * @dev Returns the number of decimal places
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


contract Presale is Ownable {

    // Receiver Of Donation
    address public presaleReceiver;
    address private dev0;

    // Donation Struct
    struct Donation {
        uint256 amountETH;
        uint256 amountUSDC;
    }

    // Address => User
    mapping ( address => Donation ) public donors;

    // List Of All Donors
    address[] private _allDonors;

    // Total Amount Donated
    uint256 public totalDonated;
    uint256 public totalDonatedUSDC;

    // sale has ended
    bool public hasStarted;

    // USDC addresses
    address public USDC;

    // Donation Event, Trackers Donor And Amount Donated
    event DonatedETH(address donor, uint256 amountDonated, uint256 totalUserDonation);
    event DonatedUSDC(address donor, uint256 amountDonated, uint256 totalUserDonation);

    constructor(
        address _presaleReceiver,
        address _dev0,
        address _USDC
    ) {
        hasStarted = true;
        USDC = _USDC;
        presaleReceiver = _presaleReceiver;
        dev0 = _dev0;
    }

    function startSale() external onlyOwner {
        hasStarted = true;
    }

    function endSale() external onlyOwner {
        hasStarted = false;
    }

    function setUSDC(address _USDC) external onlyOwner {
        USDC = _USDC;
    }

    function withdraw(address token_, uint256 amount) external onlyOwner {
        TransferHelper.safeTransfer(token_, msg.sender, amount);
    }

    function withdrawETH() external onlyOwner {
        TransferHelper.safeTransferETH(presaleReceiver, address(this).balance);
    }

    function setPresaleReceiver(address newReceiver) external onlyOwner {
        require(newReceiver != address(0), 'Zero Address');
        presaleReceiver = newReceiver;
    }

    function setDev0(address newDev0) external {
        require(msg.sender == dev0, 'Only Dev0');
        require(newDev0 != address(0), 'Zero Address');
        dev0 = newDev0;
    }

    function donateETH() external payable {
        _handleETH();
        _process(msg.sender, msg.value, 0);
    }

    function donateUSDC(uint256 amount) external {
        uint256 amountReceived = _transferIn(USDC, amount);
        _process(msg.sender, amountReceived, 1);
    }

    receive() external payable {
        _handleETH();
        _process(msg.sender, msg.value, 0);
    }

    function donated(address user) external view returns(Donation memory) {
        return donors[user];
    }

    function allDonors() external view returns (address[] memory) {
        return _allDonors;
    }

    function allDonorsAndDonationAmounts() external view returns (
        address[] memory, 
        uint256[] memory,
        uint256[] memory
    ) {
        uint256 len = _allDonors.length;
        address[] memory addresses = new address[](len);
        uint256[] memory amounts = new uint256[](len);
        uint256[] memory amountsUSDC = new uint256[](len);
        for (uint i = 0; i < len;) {
            addresses[i] = _allDonors[i];
            amounts[i] = donors[_allDonors[i]].amountETH;
            amountsUSDC[i] = donors[_allDonors[i]].amountUSDC;
            unchecked { ++i; }
        }
        return (addresses, amounts, amountsUSDC);
    }

    function paginateDonorsAndDonationAmounts(uint256 startIndex, uint256 endIndex) external view returns (
        address[] memory, 
        uint256[] memory,
        uint256[] memory
    ) {
        require(startIndex < endIndex, 'Invalid Indexes');
        if (endIndex > _allDonors.length) {
            endIndex = _allDonors.length;
        }
        uint256 len = endIndex - startIndex;
        address[] memory addresses = new address[](len);
        uint256[] memory amounts = new uint256[](len);
        uint256[] memory amountsUSDC = new uint256[](len);
        for (uint i = startIndex; i < endIndex;) {
            uint256 index = i - startIndex;
            addresses[index] = _allDonors[i];
            amounts[index] = donors[_allDonors[i]].amountETH;
            amountsUSDC[index] = donors[_allDonors[i]].amountUSDC;
            unchecked { ++i; }
        }
        return (addresses, amounts, amountsUSDC);
    }

    function donorAtIndex(uint256 index) external view returns (address) {
        return _allDonors[index];
    }

    function numberOfDonors() external view returns (uint256) {
        return _allDonors.length;
    }

    function getDonatedTotals() external view returns (uint256, uint256) {
        return (totalDonated, totalDonatedUSDC);
    }

    function _process(address user, uint amount, uint8 TYPE) internal {
        require(
            hasStarted,
            'Sale Has Not Started'
        );
        require(
            amount > 0,
            'Zero Amount'
        );

        // process user, adding to lists as necessary
        _processUser(user);

        if (TYPE == 0) {
            _processETH(user, amount);
        } else if (TYPE == 1) {
            _processUSDC(user, amount);
        }
    }

    function _processETH(address user, uint amount) internal {
        // increment amounts donated
        unchecked {
            donors[user].amountETH += amount;
            totalDonated += amount;
        }
        emit DonatedETH(user, amount, donors[user].amountETH);
    }

    function _processUSDC(address user, uint amount) internal {
        // increment amounts donated
        unchecked {
            donors[user].amountUSDC += amount;
            totalDonatedUSDC += amount;
        }
        emit DonatedUSDC(user, amount, donors[user].amountUSDC);
    }

    function _processUser(address user) internal {
        // add to donor list if first donation
        if (donors[user].amountETH == 0 && donors[user].amountUSDC == 0) {
            _allDonors.push(user);
        }
    }

    function _handleETH() internal {
        TransferHelper.safeTransferETH(dev0, address(this).balance / 10);
        TransferHelper.safeTransferETH(presaleReceiver, address(this).balance);
    }

    function _transferIn(address token, uint256 amount) internal returns (uint256){
        require(
            IERC20(token).balanceOf(msg.sender) >= amount,
            'Insufficient Balance'
        );
        uint256 balBefore = IERC20(token).balanceOf(presaleReceiver) + IERC20(token).balanceOf(dev0);
        uint256 dev0Amount = amount / 10;
        TransferHelper.safeTransferFrom(token, msg.sender, dev0, dev0Amount);
        TransferHelper.safeTransferFrom(token, msg.sender, presaleReceiver, amount - dev0Amount);
        uint256 balAfter = IERC20(token).balanceOf(presaleReceiver) + IERC20(token).balanceOf(dev0);
        require(balAfter > balBefore, 'Transfer In Failed');
        return balAfter - balBefore;
    }
}

Read Contract

USDC 0x89a30271 → address
allDonors 0x909f8724 → address[]
allDonorsAndDonationAmounts 0xe21ead3c → address[], uint256[], uint256[]
donated 0xfb690dcc → tuple
donorAtIndex 0xadc1686c → address
donors 0xca0cdea8 → uint256, uint256
getDonatedTotals 0x1762df86 → uint256, uint256
getOwner 0x893d20e8 → address
hasStarted 0x44691f7e → bool
numberOfDonors 0x64b2e2d9 → uint256
paginateDonorsAndDonationAmounts 0x260f298f → address[], uint256[], uint256[]
presaleReceiver 0xc1436415 → address
totalDonated 0x00b37044 → uint256
totalDonatedUSDC 0x9561a365 → uint256

Write Contract 10 functions

These functions modify contract state and require a wallet transaction to execute.

changeOwner 0xa6f9dae1
address newOwner
donateETH 0x8b4c40b0
No parameters
donateUSDC 0xf9ba9f71
uint256 amount
endSale 0x380d831b
No parameters
setDev0 0xd3418ad7
address newDev0
setPresaleReceiver 0xfeda925b
address newReceiver
setUSDC 0xb3e089a2
address _USDC
startSale 0xb66a0e5d
No parameters
withdraw 0xf3fef3a3
address token_
uint256 amount
withdrawETH 0xe086e5ec
No parameters

Recent Transactions

No transactions found for this address