Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xe06364a3a0cA96701C1e554D42B995BB59f77233
Balance 0.000000000 ETH
Nonce 1
Code Size 22720 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

22720 bytes
0x6080604052600436106102385760003560e01c806385f8c25911610138578063c1dfe652116100b0578063d92e82e41161007f578063f6f1e30611610064578063f6f1e30614610cc2578063fb3bdb4114610d00578063ff0938a714610d8657610253565b8063d92e82e414610c7a578063ddd377ac14610c8f57610253565b8063c1dfe65214610b38578063c2ceddfa14610b4d578063d06ca61f14610b88578063d52bb6f414610c3f57610253565b806396ed28f911610107578063a6f9dae1116100ec578063a6f9dae114610a93578063ad5c464814610ac6578063baa2abde14610adb57610253565b806396ed28f914610a435780639e6c295914610a7e57610253565b806385f8c259146108c25780638803dbee146108f85780638b61ff24146109905780638da5cb5b14610a2e57610253565b806338ed1739116101cb5780637535d2461161019a5780637ff36ab51161017f5780637ff36ab514610812578063822abc7c146108985780638456cb59146108ad57610253565b80637535d246146107845780637ae06e581461079957610253565b806338ed17391461056b5780634a25d94a14610603578063525e7e8f1461069b57806354fd4d501461076f57610253565b806318cbafe51161020757806318cbafe5146103525780631f00ca741461043a5780632dd31000146104f1578063358764761461050657610253565b806302751cec14610258578063046f7da2146102c4578063054d50d4146102d9578063146278341461032157610253565b36610253576005546001600160a01b0316331461025157fe5b005b600080fd5b34801561026457600080fd5b506102ab600480360360c081101561027b57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610d9b565b6040805192835260208301919091528051918290030190f35b3480156102d057600080fd5b50610251610f21565b3480156102e557600080fd5b5061030f600480360360608110156102fc57600080fd5b5080359060208101359060400135610f84565b60408051918252519081900360200190f35b34801561032d57600080fd5b50610336610fca565b604080516001600160a01b039092168252519081900360200190f35b34801561035e57600080fd5b506103ea600480360360a081101561037557600080fd5b81359160208101359181019060608101604082013564010000000081111561039c57600080fd5b8201836020820111156103ae57600080fd5b803590602001918460208302840111640100000000831117156103d057600080fd5b91935091506001600160a01b038135169060200135610fd9565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561042657818101518382015260200161040e565b505050509050019250505060405180910390f35b34801561044657600080fd5b506103ea6004803603604081101561045d57600080fd5b8135919081019060408101602082013564010000000081111561047f57600080fd5b82018360208201111561049157600080fd5b803590602001918460208302840111640100000000831117156104b357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611354945050505050565b3480156104fd57600080fd5b50610336611377565b34801561051257600080fd5b50610251600480360360e081101561052957600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c09091013516611386565b34801561057757600080fd5b506103ea600480360360a081101561058e57600080fd5b8135916020810135918101906060810160408201356401000000008111156105b557600080fd5b8201836020820111156105c757600080fd5b803590602001918460208302840111640100000000831117156105e957600080fd5b91935091506001600160a01b038135169060200135611465565b34801561060f57600080fd5b506103ea600480360360a081101561062657600080fd5b81359160208101359181019060608101604082013564010000000081111561064d57600080fd5b82018360208201111561065f57600080fd5b8035906020019184602083028401116401000000008311171561068157600080fd5b91935091506001600160a01b038135169060200135611617565b3480156106a757600080fd5b5061075b600480360360408110156106be57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156106e957600080fd5b8201836020820111156106fb57600080fd5b8035906020019184602083028401116401000000008311171561071d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118c8945050505050565b604080519115158252519081900360200190f35b34801561077b57600080fd5b5061030f611931565b34801561079057600080fd5b50610336611937565b3480156107a557600080fd5b506107f4600480360360e08110156107bc57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135611946565b60408051938452602084019290925282820152519081900360600190f35b6103ea6004803603608081101561082857600080fd5b8135919081019060408101602082013564010000000081111561084a57600080fd5b82018360208201111561085c57600080fd5b8035906020019184602083028401116401000000008311171561087e57600080fd5b91935091506001600160a01b038135169060200135611c01565b3480156108a457600080fd5b50610336611f69565b3480156108b957600080fd5b50610251611f78565b3480156108ce57600080fd5b5061030f600480360360608110156108e557600080fd5b5080359060208101359060400135611fe1565b34801561090457600080fd5b506103ea600480360360a081101561091b57600080fd5b81359160208101359181019060608101604082013564010000000081111561094257600080fd5b82018360208201111561095457600080fd5b8035906020019184602083028401116401000000008311171561097657600080fd5b91935091506001600160a01b038135169060200135612027565b34801561099c57600080fd5b50610251600480360360808110156109b357600080fd5b6001600160a01b03823581169260208101358216926040820135909216918101906080810160608201356401000000008111156109ef57600080fd5b820183602082011115610a0157600080fd5b80359060200191846020830284011164010000000083111715610a2357600080fd5b509092509050612148565b348015610a3a57600080fd5b506103366126a9565b348015610a4f57600080fd5b5061033660048036036040811015610a6657600080fd5b506001600160a01b03813581169160200135166126b8565b348015610a8a57600080fd5b5061030f6126d9565b348015610a9f57600080fd5b5061025160048036036020811015610ab657600080fd5b50356001600160a01b03166126df565b348015610ad257600080fd5b506103366127f6565b348015610ae757600080fd5b506102ab600480360360e0811015610afe57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612805565b348015610b4457600080fd5b50610336612b83565b348015610b5957600080fd5b5061075b60048036036040811015610b7057600080fd5b506001600160a01b0381358116916020013516612b92565b348015610b9457600080fd5b506103ea60048036036040811015610bab57600080fd5b81359190810190604081016020820135640100000000811115610bcd57600080fd5b820183602082011115610bdf57600080fd5b80359060200191846020830284011164010000000083111715610c0157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612c2a945050505050565b348015610c4b57600080fd5b506102ab60048036036040811015610c6257600080fd5b506001600160a01b0381358116916020013516612c43565b348015610c8657600080fd5b50610336612c6b565b348015610c9b57600080fd5b5061075b60048036036020811015610cb257600080fd5b50356001600160a01b0316612c7a565b6107f4600480360360a0811015610cd857600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135612fa9565b6103ea60048036036080811015610d1657600080fd5b81359190810190604081016020820135640100000000811115610d3857600080fd5b820183602082011115610d4a57600080fd5b80359060200191846020830284011164010000000083111715610d6c57600080fd5b91935091506001600160a01b03813516906020013561336e565b348015610d9257600080fd5b5061075b6136ea565b6000808242811015610dee576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b600854600160a01b900460ff1615610e3b576040805162461bcd60e51b815260206004820152600b60248201526a1513d3524814105554d15160aa1b604482015290519081900360640190fd5b600554610e57908a906001600160a01b03168a8a8a308a612805565b9093509150610e678986856136fa565b600554604080517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050610eef8583613879565b610efb30868b86613971565b600554610f1590309087906001600160a01b031685613971565b50965096945050505050565b6000546001600160a01b03163314610f75576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b19169055565b600080610f8f613a22565b90506000612710610fab87610fa661271086613abe565b613b00565b81610fb257fe5b049050610fc0818686613b59565b9695505050505050565b6006546001600160a01b031681565b6060814281101561102b576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b6005546001600160a01b03168686600019810181811061104757fe5b905060200201356001600160a01b03166001600160a01b0316146110b2576040805162461bcd60e51b815260206004820152601c60248201527f544f4d4920504c4154464f524d203a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60006110bc613a22565b90506110fd89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613c15915050565b9250878360018551038151811061111057fe5b602002602001015110156111555760405162461bcd60e51b815260040180806020018281038252602a815260200180615771602a913960400191505060405180910390fd5b6004546000906111a4906001600160a01b03168989848161117257fe5b905060200201356001600160a01b03168a8a600181811061118f57fe5b905060200201356001600160a01b0316613d47565b90506111e8888860008181106111b657fe5b905060200201356001600160a01b031633836127106111db8f610fa66127108a613abe565b816111e257fe5b04613ead565b61122784898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ecb915050565b61126a8888600081811061123757fe5b905060200201356001600160a01b031633836127106111db8960008151811061125c57fe5b602002602001015188613b00565b6112a98489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061459c915050565b60055484516001600160a01b0390911690632e1a7d4d90869060001981019081106112d057fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561130e57600080fd5b505af1158015611322573d6000803e3d6000fd5b50505050611347868560018751038151811061133a57fe5b6020026020010151613879565b5050509695505050505050565b60606000611360613a22565b905061136d848483614961565b9150505b92915050565b6004546001600160a01b031681565b6000546001600160a01b031633146113da576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6002805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b03998a1617909155600380548216978916979097179096556004805487169588169590951790945560058054861693871693909317909255600680548516918616919091179055600780548416918516919091179055600880549092169216919091179055565b606081428110156114b7576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b60006114c1613a22565b905061150289888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613c15915050565b9250878360018551038151811061151557fe5b6020026020010151101561155a5760405162461bcd60e51b815260040180806020018281038252602a815260200180615771602a913960400191505060405180910390fd5b600454600090611577906001600160a01b03168989848161117257fe5b9050611589888860008181106111b657fe5b6115c8848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ecb915050565b6115d88888600081811061123757fe5b6113478489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061459c915050565b60608142811015611669576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b6005546001600160a01b03168686600019810181811061168557fe5b905060200201356001600160a01b03166001600160a01b0316146116f0576040805162461bcd60e51b815260206004820152601c60248201527f544f4d4920504c4154464f524d203a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60006116fa613a22565b905061173b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250614961915050565b9250878360008151811061174b57fe5b602002602001015111156117905760405162461bcd60e51b81526004018080602001828103825260268152602001806158656026913960400191505060405180910390fd5b6004546000906117ad906001600160a01b03168989848161117257fe5b90506117f8888860008181106117bf57fe5b905060200201356001600160a01b031633836127106111db896000815181106117e457fe5b6020026020010151610fa66127108a613abe565b61183784898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ecb915050565b60055484516001600160a01b0390911690632e1a7d4d908690600019810190811061185e57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561189c57600080fd5b505af11580156118b0573d6000803e3d6000fd5b505050506115c8868560018751038151811061133a57fe5b60008060005b835181101561191357846001600160a01b03168482815181106118ed57fe5b60200260200101516001600160a01b0316141561190b576001909101905b6001016118ce565b508060011415611927576001915050611371565b6000915050611371565b60015481565b6008546001600160a01b031681565b6000806000834281101561199b576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b600854600160a01b900460ff16156119e8576040805162461bcd60e51b815260206004820152600b60248201526a1513d3524814105554d15160aa1b604482015290519081900360640190fd5b6119f68b8b8b8b8b8b614acb565b6004549195509350600090611a15906001600160a01b03168d8d613d47565b9050611a238c338388614fce565b611a2f8b338387614fce565b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b158015611a8357600080fd5b505af1158015611a97573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b158015611ae357600080fd5b505af1158015611af7573d6000803e3d6000fd5b505050506040513d6020811015611b0d57600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b158015611b6557600080fd5b505af1158015611b79573d6000803e3d6000fd5b50505050611b8933828e88613971565b611b9533828d87613971565b8a6001600160a01b03168c6001600160a01b0316336001600160a01b03167fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd98888604051808381526020018281526020019250505060405180910390a450509750975097945050505050565b60608142811015611c53576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b6005546001600160a01b03168686600081611c6a57fe5b905060200201356001600160a01b03166001600160a01b031614611cd5576040805162461bcd60e51b815260206004820152601c60248201527f544f4d4920504c4154464f524d203a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6000611cdf613a22565b9050611d2034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250613c15915050565b92508783600185510381518110611d3357fe5b60200260200101511015611d785760405162461bcd60e51b815260040180806020018281038252602a815260200180615771602a913960400191505060405180910390fd5b600454600090611d95906001600160a01b03168989848161117257fe5b60055485519192506001600160a01b03169063d0e30db09061271090611dd4908890600090611dc057fe5b6020026020010151610fa661271088613abe565b81611ddb57fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e0757600080fd5b505af1158015611e1b573d6000803e3d6000fd5b5050505050611e4481612710611e3787600081518110611dc057fe5b81611e3e57fe5b04615151565b611e83848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ecb915050565b60055484516001600160a01b039091169063d0e30db09061271090611ebb908890600090611ead57fe5b602002602001015186613b00565b81611ec257fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b158015611eee57600080fd5b505af1158015611f02573d6000803e3d6000fd5b5050505050611f1e81612710611e3787600081518110611ead57fe5b611f5d8489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061459c915050565b50505095945050505050565b6007546001600160a01b031681565b6000546001600160a01b03163314611fcc576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6008805460ff60a01b1916600160a01b179055565b600080611fec613a22565b90506000611ffb8686866151f7565b905061200961271083613abe565b61201582612710613b00565b8161201c57fe5b049695505050505050565b60608142811015612079576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b6000612083613a22565b90506120c489888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250614961915050565b925087836000815181106120d457fe5b602002602001015111156121195760405162461bcd60e51b81526004018080602001828103825260268152602001806158656026913960400191505060405180910390fd5b600454600090612136906001600160a01b03168989848161117257fe5b9050611589888860008181106117bf57fe5b6000546001600160a01b0316331461219c576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b1580156121f757600080fd5b505afa15801561220b573d6000803e3d6000fd5b505050506040513d602081101561222157600080fd5b50516001600160a01b031614156122ba5760048054604080516364e329cb60e11b81526001600160a01b038881169482019490945286841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b15801561228d57600080fd5b505af11580156122a1573d6000803e3d6000fd5b505050506040513d60208110156122b757600080fd5b50505b600480546040805163e6a4390560e01b81526001600160a01b0388811694820194909452868416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b15801561231557600080fd5b505afa158015612329573d6000803e3d6000fd5b505050506040513d602081101561233f57600080fd5b5051905060005b82811015612619576000876001600160a01b03166370a0823186868581811061236b57fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156123c157600080fd5b505afa1580156123d5573d6000803e3d6000fd5b505050506040513d60208110156123eb57600080fd5b50519050801561261057876001600160a01b031663f6b911bc86868581811061241057fe5b905060200201356001600160a01b031685846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b0316815260200182815260200193505050506040805180830381600087803b15801561248957600080fd5b505af115801561249d573d6000803e3d6000fd5b505050506040513d60408110156124b357600080fd5b50506001600160a01b038316636a6278428686858181106124d057fe5b905060200201356001600160a01b03166040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561252857600080fd5b505af115801561253c573d6000803e3d6000fd5b505050506040513d602081101561255257600080fd5b50506004546001600160a01b031663c9ead25886868581811061257157fe5b905060200201356001600160a01b0316856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200192505050602060405180830381600087803b1580156125e357600080fd5b505af11580156125f7573d6000803e3d6000fd5b505050506040513d602081101561260d57600080fd5b50505b50600101612346565b50600754604080517f6ef9a3e70000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152848116602483015291519190921691636ef9a3e791604480830192600092919082900301818387803b15801561268957600080fd5b505af115801561269d573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031681565b6004546000906126d2906001600160a01b03168484613d47565b9392505050565b61271081565b6000546001600160a01b03163314612733576040805162461bcd60e51b815260206004820152601260248201527127bbb730b136329d102327a92124a22222a760711b604482015290519081900360640190fd5b6001600160a01b03811661278e576040805162461bcd60e51b815260206004820152601860248201527f4f776e61626c653a20494e56414c49445f414444524553530000000000000000604482015290519081900360640190fd5b600080546040516001600160a01b03808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000808242811015612858576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b600854600160a01b900460ff16156128a5576040805162461bcd60e51b815260206004820152600b60248201526a1513d3524814105554d15160aa1b604482015290519081900360640190fd5b6004546000906128bf906001600160a01b03168c8c613d47565b6008546040805163555d661160e11b81526001600160a01b03808516600483015233602483015291519394508c938f938f93169163aabacc2291604480830192600092919082900301818387803b15801561291957600080fd5b505af115801561292d573d6000803e3d6000fd5b5050604080517ff6b911bc0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038d81166024830152604482018890528251600095508594509089169263f6b911bc926064808201939182900301818787803b1580156129a257600080fd5b505af11580156129b6573d6000803e3d6000fd5b505050506040513d60408110156129cc57600080fd5b508051602090910151600854604080516368a6560d60e11b81526001600160a01b038b811660048301523360248301529151949650929450169163d14cac1a9160448082019260009290919082900301818387803b158015612a2d57600080fd5b505af1158015612a41573d6000803e3d6000fd5b505050506000612a5185856152c5565b509050806001600160a01b0316856001600160a01b031614612a74578183612a77565b82825b909a509850612a88878d878d613971565b612a94878d868c613971565b8d8a1015612ad35760405162461bcd60e51b815260040180806020018281038252602581526020018061568b6025913960400191505060405180910390fd5b8c891015612b125760405162461bcd60e51b81526004018080602001828103825260258152602001806156b06025913960400191505060405180910390fd5b836001600160a01b0316856001600160a01b0316336001600160a01b03167fa8dbaaebbb025c88e9e34c84635cd8238043556e9af43fb161508c898a8e1ef98d8d604051808381526020018281526020019250505060405180910390a4505050505050505097509795505050505050565b6002546001600160a01b031681565b600480546040805163e6a4390560e01b81526001600160a01b0386811694820194909452848416602482015290516000938493169163e6a43905916044808301926020929190829003018186803b158015612bec57600080fd5b505afa158015612c00573d6000803e3d6000fd5b505050506040513d6020811015612c1657600080fd5b50516001600160a01b031614159392505050565b60606000612c36613a22565b905061136d848483613c15565b6004546000908190612c5f906001600160a01b0316858561539c565b915091505b9250929050565b6003546001600160a01b031681565b6002546000906001600160a01b0383811691161480612ca657506005546001600160a01b038381169116145b15612cb357506001612fa4565b600354604080516360ccef1960e11b81527f544f4b454e5f544f5f544741535f504149525f4d494e5f50455243454e540000600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b158015612d1e57600080fd5b505afa158015612d32573d6000803e3d6000fd5b505050506040513d6020811015612d4857600080fd5b5051600554600254919250612d69916001600160a01b039182169116612b92565b612d77576000915050612fa4565b600254612d8d906001600160a01b031684612b92565b612d9b576000915050612fa4565b6003546002546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612df357600080fd5b505afa158015612e07573d6000803e3d6000fd5b505050506040513d6020811015612e1d57600080fd5b50518015612eab57506003546005546040805163a9ece1b760e01b81526001600160a01b03928316600482015286831660248201529051919092169163a9ece1b7916044808301926020929190829003018186803b158015612e7e57600080fd5b505afa158015612e92573d6000803e3d6000fd5b505050506040513d6020811015612ea857600080fd5b50515b612eb9576000915050612fa4565b600554612ecf906001600160a01b031684612b92565b612edd576001915050612fa4565b80612eec576001915050612fa4565b600454600254600091612f0c916001600160a01b0391821691168661539c565b50600454600554919250600091612f30916001600160a01b0390811691168761539c565b506004546005546002549293506000928392612f5c926001600160a01b0391821692908216911661539c565b91509150600081612f6d8685613b00565b81612f7457fe5b0490506000612710612f8f612f89848861546a565b89613b00565b81612f9657fe5b049091101596505050505050505b919050565b60008060008342811015612ffe576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b600854600160a01b900460ff161561304b576040805162461bcd60e51b815260206004820152600b60248201526a1513d3524814105554d15160aa1b604482015290519081900360640190fd5b600554613066908a906001600160a01b03168a348b8b614acb565b60045460055492965090945060009161308d916001600160a01b03908116918d9116613d47565b905061309b8a338388614fce565b600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156130eb57600080fd5b505af11580156130ff573d6000803e3d6000fd5b50506005546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b15801561315857600080fd5b505af115801561316c573d6000803e3d6000fd5b505050506040513d602081101561318257600080fd5b505161318a57fe5b6008546040805163555d661160e11b81526001600160a01b0384811660048301523360248301529151919092169163aabacc2291604480830192600092919082900301818387803b1580156131de57600080fd5b505af11580156131f2573d6000803e3d6000fd5b5050604080516335313c2160e11b815233600482015290516001600160a01b0385169350636a627842925060248083019260209291908290030181600087803b15801561323e57600080fd5b505af1158015613252573d6000803e3d6000fd5b505050506040513d602081101561326857600080fd5b5051600854604080516368a6560d60e11b81526001600160a01b038581166004830152336024830152915193965091169163d14cac1a9160448082019260009290919082900301818387803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b50506005546132f2925033915083906001600160a01b031687613971565b6132fe33828c88613971565b600554604080518781526020810187905281516001600160a01b03938416938e169233927fc33fbc9654f9c0dcfcbd829113bdb10afe95619bc0824bc5959ad82fd6952bd9929081900390910190a4833411156133615761336133853403613879565b5050955095509592505050565b606081428110156133c0576040805162461bcd60e51b81526020600482015260176024820152761513d35248141310551193d493480e8811561412549151604a1b604482015290519081900360640190fd5b6005546001600160a01b031686866000816133d757fe5b905060200201356001600160a01b03166001600160a01b031614613442576040805162461bcd60e51b815260206004820152601c60248201527f544f4d4920504c4154464f524d203a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b600061344c613a22565b905061348d88888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250614961915050565b9250348360008151811061349d57fe5b602002602001015111156134e25760405162461bcd60e51b81526004018080602001828103825260268152602001806158656026913960400191505060405180910390fd5b60055483516001600160a01b039091169063d0e30db0906127109061352090879060009061350c57fe5b6020026020010151610fa661271087613abe565b8161352757fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561355357600080fd5b505af1158015613567573d6000803e3d6000fd5b50506004546000935061358a92506001600160a01b031690508989848161117257fe5b90506135a381612710611e3787600081518110611dc057fe5b6135e2848989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b9250613ecb915050565b60055484516001600160a01b039091169063d0e30db0906127109061360c908890600090611ead57fe5b8161361357fe5b046040518263ffffffff1660e01b81526004016000604051808303818588803b15801561363f57600080fd5b505af1158015613653573d6000803e3d6000fd5b505050505061366f81612710611e3787600081518110611ead57fe5b6136ae8489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525087925061459c915050565b836000815181106136bb57fe5b6020026020010151341115611f5d57611f5d33856000815181106136db57fe5b60200260200101513403613879565b600854600160a01b900460ff1681565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061378c5780518252601f19909201916020918201910161376d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146137ee576040519150601f19603f3d011682016040523d82523d6000602084013e6137f3565b606091505b5091509150818015613821575080511580613821575080806020019051602081101561381e57600080fd5b50515b613872576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106138c55780518252601f1990920191602091820191016138a6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613927576040519150601f19603f3d011682016040523d82523d6000602084013e61392c565b606091505b505090508061396c5760405162461bcd60e51b81526004018080602001828103825260238152602001806157f36023913960400191505060405180910390fd5b505050565b600754604080517fa612dea40000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163a612dea49160848083019260209291908290030181600087803b1580156139f057600080fd5b505af1158015613a04573d6000803e3d6000fd5b505050506040513d6020811015613a1a57600080fd5b505050505050565b600354604080516360ccef1960e11b81527f535741505f4645455f50455243454e5400000000000000000000000000000000600482015290516000926001600160a01b03169163c199de32916024808301926020929190829003018186803b158015613a8d57600080fd5b505afa158015613aa1573d6000803e3d6000fd5b505050506040513d6020811015613ab757600080fd5b5051905090565b60006126d283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506154c4565b600082613b0f57506000611371565b82820282848281613b1c57fe5b04146126d25760405162461bcd60e51b81526004018080602001828103825260218152602001806157506021913960400191505060405180910390fd5b6000808411613b995760405162461bcd60e51b815260040180806020018281038252602a815260200180615661602a913960400191505060405180910390fd5b600083118015613ba95750600082115b613be45760405162461bcd60e51b81526004018080602001828103825260278152602001806157296027913960400191505060405180910390fd5b6000613bf6858463ffffffff613b0016565b90506000613c0a858763ffffffff61546a16565b905080828161201c57fe5b6060825167ffffffffffffffff81118015613c2f57600080fd5b50604051908082528060200260200182016040528015613c59578160200160208202803683370190505b5090508381600081518110613c6a57fe5b602090810291909101015260005b6001845103811015613d3f576000848281518110613c9257fe5b602002602001015190506000858360010181518110613cad57fe5b60200260200101519050600080613cda600460009054906101000a90046001600160a01b0316858561539c565b915091506000613d03878781518110613cef57fe5b6020026020010151610fa66127108b613abe565b9050613d1461271082048484613b59565b878760010181518110613d2357fe5b6020908102919091010152505060019093019250613c78915050565b509392505050565b6000806000613d5685856152c5565b915091506000828260405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b815260140192505050604051602081830303815290604052805190602001209050600060ff60f81b88838a6001600160a01b0316637c7f84ee6040518163ffffffff1660e01b815260040160206040518083038186803b158015613df957600080fd5b505afa158015613e0d573d6000803e3d6000fd5b505050506040513d6020811015613e2357600080fd5b5051604080517fff000000000000000000000000000000000000000000000000000000000000009590951660208087019190915260609490941b6bffffffffffffffffffffffff191660218601526035850192909252605580850191909152815180850390910181526075909301905281519101206001600160a01b031698975050505050505050565b613eb984848484614fce565b613ec583838684613971565b50505050565b600854600160a01b900460ff1615613f18576040805162461bcd60e51b815260206004820152600b60248201526a1513d3524814105554d15160aa1b604482015290519081900360640190fd5b613f3882600184510381518110613f2b57fe5b6020026020010151612c7a565b613f735760405162461bcd60e51b815260040180806020018281038252602e815260200180615608602e913960400191505060405180910390fd5b60005b60018351038110156144e357613f9f838281518110613f9157fe5b6020026020010151846118c8565b8015613fb85750613fb8838260010181518110613f9157fe5b614009576040805162461bcd60e51b815260206004820152601d60248201527f44454d415820504c4154464f524d203a20494e56414c49442050415448000000604482015290519081900360640190fd5b60008084838151811061401857fe5b602002602001015185846001018151811061402f57fe5b60200260200101519150915061404482612c7a565b61407f5760405162461bcd60e51b81526004018080602001828103825260308152602001806156d56030913960400191505060405180910390fd5b6003546040805163a9ece1b760e01b81526001600160a01b03858116600483015284811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b1580156140d457600080fd5b505afa1580156140e8573d6000803e3d6000fd5b505050506040513d60208110156140fe57600080fd5b505161413b5760405162461bcd60e51b815260040180806020018281038252602b815260200180615636602b913960400191505060405180910390fd5b60008061414884846152c5565b91509150600088866001018151811061415d57fe5b60200260200101519050600080846001600160a01b0316876001600160a01b03161461418b5782600061418f565b6000835b91509150600060028b510389106141a657896141d7565b6004548b516141d7916001600160a01b03169089908e9060028e019081106141ca57fe5b6020026020010151613d47565b6004549091506000906141f4906001600160a01b03168a8a613d47565b9050600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561423257600080fd5b505afa158015614246573d6000803e3d6000fd5b505050506040513d606081101561425c57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060006142888383613b00565b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018b8152604483018b90526001600160a01b038a81166064850152608060848501908152845160a48601819052969750908a169563022c0d9f958e958e958e9591949193919260c486019290918190849084905b8381101561432b578181015183820152602001614313565b50505050905090810190601f1680156143585780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561437a57600080fd5b505af115801561438e573d6000803e3d6000fd5b50505050836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156143cb57600080fd5b505afa1580156143df573d6000803e3d6000fd5b505050506040513d60608110156143f557600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216945016915060006144218484613b00565b905080821115614478576040805162461bcd60e51b815260206004820152600860248201527f427572676572204b000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b87156144a1576004546144a190614499906001600160a01b03168f8f613d47565b878d8b613971565b86156144ca576004546144ca906144c2906001600160a01b03168f8f613d47565b878c8a613971565b50506001909b019a50613f769950505050505050505050565b50816001835103815181106144f457fe5b60200260200101516001600160a01b03168260008151811061451257fe5b60200260200101516001600160a01b0316826001600160a01b03167f3070708cdb5d7d3931be8443f49f7ec529e2bbe770b676e3c0cc40e158c5d0398660008151811061455b57fe5b60200260200101518760018851038151811061457357fe5b6020026020010151604051808381526020018281526020019250505060405180910390a4505050565b60005b6001835103811015613ec55760006127106145cd8684815181106145bf57fe5b602002602001015185613b00565b816145d457fe5b04905060008483815181106145e557fe5b60200260200101519050600085846001018151811061460057fe5b60200260200101519050600061462c600460009054906101000a90046001600160a01b03168484613d47565b6002549091506001600160a01b03848116911614156146e0576002546008546040805163012d9b4160e71b8152600481018890526001600160a01b039384166024820152918316604483015251918316916396cda0809160648082019260009290919082900301818387803b1580156146a457600080fd5b505af11580156146b8573d6000803e3d6000fd5b50506008546002546146db93508492506001600160a01b03918216911687613971565b6148c4565b6004546002546001600160a01b03808416926396cda080928892889261470c9290821691849116613d47565b6040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b15801561477457600080fd5b505af1158015614788573d6000803e3d6000fd5b5050600454600254600093508392506147af916001600160a01b039081169188911661539c565b9150915060006147c0878484613b59565b6004546002549192506147e1916001600160a01b0391821691899116613d47565b6002546008546040805163012d9b4160e71b8152600481018690526001600160a01b03938416602482015291831660448301525192909116916396cda0809160648082019260009290919082900301818387803b15801561484157600080fd5b505af1158015614855573d6000803e3d6000fd5b5050600454600254614884935087925061487d916001600160a01b03908116918b9116613d47565b888a613971565b6004546002546148bf916148a6916001600160a01b03918216918a9116613d47565b6008546002546001600160a01b03918216911684613971565b955050505b831561495157600854604080517fe60a6a0b0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152602482018890529151919092169163e60a6a0b91604480830192600092919082900301818387803b15801561493857600080fd5b505af115801561494c573d6000803e3d6000fd5b505050505b50506001909201915061459f9050565b6060825167ffffffffffffffff8111801561497b57600080fd5b506040519080825280602002602001820160405280156149a5578160200160208202803683370190505b50905083816001855103815181106149b957fe5b60209081029190910101528251600019015b8015614aa35760008460018303815181106149e257fe5b6020026020010151905060008583815181106149fa57fe5b60200260200101519050600080614a27600460009054906101000a90046001600160a01b0316858561539c565b915091506000614a4b878781518110614a3c57fe5b602002602001015184846151f7565b9050614a77614a5c6127108a613abe565b614a6883612710613b00565b81614a6f57fe5b04600161546a565b876001880381518110614a8657fe5b6020908102919091010152505060001990930192506149cb915050565b50614ac381600081518110614ab457fe5b60200260200101518484613c15565b949350505050565b600480546040805163e6a4390560e01b81526001600160a01b038a811694820194909452888416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015614b2957600080fd5b505afa158015614b3d573d6000803e3d6000fd5b505050506040513d6020811015614b5357600080fd5b50516001600160a01b03161415614ce2576003546040805163d48bfca760e01b81526001600160a01b038b811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b158015614bb357600080fd5b505af1158015614bc7573d6000803e3d6000fd5b505050506040513d6020811015614bdd57600080fd5b50506003546040805163d48bfca760e01b81526001600160a01b038a811660048301529151919092169163d48bfca79160248083019260209291908290030181600087803b158015614c2e57600080fd5b505af1158015614c42573d6000803e3d6000fd5b505050506040513d6020811015614c5857600080fd5b505060048054604080516364e329cb60e11b81526001600160a01b038c8116948201949094528a841660248201529051929091169163c9c65396916044808201926020929091908290030181600087803b158015614cb557600080fd5b505af1158015614cc9573d6000803e3d6000fd5b505050506040513d6020811015614cdf57600080fd5b50505b6003546040805163a9ece1b760e01b81526001600160a01b038b811660048301528a811660248301529151919092169163a9ece1b7916044808301926020929190829003018186803b158015614d3757600080fd5b505afa158015614d4b573d6000803e3d6000fd5b505050506040513d6020811015614d6157600080fd5b5051614d9e5760405162461bcd60e51b815260040180806020018281038252603481526020018061579b6034913960400191505060405180910390fd5b6004546000908190614dba906001600160a01b03168b8b61539c565b91509150816000148015614dcc575080155b15614ddc57879350869250614e9c565b6000614de989848461555b565b9050878111614e3c5785811015614e315760405162461bcd60e51b81526004018080602001828103825260258152602001806156b06025913960400191505060405180910390fd5b889450925082614e9a565b6000614e4989848661555b565b905089811115614e5557fe5b87811015614e945760405162461bcd60e51b815260040180806020018281038252602581526020018061568b6025913960400191505060405180910390fd5b94508793505b505b600480546040805163e6a4390560e01b81526001600160a01b038e8116948201949094528c841660248201529051929091169163c9ead258913391849163e6a43905916044808301926020929190829003018186803b158015614efe57600080fd5b505afa158015614f12573d6000803e3d6000fd5b505050506040513d6020811015614f2857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b158015614f9257600080fd5b505af1158015614fa6573d6000803e3d6000fd5b505050506040513d6020811015614fbc57600080fd5b50939a92995091975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b602083106150815780518252601f199092019160209182019101615062565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146150e3576040519150601f19603f3d011682016040523d82523d6000602084013e6150e8565b606091505b5091509150818015615116575080511580615116575080806020019051602081101561511357600080fd5b50515b613a1a5760405162461bcd60e51b81526004018080602001828103825260248152602001806158416024913960400191505060405180910390fd5b6005546040805163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156151a757600080fd5b505af11580156151bb573d6000803e3d6000fd5b505050506040513d60208110156151d157600080fd5b50516151d957fe5b6005546151f390309084906001600160a01b031684613971565b5050565b60008084116152375760405162461bcd60e51b815260040180806020018281038252602b815260200180615816602b913960400191505060405180910390fd5b6000831180156152475750600082115b6152825760405162461bcd60e51b81526004018080602001828103825260278152602001806157296027913960400191505060405180910390fd5b6000615294848663ffffffff613b0016565b905060006152a8848763ffffffff613abe16565b9050610fc060018284816152b857fe5b049063ffffffff61546a16565b600080826001600160a01b0316846001600160a01b031614156153195760405162461bcd60e51b81526004018080602001828103825260248152602001806157056024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061533957828461533c565b83835b90925090506001600160a01b038216612c64576040805162461bcd60e51b815260206004820152601d60248201527f546f6d69537761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b60008060006153ab85856152c5565b5090506000806153bc888888613d47565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156153f457600080fd5b505afa158015615408573d6000803e3d6000fd5b505050506040513d606081101561541e57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b038781169084161461545857808261545b565b81815b90999098509650505050505050565b6000828201838110156126d2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600081848411156155535760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015615518578181015183820152602001615500565b50505050905090810190601f1680156155455780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080841161559b5760405162461bcd60e51b81526004018080602001828103825260248152602001806157cf6024913960400191505060405180910390fd5b6000831180156155ab5750600082115b6155e65760405162461bcd60e51b81526004018080602001828103825260278152602001806157296027913960400191505060405180910390fd5b826155f7858463ffffffff613b0016565b816155fe57fe5b0494935050505056fe544f4d4920504c4154464f524d203a20434845434b20544f4d492f544f4b454e20544f2056414c5545204641494c544f4d4920504c4154464f524d203a2053574150205041495220434f4e46494720434845434b204641494c546f6d69537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54544f4d4920504c4154464f524d203a20494e53554646494349454e545f415f414d4f554e54544f4d4920504c4154464f524d203a20494e53554646494349454e545f425f414d4f554e54544f4d4920504c4154464f524d203a20434845434b20544f4d492f544f4b454e2056414c55452046524f4d204641494c546f6d69537761704c6962726172793a204944454e544943414c5f414444524553534553546f6d69537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77544f4d4920504c4154464f524d203a20494e53554646494349454e545f4f55545055545f414d4f554e54544f4d4920504c4154464f524d203a20414444204c4951554944495459205041495220434f4e46494720434845434b204641494c546f6d69537761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544546f6d69537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544544f4d4920504c4154464f524d203a204558434553534956455f494e5055545f414d4f554e54a2646970667358221220d4bbb63c58480a0a6dec648c8a999c9d9c534a66117575c8a3b8b67355d2432664736f6c63430006060033

