Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x69119d3BC1277efb4200c12082F46E596FDF9d39
Balance 0 ETH
Nonce 1
Code Size 20818 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

20818 bytes
0x608060405260043610610228575f3560e01c806370a0823111610122578063b220aae1116100aa578063dd62ed3e1161006e578063dd62ed3e1461082b578063e1b2cfb614610867578063ea2f0b3714610891578063eef63f1f146108b9578063f2fde38b146108e15761022f565b8063b220aae11461075f578063b4e1e6ad14610787578063bbae8086146107b1578063d621e813146107d9578063d7d7442f146108035761022f565b80638f70ccf7116100f15780638f70ccf71461066b57806395d89b4114610693578063a457c2d7146106bd578063a9059cbb146106f9578063a9e75723146107355761022f565b806370a08231146105b3578063715018a6146105ef57806388f82020146106055780638da5cb5b146106415761022f565b8063313ce567116101b0578063437823ec11610174578063437823ec146104c15780634549b039146104e957806349bd5a5e1461052557806352390c021461054f5780635342acb4146105775761022f565b8063313ce567146103e15780633685d4191461040b57806339509351146104335780633ae2f3541461046f5780633bd5d173146104995761022f565b80631694505e116101f75780631694505e146102ed57806318160ddd146103175780631978c0b31461034157806323b872dd146103695780632d838119146103a55761022f565b806302d454571461023357806306fdde031461025d578063095ea7b31461028757806313114a9d146102c35761022f565b3661022f57005b5f80fd5b34801561023e575f80fd5b50610247610909565b6040516102549190613e69565b60405180910390f35b348015610268575f80fd5b5061027161092d565b60405161027e9190613ef2565b60405180910390f35b348015610292575f80fd5b506102ad60048036038101906102a89190613f80565b61096a565b6040516102ba9190613fd8565b60405180910390f35b3480156102ce575f80fd5b506102d7610987565b6040516102e49190614000565b60405180910390f35b3480156102f8575f80fd5b50610301610990565b60405161030e9190614074565b60405180910390f35b348015610322575f80fd5b5061032b6109b4565b6040516103389190614000565b60405180910390f35b34801561034c575f80fd5b506103676004803603810190610362919061408d565b6109bd565b005b348015610374575f80fd5b5061038f600480360381019061038a91906140b8565b610ae1565b60405161039c9190613fd8565b60405180910390f35b3480156103b0575f80fd5b506103cb60048036038101906103c6919061408d565b610b94565b6040516103d89190614000565b60405180910390f35b3480156103ec575f80fd5b506103f5610bf9565b6040516104029190614123565b60405180910390f35b348015610416575f80fd5b50610431600480360381019061042c919061413c565b610c01565b005b34801561043e575f80fd5b5061045960048036038101906104549190613f80565b610f68565b6040516104669190613fd8565b60405180910390f35b34801561047a575f80fd5b5061048361100f565b6040516104909190614000565b60405180910390f35b3480156104a4575f80fd5b506104bf60048036038101906104ba919061408d565b611015565b005b3480156104cc575f80fd5b506104e760048036038101906104e2919061413c565b61116e565b005b3480156104f4575f80fd5b5061050f600480360381019061050a9190614191565b61131b565b60405161051c9190614000565b60405180910390f35b348015610530575f80fd5b50610539611394565b6040516105469190613e69565b60405180910390f35b34801561055a575f80fd5b506105756004803603810190610570919061413c565b6113b8565b005b348015610582575f80fd5b5061059d6004803603810190610598919061413c565b611692565b6040516105aa9190613fd8565b60405180910390f35b3480156105be575f80fd5b506105d960048036038101906105d4919061413c565b6116af565b6040516105e69190614000565b60405180910390f35b3480156105fa575f80fd5b50610603611792565b005b348015610610575f80fd5b5061062b6004803603810190610626919061413c565b6118e0565b6040516106389190613fd8565b60405180910390f35b34801561064c575f80fd5b50610655611932565b6040516106629190613e69565b60405180910390f35b348015610676575f80fd5b50610691600480360381019061068c91906141cf565b611959565b005b34801561069e575f80fd5b506106a7611aa5565b6040516106b49190613ef2565b60405180910390f35b3480156106c8575f80fd5b506106e360048036038101906106de9190613f80565b611ae2565b6040516106f09190613fd8565b60405180910390f35b348015610704575f80fd5b5061071f600480360381019061071a9190613f80565b611b89565b60405161072c9190613fd8565b60405180910390f35b348015610740575f80fd5b50610749611ba6565b6040516107569190614000565b60405180910390f35b34801561076a575f80fd5b506107856004803603810190610780919061408d565b611bac565b005b348015610792575f80fd5b5061079b611cc7565b6040516107a89190613e69565b60405180910390f35b3480156107bc575f80fd5b506107d760048036038101906107d2919061408d565b611cec565b005b3480156107e4575f80fd5b506107ed611e07565b6040516107fa9190613fd8565b60405180910390f35b34801561080e575f80fd5b506108296004803603810190610824919061408d565b611e1a565b005b348015610836575f80fd5b50610851600480360381019061084c91906141fa565b611f47565b60405161085e9190614000565b60405180910390f35b348015610872575f80fd5b5061087b611fc9565b6040516108889190614000565b60405180910390f35b34801561089c575f80fd5b506108b760048036038101906108b2919061413c565b611fcf565b005b3480156108c4575f80fd5b506108df60048036038101906108da919061413c565b61217a565b005b3480156108ec575f80fd5b506109076004803603810190610902919061413c565b6122f6565b005b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b60606040518060400160405280600581526020017f36454e5345000000000000000000000000000000000000000000000000000000815250905090565b5f61097d6109766124b3565b84846124ba565b6001905092915050565b5f600a54905090565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600854905090565b6109c56124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4890614282565b60405180910390fd5b6969e10de76676d0800000811015610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614310565b60405180910390fd5b806011819055507f44d540c6079791f805bc9b5d5a643dbf1f545ec260212b2b2478ef9d9ed0768e601154604051610ad69190614000565b60405180910390a150565b5f610aed84848461267d565b610b8984610af96124b3565b8460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610b406124b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610b84919061435b565b6124ba565b600190509392505050565b5f600954821115610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906143fe565b60405180910390fd5b5f610be3612a07565b90508083610bf19190614449565b915050919050565b5f6012905090565b610c096124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90614282565b60405180910390fd5b60065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d15906144c3565b60405180910390fd5b5f5b600780549050811015610f2d578173ffffffffffffffffffffffffffffffffffffffff1660078281548110610d5857610d576144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f205760076001600780549050610daf919061435b565b81548110610dc057610dbf6144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660078281548110610dfc57610dfb6144e1565b5b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f60065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506007805480610ee957610ee861450e565b5b600190038181905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055610f2d565b8080600101915050610d20565b507f47ab6b2d1f416edec684889dc42cd04ed7cc6c6244edaa04c4215e107754861481604051610f5d9190613e69565b60405180910390a150565b5f611005610f746124b3565b848460045f610f816124b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611000919061453b565b6124ba565b6001905092915050565b600f5481565b5f61101e6124b3565b905060065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156110aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a1906145de565b60405180910390fd5b5f6110b483612a29565b5090508060025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611100919061435b565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060095461114f919061435b565b60098190555082600a54611163919061453b565b600a81905550505050565b6111766124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611202576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f990614282565b60405180910390fd5b60055f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614646565b60405180910390fd5b600160055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff1d6512ec7550bf605a5a38910e48fb6a57938ed74a5afa01753fa023001005c816040516113109190613e69565b60405180910390a150565b5f600854831115611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906146ae565b60405180910390fd5b8161137c575f61137084612a29565b5090508091505061138e565b5f61138684612a29565b915050809150505b92915050565b7f000000000000000000000000b8edb72a75ef76bc60ff4d5da124cf118a1ed8b081565b6113c06124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461144c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144390614282565b60405180910390fd5b60065f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156114d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cd90614716565b60405180910390fd5b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156115a35761156160025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610b94565b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b600160065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600781908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f110b1fbed46dec7bc9019c3fba97541a3d64821a824872bb7b2ad678490855bf816040516116879190613e69565b60405180910390a150565b6005602052805f5260405f205f915054906101000a900460ff1681565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156117445760035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905061178d565b61178a60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610b94565b90505b919050565b61179a6124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d90614282565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119616124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e490614282565b60405180910390fd5b801515600b60019054906101000a900460ff16151503611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a39906147a4565b60405180910390fd5b80600b60016101000a81548160ff0219169083151502179055507f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e735600b60019054906101000a900460ff16604051611a9a9190613fd8565b60405180910390a150565b60606040518060400160405280600381526020017f364f530000000000000000000000000000000000000000000000000000000000815250905090565b5f611b7f611aee6124b3565b848460045f611afb6124b3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054611b7a919061435b565b6124ba565b6001905092915050565b5f611b9c611b956124b3565b848461267d565b6001905092915050565b60115481565b611bb46124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3790614282565b60405180910390fd5b6006811115611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b90614832565b60405180910390fd5b806010819055507fa815c78ebc61f51da32266e7b03d1f5bddd25a61e988127ea02e702754a25ece601054604051611cbc9190614000565b60405180910390a150565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf46124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790614282565b60405180910390fd5b6006811115611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb906148c0565b60405180910390fd5b80600f819055507ff2e8ba611224a81bdb301fbf10ccdc28d0d972efd159b4eb954d7939c2657fbd600f54604051611dfc9190614000565b60405180910390a150565b600b60019054906101000a900460ff1681565b611e226124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea590614282565b60405180910390fd5b5f81118015611ec757506969e10de76676d08000008111155b611f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efd9061494e565b60405180910390fd5b80600c819055507fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe17181604051611f3c9190614000565b60405180910390a150565b5f60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60105481565b611fd76124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205a90614282565b60405180910390fd5b60055f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906149b6565b60405180910390fd5b5f60055f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507f78ce087db51d01d3e32355f2d83455d5a39f99194c8d3d1c2614893695cee4428160405161216f9190613e69565b60405180910390a150565b6121826124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461220e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220590614282565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361227c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227390614a1e565b60405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f410c5b0c182205a95058d14406d0ee4155a6307bfe9db934608043b307188f8e816040516122eb9190613e69565b60405180910390a150565b6122fe6124b3565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461238a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238190614282565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ef90614aac565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614b3a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614bc8565b60405180910390fd5b8060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516126709190614000565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290614c56565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275090614ce4565b60405180910390fd5b5f811161279b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279290614d72565b60405180910390fd5b6127a3611932565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061280e57506127df611932565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b156128245761281f8383835f612a5c565b612a02565b601154811115612869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286090614dda565b60405180910390fd5b5f612873306116af565b90505f600c5482101590508080156128975750600b5f9054906101000a900460ff16155b80156128ef57507f000000000000000000000000b8edb72a75ef76bc60ff4d5da124cf118a1ed8b073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612930576001600b5f6101000a81548160ff021916908315150217905550612916612d47565b5f600b5f6101000a81548160ff0219169083151502179055505b5f6001905060055f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806129d0575060055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156129d9575f90505b80156129f257600f54600d81905550601054600e819055505b6129fe86868684612a5c565b5050505b505050565b5f805f612a12612d6f565b915091508082612a229190614449565b9250505090565b5f805f80612a3685612fef565b92509250505f80612a4887858561303c565b509150915081819550955050505050915091565b80612a6a57612a696130ad565b5b60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612b07575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612b1c57612b178484846130bd565b612d41565b60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612bb9575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612bce57612bc9848484613304565b612d40565b60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015612c6c575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612c8157612c7c84848461354b565b612d3f565b60065f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612d1d575060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612d3257612d2d848484613708565b612d3e565b612d3d84848461354b565b5b5b5b5b50505050565b5f612d51306116af565b9050601154811115612d635760115490505b612d6c816139d9565b50565b5f805f60095490505f60085490505f5b600780549050811015612fb9578260025f60078481548110612da457612da36144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541180612e8957508160035f60078481548110612e2557612e246144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054115b15612ea05760095460085494509450505050612feb565b60025f60078381548110612eb757612eb66144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483612f24919061435b565b925060035f60078381548110612f3d57612f3c6144e1565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482612faa919061435b565b91508080600101915050612d7f565b50600854600954612fca9190614449565b821015612fe257600954600854935093505050612feb565b81819350935050505b9091565b5f805f80612ffc85613bd8565b90505f61300886613bfa565b90505f8183613017919061453b565b90505f8188613026919061435b565b9050808484965096509650505050509193909250565b5f805f80613048612a07565b90505f81886130579190614df8565b90505f82886130669190614df8565b90505f83886130759190614df8565b90505f8183613084919061453b565b90505f8185613093919061435b565b905084818598509850985050505050505093509350939050565b5f600d819055505f600e81905550565b5f805f6130c984613c1c565b9250925092505f805f6130dd87868661303c565b9250925092508660035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461312c919061435b565b60035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508260025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546131b6919061435b565b60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613240919061453b565b60025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061328b8186613c44565b61329484613ca7565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516132f19190614000565b60405180910390a3505050505050505050565b5f805f61331084613c1c565b9250925092505f805f61332487868661303c565b9250925092508260025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613373919061435b565b60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508560035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546133fd919061453b565b60035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613487919061453b565b60025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506134d28186613c44565b6134db84613ca7565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516135389190614000565b60405180910390a3505050505050505050565b5f805f61355784613c1c565b9250925092505f805f61356b87868661303c565b9250925092508260025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546135ba919061435b565b60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613644919061453b565b60025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555061368f8186613c44565b61369884613ca7565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516136f59190614000565b60405180910390a3505050505050505050565b5f805f61371484613c1c565b9250925092505f805f61372887868661303c565b9250925092508660035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613777919061435b565b60035f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508260025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613801919061435b565b60025f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508560035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461388b919061453b565b60035f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613915919061453b565b60025f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506139608186613c44565b61396984613ca7565b8773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef886040516139c69190614000565b60405180910390a3505050505050505050565b5f600267ffffffffffffffff8111156139f5576139f4614e39565b5b604051908082528060200260200182016040528015613a235781602001602082028036833780820191505090505b50905030815f81518110613a3a57613a396144e1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881600181518110613aa957613aa86144e1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613b0e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846124ba565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff166338ed1739835f8460125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401613b90959493929190614f56565b5f604051808303815f875af1158015613bab573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190613bd391906150d5565b505050565b5f6064600d5483613be99190614df8565b613bf39190614449565b9050919050565b5f6064600e5483613c0b9190614df8565b613c159190614449565b9050919050565b5f805f805f80613c2b87612fef565b9250925092508282829550955095505050509193909250565b81600954613c52919061435b565b60098190555080600a54613c66919061453b565b600a819055507f56b5df500587465b57d8ce799cc562a294f136b75a13718c574d9d36bd82805881604051613c9b9190614000565b60405180910390a15050565b5f613cb0612a07565b90505f8183613cbf9190614df8565b90508060025f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613d0a919061453b565b60025f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060065f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613e25578260035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054613de3919061453b565b60035f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e5382613e2a565b9050919050565b613e6381613e49565b82525050565b5f602082019050613e7c5f830184613e5a565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613ec482613e82565b613ece8185613e8c565b9350613ede818560208601613e9c565b613ee781613eaa565b840191505092915050565b5f6020820190508181035f830152613f0a8184613eba565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b613f2c81613e49565b8114613f36575f80fd5b50565b5f81359050613f4781613f23565b92915050565b5f819050919050565b613f5f81613f4d565b8114613f69575f80fd5b50565b5f81359050613f7a81613f56565b92915050565b5f8060408385031215613f9657613f95613f1b565b5b5f613fa385828601613f39565b9250506020613fb485828601613f6c565b9150509250929050565b5f8115159050919050565b613fd281613fbe565b82525050565b5f602082019050613feb5f830184613fc9565b92915050565b613ffa81613f4d565b82525050565b5f6020820190506140135f830184613ff1565b92915050565b5f819050919050565b5f61403c61403761403284613e2a565b614019565b613e2a565b9050919050565b5f61404d82614022565b9050919050565b5f61405e82614043565b9050919050565b61406e81614054565b82525050565b5f6020820190506140875f830184614065565b92915050565b5f602082840312156140a2576140a1613f1b565b5b5f6140af84828501613f6c565b91505092915050565b5f805f606084860312156140cf576140ce613f1b565b5b5f6140dc86828701613f39565b93505060206140ed86828701613f39565b92505060406140fe86828701613f6c565b9150509250925092565b5f60ff82169050919050565b61411d81614108565b82525050565b5f6020820190506141365f830184614114565b92915050565b5f6020828403121561415157614150613f1b565b5b5f61415e84828501613f39565b91505092915050565b61417081613fbe565b811461417a575f80fd5b50565b5f8135905061418b81614167565b92915050565b5f80604083850312156141a7576141a6613f1b565b5b5f6141b485828601613f6c565b92505060206141c58582860161417d565b9150509250929050565b5f602082840312156141e4576141e3613f1b565b5b5f6141f18482850161417d565b91505092915050565b5f80604083850312156142105761420f613f1b565b5b5f61421d85828601613f39565b925050602061422e85828601613f39565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61426c602083613e8c565b915061427782614238565b602082019050919050565b5f6020820190508181035f83015261429981614260565b9050919050565b7f4d6178205472616e73666572206c696d69742063616e206e6f74206265206c655f8201527f7373207468616e203530302c30303020746f6b656e7300000000000000000000602082015250565b5f6142fa603683613e8c565b9150614305826142a0565b604082019050919050565b5f6020820190508181035f830152614327816142ee565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61436582613f4d565b915061437083613f4d565b92508282039050818111156143885761438761432e565b5b92915050565b7f416d6f756e74206d757374206265206c657373207468616e20746f74616c20725f8201527f65666c656374696f6e7300000000000000000000000000000000000000000000602082015250565b5f6143e8602a83613e8c565b91506143f38261438e565b604082019050919050565b5f6020820190508181035f830152614415816143dc565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61445382613f4d565b915061445e83613f4d565b92508261446e5761446d61441c565b5b828204905092915050565b7f4163636f756e7420697320616c726561647920496e636c7564656400000000005f82015250565b5f6144ad601b83613e8c565b91506144b882614479565b602082019050919050565b5f6020820190508181035f8301526144da816144a1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f61454582613f4d565b915061455083613f4d565b92508282019050808211156145685761456761432e565b5b92915050565b7f4578636c75646564206164647265737365732063616e6e6f742063616c6c20745f8201527f6869732066756e6374696f6e0000000000000000000000000000000000000000602082015250565b5f6145c8602c83613e8c565b91506145d38261456e565b604082019050919050565b5f6020820190508181035f8301526145f5816145bc565b9050919050565b7f416c72656179206578636c756465642066726f6d2066656500000000000000005f82015250565b5f614630601883613e8c565b915061463b826145fc565b602082019050919050565b5f6020820190508181035f83015261465d81614624565b9050919050565b7f416d6f756e74206d757374206265206c657373207468616e20737570706c79005f82015250565b5f614698601f83613e8c565b91506146a382614664565b602082019050919050565b5f6020820190508181035f8301526146c58161468c565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c7564656400000000005f82015250565b5f614700601b83613e8c565b915061470b826146cc565b602082019050919050565b5f6020820190508181035f83015261472d816146f4565b9050919050565b7f54726164696e6720697320616c726561647920696e20746865206465736972655f8201527f6420737461746500000000000000000000000000000000000000000000000000602082015250565b5f61478e602783613e8c565b915061479982614734565b604082019050919050565b5f6020820190508181035f8301526147bb81614782565b9050919050565b7f596f752063616e206e6f742073657420706c616e746f47726f757020746178205f8201527f6d6f7265207468656e2036250000000000000000000000000000000000000000602082015250565b5f61481c602c83613e8c565b9150614827826147c2565b604082019050919050565b5f6020820190508181035f83015261484981614810565b9050919050565b7f596f752063616e206e6f7420736574207265666c656374696f6e20746178206d5f8201527f6f7265207468656e203625000000000000000000000000000000000000000000602082015250565b5f6148aa602b83613e8c565b91506148b582614850565b604082019050919050565b5f6020820190508181035f8301526148d78161489e565b9050919050565b7f416d6f756e742073686f756c64206265206d6f7265207468616e207a65726f205f8201527f616e64206c657373207468616e203530306b20746f6b656e7300000000000000602082015250565b5f614938603983613e8c565b9150614943826148de565b604082019050919050565b5f6020820190508181035f8301526149658161492c565b9050919050565b7f416c7265617920696e636c7564656420696e20666565000000000000000000005f82015250565b5f6149a0601683613e8c565b91506149ab8261496c565b602082019050919050565b5f6020820190508181035f8301526149cd81614994565b9050919050565b7f77616c6c65742063616e206e6f74206265207a65726f000000000000000000005f82015250565b5f614a08601683613e8c565b9150614a13826149d4565b602082019050919050565b5f6020820190508181035f830152614a35816149fc565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614a96602683613e8c565b9150614aa182614a3c565b604082019050919050565b5f6020820190508181035f830152614ac381614a8a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f614b24602483613e8c565b9150614b2f82614aca565b604082019050919050565b5f6020820190508181035f830152614b5181614b18565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f614bb2602283613e8c565b9150614bbd82614b58565b604082019050919050565b5f6020820190508181035f830152614bdf81614ba6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f614c40602583613e8c565b9150614c4b82614be6565b604082019050919050565b5f6020820190508181035f830152614c6d81614c34565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f614cce602383613e8c565b9150614cd982614c74565b604082019050919050565b5f6020820190508181035f830152614cfb81614cc2565b9050919050565b7f5472616e7366657220616d6f756e74206d7573742062652067726561746572205f8201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b5f614d5c602983613e8c565b9150614d6782614d02565b604082019050919050565b5f6020820190508181035f830152614d8981614d50565b9050919050565b7f5472616e73616374696f6e206c696d69742065786365656400000000000000005f82015250565b5f614dc4601883613e8c565b9150614dcf82614d90565b602082019050919050565b5f6020820190508181035f830152614df181614db8565b9050919050565b5f614e0282613f4d565b9150614e0d83613f4d565b9250828202614e1b81613f4d565b91508282048414831517614e3257614e3161432e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050919050565b5f614e89614e84614e7f84614e66565b614019565b613f4d565b9050919050565b614e9981614e6f565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614ed181613e49565b82525050565b5f614ee28383614ec8565b60208301905092915050565b5f602082019050919050565b5f614f0482614e9f565b614f0e8185614ea9565b9350614f1983614eb9565b805f5b83811015614f49578151614f308882614ed7565b9750614f3b83614eee565b925050600181019050614f1c565b5085935050505092915050565b5f60a082019050614f695f830188613ff1565b614f766020830187614e90565b8181036040830152614f888186614efa565b9050614f976060830185613e5a565b614fa46080830184613ff1565b9695505050505050565b5f80fd5b614fbb82613eaa565b810181811067ffffffffffffffff82111715614fda57614fd9614e39565b5b80604052505050565b5f614fec613f12565b9050614ff88282614fb2565b919050565b5f67ffffffffffffffff82111561501757615016614e39565b5b602082029050602081019050919050565b5f80fd5b5f8151905061503a81613f56565b92915050565b5f61505261504d84614ffd565b614fe3565b9050808382526020820190506020840283018581111561507557615074615028565b5b835b8181101561509e578061508a888261502c565b845260208401935050602081019050615077565b5050509392505050565b5f82601f8301126150bc576150bb614fae565b5b81516150cc848260208601615040565b91505092915050565b5f602082840312156150ea576150e9613f1b565b5b5f82015167ffffffffffffffff81111561510757615106613f1f565b5b615113848285016150a8565b9150509291505056fea26469706673582212208be70300b9e73cec4472101880c67349ead0e8121072eaaffb5290beb25c221f64736f6c634300081a0033

