Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xfc59975101df5c648143a9F8eb508FbC322f88f6
Balance 0 ETH
Nonce 1
Code Size 11850 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

11850 bytes
0x6080604052600436106102605760003560e01c80638da5cb5b11610144578063dd62ed3e116100b6578063f11a24d31161007a578063f11a24d31461076a578063f2c343e51461078d578063f2fde38b146107ae578063f6374342146107ce578063f8b45b05146107f1578063fc59d23d1461080757600080fd5b8063dd62ed3e146106c5578063df8408fe146106e5578063e086e5ec14610705578063e9481eee1461071a578063ec44adc81461074a57600080fd5b8063a9059cbb11610108578063a9059cbb146105ff578063aa4980231461061f578063b62496f51461063f578063c8c8ebe41461066f578063cf188ad014610685578063d5bf72b7146106a557600080fd5b80638da5cb5b14610569578063921369131461058757806395d89b41146105aa5780639a7a23d6146105bf578063a457c2d7146105df57600080fd5b80635342acb4116101dd57806373b9e82c116101a157806373b9e82c1461049257806375f0a874146104b25780637bce5a04146104d95780637c75ad3a1461050957806385af30c514610529578063894760691461054957600080fd5b80635342acb4146103ec57806357e62b981461041c5780636c516a701461043d57806370a082311461045d578063715018a61461047d57600080fd5b80632ae2f121116102245780632ae2f12114610328578063313ce5671461034857806339509351146103745780634707c5511461039457806348a5317e146103b457600080fd5b806306fdde031461026c578063095ea7b31461029757806318160ddd146102c75780631c499ab0146102e657806323b872dd1461030857600080fd5b3661026757005b600080fd5b34801561027857600080fd5b5061028161081d565b60405161028e9190612996565b60405180910390f35b3480156102a357600080fd5b506102b76102b23660046129de565b6108af565b604051901515815260200161028e565b3480156102d357600080fd5b506002545b60405190815260200161028e565b3480156102f257600080fd5b50610306610301366004612a0a565b6108c9565b005b34801561031457600080fd5b506102b7610323366004612a23565b610987565b34801561033457600080fd5b50610306610343366004612a72565b6109ab565b34801561035457600080fd5b50600654600160a01b900460ff1660405160ff909116815260200161028e565b34801561038057600080fd5b506102b761038f3660046129de565b610a6d565b3480156103a057600080fd5b506103066103af366004612a72565b610a8f565b3480156103c057600080fd5b506007546103d4906001600160a01b031681565b6040516001600160a01b03909116815260200161028e565b3480156103f857600080fd5b506102b7610407366004612aab565b600f6020526000908152604090205460ff1681565b34801561042857600080fd5b506008546102b790600160b81b900460ff1681565b34801561044957600080fd5b50610306610458366004612acf565b610bbe565b34801561046957600080fd5b506102d8610478366004612aab565b610e53565b34801561048957600080fd5b50610306610e6e565b34801561049e57600080fd5b506103066104ad366004612a0a565b610e82565b3480156104be57600080fd5b506008546103d490630100000090046001600160a01b031681565b3480156104e557600080fd5b506008546104f59062ffffff1681565b60405162ffffff909116815260200161028e565b34801561051557600080fd5b506006546103d4906001600160a01b031681565b34801561053557600080fd5b50600d546103d4906001600160a01b031681565b34801561055557600080fd5b50610306610564366004612aab565b610f15565b34801561057557600080fd5b506005546001600160a01b03166103d4565b34801561059357600080fd5b506007546104f590600160e01b900462ffffff1681565b3480156105b657600080fd5b50610281610ff4565b3480156105cb57600080fd5b506103066105da366004612a72565b611003565b3480156105eb57600080fd5b506102b76105fa3660046129de565b6110ab565b34801561060b57600080fd5b506102b761061a3660046129de565b611126565b34801561062b57600080fd5b5061030661063a366004612a0a565b611134565b34801561064b57600080fd5b506102b761065a366004612aab565b60106020526000908152604090205460ff1681565b34801561067b57600080fd5b506102d8600b5481565b34801561069157600080fd5b50600c546103d4906001600160a01b031681565b3480156106b157600080fd5b506103066106c0366004612b15565b6111f8565b3480156106d157600080fd5b506102d86106e0366004612acf565b61135a565b3480156106f157600080fd5b50610306610700366004612a72565b611385565b34801561071157600080fd5b5061030661143f565b34801561072657600080fd5b506102b7610735366004612aab565b600e6020526000908152604090205460ff1681565b34801561075657600080fd5b50610306610765366004612b15565b6114f2565b34801561077657600080fd5b506007546104f590600160c81b900462ffffff1681565b34801561079957600080fd5b506007546102b790600160a01b900460ff1681565b3480156107ba57600080fd5b506103066107c9366004612aab565b61164c565b3480156107da57600080fd5b506007546104f590600160b01b900462ffffff1681565b3480156107fd57600080fd5b506102d8600a5481565b34801561081357600080fd5b506102d860095481565b60606003805461082c90612b48565b80601f016020809104026020016040519081016040528092919081815260200182805461085890612b48565b80156108a55780601f1061087a576101008083540402835291602001916108a5565b820191906000526020600020905b81548152906001019060200180831161088857829003601f168201915b5050505050905090565b6000336108bd8185856116c2565b60019150505b92915050565b6108d16117e6565b6127106108dd60025490565b6108e79190612b98565b8110156109455760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b60648201526084015b60405180910390fd5b600a546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1600a55565b600033610995858285611840565b6109a08585856118ba565b506001949350505050565b6109b36117e6565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503610a0d5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b604482015260640161093c565b6001600160a01b0382166000818152600e6020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6000336108bd818585610a80838361135a565b610a8a9190612bba565b6116c2565b610a976117e6565b6001600160a01b038216610aed5760405162461bcd60e51b815260206004820152601b60248201527f6d61726b6574696e672077616c6c65742063616e277420626520300000000000604482015260640161093c565b60085460408051831515815260ff600160b81b840416151560208201526001600160a01b0363010000009093048316928516917fc8dfdd9b91ac62ee1bd8be3541ea02d8e584461c794c6e49e94ccf21c71ebcca910160405180910390a3600880546301000000600160c01b03191663010000006001600160a01b039490941693840260ff60b81b191617600160b81b921515929092029190911790556000908152600f60209081526040808320805460ff199081166001908117909255600e909352922080549091169091179055565b610bc66117e6565b600780546001600160a01b0319166001600160a01b0383811691909117909155600c54838216911614610c1c57610c0030836000196116c2565b600c80546001600160a01b0319166001600160a01b0384161790555b600c60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190612bcd565b6007546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d089190612bcd565b600d80546001600160a01b0319166001600160a01b03928316179055600c54604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015610d66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8a9190612bcd565b6007546001600160a01b03908116911614610dd057600c54600754610dbe916001600160a01b039182169116600019611c60565b6007805460ff60a01b19169055610de4565b6007805460ff60a01b1916600160a01b1790555b600c54600d54600754604080516001600160a01b039485168152928416602084015292168183015290517f113a6e83812f48b2f83795e33cb009afb4ba6e240c9c643c5dc75791e4ce7ab69181900360600190a1600d54610e4f906001600160a01b03166001611dad565b5050565b6001600160a01b031660009081526020819052604090205490565b610e766117e6565b610e806000611e16565b565b610e8a6117e6565b60008111610ed35760405162461bcd60e51b815260206004820152601660248201527506d696e416d6f756e74546f54616b65466565203e20360541b604482015260640161093c565b6009546040805183815260208101929092527f772a06bc936eb749842080c472181e970cd4f23bd1ab7d0b84a80aec26910434910160405180910390a1600955565b610f1d6117e6565b6001600160a01b0381163003610f635760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b604482015260640161093c565b610ff1610f786005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015610fbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe09190612bea565b6001600160a01b0384169190611e68565b50565b60606004805461082c90612b48565b61100b6117e6565b6001600160a01b03821660009081526010602052604090205481151560ff9091161515036110a15760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c75650000000000000000606482015260840161093c565b610e4f8282611dad565b600033816110b9828661135a565b9050838110156111195760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161093c565b6109a082868684036116c2565b6000336108bd8185856118ba565b61113c6117e6565b61271061114860025490565b6111529190612b98565b8110156111b65760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b606482015260840161093c565b600b546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1600b55565b6112006117e6565b60075462030d409061121e90600160e01b900462ffffff1684612c03565b62ffffff1611156112635760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20666565203c3d2032302560881b604482015260640161093c565b60085462030d409061127a9062ffffff1683612c03565b62ffffff1611156112be5760405162461bcd60e51b815260206004820152600e60248201526d62757920666565203c3d2032302560901b604482015260640161093c565b6007546040805162ffffff85811682528481166020830152600160b01b8404811682840152600160c81b9093049092166060830152517fdec183740138e3a28dfd6f973ecd3bf00cd5d9b2544f6763c0a87f721444c5d19181900360800190a16007805465ffffffffffff60b01b1916600160b01b62ffffff9485160262ffffff60c81b191617600160c81b9290931691909102919091179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61138d6117e6565b6001600160a01b0382166000908152600f602052604090205481151560ff9091161515036113e75760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b604482015260640161093c565b6001600160a01b0382166000818152600f6020908152604091829020805460ff191685151590811790915591519182527f2d43abd87b27cee7b0aa8c6f7e0b4a3247b683262a83cbc2318b0df398a49aa99101610a61565b6114476117e6565b600061145b6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146114a5576040519150601f19603f3d011682016040523d82523d6000602084013e6114aa565b606091505b5050905080610ff15760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b604482015260640161093c565b6114fa6117e6565b60075462030d409061151890600160b01b900462ffffff1684612c03565b62ffffff16111561155d5760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20666565203c3d2032302560881b604482015260640161093c565b60075462030d409061157b90600160c81b900462ffffff1683612c03565b62ffffff1611156115bf5760405162461bcd60e51b815260206004820152600e60248201526d62757920666565203c3d2032302560901b604482015260640161093c565b6007546008546040805162ffffff86811682528581166020830152600160e01b909404841681830152929091166060830152517f70748cb9cb3bcb4dfd4fff8f2a6f23f636067b33e0244631f9abd38159c1de859181900360800190a16007805462ffffff60e01b1916600160e01b62ffffff948516021790556008805462ffffff191691909216179055565b6116546117e6565b6001600160a01b0381166116b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161093c565b610ff181611e16565b6001600160a01b0383166117245760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161093c565b6001600160a01b0382166117855760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161093c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b03163314610e805760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161093c565b600061184c848461135a565b905060001981146118b457818110156118a75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161093c565b6118b484848484036116c2565b50505050565b6001600160a01b0383166118e05760405162461bcd60e51b815260040161093c90612c26565b6001600160a01b0382166119065760405162461bcd60e51b815260040161093c90612c6b565b600061191130610e53565b905060006012546011546119259190612bba565b90506000600954821015801561193b5750828211155b600754909150600160a81b900460ff1615801561196d5750600d5460009061196b906001600160a01b0316610e53565b115b80156119765750805b801561199a57506001600160a01b03851660009081526010602052604090205460ff165b156119a7576119a7611e98565b6007546000908190600160a81b900460ff161580156119df57506001600160a01b0388166000908152600f602052604090205460ff16155b8015611a0457506001600160a01b0387166000908152600f602052604090205460ff16155b15611b4e576001600160a01b03881660009081526010602052604090205460ff1615611a7d57600754620f424090611a4890600160c81b900462ffffff1688612cae565b611a529190612b98565b600854909250620f424090611a6c9062ffffff1688612cae565b611a769190612b98565b9050611af4565b6001600160a01b03871660009081526010602052604090205460ff1615611af457600754620f424090611abc90600160b01b900462ffffff1688612cae565b611ac69190612b98565b600754909250620f424090611ae790600160e01b900462ffffff1688612cae565b611af19190612b98565b90505b6000611b008284612bba565b90508015611b1357611b13893083612358565b81611b1e8489612cc5565b611b289190612cc5565b965082601154611b389190612bba565b601155601254611b49908390612bba565b601255505b611b59888888612358565b600754600160a81b900460ff16611c56576001600160a01b0388166000908152600e602052604090205460ff16611bdc57600b54861115611bdc5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d6974000000604482015260640161093c565b6001600160a01b0387166000908152600e602052604090205460ff16611c5657600a54611c0888610e53565b1115611c565760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d697400604482015260640161093c565b5050505050505050565b801580611cda5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd89190612bea565b155b611d455760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606482015260840161093c565b6040516001600160a01b038316602482015260448101829052611da890849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612482565b505050565b6001600160a01b0382166000818152601060209081526040808320805486151560ff199182168117909255600e84529382902080549094168117909355519182527fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab9101610a61565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040516001600160a01b038316602482015260448101829052611da890849063a9059cbb60e01b90606401611d71565b6007805460ff60a81b1916600160a81b179055601154600090611ebd90600290612b98565b600754909150600090600160a01b900460ff16611f45576007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f409190612bea565b611f47565b475b600854909150600090600160b81b900460ff161561216857600060125484611f6f9190612bba565b90508015611f8057611f8081612557565b600754600090600160a01b900460ff1661200f576007546040516370a0823160e01b815230600482015285916001600160a01b0316906370a0823190602401602060405180830381865afa158015611fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120009190612bea565b61200a9190612cc5565b612019565b6120198447612cc5565b90506000826012548361202c9190612cae565b6120369190612b98565b90506120428183612cc5565b9350801561216057600754600160a01b900460ff161561210057600854604051600091630100000090046001600160a01b03169083908381818185875af1925050503d80600081146120b0576040519150601f19603f3d011682016040523d82523d6000602084013e6120b5565b606091505b5050905080156120fa576040805160008152602081018490527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b50612160565b600854600754612125916001600160a01b039182169163010000009091041683611e68565b6040805160008152602081018390527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b505050612277565b82156121775761217783612557565b600754600160a01b900460ff16612203576007546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156121d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f49190612bea565b6121fe9190612cc5565b61220d565b61220d8247612cc5565b601254909150156122775761223a30600860039054906101000a90046001600160a01b03166012546118ba565b60125460408051918252600060208301527f6f92bce3e91466137aa4d5474fe565c002872fb18ed6af4a856959be0a81277a910160405180910390a15b6000831180156122875750600081115b156122d0576122968382612694565b60408051848152602081018390527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15b6000601281905560118190556122e530610e53565b11156123465760006122ff6005546001600160a01b031690565b6001600160a01b03161461233657612331306123236005546001600160a01b031690565b61232c30610e53565b6118ba565b612346565b6123463061dead61232c30610e53565b50506007805460ff60a81b1916905550565b6001600160a01b03831661237e5760405162461bcd60e51b815260040161093c90612c26565b6001600160a01b0382166123a45760405162461bcd60e51b815260040161093c90612c6b565b6001600160a01b0383166000908152602081905260409020548181101561241c5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161093c565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36118b4565b60006124d7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166127e29092919063ffffffff16565b90508051600014806124f85750808060200190518101906124f89190612cd8565b611da85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161093c565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061258c5761258c612cf5565b6001600160a01b0392831660209182029290920101526007548251911690829060019081106125bd576125bd612cf5565b6001600160a01b039092166020928302919091019091015260075460ff600160a01b909104161561265757600c5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612621908590600090869030904290600401612d4f565b600060405180830381600087803b15801561263b57600080fd5b505af115801561264f573d6000803e3d6000fd5b505050505050565b600654600c54604051637274ca1b60e11b81526001600160a01b039283169263e4e994369261262192911690869060009087904290600401612d8b565b600754600160a01b900460ff161561274057600c5460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612714573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127399190612dca565b5050505050565b600c5460075460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156127be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127399190612dca565b60606127f184846000856127f9565b949350505050565b60608247101561285a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161093c565b600080866001600160a01b031685876040516128769190612df8565b60006040518083038185875af1925050503d80600081146128b3576040519150601f19603f3d011682016040523d82523d6000602084013e6128b8565b606091505b50915091506128c9878383876128d4565b979650505050505050565b6060831561294357825160000361293c576001600160a01b0385163b61293c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161093c565b50816127f1565b6127f183838151156129585781518083602001fd5b8060405162461bcd60e51b815260040161093c9190612996565b60005b8381101561298d578181015183820152602001612975565b50506000910152565b60208152600082518060208401526129b5816040850160208701612972565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610ff157600080fd5b600080604083850312156129f157600080fd5b82356129fc816129c9565b946020939093013593505050565b600060208284031215612a1c57600080fd5b5035919050565b600080600060608486031215612a3857600080fd5b8335612a43816129c9565b92506020840135612a53816129c9565b929592945050506040919091013590565b8015158114610ff157600080fd5b60008060408385031215612a8557600080fd5b8235612a90816129c9565b91506020830135612aa081612a64565b809150509250929050565b600060208284031215612abd57600080fd5b8135612ac8816129c9565b9392505050565b60008060408385031215612ae257600080fd5b8235612aed816129c9565b91506020830135612aa0816129c9565b803562ffffff81168114612b1057600080fd5b919050565b60008060408385031215612b2857600080fd5b612b3183612afd565b9150612b3f60208401612afd565b90509250929050565b600181811c90821680612b5c57607f821691505b602082108103612b7c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082612bb557634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156108c3576108c3612b82565b600060208284031215612bdf57600080fd5b8151612ac8816129c9565b600060208284031215612bfc57600080fd5b5051919050565b62ffffff818116838216019080821115612c1f57612c1f612b82565b5092915050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b80820281158282048414176108c3576108c3612b82565b818103818111156108c3576108c3612b82565b600060208284031215612cea57600080fd5b8151612ac881612a64565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015612d445781516001600160a01b031687529582019590820190600101612d1f565b509495945050505050565b85815284602082015260a060408201526000612d6e60a0830186612d0b565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a060608201526000612db860a0830185612d0b565b90508260808301529695505050505050565b600080600060608486031215612ddf57600080fd5b8351925060208401519150604084015190509250925092565b60008251612e0a818460208701612972565b919091019291505056fea264697066735822122051239ce113a93e4f82bd35e10efaac20758b6760929e687477149d959877c48664736f6c63430008130033

Verified Source Code Full Match

Compiler: v0.8.19+commit.7dd6d404 EVM: paris Optimization: Yes (200 runs)
StandardToken.sol 1437 lines
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

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

pragma solidity ^0.8.0;

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

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    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 to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), 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 _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 _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _transferOwnership(_msgSender());
    }
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

library 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 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }
    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");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }
    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");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // 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 cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

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

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

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

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

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

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

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

    function initialize(address, address) external;
}

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}
pragma solidity 0.8.19;

interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}
interface IFee {
    function payFee(
        uint256 _tokenType,
        address creator,
        bool isAntibot,
        address referrer
    ) external payable;
}
contract StandardToken is ERC20, Ownable {
    using SafeERC20 for IERC20;
    struct Args {
        string name;
        string symbol;
        uint8 decimals;
        uint256 totalSupply;
        uint256 maxWallet;
        uint256 maxTransactionAmount;
        address marketingWallet;
        address baseTokenForMarket;
        address mainRouter;
        bool isMarketingFeeBaseToken;
        uint24 sellLiquidityFee;
        uint24 buyLiquidityFee;
        uint24 sellMarketingFee;
        uint24 buyMarketingFee;
        address feeContract;
        address uniswapV2Caller;
    }
    IUniswapV2Caller public uniswapV2Caller;

    uint256 private constant MAX = ~uint256(0);

    uint8 private _decimals;
    ///////////////////////////////////////////////////////////////////////////
    address public baseTokenForMarket;
    bool public isBaseTokenWETH;
    bool private inSwapAndLiquify;
    uint24 public sellLiquidityFee;
    uint24 public buyLiquidityFee;

    uint24 public sellMarketingFee;
    uint24 public buyMarketingFee;

    address public marketingWallet;
    bool public isMarketingFeeBaseToken;

    uint256 public minAmountToTakeFee;
    uint256 public maxWallet;
    uint256 public maxTransactionAmount;

    address public mainRouter;
    address public mainPair;


    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;
    event UpdateLiquidityFee(
        uint24 newSellLiquidityFee,
        uint24 newBuyLiquidityFee,
        uint24 oldSellLiquidityFee,
        uint24 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint24 newSellMarketingFee,
        uint24 newBuyMarketingFee,
        uint24 oldSellMarketingFee,
        uint24 oldBuyMarketingFee
    );
    event UpdateMarketingWallet(
        address indexed newMarketingWallet,
        bool newIsMarketingFeeBaseToken,
        address indexed oldMarketingWallet,
        bool oldIsMarketingFeeBaseToken
    );
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event UpdateMinAmountToTakeFee(uint256 newMinAmountToTakeFee, uint256 oldMinAmountToTakeFee);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event ExcludedFromFee(address indexed account, bool isEx);
    event SwapAndLiquify(
        uint256 tokensForLiquidity,
        uint256 baseTokenForLiquidity
    );
    event MarketingFeeTaken(
        uint256 marketingFeeTokens,
        uint256 marketingFeeBaseTokenSwapped
    );
    event MainRouterUpdated(
        address mainRouter, address mainPair, address baseTokenForMarket
    );
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    ///////////////////////////////////////////////////////////////////////////////
 

    constructor(
        Args memory args,
        address[] memory autoApproveAddressList,
        address referrer
    ) ERC20(args.name, args.symbol) payable {
        IFee(args.feeContract).payFee{value: msg.value}(1, _msgSender(), false, referrer);   
        _decimals = args.decimals;
        _mint(msg.sender, args.totalSupply);
        uniswapV2Caller = IUniswapV2Caller(args.uniswapV2Caller);
        baseTokenForMarket=args.baseTokenForMarket;
        require(args.marketingWallet!=address(0), "marketing wallet can not be 0");
        require(args.mainRouter!=address(0), "Router address can not be 0");
        require(args.sellLiquidityFee+args.sellMarketingFee<=200000, "sell fee <= 20%");
        require(args.buyLiquidityFee+args.buyMarketingFee<=200000, "buy fee <= 20%");

        marketingWallet=args.marketingWallet;
        isMarketingFeeBaseToken=args.isMarketingFeeBaseToken;
        emit UpdateMarketingWallet(
            marketingWallet,
            isMarketingFeeBaseToken,
            address(0),
            false
        );
        mainRouter=args.mainRouter;
        if(baseTokenForMarket != IUniswapV2Router02(mainRouter).WETH()){            
            IERC20(baseTokenForMarket).safeApprove(mainRouter, MAX);            
        }else{
            isBaseTokenWETH=true;
        }
       
        
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), mainRouter, MAX);
        for(uint256 i=0;i<autoApproveAddressList.length;i++){
            _approve(_msgSender(), autoApproveAddressList[i], MAX);
            isExcludedFromFee[autoApproveAddressList[i]] = true;
            isExcludedFromMaxTransactionAmount[autoApproveAddressList[i]]=true;
        }
        
        emit MainRouterUpdated(mainRouter, mainPair, baseTokenForMarket);
        mainPair = IUniswapV2Factory(IUniswapV2Router02(mainRouter).factory()).createPair(
            address(this),
            baseTokenForMarket
        );
 
        
        require(args.maxTransactionAmount>=args.totalSupply / 10000, "maxTransactionAmount >= total supply / 10000");
        require(args.maxWallet>=args.totalSupply / 10000, "maxWallet >= total supply / 10000");
        maxWallet=args.maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=args.maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        
        sellLiquidityFee=args.sellLiquidityFee;
        buyLiquidityFee=args.buyLiquidityFee;
        emit UpdateLiquidityFee(sellLiquidityFee, buyLiquidityFee, 0, 0);        
        sellMarketingFee=args.sellMarketingFee;
        buyMarketingFee=args.buyMarketingFee;
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        minAmountToTakeFee=args.totalSupply/10000;
        emit UpdateMinAmountToTakeFee(minAmountToTakeFee, 0);
        isExcludedFromFee[address(this)]=true;
        isExcludedFromFee[marketingWallet]=true;
        isExcludedFromFee[_msgSender()]=true;
        isExcludedFromFee[address(0xdead)] = true;
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[marketingWallet]=true;
        isExcludedFromMaxTransactionAmount[_msgSender()]=true;
        _setAutomatedMarketMakerPair(mainPair, true);
    }

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

    function updateMainPair(
        address _mainRouter,
        address _baseTokenForMarket
    ) external onlyOwner {
        baseTokenForMarket = _baseTokenForMarket;
        if(mainRouter != _mainRouter){
            _approve(address(this), _mainRouter, MAX);
            mainRouter = _mainRouter;
        } 
        mainPair = IUniswapV2Factory(IUniswapV2Router02(mainRouter).factory()).createPair(
            address(this),
            baseTokenForMarket
        );
        if(baseTokenForMarket != IUniswapV2Router02(mainRouter).WETH()){            
            IERC20(baseTokenForMarket).safeApprove(mainRouter, MAX);
            isBaseTokenWETH=false;            
        }else{
            isBaseTokenWETH=true;
        }
     
        emit MainRouterUpdated(mainRouter, mainPair, baseTokenForMarket);
        _setAutomatedMarketMakerPair(mainPair, true);
    }


    /////////////////////////////////////////////////////////////////////////////////
    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    function updateLiquidityFee(
        uint24 _sellLiquidityFee,
        uint24 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee + sellMarketingFee <= 200000,
            "sell fee <= 20%"
        );
        require(_buyLiquidityFee + buyMarketingFee <= 200000, "buy fee <= 20%");
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;           
    }

    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=totalSupply() / 10000, "maxWallet >= total supply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=totalSupply() / 10000, "maxTransactionAmount >= total supply / 10000");
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }

    function updateMarketingFee(
        uint24 _sellMarketingFee,
        uint24 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee + sellLiquidityFee <= 200000,
            "sell fee <= 20%"
        );
        require(_buyMarketingFee + buyLiquidityFee <= 200000, "buy fee <= 20%");
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;  
    }

    function updateMarketingWallet(
        address _marketingWallet,
        bool _isMarketingFeeBaseToken
    ) external onlyOwner {
        require(_marketingWallet != address(0), "marketing wallet can't be 0");
        emit UpdateMarketingWallet(_marketingWallet, _isMarketingFeeBaseToken,
            marketingWallet, isMarketingFeeBaseToken);
        marketingWallet = _marketingWallet;
        isMarketingFeeBaseToken = _isMarketingFeeBaseToken;
        isExcludedFromFee[_marketingWallet] = true;
        isExcludedFromMaxTransactionAmount[_marketingWallet] = true;
    }

    function updateMinAmountToTakeFee(uint256 _minAmountToTakeFee)
        external
        onlyOwner
    {
        require(_minAmountToTakeFee > 0, "minAmountToTakeFee > 0");
        emit UpdateMinAmountToTakeFee(_minAmountToTakeFee, minAmountToTakeFee);
        minAmountToTakeFee = _minAmountToTakeFee;     
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {        
        automatedMarketMakerPairs[pair] = value;
        isExcludedFromMaxTransactionAmount[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromFee(address account, bool isEx) external onlyOwner {
        require(isExcludedFromFee[account] != isEx, "already");
        isExcludedFromFee[account] = isEx;
        emit ExcludedFromFee(account, isEx);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 contractTokenBalance = balanceOf(address(this));
        
        uint256 totalTokensTaken = _liquidityFeeTokens + _marketingFeeTokens;
        bool overMinimumTokenBalance = totalTokensTaken >=
            minAmountToTakeFee && totalTokensTaken <= contractTokenBalance;
        // Take Fee
        if (
            !inSwapAndLiquify &&
            balanceOf(mainPair) > 0 &&
            overMinimumTokenBalance &&
            automatedMarketMakerPairs[to]
        ) {
            takeFee();
        }

        uint256 _liquidityFee;
        uint256 _marketingFee;
        // If any account belongs to isExcludedFromFee account then remove the fee

        if (
            !inSwapAndLiquify &&
            !isExcludedFromFee[from] &&
            !isExcludedFromFee[to]
        ) {
            // Buy
            if (automatedMarketMakerPairs[from]) {
                _liquidityFee = amount * buyLiquidityFee / 1000000;
                _marketingFee = amount * buyMarketingFee / 1000000;
            }
            // Sell
            else if (automatedMarketMakerPairs[to]) {
                _liquidityFee = amount * sellLiquidityFee / 1000000;
                _marketingFee = amount * sellMarketingFee / 1000000;
            }
            uint256 _feeTotal = _liquidityFee + _marketingFee;
            if (_feeTotal > 0) super._transfer(from, address(this), _feeTotal);
            amount = amount - _liquidityFee - _marketingFee;
            _liquidityFeeTokens = _liquidityFeeTokens + _liquidityFee;
            _marketingFeeTokens ...

// [truncated — 55550 bytes total]

Read Contract

allowance 0xdd62ed3e → uint256
automatedMarketMakerPairs 0xb62496f5 → bool
balanceOf 0x70a08231 → uint256
baseTokenForMarket 0x48a5317e → address
buyLiquidityFee 0xf11a24d3 → uint24
buyMarketingFee 0x7bce5a04 → uint24
decimals 0x313ce567 → uint8
isBaseTokenWETH 0xf2c343e5 → bool
isExcludedFromFee 0x5342acb4 → bool
isExcludedFromMaxTransactionAmount 0xe9481eee → bool
isMarketingFeeBaseToken 0x57e62b98 → bool
mainPair 0x85af30c5 → address
mainRouter 0xcf188ad0 → address
marketingWallet 0x75f0a874 → address
maxTransactionAmount 0xc8c8ebe4 → uint256
maxWallet 0xf8b45b05 → uint256
minAmountToTakeFee 0xfc59d23d → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellLiquidityFee 0xf6374342 → uint24
sellMarketingFee 0x92136913 → uint24
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256
uniswapV2Caller 0x7c75ad3a → address

Write Contract 19 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
excludeFromFee 0xdf8408fe
address account
bool isEx
excludeFromMaxTransactionAmount 0x2ae2f121
address account
bool isEx
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
setAutomatedMarketMakerPair 0x9a7a23d6
address pair
bool value
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateLiquidityFee 0xd5bf72b7
uint24 _sellLiquidityFee
uint24 _buyLiquidityFee
updateMainPair 0x6c516a70
address _mainRouter
address _baseTokenForMarket
updateMarketingFee 0xec44adc8
uint24 _sellMarketingFee
uint24 _buyMarketingFee
updateMarketingWallet 0x4707c551
address _marketingWallet
bool _isMarketingFeeBaseToken
updateMaxTransactionAmount 0xaa498023
uint256 _maxTransactionAmount
updateMaxWallet 0x1c499ab0
uint256 _maxWallet
updateMinAmountToTakeFee 0x73b9e82c
uint256 _minAmountToTakeFee
withdrawETH 0xe086e5ec
No parameters
withdrawToken 0x89476069
address token

Recent Transactions

No transactions found for this address