Address Contract Partially Verified
Address
0x7e703cfe6918a045e450a0FadC01Aad8Ad894095
Balance
0 ETH
Nonce
1
Code Size
9307 bytes
Creator
0x794D6F1C...6AFb at tx 0xdea0f837...12f222
Indexed Transactions
0
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