Forkchoice Ethereum Mainnet

Address Contract Verified

Address 0xd089aAeb716b6930fe71f96D335F8Cd2c07fa505
Balance 0.213038 ETH ($422.57)
Nonce 1
Code Size 9206 bytes
Indexed Transactions 0 (1 on-chain, 1.1% indexed)
External Etherscan · Sourcify

Contract Bytecode

9206 bytes
0x6080604052600436106102ea5760003560e01c806399eefadb11610184578063c96f4d4d116100d6578063e0f0edc61161008a578063f2fde38b11610064578063f2fde38b1461077c578063f48167a51461079c578063f887ea40146107bc57600080fd5b8063e0f0edc614610725578063e2568ad214610746578063e97ca4b11461075c57600080fd5b8063cef02201116100bb578063cef02201146106d8578063d938a3e6146106ee578063dbc609f81461070f57600080fd5b8063c96f4d4d146106a1578063cb3f4f17146106b757600080fd5b8063ba67ed6611610138578063c317377411610112578063c317377414610660578063c38ec0b614610676578063c3926a291461068b57600080fd5b8063ba67ed66146105ef578063be1c714214610620578063c0d786551461064057600080fd5b8063b470fa6111610169578063b470fa611461058f578063b5fb2174146105af578063b68e204c146105cf57600080fd5b806399eefadb14610559578063a0885e931461056f57600080fd5b8063715018a61161023d5780637b31bd78116101f15780638bb28de2116101cb5780638bb28de2146105055780638da5cb5b1461051b57806390d8dec71461053957600080fd5b80637b31bd781461048d5780637ee2dec3146104c557806387020d6b146104e557600080fd5b80637796ff37116102225780637796ff371461044157806377e7e202146104575780637943da691461047757600080fd5b8063715018a61461041757806373bdeb491461042c57600080fd5b80633802fa431161029f5780635a75a809116102795780635a75a809146103cc57806361582eaa146103e25780636aea97f01461040257600080fd5b80633802fa431461037757806343f68a491461038c578063517cafef146103ac57600080fd5b80630aeb46be116102d05780630aeb46be1461032257806315291cd41461034b578063313dab201461036157600080fd5b8062e55312146102f6578063099f833e1461030d57600080fd5b366102f157005b600080fd5b34801561030257600080fd5b5061030b6107dc565b005b34801561031957600080fd5b5061030b61085f565b34801561032e57600080fd5b5061033860075481565b6040519081526020015b60405180910390f35b34801561035757600080fd5b50610338600c5481565b34801561036d57600080fd5b5061033860105481565b34801561038357600080fd5b5061030b610947565b34801561039857600080fd5b5061030b6103a7366004611fef565b6109bf565b3480156103b857600080fd5b5061030b6103c736600461201d565b610a6f565b3480156103d857600080fd5b50610338600a5481565b3480156103ee57600080fd5b5061030b6103fd36600461201d565b610b26565b34801561040e57600080fd5b5061030b610ef8565b34801561042357600080fd5b5061030b610f70565b34801561043857600080fd5b5061030b610f84565b34801561044d57600080fd5b50610338600d5481565b34801561046357600080fd5b5061030b61047236600461201d565b610ffc565b34801561048357600080fd5b50610338600f5481565b34801561049957600080fd5b506002546104ad906001600160a01b031681565b6040516001600160a01b039091168152602001610342565b3480156104d157600080fd5b5061030b6104e036600461204f565b61109c565b3480156104f157600080fd5b5061030b610500366004611fef565b611136565b34801561051157600080fd5b5061033860095481565b34801561052757600080fd5b506000546001600160a01b03166104ad565b34801561054557600080fd5b5061030b610554366004611fef565b61118a565b34801561056557600080fd5b5061033860065481565b34801561057b57600080fd5b5061030b61058a36600461206c565b6111f4565b34801561059b57600080fd5b506003546104ad906001600160a01b031681565b3480156105bb57600080fd5b506013546104ad906001600160a01b031681565b3480156105db57600080fd5b506014546104ad906001600160a01b031681565b3480156105fb57600080fd5b5060145461061090600160b81b900460ff1681565b6040519015158152602001610342565b34801561062c57600080fd5b5061030b61063b36600461201d565b6112d2565b34801561064c57600080fd5b5061030b61065b36600461201d565b61133e565b34801561066c57600080fd5b50610338600e5481565b34801561068257600080fd5b5061030b6113af565b34801561069757600080fd5b5061033860115481565b3480156106ad57600080fd5b5061033860085481565b3480156106c357600080fd5b5060145461061090600160a01b900460ff1681565b3480156106e457600080fd5b5061033860125481565b3480156106fa57600080fd5b5060145461061090600160a81b900460ff1681565b34801561071b57600080fd5b5061033860055481565b34801561073157600080fd5b5060145461061090600160b01b900460ff1681565b34801561075257600080fd5b50610338600b5481565b34801561076857600080fd5b5061030b61077736600461201d565b6114e4565b34801561078857600080fd5b5061030b61079736600461201d565b61159b565b3480156107a857600080fd5b506004546104ad906001600160a01b031681565b3480156107c857600080fd5b506001546104ad906001600160a01b031681565b6014546001600160a01b03166107ee57565b601080546000918290556014546040519192916001600160a01b039091169083908381818185875af1925050503d8060008114610847576040519150601f19603f3d011682016040523d82523d6000602084013e61084c565b606091505b505090508061085b5760108290555b5050565b6013546001600160a01b031661087157565b601360009054906101000a90046001600160a01b03166001600160a01b03166329a2192b6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108c157600080fd5b505af11580156108d5573d6000803e3d6000fd5b5050600f80546000918290556013546040519194509192506001600160a01b039091169083908381818185875af1925050503d8060008114610933576040519150601f19603f3d011682016040523d82523d6000602084013e610938565b606091505b505090508061085b5750600f55565b61094f61162b565b601454600160a81b900460ff161561096657600080fd5b601480547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16600160a81b1790556040517fbe12b38d4cf4c293207b3ef208df8a6fcdd921b2f47ef87a780c5cf0dc8b8e8b90600090a1565b6109c761162b565b6000811180156109d957506103e88111155b610a2a5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420736c6970706167652076616c75650000000000000000000060448201526064015b60405180910390fd5b600780549082905560408051828152602081018490527fda973bd94b10c2214cb2481e0686daab27b8379c7b3da0466b067c532a769dd9910160405180910390a15050565b610a7761162b565b6001600160a01b03811615801590610a9a57506001600160a01b03811661dead14155b8015610ab457506013546001600160a01b03828116911614155b610abd57600080fd5b601454600160a01b900460ff1615610ad457600080fd5b601380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f035f81230cd5b48929f16ee6e30f062311fb20ffbc64091e16b40a97fcccb86090600090a35050565b6001600160a01b038116610b7c5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420746f6b656e206164647265737300000000000000000000006044820152606401610a21565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610bc3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be79190612098565b11610c345760405162461bcd60e51b815260206004820152601460248201527f4e6f20746f6b656e7320746f2070726f636573730000000000000000000000006044820152606401610a21565b6040516370a0823160e01b815230600482015247906000906001600160a01b038416906370a0823190602401602060405180830381865afa158015610c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca19190612098565b6003549091506001600160a01b0390811690841603610cca57601254610cc790826120c7565b90505b8015610e2c576014548190600160b81b900460ff1615610e2057600080600260009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610d3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5e9190612103565b50915091506000600160009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dde9190612153565b6003546001600160a01b03918216911610610df95781610dfb565b825b90506000610e0882611694565b9050808610610e175780610e19565b855b9450505050505b610e2a84826116fa565b505b6000610e3883476120c7565b90506103e8600b5482610e4b9190612170565b610e559190612187565b600f6000828254610e6691906121a9565b9091555050600d546103e890610e7c9083612170565b610e869190612187565b60106000828254610e9791906121a9565b9091555050601054600f54610eac90476120c7565b610eb691906120c7565b601155600e54600f5410610ecc57610ecc61085f565b600e5460105410610edf57610edf6107dc565b600e5460115410610ef257610ef26118b7565b50505050565b610f0061162b565b601454600160a01b900460ff1615610f1757600080fd5b601480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f6e646a980ba56ee7cb3031c878bc514eee5ea01f8d11b005ab630c470a5cfe8990600090a1565b610f7861162b565b610f826000611bcf565b565b610f8c61162b565b601454600160b01b900460ff1615610fa357600080fd5b601480547fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff16600160b01b1790556040517ff0fee47614f22f38389abedf99711a8247311a440e37da802db457410f79b44990600090a1565b61100461162b565b6001600160a01b0381161580159061102757506001600160a01b03811661dead14155b801561104157506004546001600160a01b03828116911614155b61104a57600080fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f3431bc932834bba479a2b59e0fc776b87c0e05ea4837cf59330044387228809c90600090a35050565b6110a461162b565b801515601460179054906101000a900460ff161515036110c357600080fd5b60148054821515600160b81b027fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff9091161790556040517f546219322cd51f8e94be1a22f0e300a09ff6224572aaed7b2911607de601701e9061112b90831515815260200190565b60405180910390a150565b61113e61162b565b601454600160b01b900460ff161561115557600080fd5b600e8190556040518181527fe8c946fc4a31c5e8b0827f04d65a6871a11eed499a6a4c7a5575984ee57fcaaf9060200161112b565b61119261162b565b60085481036111a057600080fd5b60055481101580156111b6575060065460085411155b6111bf57600080fd5b60088190556040518181527fdd892b1378d52503cedc68cc47f2cc1154ba54000d37699cd219ee8ee226031c9060200161112b565b6111fc61162b565b600d54600c54600b5461120f91906121a9565b61121991906121a9565b6103e81461122657600080fd5b600954831015801561123a5750600a548311155b61124357600080fd5b60095482101580156112575750600a548211155b61126057600080fd5b60095481101580156112745750600a548111155b61127d57600080fd5b600b839055600c829055600d81905560408051848152602081018490529081018290527f9a2ecc55bb71aaa59451a582a4c85358fe991317168eb337e3743fbd118563909060600160405180910390a1505050565b6112da61162b565b6002546001600160a01b038083169116036112f457600080fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f205890426c74334fba9f3d65990e94e55dac01584e054394ab50173c4a01da2d90600090a250565b61134661162b565b6001546001600160a01b039081169082160361136157600080fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6b438e6a8a59579ce6a4406cbd203b740e0d47b458aae6596339bcd40c40d159060200161112b565b600154604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018187875af11580156113fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141e9190612153565b6040516370a0823160e01b81523060048201529091506001600160a01b03821690632e1a7d4d9082906370a0823190602401602060405180830381865afa15801561146d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114919190612098565b6040518263ffffffff1660e01b81526004016114af91815260200190565b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b6114ec61162b565b6001600160a01b0381161580159061150f57506001600160a01b03811661dead14155b801561152957506014546001600160a01b03828116911614155b61153257600080fd5b601454600160a81b900460ff161561154957600080fd5b601480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f1d440445044acc67b35f82fda02fc5d23c22f882b4bde500e8949931a3d990e190600090a35050565b6115a361162b565b6001600160a01b03811661161f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a21565b61162881611bcf565b50565b3361163e6000546001600160a01b031690565b6001600160a01b031614610f825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a21565b600080612710600754655af3107a40006116ae9190612170565b6116b89190612187565b905060006116ce82670de0b6b3a76400006121a9565b6116e8836dffffffffffffffffffffffffffff8716612170565b6116f29190612187565b949350505050565b604080516002808252606082018352600092602083019080368337019050509050828160008151811061172f5761172f6121d2565b6001600160a01b03928316602091820292909201810191909152600154604080516315ab88c960e31b81529051919093169263ad5c464892600480830193919282900301816000875af115801561178a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ae9190612153565b816001815181106117c1576117c16121d2565b6001600160a01b03928316602091820292909201015260015460405163095ea7b360e01b81529082166004820152602481018490529084169063095ea7b3906044016020604051808303816000875af1158015611822573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184691906121e8565b5060015460405163791ac94760e01b81526001600160a01b039091169063791ac9479061188090859060009086903090429060040161224a565b600060405180830381600087803b15801561189a57600080fd5b505af11580156118ae573d6000803e3d6000fd5b50505050505050565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119249190612098565b90506000600360009054906101000a90046001600160a01b03166001600160a01b0316639358928b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561197b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199f9190612098565b6003546002546040516370a0823160e01b81526001600160a01b0391821660048201529293506000929116906370a0823190602401602060405180830381865afa1580156119f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a159190612098565b611a249064e8d4a51000612170565b905060006103e860085484611a399190612170565b611a439190612187565b9050808210611a5c57611a57601154611c1f565b611b55565b6000611a6883836120c7565b9050808510611a8257611a7d81601154611d52565b611b53565b6000611a8e86836120c7565b90506000611aa9611aa464e8d4a5100084612187565b611e68565b9050601154811115611aba57506011545b611ac381611c1f565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b309190612098565b9050600082601154611b4291906120c7565b9050611b4e8282611d52565b505050505b505b60006011556003546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611ba2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc69190612098565b60125550505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183526000926020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c46489250600480830192602092919082900301816000875af1158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf9190612153565b81600081518110611cc257611cc26121d2565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611cf357611cf36121d2565b6001600160a01b03928316602091820292909201015260015460405163b6f9de9560e01b815291169063b6f9de95908490611d3990600090869030904290600401612286565b6000604051808303818588803b15801561189a57600080fd5b60035460015460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af1158015611da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dcb91906121e8565b506001546003546004805460405163f305d71960e01b81526001600160a01b0393841692810192909252602482018690526000604483018190526064830152821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015611e43573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906114dd91906122bb565b604080516002808252606082018352600092839291906020830190803683375050600154604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c46489250600480830192602092919082900301816000875af1158015611ed8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efc9190612153565b81600081518110611f0f57611f0f6121d2565b6001600160a01b039283166020918202929092010152600354825191169082906001908110611f4057611f406121d2565b6001600160a01b0392831660209182029290920101526001546040516307c0329d60e21b81526000929190911690631f00ca7490611f8490879086906004016122e9565b600060405180830381865afa158015611fa1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fc99190810190612302565b905080600081518110611fde57611fde6121d2565b602002602001015192505050919050565b60006020828403121561200157600080fd5b5035919050565b6001600160a01b038116811461162857600080fd5b60006020828403121561202f57600080fd5b813561203a81612008565b9392505050565b801515811461162857600080fd5b60006020828403121561206157600080fd5b813561203a81612041565b60008060006060848603121561208157600080fd5b505081359360208301359350604090920135919050565b6000602082840312156120aa57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156120da576120da6120b1565b92915050565b80516dffffffffffffffffffffffffffff811681146120fe57600080fd5b919050565b60008060006060848603121561211857600080fd5b612121846120e0565b925061212f602085016120e0565b9150604084015163ffffffff8116811461214857600080fd5b809150509250925092565b60006020828403121561216557600080fd5b815161203a81612008565b80820281158282048414176120da576120da6120b1565b6000826121a457634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156120da576120da6120b1565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156121fa57600080fd5b815161203a81612041565b60008151808452602080850194506020840160005b8381101561223f5781516001600160a01b03168752958201959082019060010161221a565b509495945050505050565b85815284602082015260a06040820152600061226960a0830186612205565b6001600160a01b0394909416606083015250608001529392505050565b84815260806020820152600061229f6080830186612205565b6001600160a01b03949094166040830152506060015292915050565b6000806000606084860312156122d057600080fd5b8351925060208401519150604084015190509250925092565b8281526040602082015260006116f26040830184612205565b6000602080838503121561231557600080fd5b825167ffffffffffffffff8082111561232d57600080fd5b818501915085601f83011261234157600080fd5b815181811115612353576123536121bc565b8060051b604051601f19603f83011681018181108582111715612378576123786121bc565b60405291825284820192508381018501918883111561239657600080fd5b938501935b828510156123b45784518452938501939285019261239b565b9897505050505050505056fea2646970667358221220ea65ab9b9b255e89f121ebb863502e2f160c726980232a4b757ad4d1a5b9ceb664736f6c63430008190033

