Address Contract Partially Verified
Address
0xc8394F322427a7bbC635F49ec90d07d87858D752
Balance
0 ETH
Nonce
1
Code Size
18944 bytes
Creator
0xb9F5B0a5...fe93 at tx 0x54a04269...b51b78
Indexed Transactions
0 (1 on-chain, 0% indexed)
Contract Bytecode
18944 bytes
0x60806040526004361061039b5760003560e01c80638ea5220f116101dc578063c17b5b8c11610102578063dd62ed3e116100a0578063f25744f11161006f578063f25744f114610de3578063f2fde38b14610e0c578063f637434214610e35578063f8b45b0514610e60576103a2565b8063dd62ed3e14610d25578063e2f4560514610d62578063e884f26014610d8d578063f11a24d314610db8576103a2565b8063c8c8ebe4116100dc578063c8c8ebe414610c55578063d257b34f14610c80578063d3bef90614610cbd578063d85ba06314610cfa576103a2565b8063c17b5b8c14610bd8578063c18bc19514610c01578063c876d0b914610c2a576103a2565b8063a0d82dc51161017a578063aacebbe311610149578063aacebbe314610b1e578063b62496f514610b47578063bbc0c74214610b84578063c024666814610baf576103a2565b8063a0d82dc514610a3c578063a200c88d14610a67578063a457c2d714610aa4578063a9059cbb14610ae1576103a2565b806395d89b41116101b657806395d89b41146109925780639a7a23d6146109bd5780639c3b4fdc146109e65780639fccce3214610a11576103a2565b80638ea5220f14610913578063921369131461093e578063924de9b714610969576103a2565b806339be1a1f116102c1578063715018a61161025f578063773e0d9c1161022e578063773e0d9c146108695780637bce5a04146108945780638095d564146108bf5780638da5cb5b146108e8576103a2565b8063715018a6146107d3578063751039fc146107ea5780637571336a1461081557806375f0a8741461083e576103a2565b80634fbee1931161029b5780634fbee193146107035780636a486a8e146107405780636ddd17131461076b57806370a0823114610796576103a2565b806339be1a1f1461067057806349bd5a5e146106ad5780634a62bb65146106d8576103a2565b80631816467f1161033957806323b872dd1161030857806323b872dd146105a057806327c8f835146105dd578063313ce567146106085780633950935114610633576103a2565b80631816467f146104f85780631a8145bb146105215780631f3fed8f1461054c578063203e727e14610577576103a2565b806310d5de531161037557806310d5de531461043a5780631564336e146104775780631694505e146104a257806318160ddd146104cd576103a2565b806304113890146103a757806306fdde03146103d2578063095ea7b3146103fd576103a2565b366103a257005b600080fd5b3480156103b357600080fd5b506103bc610e8b565b6040516103c991906135a4565b60405180910390f35b3480156103de57600080fd5b506103e7610e9e565b6040516103f4919061364f565b60405180910390f35b34801561040957600080fd5b50610424600480360381019061041f919061370a565b610f30565b60405161043191906135a4565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c919061374a565b610f53565b60405161046e91906135a4565b60405180910390f35b34801561048357600080fd5b5061048c610f73565b60405161049991906135a4565b60405180910390f35b3480156104ae57600080fd5b506104b7610f86565b6040516104c491906137d6565b60405180910390f35b3480156104d957600080fd5b506104e2610faa565b6040516104ef9190613800565b60405180910390f35b34801561050457600080fd5b5061051f600480360381019061051a919061374a565b610fb4565b005b34801561052d57600080fd5b5061053661107c565b6040516105439190613800565b60405180910390f35b34801561055857600080fd5b50610561611082565b60405161056e9190613800565b60405180910390f35b34801561058357600080fd5b5061059e6004803603810190610599919061381b565b611088565b005b3480156105ac57600080fd5b506105c760048036038101906105c29190613848565b611123565b6040516105d491906135a4565b60405180910390f35b3480156105e957600080fd5b506105f2611152565b6040516105ff91906138aa565b60405180910390f35b34801561061457600080fd5b5061061d611158565b60405161062a91906138e1565b60405180910390f35b34801561063f57600080fd5b5061065a6004803603810190610655919061370a565b611161565b60405161066791906135a4565b60405180910390f35b34801561067c57600080fd5b506106976004803603810190610692919061374a565b611198565b6040516106a491906135a4565b60405180910390f35b3480156106b957600080fd5b506106c26111b8565b6040516106cf91906138aa565b60405180910390f35b3480156106e457600080fd5b506106ed6111dc565b6040516106fa91906135a4565b60405180910390f35b34801561070f57600080fd5b5061072a6004803603810190610725919061374a565b6111ef565b60405161073791906135a4565b60405180910390f35b34801561074c57600080fd5b50610755611245565b6040516107629190613800565b60405180910390f35b34801561077757600080fd5b5061078061124b565b60405161078d91906135a4565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b8919061374a565b61125e565b6040516107ca9190613800565b60405180910390f35b3480156107df57600080fd5b506107e86112a6565b005b3480156107f657600080fd5b506107ff6112ba565b60405161080c91906135a4565b60405180910390f35b34801561082157600080fd5b5061083c60048036038101906108379190613928565b6112e6565b005b34801561084a57600080fd5b50610853611349565b60405161086091906138aa565b60405180910390f35b34801561087557600080fd5b5061087e61136f565b60405161088b9190613800565b60405180910390f35b3480156108a057600080fd5b506108a9611375565b6040516108b69190613800565b60405180910390f35b3480156108cb57600080fd5b506108e660048036038101906108e19190613968565b61137b565b005b3480156108f457600080fd5b506108fd61141a565b60405161090a91906138aa565b60405180910390f35b34801561091f57600080fd5b50610928611444565b60405161093591906138aa565b60405180910390f35b34801561094a57600080fd5b5061095361146a565b6040516109609190613800565b60405180910390f35b34801561097557600080fd5b50610990600480360381019061098b91906139bb565b611470565b005b34801561099e57600080fd5b506109a7611495565b6040516109b4919061364f565b60405180910390f35b3480156109c957600080fd5b506109e460048036038101906109df9190613928565b611527565b005b3480156109f257600080fd5b506109fb6115cb565b604051610a089190613800565b60405180910390f35b348015610a1d57600080fd5b50610a266115d1565b604051610a339190613800565b60405180910390f35b348015610a4857600080fd5b50610a516115d7565b604051610a5e9190613800565b60405180910390f35b348015610a7357600080fd5b50610a8e6004803603810190610a89919061374a565b6115dd565b604051610a9b91906135a4565b60405180910390f35b348015610ab057600080fd5b50610acb6004803603810190610ac6919061370a565b6115fd565b604051610ad891906135a4565b60405180910390f35b348015610aed57600080fd5b50610b086004803603810190610b03919061370a565b611674565b604051610b1591906135a4565b60405180910390f35b348015610b2a57600080fd5b50610b456004803603810190610b40919061374a565b611697565b005b348015610b5357600080fd5b50610b6e6004803603810190610b69919061374a565b61175f565b604051610b7b91906135a4565b60405180910390f35b348015610b9057600080fd5b50610b9961177e565b604051610ba691906135a4565b60405180910390f35b348015610bbb57600080fd5b50610bd66004803603810190610bd19190613928565b611791565b005b348015610be457600080fd5b50610bff6004803603810190610bfa9190613968565b611842565b005b348015610c0d57600080fd5b50610c286004803603810190610c23919061381b565b6118e1565b005b348015610c3657600080fd5b50610c3f61197c565b604051610c4c91906135a4565b60405180910390f35b348015610c6157600080fd5b50610c6a61198f565b604051610c779190613800565b60405180910390f35b348015610c8c57600080fd5b50610ca76004803603810190610ca2919061381b565b611995565b604051610cb491906135a4565b60405180910390f35b348015610cc957600080fd5b50610ce46004803603810190610cdf919061374a565b611a75565b604051610cf19190613800565b60405180910390f35b348015610d0657600080fd5b50610d0f611a8d565b604051610d1c9190613800565b60405180910390f35b348015610d3157600080fd5b50610d4c6004803603810190610d4791906139e8565b611a93565b604051610d599190613800565b60405180910390f35b348015610d6e57600080fd5b50610d77611b1a565b604051610d849190613800565b60405180910390f35b348015610d9957600080fd5b50610da2611b20565b604051610daf91906135a4565b60405180910390f35b348015610dc457600080fd5b50610dcd611b4c565b604051610dda9190613800565b60405180910390f35b348015610def57600080fd5b50610e0a6004803603810190610e0591906139bb565b611b52565b005b348015610e1857600080fd5b50610e336004803603810190610e2e919061374a565b611b77565b005b348015610e4157600080fd5b50610e4a611bfa565b604051610e579190613800565b60405180910390f35b348015610e6c57600080fd5b50610e75611c00565b604051610e829190613800565b60405180910390f35b601c60009054906101000a900460ff1681565b606060038054610ead90613a57565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed990613a57565b8015610f265780601f10610efb57610100808354040283529160200191610f26565b820191906000526020600020905b815481529060010190602001808311610f0957829003601f168201915b5050505050905090565b600080610f3b611c06565b9050610f48818585611c0e565b600191505092915050565b601a6020528060005260406000206000915054906101000a900460ff1681565b601c60019054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b610fbc611dd7565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f90b8024c4923d3873ff5b9fcb43d0360d4b9217fa41225d07ba379993552e74360405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60175481565b60165481565b611090611dd7565b670de0b6b3a76400006103e860016110a6610faa565b6110b09190613ab7565b6110ba9190613b28565b6110c49190613b28565b811015611106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fd90613bcb565b60405180910390fd5b670de0b6b3a76400008161111a9190613ab7565b60088190555050565b60008061112e611c06565b905061113b858285611e55565b611146858585611ee1565b60019150509392505050565b61dead81565b60006012905090565b60008061116c611c06565b905061118d81858561117e8589611a93565b6111889190613beb565b611c0e565b600191505092915050565b601f6020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000009beef8da188a65f067473115ac58d47c220d6b5681565b600b60009054906101000a900460ff1681565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60125481565b600b60029054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112ae611dd7565b6112b86000612b78565b565b60006112c4611dd7565b6000600b60006101000a81548160ff0219169083151502179055506001905090565b6112ee611dd7565b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601d5481565b600f5481565b611383611dd7565b6000600e54905083600f819055508260108190555081601181905550601154601054600f546113b29190613beb565b6113bc9190613beb565b600e819055506014600e541115806113d5575080600e54105b611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b90613c6b565b60405180910390fd5b50505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135481565b611478611dd7565b80600b60026101000a81548160ff02191690831515021790555050565b6060600480546114a490613a57565b80601f01602080910402602001604051908101604052809291908181526020018280546114d090613a57565b801561151d5780601f106114f25761010080835404028352916020019161151d565b820191906000526020600020905b81548152906001019060200180831161150057829003601f168201915b5050505050905090565b61152f611dd7565b7f0000000000000000000000009beef8da188a65f067473115ac58d47c220d6b5673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490613cfd565b60405180910390fd5b6115c78282612c3e565b5050565b60115481565b60185481565b60155481565b601e6020528060005260406000206000915054906101000a900460ff1681565b600080611608611c06565b905060006116168286611a93565b90508381101561165b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165290613d8f565b60405180910390fd5b6116688286868403611c0e565b60019250505092915050565b60008061167f611c06565b905061168c818585611ee1565b600191505092915050565b61169f611dd7565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa751787977eeb3902e30e1d19ca00c6ad274a1f622c31a206e32366700b0567460405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602080528060005260406000206000915054906101000a900460ff1681565b600b60019054906101000a900460ff1681565b611799611dd7565b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405161183691906135a4565b60405180910390a25050565b61184a611dd7565b600060125490508360138190555082601481905550816015819055506015546014546013546118799190613beb565b6118839190613beb565b601281905550601460125411158061189c575080601254105b6118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d290613c6b565b60405180910390fd5b50505050565b6118e9611dd7565b670de0b6b3a76400006103e860016118ff610faa565b6119099190613ab7565b6119139190613b28565b61191d9190613b28565b81101561195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195690613e21565b60405180910390fd5b670de0b6b3a7640000816119739190613ab7565b600a8190555050565b600d60009054906101000a900460ff1681565b60085481565b600061199f611dd7565b620186a060016119ad610faa565b6119b79190613ab7565b6119c19190613b28565b821015611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa90613eb3565b60405180910390fd5b60646004611a0f610faa565b611a199190613ab7565b611a239190613b28565b821115611a65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5c90613f45565b60405180910390fd5b8160098190555060019050919050565b601b6020528060005260406000206000915090505481565b600e5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60095481565b6000611b2a611dd7565b6000600d60006101000a81548160ff0219169083151502179055506001905090565b60105481565b611b5a611dd7565b80601c60006101000a81548160ff02191690831515021790555050565b611b7f611dd7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be590613fd7565b60405180910390fd5b611bf781612b78565b50565b60145481565b600a5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7490614069565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce3906140fb565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611dca9190613800565b60405180910390a3505050565b611ddf611c06565b73ffffffffffffffffffffffffffffffffffffffff16611dfd61141a565b73ffffffffffffffffffffffffffffffffffffffff1614611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90614167565b60405180910390fd5b565b6000611e618484611a93565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611edb5781811015611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec4906141d3565b60405180910390fd5b611eda8484848403611c0e565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790614265565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611fbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb6906142f7565b60405180910390fd5b60008103611fd857611fd383836000612cdf565b612b73565b600b60009054906101000a900460ff161561269b57611ff561141a565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612063575061203361141a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561209c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156120d6575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156120ef5750600560149054906101000a900460ff16155b1561269a57600b60019054906101000a900460ff166121e957601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806121a95750601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614363565b60405180910390fd5b5b600d60009054906101000a900460ff16156123b15761220661141a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561228d57507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156122e557507f0000000000000000000000009beef8da188a65f067473115ac58d47c220d6b5673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156123b05743600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061236b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123629061441b565b60405180910390fd5b43600c60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b5b602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156124545750601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156124fb5760085481111561249e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612495906144ad565b60405180910390fd5b600a546124aa8361125e565b826124b59190613beb565b11156124f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ed90614519565b60405180910390fd5b612699565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561259e5750601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ed576008548111156125e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125df906145ab565b60405180910390fd5b612698565b601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661269757600a5461264a8361125e565b826126559190613beb565b1115612696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268d90614519565b60405180910390fd5b5b5b5b5b5b60006126a63061125e565b9050600060095482101590508080156126cb5750600b60029054906101000a900460ff165b80156126e45750600560149054906101000a900460ff16155b801561273a5750602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127905750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156127e65750601960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561282a576001600560146101000a81548160ff02191690831515021790555061280e612f55565b6000600560146101000a81548160ff0219169083151502179055505b6000600560149054906101000a900460ff16159050601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806128e05750601960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156128ea57600090505b60008115612b6357602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561294d57506000601254115b15612a1a5761297a606461296c6012548861322490919063ffffffff16565b61323a90919063ffffffff16565b90506012546014548261298d9190613ab7565b6129979190613b28565b601760008282546129a89190613beb565b92505081905550601254601554826129c09190613ab7565b6129ca9190613b28565b601860008282546129db9190613beb565b92505081905550601254601354826129f39190613ab7565b6129fd9190613b28565b60166000828254612a0e9190613beb565b92505081905550612b3f565b602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015612a7557506000600e54115b15612b3e57612aa26064612a94600e548861322490919063ffffffff16565b61323a90919063ffffffff16565b9050600e5460105482612ab59190613ab7565b612abf9190613b28565b60176000828254612ad09190613beb565b92505081905550600e5460115482612ae89190613ab7565b612af29190613b28565b60186000828254612b039190613beb565b92505081905550600e54600f5482612b1b9190613ab7565b612b259190613b28565b60166000828254612b369190613beb565b925050819055505b5b6000811115612b5457612b53873083612cdf565b5b8085612b6091906145cb565b94505b612b6e878787612cdf565b505050505b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590614265565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db4906142f7565b60405180910390fd5b612dc8838383613250565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e4590614671565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612f3c9190613800565b60405180910390a3612f4f848484613255565b50505050565b6000612f603061125e565b90506000601854601654601754612f779190613beb565b612f819190613beb565b9050600080831480612f935750600082145b15612fa057505050613222565b600954831115612fb05760095492505b600060028360175486612fc39190613ab7565b612fcd9190613b28565b612fd79190613b28565b90506000612fee828661325a90919063ffffffff16565b90506000479050612ffe82613270565b6000613013824761325a90919063ffffffff16565b9050600061303e876130306016548561322490919063ffffffff16565b61323a90919063ffffffff16565b905060006130698861305b6018548661322490919063ffffffff16565b61323a90919063ffffffff16565b9050600081838561307a91906145cb565b61308491906145cb565b9050600060178190555060006016819055506000601881905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516130e4906146c2565b60006040518083038185875af1925050503d8060008114613121576040519150601f19603f3d011682016040523d82523d6000602084013e613126565b606091505b50508098505060008711801561313c5750600081115b156131895761314b87826134ad565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618682601754604051613180939291906146d7565b60405180910390a15b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516131cf906146c2565b60006040518083038185875af1925050503d806000811461320c576040519150601f19603f3d011682016040523d82523d6000602084013e613211565b606091505b505080985050505050505050505050505b565b600081836132329190613ab7565b905092915050565b600081836132489190613b28565b905092915050565b505050565b505050565b6000818361326891906145cb565b905092915050565b6000600267ffffffffffffffff81111561328d5761328c61470e565b5b6040519080825280602002602001820160405280156132bb5781602001602082028036833780820191505090505b50905030816000815181106132d3576132d261473d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339c9190614781565b816001815181106133b0576133af61473d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613415307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c0e565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016134779594939291906148a7565b600060405180830381600087803b15801561349157600080fd5b505af11580156134a5573d6000803e3d6000fd5b505050505050565b6134d8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611c0e565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b815260040161353f96959493929190614901565b60606040518083038185885af115801561355d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906135829190614977565b5050505050565b60008115159050919050565b61359e81613589565b82525050565b60006020820190506135b96000830184613595565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135f95780820151818401526020810190506135de565b60008484015250505050565b6000601f19601f8301169050919050565b6000613621826135bf565b61362b81856135ca565b935061363b8185602086016135db565b61364481613605565b840191505092915050565b600060208201905081810360008301526136698184613616565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136a182613676565b9050919050565b6136b181613696565b81146136bc57600080fd5b50565b6000813590506136ce816136a8565b92915050565b6000819050919050565b6136e7816136d4565b81146136f257600080fd5b50565b600081359050613704816136de565b92915050565b6000806040838503121561372157613720613671565b5b600061372f858286016136bf565b9250506020613740858286016136f5565b9150509250929050565b6000602082840312156137605761375f613671565b5b600061376e848285016136bf565b91505092915050565b6000819050919050565b600061379c61379761379284613676565b613777565b613676565b9050919050565b60006137ae82613781565b9050919050565b60006137c0826137a3565b9050919050565b6137d0816137b5565b82525050565b60006020820190506137eb60008301846137c7565b92915050565b6137fa816136d4565b82525050565b600060208201905061381560008301846137f1565b92915050565b60006020828403121561383157613830613671565b5b600061383f848285016136f5565b91505092915050565b60008060006060848603121561386157613860613671565b5b600061386f868287016136bf565b9350506020613880868287016136bf565b9250506040613891868287016136f5565b9150509250925092565b6138a481613696565b82525050565b60006020820190506138bf600083018461389b565b92915050565b600060ff82169050919050565b6138db816138c5565b82525050565b60006020820190506138f660008301846138d2565b92915050565b61390581613589565b811461391057600080fd5b50565b600081359050613922816138fc565b92915050565b6000806040838503121561393f5761393e613671565b5b600061394d858286016136bf565b925050602061395e85828601613913565b9150509250929050565b60008060006060848603121561398157613980613671565b5b600061398f868287016136f5565b93505060206139a0868287016136f5565b92505060406139b1868287016136f5565b9150509250925092565b6000602082840312156139d1576139d0613671565b5b60006139df84828501613913565b91505092915050565b600080604083850312156139ff576139fe613671565b5b6000613a0d858286016136bf565b9250506020613a1e858286016136bf565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a6f57607f821691505b602082108103613a8257613a81613a28565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ac2826136d4565b9150613acd836136d4565b9250828202613adb816136d4565b91508282048414831517613af257613af1613a88565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613b33826136d4565b9150613b3e836136d4565b925082613b4e57613b4d613af9565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e31250000000000000000000000000000000000602082015250565b6000613bb5602f836135ca565b9150613bc082613b59565b604082019050919050565b60006020820190508181036000830152613be481613ba8565b9050919050565b6000613bf6826136d4565b9150613c01836136d4565b9250828201905080821115613c1957613c18613a88565b5b92915050565b7f4d757374206b656570206665657320617420323025206f72206c657373000000600082015250565b6000613c55601d836135ca565b9150613c6082613c1f565b602082019050919050565b60006020820190508181036000830152613c8481613c48565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000613ce76039836135ca565b9150613cf282613c8b565b604082019050919050565b60006020820190508181036000830152613d1681613cda565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613d796025836135ca565b9150613d8482613d1d565b604082019050919050565b60006020820190508181036000830152613da881613d6c565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e312500000000000000000000000000000000000000000000000000000000602082015250565b6000613e0b6024836135ca565b9150613e1682613daf565b604082019050919050565b60006020820190508181036000830152613e3a81613dfe565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b6000613e9d6035836135ca565b9150613ea882613e41565b604082019050919050565b60006020820190508181036000830152613ecc81613e90565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20342520746f74616c20737570706c792e0000000000000000000000000000602082015250565b6000613f2f6032836135ca565b9150613f3a82613ed3565b604082019050919050565b60006020820190508181036000830152613f5e81613f22565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613fc16026836135ca565b9150613fcc82613f65565b604082019050919050565b60006020820190508181036000830152613ff081613fb4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140536024836135ca565b915061405e82613ff7565b604082019050919050565b6000602082019050818103600083015261408281614046565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006140e56022836135ca565b91506140f082614089565b604082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141516020836135ca565b915061415c8261411b565b602082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006141bd601d836135ca565b91506141c882614187565b602082019050919050565b600060208201905081810360008301526141ec816141b0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061424f6025836135ca565b915061425a826141f3565b604082019050919050565b6000602082019050818103600083015261427e81614242565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006142e16023836135ca565b91506142ec82614285565b604082019050919050565b60006020820190508181036000830152614310816142d4565b9050919050565b7f54726164696e67206973206e6f74206163746976652e00000000000000000000600082015250565b600061434d6016836135ca565b915061435882614317565b602082019050919050565b6000602082019050818103600083015261437c81614340565b9050919050565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b60006144056049836135ca565b915061441082614383565b606082019050919050565b60006020820190508181036000830152614434816143f8565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b60006144976035836135ca565b91506144a28261443b565b604082019050919050565b600060208201905081810360008301526144c68161448a565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b60006145036013836135ca565b915061450e826144cd565b602082019050919050565b60006020820190508181036000830152614532816144f6565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b60006145956036836135ca565b91506145a082614539565b604082019050919050565b600060208201905081810360008301526145c481614588565b9050919050565b60006145d6826136d4565b91506145e1836136d4565b92508282039050818111156145f9576145f8613a88565b5b92915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061465b6026836135ca565b9150614666826145ff565b604082019050919050565b6000602082019050818103600083015261468a8161464e565b9050919050565b600081905092915050565b50565b60006146ac600083614691565b91506146b78261469c565b600082019050919050565b60006146cd8261469f565b9150819050919050565b60006060820190506146ec60008301866137f1565b6146f960208301856137f1565b61470660408301846137f1565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008151905061477b816136a8565b92915050565b60006020828403121561479757614796613671565b5b60006147a58482850161476c565b91505092915050565b6000819050919050565b60006147d36147ce6147c9846147ae565b613777565b6136d4565b9050919050565b6147e3816147b8565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61481e81613696565b82525050565b60006148308383614815565b60208301905092915050565b6000602082019050919050565b6000614854826147e9565b61485e81856147f4565b935061486983614805565b8060005b8381101561489a5781516148818882614824565b975061488c8361483c565b92505060018101905061486d565b5085935050505092915050565b600060a0820190506148bc60008301886137f1565b6148c960208301876147da565b81810360408301526148db8186614849565b90506148ea606083018561389b565b6148f760808301846137f1565b9695505050505050565b600060c082019050614916600083018961389b565b61492360208301886137f1565b61493060408301876147da565b61493d60608301866147da565b61494a608083018561389b565b61495760a08301846137f1565b979650505050505050565b600081519050614971816136de565b92915050565b6000806000606084860312156149905761498f613671565b5b600061499e86828701614962565b93505060206149af86828701614962565b92505060406149c086828701614962565b915050925092509256fea26469706673582212203dcbd0f415ad4821804e1075d2e5e2272fe5c83c945a06115639251e529c862564736f6c63430008130033
Verified Source Code Partial Match
Compiler: v0.8.19+commit.7dd6d404
EVM: paris
Optimization: No
Dafuq.sol 1489 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
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(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
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;
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_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);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_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);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
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);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
contract Dafuq is ERC20, Ownable {
using SafeMath for uint256;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
address public constant deadAddress = address(0xdead);
bool private swapping;
address public marketingWallet;
address public devWallet;
uint256 public maxTransactionAmount;
uint256 public swapTokensAtAmount;
uint256 public maxWallet;
bool public limitsInEffect = true;
bool public tradingActive = false;
bool public swapEnabled = true;
mapping(address => uint256) private _holderLastTransferTimestamp;
bool public transferDelayEnabled = false;
uint256 public buyTotalFees;
uint256 public buyMarketingFee;
uint256 public buyLiquidityFee;
uint256 public buyDevFee;
uint256 public sellTotalFees;
uint256 public sellMarketingFee;
uint256 public sellLiquidityFee;
uint256 public sellDevFee;
uint256 public tokensForMarketing;
uint256 public tokensForLiquidity;
uint256 public tokensForDev;
mapping(address => bool) private _isExcludedFromFees;
mapping(address => bool) public _isExcludedMaxTransactionAmount;
mapping(address => uint256) public blocksOfTrades;
bool public antiMEVEnabled = false;
bool public antiContractSellEnabled = false;
uint256 public mevBlocks = 1;
mapping (address => bool) public botsOfMEV;
mapping (address => bool) public whitelistedMEV;
mapping(address => bool) public automatedMarketMakerPairs;
event UpdateUniswapV2Router(
address indexed newAddress,
address indexed oldAddress
);
event ExcludeFromFees(address indexed account, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event marketingWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event devWalletUpdated(
address indexed newWallet,
address indexed oldWallet
);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiquidity
);
event AutoNukeLP();
event ManualNukeLP();
constructor() ERC20("Dafuq", "DAFUQ") {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
);
excludeFromMaxTransaction(address(_uniswapV2Router), true);
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
excludeFromMaxTransaction(address(uniswapV2Pair), true);
_setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
uint256 _buyMarketingFee = 20;
uint256 _buyLiquidityFee = 0;
uint256 _buyDevFee = 0;
uint256 _sellMarketingFee = 80;
uint256 _sellLiquidityFee = 0;
uint256 _sellDevFee = 0;
uint256 totalSupply = 69_420_000_000_000 * 1e18;
maxTransactionAmount = 1_388_400_000_000 * 1e18;
maxWallet = 1_388_400_000_000 * 1e18;
swapTokensAtAmount = (totalSupply * 5) / 1000;
buyMarketingFee = _buyMarketingFee;
buyLiquidityFee = _buyLiquidityFee;
buyDevFee = _buyDevFee;
buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
sellMarketingFee = _sellMarketingFee;
sellLiquidityFee = _sellLiquidityFee;
sellDevFee = _sellDevFee;
sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
marketingWallet = owner();
devWallet = owner();
excludeFromFees(owner(), true);
excludeFromFees(address(this), true);
excludeFromFees(address(0xdead), true);
excludeFromMaxTransaction(owner(), true);
excludeFromMaxTransaction(address(this), true);
excludeFromMaxTransaction(address(0xdead), true);
/*
_mint is an internal function in ERC20.sol that is only called here,
and CANNOT be called ever again
*/
_mint(msg.sender, totalSupply);
tradingActive = true;
}
receive() external payable {}
function removeLimits() external onlyOwner returns (bool) {
limitsInEffect = false;
return true;
}
function disableTransferDelay() external onlyOwner returns (bool) {
transferDelayEnabled = false;
return true;
}
function updateSwapTokensAtAmount(uint256 newAmount)
external
onlyOwner
returns (bool)
{
require(
newAmount >= (totalSupply() * 1) / 100000,
"Swap amount cannot be lower than 0.001% total supply."
);
require(
newAmount <= (totalSupply() * 4) / 100,
"Swap amount cannot be higher than 4% total supply."
);
swapTokensAtAmount = newAmount;
return true;
}
function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 1) / 1000) / 1e18,
"Cannot set maxTransactionAmount lower than 0.1%"
);
maxTransactionAmount = newNum * (10 ** 18);
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(
newNum >= ((totalSupply() * 1) / 1000) / 1e18,
"Cannot set maxWallet lower than 0.1%"
);
maxWallet = newNum * (10 ** 18);
}
function excludeFromMaxTransaction(address updAds, bool isEx)
public
onlyOwner
{
_isExcludedMaxTransactionAmount[updAds] = isEx;
}
function updateSwapEnabled(bool enabled) external onlyOwner {
swapEnabled = enabled;
}
function updateBuyFees(
uint256 _marketingFee,
uint256 _liquidityFee,
uint256 _devFee
) external onlyOwner {
uint256 previousFees = buyTotalFees;
buyMarketingFee = _marketingFee;
buyLiquidityFee = _liquidityFee;
buyDevFee = _devFee;
buyTotalFees = buyMarketingFee + buyLiquidityFee + buyDevFee;
require(buyTotalFees <= 20 || buyTotalFees < previousFees, "Must keep fees at 20% or less");
}
function updateSellFees(
uint256 _marketingFee,
uint256 _liquidityFee,
uint256 _devFee
) external onlyOwner {
uint256 previousFees = sellTotalFees;
sellMarketingFee = _marketingFee;
sellLiquidityFee = _liquidityFee;
sellDevFee = _devFee;
sellTotalFees = sellMarketingFee + sellLiquidityFee + sellDevFee;
require(sellTotalFees <= 20 || sellTotalFees < previousFees, "Must keep fees at 20% or less");
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function setAutomatedMarketMakerPair(address pair, bool value)
public
onlyOwner
{
require(
pair != uniswapV2Pair,
"The pair cannot be removed from automatedMarketMakerPairs"
);
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
emit SetAutomatedMarketMakerPair(pair, value);
}
function setAntiMEVMode(bool setting) external onlyOwner {
antiMEVEnabled = setting;
}
function setMev(address addr, bool value) private {
botsOfMEV[addr] = value;
}
function updateMarketingWallet(address newMarketingWallet)
external
onlyOwner
{
emit marketingWalletUpdated(newMarketingWallet, marketingWallet);
marketingWallet = newMarketingWallet;
}
function updateDevWallet(address newWallet) external onlyOwner {
emit devWalletUpdated(newWallet, devWallet);
devWallet = newWallet;
}
function isExcludedFromFees(address account) public view returns (bool) {
return _isExcludedFromFees[account];
}
event BoughtEarly(address indexed sniper);
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");
if (amount == 0) {
super._transfer(from, to, 0);
return;
}
if (limitsInEffect) {
if (
from != owner() &&
to != owner() &&
to != address(0) &&
to != address(0xdead) &&
!swapping
) {
if (!tradingActive) {
require(
_isExcludedFromFees[from] || _isExcludedFromFees[to],
"Trading is not active."
);
}
if (transferDelayEnabled) {
if (
to != owner() &&
to != address(uniswapV2Router) &&
to != address(uniswapV2Pair)
) {
require(
_holderLastTransferTimestamp[tx.origin] <
block.number,
"_transfer:: Transfer Delay enabled. Only one purchase per block allowed."
);
_holderLastTransferTimestamp[tx.origin] = block.number;
}
}
if (
automatedMarketMakerPairs[from] &&
!_isExcludedMaxTransactionAmount[to]
) {
require(
amount <= maxTransactionAmount,
"Buy transfer amount exceeds the maxTransactionAmount."
);
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
else if (
automatedMarketMakerPairs[to] &&
!_isExcludedMaxTransactionAmount[from]
) {
require(
amount <= maxTransactionAmount,
"Sell transfer amount exceeds the maxTransactionAmount."
);
} else if (!_isExcludedMaxTransactionAmount[to]) {
require(
amount + balanceOf(to) <= maxWallet,
"Max wallet exceeded"
);
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (
canSwap &&
swapEnabled &&
!swapping &&
!automatedMarketMakerPairs[from] &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to]
) {
swapping = true;
swapBack();
swapping = false;
}
bool takeFee = !swapping;
if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
if (takeFee) {
if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
fees = amount.mul(sellTotalFees).div(100);
tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
tokensForDev += (fees * sellDevFee) / sellTotalFees;
tokensForMarketing += (fees * sellMarketingFee) / sellTotalFees;
}
else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
fees = amount.mul(buyTotalFees).div(100);
tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
tokensForDev += (fees * buyDevFee) / buyTotalFees;
tokensForMarketing += (fees * buyMarketingFee) / buyTotalFees;
}
if (fees > 0) {
super._transfer(from, address(this), fees);
}
amount -= fees;
}
super._transfer(from, to, amount);
}
function swapTokensForEth(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
_approve(address(this), address(uniswapV2Router), tokenAmount);
uniswapV2Router.addLiquidityETH{value : ethAmount}(
address(this),
tokenAmount,
0,
0,
deadAddress,
block.timestamp
);
}
function swapBack() private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokensToSwap = tokensForLiquidity +
tokensForMarketing +
tokensForDev;
bool success;
if (contractBalance == 0 || totalTokensToSwap == 0) {
return;
}
if (contractBalance > swapTokensAtAmount) {
contractBalance = swapTokensAtAmount;
}
uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
totalTokensToSwap /
2;
uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
uint256 initialETHBalance = address(this).balance;
swapTokensForEth(amountToSwapForETH);
uint256 ethBalance = address(this).balance.sub(initialETHBalance);
uint256 ethForMarketing = ethBalance.mul(tokensForMarketing).div(
totalTokensToSwap
);
uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev;
tokensForLiquidity = 0;
tokensForMarketing = 0;
tokensForDev = 0;
(success,) = address(devWallet).call{value : ethForDev}("");
if (liquidityTokens > 0 && ethForLiquidity > 0) {
addLiquidity(liquidityTokens, ethForLiquidity);
emit SwapAndLiquify(
amountToSwapForETH,
ethForLiquidity,
tokensForLiquidity
);
}
(success,) = address(marketingWallet).call{
value : address(this).balance
}("");
}
}
Read Contract
_isExcludedMaxTransactionAmount 0x10d5de53 → bool
allowance 0xdd62ed3e → uint256
antiContractSellEnabled 0x1564336e → bool
antiMEVEnabled 0x04113890 → bool
automatedMarketMakerPairs 0xb62496f5 → bool
balanceOf 0x70a08231 → uint256
blocksOfTrades 0xd3bef906 → uint256
botsOfMEV 0xa200c88d → bool
buyDevFee 0x9c3b4fdc → uint256
buyLiquidityFee 0xf11a24d3 → uint256
buyMarketingFee 0x7bce5a04 → uint256
buyTotalFees 0xd85ba063 → uint256
deadAddress 0x27c8f835 → address
decimals 0x313ce567 → uint8
devWallet 0x8ea5220f → address
isExcludedFromFees 0x4fbee193 → bool
limitsInEffect 0x4a62bb65 → bool
marketingWallet 0x75f0a874 → address
maxTransactionAmount 0xc8c8ebe4 → uint256
maxWallet 0xf8b45b05 → uint256
mevBlocks 0x773e0d9c → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
sellDevFee 0xa0d82dc5 → uint256
sellLiquidityFee 0xf6374342 → uint256
sellMarketingFee 0x92136913 → uint256
sellTotalFees 0x6a486a8e → uint256
swapEnabled 0x6ddd1713 → bool
swapTokensAtAmount 0xe2f45605 → uint256
symbol 0x95d89b41 → string
tokensForDev 0x9fccce32 → uint256
tokensForLiquidity 0x1a8145bb → uint256
tokensForMarketing 0x1f3fed8f → uint256
totalSupply 0x18160ddd → uint256
tradingActive 0xbbc0c742 → bool
transferDelayEnabled 0xc876d0b9 → bool
uniswapV2Pair 0x49bd5a5e → address
uniswapV2Router 0x1694505e → address
whitelistedMEV 0x39be1a1f → bool
Write Contract 21 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
disableTransferDelay 0xe884f260
No parameters
returns: bool
excludeFromFees 0xc0246668
address account
bool excluded
excludeFromMaxTransaction 0x7571336a
address updAds
bool isEx
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
removeLimits 0x751039fc
No parameters
returns: bool
renounceOwnership 0x715018a6
No parameters
setAntiMEVMode 0xf25744f1
bool setting
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
updateBuyFees 0x8095d564
uint256 _marketingFee
uint256 _liquidityFee
uint256 _devFee
updateDevWallet 0x1816467f
address newWallet
updateMarketingWallet 0xaacebbe3
address newMarketingWallet
updateMaxTxnAmount 0x203e727e
uint256 newNum
updateMaxWalletAmount 0xc18bc195
uint256 newNum
updateSellFees 0xc17b5b8c
uint256 _marketingFee
uint256 _liquidityFee
uint256 _devFee
updateSwapEnabled 0x924de9b7
bool enabled
updateSwapTokensAtAmount 0xd257b34f
uint256 newAmount
returns: bool
Recent Transactions
This address has 1 on-chain transactions, but only 0% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →