Address Contract Verified
Address
0xfc59975101df5c648143a9F8eb508FbC322f88f6
Balance
0 ETH
Nonce
1
Code Size
11850 bytes
Creator
0x70Ad08fE...9233 at tx 0x895e08ce...3736b6
Indexed Transactions
0
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