Verified Source Code Full Match

Compiler: v0.8.25+commit.b61c2a91 EVM: paris Optimization: Yes (800 runs)
X7RLiquidityHub.sol 543 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

/*

 /$$   /$$ /$$$$$$$$       /$$$$$$$$ /$$
| $$  / $$|_____ $$/      | $$_____/|__/
|  $$/ $$/     /$$/       | $$       /$$ /$$$$$$$   /$$$$$$  /$$$$$$$   /$$$$$$$  /$$$$$$
 \  $$$$/     /$$/        | $$$$$   | $$| $$__  $$ |____  $$| $$__  $$ /$$_____/ /$$__  $$
  >$$  $$    /$$/         | $$__/   | $$| $$  \ $$  /$$$$$$$| $$  \ $$| $$      | $$$$$$$$
 /$$/\  $$  /$$/          | $$      | $$| $$  | $$ /$$__  $$| $$  | $$| $$      | $$_____/
| $$  \ $$ /$$/           | $$      | $$| $$  | $$|  $$$$$$$| $$  | $$|  $$$$$$$|  $$$$$$$
|__/  |__/|__/            |__/      |__/|__/  |__/ \_______/|__/  |__/ \_______/ \_______/

Contract: Smart Contract for managing X7R fee tokens V2

Fixes:

    1. Ability to manage the release of tokens built up by the contract to not affect user trading with large slippage

This contract will NOT be renounced.

The following are the only functions that can be called on the contract that affect the contract:

    function setShares(uint256 distributeShare_, uint256 liquidityShare_, uint256 treasuryShare_) external onlyOwner {
        require(distributeShare + liquidityShare + treasuryShare == 1000);

        require(distributeShare_ >= minShare && distributeShare_ <= maxShare);
        require(liquidityShare_ >= minShare && liquidityShare_ <= maxShare);
        require(treasuryShare_ >= minShare && treasuryShare_ <= maxShare);

        distributeShare = distributeShare_;
        liquidityShare = liquidityShare_;
        treasuryShare = treasuryShare_;

        emit SharesSet(distributeShare_, liquidityShare_, treasuryShare_);
    }

    function setRouter(address router_) external onlyOwner {
        require(router_ != address(router));
        router = IUniswapV2Router(router_);
        emit RouterSet(router_);
    }

    function setOffRampPair(address offRampPairAddress) external onlyOwner {
        require(offRampPair != offRampPairAddress);
        offRampPair = offRampPairAddress;
        emit OffRampPairSet(offRampPairAddress);
    }

    function setBalanceThreshold(uint256 threshold) external onlyOwner {
        require(!balanceThresholdFrozen);
        balanceThreshold = threshold;
        emit BalanceThresholdSet(threshold);
    }

    function setMaxSlippage(uint256 newMaxSlippageBips) external onlyOwner {
        require(newMaxSlippageBips > 0 && newMaxSlippageBips <= 1000, "Invalid slippage value"); // Max 10% slippage
        uint256 oldSlippage = maxSlippageBips;
        maxSlippageBips = newMaxSlippageBips;
        emit MaxSlippageUpdated(oldSlippage, newMaxSlippageBips);
    }

    function setLiquidityRatioTarget(uint256 liquidityRatioTarget_) external onlyOwner {
        require(liquidityRatioTarget_ != liquidityRatioTarget);
        require(liquidityRatioTarget_ >= minLiquidityRatioTarget && liquidityRatioTarget <= maxLiquidityRatioTarget);
        liquidityRatioTarget = liquidityRatioTarget_;
        emit LiquidityRatioTargetSet(liquidityRatioTarget_);
    }

    function setLiquidityTokenReceiver(address liquidityTokenReceiver_) external onlyOwner {
        require(
            liquidityTokenReceiver_ != address(0)
            && liquidityTokenReceiver_ != address(0x000000000000000000000000000000000000dEaD)
            && liquidityTokenReceiver != liquidityTokenReceiver_
        );

        address oldLiquidityTokenReceiver = liquidityTokenReceiver;
        liquidityTokenReceiver = liquidityTokenReceiver_;
        emit LiquidityTokenReceiverSet(oldLiquidityTokenReceiver, liquidityTokenReceiver_);
    }

    function setDistributionTarget(address target) external onlyOwner {
        require(
            target != address(0)
            && target != address(0x000000000000000000000000000000000000dEaD)
            && distributeTarget != payable(target)
        );
        require(!distributeTargetFrozen);
        address oldTarget = address(distributeTarget);
        distributeTarget = payable(target);
        emit DistributeTargetSet(oldTarget, distributeTarget);
    }

    function setTreasuryTarget(address target) external onlyOwner {
        require(
            target != address(0)
            && target != address(0x000000000000000000000000000000000000dEaD)
            && treasuryTarget != payable(target)
        );
        require(!treasuryTargetFrozen);
        address oldTarget = address(treasuryTarget);
        treasuryTarget = payable(target);
        emit TreasuryTargetSet(oldTarget, target);
    }

    function freezeTreasuryTarget() external onlyOwner {
        require(!treasuryTargetFrozen);
        treasuryTargetFrozen = true;
        emit TreasuryTargetFrozen();
    }

    function freezeDistributeTarget() external onlyOwner {
        require(!distributeTargetFrozen);
        distributeTargetFrozen = true;
        emit DistributeTargetFrozen();
    }

    function freezeBalanceThreshold() external onlyOwner {
        require(!balanceThresholdFrozen);
        balanceThresholdFrozen = true;
        emit BalanceThresholdFrozen();
    }

These functions will be passed to DAO governance once the ecosystem stabilizes.

*/

abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(address owner_) {
        _transferOwnership(owner_);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

interface IERC20 {
    function circulatingSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
}

interface IUniswapV2Router {
    function WETH() external returns (address);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Pair {
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

interface ILiquidityHub {
    function processFees(address) external;
}

interface IX7EcosystemSplitter {
    function takeBalance() external;
}

interface IWETH {
    function withdraw(uint) external;
}

contract X7RLiquidityHub is Ownable, ILiquidityHub {
    IUniswapV2Router public router;
    address public offRampPair;

    IERC20 public x7r;
    address public liquidityTokenReceiver;
    uint256 public minLiquidityRatioTarget = 5;
    uint256 public maxLiquidityRatioTarget = 99;
    uint256 public maxSlippageBips = 200; // 2% default slippage

    uint256 public liquidityRatioTarget = 15;

    uint256 public minShare = 200;
    uint256 public maxShare = 500;

    uint256 public distributeShare = 300;
    uint256 public liquidityShare = 400;
    uint256 public treasuryShare = 300;

    uint256 public balanceThreshold = 1 ether;

    uint256 public distributeBalance;
    uint256 public treasuryBalance;
    uint256 public liquidityBalance;
    uint256 public x7rLiquidityBalance;

    address payable public distributeTarget;
    address payable public treasuryTarget;

    bool public distributeTargetFrozen;
    bool public treasuryTargetFrozen;
    bool public balanceThresholdFrozen;
    bool public slippageManagementEnabled = true;

    event SharesSet(uint256 distributeShare, uint256 liquidityShare, uint256 treasuryShare);
    event OffRampPairSet(address indexed offRampPair);
    event DistributeTargetSet(address indexed oldTarget, address indexed newTarget);
    event TreasuryTargetSet(address indexed oldTarget, address indexed newTarget);
    event MaxSlippageSet(uint256 oldSlippage, uint256 newSlippage);
    event SlippageManagementEnabledSet(bool enabled);
    event LiquidityRatioTargetSet(uint256 liquidityRatioTarget);
    event LiquidityTokenReceiverSet(address indexed oldReciever, address indexed newReceiver);
    event BalanceThresholdSet(uint256 threshold);
    event RouterSet(address router);
    event TreasuryTargetFrozen();
    event DistributeTargetFrozen();
    event BalanceThresholdFrozen();

    constructor(address x7r_, address router_, address _owner) Ownable(_owner) {
        router = IUniswapV2Router(router_);
        x7r = IERC20(x7r_);

        emit RouterSet(router_);
    }

    receive() external payable {}

    function setShares(uint256 distributeShare_, uint256 liquidityShare_, uint256 treasuryShare_) external onlyOwner {
        require(distributeShare + liquidityShare + treasuryShare == 1000);

        require(distributeShare_ >= minShare && distributeShare_ <= maxShare);
        require(liquidityShare_ >= minShare && liquidityShare_ <= maxShare);
        require(treasuryShare_ >= minShare && treasuryShare_ <= maxShare);

        distributeShare = distributeShare_;
        liquidityShare = liquidityShare_;
        treasuryShare = treasuryShare_;

        emit SharesSet(distributeShare_, liquidityShare_, treasuryShare_);
    }

    function setRouter(address router_) external onlyOwner {
        require(router_ != address(router));
        router = IUniswapV2Router(router_);
        emit RouterSet(router_);
    }

    function setOffRampPair(address offRampPairAddress) external onlyOwner {
        require(offRampPair != offRampPairAddress);
        offRampPair = offRampPairAddress;
        emit OffRampPairSet(offRampPairAddress);
    }

    function setBalanceThreshold(uint256 threshold) external onlyOwner {
        require(!balanceThresholdFrozen);
        balanceThreshold = threshold;
        emit BalanceThresholdSet(threshold);
    }

    function setMaxSlippage(uint256 newMaxSlippageBips) external onlyOwner {
        require(newMaxSlippageBips > 0 && newMaxSlippageBips <= 1000, "Invalid slippage value"); // Max 10% slippage
        uint256 oldSlippage = maxSlippageBips;
        maxSlippageBips = newMaxSlippageBips;
        emit MaxSlippageSet(oldSlippage, newMaxSlippageBips);
    }

    function setSlippageManagementEnabled(bool enabled) external onlyOwner {
        require(slippageManagementEnabled != enabled);
        slippageManagementEnabled = enabled;
        emit SlippageManagementEnabledSet(enabled);
    }

    function setLiquidityRatioTarget(uint256 liquidityRatioTarget_) external onlyOwner {
        require(liquidityRatioTarget_ != liquidityRatioTarget);
        require(liquidityRatioTarget_ >= minLiquidityRatioTarget && liquidityRatioTarget <= maxLiquidityRatioTarget);
        liquidityRatioTarget = liquidityRatioTarget_;
        emit LiquidityRatioTargetSet(liquidityRatioTarget_);
    }

    function setLiquidityTokenReceiver(address liquidityTokenReceiver_) external onlyOwner {
        require(
            liquidityTokenReceiver_ != address(0) &&
                liquidityTokenReceiver_ != address(0x000000000000000000000000000000000000dEaD) &&
                liquidityTokenReceiver != liquidityTokenReceiver_
        );

        address oldLiquidityTokenReceiver = liquidityTokenReceiver;
        liquidityTokenReceiver = liquidityTokenReceiver_;
        emit LiquidityTokenReceiverSet(oldLiquidityTokenReceiver, liquidityTokenReceiver_);
    }

    function setDistributionTarget(address target) external onlyOwner {
        require(
            target != address(0) &&
                target != address(0x000000000000000000000000000000000000dEaD) &&
                distributeTarget != payable(target)
        );
        require(!distributeTargetFrozen);
        address oldTarget = address(distributeTarget);
        distributeTarget = payable(target);
        emit DistributeTargetSet(oldTarget, distributeTarget);
    }

    function setTreasuryTarget(address target) external onlyOwner {
        require(
            target != address(0) &&
                target != address(0x000000000000000000000000000000000000dEaD) &&
                treasuryTarget != payable(target)
        );
        require(!treasuryTargetFrozen);
        address oldTarget = address(treasuryTarget);
        treasuryTarget = payable(target);
        emit TreasuryTargetSet(oldTarget, target);
    }

    function freezeTreasuryTarget() external onlyOwner {
        require(!treasuryTargetFrozen);
        treasuryTargetFrozen = true;
        emit TreasuryTargetFrozen();
    }

    function freezeDistributeTarget() external onlyOwner {
        require(!distributeTargetFrozen);
        distributeTargetFrozen = true;
        emit DistributeTargetFrozen();
    }

    function freezeBalanceThreshold() external onlyOwner {
        require(!balanceThresholdFrozen);
        balanceThresholdFrozen = true;
        emit BalanceThresholdFrozen();
    }

    function processFees(address tokenAddress) external {
        require(tokenAddress != address(0), "Invalid token address");
        require(IERC20(tokenAddress).balanceOf(address(this)) > 0, "No tokens to process");

        uint256 startingETHBalance = address(this).balance;
        uint256 tokensToSwap = IERC20(tokenAddress).balanceOf(address(this));

        if (tokenAddress == address(x7r)) {
            tokensToSwap -= x7rLiquidityBalance;
        }

        if (tokensToSwap > 0) {
            uint256 actualTokensToSwap = tokensToSwap;

            if (slippageManagementEnabled) {
                (uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(offRampPair).getReserves();
                uint112 tokenReserve = address(x7r) < router.WETH() ? reserve0 : reserve1;
                uint256 maxTokensForTargetSlippage = calculateMaxTokensForSlippage(tokenReserve);
                actualTokensToSwap = tokensToSwap < maxTokensForTargetSlippage
                    ? tokensToSwap
                    : maxTokensForTargetSlippage;
            }

            swapTokensForEth(tokenAddress, actualTokensToSwap);
        }

        // Rest of the function remains the same
        uint256 ETHForDistribution = address(this).balance - startingETHBalance;

        distributeBalance += (ETHForDistribution * distributeShare) / 1000;
        treasuryBalance += (ETHForDistribution * treasuryShare) / 1000;
        liquidityBalance = address(this).balance - distributeBalance - treasuryBalance;

        if (distributeBalance >= balanceThreshold) {
            sendDistributeBalance();
        }

        if (treasuryBalance >= balanceThreshold) {
            sendTreasuryBalance();
        }

        if (liquidityBalance >= balanceThreshold) {
            buyBackAndAddLiquidity();
        }
    }

    function sendDistributeBalance() public {
        if (distributeTarget == address(0)) {
            return;
        }

        IX7EcosystemSplitter(distributeTarget).takeBalance();

        uint256 ethToSend = distributeBalance;
        distributeBalance = 0;

        (bool success, ) = distributeTarget.call{ value: ethToSend }("");

        if (!success) {
            distributeBalance = ethToSend;
        }
    }

    function sendTreasuryBalance() public {
        if (treasuryTarget == address(0)) {
            return;
        }

        uint256 ethToSend = treasuryBalance;
        treasuryBalance = 0;

        (bool success, ) = treasuryTarget.call{ value: ethToSend }("");

        if (!success) {
            treasuryBalance = ethToSend;
        }
    }

    function buyBackAndAddLiquidity() internal {
        uint256 currentX7RBalance = x7r.balanceOf(address(this));
        uint256 circulatingSupply = x7r.circulatingSupply();
        uint256 pairX7RBalance = x7r.balanceOf(offRampPair) * 1e12;
        uint256 targetX7RLiquidity = (circulatingSupply * liquidityRatioTarget) / 1000;

        if (pairX7RBalance >= targetX7RLiquidity) {
            swapEthForTokens(liquidityBalance);
        } else {
            uint256 x7rNeeded = targetX7RLiquidity - pairX7RBalance;

            if (currentX7RBalance >= x7rNeeded) {
                addLiquidityETH(x7rNeeded, liquidityBalance);
            } else {
                uint256 x7rToBuy = x7rNeeded - currentX7RBalance;
                uint256 ethForX7R = estimateETHForTokens(x7rToBuy / 1e12);

                if (ethForX7R > liquidityBalance) {
                    ethForX7R = liquidityBalance;
                }

                swapEthForTokens(ethForX7R);

                uint256 newX7RBalance = x7r.balanceOf(address(this));
                uint256 ethLeft = liquidityBalance - ethForX7R;

                addLiquidityETH(newX7RBalance, ethLeft);
            }
        }

        liquidityBalance = 0;
        x7rLiquidityBalance = x7r.balanceOf(address(this));
    }

    function addLiquidityETH(uint256 tokenAmount, uint256 ethAmount) internal {
        x7r.approve(address(router), tokenAmount);
        router.addLiquidityETH{ value: ethAmount }(
            address(x7r),
            tokenAmount,
            0,
            0,
            liquidityTokenReceiver,
            block.timestamp
        );
    }

    function estimateETHForTokens(uint256 tokenAmount) internal returns (uint256) {
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(x7r);
        uint256[] memory amounts = router.getAmountsIn(tokenAmount, path);
        return amounts[0];
    }

    function swapTokensForEth(address tokenAddress, uint256 tokenAmount) internal {
        address[] memory path = new address[](2);
        path[0] = tokenAddress;
        path[1] = router.WETH();

        IERC20(tokenAddress).approve(address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
    }

    function swapEthForTokens(uint256 ethAmount) internal {
        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(x7r);
        router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: ethAmount }(
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function calculateMaxTokensForSlippage(uint112 tokenReserve) internal view returns (uint256) {
        uint256 slippagePercentage = (maxSlippageBips * 1e14) / 10000;
        uint256 maxTokens = (uint256(tokenReserve) * slippagePercentage) / (1e18 + slippagePercentage);

        return maxTokens;
    }

    function rescueWETH() external {
        address wethAddress = router.WETH();
        IWETH(wethAddress).withdraw(IERC20(wethAddress).balanceOf(address(this)));
    }
}

Read Contract

balanceThreshold 0xc3173774 → uint256
balanceThresholdFrozen 0xe0f0edc6 → bool
distributeBalance 0x7943da69 → uint256
distributeShare 0xe2568ad2 → uint256
distributeTarget 0xb5fb2174 → address
distributeTargetFrozen 0xcb3f4f17 → bool
liquidityBalance 0xc3926a29 → uint256
liquidityRatioTarget 0xc96f4d4d → uint256
liquidityShare 0x15291cd4 → uint256
liquidityTokenReceiver 0xf48167a5 → address
maxLiquidityRatioTarget 0x99eefadb → uint256
maxShare 0x5a75a809 → uint256
maxSlippageBips 0x0aeb46be → uint256
minLiquidityRatioTarget 0xdbc609f8 → uint256
minShare 0x8bb28de2 → uint256
offRampPair 0x7b31bd78 → address
owner 0x8da5cb5b → address
router 0xf887ea40 → address
slippageManagementEnabled 0xba67ed66 → bool
treasuryBalance 0x313dab20 → uint256
treasuryShare 0x7796ff37 → uint256
treasuryTarget 0xb68e204c → address
treasuryTargetFrozen 0xd938a3e6 → bool
x7r 0xb470fa61 → address
x7rLiquidityBalance 0xcef02201 → uint256

Write Contract 19 functions

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

freezeBalanceThreshold 0x73bdeb49
No parameters
freezeDistributeTarget 0x6aea97f0
No parameters
freezeTreasuryTarget 0x3802fa43
No parameters
processFees 0x61582eaa
address tokenAddress
renounceOwnership 0x715018a6
No parameters
rescueWETH 0xc38ec0b6
No parameters
sendDistributeBalance 0x099f833e
No parameters
sendTreasuryBalance 0x00e55312
No parameters
setBalanceThreshold 0x87020d6b
uint256 threshold
setDistributionTarget 0x517cafef
address target
setLiquidityRatioTarget 0x90d8dec7
uint256 liquidityRatioTarget_
setLiquidityTokenReceiver 0x77e7e202
address liquidityTokenReceiver_
setMaxSlippage 0x43f68a49
uint256 newMaxSlippageBips
setOffRampPair 0xbe1c7142
address offRampPairAddress
setRouter 0xc0d78655
address router_
setShares 0xa0885e93
uint256 distributeShare_
uint256 liquidityShare_
uint256 treasuryShare_
setSlippageManagementEnabled 0x7ee2dec3
bool enabled
setTreasuryTarget 0xe97ca4b1
address target
transferOwnership 0xf2fde38b
address newOwner

Recent Transactions

This address has 1 on-chain transactions, but only 1.1% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →