Address Contract Verified
Address
0x4b91dfa774ACde7Ed70e93a6438363FEAaA40F54
Balance
0 ETH
Nonce
1
Code Size
12572 bytes
Creator
0x15862Da7...D53D at tx 0xaec4a623...cfb4bf
Indexed Transactions
0
Contract Bytecode
12572 bytes
0x60806040526004361061031e5760003560e01c806388d695b2116101ab578063c49b9a80116100f7578063e30c397811610095578063f0f165af1161006f578063f0f165af146109bc578063f2fde38b146109dc578063f4f492a4146109fc578063fb81062914610a1c57600080fd5b8063e30c397814610968578063ea2f0b3714610986578063ed0b1dad146109a657600080fd5b8063dc44b6a0116100d1578063dc44b6a0146108cc578063dd62ed3e146108e2578063e01af92c14610928578063e28a731d1461094857600080fd5b8063c49b9a801461086b578063cbecede01461088b578063d543dbeb146108ac57600080fd5b8063a457c2d711610164578063b489c5b11161013e578063b489c5b1146107cb578063c069d956146107eb578063c0d786551461081b578063c14a42391461083b57600080fd5b8063a457c2d714610775578063a9059cbb14610795578063b3f22ce3146107b557600080fd5b806388d695b2146106ab5780638da5cb5b146106cb57806395558d84146106e957806395d89b4114610709578063978e1cc814610735578063996c39851461075557600080fd5b806335e17cb91161026a5780635876ccc51161022357806379ba5097116101fd57806379ba50971461064a5780637d1db4a51461065f57806380f5818f1461067557806388790a681461069557600080fd5b80635876ccc5146105df57806370a08231146105ff578063715018a61461063557600080fd5b806335e17cb9146105065780633950935114610526578063437823ec1461054657806349bd5a5e146105665780634fab9edf146105865780635342acb4146105a657600080fd5b8063117da1ee116102d757806323b872dd116102b157806323b872dd146104905780632410d887146104b05780632d513f36146104d0578063313ce567146104ea57600080fd5b8063117da1ee146104185780631694505e1461043857806318160ddd1461047557600080fd5b8063068075971461032a57806306fdde031461034e5780630915de5c1461038f578063095ea7b3146103b157806309afb3ce146103e15780630c475c941461040257600080fd5b3661032557005b600080fd5b34801561033657600080fd5b50600f545b6040519081526020015b60405180910390f35b34801561035a57600080fd5b5060408051808201909152600f81526e0a6c2eccaa0d8c2dccae88ac2e4e8d608b1b60208201525b6040516103459190612b21565b34801561039b57600080fd5b506103af6103aa366004612b70565b610a3c565b005b3480156103bd57600080fd5b506103d16103cc366004612b9e565b610ad9565b6040519015158152602001610345565b3480156103ed57600080fd5b506011546103d190600160b01b900460ff1681565b34801561040e57600080fd5b5061033b600b5481565b34801561042457600080fd5b506103af610433366004612b70565b610af0565b34801561044457600080fd5b5060105461045d9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610345565b34801561048157600080fd5b50670de0b6b3a764000061033b565b34801561049c57600080fd5b506103d16104ab366004612bca565b610b65565b3480156104bc57600080fd5b506103af6104cb366004612c19565b610bb7565b3480156104dc57600080fd5b506010546103d19060ff1681565b3480156104f657600080fd5b5060405160098152602001610345565b34801561051257600080fd5b506103af610521366004612c52565b610cae565b34801561053257600080fd5b506103d1610541366004612b9e565b610dff565b34801561055257600080fd5b506103af610561366004612c94565b610e36565b34801561057257600080fd5b5060115461045d906001600160a01b031681565b34801561059257600080fd5b506103af6105a1366004612cb8565b610eb4565b3480156105b257600080fd5b506103d16105c1366004612c94565b6001600160a01b031660009081526004602052604090205460ff1690565b3480156105eb57600080fd5b506103af6105fa366004612b70565b610f1f565b34801561060b57600080fd5b5061033b61061a366004612c94565b6001600160a01b031660009081526002602052604090205490565b34801561064157600080fd5b506103af610fad565b34801561065657600080fd5b506103af610fe3565b34801561066b57600080fd5b5061033b60125481565b34801561068157600080fd5b506103af610690366004612b70565b611060565b3480156106a157600080fd5b5061033b600c5481565b3480156106b757600080fd5b506103af6106c6366004612d21565b6110ed565b3480156106d757600080fd5b506000546001600160a01b031661045d565b3480156106f557600080fd5b5060085461045d906001600160a01b031681565b34801561071557600080fd5b5060408051808201909152600381526253504560e81b6020820152610382565b34801561074157600080fd5b506103af610750366004612c19565b61118e565b34801561076157600080fd5b506103af610770366004612b70565b611278565b34801561078157600080fd5b506103d1610790366004612b9e565b611306565b3480156107a157600080fd5b506103d16107b0366004612b9e565b61133d565b3480156107c157600080fd5b5061033b60135481565b3480156107d757600080fd5b506103af6107e6366004612d8d565b61134a565b3480156107f757600080fd5b506103d1610806366004612c94565b60066020526000908152604090205460ff1681565b34801561082757600080fd5b506103af610836366004612c94565b611518565b34801561084757600080fd5b506103d1610856366004612c94565b60056020526000908152604090205460ff1681565b34801561087757600080fd5b506103af610886366004612cb8565b61154b565b34801561089757600080fd5b506011546103d190600160a81b900460ff1681565b3480156108b857600080fd5b506103af6108c7366004612b70565b6115c2565b3480156108d857600080fd5b5061033b600a5481565b3480156108ee57600080fd5b5061033b6108fd366004612db2565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b34801561093457600080fd5b506103af610943366004612cb8565b61163f565b34801561095457600080fd5b506103af610963366004612c94565b6116b6565b34801561097457600080fd5b506001546001600160a01b031661045d565b34801561099257600080fd5b506103af6109a1366004612c94565b611778565b3480156109b257600080fd5b5061033b60095481565b3480156109c857600080fd5b506103af6109d7366004612b70565b6117f3565b3480156109e857600080fd5b506103af6109f7366004612c94565b6118a2565b348015610a0857600080fd5b5060075461045d906001600160a01b031681565b348015610a2857600080fd5b506103af610a37366004612c94565b611935565b6000546001600160a01b03163314610a6f5760405162461bcd60e51b8152600401610a6690612de0565b60405180910390fd5b6009819055600a54606490610a849083612e2b565b1115610aa25760405162461bcd60e51b8152600401610a6690612e3e565b6040518181527f6c8b1a454aa876c702c30ac7b2e5dd3431345a1b627afd01ccd0f0f6df9c78f5906020015b60405180910390a150565b6000610ae63384846119f3565b5060015b92915050565b6000546001600160a01b03163314610b1a5760405162461bcd60e51b8152600401610a6690612de0565b611388811115610b605760405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b6044820152606401610a66565b600f55565b6000610b72848484611af0565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610bad918691610ba8908690612e6d565b6119f3565b5060019392505050565b6000546001600160a01b03163314610be15760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b038216610c4a5760405162461bcd60e51b815260206004820152602a60248201527f4572726f723a205061697220616464726573732063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610a66565b6001600160a01b038216600081815260056020908152604091829020805460ff19168515159081179091558251938452908301527f92d4086705a3958aa2cd18830ddaff7bb93db05b6818910190392a55047397ee91015b60405180910390a15050565b6000546001600160a01b03163314610cd85760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b038116610d385760405162461bcd60e51b815260206004820152602160248201527f4572726f723a207769746864726177616c20746f207a65726f206164647265736044820152607360f81b6064820152608401610a66565b60405163a9059cbb60e01b81526001600160a01b0382811660048301526024820184905284919082169063a9059cbb906044016020604051808303816000875af1158015610d8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dae9190612e80565b50604080516001600160a01b0386811682526020820186905284168183015290517f03e22ea144aa78f0a88a3bc6036c5f6d5bc2d276affbc5f88c38a9346c5b2eee9181900360600190a150505050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610ae6918590610ba8908690612e2b565b6000546001600160a01b03163314610e605760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b038116600081815260046020908152604091829020805460ff1916600117905590519182527f58c3e0504c69d3a92726966f152a771e0f8f6ad4daca1ae9055a38aba1fd2b629101610ace565b6000546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610a6690612de0565b6010805460ff19168215159081179091556040519081527f75b4185b2596596b18e7ded7eec3b258b81f659c5b4097d5023706248fb123e690602001610ace565b6000546001600160a01b03163314610f495760405162461bcd60e51b8152600401610a6690612de0565b600c819055600b54606490610f5f908390612e2b565b1115610f7d5760405162461bcd60e51b8152600401610a6690612e3e565b6040518181527f5b15ca41d7664fab2a7b033dfd5e4489e59a821f0b0a3d5703033abbeae3561a90602001610ace565b6000546001600160a01b03163314610fd75760405162461bcd60e51b8152600401610a6690612de0565b610fe16000611ea5565b565b60015433906001600160a01b03168114611054576000546001600160a01b038281169116146110545760405162461bcd60e51b815260206004820152601d60248201527f4f776e61626c653a20756e617574686f72697a6564206163636f756e740000006044820152606401610a66565b61105d81611ea5565b50565b6000546001600160a01b0316331461108a5760405162461bcd60e51b8152600401610a6690612de0565b600b819055600c5460649061109f9083612e2b565b11156110bd5760405162461bcd60e51b8152600401610a6690612e3e565b6040518181527f7f2ed68285c9b891e46182ee69d1e86477629130552c31d416b27c2ca30fd55d90602001610ace565b82811461112b5760405162461bcd60e51b815260206004820152600c60248201526b098cadc40dad2e6dac2e8c6d60a31b6044820152606401610a66565b60005b838110156111875761117f3386868481811061114c5761114c612e9d565b90506020020160208101906111619190612c94565b85858581811061117357611173612e9d565b90506020020135611af0565b60010161112e565b5050505050565b6000546001600160a01b031633146111b85760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b03821661121c5760405162461bcd60e51b815260206004820152602560248201527f4572726f723a20416464726573732063616e6e6f74206265207a65726f206164604482015264647265737360d81b6064820152608401610a66565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f80069036c5381e9b8bf3feeaddce86ce3886eaabaddb4b90926400a11ba6bd1a9101610ca2565b6000546001600160a01b031633146112a25760405162461bcd60e51b8152600401610a6690612de0565b600a8190556009546064906112b8908390612e2b565b11156112d65760405162461bcd60e51b8152600401610a6690612e3e565b6040518181527f7a5ac6708a2bf6569d722803b802884ce63f79adc3854f70962199dd82ebb2b690602001610ace565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610ae6918590610ba8908690612e6d565b6000610ae6338484611af0565b6000546001600160a01b031633146113745760405162461bcd60e51b8152600401610a6690612de0565b814710156113c45760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610a66565b6001600160a01b03811661142f5760405162461bcd60e51b815260206004820152602c60248201527f526563697069656e7420616464726573732063616e6e6f74206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610a66565b6000816001600160a01b03168360405160006040518083038185875af1925050503d806000811461147c576040519150601f19603f3d011682016040523d82523d6000602084013e611481565b606091505b50509050806114d25760405162461bcd60e51b815260206004820152601760248201527f4574686572207769746864726177616c206661696c65640000000000000000006044820152606401610a66565b604080518481526001600160a01b03841660208201527f1335dbbdb9b494b202125cf292465f26a3815684b44edcdda11abf30539486da910160405180910390a1505050565b6000546001600160a01b031633146115425760405162461bcd60e51b8152600401610a6690612de0565b61105d81611ebe565b6000546001600160a01b031633146115755760405162461bcd60e51b8152600401610a6690612de0565b60118054821515600160a81b0260ff60a81b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610ace90831515815260200190565b6000546001600160a01b031633146115ec5760405162461bcd60e51b8152600401610a6690612de0565b606461160082670de0b6b3a7640000612eb3565b61160a9190612eca565b60128190556040519081527f4a02caf9e7317d663463d3d976767ba90289279dd55c0a46f962536efc87a9a690602001610ace565b6000546001600160a01b031633146116695760405162461bcd60e51b8152600401610a6690612de0565b60118054821515600160b01b0260ff60b01b199091161790556040517f8bcc108c7d867d0a70433f71ecba3056c4dcc48eaabe4ca987f9fb1f836091d590610ace90831515815260200190565b6000546001600160a01b031633146116e05760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b03811661172a5760405162461bcd60e51b81526020600482015260116024820152705374616b696e672061646472207a65726f60781b6044820152606401610a66565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527f9b961d75830f7f5a44c773fb6b0fe3b7cba9475e6625cd3ad965464926253bbb90602001610ace565b6000546001600160a01b031633146117a25760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b038116600081815260046020908152604091829020805460ff1916905590519182527f4f6a6b6efe34ec6478021aa9fb7f6980e78ea3a10c74074a8ce49d5d3ebf1f7e9101610ace565b6000546001600160a01b0316331461181d5760405162461bcd60e51b8152600401610a6690612de0565b8060000361186d5760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a66565b60138190556040518181527fab1090599596cfb0c655b6424e552fba2cedf77457ed354fbe96e9abf4aa1f1390602001610ace565b6000546001600160a01b031633146118cc5760405162461bcd60e51b8152600401610a6690612de0565b600180546001600160a01b0383166001600160a01b031990911681179091556118fd6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b0316331461195f5760405162461bcd60e51b8152600401610a6690612de0565b6001600160a01b0381166119a55760405162461bcd60e51b815260206004820152600d60248201526c4c69712061646472207a65726f60981b6044820152606401610a66565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f6e9a0b8203652d5225235c014e4f37e3858eec49cf1711b07649267d6cab269690602001610ace565b6001600160a01b038316611a425760405162461bcd60e51b815260206004820152601660248201527520b8383937bb3290333937b6903d32b9379030b2323960511b6044820152606401610a66565b6001600160a01b038216611a8f5760405162461bcd60e51b815260206004820152601460248201527320b8383937bb32903a37903d32b9379030b2323960611b6044820152606401610a66565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611b1757604051633efa09af60e01b815260040160405180910390fd5b6001600160a01b038216611b3e57604051633efa09af60e01b815260040160405180910390fd5b80600003611b5f576040516303cf4c2b60e31b815260040160405180910390fd5b6000546001600160a01b03848116911614801590611b8b57506000546001600160a01b03838116911614155b8015611b98575060125481115b15611bb6576040516303cf4c2b60e31b815260040160405180910390fd5b601154600160b01b900460ff16158015611c0a57506001600160a01b03821660009081526005602052604090205460ff1680611c0a57506001600160a01b03831660009081526005602052604090205460ff165b15611c285760405163a24e573d60e01b815260040160405180910390fd5b6001600160a01b03831660009081526006602052604090205460ff1680611c6757506001600160a01b03821660009081526006602052604090205460ff165b15611c8557604051634c3852a160e11b815260040160405180910390fd5b306000908152600260205260409020546012548110611ca357506012545b60135481108015908190611cc15750601154600160a01b900460ff16155b8015611ce557506001600160a01b03841660009081526005602052604090205460ff165b8015611cfa5750601154600160a81b900460ff165b8015611d1f57506001600160a01b03851660009081526004602052604090205460ff16155b15611d32576013549150611d32826121fc565b6001600160a01b03851660009081526005602052604090205460019060ff16158015611d7757506001600160a01b03851660009081526005602052604090205460ff16155b15611d80575060005b60105460ff16611d8e575060005b60105460ff168015611dbc57506001600160a01b0386163b151580611dbc57506001600160a01b0385163b15155b15611dc5575060015b6001600160a01b03861660009081526004602052604090205460ff1680611e0457506001600160a01b03851660009081526004602052604090205460ff165b15611e0d575060005b6001600160a01b03861660009081526005602052604090205460ff1680611e3d57506001600160a01b0386163b15155b15611e4f57600954600d55600a54600e555b6001600160a01b03851660009081526005602052604090205460ff1680611e7f57506001600160a01b0385163b15155b15611e9157600b54600d55600c54600e555b611e9d86868684612299565b505050505050565b600180546001600160a01b031916905561105d816122be565b6000819050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f259190612eec565b6001600160a01b031663e6a4390530836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f969190612eec565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015611fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120059190612eec565b601180546001600160a01b0319166001600160a01b0392909216918217905561218d57806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612066573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208a9190612eec565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120fb9190612eec565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015612148573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216c9190612eec565b601180546001600160a01b0319166001600160a01b03929092169190911790555b601080546001600160a01b0380841661010002610100600160a81b0319909216919091179091556011546121c391166001610bb7565b6040516001600160a01b03831681527fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d1590602001610ca2565b6011805460ff60a01b1916600160a01b179055600181901c60006122208284612e6d565b90504761222c8361230e565b60006122388247612e6d565b90506122448382612719565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150506011805460ff60a01b19169055505050565b806122ad576122ad6000600d819055600e55565b6122b8848484612862565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061234357612343612e9d565b60200260200101906001600160a01b031690816001600160a01b031681525050601060019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123da9190612eec565b816001815181106123ed576123ed612e9d565b6001600160a01b03928316602091820292909201015260105460405163d06ca61f60e01b81526000926101009092049091169063d06ca61f906124369086908690600401612f64565b600060405180830381865afa158015612453573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261247b9190810190612f85565b90506000612710600f546127106124929190612e6d565b836001815181106124a5576124a5612e9d565b60200260200101516124b79190612eb3565b6124c19190612eca565b90506124e330601060019054906101000a90046001600160a01b0316866119f3565b60105460405163791ac94760e01b81526101009091046001600160a01b03169063791ac9479061251f9087908590889030904290600401613043565b600060405180830381600087803b15801561253957600080fd5b505af115801561254d573d6000803e3d6000fd5b505050506000601060019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ca9190612eec565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612610573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612634919061307f565b9050801561118757601060019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561268f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b39190612eec565b6001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b81526004016126e091815260200190565b600060405180830381600087803b1580156126fa57600080fd5b505af115801561270e573d6000803e3d6000fd5b505050505050505050565b60105461273690309061010090046001600160a01b0316846119f3565b6000612710600f5461271061274b9190612e6d565b6127559085612eb3565b61275f9190612eca565b90506000612710600f546127106127769190612e6d565b6127809085612eb3565b61278a9190612eca565b60105460085460405163f305d71960e01b81523060048201526024810188905260448101869052606481018490526001600160a01b0391821660848201524260a4820152929350610100909104169063f305d71990859060c40160606040518083038185885af1158015612802573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128279190613098565b50506011546040518681526001600160a01b03909116915030906000805160206130c78339815191529060200160405180910390a350505050565b6001600160a01b0383166000908152600260205260409020548111156128c15760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610a66565b60006128cc82612a1c565b905060006128d983612a39565b9050826128e68284612e2b565b11156129345760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206665652063616c63756c6174696f6e0000000000000000006044820152606401610a66565b6000816129418486612e6d565b61294b9190612e6d565b6001600160a01b038716600090815260026020526040902054909150612972908590612e6d565b6001600160a01b0380881660009081526002602052604080822093909355908716815220546129a2908290612e2b565b6001600160a01b03861660009081526002602052604090205581156129ca576129ca82612a4c565b82156129d9576129d983612aae565b846001600160a01b0316866001600160a01b03166000805160206130c783398151915283604051612a0c91815260200190565b60405180910390a3505050505050565b60006103e8600d5483612a2f9190612eb3565b610aea9190612eca565b60006103e8600e5483612a2f9190612eb3565b801561105d5730600090815260026020526040902054612a6d908290612e2b565b306000818152600260205260409081902092909255905133906000805160206130c783398151915290612aa39085815260200190565b60405180910390a350565b801561105d576007546001600160a01b0316600090815260026020526040902054612ada908290612e2b565b600780546001600160a01b03908116600090815260026020908152604091829020949094559154915184815291169133916000805160206130c78339815191529101612aa3565b60006020808352835180602085015260005b81811015612b4f57858101830151858201604001528201612b33565b506000604082860101526040601f19601f8301168501019250505092915050565b600060208284031215612b8257600080fd5b5035919050565b6001600160a01b038116811461105d57600080fd5b60008060408385031215612bb157600080fd5b8235612bbc81612b89565b946020939093013593505050565b600080600060608486031215612bdf57600080fd5b8335612bea81612b89565b92506020840135612bfa81612b89565b929592945050506040919091013590565b801515811461105d57600080fd5b60008060408385031215612c2c57600080fd5b8235612c3781612b89565b91506020830135612c4781612c0b565b809150509250929050565b600080600060608486031215612c6757600080fd5b8335612c7281612b89565b9250602084013591506040840135612c8981612b89565b809150509250925092565b600060208284031215612ca657600080fd5b8135612cb181612b89565b9392505050565b600060208284031215612cca57600080fd5b8135612cb181612c0b565b60008083601f840112612ce757600080fd5b50813567ffffffffffffffff811115612cff57600080fd5b6020830191508360208260051b8501011115612d1a57600080fd5b9250929050565b60008060008060408587031215612d3757600080fd5b843567ffffffffffffffff80821115612d4f57600080fd5b612d5b88838901612cd5565b90965094506020870135915080821115612d7457600080fd5b50612d8187828801612cd5565b95989497509550505050565b60008060408385031215612da057600080fd5b823591506020830135612c4781612b89565b60008060408385031215612dc557600080fd5b8235612dd081612b89565b91506020830135612c4781612b89565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610aea57610aea612e15565b602080825260159082015274546f74616c2066656573206578636565642031302560581b604082015260600190565b81810381811115610aea57610aea612e15565b600060208284031215612e9257600080fd5b8151612cb181612c0b565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610aea57610aea612e15565b600082612ee757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612efe57600080fd5b8151612cb181612b89565b634e487b7160e01b600052604160045260246000fd5b60008151808452602080850194506020840160005b83811015612f595781516001600160a01b031687529582019590820190600101612f34565b509495945050505050565b828152604060208201526000612f7d6040830184612f1f565b949350505050565b60006020808385031215612f9857600080fd5b825167ffffffffffffffff80821115612fb057600080fd5b818501915085601f830112612fc457600080fd5b815181811115612fd657612fd6612f09565b8060051b604051601f19603f83011681018181108582111715612ffb57612ffb612f09565b60405291825284820192508381018501918883111561301957600080fd5b938501935b828510156130375784518452938501939285019261301e565b98975050505050505050565b85815284602082015260a06040820152600061306260a0830186612f1f565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561309157600080fd5b5051919050565b6000806000606084860312156130ad57600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f4640a567691585ade4b672e38d860e4272fadf326e3730d81e5545200d6759f64736f6c63430008190033
Verified Source Code Full Match
Compiler: v0.8.25+commit.b61c2a91
EVM: london
Optimization: Yes (200 runs)
Address.sol 216 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
Context.sol 23 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
IERC20.sol 81 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
Ownable.sol 75 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
Ownable2Step.sol 67 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)
pragma solidity 0.8.25;
import {Ownable} from "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This extension of the {Ownable} contract includes a two-step mechanism to transfer
* ownership, where the new owner must call {acceptOwnership} in order to replace the
* old one. This can help prevent common mistakes, such as transfers of ownership to
* incorrect accounts, or to contracts that are unable to interact with the
* permission system.
*
* The initial owner is specified at deployment time in the constructor for `Ownable`. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*
* Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
if (pendingOwner() != sender) {
require(sender == owner(), "Ownable: unauthorized account");
}
_transferOwnership(sender);
}
}
SPE.sol 695 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.25;
import "./IERC20.sol";
import "./Ownable2Step.sol";
import "./Address.sol";
import "./Context.sol";
// IWETH interface to interact with the WETH contract
interface IWETH {
function withdraw(uint) external;
}
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contract SavePlanetEarth is Context, IERC20, Ownable2Step {
using Address for address;
mapping (address => uint256) private _tOwned;
mapping (address => mapping (address => uint256)) private _allowances;
mapping (address => bool) private _isExcludedFromFee;
mapping (address => bool) public _isPair;
mapping (address => bool) public _isBanned;
uint256 private constant _tTotal = 1e9 * 10**9;
string private constant _name = "SavePlanetEarth";
string private constant _symbol = "SPE";
uint8 private constant _decimals = 9;
address public _stakingRewardsWalletAddress;
address public _liqWalletAddress;
uint256 public _buyStakingRewardsFee = 10;
uint256 public _buyLiquidityFee = 10;
uint256 public _sellStakingRewardsFee = 10;
uint256 public _sellLiquidityFee = 10;
uint256 private _stakingRewardsFee;
uint256 private _liquidityFee;
uint256 private _slippageTolerance = 0;
bool public _contractFeesEnabled = true;
IUniswapV2Router02 public uniswapV2Router;
address public uniswapV2Pair;
bool private _inSwapAndLiquify;
bool public _swapAndLiquifyEnabled = true;
bool public _swapEnabled = true;
uint256 public _maxTxAmount = _tTotal;
uint256 public _numTokensSellToAddToLiquidity = 1e5 * 10**9;
event SwapAndLiquifyEnabledUpdated(bool enabled);
event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity);
event NumTokensSellToAddToLiquidityUpdated(uint256 numTokensSellToAddToLiquidity);
event SetContractFeesEnabled(bool _bool);
event RouterSet(address _router);
event SetIsPair(address _address, bool _bool);
event SetIsBanned(address _address, bool _bool);
event SetSwapEnabled(bool enabled);
event SetStakingRewardsWalletAddress(address _address);
event SetLiqWalletAddress(address _address);
event WithdrawalEther(uint256 _amount, address to);
event WithdrawalToken(address _tokenAddr, uint256 _amount, address to);
event ExcludeFromFee(address account);
event IncludeInFee(address account);
event SetBuyStakingRewardsFee(uint256 fee);
event SetBuyLiquidityFee(uint256 fee);
event SetSellStakingRewardsFee(uint256 fee);
event SetSellLiquidityFee(uint256 fee);
event SetMaxTxAmount(uint256 maxTxAmount);
event FeesRemoved();
// Custom Errors
error ZeroAddressError();
error TransferAmountExceedsMaxTx();
error TransferDisabled();
error AddressBanned();
modifier _lockTheSwap {
_inSwapAndLiquify = true;
_;
_inSwapAndLiquify = false;
}
constructor(address router, address stakingRewardsWallet, address liqWallet) {
require(stakingRewardsWallet != address(0), "Error: stakingRewardsWallet address cannot be zero address");
require(liqWallet != address(0), "Error: liqWallet address cannot be zero address");
_tOwned[owner()] = _tTotal;
_setRouter(router);
_stakingRewardsWalletAddress = stakingRewardsWallet;
_liqWalletAddress = liqWallet;
_isExcludedFromFee[owner()] = true;
_isExcludedFromFee[stakingRewardsWallet] = true;
_isExcludedFromFee[liqWallet] = true;
_isExcludedFromFee[address(this)] = true;
emit Transfer(address(0), owner(), _tTotal);
}
function name() external pure returns (string memory) {
return _name;
}
function symbol() external pure returns (string memory) {
return _symbol;
}
function decimals() external pure returns (uint8) {
return _decimals;
}
function totalSupply() external pure override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
return _tOwned[account];
}
function transfer(address recipient, uint256 amount) external override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) external view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) external override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()] - amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] - subtractedValue);
return true;
}
function setSlippageTolerance(uint256 newTolerance) external onlyOwner {
require(newTolerance <= 5000, "Slippage too high");
_slippageTolerance = newTolerance;
}
function getSlippageTolerance() external view returns (uint256) {
return _slippageTolerance;
}
function excludeFromFee(address account) external onlyOwner {
_isExcludedFromFee[account] = true;
emit ExcludeFromFee(account);
}
function includeInFee(address account) external onlyOwner {
_isExcludedFromFee[account] = false;
emit IncludeInFee(account);
}
function setBuyStakingRewardsFeePercent(uint256 stakingRewardsFee) external onlyOwner() {
_buyStakingRewardsFee = stakingRewardsFee;
require(_buyStakingRewardsFee + _buyLiquidityFee <= 100, "Total fees exceed 10%");
emit SetBuyStakingRewardsFee(stakingRewardsFee);
}
function setBuyLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
_buyLiquidityFee = liquidityFee;
require(_buyStakingRewardsFee + _buyLiquidityFee <= 100, "Total fees exceed 10%");
emit SetBuyLiquidityFee(liquidityFee);
}
function setSellStakingRewardsFeePercent(uint256 stakingRewardsFee) external onlyOwner() {
_sellStakingRewardsFee = stakingRewardsFee;
require(_sellStakingRewardsFee + _sellLiquidityFee <= 100, "Total fees exceed 10%");
emit SetSellStakingRewardsFee(stakingRewardsFee);
}
function setSellLiquidityFeePercent(uint256 liquidityFee) external onlyOwner() {
_sellLiquidityFee = liquidityFee;
require(_sellStakingRewardsFee + _sellLiquidityFee <= 100, "Total fees exceed 10%");
emit SetSellLiquidityFee(liquidityFee);
}
function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
_maxTxAmount = _tTotal * maxTxPercent / 100;
emit SetMaxTxAmount(_maxTxAmount);
}
function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner() {
_swapAndLiquifyEnabled = _enabled;
emit SwapAndLiquifyEnabledUpdated(_enabled);
}
function setSwapEnabled(bool _enabled) external onlyOwner() {
_swapEnabled = _enabled;
emit SetSwapEnabled(_enabled);
}
function setStakingRewardsWalletAddress(address _address) external onlyOwner() {
require(_address != address(0), "Staking addr zero");
_stakingRewardsWalletAddress = _address;
emit SetStakingRewardsWalletAddress(_address);
}
function setLiqWalletAddress(address _address) external onlyOwner() {
require(_address != address(0), "Liq addr zero");
_liqWalletAddress = _address;
emit SetLiqWalletAddress(_address);
}
function setNumTokensSellToAddToLiquidity(uint256 _amount) external onlyOwner() {
require(_amount != 0, "Amount must be greater than zero");
_numTokensSellToAddToLiquidity = _amount;
emit NumTokensSellToAddToLiquidityUpdated(_amount);
}
function setContractFeesEnabled(bool _bool) external onlyOwner() {
_contractFeesEnabled = _bool;
emit SetContractFeesEnabled(_bool);
}
function _setRouter(address _router) private {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(_router);
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(address(this), _uniswapV2Router.WETH());
if(uniswapV2Pair == address(0))
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
setIsPair(uniswapV2Pair, true);
emit RouterSet(_router);
}
function setRouter(address _router) external onlyOwner() {
_setRouter(_router);
}
receive() external payable {}
function _approve(address owner, address spender, uint256 amount) private {
require(owner != address(0), "Approve from zero addr");
require(spender != address(0), "Approve to zero addr");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _transfer(
address from,
address to,
uint256 amount
) private {
if (from == address(0)) revert ZeroAddressError();
if (to == address(0)) revert ZeroAddressError();
if (amount == 0) revert TransferAmountExceedsMaxTx();
if (from != owner() && to != owner() && amount > _maxTxAmount) {
revert TransferAmountExceedsMaxTx();
}
if (!_swapEnabled && (_isPair[to] || _isPair[from])) {
revert TransferDisabled();
}
if (_isBanned[from] || _isBanned[to]) {
revert AddressBanned();
}
uint256 contractTokenBalance = balanceOf(address(this));
if (contractTokenBalance >= _maxTxAmount) {
contractTokenBalance = _maxTxAmount;
}
bool overMinTokenBalance = contractTokenBalance >= _numTokensSellToAddToLiquidity;
if (
overMinTokenBalance &&
!_inSwapAndLiquify &&
_isPair[to] &&
_swapAndLiquifyEnabled &&
!_isExcludedFromFee[from]
) {
contractTokenBalance = _numTokensSellToAddToLiquidity;
_swapAndLiquify(contractTokenBalance);
}
bool takeFee = true;
if (!_isPair[from] && !_isPair[to]) {
takeFee = false;
}
if (!_contractFeesEnabled) {
takeFee = false;
}
if (_contractFeesEnabled && (from.isContract() || to.isContract())) {
takeFee = true;
}
if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
takeFee = false;
}
if (_isPair[from] || from.isContract()) {
_stakingRewardsFee = _buyStakingRewardsFee;
_liquidityFee = _buyLiquidityFee;
}
if (_isPair[to] || to.isContract()) {
_stakingRewardsFee = _sellStakingRewardsFee;
_liquidityFee = _sellLiquidityFee;
}
_tokenTransfer(from, to, amount, takeFee);
}
function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external {
require(recipients.length == amounts.length, "Len mismatch");
for (uint256 i = 0; i < recipients.length; ++i) { // Change i++ to ++i
_transfer(_msgSender(), recipients[i], amounts[i]);
}
}
function _swapAndLiquify(uint256 contractTokenBalance) private _lockTheSwap {
uint256 half = contractTokenBalance >> 1;
uint256 otherHalf = contractTokenBalance - half;
uint256 initialBalance = address(this).balance;
_swapTokensForEth(half);
uint256 newBalance = address(this).balance - initialBalance;
_addLiquidity(otherHalf, newBalance);
emit SwapAndLiquify(half, newBalance, otherHalf);
}
function _swapTokensForEth(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this); // Token (SPE)
path[1] = uniswapV2Router.WETH(); // WETH
// Calculate minimum ETH output based on the adjustable slippage tolerance
uint256[] memory amountsOut = uniswapV2Router.getAmountsOut(tokenAmount, path);
uint256 amountOutMin = (amountsOut[1] * (10000 - _slippageTolerance)) / 10000;
_approve(address(this), address(uniswapV2Router), tokenAmount);
// Perform the swap with the calculated amountOutMin
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
amountOutMin,
path,
address(this),
block.timestamp
);
// Unwrap WETH to ETH if any WETH was received
uint256 wethBalance = IERC20(uniswapV2Router.WETH()).balanceOf(address(this));
if (wethBalance > 0) {
IWETH(uniswapV2Router.WETH()).withdraw(wethBalance);
}
}
function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
_approve(address(this), address(uniswapV2Router), tokenAmount);
// Calculate minimum amounts for tokens and ETH with slippage tolerance
uint256 tokenAmountMin = (tokenAmount * (10000 - _slippageTolerance)) / 10000;
uint256 ethAmountMin = (ethAmount * (10000 - _slippageTolerance)) / 10000;
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
tokenAmountMin, // Minimum token amount with slippage applied
ethAmountMin, // Minimum ETH amount with slippage applied
_liqWalletAddress,
block.timestamp
);
emit Transfer(address(this), uniswapV2Pair, tokenAmount);
}
function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
if(!takeFee)
_removeAllFee();
_transferStandard(sender, recipient, amount);
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
require(_tOwned[sender] >= tAmount, "Insufficient balance");
uint256 tStakingRewards = _calculateStakingRewardsFee(tAmount);
uint256 tLiquidity = _calculateLiquidityFee(tAmount);
require(tStakingRewards + tLiquidity <= tAmount, "Invalid fee calculation");
uint256 tTransferAmount = tAmount - tStakingRewards - tLiquidity;
_tOwned[sender] = _tOwned[sender] - tAmount;
_tOwned[recipient] = _tOwned[recipient] + tTransferAmount;
if (tLiquidity > 0) {
_takeLiquidity(tLiquidity);
}
if (tStakingRewards > 0) {
_takeStakingRewards(tStakingRewards);
}
emit Transfer(sender, recipient, tTransferAmount);
}
function _takeLiquidity(uint256 tLiquidity) private {
if (tLiquidity != 0) {
_tOwned[address(this)] = _tOwned[address(this)] + tLiquidity;
emit Transfer(msg.sender, address(this), tLiquidity);
}
}
function _takeStakingRewards(uint256 tStakingRewards) private {
if (tStakingRewards != 0) {
_tOwned[_stakingRewardsWalletAddress] = _tOwned[_stakingRewardsWalletAddress] + tStakingRewards;
emit Transfer(msg.sender, _stakingRewardsWalletAddress, tStakingRewards);
}
}
function _calculateStakingRewardsFee(uint256 _amount) private view returns (uint256) {
return _amount * _stakingRewardsFee / 1000;
}
function _calculateLiquidityFee(uint256 _amount) private view returns (uint256) {
return _amount * _liquidityFee / 1000;
}
function _removeAllFee() private {
_stakingRewardsFee = 0;
_liquidityFee = 0;
}
function isExcludedFromFee(address account) external view returns(bool) {
return _isExcludedFromFee[account];
}
function setIsPair(address _address, bool value) public onlyOwner() {
require(_address != address(0), "Error: Pair address cannot be zero address");
_isPair[_address] = value;
emit SetIsPair(_address, value);
}
function setIsBanned(address _address, bool value) external onlyOwner() {
require(_address != address(0), "Error: Address cannot be zero address");
_isBanned[_address] = value;
emit SetIsBanned(_address, value);
}
function withdrawalToken(address _tokenAddr, uint _amount, address to) external onlyOwner() {
require(to != address(0), "Error: withdrawal to zero address");
IERC20 token = IERC20(_tokenAddr);
token.transfer(to, _amount);
emit WithdrawalToken(_tokenAddr, _amount, to);
}
function withdrawalEther(uint _amount, address to) external onlyOwner() {
require(address(this).balance >= _amount, "Insufficient contract balance");
require(to != address(0), "Recipient address cannot be the zero address");
(bool success, ) = to.call{value: _amount}("");
require(success, "Ether withdrawal failed");
emit WithdrawalEther(_amount, to);
}
}
Read Contract
_buyLiquidityFee 0xdc44b6a0 → uint256
_buyStakingRewardsFee 0xed0b1dad → uint256
_contractFeesEnabled 0x2d513f36 → bool
_isBanned 0xc069d956 → bool
_isPair 0xc14a4239 → bool
_liqWalletAddress 0x95558d84 → address
_maxTxAmount 0x7d1db4a5 → uint256
_numTokensSellToAddToLiquidity 0xb3f22ce3 → uint256
_sellLiquidityFee 0x88790a68 → uint256
_sellStakingRewardsFee 0x0c475c94 → uint256
_stakingRewardsWalletAddress 0xf4f492a4 → address
_swapAndLiquifyEnabled 0xcbecede0 → bool
_swapEnabled 0x09afb3ce → bool
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
getSlippageTolerance 0x06807597 → uint256
isExcludedFromFee 0x5342acb4 → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
pendingOwner 0xe30c3978 → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
Write Contract 28 functions
These functions modify contract state and require a wallet transaction to execute.
acceptOwnership 0x79ba5097
No parameters
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
batchTransfer 0x88d695b2
address[] recipients
uint256[] amounts
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
excludeFromFee 0x437823ec
address account
includeInFee 0xea2f0b37
address account
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
setBuyLiquidityFeePercent 0x996c3985
uint256 liquidityFee
setBuyStakingRewardsFeePercent 0x0915de5c
uint256 stakingRewardsFee
setContractFeesEnabled 0x4fab9edf
bool _bool
setIsBanned 0x978e1cc8
address _address
bool value
setIsPair 0x2410d887
address _address
bool value
setLiqWalletAddress 0xfb810629
address _address
setMaxTxPercent 0xd543dbeb
uint256 maxTxPercent
setNumTokensSellToAddToLiquidity 0xf0f165af
uint256 _amount
setRouter 0xc0d78655
address _router
setSellLiquidityFeePercent 0x5876ccc5
uint256 liquidityFee
setSellStakingRewardsFeePercent 0x80f5818f
uint256 stakingRewardsFee
setSlippageTolerance 0x117da1ee
uint256 newTolerance
setStakingRewardsWalletAddress 0xe28a731d
address _address
setSwapAndLiquifyEnabled 0xc49b9a80
bool _enabled
setSwapEnabled 0xe01af92c
bool _enabled
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
withdrawalEther 0xb489c5b1
uint256 _amount
address to
withdrawalToken 0x35e17cb9
address _tokenAddr
uint256 _amount
address to
Recent Transactions
No transactions found for this address