Verified Source Code Full Match

Compiler: v0.6.6+commit.6c089d02 EVM: istanbul Optimization: Yes (1000 runs)
TomiPlatform.sol 629 lines
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.6;

import './libraries/ConfigNames.sol';
import './libraries/SafeMath.sol';
import './libraries/TransferHelper.sol';
import './libraries/TomiSwapLibrary.sol';
import './interfaces/IWETH.sol';
import './interfaces/ITomiGovernance.sol';
import './interfaces/ITomiConfig.sol';
import './interfaces/IERC20.sol';
import './interfaces/ITomiFactory.sol';
import './interfaces/ITomiPair.sol';
import './interfaces/ITomiPool.sol';
import './modules/Ownable.sol';
import './modules/ReentrancyGuard.sol';
import './interfaces/ITomiTransferListener.sol';
import './interfaces/ITokenRegistry.sol';
import './interfaces/ITomiStaking.sol';

contract TomiPlatform is Ownable {
    uint256 public version = 1;
    address public TOMI;
    address public CONFIG;
    address public FACTORY;
    address public WETH;
    address public GOVERNANCE;
    address public TRANSFER_LISTENER;
    address public POOL;
    uint256 public constant PERCENT_DENOMINATOR = 10000;

    bool public isPause;

    event AddLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event RemoveLiquidity(
        address indexed player,
        address indexed tokenA,
        address indexed tokenB,
        uint256 amountA,
        uint256 amountB
    );
    event SwapToken(
        address indexed receiver,
        address indexed fromToken,
        address indexed toToken,
        uint256 inAmount,
        uint256 outAmount
    );

    receive() external payable {
        assert(msg.sender == WETH);
    }

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, 'TOMI PLATFORM : EXPIRED');
        _;
    }

    modifier noneTokenCall() {
        require(ITokenRegistry(CONFIG).tokenStatus(msg.sender) == 0, 'TOMI PLATFORM : ILLEGAL CALL');
        _;
    }

    function initialize(
        address _TOMI,
        address _CONFIG,
        address _FACTORY,
        address _WETH,
        address _GOVERNANCE,
        address _TRANSFER_LISTENER,
        address _POOL
    ) external onlyOwner {
        TOMI = _TOMI;
        CONFIG = _CONFIG;
        FACTORY = _FACTORY;
        WETH = _WETH;
        GOVERNANCE = _GOVERNANCE;
        TRANSFER_LISTENER = _TRANSFER_LISTENER;
        POOL = _POOL;
    }

    function pause() external onlyOwner {
        isPause = true;
    }

    function resume() external onlyOwner {
        isPause = false;
    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal returns (uint256 amountA, uint256 amountB) {
        if (ITomiFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            ITomiConfig(CONFIG).addToken(tokenA);
            ITomiConfig(CONFIG).addToken(tokenB);
            ITomiFactory(FACTORY).createPair(tokenA, tokenB);
        }
        require(
            ITomiConfig(CONFIG).checkPair(tokenA, tokenB),
            'TOMI PLATFORM : ADD LIQUIDITY PAIR CONFIG CHECK FAIL'
        );
        (uint256 reserveA, uint256 reserveB) = TomiSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = TomiSwapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'TOMI PLATFORM : INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = TomiSwapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'TOMI PLATFORM : INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
        ITomiFactory(FACTORY).addPlayerPair(msg.sender, ITomiFactory(FACTORY).getPair(tokenA, tokenB));
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountA,
        uint256 amountB,
        uint256 amountAMin,
        uint256 amountBMin,
        uint256 deadline
    )
        external
        ensure(deadline)
        returns (
            uint256 _amountA,
            uint256 _amountB,
            uint256 _liquidity
        )
{
        require(!isPause, "TOMI PAUSED");
        (_amountA, _amountB) = _addLiquidity(tokenA, tokenB, amountA, amountB, amountAMin, amountBMin);
        address pair = TomiSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, _amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, _amountB);

        // notify pool
        ITomiPool(POOL).preProductivityChanged(pair, msg.sender);
        _liquidity = ITomiPair(pair).mint(msg.sender);
        ITomiPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, tokenA, _amountA);
        _transferNotify(msg.sender, pair, tokenB, _amountB);
        emit AddLiquidity(msg.sender, tokenA, tokenB, _amountA, _amountB);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        uint256 deadline
    )
        external
        payable
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        require(!isPause, "TOMI PAUSED");
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = TomiSwapLibrary.pairFor(FACTORY, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));

        // notify pool
        ITomiPool(POOL).preProductivityChanged(pair, msg.sender);
        liquidity = ITomiPair(pair).mint(msg.sender);
        ITomiPool(POOL).postProductivityChanged(pair, msg.sender);

        _transferNotify(msg.sender, pair, WETH, amountETH);
        _transferNotify(msg.sender, pair, token, amountToken);
        emit AddLiquidity(msg.sender, token, WETH, amountToken, amountETH);
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        require(!isPause, "TOMI PAUSED");
        address pair = TomiSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
        uint256 _liquidity = liquidity;
        address _tokenA = tokenA;
        address _tokenB = tokenB;

        // notify pool
        ITomiPool(POOL).preProductivityChanged(pair, msg.sender);
        (uint256 amount0, uint256 amount1) = ITomiPair(pair).burn(msg.sender, to, _liquidity);
        ITomiPool(POOL).postProductivityChanged(pair, msg.sender);

        (address token0, ) = TomiSwapLibrary.sortTokens(_tokenA, _tokenB);
        (amountA, amountB) = _tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        _transferNotify(pair, to, _tokenA, amountA);
        _transferNotify(pair, to, _tokenB, amountB);
        require(amountA >= amountAMin, 'TOMI PLATFORM : INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'TOMI PLATFORM : INSUFFICIENT_B_AMOUNT');
        emit RemoveLiquidity(msg.sender, _tokenA, _tokenB, amountA, amountB);
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        require(!isPause, "TOMI PAUSED");
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
        _transferNotify(address(this), to, token, amountToken);
        _transferNotify(address(this), to, WETH, amountETH);
    }

    function _getAmountsOut(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountOuts) {
        amountOuts = new uint256[](path.length);
        amountOuts[0] = amount;
        for (uint256 i = 0; i < path.length - 1; i++) {
            address inPath = path[i];
            address outPath = path[i + 1];
            (uint256 reserveA, uint256 reserveB) = TomiSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 outAmount = SafeMath.mul(amountOuts[i], SafeMath.sub(PERCENT_DENOMINATOR, percent));
            amountOuts[i + 1] = TomiSwapLibrary.getAmountOut(outAmount / PERCENT_DENOMINATOR, reserveA, reserveB);
        }
    }

    function _getAmountsIn(
        uint256 amount,
        address[] memory path,
        uint256 percent
    ) internal view returns (uint256[] memory amountIn) {
        amountIn = new uint256[](path.length);
        amountIn[path.length - 1] = amount;
        for (uint256 i = path.length - 1; i > 0; i--) {
            address inPath = path[i - 1];
            address outPath = path[i];
            (uint256 reserveA, uint256 reserveB) = TomiSwapLibrary.getReserves(FACTORY, inPath, outPath);
            uint256 inAmount = TomiSwapLibrary.getAmountIn(amountIn[i], reserveA, reserveB);
            amountIn[i - 1] = SafeMath.add(
                SafeMath.mul(inAmount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent),
                1
            );
        }
        amountIn = _getAmountsOut(amountIn[0], path, percent);
    }

    function swapPrecondition(address token) public view returns (bool) {
        if (token == TOMI || token == WETH) return true;
        uint256 percent = ITomiConfig(CONFIG).getConfigValue(ConfigNames.TOKEN_TO_TGAS_PAIR_MIN_PERCENT);
        if (!existPair(WETH, TOMI)) return false;
        if (!existPair(TOMI, token)) return false;
        if (!(ITomiConfig(CONFIG).checkPair(TOMI, token) && ITomiConfig(CONFIG).checkPair(WETH, token))) return false;
        if (!existPair(WETH, token)) return true;
        if (percent == 0) return true;
        (uint256 reserveTOMI, ) = TomiSwapLibrary.getReserves(FACTORY, TOMI, token);
        (uint256 reserveWETH, ) = TomiSwapLibrary.getReserves(FACTORY, WETH, token);
        (uint256 reserveWETH2, uint256 reserveTOMI2) = TomiSwapLibrary.getReserves(FACTORY, WETH, TOMI);
        uint256 tomiValue = SafeMath.mul(reserveTOMI, reserveWETH2) / reserveTOMI2;
        uint256 limitValue = SafeMath.mul(SafeMath.add(tomiValue, reserveWETH), percent) / PERCENT_DENOMINATOR;
        return tomiValue >= limitValue;
    }
         
    function checkPath(address _path, address[] memory _paths) public pure returns (bool) {
        uint count;
        for(uint i; i<_paths.length; i++) {
            if(_paths[i] == _path) {
                count++;
            }
        }
        if(count == 1) {
            return true;
        } else {
            return false;
        }
    }

    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal {
        require(!isPause, "TOMI PAUSED");
        require(swapPrecondition(path[path.length - 1]), 'TOMI PLATFORM : CHECK TOMI/TOKEN TO VALUE FAIL');
        for (uint256 i; i < path.length - 1; i++) {
            require(checkPath(path[i], path) && checkPath(path[i + 1], path), 'DEMAX PLATFORM : INVALID PATH');
            (address input, address output) = (path[i], path[i + 1]);
            require(swapPrecondition(input), 'TOMI PLATFORM : CHECK TOMI/TOKEN VALUE FROM FAIL');
            require(ITomiConfig(CONFIG).checkPair(input, output), 'TOMI PLATFORM : SWAP PAIR CONFIG CHECK FAIL');
            (address token0, address token1) = TomiSwapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? TomiSwapLibrary.pairFor(FACTORY, output, path[i + 2]) : _to;

            // add k check
            address pair = TomiSwapLibrary.pairFor(FACTORY, input, output);
            (uint reserve0, uint resereve1, ) = ITomiPair(pair).getReserves();
            uint kBefore = SafeMath.mul(reserve0, resereve1);

            ITomiPair(pair).swap(amount0Out, amount1Out, to, new bytes(0));

            (reserve0, resereve1, ) = ITomiPair(pair).getReserves();
            uint kAfter = SafeMath.mul(reserve0, resereve1);
            require(kBefore <= kAfter, "Burger K");

            if (amount0Out > 0)
                _transferNotify(TomiSwapLibrary.pairFor(FACTORY, input, output), to, token0, amount0Out);
            if (amount1Out > 0)
                _transferNotify(TomiSwapLibrary.pairFor(FACTORY, input, output), to, token1, amount1Out);
        }
        emit SwapToken(_to, path[0], path[path.length - 1], amounts[0], amounts[path.length - 1]);
    }

    function _swapFee(
        uint256[] memory amounts,
        address[] memory path,
        uint256 percent
    ) internal {
        for (uint256 i = 0; i < path.length - 1; i++) {
            uint256 fee = SafeMath.mul(amounts[i], percent) / PERCENT_DENOMINATOR;
            address input = path[i];
            address output = path[i + 1];
            address currentPair = TomiSwapLibrary.pairFor(FACTORY, input, output);
            if (input == TOMI) {
                ITomiPair(currentPair).swapFee(fee, TOMI, POOL);
                _transferNotify(currentPair, POOL, TOMI, fee);
            } else {
                ITomiPair(currentPair).swapFee(fee, input, TomiSwapLibrary.pairFor(FACTORY, input, TOMI));
                (uint256 reserveIn, uint256 reserveTOMI) = TomiSwapLibrary.getReserves(FACTORY, input, TOMI);
                uint256 feeOut = TomiSwapLibrary.getAmountOut(fee, reserveIn, reserveTOMI);
                ITomiPair(TomiSwapLibrary.pairFor(FACTORY, input, TOMI)).swapFee(feeOut, TOMI, POOL);
                _transferNotify(currentPair, TomiSwapLibrary.pairFor(FACTORY, input, TOMI), input, fee);
                _transferNotify(TomiSwapLibrary.pairFor(FACTORY, input, TOMI), POOL, TOMI, feeOut);
                fee = feeOut;
            }
            if (fee > 0) { 
                ITomiPool(POOL).addRewardFromPlatform(currentPair, fee); 
            }
        }
    }

    function _getSwapFeePercent() internal view returns (uint256) {
        return ITomiConfig(CONFIG).getConfigValue(ConfigNames.SWAP_FEE_PERCENT);
    }

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

        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TOMI PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function _innerTransferFrom(
        address token,
        address from,
        address to,
        uint256 amount
    ) internal {
        TransferHelper.safeTransferFrom(token, from, to, amount);
        _transferNotify(from, to, token, amount);
    }

    function _innerTransferWETH(address to, uint256 amount) internal {
        assert(IWETH(WETH).transfer(to, amount));
        _transferNotify(address(this), to, WETH, amount);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'TOMI PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(msg.value, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TOMI PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'TOMI PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsOut(amountIn, path, percent);
        require(amounts[amounts.length - 1] >= amountOutMin, 'TOMI PLATFORM : INSUFFICIENT_OUTPUT_AMOUNT');
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);

        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'TOMI PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);

        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);
        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'TOMI PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= amountInMax, 'TOMI PLATFORM : EXCESSIVE_INPUT_AMOUNT');
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferFrom(
            path[0],
            msg.sender,
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);

        _innerTransferFrom(path[0], msg.sender, pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'TOMI PLATFORM : INVALID_PATH');
        uint256 percent = _getSwapFeePercent();
        amounts = _getAmountsIn(amountOut, path, percent);
        require(amounts[0] <= msg.value, 'TOMI PLATFORM : EXCESSIVE_INPUT_AMOUNT');

        IWETH(WETH).deposit{
            value: SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        }();
        address pair = TomiSwapLibrary.pairFor(FACTORY, path[0], path[1]);
        _innerTransferWETH(
            pair,
            SafeMath.mul(amounts[0], SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR
        );
        _swap(amounts, path, to);

        IWETH(WETH).deposit{value: SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR}();
        _innerTransferWETH(pair, SafeMath.mul(amounts[0], percent) / PERCENT_DENOMINATOR);
        _swapFee(amounts, path, percent);
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    function _transferNotify(
        address from,
        address to,
        address token,
        uint256 amount
    ) internal {
        ITomiTransferListener(TRANSFER_LISTENER).transferNotify(from, to, token, amount);
    }

    function existPair(address tokenA, address tokenB) public view returns (bool) {
        return ITomiFactory(FACTORY).getPair(tokenA, tokenB) != address(0);
    }

    function getReserves(address tokenA, address tokenB) public view returns (uint256, uint256) {
        return TomiSwapLibrary.getReserves(FACTORY, tokenA, tokenB);
    }

    function pairFor(address tokenA, address tokenB) public view returns (address) {
        return TomiSwapLibrary.pairFor(FACTORY, tokenA, tokenB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountOut) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = SafeMath.mul(amountIn, SafeMath.sub(PERCENT_DENOMINATOR, percent)) / PERCENT_DENOMINATOR;
        return TomiSwapLibrary.getAmountOut(amount, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public view returns (uint256 amountIn) {
        uint256 percent = _getSwapFeePercent();
        uint256 amount = TomiSwapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
        return SafeMath.mul(amount, PERCENT_DENOMINATOR) / SafeMath.sub(PERCENT_DENOMINATOR, percent);
    }

    function getAmountsOut(uint256 amountIn, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsOut(amountIn, path, percent);
    }

    function getAmountsIn(uint256 amountOut, address[] memory path) public view returns (uint256[] memory amounts) {
        uint256 percent = _getSwapFeePercent();
        return _getAmountsIn(amountOut, path, percent);
    }

    function migrateLiquidity(address pair, address tokenA, address tokenB, address[] calldata users) external onlyOwner {
        if (ITomiFactory(FACTORY).getPair(tokenA, tokenB) == address(0)) {
            ITomiFactory(FACTORY).createPair(tokenA, tokenB);
        }
        address newPair = ITomiFactory(FACTORY).getPair(tokenA, tokenB);
        for(uint i = 0; i < users.length; i++) {
            uint liquidity = ITomiPair(pair).balanceOf(users[i]);
            if(liquidity > 0) {
                ITomiPair(pair).burn(users[i], newPair, liquidity);
                ITomiPair(newPair).mint(users[i]);
                ITomiFactory(FACTORY).addPlayerPair(users[i], newPair);
            }
        }

        ITomiTransferListener(TRANSFER_LISTENER).upgradeProdutivity(pair, newPair);    

    }
}
Ownable.sol 23 lines
pragma solidity >=0.5.16;

contract Ownable {
    address public owner;

    event OwnerChanged(address indexed _oldOwner, address indexed _newOwner);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, 'Ownable: FORBIDDEN');
        _;
    }

    function changeOwner(address _newOwner) public onlyOwner {
        require(_newOwner != address(0), 'Ownable: INVALID_ADDRESS');
        emit OwnerChanged(owner, _newOwner);
        owner = _newOwner;
    }

}
IWETH.sol 7 lines
pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}
IERC20.sol 17 lines
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

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

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}
SafeMath.sol 159 lines
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.6;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
ITomiPair.sol 39 lines
pragma solidity >=0.5.0;

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

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

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

    function initialize(address tokenA, address tokenB, address platform, address tgas) external;
    function swapFee(uint amount, address token, address to) external ;
    function queryReward() external view returns (uint rewardAmount, uint blockNumber);
    function mintReward() external returns (uint rewardAmount);
    function getTGASReserve() external view returns (uint);
}
ITomiPool.sol 7 lines
pragma solidity >=0.5.0;

