Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xB7BDa6a89e724f63572Ce68FdDc1a6d1d5D24BCf
Balance 0 ETH
Nonce 1
Code Size 14761 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

14761 bytes
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80638d0846381161019d578063ac169800116100e9578063bcae1d57116100a2578063e0a22e671161007c578063e0a22e67146106c4578063e0af4fe2146106d7578063ed534174146106e0578063f2fde38b146106f357600080fd5b8063bcae1d571461066b578063dd62ed3e1461069e578063dedbf736146106b157600080fd5b8063ac1698001461060f578063ad5c464814610618578063adaccd7414610633578063b37bf54614610646578063b4975d4a1461064f578063b8e3e0f21461065857600080fd5b8063a03fb0c911610156578063a343895511610130578063a3438955146105d6578063a457c2d7146105e9578063a7782d06146104f7578063a9059cbb146105fc57600080fd5b8063a03fb0c9146105b2578063a2aa18ad146105ba578063a32bff44146105cd57600080fd5b80638d084638146105395780638da5cb5b1461054c5780639026b8d91461055d57806394f46b751461058457806395d89b41146105975780639be675741461059f57600080fd5b80633bfb4aad1161025c5780635e043f95116102155780636e11a899116101ef5780636e11a899146104f757806370a0823114610500578063715018a6146105295780638a8c523c1461053157600080fd5b80635e043f95146104c857806360901444146104db57806361e8bc20146104e457600080fd5b80633bfb4aad1461040957806343330c941461041c57806344ecc1791461046e5780634672bd0e146104815780634a9fefc7146104945780634d237730146104b557600080fd5b8063313ce567116102ae578063313ce567146103a257806332a5fce5146103b157806332b6eca2146103c457806332f28053146103cc5780633516e6fe146103ec57806339509351146103f657600080fd5b806306fdde03146102f6578063095ea7b31461031457806318160ddd146103375780632175c6491461034957806323b872dd1461035c5780632dd310001461036f575b600080fd5b6102fe610706565b60405161030b9190612f83565b60405180910390f35b610327610322366004612fad565b610798565b604051901515815260200161030b565b6002545b60405190815260200161030b565b61032761035736600461308e565b6107b2565b61032761036a36600461312b565b610900565b61038a735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b6040516001600160a01b03909116815260200161030b565b6040516012815260200161030b565b6103276103bf366004613167565b6109d5565b610327610a02565b61033b6103da366004613167565b60166020526000908152604090205481565b6103f4610ae5565b005b610327610404366004612fad565b610b69565b61032761041736600461308e565b610b8b565b61044f61042a366004613182565b600e60205260009081526040902080546001909101546001600160a01b039091169082565b604080516001600160a01b03909316835260208301919091520161030b565b61032761047c36600461308e565b610ce2565b61032761048f366004613182565b610dfe565b6104a76104a2366004613167565b610ee9565b60405161030b92919061319b565b600d5461038a906001600160a01b031681565b6103276104d6366004613235565b610fb2565b61033b600c5481565b61038a6104f23660046133e8565b611859565b61033b61032081565b61033b61050e366004613167565b6001600160a01b031660009081526020819052604090205490565b6103f461188a565b61032761189e565b6103276105473660046133e8565b611936565b6005546001600160a01b031661038a565b61038a7f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd8230981565b6103276105923660046133e8565b611b4b565b6102fe611ce4565b6103276105ad366004613425565b611cf3565b610327611e2f565b6103f46105c8366004613167565b611e44565b61033b600b5481565b6103276105e4366004613182565b611f25565b6103276105f7366004612fad565b612034565b61032761060a366004612fad565b6120af565b61033b600a5481565b61038a73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6102fe610641366004613167565b612166565b61033b60075481565b61033b60065481565b61032761066636600461308e565b612212565b61044f610679366004613182565b600f60205260009081526040902080546001909101546001600160a01b039091169082565b61033b6106ac366004613447565b61231f565b6103f46106bf36600461347a565b61234a565b6103276106d2366004613425565b612495565b61033b60085481565b6103276106ee366004613182565b6125c0565b6103f4610701366004613167565b6126bf565b6060600380546107159061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546107419061349d565b801561078e5780601f106107635761010080835404028352916020019161078e565b820191906000526020600020905b81548152906001019060200180831161077157829003601f168201915b5050505050905090565b6000336107a6818585612738565b60019150505b92915050565b60006107bc61285c565b6032825111156108135760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d203530206163636f756e742063616e2062652061646465640060448201526064015b60405180910390fd5b60005b82518110156108f55760156000848381518110610835576108356134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610899575060006001600160a01b0316838281518110610885576108856134d7565b60200260200101516001600160a01b031614155b156108e3576001601560008584815181106108b6576108b66134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b806108ed81613503565b915050610816565b50600190505b919050565b60003361090e8582856128b6565b7f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd823096001600160a01b0316846001600160a01b031614801561096557506001600160a01b038516600090815260166020526040902054155b156109bf57600c546001146109b25760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b6109bc8584612930565b92505b6109ca858585612b2f565b506001949350505050565b6000600a54600014806107ac5750506001600160a01b031660009081526015602052604090205460011490565b600d546000906001600160a01b03163314610a2f5760405162461bcd60e51b815260040161080a9061351c565b60095415610a8d5760405162461bcd60e51b815260206004820152602560248201527f5265666572656e636520706f6f6c20697320616c726561647920746f67676c65604482015264321037b33360d91b606482015260840161080a565b6001600955600b805460009182905560405190917f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed91610ad591848252602082015260400190565b60405180910390a1600191505090565b600d546001600160a01b03163314610b0f5760405162461bcd60e51b815260040161080a9061351c565b600d80546001600160a01b03198116909155604080516001600160a01b0390921680835260006020840152917f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a150565b6000336107a6818585610b7c838361231f565b610b869190613553565b612738565b600d546000906001600160a01b03163314610bb85760405162461bcd60e51b815260040161080a9061351c565b603282511115610c0a5760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610c2c57610c2c6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020546000148015610c90575060006001600160a01b0316838281518110610c7c57610c7c6134d7565b60200260200101516001600160a01b031614155b15610cda57600160166000858481518110610cad57610cad6134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020819055505b600101610c0d565b600d546000906001600160a01b03163314610d0f5760405162461bcd60e51b815260040161080a9061351c565b603282511115610d615760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20353020616464726573732063616e20626520616464656400604482015260640161080a565b60005b82518110156108f55760166000848381518110610d8357610d836134d7565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054600103610df65760166000848381518110610dc957610dc96134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b600101610d64565b600d546000906001600160a01b03163314610e2b5760405162461bcd60e51b815260040161080a9061351c565b600082118015610e3c5750600b5482105b610e9f5760405162461bcd60e51b815260206004820152602e60248201527f4e6577206665652072617465206d757374206265206265747765656e2030206160448201526d6e642063757272656e742066656560901b606482015260840161080a565b600b80549083905560408051828152602081018590527f27f369f734f9f38ca1388d9fd8488d89e84f8bea0457621af7b35b6df99976ed910160405180910390a150600192915050565b6001600160a01b0380821660009081526010602090815260408083205490931680835260119091529181208054606093919082908290610f289061349d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f549061349d565b8015610fa15780601f10610f7657610100808354040283529160200191610fa1565b820191906000526020600020905b815481529060010190602001808311610f8457829003601f168201915b505050505091509250925050915091565b6000610fbc61285c565b603e60065411156110085760405162461bcd60e51b8152602060048201526016602482015275496e697469616c697a6174696f6e20697320646f6e6560501b604482015260640161080a565b60008251116110725760405162461bcd60e51b815260206004820152603060248201527f526566657272616c73206172726179206c656e677468206d757374206265206760448201526f726561746572207468616e207a65726f60801b606482015260840161080a565b8151600660008282546110859190613553565b90915550600090505b82518110156108f5576001601560008584815181106110af576110af6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002081905550601160008483815181106110f5576110f56134d7565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020805461112c9061349d565b15905061117b5760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b82818151811061118d5761118d6134d7565b602002602001015160200151516000141580156111c9575060408382815181106111b9576111b96134d7565b6020026020010151602001515111155b6111e55760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b03166014848381518110611204576112046134d7565b60200260200101516020015160405161121d91906135b2565b908152604051908190036020019020546001600160a01b03161461127f5760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b828181518110611291576112916134d7565b60200260200101516000015160148483815181106112b1576112b16134d7565b6020026020010151602001516040516112ca91906135b2565b908152602001604051809103902060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555082818151811061130e5761130e6134d7565b60200260200101516020015160116000858481518110611330576113306134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000209081611368919061361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad83828151811061139c5761139c6134d7565b6020026020010151600001518483815181106113ba576113ba6134d7565b6020026020010151602001518584815181106113d8576113d86134d7565b6020026020010151604001516040516113f3939291906136dc565b60405180910390a1600083828151811061140f5761140f6134d7565b6020026020010151606001515111156118515760006011600085848151811061143a5761143a6134d7565b6020026020010151600001516001600160a01b03166001600160a01b031681526020019081526020016000206040516020016114769190613710565b60405160208183030381529060405280519060200120905060005b8483815181106114a3576114a36134d7565b6020026020010151606001515181101561184e578483815181106114c9576114c96134d7565b60200260200101516060015181815181106114e6576114e66134d7565b6020026020010151600001516001600160a01b031660106000878681518110611511576115116134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416148015906115ac575060006001600160a01b031660106000878681518110611564576115646134d7565b6020026020010151606001518481518110611581576115816134d7565b602090810291909101810151516001600160a01b039081168352908201929092526040016000205416145b80156115ca5750604080516000815260208101918290525190208214155b8015611606575060006001600160a01b03168584815181106115ee576115ee6134d7565b6020026020010151600001516001600160a01b031614155b801561167b575084838151811061161f5761161f6134d7565b602002602001015160600151818151811061163c5761163c6134d7565b6020026020010151600001516001600160a01b0316858481518110611663576116636134d7565b6020026020010151600001516001600160a01b031614155b6116ba5760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b8483815181106116cc576116cc6134d7565b602002602001015160000151601060008786815181106116ee576116ee6134d7565b602002602001015160600151848151811061170b5761170b6134d7565b6020026020010151600001516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055507fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4985848151811061178e5761178e6134d7565b6020026020010151600001518685815181106117ac576117ac6134d7565b6020026020010151602001518786815181106117ca576117ca6134d7565b60200260200101516060015184815181106117e7576117e76134d7565b602002602001015160000151888781518110611805576118056134d7565b6020026020010151606001518581518110611822576118226134d7565b60200260200101516020015160405161183e9493929190613786565b60405180910390a1600101611491565b50505b60010161108e565b600060148260405161186b91906135b2565b908152604051908190036020019020546001600160a01b031692915050565b61189261285c565b61189c6000612cd3565b565b60006118a861285c565b600c54156118f85760405162461bcd60e51b815260206004820152601860248201527f547261646520697320616c726561647920656e61626c65640000000000000000604482015260640161080a565b6001600c556040514281527fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239060200160405180910390a150600190565b6000600a54600014806119585750336000908152601560205260409020546001145b61199c5760405162461bcd60e51b8152602060048201526015602482015274165bdd48185c99481b9bdd081c1c9959995c9c9959605a1b604482015260640161080a565b33600090815260116020526040902080546119b69061349d565b159050611a055760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c726561647920686176652061206e69636b6e616d650000000000604482015260640161080a565b815115801590611a1757506040825111155b611a335760405162461bcd60e51b815260040161080a90613566565b60006001600160a01b0316601483604051611a4e91906135b2565b908152604051908190036020019020546001600160a01b031614611ab05760405162461bcd60e51b81526020600482015260196024820152782734b1b5b730b6b29034b99030b63932b0b23c903a30b5b2b760391b604482015260640161080a565b33601483604051611ac191906135b2565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039490941693909317909255336000908152601190915220611b07838261361c565b507f0ed9a97ab9c2d9154a598932f980864c384da57bbf1b41cef09c6768dff088ad338342604051611b3b939291906136dc565b60405180910390a1506001919050565b600080601483604051611b5e91906135b2565b9081526040805160209281900383018120546001600160a01b03166000818152601185529283209094509192611b95929101613710565b60408051601f1981840301815291815281516020928301206001600160a01b03858116600090815260109094529190922054919250163314801590611bf05750336000908152601060205260409020546001600160a01b0316155b8015611c0e5750604080516000815260208101918290525190208114155b8015611c2257506001600160a01b03821615155b8015611c3757506001600160a01b0382163314155b611c765760405162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59081c9959995c9c985b60821b604482015260640161080a565b336000818152601060205260409081902080546001600160a01b0319166001600160a01b038616179055517fd4024e5e44041dd6dba8b883ae669a8fb58b9402a39d82671cd3696fef8c8c4991611cd291859188914290613786565b60405180910390a15060019392505050565b6060600480546107159061349d565b600d546000906001600160a01b03163314611d205760405162461bcd60e51b815260040161080a9061351c565b6007831115611d415760405162461bcd60e51b815260040161080a906137ba565b60008381526012602052604090205415611d6d5760405162461bcd60e51b815260040161080a906137e5565b600082118015611d8d57506000838152600e602052604090206001015482105b611da95760405162461bcd60e51b815260040161080a9061381c565b6000838152600e6020526040902060010154611dc690839061386e565b600754611dd3919061386e565b6007556000838152600e6020526040908190206001018390555183907f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c90611e1e9085815260200190565b60405180910390a250600192915050565b6000611e3961285c565b506000600a55600190565b600d546001600160a01b03163314611e6e5760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b038116611ec45760405162461bcd60e51b815260206004820152601f60248201527f4e657720616464726573732063616e6e6f742062652030206164647265737300604482015260640161080a565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f4adb4bd40da8456432ec4d0c365d395fb1d51464c6bf1edf44c49eca7708a449910160405180910390a15050565b600d546000906001600160a01b03163314611f525760405162461bcd60e51b815260040161080a9061351c565b6007821115611f735760405162461bcd60e51b815260040161080a906137ba565b60008281526012602052604090205415611f9f5760405162461bcd60e51b815260040161080a906137e5565b6000828152601260209081526040808320600190819055600e9092529091200154600754611fcd919061386e565b6007556000828152600e602052604080822080546001600160a01b03191681556001018290555183917f480af1f773972b1df72af32ec463e0fdeb1b49f1ca37d07982f677919d5fdd0c9161202491815260200190565b60405180910390a2506001919050565b60003381612042828661231f565b9050838110156120a25760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161080a565b6109ca8286868403612738565b6000336001600160a01b037f000000000000000000000000173a958b4381f72381c3a1099bf715d0acd82309168114801561210057506001600160a01b038416600090815260166020526040902054155b1561215b57600c5460011461214d5760405162461bcd60e51b81526020600482015260136024820152722a3930b234b7339034b9903737ba1037b832b760691b604482015260640161080a565b612158848285612d25565b92505b6107a6818585612b2f565b6001600160a01b038116600090815260116020526040902080546060919061218d9061349d565b80601f01602080910402602001604051908101604052809291908181526020018280546121b99061349d565b80156122065780601f106121db57610100808354040283529160200191612206565b820191906000526020600020905b8154815290600101906020018083116121e957829003601f168201915b50505050509050919050565b600061221c61285c565b6032825111156122785760405162461bcd60e51b815260206004820152602160248201527f4d6178696d756d203530206163636f756e742063616e2062652072656d6f76656044820152601960fa1b606482015260840161080a565b60005b82518110156108f5576015600084838151811061229a5761229a6134d7565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205460010361230d57601560008483815181106122e0576122e06134d7565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600090555b8061231781613503565b91505061227b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600d546001600160a01b031633146123745760405162461bcd60e51b815260040161080a9061351c565b6001600160a01b0381166123d85760405162461bcd60e51b815260206004820152602560248201527f4e657720616464726573732063616e6e6f7420657175616c20746f2030206164604482015264647265737360d81b606482015260840161080a565b600782106124205760405162461bcd60e51b81526020600482015260156024820152742837b7b61034b21034b9903737ba103337bab7321760591b604482015260640161080a565b6000828152600e6020908152604080832080546001600160a01b0386166001600160a01b03199182168117909255600f845293829020805490941681179093555191825283917fb672b14b994dc0b451a4b01d24d56f5230137c6960ef3e02bfd22255ced63e01910160405180910390a25050565b600d546000906001600160a01b031633146124c25760405162461bcd60e51b815260040161080a9061351c565b60078311156124e35760405162461bcd60e51b815260040161080a906137ba565b6000838152601360205260409020541561250f5760405162461bcd60e51b815260040161080a906137e5565b60008211801561252f57506000838152600f602052604090206001015482105b61254b5760405162461bcd60e51b815260040161080a9061381c565b6000838152600f602052604090206001015461256890839061386e565b600854612575919061386e565b6008556000838152600f6020526040908190206001018390555183907f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b90611e1e9085815260200190565b600d546000906001600160a01b031633146125ed5760405162461bcd60e51b815260040161080a9061351c565b600782111561260e5760405162461bcd60e51b815260040161080a906137ba565b6000828152601360205260409020541561263a5760405162461bcd60e51b815260040161080a906137e5565b6000828152601360209081526040808320600190819055600f9092529091200154600854612668919061386e565b6008556000828152600f602052604080822080546001600160a01b03191681556001018290555183917f2c7448b63380296b372453c5287509524b5b645dc6a93ffe09e0af53e6b8935b9161202491815260200190565b6126c761285c565b6001600160a01b03811661272c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161080a565b61273581612cd3565b50565b6001600160a01b03831661279a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161080a565b6001600160a01b0382166127fb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161080a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b0316331461189c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161080a565b60006128c2848461231f565b9050600019811461292a578181101561291d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161080a565b61292a8484848403612738565b50505050565b600080805b6129416001600761386e565b8110156129c0576000818152600f602090815260408083206001015460139092528220549091036129ad5760006129788683612f0e565b90506129848185613553565b6000848152600f60205260409020549094506001600160a01b03166129aa888284612b2f565b50505b50806129b881613503565b915050612935565b506001600160a01b038085166000908152601060205260409020546009549116901580156129f657506001600160a01b03811615155b15612a81576000612a0985600b54612f0e565b9050612a158184613553565b9250612a22868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612a739185908a908a9087904290613881565b60405180910390a150612b1c565b60136000612a916001600761386e565b815260200190815260200160002054600003612b1c576000612ad385600f83612abc6001600761386e565b815260200190815260200160002060010154612f0e565b9050612adf8184613553565b92506000600f81612af26001600761386e565b81526020810191909152604001600020546001600160a01b03169050612b19878284612b2f565b50505b612b26828561386e565b95945050505050565b6001600160a01b038316612b935760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161080a565b6001600160a01b038216612bf55760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161080a565b6001600160a01b03831660009081526020819052604090205481811015612c6d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161080a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361292a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080805b612d366001600761386e565b811015612db5576000818152600e60209081526040808320600101546012909252822054909103612da2576000612d6d8683612f0e565b9050612d798185613553565b6000848152600e60205260409020549094506001600160a01b0316612d9f888284612b2f565b50505b5080612dad81613503565b915050612d2a565b506001600160a01b03808616600090815260106020526040902054600954911690158015612deb57506001600160a01b03811615155b15612e76576000612dfe85600b54612f0e565b9050612e0a8184613553565b9250612e17868383612b2f565b6001600160a01b0382166000908152601160205260409081902090517f684eec4406defb53defd351500aae07199860053b688af9137c2a72b037455bf91612e689185908b908a9087904290613881565b60405180910390a150612efa565b60126000612e866001600761386e565b815260200190815260200160002054600003612efa576000612eb185600e83612abc6001600761386e565b9050612ebd8184613553565b92506000600e81612ed06001600761386e565b81526020810191909152604001600020546001600160a01b03169050612ef7878284612b2f565b50505b612f04828561386e565b9695505050505050565b6000612710612f1d838561393a565b612f279190613951565b9392505050565b505050565b60005b83811015612f4e578181015183820152602001612f36565b50506000910152565b60008151808452612f6f816020860160208601612f33565b601f01601f19169290920160200192915050565b602081526000612f276020830184612f57565b80356001600160a01b03811681146108fb57600080fd5b60008060408385031215612fc057600080fd5b612fc983612f96565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff8111828210171561301057613010612fd7565b60405290565b6040805190810167ffffffffffffffff8111828210171561301057613010612fd7565b604051601f8201601f1916810167ffffffffffffffff8111828210171561306257613062612fd7565b604052919050565b600067ffffffffffffffff82111561308457613084612fd7565b5060051b60200190565b600060208083850312156130a157600080fd5b823567ffffffffffffffff8111156130b857600080fd5b8301601f810185136130c957600080fd5b80356130dc6130d78261306a565b613039565b81815260059190911b820183019083810190878311156130fb57600080fd5b928401925b828410156131205761311184612f96565b82529284019290840190613100565b979650505050505050565b60008060006060848603121561314057600080fd5b61314984612f96565b925061315760208501612f96565b9150604084013590509250925092565b60006020828403121561317957600080fd5b612f2782612f96565b60006020828403121561319457600080fd5b5035919050565b6040815260006131ae6040830185612f57565b905060018060a01b03831660208301529392505050565b600082601f8301126131d657600080fd5b813567ffffffffffffffff8111156131f0576131f0612fd7565b613203601f8201601f1916602001613039565b81815284602083860101111561321857600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561324757600080fd5b67ffffffffffffffff808335111561325e57600080fd5b8235830184601f82011261327157600080fd5b61327e6130d7823561306a565b81358082526020808301929160051b8401018781111561329d57600080fd5b602084015b818110156133db5785813511156132b857600080fd5b803585016080818b03601f190112156132d057600080fd5b6132d8612fed565b6132e460208301612f96565b815287604083013511156132f757600080fd5b61330a8b602060408501358501016131c5565b602082015260608201356040820152876080830135111561332a57600080fd5b6080820135820191508a603f83011261334257600080fd5b60208201356133536130d78261306a565b81815260069190911b83016040019060208101908d83111561337457600080fd5b6040850194505b828510156133c5576040858f03121561339357600080fd5b61339b613016565b6133a486612f96565b8152602086013560208201528083525060208201915060408501945061337b565b60608401525050855250602093840193016132a2565b5090979650505050505050565b6000602082840312156133fa57600080fd5b813567ffffffffffffffff81111561341157600080fd5b61341d848285016131c5565b949350505050565b6000806040838503121561343857600080fd5b50508035926020909101359150565b6000806040838503121561345a57600080fd5b61346383612f96565b915061347160208401612f96565b90509250929050565b6000806040838503121561348d57600080fd5b8235915061347160208401612f96565b600181811c908216806134b157607f821691505b6020821081036134d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201613515576135156134ed565b5060010190565b60208082526018908201527f596f7520617265206e6f7420746178206d616e616765722e0000000000000000604082015260600190565b808201808211156107ac576107ac6134ed565b6020808252602c908201527f4e69636b6e616d65206d757374206265206265747765656e203120616e64203660408201526b34206368617261637465727360a01b606082015260800190565b600082516135c4818460208701612f33565b9190910192915050565b601f821115612f2e57600081815260208120601f850160051c810160208610156135f55750805b601f850160051c820191505b8181101561361457828155600101613601565b505050505050565b815167ffffffffffffffff81111561363657613636612fd7565b61364a81613644845461349d565b846135ce565b602080601f83116001811461367f57600084156136675750858301515b600019600386901b1c1916600185901b178555613614565b600085815260208120601f198616915b828110156136ae5788860151825594840194600190910190840161368f565b50858210156136cc5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038416815260606020820181905260009061370090830185612f57565b9050826040830152949350505050565b600080835461371e8161349d565b60018281168015613736576001811461374b5761377a565b60ff198416875282151583028701945061377a565b8760005260208060002060005b858110156137715781548a820152908401908201613758565b50505082870194505b50929695505050505050565b600060018060a01b038087168352608060208401526137a86080840187612f57565b94166040830152506060015292915050565b602080825260119082015270141bdbdb081a59081b9bdd08199bdd5b99607a1b604082015260600190565b6020808252601f908201527f54686520706f6f6c20697320616c726561647920746f67676c6564206f666600604082015260600190565b60208082526032908201527f4e6577206665652072617465206d757374206265206265747765656e203020616040820152716e642063757272656e74207461782066656560701b606082015260800190565b818103818111156107ac576107ac6134ed565b60c0815260008088546138938161349d565b8060c086015260e06001808416600081146138b557600181146138cf57613900565b60ff1985168884015283151560051b880183019550613900565b8d60005260208060002060005b868110156138f75781548b82018701529084019082016138dc565b8a018501975050505b505050506001600160a01b039889166020850152509590961660408201526060810193909352608083019190915260a09091015292915050565b80820281158282048414176107ac576107ac6134ed565b60008261396e57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212201880500fc0fec932240e084c91dafb755e30f44ca4fd3f0e6d78a4fcdc65670064736f6c63430008130033

