Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xAE36155a55F04a696b8362777620027882B31dB5
Balance 0.847962 ETH
Nonce 1
Code Size 10975 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

10975 bytes
0x6080604052600436106103035760003560e01c80637d1db4a511610190578063c5930482116100dc578063dee6a01611610095578063ef0658f21161006f578063ef0658f214610910578063f0f165af14610926578063f2fde38b14610946578063fe575a871461096657600080fd5b8063dee6a016146108b0578063ea2f0b37146108d0578063ec28438a146108f057600080fd5b8063c59304821461080a578063ca48dd7314610824578063cbff46171461083a578063d0d41fe114610850578063dd46706414610870578063dd62ed3e1461089057600080fd5b806395d89b4111610149578063a69df4b511610123578063a69df4b514610795578063a9059cbb146107aa578063b24cf5d7146107ca578063c49b9a80146107ea57600080fd5b806395d89b411461074b578063a073d37f14610760578063a457c2d71461077557600080fd5b80637d1db4a514610689578063842884171461069f578063845a51ec146106d85780638a8c523c146106f85780638da5cb5b1461070d578063929793911461072b57600080fd5b8063437823ec1161024f578063557ed1ba116102085780636c0a24eb116101e25780636c0a24eb1461060857806370a082311461061e578063715018a614610654578063728d41c91461066957600080fd5b8063557ed1ba146105c0578063602bc62b146105d3578063690d8320146105e857600080fd5b8063437823ec146104e557806349bd5a5e146105055780634a74bb02146105255780634ada218b146105465780634c14c0b3146105675780635342acb41461058757600080fd5b80632d5a5d34116102bc5780633950935111610296578063395093511461046f5780633a40799e1461048f5780633ad10ef6146104a55780634127bcc6146104c557600080fd5b80632d5a5d341461040b578063313ce5671461042d578063382e901d1461044f57600080fd5b806306fdde031461030f578063095ea7b31461033a5780631694505e1461036a57806318160ddd146103b657806323b872dd146103d5578063283f7820146103f557600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5061032461099f565b604051610331919061287e565b60405180910390f35b34801561034657600080fd5b5061035a61035536600461272c565b610a31565b6040519015158152602001610331565b34801561037657600080fd5b5061039e7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610331565b3480156103c257600080fd5b506008545b604051908152602001610331565b3480156103e157600080fd5b5061035a6103f03660046126bd565b610a4b565b34801561040157600080fd5b506103c760105481565b34801561041757600080fd5b5061042b6104263660046126fe565b610a6f565b005b34801561043957600080fd5b50600c5460405160ff9091168152602001610331565b34801561045b57600080fd5b5061042b61046a366004612684565b610b93565b34801561047b57600080fd5b5061035a61048a36600461272c565b610cab565b34801561049b57600080fd5b506103c7600e5481565b3480156104b157600080fd5b5060045461039e906001600160a01b031681565b3480156104d157600080fd5b5061042b6104e03660046127c4565b610ccd565b3480156104f157600080fd5b5061042b61050036600461264a565b610dc0565b34801561051157600080fd5b5060175461039e906001600160a01b031681565b34801561053157600080fd5b5060175461035a90600160b01b900460ff1681565b34801561055257600080fd5b5060175461035a90600160a01b900460ff1681565b34801561057357600080fd5b5061042b6105823660046126fe565b610e0e565b34801561059357600080fd5b5061035a6105a236600461264a565b6001600160a01b031660009081526009602052604090205460ff1690565b3480156105cc57600080fd5b50426103c7565b3480156105df57600080fd5b506002546103c7565b3480156105f457600080fd5b5061042b61060336600461264a565b610ecb565b34801561061457600080fd5b506103c760155481565b34801561062a57600080fd5b506103c761063936600461264a565b6001600160a01b031660009081526005602052604090205490565b34801561066057600080fd5b5061042b610fb6565b34801561067557600080fd5b5061042b610684366004612792565b611018565b34801561069557600080fd5b506103c760145481565b3480156106ab57600080fd5b5061035a6106ba36600461264a565b6001600160a01b031660009081526018602052604090205460ff1690565b3480156106e457600080fd5b5060035461039e906001600160a01b031681565b34801561070457600080fd5b5061042b611047565b34801561071957600080fd5b506000546001600160a01b031661039e565b34801561073757600080fd5b5061042b610746366004612792565b6110d2565b34801561075757600080fd5b5061032461113d565b34801561076c57600080fd5b506016546103c7565b34801561078157600080fd5b5061035a61079036600461272c565b61114c565b3480156107a157600080fd5b5061042b6111c7565b3480156107b657600080fd5b5061035a6107c536600461272c565b6112cd565b3480156107d657600080fd5b5061042b6107e536600461264a565b6112db565b3480156107f657600080fd5b5061042b610805366004612758565b611327565b34801561081657600080fd5b5060135461035a9060ff1681565b34801561083057600080fd5b506103c7600f5481565b34801561084657600080fd5b506103c760125481565b34801561085c57600080fd5b5061042b61086b36600461264a565b6113a9565b34801561087c57600080fd5b5061042b61088b366004612792565b6113f5565b34801561089c57600080fd5b506103c76108ab366004612684565b61147a565b3480156108bc57600080fd5b5061042b6108cb366004612758565b6114a5565b3480156108dc57600080fd5b5061042b6108eb36600461264a565b61153f565b3480156108fc57600080fd5b5061042b61090b366004612792565b61158a565b34801561091c57600080fd5b506103c7600d5481565b34801561093257600080fd5b5061042b610941366004612792565b6115b9565b34801561095257600080fd5b5061042b61096136600461264a565b6115e8565b34801561097257600080fd5b5061035a61098136600461264a565b6001600160a01b031660009081526007602052604090205460ff1690565b6060600a80546109ae906129fc565b80601f01602080910402602001604051908101604052809291908181526020018280546109da906129fc565b8015610a275780601f106109fc57610100808354040283529160200191610a27565b820191906000526020600020905b815481529060010190602001808311610a0a57829003601f168201915b5050505050905090565b600033610a3f8185856116c0565b60019150505b92915050565b600033610a598582856117e4565b610a6485858561185e565b506001949350505050565b6000546001600160a01b03163314610aa25760405162461bcd60e51b8152600401610a99906128d6565b60405180910390fd5b6001600160a01b03821660009081526007602052604090205460ff1615158115151415610ae15760405162461bcd60e51b8152600401610a99906128b1565b6017546001600160a01b0383811691161415610b3f5760405162461bcd60e51b815260206004820152601e60248201527f63616e206e6f7420626c61636b6c69737420756e6973776170207061697200006044820152606401610a99565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917f1d3a0f423a29cb00c6d792b5a695e34683386c493edbcf344426b5da5adf0e4491a35050565b6000546001600160a01b03163314610bbd5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b038216301415610c165760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f74207769746864726177207468697320746f6b656e00000000006044820152606401610a99565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015610c5857600080fd5b505afa158015610c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9091906127ab565b9050610ca66001600160a01b0384168383611bef565b505050565b600033610a3f818585610cbe838361147a565b610cc89190612960565b6116c0565b6000546001600160a01b03163314610cf75760405162461bcd60e51b8152600401610a99906128d6565b6000610d0d82610d078686611c41565b90611c41565b905060c8811115610d605760405162461bcd60e51b815260206004820152601e60248201527f63616e7420736574206665657320746f206d6f7265207468616e2032302500006044820152606401610a99565b600f849055600e839055600d8290556010805460115581905560408051858152602081018590529081018390527fcf8a1e1d5f09cf3c97dbb653cd9a4d7aace9292fbc1bb8211febf2d400febbdd9060600160405180910390a150505050565b6000546001600160a01b03163314610dea5760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000546001600160a01b03163314610e385760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03821660009081526018602052604090205460ff1615158115151415610e775760405162461bcd60e51b8152600401610a99906128b1565b6001600160a01b038216600081815260186020526040808220805460ff191685151590811790915590519092917f8c55f11b6d19d56c8b1800eb4e8b56441df993e14634fe86cd24b1c9bff545d391a35050565b6000546001600160a01b03163314610ef55760405162461bcd60e51b8152600401610a99906128d6565b6000816001600160a01b03164760405160006040518083038185875af1925050503d8060008114610f42576040519150601f19603f3d011682016040523d82523d6000602084013e610f47565b606091505b5050905080610fb25760405162461bcd60e51b815260206004820152603160248201527f756e61626c6520746f2073656e642076616c75652c20726563697069656e74206044820152701b585e481a185d99481c995d995c9d1959607a1b6064820152608401610a99565b5050565b6000546001600160a01b03163314610fe05760405162461bcd60e51b8152600401610a99906128d6565b600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146110425760405162461bcd60e51b8152600401610a99906128d6565b601555565b6000546001600160a01b031633146110715760405162461bcd60e51b8152600401610a99906128d6565b601754600160a01b900460ff16156110bd5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a99565b6017805460ff60a01b1916600160a01b179055565b6000546001600160a01b031633146110fc5760405162461bcd60e51b8152600401610a99906128d6565b60125460408051918252602082018390527fbd246d9b8c3d3843cdfe86c1eef754015151cca52383afcf47cfe2e30389233e910160405180910390a1601255565b6060600b80546109ae906129fc565b6000338161115a828661147a565b9050838110156111ba5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a99565b610a6482868684036116c0565b6001546001600160a01b0316331461122d5760405162461bcd60e51b815260206004820152602360248201527f596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6044820152626f636b60e81b6064820152608401610a99565b600254421161127e5760405162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c20372064617973006044820152606401610a99565b600154600080546040516001600160a01b039384169390911691600080516020612a8a83398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600033610a3f81858561185e565b6000546001600160a01b031633146113055760405162461bcd60e51b8152600401610a99906128d6565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146113515760405162461bcd60e51b8152600401610a99906128d6565b60178054821515600160b01b0260ff60b01b199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061139e90831515815260200190565b60405180910390a150565b6000546001600160a01b031633146113d35760405162461bcd60e51b8152600401610a99906128d6565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461141f5760405162461bcd60e51b8152600401610a99906128d6565b60008054600180546001600160a01b03199081166001600160a01b0384161790915516905561144e8142612960565b600255600080546040516001600160a01b0390911690600080516020612a8a833981519152908390a350565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b6000546001600160a01b031633146114cf5760405162461bcd60e51b8152600401610a99906128d6565b60135460ff16151581151514156114f85760405162461bcd60e51b8152600401610a99906128b1565b6013805460ff19168215159081179091556040514381527f0ca71f7802e05294b7e4e083e369742fd573c5868ff991712ae1ee8af26233159060200160405180910390a250565b6000546001600160a01b031633146115695760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b031633146115b45760405162461bcd60e51b8152600401610a99906128d6565b601455565b6000546001600160a01b031633146115e35760405162461bcd60e51b8152600401610a99906128d6565b601655565b6000546001600160a01b031633146116125760405162461bcd60e51b8152600401610a99906128d6565b6001600160a01b0381166116775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a99565b600080546040516001600160a01b0380851693921691600080516020612a8a83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166117225760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a99565b6001600160a01b0382166117835760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a99565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006117f0848461147a565b90506000198114611858578181101561184b5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a99565b61185884848484036116c0565b50505050565b6001600160a01b0383166118c25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a99565b6001600160a01b03831660009081526007602052604090205460ff16156119195760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03821660009081526007602052604090205460ff16156119705760405162461bcd60e51b815260206004820152600b60248201526a139bdd08105b1b1bddd95960aa1b6044820152606401610a99565b6001600160a01b03831660009081526009602052604090205460019060ff16806119b257506001600160a01b03831660009081526009602052604090205460ff165b156119bf57506000611b09565b601454821115611a225760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610a99565b601754600160a01b900460ff16611a745760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81a5cc81b9bdd081cdd185c9d195960521b6044820152606401610a99565b6001600160a01b03831660009081526018602052604090205460ff16611b09576015546001600160a01b038416600090815260056020526040902054611abb908490612960565b1115611b095760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d697400000000006044820152606401610a99565b3060009081526005602052604090205460165481108015908190611b375750601754600160a81b900460ff16155b8015611b4c5750601754600160b01b900460ff165b8015611b6657506017546001600160a01b03878116911614155b15611b7f578015611b7f576016549150611b7f82611ca7565b6001600160a01b0380861660009081526018602052604080822054928916825290205460ff9182169116158015611bb4575080155b15611bbe57600093505b60135460ff16158015611bcf575080155b15611bd957600093505b611be68787878785611dbc565b50505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610ca6908490611f42565b600080611c4e8385612960565b905083811015611ca05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a99565b9392505050565b6017805460ff60a81b1916600160a81b179055601054600f54600091611cdd91600291611cd79182908790612014565b90612093565b90506000611ceb83836120d5565b905047611cf782612117565b6000611d0347836120d5565b90506000611d29611d206002600f5461209390919063ffffffff16565b601054906120d5565b90508415611d5857611d5885611d536002611cd785611cd7600f548961201490919063ffffffff16565b61231f565b600354600d54611d82916001600160a01b031690611d7d908490611cd7908790612014565b61240e565b600454600e54611da7916001600160a01b031690611d7d908490611cd7908790612014565b50506017805460ff60a81b1916905550505050565b81611dc957611dc9612444565b6001600160a01b03851660009081526005602052604090205483811015611e415760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a99565b6000611e4d858461245a565b90506000611e5b82876129b9565b6001600160a01b03808a166000908152600560205260408082208a88039055918a16815281812080548401905530815220805484019055905084611ea457611ea4601154601055565b866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611ee991815260200190565b60405180910390a38115611f385760405182815230906001600160a01b038a16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b5050505050505050565b6000611f97826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166124a79092919063ffffffff16565b805190915015610ca65780806020019051810190611fb59190612775565b610ca65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a99565b60008261202357506000610a45565b600061202f838561299a565b90508261203c8583612978565b14611ca05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a99565b6000611ca083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506124b6565b6000611ca083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ed565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061214c5761214c612a4d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156121c557600080fd5b505afa1580156121d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121fd9190612667565b8160018151811061221057612210612a4d565b60200260200101906001600160a01b031690816001600160a01b03168152505061225b307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116c0565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906122b0908590600090869030904290600401612924565b600060405180830381600087803b1580156122ca57600080fd5b505af11580156122de573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161231392919061290b565b60405180910390a15050565b61234a307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846116c0565b60405163f305d71960e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c4016060604051808303818588803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061240791906127f0565b5050505050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610ca6573d6000803e3d6000fd5b60105461244d57565b6010805460115560009055565b6000806124786103e8611cd76010548761201490919063ffffffff16565b905082612485578061249f565b61249f600a611cd76012548461201490919063ffffffff16565b949350505050565b606061249f848460008561251e565b600081836124d75760405162461bcd60e51b8152600401610a99919061287e565b5060006124e48486612978565b95945050505050565b600081848411156125115760405162461bcd60e51b8152600401610a99919061287e565b5060006124e484866129b9565b606061252985612611565b6125755760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a99565b600080866001600160a01b031685876040516125919190612862565b60006040518083038185875af1925050503d80600081146125ce576040519150601f19603f3d011682016040523d82523d6000602084013e6125d3565b606091505b509150915081156125e757915061249f9050565b8051156125f75780518082602001fd5b8360405162461bcd60e51b8152600401610a99919061287e565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061249f575050151592915050565b60006020828403121561265c57600080fd5b8135611ca081612a63565b60006020828403121561267957600080fd5b8151611ca081612a63565b6000806040838503121561269757600080fd5b82356126a281612a63565b915060208301356126b281612a63565b809150509250929050565b6000806000606084860312156126d257600080fd5b83356126dd81612a63565b925060208401356126ed81612a63565b929592945050506040919091013590565b6000806040838503121561271157600080fd5b823561271c81612a63565b915060208301356126b281612a7b565b6000806040838503121561273f57600080fd5b823561274a81612a63565b946020939093013593505050565b60006020828403121561276a57600080fd5b8135611ca081612a7b565b60006020828403121561278757600080fd5b8151611ca081612a7b565b6000602082840312156127a457600080fd5b5035919050565b6000602082840312156127bd57600080fd5b5051919050565b6000806000606084860312156127d957600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561280557600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b838110156128575781516001600160a01b031687529582019590820190600101612832565b509495945050505050565b600082516128748184602087016129d0565b9190910192915050565b602081526000825180602084015261289d8160408501602087016129d0565b601f01601f19169190910160400192915050565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b82815260406020820152600061249f604083018461281e565b85815284602082015260a06040820152600061294360a083018661281e565b6001600160a01b0394909416606083015250608001529392505050565b6000821982111561297357612973612a37565b500190565b60008261299557634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156129b4576129b4612a37565b500290565b6000828210156129cb576129cb612a37565b500390565b60005b838110156129eb5781810151838201526020016129d3565b838111156118585750506000910152565b600181811c90821680612a1057607f821691505b60208210811415612a3157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114612a7857600080fd5b50565b8015158114612a7857600080fdfe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0a2646970667358221220fb6281334e7c41a8ec4f00860ef90e49e853a901fb905173b861cf51668c368464736f6c63430008070033

