Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x70ab15bC0c8fd8FC7B7e967702c9Cf4925B1DDF7
Balance 0 ETH
Nonce 1
Code Size 14416 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14416 bytes
0x60806040526004361061035d575f3560e01c806375808631116101bd578063b4d4fe02116100f2578063d34628cc11610092578063f270fde41161006d578063f270fde414610ad4578063f2fde38b14610b1e578063f5648a4f14610b3d578063f8686f0714610b51575f80fd5b8063d34628cc14610a78578063dd62ed3e14610a97578063ea6be44b14610ab6575f80fd5b8063c876d0b9116100cd578063c876d0b9146109ed578063cc1776d314610a06578063ccad03e114610a44578063d00efb2f14610a63575f80fd5b8063b4d4fe021461099a578063bedafd01146109b9578063c78d0fa0146109d8575f80fd5b806395d89b411161015d578063a5ece94111610138578063a5ece941146108fb578063a9059cbb1461091a578063ad5c464814610939578063b0249cc61461096c575f80fd5b806395d89b411461089b5780639e93ad8e146108af578063a457c2d7146108dc575f80fd5b8063860a32ec11610198578063860a32ec146108135780638becc57d146108315780638d3e6e40146108505780638da5cb5b1461087e575f80fd5b806375808631146107cc57806380d737ac146107e057806385033762146107f4575f80fd5b80633ad10ef6116102935780635a90a49e116102335780636d7adcad1161020e5780636d7adcad146106fc57806370a0823114610770578063715018a6146107a4578063751039fc146107b8575f80fd5b80635a90a49e14610696578063627e9d8e146106c457806366ebd39a146106dd575f80fd5b8063432e95a51161026e578063432e95a5146105c4578063452ed4f1146105d95780634f7041a51461060c57806353371be01461067d575f80fd5b80633ad10ef61461055a5780633b7104f2146105795780633bbac5791461058d575f80fd5b80632369bf83116102fe578063313ce567116102d9578063313ce567146104e257806331c2d847146104fd57806336e18e191461051c578063395093511461053b575f80fd5b80632369bf831461048557806323b872dd146104a4578063286965a7146104c3575f80fd5b80630758d924116103395780630758d924146103e6578063095ea7b31461041957806318160ddd146104485780632104591814610466575f80fd5b8062ae3bf814610368578063019b15761461038957806306fdde03146103c5575f80fd5b3661036457005b5f80fd5b348015610373575f80fd5b50610387610382366004613222565b610b65565b005b348015610394575f80fd5b50600c546103a8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103d0575f80fd5b506103d9610cb6565b6040516103bc9190613242565b3480156103f1575f80fd5b506103a87f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610424575f80fd5b50610438610433366004613277565b610d46565b60405190151581526020016103bc565b348015610453575f80fd5b506002545b6040519081526020016103bc565b348015610471575f80fd5b5061038761048036600461329f565b610d5f565b348015610490575f80fd5b5061038761049f366004613222565b610eaa565b3480156104af575f80fd5b506104386104be3660046132b6565b610f1c565b3480156104ce575f80fd5b506103876104dd366004613306565b610f3f565b3480156104ed575f80fd5b50604051601281526020016103bc565b348015610508575f80fd5b5061038761051736600461335a565b6110dc565b348015610527575f80fd5b50610387610536366004613422565b611160565b348015610546575f80fd5b50610438610555366004613277565b611278565b348015610565575f80fd5b50600b546103a8906001600160a01b031681565b348015610584575f80fd5b50610387611299565b348015610598575f80fd5b506104386105a7366004613222565b6001600160a01b03165f9081526017602052604090205460ff1690565b3480156105cf575f80fd5b5061045860135481565b3480156105e4575f80fd5b506103a87f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d381565b348015610617575f80fd5b50600d5461064a906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b604080516001600160401b03958616815293851660208501529184169183019190915290911660608201526080016103bc565b348015610688575f80fd5b506008546104389060ff1681565b3480156106a1575f80fd5b506104386106b0366004613222565b60066020525f908152604090205460ff1681565b3480156106cf575f80fd5b506011546104389060ff1681565b3480156106e8575f80fd5b506103876106f7366004613422565b61131a565b348015610707575f80fd5b50600f5461073b906001600160501b0380821691600160501b8104821691600160a01b82041690600160f01b900460ff1684565b6040516103bc94939291906001600160501b039485168152928416602084015292166040820152901515606082015260800190565b34801561077b575f80fd5b5061045861078a366004613222565b6001600160a01b03165f9081526020819052604090205490565b3480156107af575f80fd5b5061038761142e565b3480156107c3575f80fd5b506103876114a1565b3480156107d7575f80fd5b50610387611541565b3480156107eb575f80fd5b506103876116e6565b3480156107ff575f80fd5b5061038761080e366004613222565b61177b565b34801561081e575f80fd5b5060115461043890610100900460ff1681565b34801561083c575f80fd5b5061038761084b366004613306565b6117ed565b34801561085b575f80fd5b5061043861086a366004613222565b60076020525f908152604090205460ff1681565b348015610889575f80fd5b506005546001600160a01b03166103a8565b3480156108a6575f80fd5b506103d961198a565b3480156108ba575f80fd5b506108c461271081565b6040516001600160401b0390911681526020016103bc565b3480156108e7575f80fd5b506104386108f6366004613277565b611999565b348015610906575f80fd5b50600a546103a8906001600160a01b031681565b348015610925575f80fd5b50610438610934366004613277565b611a13565b348015610944575f80fd5b506103a87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610977575f80fd5b50610438610986366004613222565b60096020525f908152604090205460ff1681565b3480156109a5575f80fd5b506103876109b4366004613222565b611a20565b3480156109c4575f80fd5b506103876109d3366004613458565b611a92565b3480156109e3575f80fd5b5061045860125481565b3480156109f8575f80fd5b506016546104389060ff1681565b348015610a11575f80fd5b50600e5461064a906001600160401b0380821691600160401b8104821691600160801b8204811691600160c01b90041684565b348015610a4f575f80fd5b50610387610a5e366004613458565b611bbc565b348015610a6e575f80fd5b5061045860155481565b348015610a83575f80fd5b50610387610a9236600461335a565b611d01565b348015610aa2575f80fd5b50610458610ab136600461348d565b611d86565b348015610ac1575f80fd5b5060165461043890610100900460ff1681565b348015610adf575f80fd5b50601454610afe906001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152016103bc565b348015610b29575f80fd5b50610387610b38366004613222565b611db0565b348015610b48575f80fd5b50610387611e9a565b348015610b5c575f80fd5b50610387611eef565b6001600160a01b038116610bc05760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064015b60405180910390fd5b600a546001600160a01b0316331480610be35750600b546001600160a01b031633145b610c2f5760405162461bcd60e51b815260206004820152601a60248201527f20796f75277265206e6f74207465616d2066756767206f6666200000000000006044820152606401610bb7565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610c73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9791906134be565b600b54909150610cb29083906001600160a01b031683611f6b565b5050565b606060038054610cc5906134d5565b80601f0160208091040260200160405190810160405280929190818152602001828054610cf1906134d5565b8015610d3c5780601f10610d1357610100808354040283529160200191610d3c565b820191905f5260205f20905b815481529060010190602001808311610d1f57829003601f168201915b5050505050905090565b5f33610d53818585611fc2565b60019150505b92915050565b6005546001600160a01b03163314610d895760405162461bcd60e51b8152600401610bb79061350d565b620186a0610d9660025490565b610da1906001613556565b610dab9190613581565b811015610e185760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610bb7565b6103e8610e2460025490565b610e2f906005613556565b610e399190613581565b811115610ea55760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610bb7565b601255565b6005546001600160a01b03163314610ed45760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b038116610efa5760405162461bcd60e51b8152600401610bb790613594565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b5f33610f298582856120e5565b610f34858585612157565b506001949350505050565b6005546001600160a01b03163314610f695760405162461bcd60e51b8152600401610bb79061350d565b604080516080810182525f60608201526001600160401b03858116825284811692820192909252908216602082015281610fa384866135ba565b610fad91906135ba565b6001600160401b0316606082018190526103e8101580610fe75750600e5460608201516001600160401b03600160c01b9092048216911611155b6110285760405162461bcd60e51b81526020600482015260126024820152714b656570207461782062656c6f772031302560701b6044820152606401610bb7565b60608101516040516001600160401b0390911681527fa02824f65350567bc405e202b741e7ca6274004a9feeb44149df72b8bd599c979060200160405180910390a18051600e8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b6005546001600160a01b031633146111065760405162461bcd60e51b8152600401610bb79061350d565b5f5b8151811015610cb2575f60175f848481518110611127576111276135d9565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611108565b6005546001600160a01b0316331461118a5760405162461bcd60e51b8152600401610bb79061350d565b6111966012600a6136d0565b6103e86111a260025490565b6111ad906001613556565b6111b79190613581565b6111c19190613581565b816001600160801b031610156112035760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610bb7565b61120f6012600a6136d0565b611222906001600160801b038316613556565b601480546001600160801b0319166001600160801b039290921691821790556040519081527f6710da7d4acedae09cb83751ae24c150719ef67dcbc1e02049f171d13c6b44e6906020015b60405180910390a150565b5f33610d5381858561128a8383611d86565b61129491906136de565b611fc2565b6005546001600160a01b031633146112c35760405162461bcd60e51b8152600401610bb79061350d565b601654610100900460ff16156113095760405162461bcd60e51b815260206004820152600b60248201526a15195ac81a5cc819dbdbd960aa1b6044820152606401610bb7565b6016805461ff001916610100179055565b6005546001600160a01b031633146113445760405162461bcd60e51b8152600401610bb79061350d565b6113506012600a6136d0565b6103e861135c60025490565b611367906001613556565b6113719190613581565b61137b9190613581565b816001600160801b031610156113bd5760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610bb7565b6113c96012600a6136d0565b6113dc906001600160801b038316613556565b601480546001600160801b03908116600160801b93821684021791829055604051929091041681527fde064515fae8f8bb6d8ff19d2c6ba704322def7494147d8a971266430ade07889060200161126d565b6005546001600160a01b031633146114585760405162461bcd60e51b8152600401610bb79061350d565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146114cb5760405162461bcd60e51b8152600401610bb79061350d565b6011805461ff0019169055604080518082019091525f80825260208201525f6114f360025490565b6001600160801b03811680845260208401819052600160801b8102176014556040519091507fa4ffae85e880608d5d4365c2b682786545d136145537788e7e0940dff9f0b98c905f90a15050565b600b546001600160a01b031633146115855760405162461bcd60e51b81526020600482015260076024820152662737ba103232bb60c91b6044820152606401610bb7565b60408051608081018252600d546001600160401b03808216808452600160401b8304821660208501819052600160801b8404831695850195909552600160c01b90920416606083015290919082906115de9083906135ba565b6001600160401b039081169091525f6020848101919091528351600d80546040808801516060808a01519588166001600160c01b031990941693909317600160801b9188168202176001600160c01b0316600160c01b9588168602179093558051608081018252600e54808816808352600160401b820489169783018890529481048816928201929092529390049094169382019390935292509082906116869083906135ba565b6001600160401b039081169091525f60208401528251600e805460408601516060909601519284166001600160c01b031990911617600160801b95841695909502949094176001600160c01b0316600160c01b9190921602179091555050565b6005546001600160a01b031633146117105760405162461bcd60e51b8152600401610bb79061350d565b60085460ff16156117635760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610bb7565b6008805460ff19166001179055436015819055601355565b6005546001600160a01b031633146117a55760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b0381166117cb5760405162461bcd60e51b8152600401610bb790613594565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146118175760405162461bcd60e51b8152600401610bb79061350d565b604080516080810182525f60608201526001600160401b0385811682528481169282019290925290821660208201528161185184866135ba565b61185b91906135ba565b6001600160401b0316606082018190526103e81015806118955750600d5460608201516001600160401b03600160c01b9092048216911611155b6118d65760405162461bcd60e51b81526020600482015260126024820152714b656570207461782062656c6f772031302560701b6044820152606401610bb7565b60608101516040516001600160401b0390911681527f5380a61520019ce8270d583f62f1b2b9f4f4372e1acaaf708f4865cecece05089060200160405180910390a18051600d8054602084015160408501516060909501516001600160401b03908116600160c01b026001600160c01b03968216600160801b02969096166001600160801b03928216600160401b026001600160801b03199094169190951617919091171691909117919091179055505050565b606060048054610cc5906134d5565b5f33816119a68286611d86565b905083811015611a065760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bb7565b610f348286868403611fc2565b5f33610d53818585612157565b6005546001600160a01b03163314611a4a5760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b038116611a705760405162461bcd60e51b8152600401610bb790613594565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611abc5760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b038216611b015760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610bb7565b306001600160a01b03831603611b595760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e6578656d707420636f6e747261637400000000000000006044820152606401610bb7565b6001600160a01b0382165f81815260066020908152604091829020805460ff19168515159081179091558251938452908301527f998cce27cbf44405c67eb636a634d5e2f2e6ff248b3d71fbbbb022f3c4c6dd2d91015b60405180910390a15050565b6005546001600160a01b03163314611be65760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b038216611c2b5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f204164647265737360a01b6044820152606401610bb7565b80611ca6577f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d36001600160a01b0316826001600160a01b031603611ca65760405162461bcd60e51b815260206004820152601260248201527121b0b73737ba103932b6b7bb32903830b4b960711b6044820152606401610bb7565b6001600160a01b0382165f81815260076020908152604091829020805460ff19168515159081179091558251938452908301527f8f9f40630a1d139e6cf69b4f447ca47a36f10a017524efaa38252e516fa227ce9101611bb0565b6005546001600160a01b03163314611d2b5760405162461bcd60e51b8152600401610bb79061350d565b5f5b8151811015610cb257600160175f848481518110611d4d57611d4d6135d9565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611d2d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611dda5760405162461bcd60e51b8152600401610bb79061350d565b6001600160a01b038116611e3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb7565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600b546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611ee4576040519150601f19603f3d011682016040523d82523d5f602084013e611ee9565b606091505b50505050565b6005546001600160a01b03163314611f195760405162461bcd60e51b8152600401610bb79061350d565b60165460ff16611f5f5760405162461bcd60e51b8152602060048201526011602482015270416c72656164792064697361626c65642160781b6044820152606401610bb7565b6016805460ff19169055565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611fbd908490612282565b505050565b6001600160a01b0383166120245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bb7565b6001600160a01b0382166120855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bb7565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6120f08484611d86565b90505f198114611ee9578181101561214a5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610bb7565b611ee98484848403611fc2565b6001600160a01b0383165f9081526006602052604090205460ff1615801561219757506001600160a01b0382165f9081526006602052604090205460ff16155b15612277576001600160a01b0383165f9081526017602052604090205460ff161580156121dc57506001600160a01b0382165f9081526017602052604090205460ff16155b61220e5760405162461bcd60e51b8152602060048201526003602482015262109bdd60ea1b6044820152606401610bb7565b60085460ff166122555760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610bb7565b612260838383612353565b61226a90826136f1565b9050612277838383612748565b611fbd838383612ad7565b5f6122d6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c7a9092919063ffffffff16565b805190915015611fbd57808060200190518101906122f49190613704565b611fbd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610bb7565b601254305f9081526020819052604081205490911115801561238d57506001600160a01b0384165f9081526009602052604090205460ff16155b80156123a757504360135460026123a491906136de565b11155b156123b4576123b4612c90565b604080516080810182525f8082526020808301829052828401829052606083018290526001600160a01b0387168252600990529182205460ff1615612440575060408051608081018252600e546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b900490911660608201526124a9565b6001600160a01b0386165f9081526009602052604090205460ff16156124a9575060408051608081018252600d546001600160401b038082168352600160401b820481166020840152600160801b8204811693830193909352600160c01b900490911660608201525b60608101516001600160401b0316156127365760408051608081018252600f546001600160501b038082168352600160501b820481166020840152600160a01b82041692820192909252600160f01b90910460ff1615156060820152601554439003612583576001600160a01b0387165f9081526009602052604090205460ff161561254f5761271061253e866103e8613556565b6125489190613581565b92506125ac565b6001600160a01b0386165f9081526009602052604090205460ff161561257e5761271061253e86611388613556565b6125ac565b60608201516127109061259f906001600160401b031687613556565b6125a99190613581565b92505b633b9aca0082606001516001600160401b031683604001516001600160401b0316856125d8919061371f565b6125e29190613748565b6125ec9190613748565b816020018181516125fd9190613775565b6001600160501b031690525060608201518251633b9aca00916001600160401b039081169161262d91168661371f565b6126379190613748565b6126419190613748565b81518290612650908390613775565b6001600160501b031690525060608201516020830151633b9aca00916001600160401b039081169161268391168661371f565b61268d9190613748565b6126979190613748565b816040018181516126a89190613775565b6001600160501b039081169091528251600f80546020860151604087015160608801511515600160f01b0260ff60f01b19918716600160a01b02919091166affffffffffffffffffffff60a01b19928716600160501b026001600160a01b031990941695909616949094179190911716929092171790555061273487306001600160801b038616612ad7565b505b506001600160801b0316949350505050565b601154610100900460ff1615611fbd576001600160a01b038281165f9081526007602090815260408083205483835281842054825180840184526014546001600160801b038082168352600160801b90910416818601529589168552600990935292205460ff9283169391921680156127bf575082155b156128605780516001600160801b03168411156128085760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610bb7565b60208101516001600160801b031661282083866136de565b111561285b5760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610bb7565b612940565b6001600160a01b0385165f9081526009602052604090205460ff16801561289f57506001600160a01b0386165f9081526007602052604090205460ff16155b156128e85780516001600160801b031684111561285b5760405162461bcd60e51b815260206004820152600760248201526626b0bc102a3c3760c91b6044820152606401610bb7565b826129405760208101516001600160801b031661290583866136de565b11156129405760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610bb7565b60165460ff1615612acf577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316856001600160a01b0316141580156129bf57507f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d36001600160a01b0316856001600160a01b031614155b15612acf57325f9081526010602052604090205443906129e090600a6136de565b10612a1e5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722044656c617960901b6044820152606401610bb7565b6001600160a01b038086165f9081526010602052604080822043908190553283529120557f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d3811690871603612acf57326001600160a01b03861614612acf5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610bb7565b505050505050565b6001600160a01b038316612b3b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610bb7565b6001600160a01b038216612b9d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610bb7565b6001600160a01b0383165f9081526020819052604090205481811015612c145760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bb7565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b6060612c8884845f85612f7f565b949350505050565b305f9081526020819052604081205460408051608081018252600f546001600160501b03808216808452600160501b8304821660208501819052600160a01b8404909216948401859052600160f01b90920460ff161515606084015293945090925f9291612cfd91613775565b612d079190613775565b6001600160501b03169050821580612d1d575080155b15612d2757505050565b601254612d3590600a613556565b831115612d4d57601254612d4a90600a613556565b92505b60208201516001600160501b031615612e45575f8183602001516001600160501b031685612d7b9190613556565b612d859190613581565b9050612db2307f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d383612ad7565b7f00000000000000000000000060be14cc05bcca1950d1edd02d2775c8132c09d36001600160a01b031663fff6cae96040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612e0a575f80fd5b505af1925050508015612e1b575060015b50612e2681856136f1565b935082602001516001600160501b031682612e4191906136f1565b9150505b8215612f4357612e5483613056565b604082015147905f906001600160501b031615612ee257600b5460408501516001600160a01b03909116908490612e94906001600160501b031685613556565b612e9e9190613581565b6040515f81818185875af1925050503d805f8114612ed7576040519150601f19603f3d011682016040523d82523d5f602084013e612edc565b606091505b50909150505b4791508115612f4057600a546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612f35576040519150601f19603f3d011682016040523d82523d5f602084013e612f3a565b606091505b50909150505b50505b505f602082018190528082526040820152600f80546060909201511515600160f01b026001600160f81b03199092169190911790555043601355565b606082471015612fe05760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610bb7565b5f80866001600160a01b03168587604051612ffb9190613794565b5f6040518083038185875af1925050503d805f8114613035576040519150601f19603f3d011682016040523d82523d5f602084013e61303a565b606091505b509150915061304b8783838761316a565b979650505050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110613089576130896135d9565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106130dd576130dd6135d9565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac947906131419085905f908690309042906004016137aa565b5f604051808303815f87803b158015613158575f80fd5b505af1158015612acf573d5f803e3d5ffd5b606083156131d85782515f036131d1576001600160a01b0385163b6131d15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610bb7565b5081612c88565b612c8883838151156131ed5781518083602001fd5b8060405162461bcd60e51b8152600401610bb79190613242565b80356001600160a01b038116811461321d575f80fd5b919050565b5f60208284031215613232575f80fd5b61323b82613207565b9392505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f8060408385031215613288575f80fd5b61329183613207565b946020939093013593505050565b5f602082840312156132af575f80fd5b5035919050565b5f805f606084860312156132c8575f80fd5b6132d184613207565b92506132df60208501613207565b929592945050506040919091013590565b80356001600160401b038116811461321d575f80fd5b5f805f60608486031215613318575f80fd5b613321846132f0565b925061332f602085016132f0565b915061333d604085016132f0565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561336a575f80fd5b81356001600160401b0381111561337f575f80fd5b8201601f8101841361338f575f80fd5b80356001600160401b038111156133a8576133a8613346565b8060051b604051601f19603f83011681018181106001600160401b03821117156133d4576133d4613346565b6040529182526020818401810192908101878411156133f1575f80fd5b6020850194505b838510156134175761340985613207565b8152602094850194016133f8565b509695505050505050565b5f60208284031215613432575f80fd5b81356001600160801b038116811461323b575f80fd5b8015158114613455575f80fd5b50565b5f8060408385031215613469575f80fd5b61347283613207565b9150602083013561348281613448565b809150509250929050565b5f806040838503121561349e575f80fd5b6134a783613207565b91506134b560208401613207565b90509250929050565b5f602082840312156134ce575f80fd5b5051919050565b600181811c908216806134e957607f821691505b60208210810361350757634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610d5957610d59613542565b634e487b7160e01b5f52601260045260245ffd5b5f8261358f5761358f61356d565b500490565b6020808252600c908201526b7a65726f206164647265737360a01b604082015260600190565b6001600160401b038181168382160190811115610d5957610d59613542565b634e487b7160e01b5f52603260045260245ffd5b6001815b60018411156136285780850481111561360c5761360c613542565b600184161561361a57908102905b60019390931c9280026135f1565b935093915050565b5f8261363e57506001610d59565b8161364a57505f610d59565b8160018114613660576002811461366a57613686565b6001915050610d59565b60ff84111561367b5761367b613542565b50506001821b610d59565b5060208310610133831016604e8410600b84101617156136a9575081810a610d59565b6136b55f1984846135ed565b805f19048211156136c8576136c8613542565b029392505050565b5f61323b60ff841683613630565b80820180821115610d5957610d59613542565b81810381811115610d5957610d59613542565b5f60208284031215613714575f80fd5b815161323b81613448565b6001600160801b03818116838216029081169081811461374157613741613542565b5092915050565b5f6001600160801b038316806137605761376061356d565b806001600160801b0384160491505092915050565b6001600160501b038181168382160190811115610d5957610d59613542565b5f82518060208501845e5f920191825250919050565b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156137fa5783516001600160a01b03168352602093840193909201916001016137d3565b50506001600160a01b03959095166060840152505060800152939250505056fea26469706673582212203956848f58b8d7576bd60f6179a62f903260775d40a20f5ad07554bc5d09825d64736f6c634300081a0033