Verified Source Code Partial Match

Compiler: v0.8.26+commit.8a97fa7a EVM: cancun Optimization: No
Token6OS.sol 1111 lines
/*

             ██████╗ ███████╗███╗   ██╗███████╗███████╗    ████████╗ ██████╗ ██╗  ██╗███████╗███╗   ██╗
            ██╔════╝ ██╔════╝████╗  ██║██╔════╝██╔════╝    ╚══██╔══╝██╔═══██╗██║ ██╔╝██╔════╝████╗  ██║
            ███████╗ █████╗  ██╔██╗ ██║███████╗█████╗         ██║   ██║   ██║█████╔╝ █████╗  ██╔██╗ ██║
            ██╔═══██╗██╔══╝  ██║╚██╗██║╚════██║██╔══╝         ██║   ██║   ██║██╔═██╗ ██╔══╝  ██║╚██╗██║
            ╚██████╔╝███████╗██║ ╚████║███████║███████╗       ██║   ╚██████╔╝██║  ██╗███████╗██║ ╚████║
             ╚═════╝ ╚══════╝╚═╝  ╚═══╝╚══════╝╚══════╝       ╚═╝    ╚═════╝ ╚═╝  ╚═╝╚══════╝╚═╝  ╚═══╝

        ”Sometimes when you're in a dark place you think you've been buried, but Actually you’ve been planted.“
                                                                                                                                                                       
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.26;

interface IERC20 {

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

/**
 * @title Context
 * @dev The base contract that provides information about the message sender
 * and the calldata in the current transaction.
 */

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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.
 */