interface ITomiPool {
    function addRewardFromPlatform(address _pair, uint _amount) external;
    function preProductivityChanged(address _pair, address _user) external;
    function postProductivityChanged(address _pair, address _user) external;
}
ConfigNames.sol 25 lines
pragma solidity >=0.5.16;

library ConfigNames {
    bytes32 public constant PRODUCE_TGAS_RATE = bytes32('PRODUCE_TGAS_RATE');
    bytes32 public constant SWAP_FEE_PERCENT = bytes32('SWAP_FEE_PERCENT');
    bytes32 public constant LIST_TGAS_AMOUNT = bytes32('LIST_TGAS_AMOUNT');
    bytes32 public constant UNSTAKE_DURATION = bytes32('UNSTAKE_DURATION');
    // bytes32 public constant EXECUTION_DURATION = bytes32('EXECUTION_DURATION');
    bytes32 public constant REMOVE_LIQUIDITY_DURATION = bytes32('REMOVE_LIQUIDITY_DURATION');
    bytes32 public constant TOKEN_TO_TGAS_PAIR_MIN_PERCENT = bytes32('TOKEN_TO_TGAS_PAIR_MIN_PERCENT');
    bytes32 public constant LIST_TOKEN_FAILURE_BURN_PRECENT = bytes32('LIST_TOKEN_FAILURE_BURN_PRECENT');
    bytes32 public constant LIST_TOKEN_SUCCESS_BURN_PRECENT = bytes32('LIST_TOKEN_SUCCESS_BURN_PRECENT');
    bytes32 public constant PROPOSAL_TGAS_AMOUNT = bytes32('PROPOSAL_TGAS_AMOUNT');
    // bytes32 public constant VOTE_DURATION = bytes32('VOTE_DURATION');
    bytes32 public constant VOTE_REWARD_PERCENT = bytes32('VOTE_REWARD_PERCENT');
    bytes32 public constant TOKEN_PENGDING_SWITCH = bytes32('TOKEN_PENGDING_SWITCH');
    bytes32 public constant TOKEN_PENGDING_TIME = bytes32('TOKEN_PENGDING_TIME');
    bytes32 public constant LIST_TOKEN_SWITCH = bytes32('LIST_TOKEN_SWITCH');
    bytes32 public constant DEV_PRECENT = bytes32('DEV_PRECENT');
    bytes32 public constant FEE_GOVERNANCE_REWARD_PERCENT = bytes32('FEE_GOVERNANCE_REWARD_PERCENT');
    bytes32 public constant FEE_LP_REWARD_PERCENT = bytes32('FEE_LP_REWARD_PERCENT');
    bytes32 public constant FEE_FUNDME_REWARD_PERCENT = bytes32('FEE_FUNDME_REWARD_PERCENT');
    bytes32 public constant FEE_LOTTERY_REWARD_PERCENT = bytes32('FEE_LOTTERY_REWARD_PERCENT');
    bytes32 public constant FEE_STAKING_REWARD_PERCENT = bytes32('FEE_STAKING_REWARD_PERCENT');
}
ITomiConfig.sol 16 lines
pragma solidity >=0.5.0;

