Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xa81d105c4D468F3e16AA29fac7405e39F8C1fD2F
Balance 0.013342 ETH
Nonce 1
Code Size 16611 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

16611 bytes
0x6080604052600436106104265760003560e01c806373ddf08e11610227578063c28089541161012d578063e2fd002a116100b0578063f2c816ae11610077578063f2c816ae14610c8f578063f2fde38b14610caf578063f88b0e4614610ccf578063fe002ec214610ce5578063fe575a8714610cfa57005b8063e2fd002a14610c04578063e69e03ee14610c24578063ebddcc1d14610c39578063f00df36514610c59578063f0cc761214610c6f57005b8063d11edf74116100f4578063d11edf7414610b49578063d28d885214610b69578063d51f383b14610b7e578063db886f2314610b9e578063dd62ed3e14610bbe57005b8063c280895414610aca578063c3a3c03214610adf578063c3f4f54f14610af4578063cd979a7e14610b09578063d0291d6614610b2957005b806395d89b41116101b5578063a9059cbb1161017c578063a9059cbb14610a35578063b09f126614610a55578063b58a56cd14610a6a578063b766a38614610a8a578063c054f2f414610aaa57005b806395d89b41146109ab578063998a8668146109c05780639bf65770146109d55780639fa62d5f146109f5578063a457c2d714610a1557005b80638650e92a116101f95780638650e92a1461094357806386d0ada814610959578063887c60fb14610973578063893d20e81461098d5780638da5cb5b1461098d57005b806373ddf08e146108c057806375a1017c146108e0578063762bb282146109185780637b9e987a1461092e57005b80633ab0e29d1161032c57806358e55365116102ba5780636ea4caab116102815780636ea4caab1461080b5780636f89e4091461082b57806370a0823114610855578063715018a61461088b5780637335307b146108a057005b806358e55365146107ab5780635b80f625146107c15780635c69f690146106695780635ebbc3ca146107d6578063643daaea146107eb57005b806344f3c83a116102fe57806344f3c83a146107205780634ada218b146107365780634cdaf0ae146107555780634f91e48c1461077557806357ad67d11461078b57005b80633ab0e29d146106be5780633cc39b7a146106de5780633da56f18146106f45780634089b1701461070a57005b8063243b529a116103b4578063313ce5671161037b578063313ce5671461063557806332ac487f146106495780633478154b1461066957806335e82f3a1461067e578063395093511461069e57005b8063243b529a14610572578063269a6aae146105875780632973ef2d1461059d5780633054f8a314610606578063311a86971461062057005b80630fd99e16116103f85780630fd99e16146104d657806314e91377146104fe57806318160ddd1461051e5780631eb25d131461053d57806323b872dd1461055257005b80630241047b1461042f57806306fdde031461044f57806309218ee71461047a578063095ea7b3146104a657005b3661042d57005b005b34801561043b57600080fd5b5061042d61044a366004613881565b610d1a565b34801561045b57600080fd5b50610464610e23565b604051610471919061389a565b60405180910390f35b34801561048657600080fd5b50601f546104949060ff1681565b60405160ff9091168152602001610471565b3480156104b257600080fd5b506104c66104c1366004613904565b610eb5565b6040519015158152602001610471565b3480156104e257600080fd5b506104eb601881565b60405161ffff9091168152602001610471565b34801561050a57600080fd5b5061042d61051936600461393e565b610ecc565b34801561052a57600080fd5b506016545b604051908152602001610471565b34801561054957600080fd5b5061052f610f18565b34801561055e57600080fd5b506104c661056d36600461395b565b610f34565b34801561057e57600080fd5b5061042d610fcb565b34801561059357600080fd5b5061052f60125481565b3480156105a957600080fd5b50601a546040805160ff6301000000840481168252640100000000840481166020830152600160281b84048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c001610471565b34801561061257600080fd5b506029546104c69060ff1681565b34801561062c57600080fd5b50610494601881565b34801561064157600080fd5b506009610494565b34801561065557600080fd5b5061052f61066436600461399c565b61100e565b34801561067557600080fd5b506104eb600081565b34801561068a57600080fd5b5061042d61069936600461399c565b611066565b3480156106aa57600080fd5b506104c66106b9366004613904565b6110aa565b3480156106ca57600080fd5b5061042d6106d936600461399c565b6110e1565b3480156106ea57600080fd5b5061052f60245481565b34801561070057600080fd5b5061052f60135481565b34801561071657600080fd5b5061052f601e5481565b34801561072c57600080fd5b5061052f602a5481565b34801561074257600080fd5b50602b546104c690610100900460ff1681565b34801561076157600080fd5b5061042d61077036600461399c565b61113c565b34801561078157600080fd5b5061052f60185481565b34801561079757600080fd5b5061042d6107a63660046139cf565b61119f565b3480156107b757600080fd5b5061052f60205481565b3480156107cd57600080fd5b5060265461052f565b3480156107e257600080fd5b5061042d6112d2565b3480156107f757600080fd5b5061042d610806366004613881565b61139f565b34801561081757600080fd5b5061042d610826366004613881565b6113ea565b34801561083757600080fd5b5061084061143f565b60408051928352602083019190915201610471565b34801561086157600080fd5b5061052f61087036600461399c565b6001600160a01b031660009081526001602052604090205490565b34801561089757600080fd5b5061042d61147c565b3480156108ac57600080fd5b506104c66108bb36600461399c565b6114ff565b3480156108cc57600080fd5b5061042d6108db366004613a43565b61150c565b3480156108ec57600080fd5b50601454610900906001600160a01b031681565b6040516001600160a01b039091168152602001610471565b34801561092457600080fd5b5061052f60175481565b34801561093a57600080fd5b5061042d61156c565b34801561094f57600080fd5b5061052f601c5481565b34801561096557600080fd5b50602b546104c69060ff1681565b34801561097f57600080fd5b506027546104c69060ff1681565b34801561099957600080fd5b506000546001600160a01b0316610900565b3480156109b757600080fd5b506104646115bf565b3480156109cc57600080fd5b5061042d6115ce565b3480156109e157600080fd5b5061042d6109f036600461393e565b61171d565b348015610a0157600080fd5b5061042d610a10366004613a5e565b611769565b348015610a2157600080fd5b506104c6610a30366004613904565b6118eb565b348015610a4157600080fd5b506104c6610a50366004613904565b611967565b348015610a6157600080fd5b50610464611974565b348015610a7657600080fd5b5061042d610a8536600461399c565b611a02565b348015610a9657600080fd5b5061042d610aa536600461393e565b611a5d565b348015610ab657600080fd5b50602354610900906001600160a01b031681565b348015610ad657600080fd5b5061042d611aa9565b348015610aeb57600080fd5b5061052f611ab2565b348015610b0057600080fd5b5061052f611ad2565b348015610b1557600080fd5b5061042d610b2436600461399c565b611b10565b348015610b3557600080fd5b5061042d610b44366004613b23565b611b54565b348015610b5557600080fd5b5061042d610b64366004613881565b611ba6565b348015610b7557600080fd5b50610464611be4565b348015610b8a57600080fd5b5061042d610b99366004613881565b611bf1565b348015610baa57600080fd5b50601554610900906001600160a01b031681565b348015610bca57600080fd5b5061052f610bd9366004613b87565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610c1057600080fd5b5061042d610c1f366004613881565b611c7d565b348015610c3057600080fd5b5061052f611d02565b348015610c4557600080fd5b5061042d610c5436600461393e565b611d68565b348015610c6557600080fd5b5061052f601d5481565b348015610c7b57600080fd5b5061042d610c8a36600461399c565b611f82565b348015610c9b57600080fd5b5061042d610caa36600461399c565b611fdd565b348015610cbb57600080fd5b5061042d610cca36600461399c565b612021565b348015610cdb57600080fd5b5061052f60285481565b348015610cf157600080fd5b5061042d61211a565b348015610d0657600080fd5b506104c6610d1536600461399c565b612178565b33610d2d6000546001600160a01b031690565b6001600160a01b031614610d5c5760405162461bcd60e51b8152600401610d5390613bc0565b60405180910390fd5b602054811115610d6b57600080fd5b8060206000828254610d7d9190613c0b565b90915550506014546001600160a01b03166108fc6064610d9e846032613c22565b610da89190613c41565b6040518115909202916000818181858888f19350505050158015610dd0573d6000803e3d6000fd5b506015546001600160a01b03166108fc6064610ded846032613c22565b610df79190613c41565b6040518115909202916000818181858888f19350505050158015610e1f573d6000803e3d6000fd5b5050565b6060600f8054610e3290613c63565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5e90613c63565b8015610eab5780601f10610e8057610100808354040283529160200191610eab565b820191906000526020600020905b815481529060010190602001808311610e8e57829003601f168201915b5050505050905090565b6000610ec23384846121a1565b5060015b92915050565b33610edf6000546001600160a01b031690565b6001600160a01b031614610f055760405162461bcd60e51b8152600401610d5390613bc0565b6027805460ff1916911515919091179055565b610f246009600a613d7b565b610f3190620f4240613c22565b81565b6000610f41848484612294565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610fac5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610d53565b610fc08533610fbb8685613c0b565b6121a1565b506001949350505050565b33610fde6000546001600160a01b031690565b6001600160a01b0316146110045760405162461bcd60e51b8152600401610d5390613bc0565b61100c6124f1565b565b6000611019826114ff565b1561103a57506001600160a01b031660009081526022602052604090205490565b6001600160a01b03821660009081526022602052604090205461105c83612631565b610ec69190613d8a565b336110796000546001600160a01b031690565b6001600160a01b03161461109f5760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d826126b7565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ec2918590610fbb908690613d8a565b336110f46000546001600160a01b031690565b6001600160a01b03161461111a5760405162461bcd60e51b8152600401610d5390613bc0565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b3361114f6000546001600160a01b031690565b6001600160a01b0316146111755760405162461bcd60e51b8152600401610d5390613bc0565b602b80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336111b26000546001600160a01b031690565b6001600160a01b0316146111d85760405162461bcd60e51b8152600401610d5390613bc0565b6000846111e58789613da2565b6111ef9190613da2565b90508060ff166064146112535760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610d53565b50601a805460ff928316620100000262ff0000199484166101000261ffff19978516600160281b029790971665ff000000ffff199885166401000000000264ff00000000199a86166301000000029a909a1664ffff00000019909316929092179890981796909616959095179216919091179190911716919091179055565b336112e56000546001600160a01b031690565b6001600160a01b03161461130b5760405162461bcd60e51b8152600401610d5390613bc0565b602c5442101561132d5760405162461bcd60e51b8152600401610d5390613dc7565b61133961070842613d8a565b602c556014546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611389576040519150601f19603f3d011682016040523d82523d6000602084013e61138e565b606091505b505090508061139c57600080fd5b50565b336113b26000546001600160a01b031690565b6001600160a01b0316146113d85760405162461bcd60e51b8152600401610d5390613bc0565b61139c6113e54283613d8a565b6126cc565b336113fd6000546001600160a01b031690565b6001600160a01b0316146114235760405162461bcd60e51b8152600401610d5390613bc0565b61142f6009600a613d7b565b6114399082613c22565b60195550565b60008061144e6009600a613d7b565b60175461145b9190613c41565b6114676009600a613d7b565b6018546114749190613c41565b915091509091565b3361148f6000546001600160a01b031690565b6001600160a01b0316146114b55760405162461bcd60e51b8152600401610d5390613bc0565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610ec6600b836126df565b3361151f6000546001600160a01b031690565b6001600160a01b0316146115455760405162461bcd60e51b8152600401610d5390613bc0565b60648160ff16111561155657600080fd5b601f805460ff191660ff92909216919091179055565b3361157f6000546001600160a01b031690565b6001600160a01b0316146115a55760405162461bcd60e51b8152600401610d5390613bc0565b602b805461ff00191661010017905542601155565b905090565b606060108054610e3290613c63565b336115e16000546001600160a01b031690565b6001600160a01b0316146116075760405162461bcd60e51b8152600401610d5390613bc0565b602c544210156116295760405162461bcd60e51b8152600401610d5390613dc7565b602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa15801561167b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169f9190613df1565b60145460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af11580156116f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117189190613e0a565b505050565b336117306000546001600160a01b031690565b6001600160a01b0316146117565760405162461bcd60e51b8152600401610d5390613bc0565b602b805460ff1916911515919091179055565b3361177c6000546001600160a01b031690565b6001600160a01b0316146117a25760405162461bcd60e51b8152600401610d5390613bc0565b60646016546117b19190613c41565b81106117bc57600080fd5b6117c86009600a613d7b565b6117d29083613c22565b91506117e06009600a613d7b565b6117ea9082613c22565b90506000601860ff166016546118009190613c41565b90506000601861ffff166016546118179190613c41565b90508184101561187d5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610d53565b808310156118de5760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610d53565b5050601791909155601855565b3360009081526002602090815260408083206001600160a01b03861684529091528120548281101561194e5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610d53565b61195d3385610fbb8685613c0b565b5060019392505050565b6000610ec2338484612294565b6010805461198190613c63565b80601f01602080910402602001604051908101604052809291908181526020018280546119ad90613c63565b80156119fa5780601f106119cf576101008083540402835291602001916119fa565b820191906000526020600020905b8154815290600101906020018083116119dd57829003601f168201915b505050505081565b33611a156000546001600160a01b031690565b6001600160a01b031614611a3b5760405162461bcd60e51b8152600401610d5390613bc0565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b33611a706000546001600160a01b031690565b6001600160a01b031614611a965760405162461bcd60e51b8152600401610d5390613bc0565b6029805460ff1916911515919091179055565b61100c33612701565b6000602c54421015611acc5742602c546115ba9190613c0b565b50600090565b6000611ae06009600a613d7b565b601654611aef6009600a613d7b565b611afc90620f4240613c22565b611b069190613c0b565b6115ba9190613c41565b33611b236000546001600160a01b031690565b6001600160a01b031614611b495760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600582612185565b33611b676000546001600160a01b031690565b6001600160a01b031614611b8d5760405162461bcd60e51b8152600401610d5390613bc0565b600f611b998382613e6d565b5060106117188282613e6d565b33611bb96000546001600160a01b031690565b6001600160a01b031614611bdf5760405162461bcd60e51b8152600401610d5390613bc0565b602655565b600f805461198190613c63565b33611c046000546001600160a01b031690565b6001600160a01b031614611c2a5760405162461bcd60e51b8152600401610d5390613bc0565b8015611c785760405162461bcd60e51b815260206004820152601760248201527f53656c6c204c6f636b2074696d6520746f6f20686967680000000000000000006044820152606401610d53565b602855565b33611c906000546001600160a01b031690565b6001600160a01b031614611cb65760405162461bcd60e51b8152600401610d5390613bc0565b8015611cfd5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610d53565b602a55565b601654600090815b611d14600b6129b2565b811015611d625760016000611d2a600b846129bc565b6001600160a01b03168152602081019190915260400160002054611d4e9083613c0b565b915080611d5a81613f2d565b915050611d0a565b50919050565b33611d7b6000546001600160a01b031690565b6001600160a01b031614611da15760405162461bcd60e51b8152600401610d5390613bc0565b602c54421015611dc35760405162461bcd60e51b8152600401610d5390613dc7565b611dcf61070842613d8a565b602c55602b546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e489190613df1565b601b5460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec19190613e0a565b50601b5460405163af2979eb60e01b815247916001600160a01b03169063af2979eb90611efd9030908690600090819084904290600401613f46565b6020604051808303816000875af1158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190613df1565b506000611f4d8247613c0b565b90508415611f6357611f5e816129c8565b611f7b565b8060206000828254611f759190613d8a565b90915550505b5050505050565b33611f956000546001600160a01b031690565b6001600160a01b031614611fbb5760405162461bcd60e51b8152600401610d5390613bc0565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b33611ff06000546001600160a01b031690565b6001600160a01b0316146120165760405162461bcd60e51b8152600401610d5390613bc0565b610e1f600d82612185565b336120346000546001600160a01b031690565b6001600160a01b03161461205a5760405162461bcd60e51b8152600401610d5390613bc0565b6001600160a01b0381166120bf5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d53565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3361212d6000546001600160a01b031690565b6001600160a01b0316146121535760405162461bcd60e51b8152600401610d5390613bc0565b6020805460009091556014546001600160a01b03166108fc6064610d9e846032613c22565b6000610ec6600d836126df565b600061219a836001600160a01b038416612a94565b9392505050565b6001600160a01b0383166121eb5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610d53565b6001600160a01b0382166122335760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610d53565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122df5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610d53565b6001600160a01b0382166123285760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610d53565b60006123356005856126df565b8061234657506123466005846126df565b905060006001600160a01b03851630148061236957506001600160a01b03841630145b601b54601a549192506001600160a01b0390811691600091888116600160301b909204161480156123ab5750816001600160a01b0316866001600160a01b0316145b806123e65750601a546001600160a01b03878116600160301b909204161480156123e65750816001600160a01b0316876001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b9092041614806124205750826001600160a01b0316886001600160a01b0316145b601a549091506000906001600160a01b03898116600160301b90920416148061245a5750836001600160a01b0316886001600160a01b0316145b905084806124655750825b8061246d5750855b156124825761247d898989612ae3565b6124e6565b602b54610100900460ff166124d95760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610d53565b6124e68989898585612bae565b505050505050505050565b6025805460ff191660019081179091553060009081526020919091526040812054601a5490919061253790600160281b810460ff90811691640100000000900416613da2565b60ff1690506000602654905080831080612553575061ffff8216155b1561256057505050612625565b601a5460009061ffff84169061258190640100000000900460ff1684613c22565b61258b9190613c41565b905060006125998284613c0b565b905060006125a8600284613c41565b905060006125b68285613c0b565b905060006125c48483613d8a565b9050476125d082613346565b60006125dc8247613c0b565b90506000836125eb8684613c22565b6125f59190613c41565b9050612601868261349f565b600061260d8447613c0b565b9050612618816129c8565b5050505050505050505050505b6025805460ff19169055565b6001600160a01b038116600090815260016020526040812054601c54829161265891613c22565b6001600160a01b0384166000908152602160205260409020549091508110156126845750600092915050565b6001600160a01b038316600090815260216020526040902054600160401b906126ad9083613c0b565b61219a9190613c41565b600061219a836001600160a01b03841661354e565b602c5481116126da57600080fd5b602c55565b6001600160a01b0381166000908152600183016020526040812054151561219a565b601b54600160a01b900460ff161561271857600080fd5b601b805460ff60a01b1916600160a01b1790556000612736826114ff565b1561275e57506001600160a01b038116600090815260226020526040812080549190556127de565b600061276983612631565b6001600160a01b038416600090815260016020526040902054601c5491925061279191613c22565b6001600160a01b0384166000908152602160209081526040808320939093556022905220546127c1908290613d8a565b6001600160a01b0384166000908152602260205260408120559150505b806000036127f7575050601b805460ff60a01b19169055565b80601e60008282546128099190613d8a565b90915550506040805160028082526060820183526000926020830190803683375050601b54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289c9190613f81565b816000815181106128af576128af613f9e565b6001600160a01b0392831660209182029290920101526023548251911690829060019081106128e0576128e0613f9e565b6001600160a01b039283166020918202929092010152601b5460405163b6f9de9560e01b815291169063b6f9de9590849061292690600090869089904290600401613ff8565b6000604051808303818588803b15801561293f57600080fd5b505af1158015612953573d6000803e3d6000fd5b5050604080518681526001600160a01b03881660208201527f80a489adad6e8e00b344a3e9042e6aff0ae286ce1376918078a67bbce8b905b394500191506129989050565b60405180910390a15050601b805460ff60a01b1916905550565b6000610ec6825490565b600061219a838361363b565b601f546000906064906129de9060ff1684613c22565b6129e89190613c41565b905060006129f68284613c0b565b90508160206000828254612a0a9190613d8a565b909155505080156117185780601d6000828254612a279190613d8a565b9091555060009050612a37611d02565b905080600003612a5e578160206000828254612a539190613d8a565b90915550612a8e9050565b80612a6d600160401b84613c22565b612a779190613c41565b601c6000828254612a889190613d8a565b90915550505b50505050565b6000818152600183016020526040812054612adb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ec6565b506000610ec6565b6001600160a01b03831660009081526001602052604090205481811015612b475760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b612b5184836136c1565b612b5b8383613782565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612ba091815260200190565b60405180910390a350505050565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c1c5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610d53565b60008315612dcf57612c2f6007896126df565b612cc4576001600160a01b03881660009081526003602052604090205442101580612c5c575060275460ff165b612c9d5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401610d53565b602854612caa9042613d8a565b6001600160a01b0389166000908152600360205260409020555b601854861115612d085760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610d53565b612d13600d896126df565b15612d575760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612d679190613d8a565b4211158015612d7857506013546001145b15612dbe57612d88600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a54610100900460ff166131e3565b8415612fe057612de06009886126df565b612e73576001600160a01b03871660009081526004602052604090205442101580612e0d575060295460ff165b612e4c5760405162461bcd60e51b815260206004820152601060248201526f427579657220696e206275794c6f636b60801b6044820152606401610d53565b602a54612e599042613d8a565b6001600160a01b0388166000908152600460205260409020555b601754612e808785613d8a565b1115612ec15760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b601954861115612f1e5760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610d53565b612f29600d886126df565b15612f6d5760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610d53565b601254601154612f7d9190613d8a565b4211158015612f8e57506013546001145b15612fd457612f9e600d88612185565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5460ff166131e3565b612fec6009600a613d7b565b8611612ffb57612ffb88612701565b6017546130088785613d8a565b11156130495760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610d53565b6130546007896126df565b6130be576001600160a01b03881660009081526003602052604090205442101580613081575060275460ff165b6130be5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401610d53565b6130c9600d896126df565b156131165760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610d53565b613121600d886126df565b1561316e5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610d53565b60125460115461317e9190613d8a565b421115801561318f57506013546001145b156131d55761319f600d89612185565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601a5462010000900460ff165b601a546001600160a01b03898116600160301b909204161480159061320b5750602b5460ff16155b801561321a575060255460ff16155b80156132235750835b15613230576132306124f1565b600061324c8783601a60039054906101000a900460ff1661384d565b601a54909150600090613280908990859061327b9060ff6401000000008204811691600160281b900416613da2565b61384d565b9050600061328e8284613d8a565b613298908a613c0b565b90506132a48b8a6136c1565b30600090815260016020526040812080548492906132c3908490613d8a565b9250508190555082601660008282546132dc9190613c0b565b909155506132ec90508a82613782565b896001600160a01b03168b6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161333191815260200190565b60405180910390a35050505050505050505050565b601b5461335e9030906001600160a01b0316836121a1565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061339357613393613f9e565b6001600160a01b03928316602091820292909201810191909152601b54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156133ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134109190613f81565b8160018151811061342357613423613f9e565b6001600160a01b039283166020918202929092010152601b5460405163791ac94760e01b815291169063791ac9479061346990859060009086903090429060040161402d565b600060405180830381600087803b15801561348357600080fd5b505af1158015613497573d6000803e3d6000fd5b505050505050565b80602460008282546134b19190613d8a565b9091555050601b546134ce9030906001600160a01b0316846121a1565b601b5460405163f305d71960e01b81526001600160a01b039091169063f305d71990839061350b9030908790600090819084904290600401613f46565b60606040518083038185885af1158015613529573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611f7b9190614069565b60008181526001830160205260408120548015613631576000613572600183613c0b565b855490915060009061358690600190613c0b565b9050600086600001828154811061359f5761359f613f9e565b90600052602060002001549050808760000184815481106135c2576135c2613f9e565b6000918252602080832090910192909255828152600189019091526040902084905586548790806135f5576135f5614097565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610ec6565b6000915050610ec6565b815460009082106136995760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610d53565b8260000182815481106136ae576136ae613f9e565b9060005260206000200154905092915050565b6001600160a01b0382166000908152600160205260408120546136e5908390613c0b565b90506136f0836114ff565b15613715576001600160a01b0390921660009081526001602052604090209190915550565b600061372084612631565b6001600160a01b0385166000908152600160205260409020839055601c5490915061374c908390613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290612a88908490613d8a565b6001600160a01b0382166000908152600160205260408120546137a6908390613d8a565b90506137b1836114ff565b156137d6576001600160a01b0390921660009081526001602052604090209190915550565b60006137e184612631565b905081601c546137f19190613c22565b6001600160a01b038516600090815260216020908152604080832093909355602290529081208054839290613827908490613d8a565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006127108260ff168460ff16866138659190613c22565b61386f9190613c22565b6138799190613c41565b949350505050565b60006020828403121561389357600080fd5b5035919050565b600060208083528351808285015260005b818110156138c7578581018301518582016040015282016138ab565b818111156138d9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461139c57600080fd5b6000806040838503121561391757600080fd5b8235613922816138ef565b946020939093013593505050565b801515811461139c57600080fd5b60006020828403121561395057600080fd5b813561219a81613930565b60008060006060848603121561397057600080fd5b833561397b816138ef565b9250602084013561398b816138ef565b929592945050506040919091013590565b6000602082840312156139ae57600080fd5b813561219a816138ef565b803560ff811681146139ca57600080fd5b919050565b60008060008060008060c087890312156139e857600080fd5b6139f1876139b9565b95506139ff602088016139b9565b9450613a0d604088016139b9565b9350613a1b606088016139b9565b9250613a29608088016139b9565b9150613a3760a088016139b9565b90509295509295509295565b600060208284031215613a5557600080fd5b61219a826139b9565b60008060408385031215613a7157600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112613aa757600080fd5b813567ffffffffffffffff80821115613ac257613ac2613a80565b604051601f8301601f19908116603f01168101908282118183101715613aea57613aea613a80565b81604052838152866020858801011115613b0357600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060408385031215613b3657600080fd5b823567ffffffffffffffff80821115613b4e57600080fd5b613b5a86838701613a96565b93506020850135915080821115613b7057600080fd5b50613b7d85828601613a96565b9150509250929050565b60008060408385031215613b9a57600080fd5b8235613ba5816138ef565b91506020830135613bb5816138ef565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613c1d57613c1d613bf5565b500390565b6000816000190483118215151615613c3c57613c3c613bf5565b500290565b600082613c5e57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680613c7757607f821691505b602082108103611d6257634e487b7160e01b600052602260045260246000fd5b600181815b80851115613cd2578160001904821115613cb857613cb8613bf5565b80851615613cc557918102915b93841c9390800290613c9c565b509250929050565b600082613ce957506001610ec6565b81613cf657506000610ec6565b8160018114613d0c5760028114613d1657613d32565b6001915050610ec6565b60ff841115613d2757613d27613bf5565b50506001821b610ec6565b5060208310610133831016604e8410600b8410161715613d55575081810a610ec6565b613d5f8383613c97565b8060001904821115613d7357613d73613bf5565b029392505050565b600061219a60ff841683613cda565b60008219821115613d9d57613d9d613bf5565b500190565b600060ff821660ff84168060ff03821115613dbf57613dbf613bf5565b019392505050565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b600060208284031215613e0357600080fd5b5051919050565b600060208284031215613e1c57600080fd5b815161219a81613930565b601f82111561171857600081815260208120601f850160051c81016020861015613e4e5750805b601f850160051c820191505b8181101561349757828155600101613e5a565b815167ffffffffffffffff811115613e8757613e87613a80565b613e9b81613e958454613c63565b84613e27565b602080601f831160018114613ed05760008415613eb85750858301515b600019600386901b1c1916600185901b178555613497565b600085815260208120601f198616915b82811015613eff57888601518255948401946001909101908401613ee0565b5085821015613f1d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018201613f3f57613f3f613bf5565b5060010190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600060208284031215613f9357600080fd5b815161219a816138ef565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613fed5781516001600160a01b031687529582019590820190600101613fc8565b509495945050505050565b8481526080602082015260006140116080830186613fb4565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061404c60a0830186613fb4565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561407e57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfea264697066735822122022badab2831e4d438794881c2981cb222ee6783abd1a502735c73de0d9b3255064736f6c634300080f0033