contract Ownable is Context {
    address private _owner;
    address private _previousOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event Locked(address owner, address newOwner,uint256 lockTime);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor ()  {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @title IUniswapV2Factory
 * @dev Interface for the Uniswap V2 Factory contract.
 */

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

/**
 * @title IUniswapV2Router01
 * @dev Interface for the Uniswap V2 Router version 01 contract.
*/

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    //WETH function that return const value,  rather than performing some state-changing operation. 
    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 Token6OS is Context, IERC20, Ownable {
    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) public isExcludedFromFee;
    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
   
    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 963 * 10**7 * 10**18;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;
   
    string  private constant NAME = "6ENSE";
    string  private  constant SYMBOL = "6OS";
    uint8  private constant DECIMALS = 18;
 
    bool private swapping; 
    bool public tradeEnabled;
    
    uint256 private taxThreshold = 1 * 10**3 * 10**18;

    uint256 refAmt;
    uint256 plantoFee;

    uint256 public reflectionTax=0;
    uint256 public plantoGroupTax=1; 
   
    uint256 public  maxTransferAmount = 1926 * 10*5 * 10**18; // Max transfer Limit 

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public immutable usdcAddress = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

    address public plantoGroupWallet;
    
    event PlantoGroupWalletChange(address wallet);
    event ThresholdUpdated(uint256 amount);
    event ReflectedFee(uint256 totalReflectFee);
    event UpdatedMaxAmount(uint256 updatedMaxAmount);
    event UpdatedReflectionTax(uint256 reflectionTax); 
    event UpdatedWalletTax(uint256 walletTax);
    event TradeEnabled(bool enabled);
    event IncludedInFee(address account);
    event ExcludedFromFee(address account);
    event IncludedInReward(address account);
    event ExcludedFromReward(address account);

    /**
    * @dev Constructor for the token contract.
    * @param _wallet Address of the PlantoGroup wallet, which cannot be the zero address.
    * 
    * Initializes the contract by setting the initial token supply to the deployer, 
    * setting up the Uniswap V2 router and liquidity pair, and excluding certain addresses 
    * (owner, contract, and liquidity pair) from fees.
    */
    constructor(address _wallet)  {
        require(_wallet != address(0),"plantoGroup wallet can not be zero");
        _rOwned[_msgSender()] = _rTotal;
        plantoGroupWallet = _wallet;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //etherum mainnet
        
        
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), usdcAddress);

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        
        //exclude owner and this contract from fee
        isExcludedFromFee[owner()] = true;
        isExcludedFromFee[address(this)] = true;

        excludeFromReward(uniswapV2Pair);
        
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    /**
    * @notice Retrieves the name of the token.
    * @dev This function returns the name of the token, which is often used for identification.
    * It is commonly displayed in user interfaces and provides a human-readable name for the token.
    * @return The name of the token.
    */
    function name() external pure returns (string memory) {
        return NAME;
    }

    /**
    * @notice Retrieves the symbol or ticker of the token.
    * @dev This function returns the symbol or ticker that represents the token.
    * It is commonly used for identifying the token in user interfaces and exchanges.
    * @return The symbol or ticker of the token.
    */
    function symbol() external pure returns (string memory) {
        return SYMBOL;
    }

    /**
    * @notice Retrieves the number of decimal places used in the token representation.
    * @dev This function returns the number of decimal places used to represent the token balances.
    * It is commonly used to interpret the token amounts correctly in user interfaces.
    * @return The number of decimal places used in the token representation.
    */
    function decimals() external pure returns (uint8) {
        return DECIMALS;
    }

    /**
    * @notice Retrieves the total supply of tokens.
    * @dev This function returns the total supply of tokens in circulation.
    * @return The total supply of tokens.
    */
    function totalSupply() external view override returns (uint256) {
        return _tTotal;
    }

    /**
    * @notice Retrieves the token balance of a specified account.
    * @dev This function returns the token balance of the specified account.
    * If the account is excluded, it directly returns the token balance.
    * If the account is not excluded, it converts the reflection balance to token balance using the current rate.
    * @param account The address of the account whose token balance is being queried.
    * @return The token balance of the specified account.
    */
    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];//exculded
        return tokenFromReflection(_rOwned[account]);//not excluded
    }

    /**
    * @notice Transfers a specified amount of tokens to a recipient.
    * @dev This function transfers tokens from the sender's account to the specified recipient.
    * If successful, it returns true.
    * @param recipient The address of the recipient to whom tokens are being transferred.
    * @param amount The amount of tokens to be transferred.
    * @return A boolean indicating the success of the transfer operation.
     */
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
    * @notice Retrieves the remaining allowance for a spender to spend tokens on behalf of an owner.
    * @dev This function returns the current allowance set for the specified spender to spend tokens
    * from the specified owner's account.
    * @param owner The address of the owner whose allowance is being queried.
    * @param spender The address of the spender for whom the allowance is queried.
    * @return The remaining allowance for the specified spender to spend tokens on behalf of the owner.
    */
    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
    * @notice Approves a spender to spend a specified amount of tokens on behalf of the owner.
    * @dev This function sets or updates the allowance for a spender to spend tokens
    * from the owner's account. If successful, it returns true.
    * @param spender The address of the spender to be approved.
    * @param amount The amount of tokens to approve for spending.
    * @return A boolean indicating the success of the approval operation.
    */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
    * @notice Transfers tokens from one address to another on behalf of a third-party.
    * @dev This function allows a designated spender to transfer tokens from the sender's account
    * to the recipient's account. It also ensures that the allowance is updated correctly.
    * If successful, it returns true.
    * @param sender The address from which tokens are being transferred.
    * @param recipient The address to which tokens are being transferred.
    * @param amount The amount of tokens to be transferred.
    * @return A boolean indicating the success of the transfer operation.
    */
    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;
    }

    /**
    * @notice Increases the allowance granted to a spender by a specified amount.
    * @dev This function increases the allowance for the specified spender by the given value.
    * It ensures that the updated allowance is correctly set. If successful, it returns true.
    * @param spender The address of the spender whose allowance is being increased.
    * @param addedValue The amount by which to increase the allowance.
    * @return A boolean indicating the success of the operation.
    */
    function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender]+addedValue);
        return true;
    }

    /**
    * @notice Reduces the allowance granted to a spender by a specified amount.
    * @dev This function decreases the allowance for the specified spender by the given value.
    * It ensures that the allowance does not go below zero. If successful, it returns true.
    * @param spender The address of the spender whose allowance is being reduced.
    * @param subtractedValue The amount by which to reduce the allowance.
    * @return A boolean indicating the success of the operation.
    */
    function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender]-subtractedValue);
        return true;
    }

    /**
    * @notice Checks if the specified address is excluded from earning reflections.
    * @dev Excluded addresses do not receive reflections in certain tokenomics designs.
    * This function returns true if the address is excluded, and false otherwise.
    * @param account The address to check for exclusion from reflections.
    * @return A boolean indicating whether the address is excluded from earning reflections.
    */
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcluded[account];
    }

    /**
    * @notice Retrieves the total amount of fees collected in tokens.
    * @dev This function returns the cumulative sum of fees collected during transactions.
    * The fees are often used for various purposes like liquidity provision, rewards, or burns.
    * @return The total amount of fees collected in tokens.
    */
    function totalFees() external view returns (uint256) {
        return _tFeeTotal;
    }

    /**
    * @notice Distributes the specified amount of tokens as reflections to the reward pool.
    * @dev This function is typically used to convert a portion of tokens into reflections
    * and add them to a reward pool. Excluded addresses cannot call this function.
    * @param tAmount The amount of tokens to be converted and added to reflections.
    */
    function deliver(uint256 tAmount) external {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,) = _getValue(tAmount);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rTotal = _rTotal-rAmount;
        _tFeeTotal = _tFeeTotal+tAmount;
    }

    /**
    * @notice Converts the given token amount to its equivalent reflection amount.
    * @dev Reflections are often used in tokenomics to calculate rewards or balances.
    * This function converts a token amount to its corresponding reflection amount
    * based on the current rate. Optionally, it deducts the transfer fee from the calculation.
    * @param tAmount The token amount to be converted to reflections.
    * @param deductTransferFee A boolean indicating whether to deduct the transfer fee from the calculation.
    * @return The equivalent reflection amount corresponding to the given token amount.
    */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,) = _getValue(tAmount);
             return rAmount;
        } else {
            (,uint256 rTransferAmount) = _getValue(tAmount);
             return rTransferAmount;
        }
    }

    /**
    * @notice Converts the given reflection amount to its equivalent token amount.
    * @dev Reflections are often used in tokenomics to calculate rewards or balances.
    * This function converts a reflection amount to its corresponding token amount
    * based on the current rate.
    * @param rAmount The reflection amount to be converted to tokens.
    * @return The equivalent token amount corresponding to the given reflection amount.
    */
    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount / currentRate;
    }

    /**
    * @notice Grants the owner the ability to exclude an address from earning reflections.
    * @dev Reflections are often used in tokenomics to distribute rewards to holders.
    * This function excludes the specified address from receiving reflections.
    * @param account The address to be excluded from earning reflections.
    */
    function excludeFromReward(address account) public onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
        emit ExcludedFromReward(account);
    }

    /**
    * @dev External function for including an account in the reward distribution.
    * @param account The address to be included in the reward distribution.
    * 
    * The function can only be called by the owner of the contract.
    * Requires that the specified account is currently excluded.
    * Iterates through the list of excluded accounts, finds the specified account, and removes it from the exclusion list.
    * Resets the token balance of the specified account to 0 and updates the exclusion status.
    * 
    * @notice Only the owner of the contract can call this function.
    * @notice Requires that the specified account is currently excluded.
    */
    function includeInReward(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already Included");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
        emit IncludedInReward(account);
    }

    /**
    * @notice Grants the owner the ability to exclude an address from transaction fees.
    * @dev Transaction fees are often applied in decentralized finance (DeFi) projects
    * to support various mechanisms like liquidity provision, rewards, or token burns.
    * @param account The address to exclude from transaction fees.
    */
     function excludeFromFee(address account) external  onlyOwner {
        require(!isExcludedFromFee[account],"Alreay excluded from fee");
        isExcludedFromFee[account] = true;
        emit ExcludedFromFee(account);
    }

    /**
    * @notice Grants the owner the ability to include an address in transaction fees.
    * @dev Transaction fees are often applied in decentralized finance (DeFi) projects
    * to support various mechanisms like liquidity provision, rewards, or token burns.
    * @param account The address to include in transaction fees.
    */
    
    function includeInFee(address account) external onlyOwner {
        require(isExcludedFromFee[account],"Alreay included in fee");
        isExcludedFromFee[account] = false;
        emit IncludedInFee(account);
    }

    /**
    * @dev Sets the address of the fund wallet.
    * @param wallet The new address to be set as the fund wallet.
    *
    * Requirements:
    * - Only the contract owner can call this function.
    *
    * Emits a {plantoGroupWalletChange} event with the updated wallet address on successful execution.
    */
    function setplantoGroupWallet(address wallet) external onlyOwner{
        require(wallet != address(0),"wallet can not be zero");
        plantoGroupWallet = wallet;
        emit PlantoGroupWalletChange(wallet);
    }                                                                                                                  

    /**
    * @dev External function for updating the threshold amount required for triggering liquidity addition.
    * @param amount The new threshold amount.
    * 
    * The function can only be called by the owner of the contract.
    * Requires that the provided threshold amount (amount) is greater than 0.
    * Updates the taxThreshold with the new threshold amount.
    * @notice Only the owner of the contract can call this function.
    * @notice Requires a positive amount for successful execution.
    */
    function updateThreshold(uint256 amount) external onlyOwner {
        require(amount > 0 && amount <= 5 * 10**5 * 10**18,"Amount should be more than zero and less than 500k tokens");
        taxThreshold = amount;
        emit ThresholdUpdated(amount);
    }
    
    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /**
    * @dev Private function for approving a spender to spend a certain amount on behalf of the owner.
    * @param owner The address that owns the tokens.
    * @param spender The address that is approved to spend the tokens.
    * @param amount The amount of tokens to be approved for spending.
    * 
    * Requires that both the owner and spender addresses are not the zero address.
    * Sets the allowance for the spender on behalf of the owner to the specified amount.
    * Emits an `Approval` event with details about the approval.
    * 
    * @notice This function is intended for internal use and should not be called directly.
    */
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
    * @dev Reduces the total reflection supply by `rFee` and adds `tFee` to the total fee collected.
    * @param rFee The reflection fee deducted from the total supply.
    * @param tFee The transaction fee added to the fee total.
    */
    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee ;
        _tFeeTotal = _tFeeTotal + tFee;

        emit ReflectedFee(tFee);    
    }

    /**
    * @dev Allocates a portion of the transaction amount to the plantoGroup fund.
    * @param tPlantoFee The amount of tokens allocated for plantoGroup.
    * 
    * Converts `_takePlantoFee` to reflected value and stores it in the contract balance.
    */
    function _takePlantoFee(uint256 tPlantoFee) private {
        uint256 currentRate =  _getRate();
        uint256 rPlantoFee = tPlantoFee * currentRate;
        _rOwned[address(this)] = _rOwned[address(this)] + rPlantoFee;
        if(_isExcluded[address(this)])
          _tOwned[address(this)] = _tOwned[address(this)] + tPlantoFee;
    }
     
    /**
    * @dev Calculates and returns the transfer amount, tax fee, and plantoGroup fee for a given transaction.
    * @param tAmount The total transaction amount.
    * @return tTransferAmount The amount remaining after tax deductions.
    * @return tFee The transaction fee deducted.
    * @return tCoinOperation The fee allocated for plantoGroups.
    */
    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee,uint256 tPlantoFee) = _getTValues(tAmount); 
        return ( tTransferAmount, tFee,  tPlantoFee);
    }

    /**
    * @dev Returns the reflected amount and reflected transfer amount for a given transaction.
    * @param tAmount The total transaction amount.
    * @return rAmount The reflected total amount.
    * @return rTransferAmount The reflected transfer amount after tax deductions.
    */
    function _getValue(uint256 tAmount) private view returns(uint256, uint256){
        (, uint256 tFee, uint256 tPlantoFee) = _getTValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount,) = _getRValues(tAmount, tFee, tPlantoFee);
         return (rAmount, rTransferAmount);
    }
 
    /**
    * @dev Calculates the tax and plantoGroup fees and returns the transfer amount.
    * @param tAmount The total transaction amount.
    * @return tTransferAmount The amount left after deducting all taxes.
    * @return tFee The tax fee deducted from the transaction.
    * @return tPlantoFee The plantoGroup fee deducted from the transaction.
    */
    function _getTValues(uint256 tAmount) private view returns (uint256, uint256, uint256) {
        uint256 tFee = calculateTaxFee(tAmount);
        uint256 tPlantoFee = calculatePlantoTax(tAmount);
        uint256 allTax = tFee + tPlantoFee;
        uint256 tTransferAmount = tAmount - allTax;
        return (tTransferAmount, tFee, tPlantoFee);
    }
    
    /**
    * @dev Converts token values to reflected values and calculates the reflected transfer amount.
    * @param tAmount The total transaction amount.
    * @param tFee The transaction fee in token value.
    * @param tPlantoFee The plantoGroup fee in token value.
    * @return rAmount The reflected total amount.
    * @return rTransferAmount The reflected transfer amount after tax deductions.
    * @return rFee The reflected tax fee deducted from the transaction.
    */
    function _getRValues(uint256 tAmount, uint256 tFee, uint256 tPlantoFee) private view returns (uint256, uint256, uint256) {
        uint256 currentRate = _getRate();
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rPlantoFee = tPlantoFee * currentRate;
        uint256 allTax = rFee + rPlantoFee;
        uint256 rTransferAmount = rAmount - allTax;
        return (rAmount, rTransferAmount, rFee);
    }

    /**
    * @dev Private function for retrieving the current conversion rate between reflection and token balances.
    * @return rate Current conversion rate.
    * 
    * @notice Internal use only.
    */
    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / tSupply;
    }

    /**
    * @dev Private function for retrieving the current supply of both reflection and token balances.
    * @return rSupply Current reflection supply.
    * @return tSupply Current token supply.
    * 
    * @notice Internal use only.
    */
    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - _rOwned[_excluded[i]];
            tSupply = tSupply - _tOwned[_excluded[i]];
        }
        if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    /**
    * @dev Calculates the tax fee for reflection based on a specified amount.
    * @param amount Amount for tax fee calculation.
    * @return Calculated tax fee amount.
    * 
    * @notice Internal use only.
    */
    function calculateTaxFee(uint256 amount) private view returns (uint256) {
        return amount * refAmt / 10**2;
    }

    /**
    * @dev Calculates the plantoGroup tax based on a specified amount.
    * @param amount Amount for plantoGroup tax calculation.
    * @return Calculated plantoGroup tax amount.
    * 
    * @notice Internal use only.
    */
    function calculatePlantoTax(uint256 amount) private view returns (uint256) {
        return amount * plantoFee / 10**2;
    }

    /**
    * @dev Removes all fees by setting `refAmt` and `plantoFee` to zero.
    * 
    * This function is typically used for transactions where fees should be excluded, 
    * such as transfers between specific addresses.
    */
    function removeAllFee() private {
        refAmt = 0;
        plantoFee = 0;
    }

    /**
     * @notice Enables or disables trading functionality based on the input parameter.
     * @dev Only callable by the owner of the contract.
     * @param _enable A boolean value: `true` to enable trading, `false` to disable trading.
     */
    function setTrading(bool _enable) external onlyOwner {
        require(tradeEnabled != _enable, "Trading is already in the desired state");
        tradeEnabled = _enable;
        emit TradeEnabled(tradeEnabled);
    }

    /**
    * @notice Updates the reflection tax (max 6%).
    */
    function updateReflectionTaxPer(uint256 reflectionPercent) external onlyOwner {
        require(reflectionPercent <= 6,"You can not set reflection tax more then 6%");     
        reflectionTax = reflectionPercent;
        emit UpdatedReflectionTax(reflectionTax);
    }

    /**
    * @notice Updates the PlantoGroup tax (max 6%).
    */
    function updatePlantoGroupTax(uint256 walletTax) external onlyOwner {
        require(walletTax <= 6,"You can not set plantoGroup tax more then 6%");     
        plantoGroupTax = walletTax;
        emit UpdatedWalletTax(plantoGroupTax);
    }

    /**
     * @dev Sets the maximum buy limit per transaction. Can only be called by the contract owner.
     * 
     * The `amount` entered should include the token's decimal places.
     * For example, if the token has 18 decimals, to set a limit of 500,000 tokens,
     * the `amount` should be entered as 500,000 * 10^18 (i.e., 500k tokens with decimals).
     * 
     * The function enforces a minimum buy limit of 500,000 tokens (accounting for decimals).
     * 
     * @param amount The new maximum amount allowed per transaction. This value must include decimals.
     * Emits an {UpdatedMaxAmount} event indicating the new maximum buy amount.
     */
    function setMaxTransferLimit(uint256 amount) external onlyOwner {
        require(amount >= 500000 * 10**18, "Max Transfer limit can not be less than 500,000 tokens");
        maxTransferAmount = amount;
        emit UpdatedMaxAmount(maxTransferAmount);
    }

    /**
    * @notice Transfers tokens while applying tax rules.
    * @dev Ensures transaction limits, tax deductions, and trading status.
    * @param from The address sending tokens.
    * @param to The address receiving tokens.
    * @param amount The amount of tokens to transfer.
    */
    function _transfer( address from, address to, uint256 amount ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        if (from == owner() || to == owner()){
            _tokenTransfer(from,to,amount,false);
            return;
        }

        require(amount <= maxTransferAmount, "Transaction limit exceed");
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= taxThreshold;
        if (
            overMinTokenBalance &&
            !swapping &&
            from != uniswapV2Pair 
        ) {
            swapping = true;
            swapAndLiquify();
            swapping = false;
        }
        
        //indicates if fee should be deducted from transfer
        bool takeFee = true;
        
        //if any account belongs to isExcludedFromFee account then remove the fee
        if(isExcludedFromFee[from] || isExcludedFromFee[to]){
            takeFee = false;
        }

        //if takeFee is true then set sell or buy tax percentage
        if(takeFee){
            refAmt = reflectionTax; 
            plantoFee = plantoGroupTax; 
        }
       _tokenTransfer(from,to,amount,takeFee);
    }

    /**
    * @dev Swaps contract token balance for USDC and limits swap amount to maxTransferAmount.
    * Ensures that excessive tokens are not swapped in a single transaction.
    */
    function swapAndLiquify() private{

        uint256 contractTokenBalance = balanceOf(address(this));
        
        if(contractTokenBalance > maxTransferAmount){
            contractTokenBalance = maxTransferAmount;
        }
        swapTokensForUsdc(contractTokenBalance);   
    }

    /**
    * @dev Swaps a specified amount of tokens for USDC using Uniswap.
    * The swapped USDC is sent to the `plantoGroupWallet`.
    * 
    * @param tokenAmount The amount of tokens to swap for USDC.
    */
    function swapTokensForUsdc(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = usdcAddress;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForTokens(
            tokenAmount,
            0, // accept any amount of Usdc
            path,
            plantoGroupWallet,
            block.timestamp
        );
    }

    /**
    * @notice Handles token transfers, applying tax rules if necessary.
    * @dev Determines the transfer type based on sender/recipient exclusions and applies fees accordingly.
    * @param sender The address sending tokens.
    * @param recipient The address receiving tokens.
    * @param amount The amount of tokens being transferred.
    * @param takeFee Boolean indicating whether tax should be applied.
    */
    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee) private {
        if(!takeFee)
            removeAllFee();
        
          if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }  
    }
     
    /**
    * @notice Handles transfers between two excluded accounts.
    * @dev Excluded accounts hold both reflected and total token balances.
    * @param sender The address sending tokens.
    * @param recipient The address receiving tokens.
    * @param tAmount The amount of tokens being transferred.
    */
    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tPlantoFee) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tPlantoFee);
        _tOwned[sender] = _tOwned[sender]-tAmount;
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;        
        _reflectFee(rFee, tFee);
        _takePlantoFee(tPlantoFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @notice Handles standard transfers between two non-excluded accounts.
    * @dev Only reflected balances are updated, and transaction fees are deducted.
    * @param sender The address sending tokens.
    * @param recipient The address receiving tokens.
    * @param tAmount The amount of tokens being transferred.
    */
    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee,  uint256 tPlantoFee) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tPlantoFee);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;
        _reflectFee(rFee, tFee);
        _takePlantoFee(tPlantoFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @notice Handles transfers where the recipient is excluded from rewards.
    * @dev Excluded recipients maintain a total balance but do not participate in reflections.
    * @param sender The address sending tokens.
    * @param recipient The address receiving tokens.
    * @param tAmount The amount of tokens being transferred.
    */
    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tPlantoFee) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee,tPlantoFee);
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _tOwned[recipient] = _tOwned[recipient]+tTransferAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;           
        _reflectFee(rFee, tFee);
        _takePlantoFee(tPlantoFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    /**
    * @notice Handles transfers where the sender is excluded from rewards.
    * @dev Excluded senders maintain a total balance but do not participate in reflections.
    * @param sender The address sending tokens.
    * @param recipient The address receiving tokens.
    * @param tAmount The amount of tokens being transferred.
    */
    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 tTransferAmount, uint256 tFee, uint256 tPlantoFee) = _getValues(tAmount);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, tPlantoFee);
        _tOwned[sender] = _tOwned[sender]-tAmount;
        _rOwned[sender] = _rOwned[sender]-rAmount;
        _rOwned[recipient] = _rOwned[recipient]+rTransferAmount;   
        _reflectFee(rFee, tFee);
        _takePlantoFee(tPlantoFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }
}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
isExcludedFromFee 0x5342acb4 → bool
isExcludedFromReward 0x88f82020 → bool
maxTransferAmount 0xa9e75723 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
plantoGroupTax 0xe1b2cfb6 → uint256
plantoGroupWallet 0xb4e1e6ad → address
reflectionFromToken 0x4549b039 → uint256
reflectionTax 0x3ae2f354 → uint256
symbol 0x95d89b41 → string
tokenFromReflection 0x2d838119 → uint256
totalFees 0x13114a9d → uint256
totalSupply 0x18160ddd → uint256
tradeEnabled 0xd621e813 → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
usdcAddress 0x02d45457 → address

Write Contract 18 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
deliver 0x3bd5d173
uint256 tAmount
excludeFromFee 0x437823ec
address account
excludeFromReward 0x52390c02
address account
includeInFee 0xea2f0b37
address account
includeInReward 0x3685d419
address account
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
setMaxTransferLimit 0x1978c0b3
uint256 amount
setTrading 0x8f70ccf7
bool _enable
setplantoGroupWallet 0xeef63f1f
address wallet
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updatePlantoGroupTax 0xb220aae1
uint256 walletTax
updateReflectionTaxPer 0xbbae8086
uint256 reflectionPercent
updateThreshold 0xd7d7442f
uint256 amount

Recent Transactions

No transactions found for this address