Address Contract Partially Verified
Address
0x00b4651795193daca7e73b5Ddd031dFDE8CA5720
Balance
0.034730 ETH
Nonce
1
Code Size
9964 bytes
Creator
0xc1131e51...c0E5 at tx 0xd1ddfd73...04d675
Indexed Transactions
0
Contract Bytecode
9964 bytes
0x608060405260043610610241575f3560e01c806376a630bc11610134578063a9059cbb116100b3578063dd62ed3e11610078578063dd62ed3e146106c2578063e01af92c14610706578063ec28438a14610725578063f2fde38b14610744578063f66895a314610763578063f887ea4014610789575f80fd5b8063a9059cbb14610622578063aa4bde2814610641578063c04a541414610656578063c791fc5414610675578063dbe66ca014610694575f80fd5b806395d89b41116100f957806395d89b41146105925780639aed7370146105a65780639d0014b1146105c5578063a457c2d7146105e4578063a8aa1b3114610603575f80fd5b806376a630bc146104d35780638091f3bf146104f2578063864701a5146105125780638c0b5e22146105605780638da5cb5b14610575575f80fd5b806339509351116101c05780636ddd1713116101855780636ddd17131461041557806370a0823114610435578063715018a61461046957806372ac24861461047d57806375f0a8741461049c575f80fd5b8063395093511461038557806340ac48d3146103a4578063590ffdce146103c35780635d098b38146103e257806367c4534914610401575f80fd5b806318160ddd1161020657806318160ddd146102f957806323b872dd1461030d57806325b86edf1461032c57806327a14fc21461034b578063313ce5671461036a575f80fd5b806301339c211461024c5780630294f454146102625780630445b6671461028157806306fdde03146102a9578063095ea7b3146102ca575f80fd5b3661024857005b5f80fd5b348015610257575f80fd5b506102606107a8565b005b34801561026d575f80fd5b5061026061027c3660046122ed565b61086d565b34801561028c575f80fd5b5061029660085481565b6040519081526020015b60405180910390f35b3480156102b4575f80fd5b506102bd61095d565b6040516102a0919061230f565b3480156102d5575f80fd5b506102e96102e436600461235a565b6109ed565b60405190151581526020016102a0565b348015610304575f80fd5b50600254610296565b348015610318575f80fd5b506102e9610327366004612384565b610a03565b348015610337575f80fd5b506102e96103463660046123c2565b610ab2565b348015610356575f80fd5b506102606103653660046123f9565b610c06565b348015610375575f80fd5b50604051601281526020016102a0565b348015610390575f80fd5b506102e961039f36600461235a565b610c93565b3480156103af575f80fd5b506102606103be366004612410565b610cc9565b3480156103ce575f80fd5b506102606103dd366004612454565b610df3565b3480156103ed575f80fd5b506102606103fc3660046122ed565b610e6a565b34801561040c575f80fd5b50610260610f5b565b348015610420575f80fd5b506007546102e990600160a81b900460ff1681565b348015610440575f80fd5b5061029661044f3660046122ed565b6001600160a01b03165f9081526020819052604090205490565b348015610474575f80fd5b50610260611094565b348015610488575f80fd5b506102606104973660046122ed565b6110c9565b3480156104a7575f80fd5b50600b546104bb906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b3480156104de575f80fd5b50600d546104bb906001600160a01b031681565b3480156104fd575f80fd5b506007546102e990600160b01b900460ff1681565b34801561051d575f80fd5b50600e54600f54601054601154601254610538949392919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102a0565b34801561056b575f80fd5b5061029660095481565b348015610580575f80fd5b506005546001600160a01b03166104bb565b34801561059d575f80fd5b506102bd6111bc565b3480156105b1575f80fd5b506102606105c03660046123f9565b6111cb565b3480156105d0575f80fd5b506102606105df3660046123f9565b611262565b3480156105ef575f80fd5b506102e96105fe36600461235a565b6113aa565b34801561060e575f80fd5b506007546104bb906001600160a01b031681565b34801561062d575f80fd5b506102e961063c36600461235a565b611444565b34801561064c575f80fd5b50610296600a5481565b348015610661575f80fd5b50600c546104bb906001600160a01b031681565b348015610680575f80fd5b5061026061068f366004612410565b611450565b34801561069f575f80fd5b506102e96106ae3660046122ed565b601a6020525f908152604090205460ff1681565b3480156106cd575f80fd5b506102966106dc3660046123c2565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610711575f80fd5b50610260610720366004612480565b6115dd565b348015610730575f80fd5b5061026061073f3660046123f9565b611649565b34801561074f575f80fd5b5061026061075e3660046122ed565b6116d6565b34801561076e575f80fd5b50601354601454601554601654601754610538949392919085565b348015610794575f80fd5b506006546104bb906001600160a01b031681565b6005546001600160a01b031633146107db5760405162461bcd60e51b81526004016107d29061249b565b60405180910390fd5b600754600160b01b900460ff161561082e5760405162461bcd60e51b815260206004820152601660248201527554726164696e6720616c72656164792061637469766560501b60448201526064016107d2565b6007805461ffff60a81b191661010160a81b1790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c8905f90a1565b6005546001600160a01b031633146108975760405162461bcd60e51b81526004016107d29061249b565b600d546001600160a01b039081165f908152601a60205260409020805460ff1916905581166109175760405162461bcd60e51b815260206004820152602660248201527f53746f696344616f2057616c6c65742063616e6e6f74206265207a65726f206160448201526564647265737360d01b60648201526084016107d2565b600d80546001600160a01b0319166001600160a01b0383161790556040517f5c6de18ad463cc9be6b3bde5ace1020863f549309dd0c9219db51c3f0bb5dac7905f90a150565b60606003805461096c906124d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610998906124d0565b80156109e35780601f106109ba576101008083540402835291602001916109e3565b820191905f5260205f20905b8154815290600101906020018083116109c657829003601f168201915b5050505050905090565b5f6109f9338484611771565b5060015b92915050565b5f610a0f848484611894565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610a935760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016107d2565b610aa78533610aa2868561251c565b611771565b506001949350505050565b6005545f906001600160a01b03163314610ade5760405162461bcd60e51b81526004016107d29061249b565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610b22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b46919061252f565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015610b96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bba9190612546565b604080516001600160a01b0387168152602081018490529193507fdeda980967fcead7b61e78ac46a4da14274af29e894d4d61e8b81ec38ab3e438910160405180910390a15092915050565b6005546001600160a01b03163314610c305760405162461bcd60e51b81526004016107d29061249b565b622625a0811015610c535760405162461bcd60e51b81526004016107d290612561565b610c6581670de0b6b3a76400006125a4565b600a556040517f49b5ebe6b6bd29b732eb93789df6cb9d7d384e64ab8600b8ab879f82a4fb1dec905f90a150565b335f8181526001602090815260408083206001600160a01b038716845290915281205490916109f9918590610aa29086906125bb565b6005546001600160a01b03163314610cf35760405162461bcd60e51b81526004016107d29061249b565b6040805160a0810182528681526020810186905290810184905260608101839052608001819052600e859055600f849055601083905560118290556012819055808284610d4087896125bb565b610d4a91906125bb565b610d5491906125bb565b610d5e91906125bb565b6018819055602d1015610dc45760405162461bcd60e51b815260206004820152602860248201527f546f74616c2062757920666565732063616e6e6f742062652067726561746572604482015267207468616e20352560c01b60648201526084016107d2565b6040517f5603f0cab8983038ffb2c31e46a497a67322819231397b1a4eff19e46e39851d905f90a15050505050565b6005546001600160a01b03163314610e1d5760405162461bcd60e51b81526004016107d29061249b565b6001600160a01b0382165f908152601a6020526040808220805460ff1916841515179055517fd03e5aecc1463f851cb441202cc200cd8754891d6b125b332588db1948d4cbed9190a15050565b6005546001600160a01b03163314610e945760405162461bcd60e51b81526004016107d29061249b565b600b546001600160a01b039081165f908152601a60205260409020805460ff191690558116610f155760405162461bcd60e51b815260206004820152602760248201527f4d61726b6574696e672057616c6c65742063616e6e6f74206265207a65726f206044820152666164647265737360c81b60648201526084016107d2565b600b80546001600160a01b0319166001600160a01b0383161790556040517fecc84d499d57318161ab7effa4a1797c7500e9cce582fce989611566acadb0e0905f90a150565b6005546001600160a01b03163314610f855760405162461bcd60e51b81526004016107d29061249b565b6007805460ff60a01b1916600160a01b179055610fbe610fb9306001600160a01b03165f9081526020819052604090205490565b611bff565b475f610fcb6002836125ce565b90505f610fd8828461251c565b600b546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611027576040519150601f19603f3d011682016040523d82523d5f602084013e61102c565b606091505b5050600c546040519192506001600160a01b03169083905f81818185875af1925050503d805f8114611079576040519150601f19603f3d011682016040523d82523d5f602084013e61107e565b606091505b50506007805460ff60a01b191690555050505050565b6005546001600160a01b031633146110be5760405162461bcd60e51b81526004016107d29061249b565b6110c75f611d4f565b565b6005546001600160a01b031633146110f35760405162461bcd60e51b81526004016107d29061249b565b600c546001600160a01b039081165f908152601a60205260409020805460ff1916905581166111765760405162461bcd60e51b815260206004820152602960248201527f446576656c6f706d656e742057616c6c65742063616e6e6f74206265207a65726044820152686f206164647265737360b81b60648201526084016107d2565b600c80546001600160a01b0319166001600160a01b0383161790556040517f56c050a659ad3741e0a2373000420a1c3c060f7f39c95458be197a36a6e61ec2905f90a150565b60606004805461096c906124d0565b6005546001600160a01b031633146111f55760405162461bcd60e51b81526004016107d29061249b565b47336108fc606461120685856125a4565b61121091906125ce565b6040518115909202915f818181858888f19350505050158015611235573d5f803e3d5ffd5b506040517ff20a449062e534a116785d71bddf65609cfc0bc86030f808c97d76660ddb4bf9905f90a15050565b6005546001600160a01b0316331461128c5760405162461bcd60e51b81526004016107d29061249b565b6127108110156112fc5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b60648201526084016107d2565b6301c9c38081111561136b5760405162461bcd60e51b815260206004820152603260248201527f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160448201527137101992903a37ba30b61039bab838363c9760711b60648201526084016107d2565b61137d81670de0b6b3a76400006125a4565b6008556040517ee5ce26a39fffb27e333aa941bc88d6cc7491c7ad00e1dc92cae29c83aec93d905f90a150565b335f9081526001602090815260408083206001600160a01b03861684529091528120548281101561142b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016107d2565b61143a3385610aa2868561251c565b5060019392505050565b5f6109f9338484611894565b6005546001600160a01b0316331461147a5760405162461bcd60e51b81526004016107d29061249b565b6040805160a0810182528681526020810186905290810184905260608101839052608001819052601385905560148490556015839055601682905560178190558082846114c787896125bb565b6114d191906125bb565b6114db91906125bb565b6114e591906125bb565b6019819055602d101561154c5760405162461bcd60e51b815260206004820152602960248201527f546f74616c2073656c6c20666565732063616e6e6f742062652067726561746560448201526872207468616e20352560b81b60648201526084016107d2565b600160195410156115ae5760405162461bcd60e51b815260206004820152602660248201527f546f74616c2073656c6c20666565732063616e6e6f742062656c65737320207460448201526568616e20312560d01b60648201526084016107d2565b6040517f13f91d6936cb30f23ecef75125dc94fead23e2cb4beb9d95058df43aa8c30785905f90a15050505050565b6005546001600160a01b031633146116075760405162461bcd60e51b81526004016107d29061249b565b6007805460ff60a81b1916600160a81b831515021790556040517f41c787961cb389554b90a8dbfb700790a3f278f50ba1d330c0b555d884789b5a905f90a150565b6005546001600160a01b031633146116735760405162461bcd60e51b81526004016107d29061249b565b622625a08110156116965760405162461bcd60e51b81526004016107d290612561565b6116a881670de0b6b3a76400006125a4565b6009556040517f3fb2441f7fb0cf4882020ee77c4b9fb347bdbbf2fa439c76ca667e1b55f18b2b905f90a150565b6005546001600160a01b031633146117005760405162461bcd60e51b81526004016107d29061249b565b6001600160a01b0381166117655760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107d2565b61176e81611d4f565b50565b6001600160a01b0383166117d35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107d2565b6001600160a01b0382166118345760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107d2565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f81116118f55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016107d2565b6001600160a01b0383165f908152601a602052604090205460ff1615801561193557506001600160a01b0382165f908152601a602052604090205460ff16155b801561194b5750600754600160a01b900460ff16155b15611a8d57600754600160b01b900460ff166119a25760405162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81b9bdd081858dd1a5d99481e595d60521b60448201526064016107d2565b6009548111156119f45760405162461bcd60e51b815260206004820152601d60248201527f596f752061726520657863656564696e67206d61785478416d6f756e7400000060448201526064016107d2565b6007546001600160a01b03838116911614611a8d57600a5481611a2b846001600160a01b03165f9081526020819052604090205490565b611a3591906125bb565b1115611a8d5760405162461bcd60e51b815260206004820152602160248201527f596f752061726520657863656564696e67206d617857616c6c6574416d6f756e6044820152601d60fa1b60648201526084016107d2565b6007545f90600160a01b900460ff1680611abe57506001600160a01b0384165f908152601a602052604090205460ff165b80611ae057506001600160a01b0383165f908152601a602052604090205460ff165b15611aec57505f611b4c565b6007546001600160a01b0390811690841603611b2357606460195483611b1291906125a4565b611b1c91906125ce565b9050611b4c565b6007546001600160a01b0390811690851603611b4957606460185483611b1291906125a4565b505f5b600754600160a81b900460ff168015611b6f5750600754600160a01b900460ff16155b8015611b8957506007546001600160a01b03858116911614155b8015611b9457505f81115b15611ba157611ba1611da0565b611bb58484611bb0848661251c565b611f41565b8015611bc657611bc6843083611f41565b6019546017545f9190611bd990846125a4565b611be391906125ce565b90508015611bf857611bf83061dead83611f41565b5050505050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611c3257611c326125ed565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611c89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cad9190612601565b81600181518110611cc057611cc06125ed565b6001600160a01b039283166020918202929092010152600654611ce69130911684611771565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611d1e9085905f9086903090429060040161261c565b5f604051808303815f87803b158015611d35575f80fd5b505af1158015611d47573d5f803e3d5ffd5b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600754600160a01b900460ff166110c7576007805460ff60a01b1916600160a01b179055305f9081526020819052604081205490506008548110611f31575f6019546002611dee91906125a4565b90505f8160136001015484611e0391906125a4565b611e0d91906125ce565b90505f611e1a828561251c565b905047611e2682611bff565b5f611e31824761251c565b6014549091505f90611e43908761251c565b611e4d90836125ce565b6014549091505f90611e5f90836125a4565b90505f86118015611e6f57505f81115b15611e7e57611e7e8682612117565b6013545f90611e8e8460026125a4565b611e9891906125a4565b90508015611eb657600b54611eb6906001600160a01b0316826121bf565b6015545f90611ec68560026125a4565b611ed091906125a4565b90508015611eee57600c54611eee906001600160a01b0316826121bf565b6016545f90611efe8660026125a4565b611f0891906125a4565b90508015611f2657600d54611f26906001600160a01b0316826121bf565b505050505050505050505b506007805460ff60a01b19169055565b6001600160a01b038316611fa55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107d2565b6001600160a01b0382166120075760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107d2565b6001600160a01b0383165f908152602081905260409020548181101561207e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107d2565b612088828261251c565b6001600160a01b038086165f9081526020819052604080822093909355908516815290812080548492906120bd9084906125bb565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161210991815260200190565b60405180910390a350505050565b60065461212f9030906001600160a01b031684611771565b60065460405163f305d71960e01b8152306004820152602481018490525f60448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af115801561219a573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611bf8919061268b565b8047101561220f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107d2565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612258576040519150601f19603f3d011682016040523d82523d5f602084013e61225d565b606091505b50509050806122d45760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107d2565b505050565b6001600160a01b038116811461176e575f80fd5b5f602082840312156122fd575f80fd5b8135612308816122d9565b9392505050565b5f6020808352835180828501525f5b8181101561233a5785810183015185820160400152820161231e565b505f604082860101526040601f19601f8301168501019250505092915050565b5f806040838503121561236b575f80fd5b8235612376816122d9565b946020939093013593505050565b5f805f60608486031215612396575f80fd5b83356123a1816122d9565b925060208401356123b1816122d9565b929592945050506040919091013590565b5f80604083850312156123d3575f80fd5b82356123de816122d9565b915060208301356123ee816122d9565b809150509250929050565b5f60208284031215612409575f80fd5b5035919050565b5f805f805f60a08688031215612424575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b801515811461176e575f80fd5b5f8060408385031215612465575f80fd5b8235612470816122d9565b915060208301356123ee81612447565b5f60208284031215612490575f80fd5b813561230881612447565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806124e457607f821691505b60208210810361250257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109fd576109fd612508565b5f6020828403121561253f575f80fd5b5051919050565b5f60208284031215612556575f80fd5b815161230881612447565b60208082526023908201527f43616e6e6f7420736574206d617853656c6c206c6f776572207468616e20302e60408201526232352560e81b606082015260800190565b80820281158282048414176109fd576109fd612508565b808201808211156109fd576109fd612508565b5f826125e857634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612611575f80fd5b8151612308816122d9565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b8181101561266a5784516001600160a01b031683529383019391830191600101612645565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f6060848603121561269d575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212209791711f0e98f53ac1afbc151610f17454fd981905b83669a0b6af816a248e2864736f6c63430008140033
Verified Source Code Partial Match
Compiler: v0.8.20+commit.a1b79de6
EVM: shanghai
Optimization: Yes (200 runs)
CHAINMAIL.sol 509 lines
/**
TG: https://t.me/chainmailerc
Twitter: https://x.com/chainmailerc
Web: https://www.chainmail.ai/
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
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 IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping (address => uint256) internal _balances;
mapping (address => mapping (address => uint256)) internal _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, 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) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
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 _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
library Address{
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");
}
}
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
interface IFactory{
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline) external;
}
contract CHAINMAIL is ERC20, Ownable{
using Address for address payable;
IRouter public router;
address public pair;
bool private swapping;
bool public swapEnabled;
bool public launched;
modifier lockSwapping() {
swapping = true;
_;
swapping = false;
}
event TransferForeignToken(address token, uint256 amount);
event Launched();
event SwapEnabled();
event SwapThresholdUpdated();
event BuyTaxesUpdated();
event SellTaxesUpdated();
event MarketingWalletUpdated();
event DevelopmentWalletUpdated();
event StoicDaoWalletUpdated();
event ExcludedFromFeesUpdated();
event MaxTxAmountUpdated();
event MaxWalletAmountUpdated();
event StuckEthersCleared();
uint256 public swapThreshold = 1000000 * 10**18; //0.1% of total supply
uint256 public maxTxAmount = 1000000000 * 10**18;
uint256 public maxWalletAmount = 1000000000 * 10**18;
address public marketingWallet = 0xb5dE6331069f1aA402eA7c50E2E8142974724ecc;
address public developmentWallet = 0xc02E8796Fdd39d22a3b702C954Dddbd8bD501882;
address public stoicDaoWallet = 0xbF21275FAD21eB033d35162Fa2be0cF76478cea4;
struct Taxes {
uint256 marketing;
uint256 liquidity;
uint256 development;
uint256 stoicDao;
uint256 burn;
}
Taxes public buyTaxes = Taxes(2,0,2,1,0);
Taxes public sellTaxes = Taxes(2,0,2,1,0);
uint256 private totBuyTax = 5; //5%
uint256 private totSellTax = 5; //5%
mapping (address => bool) public excludedFromFees;
modifier inSwap() {
if (!swapping) {
swapping = true;
_;
swapping = false;
}
}
constructor() ERC20("CHAINMAIL", "MAIL") {
_mint(msg.sender, 1000000000 * 10 ** decimals());
excludedFromFees[msg.sender] = true;
IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address _pair = IFactory(_router.factory())
.createPair(address(this), _router.WETH());
router = _router;
pair = _pair;
excludedFromFees[address(this)] = true;
excludedFromFees[marketingWallet] = true;
excludedFromFees[developmentWallet] = true;
excludedFromFees[stoicDaoWallet] = true;
}
function _transfer(address sender, address recipient, uint256 amount) internal override {
require(amount > 0, "Transfer amount must be greater than zero");
if(!excludedFromFees[sender] && !excludedFromFees[recipient] && !swapping){
require(launched, "Trading not active yet");
require(amount <= maxTxAmount, "You are exceeding maxTxAmount");
if(recipient != pair){
require(balanceOf(recipient) + amount <= maxWalletAmount, "You are exceeding maxWalletAmount");
}
}
uint256 fee;
if (swapping || excludedFromFees[sender] || excludedFromFees[recipient]) fee = 0;
else{
if(recipient == pair) fee = amount * totSellTax / 100;
else if(sender == pair) fee = amount * totBuyTax / 100;
else fee = 0;
}
if (swapEnabled && !swapping && sender != pair && fee > 0) swapForFees();
super._transfer(sender, recipient, amount - fee);
if(fee > 0) super._transfer(sender, address(this) ,fee);
uint256 tokensForBurn = 0;
tokensForBurn = fee * sellTaxes.burn / totSellTax;
if(tokensForBurn > 0) {
super._transfer(address(this), address(0xdead), tokensForBurn);
}
}
function swapForFees() private inSwap {
uint256 contractBalance = balanceOf(address(this));
if (contractBalance >= swapThreshold) {
uint256 denominator = totSellTax * 2;
uint256 tokensToAddLiquidityWith = contractBalance * sellTaxes.liquidity / denominator;
uint256 toSwap = contractBalance - tokensToAddLiquidityWith;
uint256 initialBalance = address(this).balance;
swapTokensForETH(toSwap);
uint256 deltaBalance = address(this).balance - initialBalance;
uint256 unitBalance= deltaBalance / (denominator - sellTaxes.liquidity);
uint256 ethToAddLiquidityWith = unitBalance * sellTaxes.liquidity;
if(tokensToAddLiquidityWith > 0 && ethToAddLiquidityWith > 0){
// Add liquidity to dex
addLiquidity(tokensToAddLiquidityWith, ethToAddLiquidityWith);
}
uint256 marketingAmt = unitBalance * 2 * sellTaxes.marketing;
if(marketingAmt > 0){
payable(marketingWallet).sendValue(marketingAmt);
}
uint256 developmentAmt = unitBalance * 2 * sellTaxes.development;
if(developmentAmt > 0){
payable(developmentWallet).sendValue(developmentAmt);
}
uint256 stoicDaoAmt = unitBalance * 2 * sellTaxes.stoicDao;
if(stoicDaoAmt > 0){
payable(stoicDaoWallet).sendValue(stoicDaoAmt);
}
}
}
function swapTokensForETH(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = router.WETH();
_approve(address(this), address(router), tokenAmount);
// make the swap
router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
}
function addLiquidity(uint256 tokenAmount, uint256 bnbAmount) private {
// approve token transfer to cover all possible scenarios
_approve(address(this), address(router), tokenAmount);
// add the liquidity
router.addLiquidityETH{value: bnbAmount}(
address(this),
tokenAmount,
0, // slippage is unavoidable
0, // slippage is unavoidable
address(0xdead),
block.timestamp
);
}
function setSwapEnabled(bool state) external onlyOwner { // to be used only in case of dire emergency
swapEnabled = state;
emit SwapEnabled();
}
function setSwapThreshold(uint256 new_amount) external onlyOwner {
require(new_amount >= 10000, "Swap amount cannot be lower than 0.001% total supply.");
require(new_amount <= 30000000, "Swap amount cannot be higher than 3% total supply.");
swapThreshold = new_amount * (10**18);
emit SwapThresholdUpdated();
}
function launch() external onlyOwner{
require(!launched, "Trading already active");
launched = true;
swapEnabled = true;
emit Launched();
}
function setBuyTaxes(uint256 _marketing, uint256 _liquidity, uint256 _development, uint256 _stoicDao, uint256 _burn) external onlyOwner{
buyTaxes = Taxes(_marketing, _liquidity, _development, _stoicDao, _burn);
totBuyTax = _marketing + _liquidity + _development + _stoicDao + _burn;
require(totBuyTax <= 45,"Total buy fees cannot be greater than 5%");
emit BuyTaxesUpdated();
}
function setSellTaxes(uint256 _marketing, uint256 _liquidity, uint256 _development, uint256 _stoicDao, uint256 _burn) external onlyOwner{
sellTaxes = Taxes(_marketing, _liquidity, _development, _stoicDao, _burn);
totSellTax = _marketing + _liquidity + _development + _stoicDao + _burn;
require(totSellTax <= 45,"Total sell fees cannot be greater than 5%");
require(totSellTax >= 1,"Total sell fees cannot beless than 1%");
emit SellTaxesUpdated();
}
function setMarketingWallet(address newWallet) external onlyOwner{
excludedFromFees[marketingWallet] = false;
require(newWallet != address(0), "Marketing Wallet cannot be zero address");
marketingWallet = newWallet;
emit MarketingWalletUpdated();
}
function setDevelopmentWallet(address newWallet) external onlyOwner{
excludedFromFees[developmentWallet] = false;
require(newWallet != address(0), "Development Wallet cannot be zero address");
developmentWallet = newWallet;
emit DevelopmentWalletUpdated();
}
function setStoicDaoWallet(address newWallet) external onlyOwner{
excludedFromFees[stoicDaoWallet] = false;
require(newWallet != address(0), "StoicDao Wallet cannot be zero address");
stoicDaoWallet = newWallet;
emit StoicDaoWalletUpdated();
}
function setExcludedFromFees(address _address, bool state) external onlyOwner {
excludedFromFees[_address] = state;
emit ExcludedFromFeesUpdated();
}
function setMaxTxAmount(uint256 amount) external onlyOwner{
require(amount >= 2500000, "Cannot set maxSell lower than 0.25%");
maxTxAmount = amount * (10**18);
emit MaxTxAmountUpdated();
}
function setMaxWalletAmount(uint256 amount) external onlyOwner{
require(amount >= 2500000, "Cannot set maxSell lower than 0.25%");
maxWalletAmount = amount * (10**18);
emit MaxWalletAmountUpdated();
}
function withdrawStuckTokens(address _token, address _to) external onlyOwner returns (bool _sent) {
uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
_sent = IERC20(_token).transfer(_to, _contractBalance);
emit TransferForeignToken(_token, _contractBalance);
}
function clearStuckEthers(uint256 amountPercentage) external onlyOwner {
uint256 amountETH = address(this).balance;
payable(msg.sender).transfer((amountETH * amountPercentage) / 100);
emit StuckEthersCleared();
}
function unclog() public onlyOwner lockSwapping {
swapTokensForETH(
balanceOf(address(this))
);
uint256 ethBalance = address(this).balance;
uint256 ethMarketing = ethBalance / 2;
uint256 ethDevelopment = ethBalance - ethMarketing;
bool success;
(success, ) = address(marketingWallet).call{value: ethMarketing}("");
(success, ) = address(developmentWallet).call{value: ethDevelopment}(
""
);
}
// fallbacks
receive() external payable {}
}
Read Contract
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
buyTaxes 0x864701a5 → uint256, uint256, uint256, uint256, uint256
decimals 0x313ce567 → uint8
developmentWallet 0xc04a5414 → address
excludedFromFees 0xdbe66ca0 → bool
launched 0x8091f3bf → bool
marketingWallet 0x75f0a874 → address
maxTxAmount 0x8c0b5e22 → uint256
maxWalletAmount 0xaa4bde28 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
pair 0xa8aa1b31 → address
router 0xf887ea40 → address
sellTaxes 0xf66895a3 → uint256, uint256, uint256, uint256, uint256
stoicDaoWallet 0x76a630bc → address
swapEnabled 0x6ddd1713 → bool
swapThreshold 0x0445b667 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
Write Contract 21 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
clearStuckEthers 0x9aed7370
uint256 amountPercentage
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
launch 0x01339c21
No parameters
renounceOwnership 0x715018a6
No parameters
setBuyTaxes 0x40ac48d3
uint256 _marketing
uint256 _liquidity
uint256 _development
uint256 _stoicDao
uint256 _burn
setDevelopmentWallet 0x72ac2486
address newWallet
setExcludedFromFees 0x590ffdce
address _address
bool state
setMarketingWallet 0x5d098b38
address newWallet
setMaxTxAmount 0xec28438a
uint256 amount
setMaxWalletAmount 0x27a14fc2
uint256 amount
setSellTaxes 0xc791fc54
uint256 _marketing
uint256 _liquidity
uint256 _development
uint256 _stoicDao
uint256 _burn
setStoicDaoWallet 0x0294f454
address newWallet
setSwapEnabled 0xe01af92c
bool state
setSwapThreshold 0x9d0014b1
uint256 new_amount
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
unclog 0x67c45349
No parameters
withdrawStuckTokens 0x25b86edf
address _token
address _to
returns: bool
Recent Transactions
No transactions found for this address