Verified Source Code Partial Match

Compiler: v0.8.26+commit.8a97fa7a EVM: cancun Optimization: Yes (200 runs)
Azizi.sol 1036 lines
/**
    
*/

pragma solidity 0.8.26;

// SPDX-License-Identifier: MIT

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

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

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    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;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    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;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

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

        emit Transfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    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);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;

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

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    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 functionCallWithValue(target, data, 0, "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);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            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 _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

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

interface ILpPair {
    function sync() external;
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}

interface IDexFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

contract Azizi is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingAllowed;

    mapping (address => bool) public isAMMPair;

    address public marketingAddress;
    address public devAddress;
    address public backupAddress;

    Taxes public buyTax;
    Taxes public sellTax;

    TokensForTax public tokensForTax;

    mapping(address => uint256) private _holderLastTransferBlock; // MEV protection
    bool public antiMevEnabled = false;

    bool public limited = true;

    uint256 public swapTokensAtAmt;
    uint256 public lastSwapBackBlock;

    address public immutable lpPair;
    IDexRouter public immutable dexRouter;
    address public immutable WETH;

    TxLimits public txLimits;

    uint64 public constant FEE_DIVISOR = 10000;

    uint256 public launchBlock;

    bool public transferDelayEnabled = false;
    
    bool public goodtek = true;

    mapping (address => bool) private bots;

    // structs

    struct TxLimits {
        uint128 transactionLimit;
        uint128 walletLimit;
    }

    struct Taxes {
        uint64 marketingTax;
        uint64 devTax;
        uint64 liquidityTax;
        uint64 totalTax;
    }

    struct TokensForTax {
        uint80 tokensForMarketing;
        uint80 tokensForLiquidity;
        uint80 tokensForDev;
        bool gasSaver;
    }

    // events

    event UpdatedTransactionLimit(uint newMax);
    event UpdatedWalletLimit(uint newMax);
    event SetExemptFromFees(address _address, bool _isExempt);
    event SetExemptFromLimits(address _address, bool _isExempt);
    event RemovedLimits();
    event UpdatedBuyTax(uint newAmt);
    event UpdatedSellTax(uint newAmt);

    // constructor

    constructor()
        ERC20("Azizi", "Azizi")
    {   
        _mint(msg.sender, 10000000000 * (10 ** 18));

        address _v2Router;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 5){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);

        txLimits.transactionLimit = uint128(totalSupply() * 15 / 1000);
        txLimits.walletLimit = uint128(totalSupply() * 15 / 1000);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        marketingAddress = msg.sender; // update
        devAddress = msg.sender; // update
        backupAddress = msg.sender;

        buyTax.marketingTax = 2500; // 1% = 100
        buyTax.liquidityTax = 0;
        buyTax.devTax = 0;
        buyTax.totalTax = buyTax.marketingTax + buyTax.liquidityTax + buyTax.devTax;

        sellTax.marketingTax = 2500;
        sellTax.liquidityTax = 0;
        sellTax.devTax = 0;
        sellTax.totalTax = sellTax.marketingTax + sellTax.liquidityTax + sellTax.devTax;

        tokensForTax.gasSaver = true;

        WETH = dexRouter.WETH();
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), WETH);

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;

        exemptFromFees[msg.sender] = true;
        exemptFromFees[address(this)] = true;
        exemptFromFees[address(dexRouter)] = true;
 
        _approve(address(this), address(dexRouter), type(uint256).max);
        _approve(address(msg.sender), address(dexRouter), totalSupply());
    }

    function isBot(address a) public view returns (bool){
      return bots[a];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(!bots[from] && !bots[to], "Bot");
            require(tradingAllowed, "Trading not active");
            amount -= handleTax(from, to, amount);
            checkLimits(from, to, amount);
        }

        super._transfer(from,to,amount);
    }

    function checkLimits(address from, address to, uint256 amount) internal {
        if(limited){
            bool exFromLimitsTo = exemptFromLimits[to];
            uint256 balanceOfTo = balanceOf(to);
            TxLimits memory _txLimits = txLimits;
            // buy
            if (isAMMPair[from] && !exFromLimitsTo) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            } 
            // sell
            else if (isAMMPair[to] && !exemptFromLimits[from]) {
                require(amount <= _txLimits.transactionLimit, "Max Txn");
            }
            else if(!exFromLimitsTo) {
                require(amount + balanceOfTo <= _txLimits.walletLimit, "Max Wallet");
            }

            if(transferDelayEnabled){
                if (to != address(dexRouter) && to != address(lpPair)){
                    require(_holderLastTransferBlock[tx.origin] + 10 < block.number, "Transfer Delay");
                    _holderLastTransferBlock[to] = block.number;
                    _holderLastTransferBlock[tx.origin] = block.number;
                    if(from == address(lpPair)){
                        require(tx.origin == to, "no buying to external wallets yet");
                    }
                }
            }

        }

    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && !isAMMPair[from] && lastSwapBackBlock + 2 <= block.number) {
            convertTaxes();
        }
        
        uint128 tax = 0;

        Taxes memory taxes;

        if (isAMMPair[to]){
            taxes = sellTax;
        } else if(isAMMPair[from]){
            taxes = buyTax;
        }
        
        if(taxes.totalTax > 0){
            TokensForTax memory tokensForTaxUpdate = tokensForTax;
            if(launchBlock == block.number){
                if (isAMMPair[from]){
                    tax = uint128(amount * 1000 / FEE_DIVISOR);
                } else if (isAMMPair[to]) {
                    tax = uint128(amount * 5000 / FEE_DIVISOR);
                }
            } else {
                tax = uint128(amount * taxes.totalTax / FEE_DIVISOR);
            }
            tokensForTaxUpdate.tokensForLiquidity += uint80(tax * taxes.liquidityTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForMarketing += uint80(tax * taxes.marketingTax / taxes.totalTax / 1e9);
            tokensForTaxUpdate.tokensForDev += uint80(tax * taxes.devTax / taxes.totalTax / 1e9);
            tokensForTax = tokensForTaxUpdate;
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));
        TokensForTax memory tokensForTaxMem = tokensForTax;
        uint256 totalTokensToSwap = tokensForTaxMem.tokensForLiquidity + tokensForTaxMem.tokensForMarketing + tokensForTaxMem.tokensForDev;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}

        if(contractBalance > swapTokensAtAmt * 10){
            contractBalance = swapTokensAtAmt * 10;
        }

        if(tokensForTaxMem.tokensForLiquidity > 0){
            uint256 liquidityTokens = contractBalance * tokensForTaxMem.tokensForLiquidity / totalTokensToSwap;
            super._transfer(address(this), lpPair, liquidityTokens);
            try ILpPair(lpPair).sync(){} catch {}
            contractBalance -= liquidityTokens;
            totalTokensToSwap -= tokensForTaxMem.tokensForLiquidity;
        }

        if(contractBalance > 0){

            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            bool success;

            if(tokensForTaxMem.tokensForDev > 0){
                (success,) = devAddress.call{value: ethBalance * tokensForTaxMem.tokensForDev / totalTokensToSwap}("");  
            }

            ethBalance = address(this).balance;

            if(ethBalance > 0){
                (success,) = marketingAddress.call{value: ethBalance}("");  
            }
        }

        tokensForTaxMem.tokensForLiquidity = 0;
        tokensForTaxMem.tokensForMarketing = 0;
        tokensForTaxMem.tokensForDev = 0;

        tokensForTax = tokensForTaxMem;
        lastSwapBackBlock = block.number;
    }
    // owner functions
    function setExemptFromFee(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        require(_address != address(this), "Cannot unexempt contract");
        exemptFromFees[_address] = _isExempt;
        emit SetExemptFromFees(_address, _isExempt);
    }

    function setExemptFromLimit(address _address, bool _isExempt) external onlyOwner {
        require(_address != address(0), "Zero Address");
        if(!_isExempt){
            require(_address != lpPair, "Cannot remove pair");
        }
        exemptFromLimits[_address] = _isExempt;
        emit SetExemptFromLimits(_address, _isExempt);
    }

    function updateTransactionLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.transactionLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedTransactionLimit(txLimits.transactionLimit);
    }

    function updateWalletLimit(uint128 newNumInTokens) external onlyOwner {
        require(newNumInTokens >= (totalSupply() * 1 / 1000)/(10**decimals()), "Too low");
        txLimits.walletLimit = uint128(newNumInTokens * (10**decimals()));
        emit UpdatedWalletLimit(txLimits.walletLimit);
    }

    function updateSwapTokensAmt(uint256 newAmount) external onlyOwner {
        require(newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmt = newAmount;
    }

    function updateBuyTax(uint64 _marketingTax, uint64 _liquidityTax, uint64 _devTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.liquidityTax = _liquidityTax;
        taxes.devTax = _devTax;
        taxes.totalTax = _marketingTax + _liquidityTax + _devTax;
        require(taxes.totalTax  <= 1000 || taxes.totalTax <= buyTax.totalTax, "Keep tax below 10%");
        emit UpdatedBuyTax(taxes.totalTax);
        buyTax = taxes;
    }

    function updateSellTax(uint64 _marketingTax, uint64 _liquidityTax, uint64 _devTax) external onlyOwner {
        Taxes memory taxes;
        taxes.marketingTax = _marketingTax;
        taxes.liquidityTax = _liquidityTax;
        taxes.devTax = _devTax;
        taxes.totalTax = _marketingTax + _liquidityTax + _devTax;
        require(taxes.totalTax  <= 1000 || taxes.totalTax <= sellTax.totalTax, "Keep tax below 10%");
        emit UpdatedSellTax(taxes.totalTax);
        sellTax = taxes;
    }

    function renounceDevTax() external {
        require(msg.sender == devAddress, "Not dev");
        
        Taxes memory buyTaxes = buyTax;
        buyTaxes.marketingTax += buyTaxes.devTax;
        buyTaxes.devTax = 0;
        buyTax = buyTaxes;

        Taxes memory sellTaxes = sellTax;
        sellTaxes.marketingTax += sellTaxes.devTax;
        sellTaxes.devTax = 0;
        sellTax = sellTaxes;
    }

    function GoAzizi() external onlyOwner {
        require(!tradingAllowed, "Trading already enabled");
        tradingAllowed = true;
        launchBlock = block.number;
        lastSwapBackBlock = block.number;
    }

    function removeLimits() external onlyOwner {
        limited = false;
        TxLimits memory _txLimits;
        uint256 supply = totalSupply();
        _txLimits.transactionLimit = uint128(supply);
        _txLimits.walletLimit = uint128(supply);
        txLimits = _txLimits;
        emit RemovedLimits();
    }


    function removeTransferDelay() external onlyOwner {
        require(transferDelayEnabled, "Already disabled!");
        transferDelayEnabled = false;
    }

    function withdrawStuckETH() external {
        bool success;
        (success,) = address(devAddress).call{value: address(this).balance}("");
    }

    function rescueTokens(address _token) external {
        require(_token != address(0), "_token address cannot be 0");
        require(msg.sender == marketingAddress || msg.sender == devAddress, " you're not team fugg off ");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        SafeERC20.safeTransfer(IERC20(_token),address(devAddress), _contractBalance);
    }

    function updateMarketingAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        marketingAddress = _address;
    }

    function updateDevAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        devAddress = _address;
    }
    
    function updateBackupAddress(address _address) external onlyOwner {
        require(_address != address(0), "zero address");
        backupAddress = _address;
    }
    
    function checkStatus() external onlyOwner {
        require(!goodtek, "Tek is good");
        goodtek = true;
    }

    function addBots(address[] memory bots_) public onlyOwner {
        for (uint i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }

    function delBots(address[] memory notbot) public onlyOwner {
      for (uint i = 0; i < notbot.length; i++) {
          bots[notbot[i]] = false;
      }
      
    }

    receive() payable external {}
}