interface ITomiConfig {
    function governor() external view returns (address);
    function dev() external view returns (address);
    function PERCENT_DENOMINATOR() external view returns (uint);
    function getConfig(bytes32 _name) external view returns (uint minValue, uint maxValue, uint maxSpan, uint value, uint enable);
    function getConfigValue(bytes32 _name) external view returns (uint);
    function changeConfigValue(bytes32 _name, uint _value) external returns (bool);
    function checkToken(address _token) external view returns(bool);
    function checkPair(address tokenA, address tokenB) external view returns (bool);
    function listToken(address _token) external returns (bool);
    function getDefaultListTokens() external returns (address[] memory);
    function platform() external view returns  (address);
    function addToken(address _token) external returns (bool);
}
ITomiFactory.sol 16 lines
pragma solidity >=0.5.0;

interface ITomiFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function contractCodeHash() external view returns (bytes32);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function isPair(address pair) external view returns (bool);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function playerPairs(address player, uint index) external view returns (address pair);
    function getPlayerPairCount(address player) external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);
    function addPlayerPair(address player, address _pair) external returns (bool);
}
ITomiStaking.sol 5 lines
pragma solidity >=0.5.0;

interface ITomiStaking {
    function updateRevenueShare(uint256 revenueShared) external;
}
ReentrancyGuard.sol 74 lines
/**
 *Submitted for verification at BscScan.com on 2021-06-30
*/

pragma solidity >=0.6.6;

interface IDemaxTransferListener {
    function transferNotify(address from, address to, address token, uint amount)  external returns (bool);
    function upgradeProdutivity(address fromPair, address toPair) external;
}
// Dependency file: contracts/modules/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT

// pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () internal {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
TransferHelper.sol 29 lines
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}
ITokenRegistry.sol 18 lines
pragma solidity >=0.5.16;

interface ITokenRegistry {
    function tokenStatus(address _token) external view returns(uint);
    function pairStatus(address tokenA, address tokenB) external view returns (uint);
    function NONE() external view returns(uint);
    function REGISTERED() external view returns(uint);
    function PENDING() external view returns(uint);
    function OPENED() external view returns(uint);
    function CLOSED() external view returns(uint);
    function registryToken(address _token) external returns (bool);
    function publishToken(address _token) external returns (bool);
    function updateToken(address _token, uint _status) external returns (bool);
    function updatePair(address tokenA, address tokenB, uint _status) external returns (bool);
    function tokenCount() external view returns(uint);
    function validTokens() external view returns(address[] memory);
    function iterateValidTokens(uint32 _start, uint32 _end) external view returns (address[] memory);
}
TomiSwapLibrary.sol 63 lines
pragma solidity >=0.5.0;