Verified Source Code Full Match

Compiler: v0.8.15+commit.e14f2714 EVM: london Optimization: Yes (200 runs)
ZeroInu.sol 1616 lines
/**

Zero Inu

https://https://zeroinuofficial.com/

https://t.me/ZeroInu

/**


Total Supply: 1,000,000
Max Wallet: 4% (40,000 Tokens)
Max Buy: 4% (40,000 Tokens)
Max Sell: 4% (40,000 Tokens)
Buy / Sell Tax: 7% 
- 4% Marketing
- 2% LP
- 1% Burn


*/

pragma solidity ^0.8.15;

// SPDX-License-Identifier: Unlicensed

interface IERC20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IUniswapV2ERC20 {
    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;
}

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 IUniswapV2Router01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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;
}



/**
 * @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 {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _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() == msg.sender, "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 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 onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

////////// Contract /////////////

contract ZeroInu is IERC20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;
    
    event antiBotBan(address indexed value);

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _sellLock;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromSellLock;
    EnumerableSet.AddressSet private _excludedFromBuyLock;
    EnumerableSet.AddressSet private _excludedFromStaking;

    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string public _name = "ZeroInu";
    string public _symbol = "$ZINU";
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 1000000 * 10**_decimals;//equals 1,000,000 tokens 1000000

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
    uint256 public autoBanTime = 20; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
    uint256 public enableAutoBlacklist = 0; //Leave 1 if using, set to 0 if not using.
    //Divider for the MaxBalance based on circulating Supply (4%)
    uint8 public constant BalanceLimitDivider=24;
    //Divider for sellLimit based on circulating Supply (4%))
    uint16 public constant SellLimitDivider=24;
    //Sellers get locked for MaxSellLockTime (put in seconds, works better especially if changing later) so they can't dump repeatedly
    uint16 public constant MaxSellLockTime= 0 seconds;
    //Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 0 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public Marketing2=payable(0xBD42Fe678e65aC914D9bC380ab8e492107c17b5b);
    address public Marketing=payable(0xd02d752E31ED204CF43624cE8E84ACfdFbe9c928);
    //MainNet
    address private constant UniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
    uint256 private MaxBuy = 40000 * 10**_decimals; // 40,000 tokens
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _stakingTax;

       
    address private _uniswapv2PairAddress; 
    IUniswapV2Router02 private  _uniswapv2Router;
    
    //Checks if address is in Team, is needed to give Team access even if contract is renounced
    //Team doesn't have access to critical Functions that could turn this into a Rugpull(Exept liquidity unlocks)
    function _isTeam(address addr) private view returns (bool){
        return addr==owner()||addr==Marketing2||addr==Marketing;
    }

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // UniswapV2 Router
        _uniswapv2Router = IUniswapV2Router02(UniswapV2Router);
        //Creates a UniswapV2 Pair
        _uniswapv2PairAddress = IUniswapV2Factory(_uniswapv2Router.factory()).createPair(address(this), _uniswapv2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;

        //Sets sellLockTime
        sellLockTime=0;
        
        //Sets buyLockTime
        buyLockTime=0;

        //Set Starting Tax 
        
        _buyTax=7;
        _sellTax=7;
        _transferTax=7;

        _burnTax=10;
        _liquidityTax=10;
        _stakingTax=70;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(Marketing2);
        _excluded.add(Marketing);
        _excluded.add(msg.sender);
        //excludes UniswapV2 Router, pair, contract and burn address from staking
        _excludedFromStaking.add(address(_uniswapv2Router));
        _excludedFromStaking.add(_uniswapv2PairAddress);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(0x000000000000000000000000000000000000dEaD);
    
    }

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between UniswapV2Router and UniswapV2Pair are tax and lock free
        address uniswapv2Router=address(_uniswapv2Router);
        bool isLiquidityTransfer = ((sender == _uniswapv2PairAddress && recipient == uniswapv2Router) 
        || (recipient == _uniswapv2PairAddress && sender == uniswapv2Router));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_uniswapv2PairAddress|| sender == uniswapv2Router;
        bool isSell=recipient==_uniswapv2PairAddress|| recipient == uniswapv2Router;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP and stakingETH, and autostakes
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            if(!_excludedFromSellLock.contains(sender)){
                 //If seller sold less than sellLockTime(2h 50m) ago, sell is declined, can be disabled by Team         
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock");
                //Sets the time sellers get locked(2 hours 50 mins by default)
                _sellLock[sender]=block.timestamp+sellLockTime;
            }
            //Sells can't exceed the sell limit(21,000 Tokens at start, can be updated to circulating supply)
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_sellTax;


        } else if(isBuy){
            if(!_excludedFromBuyLock.contains(recipient)){
                 //If buyer bought less than buyLockTime(2h 50m) ago, buy is declined, can be disabled by Team         
                require(_buyLock[recipient]<=block.timestamp||buyLockDisabled,"Buyer in buyLock");
                //Sets the time buyers get locked(2 hours 50 mins by default)
                _buyLock[recipient]=block.timestamp+buyLockTime;
            }
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            require(amount <= MaxBuy,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }

            tax=_buyTax;

        } else {//Transfer
            //withdraws ETH when sending less or equal to 1 Token
            //that way you can withdraw without connecting to any dApp.
            //might needs higher gas limit
            if(amount<=10**(_decimals)) claimETH(sender);
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            //Transfers are disabled in sell lock, this doesn't stop someone from transfering before
            //selling, but there is no satisfying solution for that, and you would need to pax additional tax
            if(!_excludedFromSellLock.contains(sender))
                require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock");
            
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");

            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }

            tax=_transferTax;

        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapv2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapv2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        //staking and liquidity Tax get treated the same, only during conversion they get split
        uint256 contractToken=_calculateFee(amount, tax, _stakingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token and handles staking
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token and handles staking
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers and autostakes
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token and handles staking
        _removeToken(sender,amount);
        //Adds token and handles staking
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }

     //ETH Autostake/////////////////////////////////////////////////////////////////////////////////////////
       //Autostake uses the balances of each holder to redistribute auto generated ETH.
    //Each transaction _addToken and _removeToken gets called for the transaction amount
    //WithdrawETH can be used for any holder to withdraw ETH at any time, like true Staking,
    //so unlike MRAT clones you can leave and forget your Token and claim after a while

    //lock for the withdraw
    bool private _isWithdrawing;
    //Multiplier to add some accuracy to profitPerShare
    uint256 private constant DistributionMultiplier = 2**64;
    //profit for each share a holder holds, a share equals a token.
    uint256 public profitPerShare;
    //the total reward distributed through staking, for tracking purposes
    uint256 public totalStakingReward;
    //the total payout through staking, for tracking purposes
    uint256 public totalPayouts;
    
  
    uint8 public marketingShare=100;
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //Mapping of the already paid out(or missed) shares of each staker
    mapping(address => uint256) private alreadyPaidShares;
    //Mapping of shares that are reserved for payout
    mapping(address => uint256) private toBePaid;

    //Contract, uniswapv2 and burnAddress are excluded, other addresses like CEX
    //can be manually excluded, excluded list is limited to 30 entries to avoid a
    //out of gas exeption during sells
    function isExcludedFromStaking(address addr) public view returns (bool){
        return _excludedFromStaking.contains(addr);
    }

    //Check if address is blacklisted
    function isBlacklisted(address addr) public view returns (bool){
        return _isBlacklisted.contains(addr);
    }
    //Total shares equals circulating supply minus excluded Balances
    function _getTotalShares() public view returns (uint256){
        uint256 shares=_circulatingSupply;
        //substracts all excluded from shares, excluded list is limited to 30
        // to avoid creating a Honeypot through OutOfGas exeption
        for(uint i=0; i<_excludedFromStaking.length(); i++){
            shares-=_balances[_excludedFromStaking.at(i)];
        }
        return shares;
    }

    //adds Token to balances, adds new ETH to the toBePaid mapping and resets staking
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token, adds ETH to the toBePaid mapping and resets staking
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        
        if(isExcludedFromStaking(addr)){
           _balances[addr]=newAmount;
           return;
        }
        
        //gets the payout before the change
        uint256 payment=_newDividentsOf(addr);
        //sets newBalance
        _balances[addr]=newAmount;
        //resets dividents to 0 for newAmount
        alreadyPaidShares[addr] = profitPerShare * newAmount;
        //adds dividents to the toBePaid mapping
        toBePaid[addr]+=payment; 
    }
    
    
    //gets the not dividents of a staker that aren't in the toBePaid mapping 
    //returns wrong value for excluded accounts
    function _newDividentsOf(address staker) private view returns (uint256) {
        uint256 fullPayout = profitPerShare * _balances[staker];
        // if theres an overflow for some unexpected reason, return 0, instead of 
        // an exeption to still make trades possible
        if(fullPayout<alreadyPaidShares[staker]) return 0;
        return (fullPayout - alreadyPaidShares[staker]) / DistributionMultiplier;
    }

    //distributes eth between marketing share and dividents 
    function _distributeStake(uint256 ETHamount) private {
        // Deduct marketing Tax
        uint256 marketingSplit = (ETHamount * marketingShare) / 100;
        uint256 amount = ETHamount - marketingSplit;

       marketingBalance+=marketingSplit;
       
        if (amount > 0) {
            totalStakingReward += amount;
            uint256 totalShares=_getTotalShares();
            //when there are 0 shares, add everything to marketing budget
            if (totalShares == 0) {
                marketingBalance += amount;
            }else{
                //Increases profit per share based on current total shares
                profitPerShare += ((amount * DistributionMultiplier) / totalShares);
            }
        }
    }
    event OnWithdrawETH(uint256 amount, address recipient);
    
    //withdraws all dividents of address
    function claimETH(address addr) private{
        require(!_isWithdrawing);
        _isWithdrawing=true;
        uint256 amount;
        if(isExcludedFromStaking(addr)){
            //if excluded just withdraw remaining toBePaid ETH
            amount=toBePaid[addr];
            toBePaid[addr]=0;
        }
        else{
            uint256 newAmount=_newDividentsOf(addr);
            //sets payout mapping to current amount
            alreadyPaidShares[addr] = profitPerShare * _balances[addr];
            //the amount to be paid 
            amount=toBePaid[addr]+newAmount;
            toBePaid[addr]=0;
        }
        if(amount==0){//no withdraw if 0 amount
            _isWithdrawing=false;
            return;
        }


        totalPayouts+=amount;
        address[] memory path = new address[](2);
        path[0] = _uniswapv2Router.WETH(); //ETH
        path[1] = RewardsAddress; //USDC Rewards - Option to enable.

        _uniswapv2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
        0,
        path,
        addr,
        block.timestamp);
        
        emit OnWithdrawETH(amount, addr);
        _isWithdrawing=false;
    }
        //Launch Rewards Address - Can be Changed - Rewards not enabled at launch.
    address public RewardsAddress=(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); //USDC
    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////



    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }
    uint256 currentAmountToSwap = 4000 * 10**_decimals;  // 4,000 tokens (0.4%)
    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_liquidityTax+_stakingTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance, so swap won't touch any staked ETH
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for Staking
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining ETH between stakers and Marketing
        _distributeStake(distributeETH);
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapv2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapv2Router.WETH();

        _uniswapv2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private {
        totalLPETH+=ethamount;
        _approve(address(this), address(_uniswapv2Router), tokenamount);
        _uniswapv2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
 ...

// [truncated — 64476 bytes total]

Read Contract

BalanceLimitDivider 0x311a8697 → uint8
InitialSupply 0x1eb25d13 → uint256
Marketing 0xdb886f23 → address
Marketing2 0x75a1017c → address
MaxBuyLockTime 0x5c69f690 → uint16
MaxSellLockTime 0x3478154b → uint16
RewardsAddress 0xc054f2f4 → address
SellLimitDivider 0x0fd99e16 → uint16
_getTotalShares 0xe69e03ee → uint256
_name 0xd28d8852 → string
_symbol 0xb09f1266 → string
allowance 0xdd62ed3e → uint256
autoBanTime 0x269a6aae → uint256
balanceLimit 0x762bb282 → uint256
balanceOf 0x70a08231 → uint256
buyLockDisabled 0x3054f8a3 → bool
buyLockTime 0x44f3c83a → uint256
decimals 0x313ce567 → uint8
enableAutoBlacklist 0x3da56f18 → uint256
getBurnedTokens 0xc3f4f54f → uint256
getDividents 0x32ac487f → uint256
getLimits 0x6f89e409 → uint256, uint256
getLiquidityReleaseTimeInSeconds 0xc3a3c032 → uint256
getOwner 0x893d20e8 → address
getTaxes 0x2973ef2d → uint256, uint256, uint256, uint256, uint256, uint256
getcurrentAmountToSwap 0x5b80f625 → uint256
isBlacklisted 0xfe575a87 → bool
isExcludedFromStaking 0x7335307b → bool
manualConversion 0x86d0ada8 → bool
marketingBalance 0x58e55365 → uint256
marketingShare 0x09218ee7 → uint8
name 0x06fdde03 → string
owner 0x8da5cb5b → address
profitPerShare 0x8650e92a → uint256
sellLimit 0x4f91e48c → uint256
sellLockDisabled 0x887c60fb → bool
sellLockTime 0xf88b0e46 → uint256
symbol 0x95d89b41 → string
totalLPETH 0x3cc39b7a → uint256
totalPayouts 0x4089b170 → uint256
totalStakingReward 0xf00df365 → uint256
totalSupply 0x18160ddd → uint256
tradingEnabled 0x4ada218b → bool

Write Contract 34 functions

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

AddWalletExclusion 0xcd979a7e
address exclusionAdd
CollectMarketingETH 0xfe002ec2
No parameters
REL 0x998a8668
No parameters
REM 0xebddcc1d
bool addToStaking
Rewards 0xc2808954
No parameters
SetupEnableTrading 0x7b9e987a
No parameters
SetupLiquidityTokenAddress 0x4cdaf0ae
address liquidityTokenAddress
TeamChangeMarketing 0xb58a56cd
address newMarketing
TeamChangeMarketing2 0x3ab0e29d
address newMarketing2
TeamChangeMarketingShare 0x73ddf08e
uint8 newShare
TeamChangeMaxBuy 0x6ea4caab
uint256 newMaxBuy
TeamChangeRewardsAddress 0xf0cc7612
address newRewardsAddress
TeamCollectRemainingETH 0x5ebbc3ca
No parameters
TeamCollectXMarketingETH 0x0241047b
uint256 amount
TeamCreateLPandETH 0x243b529a
No parameters
TeamDisableBuyLock 0xb766a386
bool disabled
TeamDisableSellLock 0x14e91377
bool disabled
TeamExtendLiquidityLock 0x643daaea
uint256 secondsUntilUnlock
TeamSetBuyLockTime 0xe2fd002a
uint256 buyLockSeconds
TeamSetSellLockTime 0xd51f383b
uint256 sellLockSeconds
TeamSetTaxes 0x57ad67d1
uint8 burnTaxes
uint8 liquidityTaxes
uint8 stakingTaxes
uint8 buyTax
uint8 sellTax
uint8 transferTax
TeamSwitchManualETHConversion 0x9bf65770
bool manual
TeamUpdateAmountToSwap 0xd11edf74
uint256 newSwapAmount
TeamUpdateLimits 0x9fa62d5f
uint256 newBalanceLimit
uint256 newSellLimit
addAddressToBlacklist 0xf2c816ae
address blacklistedAddress
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
removeAddressFromBlacklist 0x35e82f3a
address blacklistedAddress
renounceOwnership 0x715018a6
No parameters
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateTokenDetails 0xd0291d66
string newName
string newSymbol

Recent Transactions

No transactions found for this address