Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x7e703cfe6918a045e450a0FadC01Aad8Ad894095
Balance 0 ETH
Nonce 1
Code Size 9307 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

9307 bytes
0x6080604052600436106101d75760003560e01c8063830953ab11610102578063c54e44eb11610095578063f2fde38b11610064578063f2fde38b146105da578063f309fed9146105fa578063fb4aa0a11461061a578063fe9f676e1461063a57600080fd5b8063c54e44eb146104e6578063d01608c114610506578063e18e84f914610526578063e6ab14341461053c57600080fd5b80638e15f473116100d15780638e15f4731461047c578063a43be57b14610491578063a7c60160146104a6578063b2da1ad5146104c657600080fd5b8063830953ab146104095780638561c3151461041e578063898850491461043e5780638da5cb5b1461045e57600080fd5b8063582b57231161017a578063715018a611610149578063715018a614610345578063718a19621461035a578063727f03421461037a5780637ff0adce146103d157600080fd5b8063582b5723146102c5578063680f2e4f146102e55780636de656fa146103055780636fb4adff1461032557600080fd5b80632127fe04116101b65780632127fe041461024b578063397643631461027957806348bf4fcf1461028f5780634a6413f7146102a557600080fd5b8062dde10e146101dc5780630ec809a81461022157806311b5444f14610243575b600080fd5b3480156101e857600080fd5b5061020c6101f7366004611fb1565b60096020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561022d57600080fd5b5061024161023c366004611fe6565b61065a565b005b61020c610684565b34801561025757600080fd5b5061026b610266366004612001565b610a9e565b604051908152602001610218565b34801561028557600080fd5b5061026b60065481565b34801561029b57600080fd5b5061026b60055481565b3480156102b157600080fd5b506102416102c0366004611fb1565b610ba1565b3480156102d157600080fd5b506102416102e0366004611fb1565b610c81565b3480156102f157600080fd5b50610241610300366004612023565b610ca2565b34801561031157600080fd5b5061024161032036600461205b565b610d26565b34801561033157600080fd5b50610241610340366004611fe6565b610e24565b34801561035157600080fd5b50610241610e99565b34801561036657600080fd5b5061026b610375366004612001565b610ead565b34801561038657600080fd5b506103b6610395366004611fe6565b600b6020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610218565b3480156103dd57600080fd5b506008546103f1906001600160a01b031681565b6040516001600160a01b039091168152602001610218565b34801561041557600080fd5b5061020c610efd565b34801561042a57600080fd5b50610241610439366004611fe6565b611196565b34801561044a57600080fd5b5061026b610459366004611fe6565b61120b565b34801561046a57600080fd5b506001546001600160a01b03166103f1565b34801561048857600080fd5b5061026b6112eb565b34801561049d57600080fd5b50610241611382565b3480156104b257600080fd5b5061020c6104c1366004611fb1565b61140c565b3480156104d257600080fd5b506102416104e13660046120bb565b6119af565b3480156104f257600080fd5b506002546103f1906001600160a01b031681565b34801561051257600080fd5b50610241610521366004611fb1565b611b8f565b34801561053257600080fd5b5061026b60045481565b34801561054857600080fd5b5061059d610557366004611fb1565b600a602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015495969495939492939192909160ff1688565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c0830152151560e082015261010001610218565b3480156105e657600080fd5b506102416105f5366004611fe6565b611c5b565b34801561060657600080fd5b5061026b610615366004612001565b611cd1565b34801561062657600080fd5b506007546103f1906001600160a01b031681565b34801561064657600080fd5b5061026b610655366004612001565b611cfd565b610662611dd6565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600060045460008111801561069b57506004548111155b6106c05760405162461bcd60e51b81526004016106b790612110565b60405180910390fd5b6004546106cd8134610ead565b6000828152600a6020526040902054421080159061070157506000828152600a602052604090206007015460ff1615156001145b6107475760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642074696d6520666f7220627579696e6760481b60448201526064016106b7565b60008111801561077957506000828152600a6020526040902060038101546004909101546107759190612152565b8111155b6107bb5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b60448201526064016106b7565b6107c3611e30565b6006546000906107d39080612165565b6005546107de6112eb565b6107e89034612165565b6107f29190612165565b6107fc919061217c565b6004546000908152600a6020526040902060058101546006909101549192509061082790839061219e565b11156108455760405162461bcd60e51b81526004016106b7906121b1565b6004546000908152600a60205260409020600101544211156108a05760405162461bcd60e51b8152602060048201526014602482015273383932b9b0b632902a34b6b29034b99037bb32b960611b60448201526064016106b7565b60045460009081526009602052604090205460ff16156108f35760405162461bcd60e51b815260206004820152600e60248201526d141c995cd85b19481c185d5cd95960921b60448201526064016106b7565b600061090160045483611cd1565b600480546000908152600a60205260409020908101546003909101549192509061092c90839061219e565b111561093757600080fd5b6004546000908152600a60205260408120600301805483929061095b90849061219e565b90915550506004546000908152600a60205260408120600601805484929061098490849061219e565b9091555050336000908152600b6020526040902060010154156109ce57336000908152600b6020526040812060010180548392906109c390849061219e565b90915550610a2b9050565b6040518060600160405280600081526020018281526020016000815250600b60006109f63390565b6001600160a01b0316815260208082019290925260409081016000208351815591830151600183015591909101516002909101555b600754610a41906001600160a01b031634611e89565b60045460408051838152346020820152428183015290516000929133917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d369181900360600190a4600195505050610a986001600055565b50505090565b600082600081118015610ab357506004548111155b610acf5760405162461bcd60e51b81526004016106b790612110565b6000848152600a6020526040812060020154610aeb9085612165565b9050600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6491906121f7565b610b6f90600a6122fe565b610b776112eb565b610b819190612165565b600654610b8e9083612165565b610b98919061217c565b95945050505050565b80600081118015610bb457506004548111155b610bd05760405162461bcd60e51b81526004016106b790612110565b610bd8611dd6565b60008281526009602052604090205460ff1615610c285760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481c185d5cd95960921b60448201526064016106b7565b60008281526009602052604090819020805460ff191660011790555182907f927e6cd2dce24f32508868820cdc35f09d9de0f4b44e945114110125196fba9f90610c759042815260200190565b60405180910390a25050565b610c89611dd6565b600754610c9f906001600160a01b031682611e89565b50565b610caa611dd6565b60075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af1158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d21919061230d565b505050565b86600081118015610d3957506004548111155b610d555760405162461bcd60e51b81526004016106b790612110565b610d5d611dd6565b60008511610d9a5760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016106b7565b60008411610de05760405162461bcd60e51b815260206004820152601360248201527216995c9bc81d1bdad95b9cc81d1bc81cd95b1b606a1b60448201526064016106b7565b506000968752600a60205260409096209485556002850192909255600184019290925560048301919091556005820155600701805460ff1916911515919091179055565b610e2c611dd6565b6001600160a01b038116610e775760405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d657465727360701b60448201526064016106b7565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b610ea1611dd6565b610eab6000611f5f565b565b600080600654600654610ec09190612165565b600554610ecb6112eb565b610ed59086612165565b610edf9190612165565b610ee9919061217c565b9050610ef58482611cd1565b949350505050565b600080610f093361120b565b905060008111610f4f5760405162461bcd60e51b815260206004820152601160248201527016995c9bc818db185a5b48185b5bdd5b9d607a1b60448201526064016106b7565b6008546001600160a01b0316610fa75760405162461bcd60e51b815260206004820152601d60248201527f50726573616c6520746f6b656e2061646472657373206e6f742073657400000060448201526064016106b7565b6008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610fef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611013919061232a565b81111561106c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820746f6b656e7320696e2074686520636f6e747261636044820152601d60fa1b60648201526084016106b7565b336000908152600b60205260408120428155600201805483929061109190849061219e565b909155505060085460405163a9059cbb60e01b8152336004820152602481018390526000916001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156110e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110c919061230d565b9050806111535760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b60448201526064016106b7565b6040805183815242602082015233917f9923b4306c6c030f2bdfbf156517d5983b87e15b96176da122cd4f2effa4ba7b910160405180910390a260019250505090565b61119e611dd6565b6001600160a01b0381166111e95760405162461bcd60e51b81526020600482015260126024820152715a65726f20746f6b656e206164647265737360701b60448201526064016106b7565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600b602090815260408083208151606081018352815481526001820154938101849052600290910154918101919091529061128a5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b60448201526064016106b7565b6000816040015182602001516112a09190612152565b9050600081116112e45760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016106b7565b9392505050565b600080600360009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611341573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611365919061235d565b505050915050806402540be40061137c91906123ad565b92915050565b61138a611dd6565b6004546000908152600a602052604090206007015460ff166113ee5760405162461bcd60e51b815260206004820181905260248201527f546869732070726573616c6520697320616c726561647920496e61637469766560448201526064016106b7565b6004546000908152600a60205260409020600701805460ff19169055565b600060045460008111801561142357506004548111155b61143f5760405162461bcd60e51b81526004016106b790612110565b60045461144c8185611cd1565b6000828152600a6020526040902054421080159061148057506000828152600a602052604090206007015460ff1615156001145b6114c65760405162461bcd60e51b8152602060048201526017602482015276496e76616c69642074696d6520666f7220627579696e6760481b60448201526064016106b7565b6000811180156114f857506000828152600a6020526040902060038101546004909101546114f49190612152565b8111155b61153a5760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081cd85b1948185b5bdd5b9d606a1b60448201526064016106b7565b611542611e30565b6004546000908152600a602052604090206001015442111561159d5760405162461bcd60e51b8152602060048201526014602482015273383932b9b0b632902a34b6b29034b99037bb32b960611b60448201526064016106b7565b60045460009081526009602052604090205460ff16156115f05760405162461bcd60e51b815260206004820152600e60248201526d141c995cd85b19481c185d5cd95960921b60448201526064016106b7565b6004546000908152600a60205260409020600581015460069091015461161790879061219e565b11156116355760405162461bcd60e51b81526004016106b7906121b1565b600061164360045487611cd1565b600480546000908152600a60205260409020908101546003909101549192509061166e90839061219e565b111561167957600080fd5b6004546000908152600a60205260408120600301805483929061169d90849061219e565b90915550506004546000908152600a6020526040812060060180548892906116c690849061219e565b9091555050336000908152600b60205260409020600101541561171057336000908152600b60205260408120600101805483929061170590849061219e565b9091555061176d9050565b6040518060600160405280600081526020018281526020016000815250600b60006117383390565b6001600160a01b0316815260208082019290925260409081016000208351815591830151600183015591909101516002909101555b6002546000906001600160a01b031663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381865afa1580156117cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f0919061232a565b90508087111561184c5760405162461bcd60e51b815260206004820152602160248201527f4d616b65207375726520746f2061646420656e6f75676820616c6c6f77616e636044820152606560f81b60648201526084016106b7565b6002546000906001600160a01b0316336007546040516001600160a01b03928316602482015291166044820152606481018a905260840160408051601f198184030181529181526020820180516001600160e01b03166323b872dd60e01b179052516118b891906123dd565b6000604051808303816000865af19150503d80600081146118f5576040519150601f19603f3d011682016040523d82523d6000602084013e6118fa565b606091505b50509050806119425760405162461bcd60e51b8152602060048201526014602482015273151bdad95b881c185e5b595b9d0819985a5b195960621b60448201526064016106b7565b60025460045460408051868152602081018c9052428183015290516001600160a01b039093169233917f4d8aead3491b7eba4b5c7a65fc17e493b9e63f9e433522fc5f6a85a168fc9d36919081900360600190a4600196505050506119a76001600055565b505050919050565b6119b7611dd6565b600086116119f45760405162461bcd60e51b815260206004820152600a6024820152695a65726f20707269636560b01b60448201526064016106b7565b60008511611a3a5760405162461bcd60e51b815260206004820152601360248201527216995c9bc81d1bdad95b9cc81d1bc81cd95b1b606a1b60448201526064016106b7565b6004546000908152600a602052604090206007015460ff1615611a9f5760405162461bcd60e51b815260206004820152601d60248201527f496e616374697665207468652070726576696f75732070726573616c6500000060448201526064016106b7565b60048054906000611aaf8361240c565b9091555050604080516101008101825284815260208082018581528284018a815260006060808601828152608087018d815260a088018d815260c089018581528b151560e08b01908152600480548852600a8b528c88209b518c55985160018c0155965160028b0155925160038a015590518887015551600588015551600687015591516007909501805460ff191695151595909517909455905484518a8152928301849052938201929092527f6a00651728a92841411081673eaa4eddbed06d102a590e050c22def40d4dd0b8910160405180910390a2505050505050565b80600081118015611ba257506004548111155b611bbe5760405162461bcd60e51b81526004016106b790612110565b611bc6611dd6565b60008281526009602052604090205460ff16611c115760405162461bcd60e51b815260206004820152600a602482015269139bdd081c185d5cd95960b21b60448201526064016106b7565b60008281526009602052604090819020805460ff191690555182907ff608654a6d8e1785594639dd55babb61d7ae157382015f904a24224e50333b1d90610c759042815260200190565b611c63611dd6565b6001600160a01b038116611cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b7565b610c9f81611f5f565b6005546000838152600a6020526040812060020154909190611cf39084612165565b6112e4919061217c565b600082600081118015611d1257506004548111155b611d2e5760405162461bcd60e51b81526004016106b790612110565b600860009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da591906121f7565b611db090600a6122fe565b6000858152600a6020526040902060020154611dcc9085612165565b610ef5919061217c565b6001546001600160a01b03163314610eab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b7565b600260005403611e825760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106b7565b6002600055565b80471015611ec75760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b60448201526064016106b7565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f14576040519150601f19603f3d011682016040523d82523d6000602084013e611f19565b606091505b5050905080610d215760405162461bcd60e51b81526020600482015260126024820152711155120814185e5b595b9d0819985a5b195960721b60448201526064016106b7565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215611fc357600080fd5b5035919050565b80356001600160a01b0381168114611fe157600080fd5b919050565b600060208284031215611ff857600080fd5b6112e482611fca565b6000806040838503121561201457600080fd5b50508035926020909101359150565b6000806040838503121561203657600080fd5b61203f83611fca565b946020939093013593505050565b8015158114610c9f57600080fd5b600080600080600080600060e0888a03121561207657600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c08801356120ab8161204d565b8091505092959891949750929550565b60008060008060008060c087890312156120d457600080fd5b863595506020870135945060408701359350606087013592506080870135915060a08701356121028161204d565b809150509295509295509295565b602080825260129082015271125b9d985b1a59081c1c995cd85b19481a5960721b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561137c5761137c61213c565b808202811582820484141761137c5761137c61213c565b60008261219957634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561137c5761137c61213c565b60208082526026908201527f416d6f756e742073686f756c64206265206c657373207468616e206c6566744860408201526506172646361760d41b606082015260800190565b60006020828403121561220957600080fd5b815160ff811681146112e457600080fd5b600181815b8085111561225557816000190482111561223b5761223b61213c565b8085161561224857918102915b93841c939080029061221f565b509250929050565b60008261226c5750600161137c565b816122795750600061137c565b816001811461228f5760028114612299576122b5565b600191505061137c565b60ff8411156122aa576122aa61213c565b50506001821b61137c565b5060208310610133831016604e8410600b84101617156122d8575081810a61137c565b6122e2838361221a565b80600019048211156122f6576122f661213c565b029392505050565b60006112e460ff84168361225d565b60006020828403121561231f57600080fd5b81516112e48161204d565b60006020828403121561233c57600080fd5b5051919050565b805169ffffffffffffffffffff81168114611fe157600080fd5b600080600080600060a0868803121561237557600080fd5b61237e86612343565b94506020860151935060408601519250606086015191506123a160808701612343565b90509295509295909350565b80820260008212600160ff1b841416156123c9576123c961213c565b818105831482151761137c5761137c61213c565b6000825160005b818110156123fe57602081860181015185830152016123e4565b506000920191825250919050565b60006001820161241e5761241e61213c565b506001019056fea26469706673582212203421e91ef5473a2787435117d5a7902e8e0b3bbfe15f2734ed48911798a80cf964736f6c63430008120033

