Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0x4b91dfa774ACde7Ed70e93a6438363FEAaA40F54
Balance 0 ETH
Nonce 1
Code Size 12572 bytes
Indexed Transactions 0
External Etherscan · Sourcify

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