import '../interfaces/ITomiPair.sol';
import '../interfaces/ITomiFactory.sol';
import "./SafeMath.sol";

library TomiSwapLibrary {
    using SafeMath for uint;

    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'TomiSwapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'TomiSwapLibrary: ZERO_ADDRESS');
    }

    function pairFor(address factory, address tokenA, address tokenB) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        bytes32 salt = keccak256(abi.encodePacked(token0, token1));
        bytes32 rawAddress = keccak256(
        abi.encodePacked(
            bytes1(0xff),
            factory,
            salt,
            ITomiFactory(factory).contractCodeHash()
            )
        );
        return address(bytes20(rawAddress << 96));
    }

    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ITomiPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
    
    function quoteEnhance(address factory, address tokenA, address tokenB, uint amountA) internal view returns(uint amountB) {
        (uint reserveA, uint reserveB) = getReserves(factory, tokenA, tokenB);
        return quote(amountA, reserveA, reserveB);
    }

    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'TomiSwapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'TomiSwapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'TomiSwapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'TomiSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = amountIn.mul(reserveOut);
        uint denominator = reserveIn.add(amountIn);
        amountOut = numerator / denominator;
    }
    
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'TomiSwapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'TomiSwapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut);
        uint denominator = reserveOut.sub(amountOut);
        amountIn = (numerator / denominator).add(1);
    }

}
ITomiGovernance.sol 8 lines
pragma solidity >=0.5.0;