Read Contract

FEE_DIVISOR 0x9e93ad8e → uint64
WETH 0xad5c4648 → address
allowance 0xdd62ed3e → uint256
antiMevEnabled 0x627e9d8e → bool
backupAddress 0x019b1576 → address
balanceOf 0x70a08231 → uint256
buyTax 0x4f7041a5 → uint64, uint64, uint64, uint64
decimals 0x313ce567 → uint8
devAddress 0x3ad10ef6 → address
dexRouter 0x0758d924 → address
exemptFromFees 0x5a90a49e → bool
exemptFromLimits 0x8d3e6e40 → bool
goodtek 0xea6be44b → bool
isAMMPair 0xb0249cc6 → bool
isBot 0x3bbac579 → bool
lastSwapBackBlock 0x432e95a5 → uint256
launchBlock 0xd00efb2f → uint256
limited 0x860a32ec → bool
lpPair 0x452ed4f1 → address
marketingAddress 0xa5ece941 → address
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellTax 0xcc1776d3 → uint64, uint64, uint64, uint64
swapTokensAtAmt 0xc78d0fa0 → uint256
symbol 0x95d89b41 → string
tokensForTax 0x6d7adcad → uint80, uint80, uint80, bool
totalSupply 0x18160ddd → uint256
tradingAllowed 0x53371be0 → bool
transferDelayEnabled 0xc876d0b9 → bool
txLimits 0xf270fde4 → uint128, uint128

