Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x2b87d5D3a7eBBc34615869b9AB7D6E9321DF75A3
Balance 0.351367 ETH
Nonce 1
Code Size 13225 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

13225 bytes
0x6080604052600436106102345760003560e01c806370a082311161012e578063b6a5d7de116100ab578063f319ae771161006f578063f319ae771461073c578063f887ea401461075c578063fac1b9bc14610790578063fc5ea5e6146107b0578063fe9fbb80146107d057600080fd5b8063b6a5d7de1461069c578063b9a45aac146106bc578063dd62ed3e146106dc578063f0b37c04146106fc578063f2fde38b1461071c57600080fd5b80638e5c3ad3116100f25780638e5c3ad3146105d857806395d89b41146105f8578063a457c2d714610628578063a8aa1b3114610648578063a9059cbb1461067c57600080fd5b806370a082311461051f578063715018a6146105555780637d1db4a51461056a57806382aa7c68146105805780638da5cb5b146105a057600080fd5b806339264b66116101bc5780634a5a863a116101805780634a5a863a14610496578063569c9b33146104b65780636b7f8b90146104c95780636c0a24eb146104e9578063706f6937146104ff57600080fd5b806339264b66146103dd57806339509351146103fd5780633bbac5791461041d57806340005fbe14610456578063455a43961461047657600080fd5b806323b872dd1161020357806323b872dd146102fb5780632b112e491461031b5780632f54bf6e14610330578063313ce5671461035f578063357c13541461037b57600080fd5b806306fdde0314610240578063095ea7b3146102845780630eefe44b146102b457806318160ddd146102d657600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b506040805180820190915260098152680a682a6a2aa82a886960bb1b60208201525b60405161027b9190612d79565b60405180910390f35b34801561029057600080fd5b506102a461029f366004612dc4565b6107f0565b604051901515815260200161027b565b3480156102c057600080fd5b506102d46102cf366004612e04565b610806565b005b3480156102e257600080fd5b50670e049984505034005b60405190815260200161027b565b34801561030757600080fd5b506102a4610316366004612e3d565b610968565b34801561032757600080fd5b506102ed61098b565b34801561033c57600080fd5b506102a461034b366004612e7e565b6000546001600160a01b0391821691161490565b34801561036b57600080fd5b506040516009815260200161027b565b34801561038757600080fd5b506103bd610396366004612e9b565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161027b565b3480156103e957600080fd5b506102d46103f8366004612e3d565b6109d2565b34801561040957600080fd5b506102a4610418366004612dc4565b610acf565b34801561042957600080fd5b506102a4610438366004612e7e565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561046257600080fd5b506102d4610471366004612eb6565b610af0565b34801561048257600080fd5b506102d4610491366004612f0f565b610c0c565b3480156104a257600080fd5b506102d46104b1366004612f48565b610cc5565b6102d46104c4366004612f74565b610d48565b3480156104d557600080fd5b506102d46104e4366004612fab565b611194565b3480156104f557600080fd5b506102ed60035481565b34801561050b57600080fd5b506102d461051a366004613014565b611230565b34801561052b57600080fd5b506102ed61053a366004612e7e565b6001600160a01b031660009081526004602052604090205490565b34801561056157600080fd5b506102d461143a565b34801561057657600080fd5b506102ed60025481565b34801561058c57600080fd5b506102d461059b366004613080565b6114a5565b3480156105ac57600080fd5b506000546105c0906001600160a01b031681565b6040516001600160a01b03909116815260200161027b565b3480156105e457600080fd5b506102d46105f3366004613099565b611561565b34801561060457600080fd5b506040805180820190915260078152660a6a2aa82a886960cb1b602082015261026e565b34801561063457600080fd5b506102a4610643366004612dc4565b6115ed565b34801561065457600080fd5b506105c07f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb81565b34801561068857600080fd5b506102a4610697366004612dc4565b611667565b3480156106a857600080fd5b506102d46106b7366004612e7e565b611674565b3480156106c857600080fd5b506102d46106d7366004612f0f565b6116c0565b3480156106e857600080fd5b506102ed6106f73660046130ba565b611779565b34801561070857600080fd5b506102d4610717366004612e7e565b6117a4565b34801561072857600080fd5b506102d4610737366004612e7e565b6117ea565b34801561074857600080fd5b506102d46107573660046130e8565b6118a1565b34801561076857600080fd5b506105c07f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561079c57600080fd5b506102d46107ab366004612f0f565b611a1f565b3480156107bc57600080fd5b506102d46107cb3660046130e8565b611ad8565b3480156107dc57600080fd5b506102a46107eb366004612e7e565b611be7565b60006107fd338484611c05565b50600192915050565b61080f33611be7565b6108345760405162461bcd60e51b815260040161082b9061310a565b60405180910390fd5b61084c60146108466127106003611d21565b90611d2d565b6108608261085a8686611d39565b90611d39565b11156108ae5760405162461bcd60e51b815260206004820152601b60248201527f5461782063616e6e6f74206265206d6f7265207468616e203135250000000000604482015260640161082b565b6000600b60008660028111156108c6576108c661312f565b60028111156108d7576108d761312f565b81526020810191909152604001600020600181018590558381556002810183905590506109088261085a8686611d39565b600382015584600281111561091f5761091f61312f565b60408051868152602081018690529081018490527fb1a90344459b408c97dc6c9427767fbcdb7fdf83182ce17a8d019839e88e8b05906060015b60405180910390a25050505050565b6000610975843384611d45565b610980848484611dbf565b5060015b9392505050565b61dead600090815260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd546109cd90670e0499845050340090612164565b905090565b6109db33611be7565b6109f75760405162461bcd60e51b815260040161082b9061310a565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a629190613145565b90506000610a766127106108468486611d21565b9050610a8c6001600160a01b0386168583612170565b604080516001600160a01b038681168252602082018490528716917fc3770890217b5014eb50f7ffe9521ca4e970a55a8795d24ba3933f962440e1b89101610959565b60006107fd338484610ae13388611779565b610aeb9190613174565b611c05565b610af933611be7565b610b155760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b038316610b3b5760405162461bcd60e51b815260040161082b9061318c565b6001600160a01b038216610b615760405162461bcd60e51b815260040161082b9061318c565b6001600160a01b038116610b875760405162461bcd60e51b815260040161082b9061318c565b601880546001600160a01b038581166001600160a01b0319928316811790935560168054868316908416811790915560178054928616929093168217909255604080519384526020840192909252908201527ff4653be65455600571e0a73c497c13dd50347f1cd9ba7b16a1710b6184bb644c906060015b60405180910390a1505050565b610c1533611be7565b610c315760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b03821660009081526008602052604090205481151560ff909116151503610c715760405162461bcd60e51b815260040161082b906131b2565b6001600160a01b038216600081815260086020526040808220805460ff191685151590811790915590519092917f4728de7c6a4e2755a2f42b3034ce94f4a011aaff9d1af55ed984db300dea942091a35050565b610cce33611be7565b610cea5760405162461bcd60e51b815260040161082b9061310a565b601483905560138290556012819055610d078161085a8585611d39565b60155560408051848152602081018490529081018290527fdb99cc69484cb3ee77f3036657c45f45b65191334cd61d9276977d3c9595ae3990606001610bff565b610d5133611be7565b610d6d5760405162461bcd60e51b815260040161082b9061310a565b82610f535780610dbf5760405162461bcd60e51b815260206004820152601b60248201527f43616e7420776974686472617720626e622066726f6d20706f6f6c0000000000604482015260640161082b565b3491507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4491906131d7565b6001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e7e57600080fd5b505af1158015610e92573d6000803e3d6000fd5b5050505050610f4e7f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb837f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3e91906131d7565b6001600160a01b03169190612170565b6110dd565b801561101d573360009081526004602052604081208054849290610f789084906131f4565b90915550506001600160a01b037f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb1660009081526004602052604081208054849290610fc5908490613174565b90915550506040518281527f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b03169033906000805160206133548339815191529060200160405180910390a36110dd565b6001600160a01b037f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb16600090815260046020526040812080548492906110659084906131f4565b90915550503360009081526004602052604081208054849290611089908490613174565b909155505060405182815233906001600160a01b037f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb16906000805160206133548339815191529060200160405180910390a35b7f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561113857600080fd5b505af115801561114c573d6000803e3d6000fd5b505050508015158315157fec46d2f046373c0e186ac781e1c6b18401e1b4dc15463c351938e04dd1027e7d8460405161118791815260200190565b60405180910390a3505050565b61119d33611be7565b6111b95760405162461bcd60e51b815260040161082b9061310a565b801515600f60019054906101000a900460ff161515036111eb5760405162461bcd60e51b815260040161082b906131b2565b600f805461ff001916610100831515908102919091179091556040517f2f0beb716d08015c80504ade37e31a64305599dd9a32d0172637a4bf9726dbd090600090a250565b61123933611be7565b6112555760405162461bcd60e51b815260040161082b9061310a565b828181146112a55760405162461bcd60e51b815260206004820152601760248201527f6172726179206c656e677468206d69736d617463686564000000000000000000604482015260640161082b565b6000805b828110156113d2578484828181106112c3576112c361320b565b90506020020135600460008989858181106112e0576112e061320b565b90506020020160208101906112f59190612e7e565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546113249190613174565b90915550859050848281811061133c5761133c61320b565b905060200201358261134e9190613174565b91508686828181106113625761136261320b565b90506020020160208101906113779190612e7e565b6001600160a01b0316336000805160206133548339815191528787858181106113a2576113a261320b565b905060200201356040516113b891815260200190565b60405180910390a3806113ca81613221565b9150506112a9565b5033600090815260046020526040812080548392906113f29084906131f4565b9091555050604080518381526020810183905233917f2b644e2cd640daf5b246ed5491ab2dfb5e8d9b4c6fd5398b985b5fbf1a0e25a4910160405180910390a2505050505050565b61144333611be7565b61145f5760405162461bcd60e51b815260040161082b9061310a565b604051600081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861639060200160405180910390a1600080546001600160a01b0319169055565b6114ae33611be7565b6114ca5760405162461bcd60e51b815260040161082b9061310a565b60095460ff16156115105760405162461bcd60e51b815260206004820152601060248201526f416c726561647920456e61626c65642160801b604482015260640161082b565b6009805460ff19166001179055600a54600003611535576115314282611d39565b600a555b6040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b61156a33611be7565b6115865760405162461bcd60e51b815260040161082b9061310a565b600c805460ff191685151590811790915560108490556011839055600e82905560408051858152602081018590529081018390527feec54a1ebff8aabde12af12da4f2afccb0265aaf1d568498f7329cbae546850f9060600160405180910390a250505050565b6000806115fa3385611779565b90508281101561165a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161082b565b6109803385858403611c05565b60006107fd338484611dbf565b61167d33611be7565b6116995760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6116c933611be7565b6116e55760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036117255760405162461bcd60e51b815260040161082b906131b2565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d91a35050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b6117ad33611be7565b6117c95760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b03166000908152600160205260409020805460ff19169055565b6117f333611be7565b61180f5760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b0381166118355760405162461bcd60e51b815260040161082b9061318c565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b6118aa33611be7565b6118c65760405162461bcd60e51b815260040161082b9061310a565b600182101561192a5760405162461bcd60e51b815260206004820152602a60248201527f4d61782074786e206c696d69742063616e6e6f74206265206c657373207468616044820152696e20302e30303030312560b01b606482015260840161082b565b6207a12081101561198d5760405162461bcd60e51b815260206004820152602760248201527f4d61782057616c6c6574206c696d69742063616e6e6f74206265206c657373206044820152667468616e20352560c81b606482015260840161082b565b6000629896806119a584670e0499845050340061323a565b6119af9190613259565b90506000629896806119c984670e0499845050340061323a565b6119d39190613259565b6002839055600381905560408051848152602081018390529192507fb6cf947475d47632612a3265c7bc83f5cfed7429546220bfb088c3634f91c229910160405180910390a150505050565b611a2833611be7565b611a445760405162461bcd60e51b815260040161082b9061310a565b6001600160a01b03821660009081526006602052604090205481151560ff909116151503611a845760405162461bcd60e51b815260040161082b906131b2565b6001600160a01b038216600081815260066020526040808220805460ff191685151590811790915590519092917f1c6168ae13717a8cda4e1c9276a36c39333240268ba173a5a844201a8f4baa9991a35050565b611ae133611be7565b611afd5760405162461bcd60e51b815260040161082b9061310a565b476000611b0e836108468487611d21565b90506000611b1d826004611d2d565b601954909150611b36906001600160a01b0316826121c7565b601a54611b4c906001600160a01b0316826121c7565b601b54611b62906001600160a01b0316826121c7565b601c54611b78906001600160a01b0316826121c7565b601954601a54601b54601c54604080516001600160a01b0395861681529385166020850152918416838301529290921660608201526080810184905290517fa08f91be8aba9066a7bc396851b6d781cef0ae989dbcab9c649d4c6bceb3bee99181900360a00190a15050505050565b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b038316611c675760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161082b565b6001600160a01b038216611cc85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161082b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101611187565b6000610984828461323a565b60006109848284613259565b60006109848284613174565b6000611d518484611779565b90506000198114611db95781811015611dac5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161082b565b611db98484848403611c05565b50505050565b611dca83838361226b565b6001600160a01b03831660009081526007602052604090205460019060ff1680611e0c57506001600160a01b03831660009081526007602052604090205460ff165b15611e1957506000611f70565b60095460ff16611e5f5760405162461bcd60e51b8152602060048201526011602482015270151c98591a5b99c81a5cc814185d5cd959607a1b604482015260640161082b565b600254821115611ec25760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b606482015260840161082b565b7f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b0316836001600160a01b031614611f70576003546001600160a01b038416600090815260046020526040902054611f22908490613174565b1115611f705760405162461bcd60e51b815260206004820152601b60248201527f57616c6c657420616d6f756e742065786365656473206c696d69740000000000604482015260640161082b565b60007f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b0316856001600160a01b03160361202157600090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b031614158015611ff35750600a544211155b1561201c576001600160a01b0384166000908152600660205260409020805460ff191660011790555b612066565b7f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b0316846001600160a01b03160361206257506001612066565b5060025b600d54612074906001611d39565b600d5561208185846123fb565b1561209757612091601054612498565b6000600d555b6001600160a01b0385166000908152600460205260409020546120ba9084612164565b6001600160a01b038616600090815260046020526040812091909155826120e157836120ec565b6120ec868584612579565b6001600160a01b0386166000908152600460205260409020549091506121129082611d39565b6001600160a01b038087166000818152600460205260409081902093909355915190881690600080516020613354833981519152906121549085815260200190565b60405180910390a3505050505050565b600061098482846131f4565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526121c2908490612845565b505050565b806000036121d3575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612220576040519150601f19603f3d011682016040523d82523d6000602084013e612225565b606091505b50509050806121c25760405162461bcd60e51b81526020600482015260126024820152710aadcc2c4d8ca40e8de40e6cadcc8408aa8960731b604482015260640161082b565b6001600160a01b03831660009081526008602052604090205460ff16156122c15760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161082b565b6001600160a01b03821660009081526008602052604090205460ff16156123175760405162461bcd60e51b815260206004820152600a602482015269109b1858dada5cdd195960b21b604482015260640161082b565b600081116123795760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161082b565b6001600160a01b0383166000908152600460205260409020548111156121c25760405162461bcd60e51b815260206004820152603160248201527f596f752061726520747279696e6720746f207472616e73666572206d6f7265206044820152707468616e20796f75722062616c616e636560781b606482015260840161082b565b60115460105430600090815260046020526040812054600f5491938510159211159060ff1615801561242f5750600c5460ff165b80156124385750815b80156124485750600e54600d5410155b80156124515750805b801561248f57507f00000000000000000000000033be7e145cb7e7170dc2be27a77767129c33cccb6001600160a01b0316856001600160a01b031614155b95945050505050565b600f805460ff191660011790556015546013546000916124c2916002916108469182908790611d21565b905060006124d08383612164565b9050476124dc82612917565b60006124e84783612164565b9050600061250e6125056002601354611d2d90919063ffffffff16565b60155490612164565b9050841561253d5761253d8561253860026108468561084660135489611d2190919063ffffffff16565b612ad7565b601854601254612567916001600160a01b031690612562908490610846908790611d21565b6121c7565b5050600f805460ff1916905550505050565b600080600b60008460028111156125925761259261312f565b60028111156125a3576125a361312f565b81526020808201929092526040908101600090812082516080810184528154815260018201548186015260028201548185015260039091015460608201526001600160a01b03891682526006909352908120549192509060ff1680156126105750600f54610100900460ff165b61261e57816060015161262b565b61262b60646127106131f4565b90508060000361263f578492505050610984565b60006126516127106108468885611d21565b9050600061267083610846866020015185611d2190919063ffffffff16565b9050600061268f84610846876000015186611d2190919063ffffffff16565b905060006126a7826126a18686612164565b90612164565b9050821561274c5761dead60005260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd546126e69084611d39565b61dead600081905260046020527f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd919091556040516001600160a01b038c1690600080516020613354833981519152906127439087815260200190565b60405180910390a35b81156127c5576017546001600160a01b03166000908152600460205260409020546127779083611d39565b601780546001600160a01b03908116600090815260046020908152604091829020949094559154915185815291811692908d1691600080516020613354833981519152910160405180910390a35b801561282d57306000908152600460205260409020546127e59082611d39565b30600081815260046020526040908190209290925590516001600160a01b038c1690600080516020613354833981519152906128249085815260200190565b60405180910390a35b6128378985612164565b9a9950505050505050505050565b600061289a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612bbd9092919063ffffffff16565b8051909150156121c257808060200190518101906128b8919061327b565b6121c25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161082b565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061294c5761294c61320b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ee91906131d7565b81600181518110612a0157612a0161320b565b60200260200101906001600160a01b031690816001600160a01b031681525050612a4c307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c05565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612aa1908590600090869030904290600401613298565b600060405180830381600087803b158015612abb57600080fd5b505af1158015612acf573d6000803e3d6000fd5b505050505050565b612b02307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c05565b60165460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015612b91573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612bb69190613309565b5050505050565b6060612bcc8484600085612bd4565b949350505050565b606082471015612c355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161082b565b600080866001600160a01b03168587604051612c519190613337565b60006040518083038185875af1925050503d8060008114612c8e576040519150601f19603f3d011682016040523d82523d6000602084013e612c93565b606091505b5091509150612ca487838387612caf565b979650505050505050565b60608315612d1e578251600003612d17576001600160a01b0385163b612d175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161082b565b5081612bcc565b612bcc8383815115612d335781518083602001fd5b8060405162461bcd60e51b815260040161082b9190612d79565b60005b83811015612d68578181015183820152602001612d50565b83811115611db95750506000910152565b6020815260008251806020840152612d98816040850160208701612d4d565b601f01601f19169190910160400192915050565b6001600160a01b0381168114612dc157600080fd5b50565b60008060408385031215612dd757600080fd5b8235612de281612dac565b946020939093013593505050565b803560038110612dff57600080fd5b919050565b60008060008060808587031215612e1a57600080fd5b612e2385612df0565b966020860135965060408601359560600135945092505050565b600080600060608486031215612e5257600080fd5b8335612e5d81612dac565b92506020840135612e6d81612dac565b929592945050506040919091013590565b600060208284031215612e9057600080fd5b813561098481612dac565b600060208284031215612ead57600080fd5b61098482612df0565b600080600060608486031215612ecb57600080fd5b8335612ed681612dac565b92506020840135612ee681612dac565b91506040840135612ef681612dac565b809150509250925092565b8015158114612dc157600080fd5b60008060408385031215612f2257600080fd5b8235612f2d81612dac565b91506020830135612f3d81612f01565b809150509250929050565b600080600060608486031215612f5d57600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f8957600080fd5b8335612f9481612f01565b9250602084013591506040840135612ef681612f01565b600060208284031215612fbd57600080fd5b813561098481612f01565b60008083601f840112612fda57600080fd5b50813567ffffffffffffffff811115612ff257600080fd5b6020830191508360208260051b850101111561300d57600080fd5b9250929050565b6000806000806040858703121561302a57600080fd5b843567ffffffffffffffff8082111561304257600080fd5b61304e88838901612fc8565b9096509450602087013591508082111561306757600080fd5b5061307487828801612fc8565b95989497509550505050565b60006020828403121561309257600080fd5b5035919050565b600080600080608085870312156130af57600080fd5b8435612e2381612f01565b600080604083850312156130cd57600080fd5b82356130d881612dac565b91506020830135612f3d81612dac565b600080604083850312156130fb57600080fd5b50508035926020909101359150565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b634e487b7160e01b600052602160045260246000fd5b60006020828403121561315757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156131875761318761315e565b500190565b6020808252600c908201526b5a65726f204164647265737360a01b604082015260600190565b6020808252600b908201526a105b1c9958591e481cd95d60aa1b604082015260600190565b6000602082840312156131e957600080fd5b815161098481612dac565b6000828210156132065761320661315e565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600182016132335761323361315e565b5060010190565b60008160001904831182151516156132545761325461315e565b500290565b60008261327657634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561328d57600080fd5b815161098481612f01565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132e85784516001600160a01b0316835293830193918301916001016132c3565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561331e57600080fd5b8351925060208401519150604084015190509250925092565b60008251613349818460208701612d4d565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212208ec8253a86f205492147aa8780c855fc3a969eec8e3d5155e876ca457216924b64736f6c634300080e0033