Verified Source Code Partial Match

Compiler: v0.8.7+commit.e28d00a7 EVM: london Optimization: Yes (200 runs)
Kishimoto.sol 957 lines
// SPDX-License-Identifier: Unlicensed

pragma solidity ^0.8.7;

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

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


interface IERC20 {

    function totalSupply() external view returns (uint256);
    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 IERC20Permit {
    
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }


    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

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


    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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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 SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }   
    
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function getUnlockTime() public view returns (uint256) {
        return _lockTime;
    }
    
    function getTime() public view returns (uint256) {
        return block.timestamp;
    }

    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = block.timestamp + time;
        emit OwnershipTransferred(_owner, address(0));
    }
    
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(block.timestamp > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}


interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}


interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}


interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}



interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

contract Kishimoto is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using SafeERC20 for IERC20;
    
    address payable public rewardPoolAddress = payable(0x3cD9C25A96a73A226699C45970485F2dDD360ACE); // reward Pool Address
    address payable public devAddress = payable(0xF55bF7dA3deA7a3D9078150abf3a2637d71d9413); // Dev Address

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

    uint256 private _totalSupply = 100 * 10**9 * 10**9;  // 100 Bn tokens


    mapping (address => bool) private _isExcludedFromFee;

    string private _name = "Kishimoto";
    string private _symbol = "KISHIMOTO";
    uint8 private _decimals = 9;
    
    uint256 public rewardPoolDivisor = 35;
    uint256 public devDivisor = 35;
    uint256 public autoLpDivisor = 10;

    uint256 public _totalFee = 80;  // rewardPoolDivisor + devDivisor + autoLpDivisor
    uint256 private _previousTotalFee = _totalFee;
    uint256 public sellFactor = 10; // divided by 10
    bool public isBuyTaxEnabled = true;

    uint256 public _maxTxAmount = 3 * 10**8 * 10**9;
    uint256 public _maxWalletAmount = 1 * 10**9 * 10**9;
    uint256 private minimumTokensBeforeSwap = 1 * 10**4 * 10**9; 

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public uniswapV2Pair;
    bool public tradingEnabled = false;
    
    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

    mapping (address => bool) private automatedMarketMaker;

    event FeesUpdated(uint256 autoLpDivisor, uint256 devDivisor, uint256 rewardPoolDivisor);
    event SellFactorUpdated(uint256 previousSellFactor, uint256 newSellFactor);
    event BuyTaxEnabled(bool indexed enable, uint256 blockNumber);
    event AutomatedMarketMakerEnable(address indexed account, bool indexed enable);
    event AccountBlacklisted(address indexed account, bool indexed blacklist);

    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    
    event SwapTokensForETH(
        uint256 amountIn,
        address[] path
    );


    
    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }
    
    constructor () {        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        automatedMarketMaker[uniswapV2Pair] = true;

        _balances[owner()] = _totalSupply;
        
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        emit Transfer(address(0), owner(), _totalSupply);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function minimumTokensBeforeSwapAmount() public view returns (uint256) {
        return minimumTokensBeforeSwap;
    }

    function isBlacklisted(address account) external view returns(bool) {
        return _isBlacklisted[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(!_isBlacklisted[from], "Not Allowed");
        require(!_isBlacklisted[to], "Not Allowed");

        bool takeFee = true;
        
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
            takeFee = false;

        } else {
            require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount.");
            require(tradingEnabled, "Trading is not started");
            if (!automatedMarketMaker[to]) {
                require(_balances[to] + amount <= _maxWalletAmount, "Wallet amount exceeds limit");
            }

        }

        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap;
        
        if (overMinimumTokenBalance && !inSwapAndLiquify && swapAndLiquifyEnabled && from != uniswapV2Pair) {
            if (overMinimumTokenBalance) {
                contractTokenBalance = minimumTokensBeforeSwap;
                swapTokens(contractTokenBalance);    
            }
        }
        
        bool isSell = automatedMarketMaker[to];

        if(!automatedMarketMaker[from] && !isSell) {
            takeFee = false;
        }

        if(!isBuyTaxEnabled && !isSell) {
            takeFee = false;
        }
        _tokenTransfer(from,to,amount,takeFee,isSell);
    }

    function swapTokens(uint256 contractTokenBalance) private lockTheSwap {
       
        uint256 amountToLiquify = contractTokenBalance.mul(autoLpDivisor).div(_totalFee).div(2);
        uint256 amountToSwap = contractTokenBalance.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForEth(amountToSwap);
        uint256 transferredBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = _totalFee.sub(autoLpDivisor.div(2));

        // adding liquidity
        if(amountToLiquify > 0) // enabling to set autoLP tax to zero
            addLiquidity(amountToLiquify, transferredBalance.mul(autoLpDivisor).div(totalETHFee).div(2));

        //Send to rewardPool and dev address
        transferToAddressETH(rewardPoolAddress, transferredBalance.mul(rewardPoolDivisor).div(totalETHFee));
        transferToAddressETH(devAddress, transferredBalance.mul(devDivisor).div(totalETHFee));
        
    }
    
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

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

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );
        
        emit SwapTokensForETH(tokenAmount, path);
    }
    
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(this),
            block.timestamp
        );
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount,bool takeFee, bool isSell) private {
        if(!takeFee)
            removeAllFee();
        
        _beforeTokenTransfer(sender, recipient, amount);

        uint256 fromBalance = _balances[sender];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        uint256 fees = calculateTotalFee(amount, isSell);
        uint256 amountToTransfer = amount - fees;
        unchecked {
            _balances[sender] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[recipient] += amountToTransfer;
            _balances[address(this)] += fees;
        }

        if(!takeFee)
            restoreAllFee();

        emit Transfer(sender, recipient, amountToTransfer);
        if(fees > 0) {
            emit Transfer(sender, address(this), fees);
        }

        _afterTokenTransfer(sender, recipient, amount);
        
        
    }
    
    function calculateTotalFee(uint256 _amount, bool _isSell) private view returns (uint256) {
        uint256 fees = _amount.mul(_totalFee).div(10**3);
        return _isSell ? fees.mul(sellFactor).div(10) : fees;
    }
    
    function removeAllFee() private {
        if(_totalFee == 0) return;
        
        _previousTotalFee = _totalFee; 
        _totalFee = 0;
    }
    
    function restoreAllFee() private {
        _totalFee = _previousTotalFee;
    }

    function isAutomatedMarketMaker(address account) external view returns(bool) {
        return automatedMarketMaker[account];
    }

    function enableAutomatedMarketMaker(address account, bool enable) external onlyOwner {
        require (automatedMarketMaker[account] != enable, "Already set");
        automatedMarketMaker[account] = enable;

        emit AutomatedMarketMakerEnable(account, enable);
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }
    
    function excludeFromFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = true;
    }
    
    function includeInFee(address account) public onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    function updateFeeDivisor(uint256 newAutoLpDivisor, uint256 newDevDivisor, uint256 newrewardPoolDivisor) external onlyOwner {
        uint256 newTotalFee = newAutoLpDivisor.add(newDevDivisor).add(newrewardPoolDivisor);
        require( newTotalFee <= 200, "cant set fees to more than 20%");

        autoLpDivisor = newAutoLpDivisor;
        devDivisor = newDevDivisor;
        rewardPoolDivisor = newrewardPoolDivisor;

        _previousTotalFee = _totalFee;
        _totalFee = newTotalFee;

        emit FeesUpdated(newAutoLpDivisor, newDevDivisor, newrewardPoolDivisor);
    }
    
    
    function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() {
        _maxTxAmount = maxTxAmount;
    }
    
    function setMaxWalletLimit(uint256 maxWalletLimit) external onlyOwner() {
        _maxWalletAmount = maxWalletLimit;
    }

    function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner() {
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
    }
    
    function setRewardPoolAddress(address _rewardPoolAddress) external onlyOwner() {
        rewardPoolAddress = payable(_rewardPoolAddress);
    }

    function setDevAddress(address _devAddress) external onlyOwner() {
        devAddress = payable(_devAddress);
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    function updateSellFactor(uint256 _sellFactor) external onlyOwner {
        emit SellFactorUpdated(sellFactor, _sellFactor);

        sellFactor = _sellFactor;
    }

    function setBuyTaxEnabled(bool _enable) external onlyOwner {
        require(isBuyTaxEnabled != _enable, "Already set");
        isBuyTaxEnabled = _enable;

        emit BuyTaxEnabled(_enable, block.number);
    }

    function withdrawUnsupportedTokens(address token, address recipient) external onlyOwner {
        require(token != address(this), "Can not withdraw this token");
        uint256 contractBalance = IERC20(token).balanceOf(address(this));
        IERC20(token).safeTransfer(recipient, contractBalance);
    }

    function enableTrading() external onlyOwner {
        require (!tradingEnabled, "Already enabled");
        tradingEnabled = true;
    }

    function blacklistAccount(address account, bool blacklist) external onlyOwner {
        require (_isBlacklisted[account] != blacklist, "Already set");
        require(account != uniswapV2Pair, "can not blacklist uniswap pair");
        _isBlacklisted[account] = blacklist;

        emit AccountBlacklisted(account, blacklist);
    }

    function transferToAddressETH(address payable recipient, uint256 amount) private {
        recipient.transfer(amount);
    }

    function withdrawETH(address recipient) external onlyOwner {
        (bool success, ) = recipient.call{ value: address(this).balance }("");
        require(success, "unable to send value, recipient may have reverted");
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}


    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
    
     //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}
}

Read Contract

_maxTxAmount 0x7d1db4a5 → uint256
_maxWalletAmount 0x6c0a24eb → uint256
_totalFee 0x283f7820 → uint256
allowance 0xdd62ed3e → uint256
autoLpDivisor 0xca48dd73 → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
devAddress 0x3ad10ef6 → address
devDivisor 0x3a40799e → uint256
getTime 0x557ed1ba → uint256
getUnlockTime 0x602bc62b → uint256
isAutomatedMarketMaker 0x84288417 → bool
isBlacklisted 0xfe575a87 → bool
isBuyTaxEnabled 0xc5930482 → bool
isExcludedFromFee 0x5342acb4 → bool
minimumTokensBeforeSwapAmount 0xa073d37f → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
rewardPoolAddress 0x845a51ec → address
rewardPoolDivisor 0xef0658f2 → uint256
sellFactor 0xcbff4617 → uint256
swapAndLiquifyEnabled 0x4a74bb02 → bool
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
tradingEnabled 0x4ada218b → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address

Write Contract 25 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
blacklistAccount 0x2d5a5d34
address account
bool blacklist
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
enableAutomatedMarketMaker 0x4c14c0b3
address account
bool enable
enableTrading 0x8a8c523c
No parameters
excludeFromFee 0x437823ec
address account
includeInFee 0xea2f0b37
address account
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
lock 0xdd467064
uint256 time
renounceOwnership 0x715018a6
No parameters
setBuyTaxEnabled 0xdee6a016
bool _enable
setDevAddress 0xd0d41fe1
address _devAddress
setMaxTxAmount 0xec28438a
uint256 maxTxAmount
setMaxWalletLimit 0x728d41c9
uint256 maxWalletLimit
setNumTokensSellToAddToLiquidity 0xf0f165af
uint256 _minimumTokensBeforeSwap
setRewardPoolAddress 0xb24cf5d7
address _rewardPoolAddress
setSwapAndLiquifyEnabled 0xc49b9a80
bool _enabled
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
unlock 0xa69df4b5
No parameters
updateFeeDivisor 0x4127bcc6
uint256 newAutoLpDivisor
uint256 newDevDivisor
uint256 newrewardPoolDivisor
updateSellFactor 0x92979391
uint256 _sellFactor
withdrawETH 0x690d8320
address recipient
withdrawUnsupportedTokens 0x382e901d
address token
address recipient

Token Balances (1)

View Transfers →
WETH 0

Recent Transactions

No transactions found for this address