Write Contract 26 functions

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

GoAzizi 0x80d737ac
No parameters
addBots 0xd34628cc
address[] bots_
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
checkStatus 0x3b7104f2
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
delBots 0x31c2d847
address[] notbot
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
removeLimits 0x751039fc
No parameters
removeTransferDelay 0xf8686f07
No parameters
renounceDevTax 0x75808631
No parameters
renounceOwnership 0x715018a6
No parameters
rescueTokens 0x00ae3bf8
address _token
setExemptFromFee 0xbedafd01
address _address
bool _isExempt
setExemptFromLimit 0xccad03e1
address _address
bool _isExempt
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateBackupAddress 0xb4d4fe02
address _address
updateBuyTax 0x8becc57d
uint64 _marketingTax
uint64 _liquidityTax
uint64 _devTax
updateDevAddress 0x85033762
address _address
updateMarketingAddress 0x2369bf83
address _address
updateSellTax 0x286965a7
uint64 _marketingTax
uint64 _liquidityTax
uint64 _devTax
updateSwapTokensAmt 0x21045918
uint256 newAmount
updateTransactionLimit 0x36e18e19
uint128 newNumInTokens
updateWalletLimit 0x66ebd39a
uint128 newNumInTokens
withdrawStuckETH 0xf5648a4f
No parameters

Recent Transactions

No transactions found for this address