Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x13b4e3deb676E3ceca7b78C4c87d8DB071673712
Balance 0 ETH
Nonce 1
Code Size 13094 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

13094 bytes
0x608060405260043610610184575f3560e01c80637d8966e4116100d0578063a98ad46c11610089578063cc3d967b11610063578063cc3d967b14610567578063d4e02786146105a3578063e049efa1146105df578063f2fde38b146106095761018b565b8063a98ad46c146104d4578063ac55ae1f146104fe578063b712a2ab1461053b5761018b565b80637d8966e4146103ee57806384276d81146104045780638917db451461042c5780638a5a0060146104565780638da5cb5b146104805780639833b0ff146104aa5761018b565b806322f3e2d41161013d5780635b85e1f2116101175780635b85e1f2146103485780637097cdc414610384578063715018a6146103ae578063787beb34146103c45761018b565b806322f3e2d4146102c657806331ad36ab146102f05780634e0e4879146103205761018b565b8063074bc1011461018f578063084faa43146101b957806308f2d320146101e357806308f433331461021f5780630ec1ecac146102605780631797f3101461028a5761018b565b3661018b57005b5f80fd5b34801561019a575f80fd5b506101a3610631565b6040516101b09190612277565b60405180910390f35b3480156101c4575f80fd5b506101cd610656565b6040516101da91906122a8565b60405180910390f35b3480156101ee575f80fd5b5061020960048036038101906102049190612319565b610666565b6040516102169190612371565b60405180910390f35b34801561022a575f80fd5b5061024560048036038101906102409190612319565b6106bd565b60405161025796959493929190612418565b60405180910390f35b34801561026b575f80fd5b50610274610728565b60405161028191906122a8565b60405180910390f35b348015610295575f80fd5b506102b060048036038101906102ab9190612477565b61072e565b6040516102bd91906122a8565b60405180910390f35b3480156102d1575f80fd5b506102da610743565b6040516102e79190612371565b60405180910390f35b61030a600480360381019061030591906124a2565b610755565b6040516103179190612371565b60405180910390f35b34801561032b575f80fd5b50610346600480360381019061034191906124cd565b610ae1565b005b348015610353575f80fd5b5061036e60048036038101906103699190612540565b610d48565b60405161037b9190612371565b60405180910390f35b34801561038f575f80fd5b50610398611261565b6040516103a591906122a8565b60405180910390f35b3480156103b9575f80fd5b506103c2611267565b005b3480156103cf575f80fd5b506103d861127a565b6040516103e59190612596565b60405180910390f35b3480156103f9575f80fd5b50610402611317565b005b34801561040f575f80fd5b5061042a600480360381019061042591906124a2565b611375565b005b348015610437575f80fd5b50610440611453565b60405161044d9190612277565b60405180910390f35b348015610461575f80fd5b5061046a611478565b6040516104779190612277565b60405180910390f35b34801561048b575f80fd5b50610494611490565b6040516104a19190612277565b60405180910390f35b3480156104b5575f80fd5b506104be6114b8565b6040516104cb9190612596565b60405180910390f35b3480156104df575f80fd5b506104e8611555565b6040516104f59190612277565b60405180910390f35b348015610509575f80fd5b50610524600480360381019061051f9190612540565b61157a565b6040516105329291906125af565b60405180910390f35b348015610546575f80fd5b5061054f611798565b60405161055e939291906125d6565b60405180910390f35b348015610572575f80fd5b5061058d60048036038101906105889190612477565b6117c3565b60405161059a9190612759565b60405180910390f35b3480156105ae575f80fd5b506105c960048036038101906105c491906127a3565b6118da565b6040516105d69190612371565b60405180910390f35b3480156105ea575f80fd5b506105f36119ca565b60405161060091906122a8565b60405180910390f35b348015610614575f80fd5b5061062f600480360381019061062a9190612477565b6119d0565b005b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6b60ef6b1aba6f07233000000081565b5f61066f611a54565b5f8390506106b2730572798938a8aa670b31b4369733a890e56684fd848373ffffffffffffffffffffffffffffffffffffffff16611adb9092919063ffffffff16565b600191505092915050565b600f602052815f5260405f2081815481106106d6575f80fd5b905f5260205f2090600502015f9150915050805f015490806001015490806002015490806003015490806004015f9054906101000a900460ff16908060040160019054906101000a900460ff16905086565b60075481565b600e602052805f5260405f205f915090505481565b600a5f9054906101000a900460ff1681565b5f61075e611b5a565b600a5f9054906101000a900460ff166107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a390612861565b60405180910390fd5b336107b681611b9e565b156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ed906128c9565b60405180910390fd5b82600181101561083b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083290612931565b60405180910390fd5b600b6001015442118015610853575042600b60020154115b610892576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610889906129bf565b60405180910390fd5b5f8061089e865f61157a565b80925081935050508060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016109019190612277565b602060405180830381865afa15801561091c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094091906129f1565b1015610981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097890612a66565b60405180910390fd5b61098a81611baf565b813410156109cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c490612ace565b60405180910390fd5b6109eb868383425f600b5f015f9054906101000a900460ff16611c0e565b81341115610a0e575f8234610a009190612b19565b9050610a0c3382611db6565b505b610a2c730572798938a8aa670b31b4369733a890e56684fd83611db6565b610a78338260065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611adb9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167fd368961d33ebd8d78de2e70fbdb55b7de41dc853caccc2a81f3dc4e0eaecd5248784845f604051610ac49493929190612b4c565b60405180910390a26001945050505050610adc611e9f565b919050565b610ae9611a54565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4e90612bd9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90612c41565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90612ca9565b60405180910390fd5b8260045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff167f9a143b3500d5efe421f09f7a1aa033da309ba9c748ac43b257f1980cdc31de438383604051610d3b929190612cc7565b60405180910390a2505050565b5f610d51611b5a565b600a5f9054906101000a900460ff16610d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9690612861565b60405180910390fd5b826001811015610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90612931565b60405180910390fd5b33610dee81611b9e565b15610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e25906128c9565b60405180910390fd5b600b6001015442118015610e46575042600b60020154115b610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c906129bf565b60405180910390fd5b60016002811115610e9957610e9861238a565b5b846002811115610eac57610eab61238a565b5b1480610edb5750600280811115610ec657610ec561238a565b5b846002811115610ed957610ed861238a565b5b145b610f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1190612d38565b60405180910390fd5b5f60016002811115610f2f57610f2e61238a565b5b856002811115610f4257610f4161238a565b5b14610f6e5760055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f91565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165b90505f8190505f80610fa3898961157a565b80925081935050508060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110069190612277565b602060405180830381865afa158015611021573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104591906129f1565b1015611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d90612a66565b60405180910390fd5b61108f81611baf565b818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016110cb929190612cc7565b602060405180830381865afa1580156110e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110a91906129f1565b101561114b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114290612da0565b60405180910390fd5b611169898383428c600b5f015f9054906101000a900460ff16611c0e565b6111aa33730572798938a8aa670b31b4369733a890e56684fd848673ffffffffffffffffffffffffffffffffffffffff16611ea8909392919063ffffffff16565b6111f6338260065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611adb9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167e16ce2cbe3b5120a45eec705c1be68113bed0934cb608db33f1806aee5b3f098a84848c6040516112419493929190612b4c565b60405180910390a26001965050505050505061125b611e9f565b92915050565b60095481565b61126f611a54565b6112785f611f2a565b565b5f8060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156112e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130a9190612e27565b5050509150508091505090565b61131f611a54565b600a5f9054906101000a900460ff1615600a5f6101000a81548160ff0219169083151502179055507f885c95dafaf2f1effb171823a8c0625bc71e0d9720c00d8167def5458e82385760405160405180910390a1565b61137d611b5a565b611385611a54565b804710156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90612ee8565b60405180910390fd5b6113e6730572798938a8aa670b31b4369733a890e56684fd82611db6565b730572798938a8aa670b31b4369733a890e56684fd73ffffffffffffffffffffffffffffffffffffffff167fe08eed5bb22ce46ac6172def838c0de5f5c31fec3802434ff8b265d37e1839a18260405161144091906122a8565b60405180910390a2611450611e9f565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b730572798938a8aa670b31b4369733a890e56684fd81565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f8060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115489190612e27565b5050509150508091505090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f808360018110156115c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b890612931565b60405180910390fd5b5f60095490508460028111156115da576115d961238a565b5b5f60028111156115ed576115ec61238a565b5b0361167b575f6402540be40061160161127a565b61160b9190612f06565b90505f670de0b6b3a764000080896116239190612f7c565b61162d9190612f7c565b90505f828261163c9190612fea565b90505f84670de0b6b3a7640000808c6116559190612f7c565b61165f9190612f7c565b6116699190612fea565b90508181975097505050505050611790565b84600281111561168e5761168d61238a565b5b600160028111156116a2576116a161238a565b5b036116f4575f620f4240876116b79190612f7c565b90505f82670de0b6b3a7640000808a6116d09190612f7c565b6116da9190612f7c565b6116e49190612fea565b9050818195509550505050611790565b8460028111156117075761170661238a565b5b60028081111561171a5761171961238a565b5b0361178c575f6117286114b8565b90505f8790505f82662386f26fc10000836117439190612f7c565b61174d9190612fea565b90505f84670de0b6b3a7640000808c6117669190612f7c565b6117709190612f7c565b61177a9190612fea565b90508181975097505050505050611790565b5f80fd5b509250929050565b5f805f600b5f015f9054906101000a900460ff169250600b600101549150600b600201549050909192565b6060600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156118cf578382905f5260205f2090600502016040518060c00160405290815f8201548152602001600182015481526020016002820154815260200160038201548152602001600482015f9054906101000a900460ff16600281111561188d5761188c61238a565b5b600281111561189f5761189e61238a565b5b81526020016004820160019054906101000a900460ff1660ff1660ff168152505081526020019060010190611821565b505050509050919050565b5f6118e3611a54565b42841180156118f157508383115b611930576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119279061308a565b60405180910390fd5b84600b5f015f6101000a81548160ff021916908360ff16021790555083600b6001018190555082600b60020181905550816009819055506001600a5f6101000a81548160ff0219169083151502179055507ff83e8fa358d8413a54cdac7e65e2df789237f79a7e5d4e9d77ab23f8e58bd148858585856040516119b694939291906130a8565b60405180910390a160019050949350505050565b60085481565b6119d8611a54565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a48575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611a3f9190612277565b60405180910390fd5b611a5181611f2a565b50565b611a5c611fed565b73ffffffffffffffffffffffffffffffffffffffff16611a7a611490565b73ffffffffffffffffffffffffffffffffffffffff1614611ad957611a9d611fed565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611ad09190612277565b60405180910390fd5b565b611b55838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611b0e9291906130eb565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ff4565b505050565b60025f5403611b95576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f81905550565b5f80823b90505f8111915050919050565b6b60ef6b1aba6f07233000000081600854611bca9190613112565b1115611c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c029061318f565b60405180910390fd5b50565b600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405280888152602001878152602001868152602001858152602001846002811115611c8157611c8061238a565b5b81526020018360ff16815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f01556020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff02191690836002811115611d0357611d0261238a565b5b021790555060a08201518160040160016101000a81548160ff021916908360ff160217905550505085600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d779190613112565b925050819055508560075f828254611d8f9190613112565b925050819055508360085f828254611da79190613112565b92505081905550505050505050565b80471015611dfb57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611df29190612277565b60405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff1682604051611e20906131da565b5f6040518083038185875af1925050503d805f8114611e5a576040519150601f19603f3d011682016040523d82523d5f602084013e611e5f565b606091505b5050905080611e9a576040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60015f81905550565b611f24848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611edd939291906131ee565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611ff4565b50505050565b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f61201e828473ffffffffffffffffffffffffffffffffffffffff1661208990919063ffffffff16565b90505f815114158015612042575080806020019051810190612040919061324d565b155b1561208457826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161207b9190612277565b60405180910390fd5b505050565b606061209683835f61209e565b905092915050565b6060814710156120e557306040517fcd7860590000000000000000000000000000000000000000000000000000000081526004016120dc9190612277565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161210d91906132da565b5f6040518083038185875af1925050503d805f8114612147576040519150601f19603f3d011682016040523d82523d5f602084013e61214c565b606091505b509150915061215c868383612167565b925050509392505050565b60608261217c57612177826121f4565b6121ec565b5f82511480156121a257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156121e457836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016121db9190612277565b60405180910390fd5b8190506121ed565b5b9392505050565b5f815111156122065780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61226182612238565b9050919050565b61227181612257565b82525050565b5f60208201905061228a5f830184612268565b92915050565b5f819050919050565b6122a281612290565b82525050565b5f6020820190506122bb5f830184612299565b92915050565b5f80fd5b6122ce81612257565b81146122d8575f80fd5b50565b5f813590506122e9816122c5565b92915050565b6122f881612290565b8114612302575f80fd5b50565b5f81359050612313816122ef565b92915050565b5f806040838503121561232f5761232e6122c1565b5b5f61233c858286016122db565b925050602061234d85828601612305565b9150509250929050565b5f8115159050919050565b61236b81612357565b82525050565b5f6020820190506123845f830184612362565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b600381106123c8576123c761238a565b5b50565b5f8190506123d8826123b7565b919050565b5f6123e7826123cb565b9050919050565b6123f7816123dd565b82525050565b5f60ff82169050919050565b612412816123fd565b82525050565b5f60c08201905061242b5f830189612299565b6124386020830188612299565b6124456040830187612299565b6124526060830186612299565b61245f60808301856123ee565b61246c60a0830184612409565b979650505050505050565b5f6020828403121561248c5761248b6122c1565b5b5f612499848285016122db565b91505092915050565b5f602082840312156124b7576124b66122c1565b5b5f6124c484828501612305565b91505092915050565b5f805f606084860312156124e4576124e36122c1565b5b5f6124f1868287016122db565b9350506020612502868287016122db565b9250506040612513868287016122db565b9150509250925092565b60038110612529575f80fd5b50565b5f8135905061253a8161251d565b92915050565b5f8060408385031215612556576125556122c1565b5b5f61256385828601612305565b92505060206125748582860161252c565b9150509250929050565b5f819050919050565b6125908161257e565b82525050565b5f6020820190506125a95f830184612587565b92915050565b5f6040820190506125c25f830185612299565b6125cf6020830184612299565b9392505050565b5f6060820190506125e95f830186612409565b6125f66020830185612299565b6126036040830184612299565b949350505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61263d81612290565b82525050565b61264c816123dd565b82525050565b61265b816123fd565b82525050565b60c082015f8201516126755f850182612634565b5060208201516126886020850182612634565b50604082015161269b6040850182612634565b5060608201516126ae6060850182612634565b5060808201516126c16080850182612643565b5060a08201516126d460a0850182612652565b50505050565b5f6126e58383612661565b60c08301905092915050565b5f602082019050919050565b5f6127078261260b565b6127118185612615565b935061271c83612625565b805f5b8381101561274c57815161273388826126da565b975061273e836126f1565b92505060018101905061271f565b5085935050505092915050565b5f6020820190508181035f83015261277181846126fd565b905092915050565b612782816123fd565b811461278c575f80fd5b50565b5f8135905061279d81612779565b92915050565b5f805f80608085870312156127bb576127ba6122c1565b5b5f6127c88782880161278f565b94505060206127d987828801612305565b93505060406127ea87828801612305565b92505060606127fb87828801612305565b91505092959194509250565b5f82825260208201905092915050565b7f53616c65206973207061757365642e00000000000000000000000000000000005f82015250565b5f61284b600f83612807565b915061285682612817565b602082019050919050565b5f6020820190508181035f8301526128788161283f565b9050919050565b7f436f6e74726163742041646472657373000000000000000000000000000000005f82015250565b5f6128b3601083612807565b91506128be8261287f565b602082019050919050565b5f6020820190508181035f8301526128e0816128a7565b9050919050565b7f20496e76616c696420696e70757420616d6f756e7400000000000000000000005f82015250565b5f61291b601583612807565b9150612926826128e7565b602082019050919050565b5f6020820190508181035f8301526129488161290f565b9050919050565b7f2053616c65206973206e6f742073746172746564206f722073616c65206973205f8201527f656e646564000000000000000000000000000000000000000000000000000000602082015250565b5f6129a9602583612807565b91506129b48261294f565b604082019050919050565b5f6020820190508181035f8301526129d68161299d565b9050919050565b5f815190506129eb816122ef565b92915050565b5f60208284031215612a0657612a056122c1565b5b5f612a13848285016129dd565b91505092915050565b7f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000005f82015250565b5f612a50601d83612807565b9150612a5b82612a1c565b602082019050919050565b5f6020820190508181035f830152612a7d81612a44565b9050919050565b7f496e73756666696369656e74204e61746976652076616c7565000000000000005f82015250565b5f612ab8601983612807565b9150612ac382612a84565b602082019050919050565b5f6020820190508181035f830152612ae581612aac565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612b2382612290565b9150612b2e83612290565b9250828203905081811115612b4657612b45612aec565b5b92915050565b5f608082019050612b5f5f830187612299565b612b6c6020830186612299565b612b796040830185612299565b612b8660608301846123ee565b95945050505050565b7f5553445420616464726573732063616e6e6f74206265207a65726f00000000005f82015250565b5f612bc3601b83612807565b9150612bce82612b8f565b602082019050919050565b5f6020820190508181035f830152612bf081612bb7565b9050919050565b7f42544320616464726573732063616e6e6f74206265207a65726f0000000000005f82015250565b5f612c2b601a83612807565b9150612c3682612bf7565b602082019050919050565b5f6020820190508181035f830152612c5881612c1f565b9050919050565b7f4743585020616464726573732063616e6e6f74206265207a65726f00000000005f82015250565b5f612c93601b83612807565b9150612c9e82612c5f565b602082019050919050565b5f6020820190508181035f830152612cc081612c87565b9050919050565b5f604082019050612cda5f830185612268565b612ce76020830184612268565b9392505050565b7f496e76616c696420746f6b656e207479706500000000000000000000000000005f82015250565b5f612d22601283612807565b9150612d2d82612cee565b602082019050919050565b5f6020820190508181035f830152612d4f81612d16565b9050919050565b7f496e73756666696369656e7420616c6c6f77616e6365000000000000000000005f82015250565b5f612d8a601683612807565b9150612d9582612d56565b602082019050919050565b5f6020820190508181035f830152612db781612d7e565b9050919050565b5f69ffffffffffffffffffff82169050919050565b612ddc81612dbe565b8114612de6575f80fd5b50565b5f81519050612df781612dd3565b92915050565b612e068161257e565b8114612e10575f80fd5b50565b5f81519050612e2181612dfd565b92915050565b5f805f805f60a08688031215612e4057612e3f6122c1565b5b5f612e4d88828901612de9565b9550506020612e5e88828901612e13565b9450506040612e6f888289016129dd565b9350506060612e80888289016129dd565b9250506080612e9188828901612de9565b9150509295509295909350565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f612ed2601483612807565b9150612edd82612e9e565b602082019050919050565b5f6020820190508181035f830152612eff81612ec6565b9050919050565b5f612f108261257e565b9150612f1b8361257e565b9250828202612f298161257e565b91507f800000000000000000000000000000000000000000000000000000000000000084145f84121615612f6057612f5f612aec565b5b8282058414831517612f7557612f74612aec565b5b5092915050565b5f612f8682612290565b9150612f9183612290565b9250828202612f9f81612290565b91508282048414831517612fb657612fb5612aec565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ff482612290565b9150612fff83612290565b92508261300f5761300e612fbd565b5b828204905092915050565b7f456e642074696d65206d7573742062652067726561746572207468616e2073745f8201527f6172742074696d65000000000000000000000000000000000000000000000000602082015250565b5f613074602883612807565b915061307f8261301a565b604082019050919050565b5f6020820190508181035f8301526130a181613068565b9050919050565b5f6080820190506130bb5f830187612409565b6130c86020830186612299565b6130d56040830185612299565b6130e26060830184612299565b95945050505050565b5f6040820190506130fe5f830185612268565b61310b6020830184612299565b9392505050565b5f61311c82612290565b915061312783612290565b925082820190508082111561313f5761313e612aec565b5b92915050565b7f49434f20746f6b656e20636170207265616368656400000000000000000000005f82015250565b5f613179601583612807565b915061318482613145565b602082019050919050565b5f6020820190508181035f8301526131a68161316d565b9050919050565b5f81905092915050565b50565b5f6131c55f836131ad565b91506131d0826131b7565b5f82019050919050565b5f6131e4826131ba565b9150819050919050565b5f6060820190506132015f830186612268565b61320e6020830185612268565b61321b6040830184612299565b949350505050565b61322c81612357565b8114613236575f80fd5b50565b5f8151905061324781613223565b92915050565b5f60208284031215613262576132616122c1565b5b5f61326f84828501613239565b91505092915050565b5f81519050919050565b5f5b8381101561329f578082015181840152602081019050613284565b5f8484015250505050565b5f6132b482613278565b6132be81856131ad565b93506132ce818560208601613282565b80840191505092915050565b5f6132e582846132aa565b91508190509291505056fea2646970667358221220b97dfa33fc7fcbaa925bb0fe64dbc962b44a6237117e3ee898e621af61921fb564736f6c63430008140033

Verified Source Code Full Match

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

interface AggregatorV3Interface {
  function decimals() external view returns (uint8);

  function description() external view returns (string memory);

  function version() external view returns (uint256);

  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract ReentrancyGuard {
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

library Address {

    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

library SafeERC20 {
    using Address for address;

    error SafeERC20FailedOperation(address token);

    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }
  
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

contract GcxpIco is ReentrancyGuard, Ownable {

    using SafeERC20 for IERC20;
    using Address for address;

    // Chainlink price feed for ETH/USD
    AggregatorV3Interface internal priceFeedForEth;

    // Chainlink price feed for BTC/USD
    AggregatorV3Interface internal priceFeedForBtc;

    address public constant FUNDER_WALLET = 0x0572798938a8aA670B31b4369733a890E56684fd;
    address public usdtToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
    address public btcToken= 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599;
    address public gcxpCoin = 0x09580506415e36c1DdE0d08eB8910ADEC13c064b;

    uint256 constant GCXP_DECIMALS = 1e18;
    uint256 public constant ICO_TOTAL_LIMIT = 30_000_000_000 * 1e18; // 30 Billion
    
    uint256 public usdtRaised;
    uint256 public totalSoldGcxpToken;
    uint256 public gcxpPerDollar = 1e16; // 0.01 in wei where 1 GCXP = 0.01 USD

    bool public isActive;

    enum BuyType {
        eth,
        usdt,
        btc
    }

    struct ICOConfig {
        uint8 currentSalePhase;
        uint256 saleStartTime;
        uint256 saleEndTime;
    }

    struct UserDeposit {
        uint256 dollarValue;    // dollar amount 
        uint256 estimatedAmount; // user payed amount
        uint256 userGcxpAmount;   // user estimate GCXP
        uint256 investTime;      // user invest time in second
        BuyType currencyType;     // store currency type
        uint8 salePhaseType;       // store sale phase type
    } 

    ICOConfig private _icoConfig;

    mapping(address => uint256) public userPurchaseInUsd;
    mapping(address => UserDeposit[]) public userDeposits; // userAddress => UserDeposit
    
    event BuyWithToken(address indexed userAddress, uint256 usdAmount, uint256 estimatedAmount, uint256 gcxpAmount, BuyType buyType);
    event BuyWithNative(address indexed userAddress, uint256 usdAmount, uint256 estimatedNative, uint256 gcxpAmount, BuyType buyType);
    event TokenAddressesUpdated(address indexed usdtToken, address btcToken, address gcxpCoin);
    event NativeWithdraw(address indexed to, uint256 amount);
    event SaleConfigured(uint8 phase, uint256 start, uint256 end, uint256 price);
    event ToggleSale();
  
    modifier validAddress(address _addr) {
        require(_addr != address(0), "Not valid address");
        _;
    }
    
    modifier onlyEoA(address _account) {
        require(!isContract(_account), "Contract Address");
        _;
    }

    modifier nonZero(uint256 amount) {
        require(amount >= 1 ," Invalid input amount");
        _;
    }

    modifier notPaused() {
        require(isActive, "Sale is paused.");
        _;
    }

    modifier isSaleStarted() {
        require(block.timestamp > _icoConfig.saleStartTime && _icoConfig.saleEndTime > block.timestamp," Sale is not started or sale is ended");
        _;
    }

    constructor(address _priceFeedForEth, address _priceFeedForBtc) Ownable(msg.sender) {
        require(_priceFeedForEth != address(0), "Invalid ETH feed");
        require(_priceFeedForBtc != address(0), "Invalid BTC feed");
        priceFeedForEth = AggregatorV3Interface(_priceFeedForEth);
        priceFeedForBtc = AggregatorV3Interface(_priceFeedForBtc);
    }

    /**** OnlyOwner ****/

    /// @notice Function to toggle sale if needed only by owner
    function toggleSale() external onlyOwner{
        isActive = !isActive;
        emit ToggleSale();
    }
    
    function updateTokenAddresses(address _usdtToken, address _btcToken, address _gcxpCoin) external onlyOwner {
        require(_usdtToken != address(0), "USDT address cannot be zero");
        require(_btcToken != address(0), "BTC address cannot be zero");
        require(_gcxpCoin != address(0), "GCXP address cannot be zero");
        usdtToken = _usdtToken;
        btcToken = _btcToken;
        gcxpCoin = _gcxpCoin;
        emit TokenAddressesUpdated(_usdtToken, _btcToken, _gcxpCoin);
    }

    /// @notice This function is used to config the sale
    /// @param setCurrentSalePhase This is used to set the sale phase like 1,2,3
    /// @param saleStart The start time of the phase
    /// @param saleEnd The end time of the phase
    /// @param _gcxpPerDollar The gcxp coin price in each phase, pass the value in wei
    function configSale(uint8 setCurrentSalePhase, uint256 saleStart, uint256 saleEnd, uint256 _gcxpPerDollar) external onlyOwner returns(bool) {
        require(saleStart > block.timestamp && saleEnd > saleStart ,"End time must be greater than start time");
        _icoConfig.currentSalePhase = setCurrentSalePhase;
        _icoConfig.saleStartTime = saleStart;
        _icoConfig.saleEndTime = saleEnd;
        gcxpPerDollar = _gcxpPerDollar;
        isActive = true;
        emit SaleConfigured(setCurrentSalePhase, saleStart, saleEnd, _gcxpPerDollar);
        return true;
    }
   
    /// @notice This function is used for withdraw the token from contract if token stuck
    /// @param tokenAddress The token contract address 
    /// @param tokenAmount The exact amount which is availabe on contract address, we have to pass tokenAmount in wei
    function getTokenFromContract(address tokenAddress, uint256 tokenAmount) external onlyOwner returns(bool){
        IERC20 token = IERC20(tokenAddress);
        token.safeTransfer(FUNDER_WALLET, tokenAmount);
        return true;
    }

    /// @dev Owner-only function to withdraw native ETH from the contract.
    /// @param amount The amount of ETH (in wei) to withdraw.
    function withdrawNative(uint256 amount) external nonReentrant onlyOwner {
        require(address(this).balance >= amount, "Insufficient balance");
        Address.sendValue(payable(FUNDER_WALLET), amount);
        emit NativeWithdraw(FUNDER_WALLET, amount);
    }

    /**** Public Functions ****/
    
    /// @notice Function is used to get phase details
    function getICOConfig() external view returns (
        uint8 _currentSalePhase,
        uint256 _saleStartTime,
        uint256 _saleEndTime

    ) {
        _currentSalePhase = _icoConfig.currentSalePhase;
        _saleStartTime = _icoConfig.saleStartTime;
        _saleEndTime = _icoConfig.saleEndTime;
    }

    /// @notice Function to get the live eth price in usd
    function getEthPriceInUSD() public view returns (int256) {
        (, int256 price, , , ) = priceFeedForEth.latestRoundData();
        return price;
    }

    /// @notice Function to get the live btc token price in usd
    function getBtcPriceInUSD() public view returns (int256) {
        (, int256 price, , , ) = priceFeedForBtc.latestRoundData();
        return price;
    }
    
    /// @notice Function is used to get the estimated value of assert and gcxp coin corresponding to usd
    /// @param usdAmount The usd amount from whihc user wanted to buy gcxp coin we have to pass in real number
    /// @param buyType From which assert user wanted to buy the gcxp coin like 0 mean eth, 1 mean usdt, and 2 mean btc
    function estimateFund(uint256 usdAmount, BuyType buyType) public view nonZero(usdAmount) returns(uint256, uint256){
        uint256 oneTokenPriceInUsd = gcxpPerDollar;
        if(BuyType.eth == buyType){
            int256 liveEthPrice = getEthPriceInUSD() * 10 ** 10; // eth is 18 decimals
            uint256 dollarAmount = usdAmount * GCXP_DECIMALS * GCXP_DECIMALS;
            uint256 ethInDollar = (dollarAmount) / uint256(liveEthPrice) ;
            uint256 gcxpAmount = (usdAmount * GCXP_DECIMALS * GCXP_DECIMALS) / oneTokenPriceInUsd;
            return (ethInDollar, gcxpAmount);
        }
        if (BuyType.usdt == buyType){
            uint256 usdtAmount = usdAmount * (10**6); // usdt is 6 decimals
            uint256 gcxpAmount = (usdAmount * GCXP_DECIMALS * GCXP_DECIMALS) / oneTokenPriceInUsd;
            return (usdtAmount, gcxpAmount); 
        }
        if (BuyType.btc == buyType){
            int256 liveBtcPrice = getBtcPriceInUSD();  // btc is 8 decimals
            uint256 dollarAmount = usdAmount;
            uint256 btcInDollar = (dollarAmount *10**16) / uint256(liveBtcPrice) ;
            uint256 gcxpAmount = (usdAmount * GCXP_DECIMALS * GCXP_DECIMALS) / oneTokenPriceInUsd;
            return (btcInDollar, gcxpAmount); 
        }
        revert();
    }
     
    /// @notice This function is used buy Gcxp coin using token(USDT, BTC) in all sale
    /// @param usdAmount The usdAmount which means if user want to buy for 50$ so just pass 50
    /// @param buyType From which token user wanted to buy the gcxp coin like 1 mean usdt, and 2 mean btc
    function buyWithToken(uint256 usdAmount, BuyType buyType) external
        nonReentrant
        notPaused
        nonZero(usdAmount)
        onlyEoA(msg.sender)
        isSaleStarted
        returns (bool)
    {   
        require(buyType == BuyType.usdt || buyType == BuyType.btc, "Invalid token type");
        address tokenAddress;
        tokenAddress = (buyType == BuyType.usdt) ? usdtToken : btcToken;
        IERC20 token = IERC20(tokenAddress);
        uint256 estimatedAmount;
        uint256 gcxpAmount;
        (estimatedAmount, gcxpAmount) = estimateFund(usdAmount, buyType);
        require(IERC20(gcxpCoin).balanceOf(address(this)) >= gcxpAmount,"Not enough tokens in contract");
        _checkSupply(gcxpAmount);
        require(token.allowance(msg.sender, address(this)) >= estimatedAmount,"Insufficient allowance");
        updateUserState(usdAmount, estimatedAmount, gcxpAmount, block.timestamp, buyType, _icoConfig.currentSalePhase);
        token.safeTransferFrom(msg.sender, FUNDER_WALLET, estimatedAmount);
        IERC20(gcxpCoin).safeTransfer(msg.sender, gcxpAmount);
        emit BuyWithToken(msg.sender, usdAmount, estimatedAmount, gcxpAmount, buyType);
        return true;
    }
    
    /// @notice This function is used buy Gcxp coin using native token
    /// @param usdAmount The amount is in usd means if user want to buy for 50$ so just pass 50
    function buyWithNative(uint256 usdAmount) external payable
        nonReentrant
        notPaused
        onlyEoA(msg.sender)
        nonZero(usdAmount)
        isSaleStarted
        returns (bool)
    {
        uint256 estimatedNative;
        uint256 gcxpAmount;
        (estimatedNative, gcxpAmount) = estimateFund(usdAmount, BuyType.eth);
        require(IERC20(gcxpCoin).balanceOf(address(this)) >= gcxpAmount,"Not enough tokens in contract");
        _checkSupply(gcxpAmount);
        require(msg.value >= estimatedNative, "Insufficient Native value");
        updateUserState(usdAmount, estimatedNative, gcxpAmount, block.timestamp, BuyType.eth, _icoConfig.currentSalePhase);
        if(msg.value > estimatedNative){
            uint256 userExtraCoin = msg.value - estimatedNative;
            Address.sendValue(payable(msg.sender), userExtraCoin);
        }
        Address.sendValue(payable(FUNDER_WALLET), estimatedNative);
        IERC20(gcxpCoin).safeTransfer(msg.sender, gcxpAmount);
        emit BuyWithNative(msg.sender, usdAmount, estimatedNative, gcxpAmount, BuyType.eth);
        return true;
    }

    /// @notice To get the user invest details
    /// @param userAddress The user address from which we need to get details
    function getUserDetails(address userAddress) external view returns (UserDeposit[] memory) {
        return userDeposits[userAddress];
    }

    /**** Internal ****/

    /// @dev function to update the user details
    function updateUserState(uint256 usdAmount, uint256 estimatedAmount, uint256 gcxpAmount, uint256 investTime, BuyType buyType, uint8 salePhase) internal {
        userDeposits[msg.sender].push(UserDeposit(usdAmount, estimatedAmount, gcxpAmount, investTime, buyType, salePhase));
        userPurchaseInUsd[msg.sender] += usdAmount;
        usdtRaised += usdAmount;
        totalSoldGcxpToken += gcxpAmount;
    }
    
    /// @dev Function to check is total supply reached or not
    /// @param _tokenAmount The gcxp coin amount
    function _checkSupply(uint256 _tokenAmount) internal view {
        require(totalSoldGcxpToken + _tokenAmount <= ICO_TOTAL_LIMIT, "ICO token cap reached");
    }
    
    /// @dev Function is to check caller is contract or not
    /// @param account The address
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
    receive() external payable { }
}

Read Contract

FUNDER_WALLET 0x8a5a0060 → address
ICO_TOTAL_LIMIT 0x084faa43 → uint256
btcToken 0x074bc101 → address
estimateFund 0xac55ae1f → uint256, uint256
gcxpCoin 0x8917db45 → address
gcxpPerDollar 0x7097cdc4 → uint256
getBtcPriceInUSD 0x9833b0ff → int256
getEthPriceInUSD 0x787beb34 → int256
getICOConfig 0xb712a2ab → uint8, uint256, uint256
getUserDetails 0xcc3d967b → tuple[]
isActive 0x22f3e2d4 → bool
owner 0x8da5cb5b → address
totalSoldGcxpToken 0xe049efa1 → uint256
usdtRaised 0x0ec1ecac → uint256
usdtToken 0xa98ad46c → address
userDeposits 0x08f43333 → uint256, uint256, uint256, uint256, uint8, uint8
userPurchaseInUsd 0x1797f310 → uint256

Write Contract 9 functions

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

buyWithNative 0x31ad36ab
uint256 usdAmount
returns: bool
buyWithToken 0x5b85e1f2
uint256 usdAmount
uint8 buyType
returns: bool
configSale 0xd4e02786
uint8 setCurrentSalePhase
uint256 saleStart
uint256 saleEnd
uint256 _gcxpPerDollar
returns: bool
getTokenFromContract 0x08f2d320
address tokenAddress
uint256 tokenAmount
returns: bool
renounceOwnership 0x715018a6
No parameters
toggleSale 0x7d8966e4
No parameters
transferOwnership 0xf2fde38b
address newOwner
updateTokenAddresses 0x4e0e4879
address _usdtToken
address _btcToken
address _gcxpCoin
withdrawNative 0x84276d81
uint256 amount

Recent Transactions

No transactions found for this address