Verified Source Code Full Match

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

pragma solidity 0.8.19;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

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

contract OGzClub is ERC20, Ownable{
    uint256 public totalInitializated;
    uint256 private constant POOL_NUMBER = 7;
    uint256 private constant INITIALIZE_SUPPLY = 118_000_000_000 ether;
    uint256 public constant MAX_BUY_TAX_RATE = 800;
    uint256 public constant MAX_SELL_TAX_RATE = 800;
    uint256 public totalBuyTaxRate;
    uint256 public totalSellTaxRate;
    uint256 private toggleReferenceFees = 0;
    uint256 public togglePreferredNicknames;
    uint256 public referenceRate;
    uint256 public isTradeOpen;
    address public taxManager;
    address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address public immutable PairAddress;
    Factory public constant FACTORY = Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f);

    struct Pools {
        address poolAddress;
        uint256 taxRate;
    }

    struct Referrers {
        address referrer;
        uint256 timestamp;
    }

    struct Referrals {
        address referral;
        string nickname;
        uint256 timestamp;
        Referrers[] referees;
    }

    /// @dev mapping for all buying fee pools
    mapping(uint256 => Pools) public buyPools;
    mapping(uint256 => Pools) public sellPools;
    mapping(address => address) internal _referrals;
    mapping(address => string) internal _referralNickname;
    mapping(uint256 => uint256) internal _toggledOffBuyPools;
    mapping(uint256 => uint256) internal _toggledOffSellPools;
    mapping(string => address) internal _nickNames;
    /// @dev mapping for accounts that allow nicknames
    mapping(address => uint256) internal _preferredNicknames;
    /// @dev mapping for tax-frees accounts
    mapping(address => uint256) public _taxFrees;

    event RegisteredReferrence(address referral, string nickname, address referrer, uint256 timestamp);

    event CreatedLink(address owner, string nickName, uint256 timestamp);

    event BuyFeesUpdated(uint256 indexed poolId, uint256 newRate);

    event SellFeesUpdated(uint256 indexed poolId, uint256 newRate);

    event ReferenceFeeUpdated(uint256 oldRate, uint256 newFee);

    event ChangedPoolAddress(uint256 indexed poolId, address newAddress);

    event TransferWithTaxFee(string referralNickName, address referralAddress, address from, uint256 amount, uint256 referralEarnedAmount, uint256 timestamp);

    event ChangedTaxManager(address oldTaxManager, address newTaxManager);

    event TradingEnabled(uint256 timestamp);


    constructor(
        address _multisigOwner,
        address _taxManager,
        uint256 _referenceRate,
        Pools[] memory _poolsData)
    ERC20("OGzClub", "OGz") {
        require(_poolsData.length == POOL_NUMBER, "Pools datas length must be equal to 7");
        require(_multisigOwner != address(0) && _taxManager != address(0), "Owner and tax manager address cannot equal to address 0");
        require(_referenceRate > 0, "Reference tax rate must be greater than zero");
        referenceRate = _referenceRate;
        PairAddress = FACTORY.createPair(address(this), WETH);
        taxManager = _taxManager;
        _taxFrees[_multisigOwner] = 1;
        _transferOwnership(_multisigOwner);
        togglePreferredNicknames = 1;
        for (uint256 i = 0; i < _poolsData.length; i++) {
            require(_poolsData[i].poolAddress != address(0), "Pool address cannot equal to 0 address");
            require(_poolsData[i].taxRate > 0, "Pool rate must be greater than 0");
            buyPools[i] = _poolsData[i];
            sellPools[i] = _poolsData[i];
            totalBuyTaxRate += _poolsData[i].taxRate;
            totalSellTaxRate += _poolsData[i].taxRate;
        }
        require(
            totalBuyTaxRate == MAX_BUY_TAX_RATE &&
            totalSellTaxRate == MAX_SELL_TAX_RATE,
            "Total tax rate must be equal to maximum tax rate"
        );
        _mint(owner(), INITIALIZE_SUPPLY);
    }

    /** @dev Modifier to make a function callable only by the Tax Manager.
    * Throws if called by any account other than the Tax Manager.
    * @notice You must be the Tax Manager to call this.
    */
    modifier onlyTaxManager() {
        require(msg.sender == taxManager, "You are not tax manager.");
        _;
    }

    modifier initializationControl() {
        require(totalInitializated <= 62, "Initialization is done");
        _;
    }

    /**
    * @dev Modifier to restrict function access to preferred accounts for nickname creation.
    * @notice This modifier ensures that the function can only be accessed by preferred accounts,
    * or if the togglePreferredNicknames feature is turned off (equals to 0).
    */
    modifier onlyPreferredAccountCreateNickname() {
        require(
            togglePreferredNicknames == 0 ||
            _preferredNicknames[msg.sender] == 1,
            "You are not preferred");
        _;
    }

    /**
    * @dev Allows the current Tax Manager to relinquish control of the contract.
    * It sets the tax manager address to zero, hence no more tax related actions can be performed.
    * @notice Only the current Tax Manager can renounce tax management.
    */
    function renounceTaxManager() external onlyTaxManager {
        address oldTaxManager = taxManager;
        taxManager = address(0);
        emit ChangedTaxManager(oldTaxManager, taxManager);
    }

    /**
    * @dev Initializes referral data for the new token contract, pulling from the previously deployed token contract.
    * The referrals array provided should contain referral data from the previous contract to be transferred to the new one.
    * Emits a {CreatedLink} event for each referral that is successfully initialized.
    * Emits a {RegisteredReferrence} event for each referee that is successfully registered under a referrer.
    * @notice Only the contract owner can initialize the referral data.
    * @param referrals An array of Referral structs from the previous contract.
    * Each `Referral` struct should include the referrer's Ethereum address, nickname, and timestamp,
    * as well as an array of `Referee` structs, each of which should include the referred account's Ethereum address and timestamp.
    * @return true if the function succeeds.
    */
    function initializeReferralDatas(Referrals[] memory referrals) external onlyOwner initializationControl returns(bool) {
        require(referrals.length > 0, "Referrals array length must be greater than zero");
        totalInitializated += referrals.length;
        for (uint256 i = 0; i < referrals.length;) {
            _preferredNicknames[referrals[i].referral] = 1;
            require(bytes(_referralNickname[referrals[i].referral]).length == 0, "You already have a nickname");
            require(bytes(referrals[i].nickname).length != 0 && bytes(referrals[i].nickname).length <= 64, "Nickname must be between 1 and 64 characters");
            require(_nickNames[referrals[i].nickname] == address(0), "Nickname is already taken");
            _nickNames[referrals[i].nickname] = referrals[i].referral;
            _referralNickname[referrals[i].referral] = referrals[i].nickname;
            emit CreatedLink(referrals[i].referral, referrals[i].nickname, referrals[i].timestamp);
            if (referrals[i].referees.length > 0) {
                bytes32 referrerNicknameHash = keccak256(abi.encodePacked(_referralNickname[referrals[i].referral]));
                for (uint256 k = 0; k < referrals[i].referees.length;) {
                    require(
                        _referrals[referrals[i].referral] != referrals[i].referees[k].referrer &&
                        _referrals[referrals[i].referees[k].referrer] == address(0) &&
                        referrerNicknameHash != keccak256(abi.encodePacked("")) &&
                        referrals[i].referral != address(0) &&
                        referrals[i].referral != referrals[i].referees[k].referrer,
                        "Invalid referral"
                    );
                    _referrals[referrals[i].referees[k].referrer] = referrals[i].referral;
                    emit RegisteredReferrence(referrals[i].referral, referrals[i].nickname, referrals[i].referees[k].referrer, referrals[i].referees[k].timestamp);
                unchecked {
                    k ++;
                }
                }
            }
        unchecked {
            i ++;
        }
        }
        return true;
    }

    /**
    * @dev Transfers the tax management to a new address.
    * It sets the provided address as the new tax manager.
    * @notice Only the current Tax Manager can transfer tax management to a new address.
    * @param newTaxManager The address of the new Tax Manager.
    */
    function transferTaxManager(address newTaxManager) external onlyTaxManager {
        require(newTaxManager != address(0), "New address cannot be 0 address");
        address oldTaxManager = taxManager;
        taxManager = newTaxManager;
        emit ChangedTaxManager(oldTaxManager, taxManager);
    }


    /**
    * @dev Adds a list of addresses to the tax-free list.
    * These addresses will be exempt from taxes imposed by the contract.
    * @notice Only the current Tax Manager can add addresses to the tax-free list.
    * A maximum of 50 addresses can be added at a time.
    * @param taxFrees An array of addresses to be added to the tax-free list.
    * @return A boolean value indicating whether the operation was successful.
    */
    function addTaxFrees(address[] memory taxFrees) external onlyTaxManager returns(bool) {
        require(taxFrees.length <= 50, "Maximum 50 address can be added");
        for (uint256 i = 0; i < taxFrees.length;) {
            if (_taxFrees[taxFrees[i]] == 0 && taxFrees[i] != address(0)) {
                _taxFrees[taxFrees[i]] = 1;
            }
        unchecked {
            i++;
        }
        }
        return true;
    }

    /**
    * @dev Removes a list of addresses from the tax-free list.
    * These addresses will no longer be exempt from taxes imposed by the contract.
    * @notice Only the current Tax Manager can remove addresses from the tax-free list.
    * A maximum of 50 addresses can be removed at a time.
    * @param taxFrees An array of addresses to be removed from the tax-free list.
    * @return A boolean value indicating whether the operation was successful.
    */
    function removeTaxFrees(address[] memory taxFrees) external onlyTaxManager returns(bool) {
        require(taxFrees.length <= 50, "Maximum 50 address can be added");
        for (uint256 i = 0; i < taxFrees.length;) {
            if (_taxFrees[taxFrees[i]] == 1) {
                delete _taxFrees[taxFrees[i]];
            }
        unchecked {
            i++;
        }
        }
        return true;
    }

    /**
    * @dev Changes the address of a specific pool.
    * @notice This function can only be called by the current Tax Manager. It changes the
    * address of both the buy and sell pools at the specified pool ID.
    * @param poolId The ID of the pool whose address is to be changed.
    * @param newAddress The new address to set for the specified pool.
    */
    function changePoolAddress(
        uint256 poolId,
        address newAddress
    ) external onlyTaxManager {
        require(newAddress != address(0), "New address cannot equal to 0 address");
        require(poolId < POOL_NUMBER, "Pool id is not found.");
        buyPools[poolId].poolAddress = newAddress;
        sellPools[poolId].poolAddress = newAddress;
        emit ChangedPoolAddress(poolId, newAddress);
    }

    /**
    * @dev Function to add a list of preferred accounts for nickname creation.
    * @notice This function is used to add a list of accounts as preferred for creating nicknames.
    * The maximum limit is 50 accounts per transaction. Only contract owner can call this function.
    * @param account An array of account addresses to be marked as preferred.
    * @return Returns true if the operation is successful.
    */
    function addPreferredNicknames(address[] memory account) external onlyOwner returns(bool) {
        require(account.length <= 50, "Maximum 50 account can be added");
        for (uint256 i = 0; i < account.length; i++) {
            if (_preferredNicknames[account[i]] == 0 && account[i] != address(0)) {
                _preferredNicknames[account[i]] = 1;
            }
        }
        return true;
    }

    /**
    * @dev Function to remove a list of preferred accounts for nickname creation.
    * @notice This function is used to remove a list of accounts from the preferred accounts for creating nicknames.
    * The maximum limit is 50 accounts per transaction. Only contract owner can call this function.
    * @param account An array of account addresses to be removed from the list of preferred accounts.
    * @return Returns true if the operation is successful.
    */
    function removePreferredNicknames(address[] memory account) external onlyOwner returns(bool) {
        require(account.length <= 50, "Maximum 50 account can be removed");
        for (uint256 i = 0; i < account.length; i++) {
            if (_preferredNicknames[account[i]] == 1) {
                delete _preferredNicknames[account[i]];
            }
        }
        return true;
    }

    /**
    * @dev Function to disable the preferred nickname creation feature.
    * @notice This function allows the contract owner to disable the preferred nickname creation feature.
    * Once this function is called, only the contract owner will be able to re-enable it.
    * @return Returns true if the operation is successful.
    */
    function toggleOffPreferredNicknames() external onlyOwner returns(bool) {
        togglePreferredNicknames = 0;
        return true;
    }

    /**
    * @dev Function to check whether a specific account has the permission to create a nickname.
    * @notice This function checks whether the passed account has the permission to create a nickname.
    * If the preferred nickname feature is turned off (togglePreferredNicknames == 0), this function will return true for any account.
    * If the preferred nickname feature is turned on (togglePreferredNicknames != 0), only accounts in the preferred nicknames list (_preferredNicknames[account] == 1) will return true.
    * @param account The address of the account to check for the create nickname permission.
    * @return Returns true if the account has the permission to create a nickname.
    */
    function checkCreateNicknamePermission(address account) external view returns(bool) {
        return togglePreferredNicknames == 0 || _preferredNicknames[account] == 1;
    }


    /**
    * @dev Function to disable the buy tax fee for a specific pool.
    * @notice This function will disable the buy tax fee for a specific pool by setting the corresponding _toggledOffBuyPools value to 1.
    * If the pool is already toggled off, the function will revert. After disabling, the total buy tax rate will be updated and the pool will be deleted.
    * @param poolId The id of the pool to disable the buy tax fee.
    * @return Returns true if the operation is successful.
    */
    /*
    PoolIds:
    0: Future Plan
    1: Team1
    2: Team2
    3: Team3
    4: Liquidity Pool
    5: Staking
    6: Future Plan or Referral
    */
    function toggleOffBuyTaxFee(uint256 poolId) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffBuyPools[poolId] == 0, "The pool is already toggled off");
        _toggledOffBuyPools[poolId] = 1;
        totalBuyTaxRate = totalBuyTaxRate - buyPools[poolId].taxRate;
        delete buyPools[poolId];
        emit BuyFeesUpdated(poolId, 0);
        return true;
    }

    /**
    * @dev Function to disable the sell tax fee for a specific pool.
    * @notice This function will disable the sell tax fee for a specific pool by setting the corresponding _toggledOffSellPools value to 1.
    * If the pool is already toggled off, the function will revert. After disabling, the total sell tax rate will be updated and the pool will be deleted.
    * @param poolId The id of the pool to disable the sell tax fee.
    * @return Returns true if the operation is successful.
    */
    function toggleOffSellTaxFee(uint256 poolId) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffSellPools[poolId] == 0, "The pool is already toggled off");
        _toggledOffSellPools[poolId] = 1;
        totalSellTaxRate = totalSellTaxRate - sellPools[poolId].taxRate;
        delete sellPools[poolId];
        emit SellFeesUpdated(poolId, 0);
        return true;
    }

    /**
    * @dev Function to disable the reference fee.
    * @notice This function will disable the reference fee by setting the toggleReferenceFees value to 1. If the reference fee is already toggled off, the function will revert.
    * After disabling, the reference rate will be updated to 0.
    * @return Returns true if the operation is successful.
    */
    function toggleOffReferenceFee() external onlyTaxManager returns(bool) {
        require(toggleReferenceFees == 0, "Reference pool is already toggled off");
        toggleReferenceFees = 1;
        uint256 oldRate = referenceRate;
        referenceRate = 0;
        emit ReferenceFeeUpdated(oldRate, 0);
        return true;
    }

    /**
    * @dev Function to decrease the buy tax fee of a specific pool.
    * @notice This function allows the tax manager to reduce the buy tax fee for a given pool. The new fee should be greater than 0 and less than the current tax fee, otherwise, the function will revert. This function will not work if the pool is toggled off.
    * @param poolId The identifier of the pool that the tax fee will be decreased for.
    * @param newFee The new fee that will replace the old tax fee for the given pool.
    * @return Returns true if the operation is successful.
    */
    function decreaseBuyTaxFee(
        uint256 poolId,
        uint256 newFee
    ) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffBuyPools[poolId] == 0, "The pool is already toggled off");
        require(
            newFee > 0 &&
            newFee < buyPools[poolId].taxRate,
            "New fee rate must be between 0 and current tax fee"
        );
        totalBuyTaxRate = totalBuyTaxRate - (buyPools[poolId].taxRate - newFee);
        buyPools[poolId].taxRate = newFee;
        emit BuyFeesUpdated(poolId, newFee);
        return true;
    }

    /**
    * @dev Function to decrease the sell tax fee of a specific pool.
    * @notice This function allows the tax manager to reduce the sell tax fee for a given pool. The new fee should be greater than 0 and less than the current tax fee, otherwise, the function will revert. This function will not work if the pool is toggled off.
    * @param poolId The identifier of the pool that the tax fee will be decreased for.
    * @param newFee The new fee that will replace the old tax fee for the given pool.
    * @return Returns true if the operation is successful.
    */
    function decreaseSellTaxFee(
        uint256 poolId,
        uint256 newFee
    ) external onlyTaxManager returns(bool){
        require(poolId <= POOL_NUMBER, "Pool id not found");
        require(_toggledOffSellPools[poolId] == 0, "The pool is already toggled off");
        require(
            newFee > 0 &&
            newFee < sellPools[poolId].taxRate,
            "New fee rate must be between 0 and current tax fee"
        );
        totalSellTaxRate = totalSellTaxRate - (sellPools[poolId].taxRate - newFee);
        sellPools[poolId].taxRate = newFee;
        emit SellFeesUpdated(poolId, newFee);
        return true;
    }

    /**
    * @dev Function to decrease the reference fee.
    * @notice This function allows the tax manager to reduce the reference fee. The new fee should be greater than 0 and less than the current fee, otherwise, the function will revert.
    * @param newFee The new fee that will replace the old reference fee.
    * @return Returns true if the operation is successful.
    */
    function decreaseReferenceFee(uint256 newFee) external onlyTaxManager returns(bool) {
        require(
            newFee > 0 &&
            newFee < referenceRate,
            "New fee rate must be between 0 and current fee"
        );
        uint256 oldRate = referenceRate;
        referenceRate = newFee;
        emit ReferenceFeeUpdated(oldRate, newFee);
        return true;
    }

    /**
    * @dev Calculates the fee amount for a given transaction amount and fee rate.
    * @notice This is a private function used to calculate the fee amount based on a specific transaction amount and a fee rate.
    * The fee rate is a percentage value multiplied by 100 to handle it as an integer.
    * Therefore, it needs to be divided by 10,000 during calculation to reflect the correct fee amount.
    * @param amount The transaction amount for which the fee should be computed.
    * @param fee The fee rate used for the computation. The fee is represented as a percentage out of 10,000 (equivalent to a basis point representation).
    * @return Returns the calculated fee amount.
    */
    function computeFee(uint256 amount, uint256 fee) private pure returns(uint256) {
        return amount * fee / 10000;
    }

    /**
    * @notice Enables trading. This function can only be called by the contract owner.
    * @dev Checks whether trading is already enabled. If not, it enables trading and triggers the TradingEnabled event.
    * @return Returns a boolean value. If the operation is successful, it returns true; otherwise, false.
    */
    function enableTrading() external onlyOwner returns(bool) {
        require(isTradeOpen == 0, "Trade is already enabled");
        isTradeOpen = 1;
        emit TradingEnabled(block.timestamp);
        return true;
    }

    /**
    * @notice This private function is used to send buy fees to different pools and referral addresses.
    * @dev It calculates and transfers fees for each buy pool unless the pool is toggled off.
    * It also computes and transfers the reference fee if reference fees are toggled on and there exists a referral for the owner.
    * If there's no referral or reference fees are toggled off, it computes and sends the fee to the last pool if it is not toggled off.
    * The function subtracts the total fee from the amount and returns the difference.
    * @param owner The address of the owner initiating the buy action.
    * @param from The address of the pair.
    * @param amount The amount of tokens being purchased.
    * @return Returns the amount after subtracting the total fee.
    */
    function sendBuyFees(
        address owner,
        address from,
        uint256 amount
    ) private returns(uint256) {
        uint256 totalFee = 0;
        for (uint256 i = 0; i < POOL_NUMBER - 1; i++) {
            uint256 poolTaxRate = buyPools[i].taxRate;
            if (_toggledOffBuyPools[i] == 0) {
                uint256 fee = computeFee(amount, poolTaxRate);
                totalFee += fee;
                address poolAddress = buyPools[i].poolAddress;
                _transfer(from, poolAddress, fee);
            }
        }
        address referral = _referrals[owner];
        if (toggleReferenceFees == 0 && referral != address(0)) {
            uint256 referenceFee = computeFee(amount, referenceRate);
            totalFee += referenceFee;
            _transfer(from, referral, referenceFee);
            emit TransferWithTaxFee(_referralNickname[referral], referral, owner, amount, referenceFee, block.timestamp);
        } else if (_toggledOffBuyPools[POOL_NUMBER - 1] == 0){
            uint256 lastPoolFee = computeFee(amount, buyPools[POOL_NUMBER - 1].taxRate);
            totalFee += lastPoolFee;
            address lastPoolAddress = buyPools[POOL_NUMBER - 1].poolAddress;
            _transfer(from, lastPoolAddress, lastPoolFee);
        }
        return amount - totalFee;
    }

    /**
    * @notice This private function is used to send sell fees to different pools and referral addresses.
    * @dev It calculates and transfers fees for each sell pool unless the pool is toggled off.
    * It also computes and transfers the reference fee if reference fees are toggled on and there exists a referral for the owner.
    * If there's no referral or reference fees are toggled off, it computes and sends the fee to the last pool if it is not toggled off.
    * The function subtracts the total fee from the amount and returns the difference.
    * @param owner The address of the owner initiating the sell action.
    * @param amount The amount of tokens being sold.
    * @return Returns the amount after subtracting the total fee.
    */
    function sendSellFees(address owner, uint256 amount) private returns(uint256) {
        uint256 totalFee = 0;
        for (uint256 i = 0; i < POOL_NUMBER - 1; i++) {
            uint256 poolTaxRate = sellPools[i].taxRate;
            if (_toggledOffSellPools[i] == 0) {
                uint256 fee = computeFee(amount, poolTaxRate);
                totalFee += fee;
                address poolAddress = sellPools[i].poolAddress;
                _transfer(owner, poolAddress, fee);
            }
        }
        address referral = _referrals[owner];
        if (toggleReferenceFees == 0 && referral != address(0)) {
            uint256 referenceFee = computeFee(amount, referenceRate);
            totalFee += referenceFee;
            _transfer(owner, referral, referenceFee);
            emit TransferWithTaxFee(_referralNickname[referral], referral, owner, amount, referenceFee, block.timestamp);
        } else if(_toggledOffSellPools[POOL_NUMBER - 1] == 0){
            uint256 lastPoolFee = computeFee(amount, sellPools[POOL_NUMBER - 1].taxRate);
            totalFee += lastPoolFee;
            address lastPoolAddress = sellPools[POOL_NUMBER - 1].poolAddress;
            _transfer(owner, lastPoolAddress, lastPoolFee);
        }
        return amount - totalFee;
    }


    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        if (to == PairAddress && _taxFrees[from] == 0) {
            require(isTradeOpen == 1, "Trading is not open");
            amount = sendSellFees(from, amount);
        }
        _transfer(from, to, amount);
        return true;
    }

    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        if (owner == PairAddress && _taxFrees[to] == 0) {
            require(isTradeOpen == 1, "Trading is not open");
            amount = sendBuyFees(to, owner, amount);
        }
        _transfer(owner, to, amount);
        return true;
    }

    /**
    * @notice This function allows eligible accounts to create a nickname.
    * @dev Function is restricted to accounts that satisfy the 'onlyPreferredAccountCreateNickname' modifier.
    * A nickname should be unique, not empty, and at most 64 characters long.
    * Emits a 'CreatedLink' event upon successful execution.
    * @param nickName The chosen nickname string.
    * @return Returns 'true' upon successful execution.
    */
    function createNickname(string memory nickName) external onlyPreferredAccountCreateNickname returns(bool) {
        require(bytes(_referralNickname[msg.sender]).length == 0, "You already have a nickname");
        require(bytes(nickName).length != 0 && bytes(nickName).length <= 64, "Nickname must be between 1 and 64 characters");
        require(_nickNames[nickName] == address(0), "Nickname is already taken");
        _nickNames[nickName] = msg.sender;
        _referralNickname[msg.sender] = nickName;
        emit CreatedLink(msg.sender, nickName, block.timestamp);
        return true;
    }

    /**
    * @notice This function returns the nickname of a given account.
    * @param account The address of the account for which the nickname is queried.
    * @return Returns the nickname string associated with the given account.
    */
    function getNickname(address account) external view returns(string memory) {
        return _referralNickname[account];
    }

    /**
    * @notice This function returns the referrer information for a given referee.
    * @param referee The address of the referee for which the referrer information is queried.
    * @return Returns a tuple containing the nickname string and address of the referrer.
    */
    function getReferrer(address referee) external view returns(string memory, address) {
        address referrer = _referrals[referee];
        return (_referralNickname[referrer], referrer);
    }

    /**
    * @notice This function returns the address associated with a given nickname.
    * @param nickname The nickname for which the associated address is queried.
    * @return Returns the address associated with the given nickname.
    */
    function getAddressWithNickname(string memory nickname) external view returns(address) {
        return _nickNames[nickname];
    }

    /**
    * @notice This function allows a user to add a referral using a nickname.
    * @param nickname The nickname of the referrer.
    * @return Returns true if the referral was successfully added.
    */
    function addReferral(string memory nickname) external returns(bool) {
        address referrer = _nickNames[nickname];
        bytes32 referrerNicknameHash = keccak256(abi.encodePacked(_referralNickname[referrer]));
        require(
            _referrals[referrer] != msg.sender &&
            _referrals[msg.sender] == address(0) &&
            referrerNicknameHash != keccak256(abi.encodePacked("")) &&
            referrer != address(0) &&
            referrer != msg.sender,
            "Invalid referral"
        );
        _referrals[msg.sender] = referrer;
        emit RegisteredReferrence(referrer, nickname, msg.sender, block.timestamp);
        return true;
    }
}
Context.sol 24 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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;
    }
}
Ownable.sol 83 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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);
    }
}
ERC20.sol 389 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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 {}
}
IERC20.sol 82 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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);
}
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