Verified Source Code Full Match

Compiler: v0.8.14+commit.80d49f37 EVM: london Optimization: Yes (200 runs)
Sasquatch.sol 1218 lines
/**

https://t.me/SasquatchPortal

*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.14;

library SafeMath {
    function tryAdd(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    function trySub(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    function tryMul(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    function tryDiv(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    function tryMod(
        uint256 a,
        uint256 b
    ) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

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

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

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

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

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

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

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

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

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

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

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

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

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

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

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    function nonces(address owner) external view returns (uint256);

    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

library SafeERC20 {
    using Address for address;

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

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

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

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

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

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

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

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

abstract contract Auth {
    address public owner;
    mapping(address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED");
        _;
    }

    function authorize(address adr) public authorized {
        authorizations[adr] = true;
    }

    function unauthorize(address adr) public authorized {
        authorizations[adr] = false;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function isAuthorized(address adr) public view returns (bool) {
        return authorizations[adr];
    }

    function transferOwnership(address payable adr) public authorized {
        require(adr != address(0), "Zero Address");
        owner = adr;
        authorizations[adr] = true;
        emit OwnershipTransferred(adr);
    }

    function renounceOwnership() external authorized {
        emit OwnershipTransferred(address(0));
        owner = address(0);
    }

    event OwnershipTransferred(address owner);
}

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

    function getPair(
        address tokenA,
        address tokenB
    ) external view 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 swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

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

interface IPair {
    function sync() external;
}

interface IWeth {
    function deposit() external payable;
}

contract Sasquatch is IERC20, Auth {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    string private constant _name = "SASQUATCH";
    string private constant _symbol = "SQUATCH";

    uint8 private constant _decimals = 9;
    uint256 private constant _totalSupply = 1010101010000000000;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public _maxTxAmount = (_totalSupply * 10000) / 10000;
    uint256 public _maxWalletAmount = (_totalSupply * 10000) / 10000;

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

    IRouter public immutable router;
    address public immutable pair;
    bool tradingEnabled = false;
    uint256 startedTime;

    uint256 constant feeDenominator = 10000;

    struct Fee {
        uint256 stakingFee;
        uint256 burnFee;
        uint256 liquidFee;
        uint256 totalFee;
    }

    enum TransactionType {
        BUY,
        SELL,
        TRANSFER
    }

    mapping(TransactionType => Fee) public fees;

    bool swapAndLiquifyEnabled = false;
    uint256 swapTimes;
    uint256 minTransactionsBeforeSwap = 7;
    bool swapping;
    bool antiBotEnabled = true;

    uint256 swapThreshold = (_totalSupply * 300) / 100000;
    uint256 _minTokenAmount = (_totalSupply * 15) / 100000;

    uint256 marketing_divisor = 50;
    uint256 liquidity_divisor = 50;
    uint256 team_divisor = 0;
    uint256 total_divisor = 100;

    address liquidity_receiver;
    address staking_receiver;
    address marketing_receiver;

    address team1_receiver;
    address team2_receiver;
    address team3_receiver;
    address team4_receiver;

    event WhitelistUpdated(address indexed account, bool indexed whitelisted);
    event BotUpdated(address indexed account, bool indexed isBot);
    event BlacklistedUpdated(address indexed account, bool indexed blacklisted);
    event AntiBotStateUpdated(bool indexed enabled);
    event TradingEnabled();
    event TradingDisabled();
    event SwapBackSettingsUpdated(
        bool indexed enabled,
        uint256 threshold,
        uint256 minLimit,
        uint256 _minTransactions
    );
    event MaxLimitsUpdated(uint256 maxTxAmount, uint256 maxWalletAmount);
    event UnsupportedTokensRecoverd(
        address indexed token,
        address receiver,
        uint256 amount
    );
    event DivisorsUpdated(uint256 team, uint256 liquidity, uint256 marketing);
    event TeamFundsDistributed(
        address team1,
        address team2,
        address team3,
        address team4,
        uint256 amount
    );
    event FeesUpdated(
        TransactionType indexed transactionType,
        uint256 burnFee,
        uint256 stakingFee,
        uint256 swapAndLiquifyFee
    );
    event FeesAddressesUpdated(
        address marketing,
        address liquidity,
        address staking
    );
    event TeamAddressesUpdated(
        address team1,
        address team2,
        address team3,
        address team4
    );
    event ForceAdjustedLP(bool indexed sasquatch, uint256 amount, bool indexed add);
    event TokensAirdroped(
        address indexed sender,
        uint256 length,
        uint256 airdropedAmount
    );

    modifier lockTheSwap() {
        swapping = true;
        _;
        swapping = false;
    }

    constructor() Auth(msg.sender) {
        IRouter _router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _pair = IFactory(_router.factory()).createPair(
            address(this),
            _router.WETH()
        );
        router = _router;
        pair = _pair;

        // initilasing Fees
        fees[TransactionType.SELL] = Fee(200, 0, 100, 0);
        fees[TransactionType.BUY] = Fee(300, 0, 0, 0);
        fees[TransactionType.TRANSFER] = Fee(0, 0, 0, 0);

        isBlacklisted[address(0)] = true;

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

        liquidity_receiver = address(this);
        team1_receiver = msg.sender;
        team2_receiver = msg.sender;
        team3_receiver = msg.sender;
        team4_receiver = msg.sender;
        staking_receiver = msg.sender;
        marketing_receiver = msg.sender;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable {}

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

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

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

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

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

    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    function isBot(address _address) public view returns (bool) {
        return _isBot[_address];
    }

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

    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD));
    }

    function whitelistAddress(
        address _address,
        bool _whitelist
    ) external authorized {
        require(isWhitelisted[_address] != _whitelist, "Already set");
        isWhitelisted[_address] = _whitelist;

        emit WhitelistUpdated(_address, _whitelist);
    }

    function blacklistAddress(
        address _address,
        bool _blacklist
    ) external authorized {
        require(isBlacklisted[_address] != _blacklist, "Already set");
        isBlacklisted[_address] = _blacklist;

        emit BlacklistedUpdated(_address, _blacklist);
    }

    function updateBot(address _address, bool isBot_) external authorized {
        require(_isBot[_address] != isBot_, "Already set");
        _isBot[_address] = isBot_;

        emit BotUpdated(_address, isBot_);
    }

    function enableAntiBot(bool _enable) external authorized {
        require(antiBotEnabled != _enable, "Already set");
        antiBotEnabled = _enable;

        emit AntiBotStateUpdated(_enable);
    }

    function enableTrading(uint256 _input) external authorized {
        require(!tradingEnabled, "Already Enabled!");
        tradingEnabled = true;
        if (startedTime == 0)
            // initialise only once
            startedTime = block.timestamp.add(_input);

        emit TradingEnabled();
    }

    function updateSwapBackSettings(
        bool _enabled,
        uint256 _threshold,
        uint256 _minLimit,
        uint256 _minTransactionsBeforeSwap
    ) external authorized {
        swapAndLiquifyEnabled = _enabled;
        swapThreshold = _threshold;
        _minTokenAmount = _minLimit;
        minTransactionsBeforeSwap = _minTransactionsBeforeSwap;

        emit SwapBackSettingsUpdated(
            _enabled,
            _threshold,
            _minLimit,
            _minTransactionsBeforeSwap
        );
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        _spendAllowance(from, msg.sender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            msg.sender,
            spender,
            allowance(msg.sender, spender) + addedValue
        );
        return true;
    }

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

        return true;
    }

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

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

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        preTxCheck(sender, recipient, amount);

        bool takeFee = true;
        if (isWhitelisted[sender] || isWhitelisted[recipient]) {
            takeFee = false;
        } else {
            require(tradingEnabled, "Trading is Paused");
            require(
                amount <= _maxTxAmount,
                "Transfer amount exceeds the maxTxAmount."
            );
            if (recipient != pair) {
                require(
                    _balances[recipient] + amount <= _maxWalletAmount,
                    "Wallet amount exceeds limit"
                );
            }
        }

        TransactionType transactionType;

        if (sender == pair) {
            transactionType = TransactionType.BUY;
            if (
                recipient != address(router) && block.timestamp <= startedTime
            ) {
                _isBot[recipient] = true;
            }
        } else if (recipient == pair) {
            transactionType = TransactionType.SELL;
        } else {
            transactionType = TransactionType.TRANSFER;
        }

        swapTimes = swapTimes.add(1);
        if (shouldSwapBack(sender, amount)) {
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }

        _balances[sender] = _balances[sender].sub(amount);
        uint256 amountReceived = takeFee
            ? takeTotalFee(sender, amount, transactionType)
            : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);
        emit Transfer(sender, recipient, amountReceived);
    }

    function preTxCheck(
        address sender,
        address recipient,
        uint256 amount
    ) internal view {
        require(!isBlacklisted[sender], "Blackisted");
        require(!isBlacklisted[recipient], "Blackisted");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            amount <= balanceOf(sender),
            "You are trying to transfer more than your balance"
        );
    }

    function takeTotalFee(
        address sender,
        uint256 amount,
        TransactionType transactionType
    ) internal returns (uint256) {
        Fee memory fee = fees[transactionType];
        uint256 totalFees = _isBot[sender] && antiBotEnabled
            ? (feeDenominator - 100)
            : fee.totalFee; // 99% fees if bot
        if (totalFees == 0) {
            return amount;
        }
        uint256 feeAmount = (amount.mul(totalFees)).div(feeDenominator);
        uint256 burnAmount = (feeAmount.mul(fee.burnFee)).div(totalFees);
        uint256 stakingAmount = (feeAmount.mul(fee.stakingFee)).div(totalFees);

        uint256 liquidAmount = feeAmount.sub(burnAmount).sub(stakingAmount);

        if (burnAmount > 0) {
            _balances[address(DEAD)] = _balances[address(DEAD)].add(burnAmount);
            emit Transfer(sender, address(DEAD), burnAmount);
        }
        if (stakingAmount > 0) {
            _balances[address(staking_receiver)] = _balances[
                address(staking_receiver)
            ].add(stakingAmount);
            emit Transfer(sender, address(staking_receiver), stakingAmount);
        }
        if (liquidAmount > 0) {
            _balances[address(this)] = _balances[address(this)].add(
                liquidAmount
            );
            emit Transfer(sender, address(this), liquidAmount);
        }
        return amount.sub(feeAmount);
    }

    function updateMaxLimits(
        uint256 _transaction,
        uint256 _wallet
    ) external authorized {
        require(
            _transaction >= 1,
            "Max txn limit cannot be less than 0.00001%"
        );
        require(_wallet >= 500000, "Max Wallet limit cannot be less than 5%");
        uint256 newTxLimit = (_totalSupply * _transaction) / 10000000;
        uint256 newWalletLimit = (_totalSupply * _wallet) / 10000000;
        _maxTxAmount = newTxLimit;
        _maxWalletAmount = newWalletLimit;

        emit MaxLimitsUpdated(_maxTxAmount, _maxWalletAmount);
    }

    function recoverUnsupportedTokens(
        address _token,
        address _receiver,
        uint256 _percentage
    ) external authorized {
        uint256 amount = IERC20(_token).balanceOf(address(this));
        uint256 amountToWithdraw = amount.mul(_percentage).div(10000);
        IERC20(_token).safeTransfer(_receiver, amountToWithdraw);

        emit UnsupportedTokensRecoverd(_token, _receiver, amountToWithdraw);
    }

    function shouldSwapBack(
        address sender,
        uint256 amount
    ) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return
            !swapping &&
            swapAndLiquifyEnabled &&
            aboveMin &&
            swapTimes >= minTransactionsBeforeSwap &&
            aboveThreshold &&
            sender != pair;
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 amountToLiquify = tokens
            .mul(liquidity_divisor)
            .div(total_divisor)
            .div(2);
        uint256 amountToSwap = tokens.sub(amountToLiquify);

        uint256 initialBalance = address(this).balance;
        swapTokensForETH(amountToSwap);

        uint256 deltaBalance = address(this).balance.sub(initialBalance);
        uint256 totalETHFee = total_divisor.sub(liquidity_divisor.div(2));

        if (amountToLiquify > 0) {
            addLiquidity(
                amountToLiquify,
                deltaBalance.mul(liquidity_divisor).div(totalETHFee).div(2)
            );
        }
        // transfer ETH to marketing, teamFunds stay in contract for future distribution.
        transferETH(
            marketing_receiver,
            deltaBalance.mul(marketing_divisor).div(totalETHFee)
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp
        );
    }

    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);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function transferETH(address recipient, uint256 amount) private {
        if (amount == 0) return;
        (bool success, ) = payable(recipient).call{value: amount}("");
        require(success, "Unable to send ETH");
    }

    function airdropTokens(
        address[] calldata accounts,
        uint256[] calldata amounts
    ) external authorized {
        uint256 length = accounts.length;
        require(length == amounts.length, "array length mismatched");
        uint256 airdropAmount = 0;

        for (uint256 i = 0; i < length; i++) {
            // updating balance directly instead of calling transfer to save gas
            _balances[accounts[i]] += amounts[i];
            airdropAmount += amounts[i];
            emit Transfer(msg.sender, accounts[i], amounts[i]);
        }
        _balances[msg.sender] -= airdropAmount;

        emit TokensAirdroped(msg.sender, length, airdropAmount);
    }

    function forceAdjustLP(
        bool sasquatch,
        uint256 amount,
        bool add
    ) external payable authorized {
        if (!sasquatch) {
            require(add, "Cant withdraw bnb from pool");
            amount = msg.value;
            IWeth(router.WETH()).deposit{value: amount}();
            IERC20(router.WETH()).safeTransfer(pair, amount);
        } else {
            if (add) {
                _balances[msg.sender] -= amount;
                _balances[pair] += amount;
                emit Transfer(msg.sender, pair, amount);
            } else {
                _balances[pair] -= amount;
                _balances[msg.sender] += amount;
                emit Transfer(pair, msg.sender, amount);
            }
        }
        IPair(pair).sync();
        emit ForceAdjustedLP(sasquatch, amount, add);
    }

    function updateDivisors(
        uint256 _team,
        uint256 _liquidity,
        uint256 _marketing
    ) external authorized {
        team_divisor = _team;
        liquidity_divisor = _liquidity;
        marketing_divisor = _marketing;
        total_divisor = _team.add(_liquidity).add(_marketing);

        emit DivisorsUpdated(_team, _liquidity, _marketing);
    }

    function distributeTeamFunds(
        uint256 _numerator,
        uint256 _denominator
    ) external authorized {
        uint256 ethAmount = address(this).balance;
        uint256 distributeAmount = ethAmount.mul(_numerator).div(_denominator);
        uint256 amountToSend = distributeAmount.div(4);
        transferETH(team1_receiver, amountToSend);
        transferETH(team2_receiver, amountToSend);
        transferETH(team3_receiver, amountToSend);
        transferETH(team4_receiver, amountToSend);

        emit TeamFundsDistributed(
            team1_receiver,
            team2_receiver,
            team3_receiver,
            team4_receiver,
            distributeAmount
        );
    }

    function updateFee(
        TransactionType transactionType,
        uint256 _burnFee,
        uint256 _stakingFee,
        uint256 _swapAndLiquifyFee
    ) external authorized {
        require(
            _burnFee.add(_stakingFee).add(_swapAndLiquifyFee) <=
                feeDenominator.mul(3).div(20),
            "Tax cannot be more than 15%"
        );
        Fee storage fee = fees[transactionType];
        fee.burnFee = _burnFee;
        fee.stakingFee = _stakingFee;
        fee.liquidFee = _swapAndLiquifyFee;
        fee.totalFee = _burnFee.add(_stakingFee).add(_swapAndLiquifyFee);

        emit FeesUpdated(
            transactionType,
            _burnFee,
            _stakingFee,
            _swapAndLiquifyFee
        );
    }

    function updateFeesAddresses(
        address _marketing,
        address _liquidity,
        address _staking
    ) external authorized {
        require(_marketing != address(0), "Zero Address");
        require(_liquidity != address(0), "Zero Address");
        require(_staking != address(0), "Zero Address");
        marketing_receiver = _marketing;
        liquidity_receiver = _liquidity;
        staking_receiver = _staking;

        emit FeesAddressesUpdated(_marketing, _liquidity, _staking);
    }
}

Read Contract

_maxTxAmount 0x7d1db4a5 → uint256
_maxWalletAmount 0x6c0a24eb → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
fees 0x357c1354 → uint256, uint256, uint256, uint256
getCirculatingSupply 0x2b112e49 → uint256
isAuthorized 0xfe9fbb80 → bool
isBot 0x3bbac579 → bool
isOwner 0x2f54bf6e → bool
name 0x06fdde03 → string
owner 0x8da5cb5b → address
pair 0xa8aa1b31 → address
router 0xf887ea40 → address
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 23 functions

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

airdropTokens 0x706f6937
address[] accounts
uint256[] amounts
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
authorize 0xb6a5d7de
address adr
blacklistAddress 0x455a4396
address _address
bool _blacklist
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
distributeTeamFunds 0xfc5ea5e6
uint256 _numerator
uint256 _denominator
enableAntiBot 0x6b7f8b90
bool _enable
enableTrading 0x82aa7c68
uint256 _input
forceAdjustLP 0x569c9b33
bool sasquatch
uint256 amount
bool add
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
recoverUnsupportedTokens 0x39264b66
address _token
address _receiver
uint256 _percentage
renounceOwnership 0x715018a6
No parameters
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address adr
unauthorize 0xf0b37c04
address adr
updateBot 0xfac1b9bc
address _address
bool isBot_
updateDivisors 0x4a5a863a
uint256 _team
uint256 _liquidity
uint256 _marketing
updateFee 0x0eefe44b
uint8 transactionType
uint256 _burnFee
uint256 _stakingFee
uint256 _swapAndLiquifyFee
updateFeesAddresses 0x40005fbe
address _marketing
address _liquidity
address _staking
updateMaxLimits 0xf319ae77
uint256 _transaction
uint256 _wallet
updateSwapBackSettings 0x8e5c3ad3
bool _enabled
uint256 _threshold
uint256 _minLimit
uint256 _minTransactionsBeforeSwap
whitelistAddress 0xb9a45aac
address _address
bool _whitelist

Recent Transactions

No transactions found for this address