Verified Source Code Partial Match

Compiler: v0.8.18+commit.87f61d96 EVM: paris Optimization: Yes (200 runs)
BugsBunnySale.sol 688 lines
/**
  ____                    ____                          
 |  _ \                  |  _ \                         
 | |_) |_   _  __ _ ___  | |_) |_   _ _ __  _ __  _   _ 
 |  _ <| | | |/ _` / __| |  _ <| | | | '_ \| '_ \| | | |
 | |_) | |_| | (_| \__ \ | |_) | |_| | | | | | | | |_| |
 |____/ \__,_|\__, |___/ |____/ \__,_|_| |_|_| |_|\__, |
               __/ |                               __/ |
              |___/                               |___/
 */
pragma solidity ^0.8.10;

abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

    function _nonReentrantBefore() private {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = _NOT_ENTERED;
    }
}

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

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

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

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

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

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

    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"
            );
    }

    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"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

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

    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

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

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

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

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        if (returndata.length > 0) {
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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 balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 amount) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

//SPDX-License-Identifier: MIT

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

contract BugsBunnySale is ReentrancyGuard, Ownable {
    IERC20Metadata public USDT;
    Aggregator internal aggregatorInterface;
    uint256 public presaleId;
    uint256 public USDT_MULTIPLIER;
    uint256 public ETH_MULTIPLIER;
    address public fundReceiver;
    address public bugsBunny;

    struct Presale {
        uint256 startTime;
        uint256 endTime;
        uint256 price;
        uint256 soldTokens;
        uint256 tokensToSell;
        uint256 UsdtHardcap;
        uint256 amountRaised;
        bool Active;
    }

    struct ClaimData {
        uint256 claimAt;
        uint256 totalAmount;
        uint256 claimedAmount;
    }

    mapping(uint256 => bool) public paused;
    mapping(uint256 => Presale) public presale;
    mapping(address =>  ClaimData) public userClaimData;

    event PresaleCreated(
        uint256 indexed _id,
        uint256 _totalTokens,
        uint256 _startTime,
        uint256 _endTime
    );

    event PresaleUpdated(
        bytes32 indexed key,
        uint256 prevValue,
        uint256 newValue,
        uint256 timestamp
    );

    event TokensBought(
        address indexed user,
        uint256 indexed id,
        address indexed purchaseToken,
        uint256 tokensBought,
        uint256 amountPaid,
        uint256 timestamp
    );

    event TokensClaimed(
        address indexed user,
        uint256 amount,
        uint256 timestamp
    );

    event PresaleTokenAddressUpdated(
        address indexed prevValue,
        address indexed newValue,
        uint256 timestamp
    );

    event PresalePaused(uint256 indexed id, uint256 timestamp);
    event PresaleUnpaused(uint256 indexed id, uint256 timestamp);

    constructor(address _oracle, address _usdt, address _bugsBunny) {
        aggregatorInterface = Aggregator(_oracle);
        bugsBunny = _bugsBunny;
        USDT = IERC20Metadata(_usdt);
        ETH_MULTIPLIER = (10 ** 18);
        USDT_MULTIPLIER = (10 ** 6);
        fundReceiver = 0x794D6F1C42d168786d369CA3C1E91c3aB98b6AFb;
    }

    function createPresale(
        uint256 _price,
        uint256 _tokensToSell,
        uint256 _UsdtHardcap,
        uint256 _startTime,
        uint256 _endTime,
        bool _isActive
    ) external onlyOwner {
        require(_price > 0, "Zero price");
        require(_tokensToSell > 0, "Zero tokens to sell");
        require(presale[presaleId].Active == false, "Inactive the previous presale");

        presaleId++;

        presale[presaleId] = Presale(
            _startTime,
            _endTime,
            _price,
            0,
            _tokensToSell,
            _UsdtHardcap,
            0,
            _isActive
        );

        emit PresaleCreated(presaleId, _tokensToSell, 0, 0);
    }

    function endPresale() public onlyOwner {
        require(presale[presaleId].Active, "This presale is already Inactive");
        presale[presaleId].Active = false;
    }

    function updatePresale(
        uint256 _id,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _price,
        uint256 _tokensToSell,
        uint256 _Hardcap,
        bool _isActive
    ) external checkPresaleId(_id) onlyOwner {
        require(_price > 0, "Zero price");
        require(_tokensToSell > 0, "Zero tokens to sell");
        presale[_id].startTime =_startTime;
        presale[_id].price = _price;
        presale[_id].endTime = _endTime;
        presale[_id].tokensToSell = _tokensToSell;
        presale[_id].UsdtHardcap = _Hardcap;
        presale[_id].Active = _isActive;
    }

    function changeFundWallet(address _wallet) external onlyOwner {
        require(_wallet != address(0), "Invalid parameters");
        fundReceiver = _wallet;
    }

    function changeUSDTToken(address _newAddress) external onlyOwner {
        require(_newAddress != address(0), "Zero token address");
        USDT = IERC20Metadata(_newAddress);
    }

    function pausePresale(uint256 _id) external checkPresaleId(_id) onlyOwner {
        require(!paused[_id], "Already paused");
        paused[_id] = true;
        emit PresalePaused(_id, block.timestamp);
    }

    function unPausePresale(
        uint256 _id
    ) external checkPresaleId(_id) onlyOwner {
        require(paused[_id], "Not paused");
        paused[_id] = false;
        emit PresaleUnpaused(_id, block.timestamp);
    }

    function getLatestPrice() public view returns (uint256) {
        (, int256 price, , , ) = aggregatorInterface.latestRoundData();
        price = (price * (10 ** 10));
        return uint256(price);
    }

    modifier checkPresaleId(uint256 _id) {
        require(_id > 0 && _id <= presaleId, "Invalid presale id");
        _;
    }

    modifier checkSaleState(uint256 _id, uint256 amount) {
        require(
            block.timestamp >= presale[_id].startTime &&
                presale[_id].Active == true,
            "Invalid time for buying"
        );
        require(
            amount > 0 &&
                amount <= presale[_id].tokensToSell - presale[_id].soldTokens,
            "Invalid sale amount"
        );
        _;
    }

    function buyWithUSDT(
        uint256 usdAmount
    )
        external
        checkPresaleId(presaleId)
        checkSaleState(presaleId, usdtToTokens(presaleId, usdAmount))
        nonReentrant
        returns (bool)
    {
        require(block.timestamp <= presale[presaleId].endTime,"presale Time is over");
        require(!paused[presaleId], "Presale paused");
        require(
            presale[presaleId].amountRaised + usdAmount <=
                presale[presaleId].UsdtHardcap,
            "Amount should be less than leftHardcap"
        );
        uint256 numberOfTokens = usdtToTokens(presaleId, usdAmount);
        require(
            presale[presaleId].soldTokens + numberOfTokens <=
                presale[presaleId].tokensToSell
        );
        presale[presaleId].soldTokens += numberOfTokens;
        presale[presaleId].amountRaised += usdAmount;
        if (userClaimData[_msgSender()].totalAmount > 0) {
            userClaimData[_msgSender()]
                .totalAmount += numberOfTokens;
        } else {
            userClaimData[_msgSender()] = ClaimData(
                0,
                numberOfTokens,
                0
            );
        }

        uint256 ourAllowance = USDT.allowance(
            _msgSender(),
            address(this)
        );
        require(usdAmount <= ourAllowance, "Make sure to add enough allowance");
        (bool success, ) = address(USDT).call(
            abi.encodeWithSignature(
                "transferFrom(address,address,uint256)",
                _msgSender(),
                fundReceiver,
                usdAmount
            )
        );
        require(success, "Token payment failed");
        emit TokensBought(
            _msgSender(),
            presaleId,
            address(USDT),
            numberOfTokens,
            usdAmount,
            block.timestamp
        );
        return true;
    }

    function buyWithEth()
        external
        payable
        checkPresaleId(presaleId)
        checkSaleState(presaleId, ethToTokens(presaleId, msg.value))
        nonReentrant
        returns (bool)
    {
        uint256 usdAmount = (msg.value * getLatestPrice() * USDT_MULTIPLIER) /
            (ETH_MULTIPLIER * ETH_MULTIPLIER);
        require(
            presale[presaleId].amountRaised + usdAmount <=
                presale[presaleId].UsdtHardcap,
            "Amount should be less than leftHardcap"
        );
        require(block.timestamp <= presale[presaleId].endTime,"presale Time is over");
        require(!paused[presaleId], "Presale paused");

        uint256 numberOfTokens = usdtToTokens(presaleId, usdAmount);
         require(
            presale[presaleId].soldTokens + numberOfTokens <=
                presale[presaleId].tokensToSell
        );
        presale[presaleId].soldTokens += numberOfTokens;
        presale[presaleId].amountRaised += usdAmount;

        if (userClaimData[_msgSender()].totalAmount > 0) {
            userClaimData[_msgSender()].totalAmount += numberOfTokens;
        } else {
            userClaimData[_msgSender()]= ClaimData(
                0, // Last claimed at
                numberOfTokens, // total tokens to be claimed
                0 // claimed amount
            );
        }

        sendValue(payable(fundReceiver), msg.value);
        emit TokensBought(
            _msgSender(),
            presaleId,
            address(0),
            numberOfTokens,
            msg.value,
            block.timestamp
        );
        return true;
    }

    function ethBuyHelper(
        uint256 _id,
        uint256 amount
    ) external view checkPresaleId(_id) returns (uint256 ethAmount) {
        uint256 usdPrice = (amount * presale[_id].price);
        ethAmount =
            (usdPrice * ETH_MULTIPLIER) /
            (getLatestPrice() * 10 ** IERC20Metadata(bugsBunny).decimals());
    }

    function usdtBuyHelper(
        uint256 _id,
        uint256 amount
    ) external view checkPresaleId(_id) returns (uint256 usdPrice) {
        usdPrice =
            (amount * presale[_id].price) /
            10 ** IERC20Metadata(bugsBunny).decimals();
    }

    function ethToTokens(
        uint256 _id,
        uint256 amount
    ) public view returns (uint256 _tokens) {
        uint256 usdAmount = (amount * getLatestPrice() * USDT_MULTIPLIER) /
            (ETH_MULTIPLIER * ETH_MULTIPLIER);
        _tokens = usdtToTokens(_id, usdAmount);
    }

    function usdtToTokens(
        uint256 _id,
        uint256 amount
    ) public view returns (uint256 _tokens) {
        _tokens = (amount * presale[_id].price) / USDT_MULTIPLIER;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Low balance");
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "ETH Payment failed");
    }

    function claimableAmount(
        address user
    ) public view  returns (uint256) {
        ClaimData memory _user = userClaimData[user];

        require(_user.totalAmount > 0, "Nothing to claim");
        uint256 amount = _user.totalAmount - _user.claimedAmount;
        require(amount > 0, "Already claimed");
        return amount;
    }

    function claimAmount(
    ) public returns (bool) {
        uint256 amount = claimableAmount(msg.sender);

        require(amount > 0, "Zero claim amount");
        require(bugsBunny != address(0), "Presale token address not set");
        require(
            amount <= IERC20(bugsBunny).balanceOf(address(this)),
            "Not enough tokens in the contract"
        );

        userClaimData[msg.sender].claimAt = block.timestamp;

        userClaimData[msg.sender].claimedAmount += amount;

        bool status = IERC20(bugsBunny).transfer(msg.sender, amount);
        require(status, "Token transfer failed");
        emit TokensClaimed(msg.sender, amount, block.timestamp);

        return true;
    }

    function WithdrawTokens(address _token, uint256 amount) external onlyOwner {
        IERC20(_token).transfer(fundReceiver, amount);
    }

    function WithdrawContractFunds(uint256 amount) external onlyOwner {
        sendValue(payable(fundReceiver), amount);
    }

    function ChangeTokenToSell(address _token) public onlyOwner {
        bugsBunny = _token;
    }
}

Read Contract

ETH_MULTIPLIER 0x39764363 → uint256
USDT 0xc54e44eb → address
USDT_MULTIPLIER 0x48bf4fcf → uint256
bugsBunny 0x7ff0adce → address
claimableAmount 0x89885049 → uint256
ethBuyHelper 0x2127fe04 → uint256
ethToTokens 0x718a1962 → uint256
fundReceiver 0xfb4aa0a1 → address
getLatestPrice 0x8e15f473 → uint256
owner 0x8da5cb5b → address
paused 0x00dde10e → bool
presale 0xe6ab1434 → uint256, uint256, uint256, uint256, uint256, uint256, uint256, bool
presaleId 0xe18e84f9 → uint256
usdtBuyHelper 0xfe9f676e → uint256
usdtToTokens 0xf309fed9 → uint256
userClaimData 0x727f0342 → uint256, uint256, uint256

Write Contract 15 functions

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

ChangeTokenToSell 0x0ec809a8
address _token
WithdrawContractFunds 0x582b5723
uint256 amount
WithdrawTokens 0x680f2e4f
address _token
uint256 amount
buyWithEth 0x11b5444f
No parameters
returns: bool
buyWithUSDT 0xa7c60160
uint256 usdAmount
returns: bool
changeFundWallet 0x6fb4adff
address _wallet
changeUSDTToken 0x8561c315
address _newAddress
claimAmount 0x830953ab
No parameters
returns: bool
createPresale 0xb2da1ad5
uint256 _price
uint256 _tokensToSell
uint256 _UsdtHardcap
uint256 _startTime
uint256 _endTime
bool _isActive
endPresale 0xa43be57b
No parameters
pausePresale 0x4a6413f7
uint256 _id
renounceOwnership 0x715018a6
No parameters
transferOwnership 0xf2fde38b
address newOwner
unPausePresale 0xd01608c1
uint256 _id
updatePresale 0x6de656fa
uint256 _id
uint256 _startTime
uint256 _endTime
uint256 _price
uint256 _tokensToSell
uint256 _Hardcap
bool _isActive

Recent Transactions

No transactions found for this address