Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0x73454ACfdDb7a36A3cd8Eb171fBEa86c6a55E550
Balance 0 ETH
Nonce 1
Code Size 13889 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

13889 bytes
0x6080604052600436106103b15760003560e01c806383842013116101e7578063bf56b3711161010d578063d920334e116100a0578063f2fde38b1161006f578063f2fde38b14610ac1578063f887ea4014610ae1578063fabe628314610b01578063fbd7575314610b2157600080fd5b8063d920334e14610a1b578063dd62ed3e14610a3b578063e66b1d1e14610a81578063f16fd78d14610aa157600080fd5b8063cb29813c116100dc578063cb29813c146109a4578063cd1e330a146109c4578063d0a5eb4e146109da578063d4fb9a01146109fa57600080fd5b8063bf56b37114610928578063bfd792841461093e578063c45a01551461096e578063ca987b0e1461098e57600080fd5b806395d89b4111610185578063a8aa1b3111610154578063a8aa1b31146108bc578063a9059cbb146108dc578063aa8e79c2146108fc578063b0c8edbd1461091257600080fd5b806395d89b4114610851578063985b9db014610866578063a3a2e89e1461087c578063a457c2d71461089c57600080fd5b80638b42507f116101c15780638b42507f146107cd5780638da5cb5b146107fd5780638ea5220f1461081b5780639502c4261461083b57600080fd5b8063838420131461077e57806388cda873146107985780638a1c7b84146107b757600080fd5b80633dab5269116102d75780636827e7641161026a5780637c0ff205116102395780637c0ff2051461071c5780637d1db4a5146107325780637db1342c14610748578063807c2d9c1461076857600080fd5b80636827e764146106a5578063704ce43e146106bb57806370a08231146106d1578063715018a61461070757600080fd5b80634a74bb02116102a65780634a74bb021461063a578063546a88111461065b57806359a51c34146106705780635fef86801461069057600080fd5b80633dab5269146105995780633f4218e0146105b95780634355855a146105e957806344de2e4c1461061957600080fd5b806323b62b751161034f5780632b112e491161031e5780632b112e4914610528578063313ce5671461053d57806338b52cb814610559578063395093511461057957600080fd5b806323b62b751461049b57806323b872dd146104d357806327193bc4146104f3578063273123b71461050857600080fd5b80630963da6c1161038b5780630963da6c1461043857806318160ddd1461044e5780631df4ccfc146104635780631f53ac021461047957600080fd5b80630445b667146103bd57806306fdde03146103e6578063095ea7b31461040857600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d360245481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b506103fb610b36565b6040516103dd9190612e76565b34801561041457600080fd5b50610428610423366004612ee9565b610bc8565b60405190151581526020016103dd565b34801561044457600080fd5b506103d3600d5481565b34801561045a57600080fd5b506003546103d3565b34801561046f57600080fd5b506103d360135481565b34801561048557600080fd5b50610499610494366004612f15565b610be2565b005b3480156104a757600080fd5b50601e546104bb906001600160a01b031681565b6040516001600160a01b0390911681526020016103dd565b3480156104df57600080fd5b506104286104ee366004612f32565b610c0c565b3480156104ff57600080fd5b50610499610c33565b34801561051457600080fd5b50610499610523366004612f15565b610cb8565b34801561053457600080fd5b506103d3610d4e565b34801561054957600080fd5b50604051600981526020016103dd565b34801561056557600080fd5b506104996105743660046130ba565b610dbe565b34801561058557600080fd5b50610428610594366004612ee9565b6114b7565b3480156105a557600080fd5b506104996105b43660046131e7565b6114f6565b3480156105c557600080fd5b506104286105d4366004612f15565b60076020526000908152604090205460ff1681565b3480156105f557600080fd5b50610428610604366004612f15565b60096020526000908152604090205460ff1681565b34801561062557600080fd5b5060065461042890600160a01b900460ff1681565b34801561064657600080fd5b50601e5461042890600160a81b900460ff1681565b34801561066757600080fd5b50610499611520565b34801561067c57600080fd5b506006546104bb906001600160a01b031681565b34801561069c57600080fd5b506104996115c4565b3480156106b157600080fd5b506103d3600f5481565b3480156106c757600080fd5b506103d3600e5481565b3480156106dd57600080fd5b506103d36106ec366004612f15565b6001600160a01b031660009081526001602052604090205490565b34801561071357600080fd5b5061049961161d565b34801561072857600080fd5b506103d360115481565b34801561073e57600080fd5b506103d360225481565b34801561075457600080fd5b50610499610763366004613205565b611631565b34801561077457600080fd5b506103d360235481565b34801561078a57600080fd5b506015546104289060ff1681565b3480156107a457600080fd5b5060155461042890610100900460ff1681565b3480156107c357600080fd5b506103d3600c5481565b3480156107d957600080fd5b506104286107e8366004612f15565b60086020526000908152604090205460ff1681565b34801561080957600080fd5b506000546001600160a01b03166104bb565b34801561082757600080fd5b50601d546104bb906001600160a01b031681565b34801561084757600080fd5b506103d360125481565b34801561085d57600080fd5b506103fb611725565b34801561087257600080fd5b506103d360105481565b34801561088857600080fd5b5061049961089736600461321e565b611734565b3480156108a857600080fd5b506104286108b7366004612ee9565b611767565b3480156108c857600080fd5b50601b546104bb906001600160a01b031681565b3480156108e857600080fd5b506104286108f7366004612ee9565b6117f6565b34801561090857600080fd5b506103d360205481565b34801561091e57600080fd5b506103d360215481565b34801561093457600080fd5b506103d3600a5481565b34801561094a57600080fd5b50610428610959366004612f15565b601f6020526000908152604090205460ff1681565b34801561097a57600080fd5b50601c546104bb906001600160a01b031681565b34801561099a57600080fd5b506103d360145481565b3480156109b057600080fd5b506104996109bf366004613257565b611804565b3480156109d057600080fd5b506103d3600b5481565b3480156109e657600080fd5b506104996109f5366004612f15565b611a55565b348015610a0657600080fd5b50601e5461042890600160b01b900460ff1681565b348015610a2757600080fd5b50610499610a36366004613205565b611a7f565b348015610a4757600080fd5b506103d3610a5636600461329a565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a8d57600080fd5b50610499610a9c3660046132c8565b611b73565b348015610aad57600080fd5b50610499610abc366004612f15565b611b99565b348015610acd57600080fd5b50610499610adc366004612f15565b611c15565b348015610aed57600080fd5b50601a546104bb906001600160a01b031681565b348015610b0d57600080fd5b50610499610b1c36600461321e565b611c8b565b348015610b2d57600080fd5b50610499611cbe565b606060048054610b45906132e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610b71906132e5565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905090565b600033610bd6818585611d09565b60019150505b92915050565b610bea611e16565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b600033610c1a858285611e70565b610c25858585611efb565b5060019150505b9392505050565b601c546001600160a01b03163314610c665760405162461bcd60e51b8152600401610c5d9061331f565b60405180910390fd5b600a5415610ca15760405162461bcd60e51b81526020600482015260086024820152671b185d5b98da195960c21b6044820152606401610c5d565b42600a819055602054610cb39161336c565b602155565b60065433906001600160a01b0316811480610ce057506000546001600160a01b038281169116145b610d2c5760405162461bcd60e51b815260206004820152601e60248201527f43616c6c657220646f65736e27742068617665207065726d697373696f6e00006044820152606401610c5d565b506001600160a01b03166000908152601f60205260409020805460ff19169055565b60016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb495461dead60009081527fb34209a263f6c38fe55f099e9e70f9d67e93982480ff3234a5e0108028ad164d54600354919291610daf919061337f565b610db9919061337f565b905090565b601c546001600160a01b03163314610de85760405162461bcd60e51b8152600401610c5d9061331f565b8151600490610df790826133e1565b506020820151600590610e0a90826133e1565b506040820151600355606082015160461115610e525760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610c5d565b6103e882604001516005610e6691906134a1565b610e7091906134b8565b6022556040820151606490610e869060016134a1565b610e9091906134b8565b6023556040820151610fa090610ea79060056134a1565b610eb191906134b8565b60245560e0820151601a80546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610f12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3691906134da565b6001600160a01b031663c9c65396601a60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbb91906134da565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b91906134da565b601b80546001600160a01b0319166001600160a01b03928316178155306000818152600260209081526040808320601a54871684528252808320600019905592825260078152828220805460ff199081166001908117909255601c805488168552858520805483168417905560808a810180518a16875287872080548516861790555189168652600885528686208054841685179055965488168552858520805483168417905554909616835283832080548716821790557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd0933429980548716821790559180527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054909516909117909355830151600e819055606084015160115590830151600f81905560a08401516012558351600d81905592840151601055611174919061336c565b61117e919061336c565b60000361118b576000600b555b600b548151604083015160808401516111a4919061336c565b6111ae919061336c565b6111b8919061336c565b6013556020810151606082015160a08301516111d4919061336c565b6111de919061336c565b6000036111eb576000600c555b600c54816020015182606001518360a00151611207919061336c565b611211919061336c565b61121b919061336c565b601455601c546080830151604051633af32abf60e01b81526001600160a01b039182166004820152911690633af32abf90602401602060405180830381865afa15801561126c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129091906134f7565b1561131e57600c60135411156112d75760405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606401610c5d565b601160145411156113195760405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606401610c5d565b611364565b600760135411156113415760405162461bcd60e51b8152600401610c5d90613514565b600760145411156113645760405162461bcd60e51b8152600401610c5d90613514565b60a0820151601d80546001600160a01b039283166001600160a01b03199182161790915560c0840151601e805491841691831691909117905561010084015160068054919093169116179055606082015160408301516000916064916113ca91906134a1565b6113d491906134b8565b905060008184604001516113e8919061337f565b3360009081526001602052604081208054929350849290919061140c90849061336c565b909155505060808401516001600160a01b03166000908152600160205260408120805483929061143d90849061336c565b9091555050610120840151602090815560405183815233916000916000805160206135ec833981519152910160405180910390a383608001516001600160a01b031660006001600160a01b03166000805160206135ec833981519152836040516114a991815260200190565b60405180910390a350505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190610bd690829086906114f190879061336c565b611d09565b6114fe611e16565b601e8054921515600160a81b0260ff60a81b1990931692909217909155602455565b601c546001600160a01b0316331461154a5760405162461bcd60e51b8152600401610c5d9061331f565b601a80546001600160a01b0390811660009081526007602090815260408083208054600160ff19918216811790925595548516845260089092528083208054861683179055825490931682529190208054909216179055601e80546006805460ff60a01b1916905561ffff60a81b1916600160b01b179055565b6115cc611e16565b61161a30336019546018546017546016546115e7919061336c565b6115f1919061336c565b6115fb919061336c565b30600090815260016020526040902054611615919061337f565b611efb565b50565b611625611e16565b61162f60006124bc565b565b611639611e16565b600a546000036116775760405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606401610c5d565b6103e8600354600561168991906134a1565b61169391906134b8565b8110156116cd5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610c5d565b606460035460036116de91906134a1565b6116e891906134b8565b8111156117205760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610c5d565b602355565b606060058054610b45906132e5565b61173c611e16565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909190838110156117de5760405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606401610c5d565b6117eb8286868403611d09565b506001949350505050565b6000336117eb818585611efb565b61180c611e16565b600080600a546228de80611820919061336c565b4211801561182f5750600a5415155b1561183f57506000905080611875565b600a5461184f906201518061336c565b4211801561185e5750600a5415155b1561186e57506001905080611875565b5060029050805b600d889055600e869055600f8490556010879055601185905560128390558761189e878661336c565b6118a8919061336c565b6000036118b457600091505b81886118c0888761336c565b6118ca919061336c565b6118d4919061336c565b601355866118e2868561336c565b6118ec919061336c565b6000036118f7575060005b8087601154601254611909919061336c565b611913919061336c565b61191d919061336c565b601455600b829055600c819055601c546001600160a01b0316633af32abf61194d6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611991573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b591906134f7565b15611a0557600c60135411156119dd5760405162461bcd60e51b8152600401610c5d90613514565b60116014541115611a005760405162461bcd60e51b8152600401610c5d90613514565b611a4b565b60076013541115611a285760405162461bcd60e51b8152600401610c5d90613514565b60076014541115611a4b5760405162461bcd60e51b8152600401610c5d90613514565b5050505050505050565b611a5d611e16565b601e80546001600160a01b0319166001600160a01b0392909216919091179055565b611a87611e16565b600a54600003611ac55760405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606401610c5d565b6103e86003546005611ad791906134a1565b611ae191906134b8565b811015611b1b5760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606401610c5d565b60646003546003611b2c91906134a1565b611b3691906134b8565b811115611b6e5760405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606401610c5d565b602255565b611b7b611e16565b60068054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b03163314611bf35760405162461bcd60e51b815260206004820152601c60248201527f43616c6c6572206973206e6f74207468652070726f6f6641646d696e000000006044820152606401610c5d565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b611c1d611e16565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c5d565b61161a816124bc565b611c93611e16565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b601c546001600160a01b03163314611ce85760405162461bcd60e51b8152600401610c5d9061331f565b601e805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b038316611d5f5760405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606401610c5d565b6001600160a01b038216611db55760405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606401610c5d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b0316331461162f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c5d565b6001600160a01b038381166000908152600260209081526040808320938616835292905220546000198114611ef55781811015611ee85760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610c5d565b611ef58484848403611d09565b50505050565b601e54600090600160b01b900460ff16611f405760405162461bcd60e51b815260206004820152600660248201526510db1bdcd95960d21b6044820152606401610c5d565b6001600160a01b0384166000908152601f602052604090205460ff16158015611f8257506001600160a01b0383166000908152601f602052604090205460ff16155b611f8b57600080fd5b60215415801590611f9d575060215442105b15611fff57326000818152601f60205260409020805460ff191660011790556001600160a01b03841614611fff5760405162461bcd60e51b8152602060048201526009602482015268616e7469736e69706560b81b6044820152606401610c5d565b601e54600160a01b900460ff16156120235761201c84848461250c565b9050610c2c565b601b546001600160a01b0384811691161480156120495750600654600160a01b900460ff165b156120cf576022548211158061209a57506001600160a01b03841660009081526008602052604090205460ff16801561209a57506001600160a01b03831660009081526008602052604090205460ff165b6120cf5760405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606401610c5d565b6001600160a01b03831660009081526008602052604090205460ff161580156121015750600654600160a01b900460ff165b15612168576023546001600160a01b03841660009081526001602052604090205461212d90849061336c565b11156121685760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610c5d565b60155460ff1615801561217c5750600a5415155b1561230257601554610100900460ff1661227a57600a546121a0906201518061336c565b42111561227557600d54600e54600f546121ba919061336c565b6121c4919061336c565b156121d05760016121d3565b60005b60ff16600b556010546011546012546121ec919061336c565b6121f6919061336c565b15612202576001612205565b60005b60ff16600c55600b54600d54600e54600f54612221919061336c565b61222b919061336c565b612235919061336c565b601355600c5460105460115460125461224e919061336c565b612258919061336c565b612262919061336c565b6014556015805461ff0019166101001790555b612302565b600a5461228a906228de8061336c565b421115612302576000600b819055600c819055600d54600e54600f546122b0919061336c565b6122ba919061336c565b6122c4919061336c565b601355600c546010546011546012546122dd919061336c565b6122e7919061336c565b6122f1919061336c565b6014556015805460ff191660011790555b601b546001600160a01b0385811691161480159061232a5750601e54600160a01b900460ff16155b801561233f5750601e54600160a81b900460ff165b8015612376575060245460195460185460175460165461235f919061336c565b612369919061336c565b612373919061336c565b10155b15612383576123836125b4565b6001600160a01b0384166000908152600160205260409020546123a790839061337f565b6001600160a01b03808616600081815260016020526040902092909255601b548492911614806123e45750601b546001600160a01b038581169116145b15612443576001600160a01b03851660009081526007602052604090205460ff1615801561242b57506001600160a01b03841660009081526007602052604090205460ff16155b6124355782612440565b612440858585612cc4565b90505b6001600160a01b03841660009081526001602052604090205461246790829061336c565b6001600160a01b0380861660008181526001602052604090819020939093559151908716906000805160206135ec833981519152906124a99085815260200190565b60405180910390a3506001949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03831660009081526001602052604081205461253090839061337f565b6001600160a01b03808616600090815260016020526040808220939093559085168152205461256090839061336c565b6001600160a01b0380851660008181526001602052604090819020939093559151908616906000805160206135ec833981519152906125a29086815260200190565b60405180910390a35060019392505050565b601e805460ff60a01b1916600160a01b1790553060009081526001602052604081205460175460185460165460195493949293919290919081836125f8868861336c565b612602919061336c565b61260c919061336c565b905060008161261b87896134a1565b61262591906134b8565b9050600080806126366002856134b8565b9050612642818b61337f565b6000036126585750505050505050505050612cb5565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061268d5761268d613536565b6001600160a01b03928316602091820292909201810191909152601a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156126e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270a91906134da565b8160018151811061271d5761271d613536565b6001600160a01b039283166020918202929092010152601a541663791ac947612746848e61337f565b60008430426040518663ffffffff1660e01b815260040161276b95949392919061354c565b600060405180830381600087803b15801561278557600080fd5b505af1158015612799573d6000803e3d6000fd5b5050505060008083111561285f57601a546001600160a01b031663f305d7196127c2858a61337f565b6127cc86476134a1565b6127d691906134b8565b6040516001600160e01b031960e084901b16815230600482015260248101879052600060448201819052606482015261dead60848201524260a482015260c40160606040518083038185885af1158015612834573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061285991906135bd565b50909150505b612869818461337f565b612873908761337f565b8b1061289c57612883818461337f565b61288d908761337f565b612897908c61337f565b61289f565b60005b601755476128ad8c8961337f565b6000036128c65750505050505050505050505050612cb5565b896128d18a8d61336c565b6128db919061336c565b6128e58a836134a1565b6128ef91906134b8565b9450896128fc8a8d61336c565b612906919061336c565b6129108c836134a1565b61291a91906134b8565b9550600085612929888461337f565b612933919061337f565b9050888c8f61294291906134a1565b61294c91906134b8565b8c1061297857888c8f61295f91906134a1565b61296991906134b8565b612973908d61337f565b61297b565b60005b601881905550888b8f61298e91906134a1565b61299891906134b8565b8b106129c457888b8f6129ab91906134a1565b6129b591906134b8565b6129bf908c61337f565b6129c7565b60005b601681905550888a8f6129da91906134a1565b6129e491906134b8565b8a10612a1057888a8f6129f791906134a1565b612a0191906134b8565b612a0b908b61337f565b612a13565b60005b6019558115612ca6578515612bd6576000612a2f6002886134b8565b90506000601c60009054906101000a90046001600160a01b03166001600160a01b0316633690e2876040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aaa91906134da565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114612af4576040519150601f19603f3d011682016040523d82523d6000602084013e612af9565b606091505b5050905080612b0757600080fd5b601c546040805163d7e7a9e760e01b815290516000926001600160a01b03169163d7e7a9e79160048083019260209291908290030181865afa158015612b51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b7591906134da565b6001600160a01b03168360405160006040518083038185875af1925050503d8060008114612bbf576040519150601f19603f3d011682016040523d82523d6000602084013e612bc4565b606091505b5050905080612bd257600080fd5b5050505b8615612c3e57601d546040516000916001600160a01b03169089908381818185875af1925050503d8060008114612c29576040519150601f19603f3d011682016040523d82523d6000602084013e612c2e565b606091505b5050905080612c3c57600080fd5b505b8015612ca657601e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114612c91576040519150601f19603f3d011682016040523d82523d6000602084013e612c96565b606091505b5050905080612ca457600080fd5b505b50505050505050505050505050505b601e805460ff60a01b19169055565b601b54600090819081908190819081906001600160a01b03808a16911603612d04576014549450601054935060115492506012549150600c549050612d1e565b6013549450600d549350600e549250600f549150600b5490505b84600003612d33578695505050505050610c2c565b60006064612d41878a6134a1565b612d4b91906134b8565b905085612d5886836134a1565b612d6291906134b8565b60166000828254612d73919061336c565b90915550869050612d8485836134a1565b612d8e91906134b8565b60176000828254612d9f919061336c565b90915550869050612db084836134a1565b612dba91906134b8565b60186000828254612dcb919061336c565b90915550869050612ddc83836134a1565b612de691906134b8565b60196000828254612df7919061336c565b909155505030600090815260016020526040902054612e1790829061336c565b30600081815260016020526040908190209290925590516001600160a01b038c16906000805160206135ec83398151915290612e569085815260200190565b60405180910390a3612e68818961337f565b9a9950505050505050505050565b600060208083528351808285015260005b81811015612ea357858101830151858201604001528201612e87565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461161a57600080fd5b8035612ee481612ec4565b919050565b60008060408385031215612efc57600080fd5b8235612f0781612ec4565b946020939093013593505050565b600060208284031215612f2757600080fd5b8135610c2c81612ec4565b600080600060608486031215612f4757600080fd5b8335612f5281612ec4565b92506020840135612f6281612ec4565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051610140810167ffffffffffffffff81118282101715612fad57612fad612f73565b60405290565b600082601f830112612fc457600080fd5b813567ffffffffffffffff80821115612fdf57612fdf612f73565b604051601f8301601f19908116603f0116810190828211818310171561300757613007612f73565b8160405283815286602085880101111561302057600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c0828403121561305257600080fd5b60405160c0810181811067ffffffffffffffff8211171561307557613075612f73565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060e083850312156130cd57600080fd5b823567ffffffffffffffff808211156130e557600080fd5b9084019061014082870312156130fa57600080fd5b613102612f89565b82358281111561311157600080fd5b61311d88828601612fb3565b82525060208301358281111561313257600080fd5b61313e88828601612fb3565b602083015250604083013560408201526060830135606082015261316460808401612ed9565b608082015261317560a08401612ed9565b60a082015261318660c08401612ed9565b60c082015261319760e08401612ed9565b60e082015261010091506131ac828401612ed9565b82820152610120915081830135828201528094505050506131d08460208501613040565b90509250929050565b801515811461161a57600080fd5b600080604083850312156131fa57600080fd5b8235612f07816131d9565b60006020828403121561321757600080fd5b5035919050565b6000806040838503121561323157600080fd5b823561323c81612ec4565b9150602083013561324c816131d9565b809150509250929050565b60008060008060008060c0878903121561327057600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080604083850312156132ad57600080fd5b82356132b881612ec4565b9150602083013561324c81612ec4565b6000602082840312156132da57600080fd5b8135610c2c816131d9565b600181811c908216806132f957607f821691505b60208210810361331957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526019908201527f43616c6c6572206973206e6f742074686520666163746f727900000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bdc57610bdc613356565b81810381811115610bdc57610bdc613356565b601f8211156133dc57600081815260208120601f850160051c810160208610156133b95750805b601f850160051c820191505b818110156133d8578281556001016133c5565b5050505b505050565b815167ffffffffffffffff8111156133fb576133fb612f73565b61340f8161340984546132e5565b84613392565b602080601f831160018114613444576000841561342c5750858301515b600019600386901b1c1916600185901b1785556133d8565b600085815260208120601f198616915b8281101561347357888601518255948401946001909101908401613454565b50858210156134915787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082028115828204841417610bdc57610bdc613356565b6000826134d557634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156134ec57600080fd5b8151610c2c81612ec4565b60006020828403121561350957600080fd5b8151610c2c816131d9565b602080825260089082015267686967682066656560c01b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561359c5784516001600160a01b031683529383019391830191600101613577565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156135d257600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220fb6051501bf204341c72d8c1692cfc6cb25977d91e8af76e7260ce955cda3f0864736f6c63430008110033

Verified Source Code Full Match

Compiler: v0.8.17+commit.8df45f5f EVM: london Optimization: Yes (200 runs)
Context.sol 12 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
Ownable.sol 75 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "./Context.sol";

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);
    }
}
IFACTORY.sol 10 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IFACTORY {
    function proofRevenueAddress() external view returns (address);

    function proofRewardPoolAddress() external view returns (address);

    function isWhitelisted(address user) external view returns(bool);
}
IUniswapV2Factory.sol 8 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);
}
IUniswapV2Router02.sol 48 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 factory() external pure returns (address);

    function WETH() external pure returns (address);

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

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
}
IERC20.sol 78 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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);
}
ProofNonReflectionTokenFees.sol 13 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

library ProofNonReflectionTokenFees {
    struct allFees {
        uint256 mainFee;
        uint256 mainFeeOnSell;
        uint256 lpFee;
        uint256 lpFeeOnSell;
        uint256 devFee;
        uint256 devFeeOnSell;
    }
}
IProofNonReflectionTokenCutter.sol 40 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../libraries/ProofNonReflectionTokenFees.sol";

interface IProofNonReflectionTokenCutter is IERC20, IERC20Metadata {
    struct BaseData {
        string tokenName;
        string tokenSymbol;
        uint256 initialSupply;
        uint256 percentToLP;
        address owner;
        address dev;
        address main;
        address routerAddress;
        address initialProofAdmin;
        uint256 antiSnipeDuration;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofNonReflectionTokenFees.allFees memory fees
    ) external;

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external;