interface ITomiGovernance {
    function addPair(address _tokenA, address _tokenB) external returns (bool);
    function addReward(uint _value) external returns (bool);
    function deposit(uint _amount) external returns (bool);
    function onBehalfDeposit(address _user, uint _amount) external returns (bool);
}
ITomiTransferListener.sol 6 lines
pragma solidity >=0.6.6;

interface ITomiTransferListener {
    function transferNotify(address from, address to, address token, uint amount)  external returns (bool);
    function upgradeProdutivity(address fromPair, address toPair) external;
}

Read Contract

CONFIG 0xd92e82e4 → address
FACTORY 0x2dd31000 → address
GOVERNANCE 0x14627834 → address
PERCENT_DENOMINATOR 0x9e6c2959 → uint256
POOL 0x7535d246 → address
TOMI 0xc1dfe652 → address
TRANSFER_LISTENER 0x822abc7c → address
WETH 0xad5c4648 → address
checkPath 0x525e7e8f → bool
existPair 0xc2ceddfa → bool
getAmountIn 0x85f8c259 → uint256
getAmountOut 0x054d50d4 → uint256
getAmountsIn 0x1f00ca74 → uint256[]
getAmountsOut 0xd06ca61f → uint256[]
getReserves 0xd52bb6f4 → uint256, uint256
isPause 0xff0938a7 → bool
owner 0x8da5cb5b → address
pairFor 0x96ed28f9 → address
swapPrecondition 0xddd377ac → bool
version 0x54fd4d50 → uint256

Write Contract 15 functions

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

addLiquidity 0x7ae06e58
address tokenA
address tokenB
uint256 amountA
uint256 amountB
uint256 amountAMin
uint256 amountBMin
uint256 deadline
returns: uint256, uint256, uint256
addLiquidityETH 0xf6f1e306
address token
uint256 amountTokenDesired
uint256 amountTokenMin
uint256 amountETHMin
uint256 deadline
returns: uint256, uint256, uint256
changeOwner 0xa6f9dae1
address _newOwner
initialize 0x35876476
address _TOMI
address _CONFIG
address _FACTORY
address _WETH
address _GOVERNANCE
address _TRANSFER_LISTENER
address _POOL
migrateLiquidity 0x8b61ff24
address pair
address tokenA
address tokenB
address[] users
pause 0x8456cb59
No parameters
removeLiquidity 0xbaa2abde
address tokenA
address tokenB
uint256 liquidity
uint256 amountAMin
uint256 amountBMin
address to
uint256 deadline
returns: uint256, uint256
removeLiquidityETH 0x02751cec
address token
uint256 liquidity
uint256 amountTokenMin
uint256 amountETHMin
address to
uint256 deadline
returns: uint256, uint256
resume 0x046f7da2
No parameters
swapETHForExactTokens 0xfb3bdb41
uint256 amountOut
address[] path
address to
uint256 deadline
returns: uint256[]
swapExactETHForTokens 0x7ff36ab5
uint256 amountOutMin
address[] path
address to
uint256 deadline
returns: uint256[]
swapExactTokensForETH 0x18cbafe5
uint256 amountIn
uint256 amountOutMin
address[] path
address to
uint256 deadline
returns: uint256[]
swapExactTokensForTokens 0x38ed1739
uint256 amountIn
uint256 amountOutMin
address[] path
address to
uint256 deadline
returns: uint256[]
swapTokensForExactETH 0x4a25d94a
uint256 amountOut
uint256 amountInMax
address[] path
address to
uint256 deadline
returns: uint256[]
swapTokensForExactTokens 0x8803dbee
uint256 amountOut
uint256 amountInMax
address[] path
address to
uint256 deadline
returns: uint256[]

Recent Transactions

No transactions found for this address