FACTORY 0x2dd31000 → address
MAX_BUY_TAX_RATE 0xa7782d06 → uint256
MAX_SELL_TAX_RATE 0x6e11a899 → uint256
PairAddress 0x9026b8d9 → address
WETH 0xad5c4648 → address
_taxFrees 0x32f28053 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
buyPools 0x43330c94 → address, uint256
checkCreateNicknamePermission 0x32a5fce5 → bool
decimals 0x313ce567 → uint8
getAddressWithNickname 0x61e8bc20 → address
getNickname 0xadaccd74 → string
getReferrer 0x4a9fefc7 → string, address
isTradeOpen 0x60901444 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
referenceRate 0xa32bff44 → uint256
sellPools 0xbcae1d57 → address, uint256
symbol 0x95d89b41 → string
taxManager 0x4d237730 → address
togglePreferredNicknames 0xac169800 → uint256
totalBuyTaxRate 0xb37bf546 → uint256
totalInitializated 0xb4975d4a → uint256
totalSellTaxRate 0xe0af4fe2 → uint256
totalSupply 0x18160ddd → uint256

Write Contract 25 functions

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

addPreferredNicknames 0x2175c649
address[] account
returns: bool
addReferral 0x94f46b75
string nickname
returns: bool
addTaxFrees 0x3bfb4aad
address[] taxFrees
returns: bool
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
changePoolAddress 0xdedbf736
uint256 poolId
address newAddress
createNickname 0x8d084638
string nickName
returns: bool
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
decreaseBuyTaxFee 0x9be67574
uint256 poolId
uint256 newFee
returns: bool
decreaseReferenceFee 0x4672bd0e
uint256 newFee
returns: bool
decreaseSellTaxFee 0xe0a22e67
uint256 poolId
uint256 newFee
returns: bool
enableTrading 0x8a8c523c
No parameters
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
initializeReferralDatas 0xd303d562
tuple[] referrals
returns: bool
removePreferredNicknames 0xb8e3e0f2
address[] account
returns: bool
removeTaxFrees 0x44ecc179
address[] taxFrees
returns: bool
renounceOwnership 0x715018a6
No parameters
renounceTaxManager 0x3516e6fe
No parameters
toggleOffBuyTaxFee 0xa3438955
uint256 poolId
returns: bool
toggleOffPreferredNicknames 0xa03fb0c9
No parameters
returns: bool
toggleOffReferenceFee 0x32b6eca2
No parameters
returns: bool
toggleOffSellTaxFee 0xed534174
uint256 poolId
returns: bool
transfer 0xa9059cbb
address to
uint256 amount
returns: bool
transferFrom 0x23b872dd
address from
address to
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
transferTaxManager 0xa2aa18ad
address newTaxManager

Recent Transactions

No transactions found for this address