    function changeFees(
        uint256 initialMainFee,
        uint256 initialMainFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external;
}
ProofNonReflectionTokenCutter.sol 743 lines
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "../libraries/Ownable.sol";
import "../libraries/ProofNonReflectionTokenFees.sol";
import "../interfaces/IFACTORY.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../interfaces/IUniswapV2Factory.sol";
import "../interfaces/IProofNonReflectionTokenCutter.sol";

contract ProofNonReflectionTokenCutter is Ownable, IProofNonReflectionTokenCutter {
    //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;
    address public proofAdmin;

    bool public restrictWhales = true;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;

    uint256 public launchedAt;
    uint256 public proofFee = 2;
    uint256 public proofFeeOnSell = 2;

    uint256 public mainFee;
    uint256 public lpFee;
    uint256 public devFee;

    uint256 public mainFeeOnSell;
    uint256 public lpFeeOnSell;
    uint256 public devFeeOnSell;

    uint256 public totalFee;
    uint256 public totalFeeIfSelling;

    bool public proofFeeRemoved = false;
    bool public proofFeeReduced = false;

    uint256 accMainFees;
    uint256 accLpFees;
    uint256 accDevFees;
    uint256 accProofFees;

    IUniswapV2Router02 public router;
    address public pair;
    address public factory;
    address payable public devWallet;
    address payable public mainWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public tradingStatus = true;

    mapping(address => bool) public bots;

    uint256 public antiSnipeDuration;
    uint256 public antiSnipeEndTime;

    uint256 public _maxTxAmount;
    uint256 public _walletMax;
    uint256 public swapThreshold;

    constructor() {
        factory = msg.sender;
    }

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

    modifier onlyProofAdmin() {
        require(proofAdmin == _msgSender(), "Caller is not the proofAdmin");
        _;
    }

    modifier onlyFactory() {
        require(factory == _msgSender(), "Caller is not the factory");
        _;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofNonReflectionTokenFees.allFees memory fees
    ) external onlyFactory {
        _name = _baseData.tokenName;
        _symbol = _baseData.tokenSymbol;
        _totalSupply = _baseData.initialSupply;

        //Tx & Wallet Limits
        require(_baseData.percentToLP >= 70, "Too low");
        _maxTxAmount = (_baseData.initialSupply * 5) / 1000;
        _walletMax = (_baseData.initialSupply * 1) / 100;
        swapThreshold = (_baseData.initialSupply * 5) / 4000;

        router = IUniswapV2Router02(_baseData.routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );

        _allowances[address(this)][address(router)] = type(uint256).max;

        isFeeExempt[address(this)] = true;
        isFeeExempt[factory] = true;
        isFeeExempt[_baseData.owner] = true;

        isTxLimitExempt[_baseData.owner] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[factory] = true;
        isTxLimitExempt[DEAD] = true;
        isTxLimitExempt[ZERO] = true;

        //Fees
        lpFee = fees.lpFee;
        lpFeeOnSell = fees.lpFeeOnSell;
        devFee = fees.devFee;
        devFeeOnSell = fees.devFeeOnSell;
        mainFee = fees.mainFee;
        mainFeeOnSell = fees.mainFeeOnSell;

        if (fees.devFee + fees.lpFee + fees.mainFee == 0) {
            proofFee = 0;
        } 
        totalFee = fees.devFee + fees.lpFee + fees.mainFee + proofFee;

        if (fees.devFeeOnSell + fees.lpFeeOnSell + fees.mainFeeOnSell == 0) {
            proofFeeOnSell = 0;
        }
        totalFeeIfSelling = fees.devFeeOnSell + fees.lpFeeOnSell + fees.mainFeeOnSell + proofFeeOnSell;


        if (IFACTORY(factory).isWhitelisted(_baseData.owner)) {
            require(totalFee <= 12, "high KYC fee");
            require(totalFeeIfSelling <= 17, "high KYC fee");
        } else {
            require(totalFee <= 7, "high fee");
            require(totalFeeIfSelling <= 7, "high fee");
        }

        devWallet = payable(_baseData.dev);
        mainWallet = payable(_baseData.main);
        proofAdmin = _baseData.initialProofAdmin;

        //Initial supply
        uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95%
        uint256 forOwner = _baseData.initialSupply - forLP; //5%

        _balances[msg.sender] += forLP;
        _balances[_baseData.owner] += forOwner;

        antiSnipeDuration = _baseData.antiSnipeDuration;

        emit Transfer(address(0), msg.sender, forLP);
        emit Transfer(address(0), _baseData.owner, forOwner);
    }

    //proofAdmin functions

    function updateProofAdmin(
        address newAdmin
    ) external virtual onlyProofAdmin {
        proofAdmin = newAdmin;
    }

    //Factory functions
    function swapTradingStatus() external onlyFactory {
        tradingStatus = !tradingStatus;
    }

    function setLaunchedAt() external onlyFactory {
        require(launchedAt == 0, "launched");
        launchedAt = block.timestamp;
        antiSnipeEndTime = block.timestamp + antiSnipeDuration;
    }

    function cancelToken() external onlyFactory {
        isFeeExempt[address(router)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[owner()] = true;
        tradingStatus = true;
        restrictWhales = false;
        swapAndLiquifyEnabled = false;
    }

    //Owner functions
    function changeRestrictWhales(bool _enable) external onlyOwner {
        restrictWhales = _enable;
    }

    function changeFees(
        uint256 initialMainFee,
        uint256 initialMainFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external onlyOwner {
        uint256 _proofFee;
        uint256 _proofFeeOnSell;
        if ((block.timestamp > launchedAt + 31 days) && (launchedAt != 0)) {
            _proofFee = 0;
            _proofFeeOnSell = 0;
        } else if ((block.timestamp > launchedAt + 1 days) && (launchedAt != 0)) {
            _proofFee = 1;
            _proofFeeOnSell = 1;
        } else {
            _proofFee = 2;
            _proofFeeOnSell = 2;
        }
        mainFee = initialMainFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

        mainFeeOnSell = initialMainFeeOnSell;
        lpFeeOnSell = initialLpFeeOnSell;
        devFeeOnSell = initialDevFeeOnSell;

        if (initialDevFee + initialLpFee + initialMainFee == 0) {
            _proofFee = 0;
        } 
        totalFee = initialDevFee + initialLpFee + initialMainFee + _proofFee;

        if (initialDevFeeOnSell + initialLpFeeOnSell + initialMainFeeOnSell == 0) {
            _proofFeeOnSell = 0;
        }
        totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + initialMainFeeOnSell + _proofFeeOnSell;

        proofFee = _proofFee;
        proofFeeOnSell = _proofFeeOnSell;

        if (IFACTORY(factory).isWhitelisted(owner())) {
            require(totalFee <= 12, "high fee");
            require(totalFeeIfSelling <= 17, "high fee");
        } else {
            require(totalFee <= 7, "high fee");
            require(totalFeeIfSelling <= 7, "high fee");
        }
    }

    function changeTxLimit(uint256 newLimit) external onlyOwner {
        require(launchedAt != 0, "!launched");
        require(newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%");
        require(newLimit <= (_totalSupply * 3) / 100, "Max 3%");
        _maxTxAmount = newLimit;
    }

    function changeWalletLimit(uint256 newLimit) external onlyOwner {
        require(launchedAt != 0, "!launched");
        require(newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%");
        require(newLimit <= (_totalSupply * 3) / 100, "Max 3%");
        _walletMax = newLimit;
    }

    function changeIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }

    function setDevWallet(address payable newDevWallet) external onlyOwner {
        devWallet = payable(newDevWallet);
    }

    function setMainWallet(address payable newMainWallet) external onlyOwner {
        mainWallet = newMainWallet;
    }

    function changeSwapBackSettings(
        bool enableSwapBack,
        uint256 newSwapBackLimit
    ) external onlyOwner {
        swapAndLiquifyEnabled = enableSwapBack;
        swapThreshold = newSwapBackLimit;
    }

    function delBot(address notbot) external {
        address sender = _msgSender();
        require(
            sender == proofAdmin || sender == owner(),
            "Caller doesn't have permission"
        );
        bots[notbot] = false;
    }

    function getCirculatingSupply() external view returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() external view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external 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() external view virtual override returns (uint8) {
        return 9;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() external 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
    ) external 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
    ) external 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
    ) external 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
    ) external virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[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
    ) external virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "Decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(tradingStatus, "Closed");
        require(!bots[sender] && !bots[recipient]);
        if (antiSnipeEndTime != 0 && block.timestamp < antiSnipeEndTime) {
            bots[tx.origin] = true;
            if (recipient != tx.origin) {
                revert('antisnipe');
            }
        }
        if (inSwapAndLiquify) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (recipient == pair && restrictWhales) {
            require(
                amount <= _maxTxAmount ||
                    (isTxLimitExempt[sender] && isTxLimitExempt[recipient]),
                "Max TX"
            );
        }

        if (!isTxLimitExempt[recipient] && restrictWhales) {
            require(_balances[recipient] + amount <= _walletMax, "Max Wallet");
        }

        if (!proofFeeRemoved && launchedAt != 0) { //first 31 days only
            if (!proofFeeReduced) { //case where proofFee is still 2, check if we can reduce
                if (block.timestamp > launchedAt + 86400) {
                    proofFee = (devFee + lpFee + mainFee == 0) ? 0 : 1;
                    proofFeeOnSell = (devFeeOnSell + lpFeeOnSell + mainFeeOnSell == 0) ? 0 : 1;
                    totalFee = devFee + lpFee + mainFee + proofFee;
                    totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + mainFeeOnSell + proofFeeOnSell;
                    proofFeeReduced = true;
                }
            } else {
                if (block.timestamp > launchedAt + 31 days) {
                    proofFee = 0;
                    proofFeeOnSell = 0;
                    totalFee = devFee + lpFee + mainFee + proofFee;
                    totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + mainFeeOnSell + proofFeeOnSell;
                    proofFeeRemoved = true;
                }
            }
        }

        if (
            sender != pair &&
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            (accMainFees + accLpFees + accDevFees + accProofFees) >= swapThreshold
        ) {
            swapBack();
        }

        _balances[sender] = _balances[sender] - amount;
        uint256 finalAmount = amount;

        if (sender == pair || recipient == pair) {
            finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient]
                ? takeFee(sender, recipient, amount)
                : amount;
        }

        _balances[recipient] = _balances[recipient] + finalAmount;

        emit Transfer(sender, recipient, finalAmount);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender] - amount;
        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    /** @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.
     */

    /**
     * @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), "Approve from the zero address");
        require(spender != address(0), "Approve to the zero address");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * 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, "Insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeApplicable;
        uint256 _mainApplicable;
        uint256 _lpApplicable;
        uint256 _devApplicable;
        uint256 _proofApplicable;
        if (pair == recipient) {
            feeApplicable = totalFeeIfSelling;
            _mainApplicable = mainFeeOnSell;
            _lpApplicable = lpFeeOnSell;
            _devApplicable = devFeeOnSell;
            _proofApplicable = proofFeeOnSell;
        } else {
            feeApplicable = totalFee;
            _mainApplicable = mainFee;
            _lpApplicable = lpFee;
            _devApplicable = devFee;
            _proofApplicable = proofFee;
        }
        if (feeApplicable == 0) return(amount);
        uint256 feeAmount = (amount * feeApplicable) / 100;

        accMainFees += feeAmount * _mainApplicable / feeApplicable;
        accLpFees += feeAmount * _lpApplicable / feeApplicable;
        accDevFees += feeAmount * _devApplicable / feeApplicable;
        accProofFees += feeAmount * _proofApplicable / feeApplicable;

        _balances[address(this)] = _balances[address(this)] + feeAmount;
        emit Transfer(sender, address(this), feeAmount);

        return amount - feeAmount;
    }

    function swapBack() internal lockTheSwap {
        uint256 tokensToLiquify = _balances[address(this)];

        uint256 lpProportion = accLpFees;
        uint256 devProportion = accDevFees;
        uint256 mainProportion = accMainFees;
        uint256 proofProportion = accProofFees;
        
        uint256 totalProportion = lpProportion + devProportion + mainProportion + proofProportion;

        uint256 lpAmt = tokensToLiquify * lpProportion / totalProportion;
        uint256 devBalance;
        uint256 proofBalance;

        uint256 amountToLiquify = lpAmt / 2;

        if (tokensToLiquify - amountToLiquify == 0) return;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            (tokensToLiquify - amountToLiquify),
            0,
            path,
            address(this),
            block.timestamp
        );

        // Use sell ratios if buy tax too low

        uint256 amountA;
        if (amountToLiquify > 0) {
            (amountA,,) = router.addLiquidityETH{value: ((address(this).balance * amountToLiquify) / (totalProportion - amountToLiquify))}(
                address(this),
                amountToLiquify,
                0,
                0,
                0x000000000000000000000000000000000000dEaD,
                block.timestamp
            );
        }
        accLpFees = lpProportion < (lpAmt - (amountToLiquify - amountA)) ? 0 : 
            (lpProportion - (lpAmt - (amountToLiquify - amountA)));

        uint256 amountETHafterLP = address(this).balance;

        if (totalProportion - lpProportion == 0) return;
        proofBalance = (amountETHafterLP * proofProportion) / (devProportion + proofProportion + mainProportion);
        devBalance = amountETHafterLP * devProportion / (devProportion + proofProportion + mainProportion);
        uint256 amountEthMain = amountETHafterLP - devBalance - proofBalance;

        accDevFees = devProportion < (tokensToLiquify * devProportion / totalProportion) ? 0 : 
            (devProportion - (tokensToLiquify * devProportion / totalProportion));
        accMainFees = mainProportion < (tokensToLiquify * mainProportion / totalProportion) ? 0 : 
            (mainProportion - (tokensToLiquify * mainProportion / totalProportion));
        accProofFees = proofProportion < (tokensToLiquify * proofProportion / totalProportion) ? 0 : 
            (proofProportion - (tokensToLiquify * proofProportion / totalProportion));

        if (amountETHafterLP > 0) {
            if (proofBalance > 0) {
                uint256 revenueSplit = proofBalance / 2;
                (bool sent, ) = payable(IFACTORY(factory).proofRevenueAddress()).call{value: revenueSplit}("");
                require(sent);
                (bool sent1, ) = payable(IFACTORY(factory).proofRewardPoolAddress()).call{value: revenueSplit}("");
                require(sent1);
            }
            if (devBalance > 0) {
                (bool sent, ) = devWallet.call{value: devBalance}("");
                require(sent);
            }
            if (amountEthMain > 0) {
                (bool sent1, ) = mainWallet.call{value: amountEthMain}("");
                require(sent1);
            }
        }
    }

    function withdrawAndSync() external onlyOwner {
        _transfer(address(this), msg.sender, balanceOf(address(this)) - (accMainFees + accLpFees + accDevFees + accProofFees));
    }

    receive() external payable {}
}
IERC20Metadata.sol 28 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @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);
}

Read Contract

_maxTxAmount 0x7d1db4a5 → uint256
_walletMax 0x807c2d9c → uint256
allowance 0xdd62ed3e → uint256
antiSnipeDuration 0xaa8e79c2 → uint256
antiSnipeEndTime 0xb0c8edbd → uint256
balanceOf 0x70a08231 → uint256
bots 0xbfd79284 → bool
decimals 0x313ce567 → uint8
devFee 0x6827e764 → uint256
devFeeOnSell 0x9502c426 → uint256
devWallet 0x8ea5220f → address
factory 0xc45a0155 → address
getCirculatingSupply 0x2b112e49 → uint256
isDividendExempt 0x4355855a → bool
isFeeExempt 0x3f4218e0 → bool
isTxLimitExempt 0x8b42507f → bool
launchedAt 0xbf56b371 → uint256
lpFee 0x704ce43e → uint256
lpFeeOnSell 0x7c0ff205 → uint256
mainFee 0x0963da6c → uint256
mainFeeOnSell 0x985b9db0 → uint256
mainWallet 0x23b62b75 → address
name 0x06fdde03 → string
owner 0x8da5cb5b → address
pair 0xa8aa1b31 → address
proofAdmin 0x59a51c34 → address
proofFee 0xcd1e330a → uint256
proofFeeOnSell 0x8a1c7b84 → uint256
proofFeeReduced 0x88cda873 → bool
proofFeeRemoved 0x83842013 → bool
restrictWhales 0x44de2e4c → bool
router 0xf887ea40 → address
swapAndLiquifyEnabled 0x4a74bb02 → bool
swapThreshold 0x0445b667 → uint256
symbol 0x95d89b41 → string
totalFee 0x1df4ccfc → uint256
totalFeeIfSelling 0xca987b0e → uint256
totalSupply 0x18160ddd → uint256
tradingStatus 0xd4fb9a01 → bool

Write Contract 23 functions

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

approve 0x095ea7b3
address spender
uint256 amount
returns: bool
cancelToken 0x546a8811
No parameters
changeFees 0xcb29813c
uint256 initialMainFee
uint256 initialMainFeeOnSell
uint256 initialLpFee
uint256 initialLpFeeOnSell
uint256 initialDevFee
uint256 initialDevFeeOnSell
changeIsFeeExempt 0xa3a2e89e
address holder
bool exempt
changeIsTxLimitExempt 0xfabe6283
address holder
bool exempt
changeRestrictWhales 0xe66b1d1e
bool _enable
changeSwapBackSettings 0x3dab5269
bool enableSwapBack
uint256 newSwapBackLimit
changeTxLimit 0xd920334e
uint256 newLimit
changeWalletLimit 0x7db1342c
uint256 newLimit
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
delBot 0x273123b7
address notbot
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
setBasicData 0x430b88ae
tuple _baseData
tuple fees
setDevWallet 0x1f53ac02
address newDevWallet
setLaunchedAt 0x27193bc4
No parameters
setMainWallet 0xd0a5eb4e
address newMainWallet
swapTradingStatus 0xfbd75753
No parameters
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
updateProofAdmin 0xf16fd78d
address newAdmin
withdrawAndSync 0x5fef8680
No parameters

Recent Transactions

No transactions found for this address