Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x7f5d879DFfa8BAa6b6893b1BAA456e1767b93AF4
Balance 0.013446 ETH
Nonce 1
Code Size 19035 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

19035 bytes
0x60806040526004361061037f575f3560e01c806377d563f8116101d3578063bb503adf116100fd578063dee184791161009d578063f14210a61161006d578063f14210a614610a6d578063f1512eba14610a8c578063f478a0f514610aab578063f715d99c14610aca575f5ffd5b8063dee18479146109fb578063e76a027914610a1a578063ef3881c814610a39578063f0fa55a914610a4e575f5ffd5b8063d52855c8116100d8578063d52855c814610993578063d626a959146109b2578063db52675c146109d1578063dda9046f146109e6575f5ffd5b8063bb503adf1461093e578063c67cc21014610969578063d02eb14b1461097e575f5ffd5b8063938c7c3a11610173578063a3d1acb011610143578063a3d1acb0146108c7578063a6888c35146108dc578063a70dd790146108f1578063a8c94d1b14610910575f5ffd5b8063938c7c3a1461084b57806396598cf41461086a57806397bbdb8c14610889578063a1db9782146108a8575f5ffd5b8063849cc7ef116101ae578063849cc7ef146107c95780638ac6d217146107f45780638da5cb5b146108085780638dbc640a1461082c575f5ffd5b806377d563f8146107775780637f28325f146107965780638456cb59146107b5575f5ffd5b806339d1fc82116102b45780634e6daca3116102545780636e4a37d2116102245780636e4a37d2146106d357806370807528146106e857806371e16e76146107075780637609d7f61461071c575f5ffd5b80634e6daca3146106695780635c975abb14610688578063631181b91461069f5780636a2f199c146106be575f5ffd5b80633f6f3cb51161028f5780633f6f3cb5146105f75780634a5e42b11461060c5780634cc5c1bd1461062b5780634d86fc561461064a575f5ffd5b806339d1fc82146105a55780633ee84091146105c45780633f4ba83a146105e3575f5ffd5b806314a105111161031f5780632630c12f116102fa5780632630c12f146105235780632975dfaf146105425780632cb15f811461057157806333968ded14610586575f5ffd5b806314a10511146104da578063158f4dea146104ef57806318f173ea1461050e575f5ffd5b80630758d9241161035a5780630758d9241461044357806309b0d50a1461047a5780630e88c6051461049c5780630fff6e47146104bb575f5ffd5b80630537eae01461038a578063062abb08146103b2578063067542bf14610422575f5ffd5b3661038657005b5f5ffd5b348015610395575f5ffd5b5061039f60075481565b6040519081526020015b60405180910390f35b3480156103bd575f5ffd5b506103fa6103cc366004614388565b60146020525f9081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016103a9565b34801561042d575f5ffd5b5061044161043c3660046143a3565b610ae9565b005b34801561044e575f5ffd5b50600354610462906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b348015610485575f5ffd5b5061048e610b26565b6040516103a99291906143fd565b3480156104a7575f5ffd5b506104416104b63660046143a3565b610c8b565b3480156104c6575f5ffd5b506104416104d53660046143a3565b610cbf565b3480156104e5575f5ffd5b5061039f60055481565b3480156104fa575f5ffd5b50610441610509366004614473565b610cf3565b348015610519575f5ffd5b5061039f600f5481565b34801561052e575f5ffd5b50600254610462906001600160a01b031681565b34801561054d575f5ffd5b5061056161055c366004614388565b610e76565b60405190151581526020016103a9565b34801561057c575f5ffd5b5061039f600c5481565b348015610591575f5ffd5b506104416105a0366004614388565b610eb8565b3480156105b0575f5ffd5b506104416105bf366004614388565b6114c5565b3480156105cf575f5ffd5b506104416105de3660046143a3565b6116c2565b3480156105ee575f5ffd5b506104416116f6565b348015610602575f5ffd5b5061039f60125481565b348015610617575f5ffd5b50610441610626366004614388565b61172f565b348015610636575f5ffd5b50610441610645366004614388565b611997565b348015610655575f5ffd5b506104416106643660046143a3565b611bf8565b348015610674575f5ffd5b506104416106833660046143a3565b611c2c565b348015610693575f5ffd5b5060015460ff16610561565b3480156106aa575f5ffd5b506104416106b93660046143a3565b611c60565b3480156106c9575f5ffd5b5061039f60095481565b3480156106de575f5ffd5b5061039f60115481565b3480156106f3575f5ffd5b50610441610702366004614388565b611c94565b348015610712575f5ffd5b5061039f600a5481565b348015610727575f5ffd5b5061075a610736366004614388565b60136020525f908152604090208054600182015460029092015460ff909116919083565b6040805193151584526020840192909252908201526060016103a9565b348015610782575f5ffd5b506104416107913660046143a3565b611d38565b3480156107a1575f5ffd5b506104416107b0366004614388565b611d8d565b3480156107c0575f5ffd5b50610441612226565b3480156107d4575f5ffd5b5061039f6107e33660046143a3565b60166020525f908152604090205481565b3480156107ff575f5ffd5b5061039f61225d565b348015610813575f5ffd5b506001546104629061010090046001600160a01b031681565b348015610837575f5ffd5b506104416108463660046143a3565b612490565b348015610856575f5ffd5b506104416108653660046144ab565b6124c4565b348015610875575f5ffd5b5061044161088436600461451d565b612c1f565b348015610894575f5ffd5b506104416108a33660046143a3565b612cf0565b3480156108b3575f5ffd5b506104416108c23660046144ab565b612d24565b3480156108d2575f5ffd5b5061039f60085481565b3480156108e7575f5ffd5b5061039f600e5481565b3480156108fc575f5ffd5b5061044161090b366004614589565b612ee5565b34801561091b575f5ffd5b5061056161092a366004614388565b60156020525f908152604090205460ff1681565b348015610949575f5ffd5b5061039f610958366004614388565b60176020525f908152604090205481565b348015610974575f5ffd5b5061039f600d5481565b348015610989575f5ffd5b5061039f600b5481565b34801561099e575f5ffd5b5061039f6109ad366004614388565b612fc5565b3480156109bd575f5ffd5b506104416109cc3660046143a3565b6131bb565b3480156109dc575f5ffd5b5061039f60045481565b3480156109f1575f5ffd5b5061039f60065481565b348015610a06575f5ffd5b50610441610a153660046143a3565b613210565b348015610a25575f5ffd5b50610441610a343660046143a3565b613244565b348015610a44575f5ffd5b5061039f60105481565b348015610a59575f5ffd5b50610441610a683660046143a3565b613278565b348015610a78575f5ffd5b50610441610a873660046143a3565b6132cd565b348015610a97575f5ffd5b50610441610aa63660046143a3565b613437565b348015610ab6575f5ffd5b50610441610ac5366004614589565b61346b565b348015610ad5575f5ffd5b50610462610ae43660046143a3565b6135ef565b60015461010090046001600160a01b03163314610b215760405162461bcd60e51b8152600401610b18906145bb565b60405180910390fd5b600755565b6060806018805480602002602001604051908101604052809291908181526020018280548015610b7d57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b5f575b50505050509150815167ffffffffffffffff811115610b9e57610b9e6145de565b604051908082528060200260200182016040528015610bf257816020015b610bdf60405180606001604052805f151581526020015f81526020015f81525090565b815260200190600190039081610bbc5790505b5090505f5b8251811015610c865760135f848381518110610c1557610c156145f2565b6020908102919091018101516001600160a01b031682528181019290925260409081015f208151606081018352815460ff161515815260018201549381019390935260020154908201528251839083908110610c7357610c736145f2565b6020908102919091010152600101610bf7565b509091565b60015461010090046001600160a01b03163314610cba5760405162461bcd60e51b8152600401610b18906145bb565b600855565b60015461010090046001600160a01b03163314610cee5760405162461bcd60e51b8152600401610b18906145bb565b600c55565b60015461010090046001600160a01b03163314610d225760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0384165f9081526013602052604090205460ff16610d5157610d4c84848461346b565b610da1565b60408051606081018252600180825260208083018781528385018781526001600160a01b038a165f9081526013909352949091209251835460ff1916901515178355519082015590516002909101555b6003546001600160a01b038086169163095ea7b391168315610dc35783610dc6565b5f195b6040518363ffffffff1660e01b8152600401610de3929190614606565b6020604051808303815f875af1158015610dff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e23919061461f565b5060408051848152602081018490529081018290526001600160a01b038516907f5348e0b22cfedd3aea3f44cad426af02e9f0fcb2afd8dd1a7ff9a4ba1e98b7159060600160405180910390a250505050565b6001600160a01b0381165f90815260176020526040812054808203610e9e5750600192915050565b5f600d5482610ead9190614652565b421015949350505050565b60015461010090046001600160a01b03163314610ee75760405162461bcd60e51b8152600401610b18906145bb565b610eef613617565b5f610efd6201518042614665565b6012545f8281526016602052604090205491925011610f5a5760405162461bcd60e51b815260206004820152601960248201527811185a5b1e481d1c985919481b1a5b5a5d081c995858da1959603a1b6044820152606401610b18565b6001600160a01b0382165f90815260146020908152604091829020825160a081018452815480825260018301549382019390935260028201549381019390935260038101546060840152600401546080830152610fe75760405162461bcd60e51b815260206004820152600b60248201526a2737903837b9b4ba34b7b760a91b6044820152606401610b18565b601054610ff890633b9aca00614684565b3a111561103c5760405162461bcd60e51b815260206004820152601260248201527108ec2e640e0e4d2c6ca40e8dede40d0d2ced60731b6044820152606401610b18565b61104583610e76565b6110615760405162461bcd60e51b8152600401610b189061469b565b5f6001600160a01b0384165f516020614a065f395f51905f52146110f0576002546040516341976e0960e01b81526001600160a01b038681166004830152909116906341976e0990602401602060405180830381865afa1580156110c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110eb91906146c7565b611167565b6002546040516341976e0960e01b81525f516020614a065f395f51905f5260048201526001600160a01b03909116906341976e0990602401602060405180830381865afa158015611143573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061116791906146c7565b905061117484838361366e565b6111c05760405162461bcd60e51b815260206004820152601760248201527f4e6f2076616c6964206578697420636f6e646974696f6e0000000000000000006044820152606401610b18565b6040805160028082526060820183525f9260208301908036833701905050905084815f815181106111f3576111f36145f2565b6001600160a01b03928316602091820292909201810191909152600354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561124a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061126e91906146de565b81600181518110611281576112816145f2565b6001600160a01b039283166020918202929092010152600354845160405163095ea7b360e01b81528884169363095ea7b3936112c293911691600401614606565b6020604051808303815f875af11580156112de573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061461f565b505f856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611340573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061136491906146f9565b61136f90600a6147fc565b845161137c908590614684565b6113869190614665565b90505f611392826138d8565b6003548651600e549293506001600160a01b03909116916318cbafe591908490879030906113c09042614652565b6040518663ffffffff1660e01b81526004016113e095949392919061480a565b5f604051808303815f875af11580156113fb573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114229190810190614845565b506001600160a01b0387165f81815260146020908152604080832083815560018101849055600281018490556003810184905560040192909255875182519081529081018790527fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d910160405180910390a25050505f8381526016602052604081208054935091506114b38361490d565b9190505550506114c260015f55565b50565b60015461010090046001600160a01b031633146114f45760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0381166115435760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7261636c65206164647265737360501b6044820152606401610b18565b6002546001600160a01b039081169082160361159a5760405162461bcd60e51b815260206004820152601660248201527553616d652061732063757272656e74206f7261636c6560501b6044820152606401610b18565b6040515f60248201819052906001600160a01b0383169060440160408051601f198184030181529181526020820180516001600160e01b03166341976e0960e01b179052516115e99190614925565b5f604051808303815f865af19150503d805f8114611622576040519150601f19603f3d011682016040523d82523d5f602084013e611627565b606091505b50509050806116785760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206f7261636c6520696e7465726661636500000000000000006044820152606401610b18565b600280546001600160a01b0319166001600160a01b0384169081179091556040517fefe8ab924ca486283a79dc604baa67add51afb82af1db8ac386ebbba643cdffd905f90a25050565b60015461010090046001600160a01b031633146116f15760405162461bcd60e51b8152600401610b18906145bb565b600955565b60015461010090046001600160a01b031633146117255760405162461bcd60e51b8152600401610b18906145bb565b61172d613904565b565b60015461010090046001600160a01b0316331461175e5760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0381165f9081526013602052604090205460ff166117b95760405162461bcd60e51b8152602060048201526011602482015270105cdcd95d081b9bdd08195b98589b1959607a1b6044820152606401610b18565b6001600160a01b0381165f90815260146020526040902054156118175760405162461bcd60e51b815260206004820152601660248201527541637469766520706f736974696f6e2065786973747360501b6044820152606401610b18565b6001600160a01b0381165f908152601360209081526040808320805460ff1990811682556001820185905560029091018490556015909252822080549091169055601854905b8181101561195f57826001600160a01b031660188281548110611882576118826145f2565b5f918252602090912001546001600160a01b031603611957576118a660018361493b565b8110156119215760186118ba60018461493b565b815481106118ca576118ca6145f2565b5f91825260209091200154601880546001600160a01b0390921691839081106118f5576118f56145f2565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b60188054806119325761193261494e565b5f8281526020902081015f1990810180546001600160a01b031916905501905561195f565b60010161185d565b506040516001600160a01b038316907f37803e2125c48ee96c38ddf04e826daf335b0e1603579040fd275aba6d06b6fc905f90a25050565b60015461010090046001600160a01b031633146119c65760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0381165f9081526013602052604090205460ff16611a225760405162461bcd60e51b8152602060048201526012602482015271105cdcd95d081b9bdd08185c1c1c9bdd995960721b6044820152606401610b18565b6001600160a01b0381165f90815260146020908152604091829020825160a08101845281548082526001830154938201939093526002820154938101939093526003810154606084015260040154608083015215611ad35760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f742072656d6f7665206173736574207769746820616374697665206044820152673837b9b4ba34b7b760c11b6064820152608401610b18565b60035460405163095ea7b360e01b81526001600160a01b038481169263095ea7b392611b0792909116905f90600401614606565b6020604051808303815f875af1158015611b23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b47919061461f565b506001600160a01b0382165f908152601360209081526040808320805460ff19908116825560018201859055600290910184905560159092528220805490911690555b60185481101561195f57826001600160a01b031660188281548110611bb157611bb16145f2565b5f918252602090912001546001600160a01b031603611bf057601854611bd99060019061493b565b81101561192157601880546118ba9060019061493b565b600101611b8a565b60015461010090046001600160a01b03163314611c275760405162461bcd60e51b8152600401610b18906145bb565b601055565b60015461010090046001600160a01b03163314611c5b5760405162461bcd60e51b8152600401610b18906145bb565b601155565b60015461010090046001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610b18906145bb565b601255565b60015461010090046001600160a01b03163314611cc35760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0381165f9081526013602052604090205460ff16611d185760405162461bcd60e51b815260206004820152600b60248201526a139bdd08195b98589b195960aa1b6044820152606401610b18565b6001600160a01b03165f908152601360205260409020805460ff19169055565b60015461010090046001600160a01b03163314611d675760405162461bcd60e51b8152600401610b18906145bb565b6064811115611d885760405162461bcd60e51b8152600401610b1890614962565b600555565b6001600160a01b0381165f908152601460209081526040808320815160a0810183528154808252600183015494820194909452600282015492810192909252600381015460608301526004015460808201529103611de9575050565b5f6001600160a01b0383165f516020614a065f395f51905f5214611e78576002546040516341976e0960e01b81526001600160a01b038581166004830152909116906341976e0990602401602060405180830381865afa158015611e4f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7391906146c7565b611eef565b6002546040516341976e0960e01b81525f516020614a065f395f51905f5260048201526001600160a01b03909116906341976e0990602401602060405180830381865afa158015611ecb573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eef91906146c7565b60208301519091505f90611f03838261493b565b611f0e906064614684565b611f189190614665565b9050611f2384610e76565b611f3f5760405162461bcd60e51b8152600401610b189061469b565b600b548110612220576040805160028082526060820183525f9260208301908036833701905050905084815f81518110611f7b57611f7b6145f2565b6001600160a01b03928316602091820292909201810191909152600354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611fd2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff691906146de565b81600181518110612009576120096145f2565b6001600160a01b039283166020918202929092010152600354855160405163095ea7b360e01b81528884169363095ea7b39361204a93911691600401614606565b6020604051808303815f875af1158015612066573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208a919061461f565b505f856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ec91906146f9565b6120f790600a6147fc565b8551612104908690614684565b61210e9190614665565b90505f61211a826138d8565b6003548751600e549293506001600160a01b03909116916318cbafe591908490879030906121489042614652565b6040518663ffffffff1660e01b815260040161216895949392919061480a565b5f604051808303815f875af1158015612183573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121aa9190810190614845565b506001600160a01b0387165f81815260146020908152604080832083815560018101849055600281018490556003810184905560040192909255885182519081529081018890527fbac9694ac0daa55169abd117086fe32c89401d9a3b15dd1d34e55e0aa4e47a9d910160405180910390a25050505b50505050565b60015461010090046001600160a01b031633146122555760405162461bcd60e51b8152600401610b18906145bb565b61172d613956565b5f80805b60185481101561248a575f6018828154811061227f5761227f6145f2565b5f9182526020808320909101546001600160a01b031680835260148252604092839020835160a081018552815480825260018301549482019490945260028201549481019490945260038101546060850152600401546080840152925015612480575f6001600160a01b0383165f516020614a065f395f51905f5214612370576002546040516341976e0960e01b81526001600160a01b038581166004830152909116906341976e0990602401602060405180830381865afa158015612347573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236b91906146c7565b6123e7565b6002546040516341976e0960e01b81525f516020614a065f395f51905f5260048201526001600160a01b03909116906341976e0990602401602060405180830381865afa1580156123c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e791906146c7565b90505f836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061244a91906146f9565b90505f61245882600a6147fc565b84516124649085614684565b61246e9190614665565b905061247a8188614652565b96505050505b5050600101612261565b50919050565b60015461010090046001600160a01b031633146124bf5760405162461bcd60e51b8152600401610b18906145bb565b600e55565b60015461010090046001600160a01b031633146124f35760405162461bcd60e51b8152600401610b18906145bb565b6124fb613617565b5f6125096201518042614665565b6012545f82815260166020526040902054919250116125665760405162461bcd60e51b815260206004820152601960248201527811185a5b1e481d1c985919481b1a5b5a5d081c995858da1959603a1b6044820152606401610b18565b61256e613991565b60105461257f90633b9aca00614684565b3a11156125c35760405162461bcd60e51b815260206004820152601260248201527108ec2e640e0e4d2c6ca40e8dede40d0d2ced60731b6044820152606401610b18565b5f6001600160a01b0384165f516020614a065f395f51905f52146125fd576001600160a01b0384165f908152601360205260409020612634565b5f516020614a065f395f51905f525f5260136020527fbe6c30520b3d8deacb33b9f68d6cf3c89a92460085a4ca8b69a3bd0d9245d3425b60408051606081018252825460ff161515808252600184015460208301526002909301549181019190915291506126a15760405162461bcd60e51b8152602060048201526011602482015270151bdad95b881b9bdd08195b98589b1959607a1b6044820152606401610b18565b60065483101580156126b557506007548311155b6126f85760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081d1c98591948185b5bdd5b9d60621b6044820152606401610b18565b61270184610e76565b61271d5760405162461bcd60e51b8152600401610b189061469b565b5f5f612728866139d7565b9150915060085482101561276e5760405162461bcd60e51b815260206004820152600d60248201526c53636f726520746f6f206c6f7760981b6044820152606401610b18565b82602001518110158015612786575082604001518111155b6127c85760405162461bcd60e51b81526020600482015260136024820152725072696365206f7574206f6620626f756e647360681b6044820152606401610b18565b5f670de0b6b3a76400006127dc8784614684565b6127e69190614665565b90505f6127f161225d565b6004549091506128018383614652565b61280c846064614684565b6128169190614665565b11156128645760405162461bcd60e51b815260206004820152601e60248201527f546f6f206d756368206578706f7375726520696e206f6e6520617373657400006044820152606401610b18565b600554476128728484614652565b61287d906064614684565b6128879190614665565b11156128d55760405162461bcd60e51b815260206004820152601760248201527f546f6f206d75636820746f74616c206578706f737572650000000000000000006044820152606401610b18565b6040805160028082526060820183525f926020830190803683375050600354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa15801561293c573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296091906146de565b815f81518110612972576129726145f2565b60200260200101906001600160a01b031690816001600160a01b03168152505088816001815181106129a6576129a66145f2565b60200260200101906001600160a01b031690816001600160a01b0316815250505f896001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a03573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a2791906146f9565b90505f85612a3683600a6147fc565b612a40908c614684565b612a4a9190614665565b90505f612a56826138d8565b90505f60035f9054906101000a90046001600160a01b03166001600160a01b0316637ff36ab58d848830600e5442612a8e9190614652565b6040518663ffffffff1660e01b8152600401612aad9493929190614984565b5f6040518083038185885af1158015612ac8573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052612af09190810190614845565b905060025f9054906101000a90046001600160a01b03166001600160a01b031663e95815228e6040518263ffffffff1660e01b8152600401612b4191906001600160a01b0391909116815260200190565b5f604051808303815f87803b158015612b58575f5ffd5b505af1158015612b6a573d5f5f3e3d5ffd5b505050505f81600181518110612b8257612b826145f2565b60200260200101519050612b978e828b614183565b8d6001600160a01b03167fa9a40dec7a304e5915d11358b968c1e8d365992abf20f82285d1df1b30c8e24c828b604051612bdb929190918252602082015260400190565b60405180910390a25050505f8981526016602052604081208054995097509550612c0c945087935061490d92505050565b919050555050612c1b60015f55565b5050565b60015461010090046001600160a01b03163314612c4e5760405162461bcd60e51b8152600401610b18906145bb565b828114612c8f5760405162461bcd60e51b815260206004820152600f60248201526e098cadccee8d040dad2e6dac2e8c6d608b1b6044820152606401610b18565b5f5b83811015612ce957612ce1858583818110612cae57612cae6145f2565b9050602002016020810190612cc39190614388565b848484818110612cd557612cd56145f2565b905060200201356124c4565b600101612c91565b5050505050565b60015461010090046001600160a01b03163314612d1f5760405162461bcd60e51b8152600401610b18906145bb565b600a55565b60015461010090046001600160a01b03163314612d535760405162461bcd60e51b8152600401610b18906145bb565b612d5b613617565b6040516370a0823160e01b815230600482015282905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015612da1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc591906146c7565b905080831115612e0e5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610b18565b60015460405163a9059cbb60e01b81526001600160a01b038085169263a9059cbb92612e4892610100909204909116908790600401614606565b6020604051808303815f875af1158015612e64573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e88919061461f565b506001546040516001600160a01b036101009092048216918616907f8210728e7c071f615b840ee026032693858fbcd5e5359e67e438c890f59e562090612ed29087815260200190565b60405180910390a35050612c1b60015f55565b60015461010090046001600160a01b03163314612f145760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0383165f9081526013602052604090205460ff16612f6f5760405162461bcd60e51b8152602060048201526011602482015270105cdcd95d081b9bdd08195b98589b1959607a1b6044820152606401610b18565b60408051606081018252600180825260208083019586528284019485526001600160a01b03969096165f9081526013909652919094209351845460ff191690151517845591519183019190915551600290910155565b6001600160a01b0381165f908152601460209081526040808320815160a08101835281548082526001830154948201949094526002820154928101929092526003810154606083015260040154608082015290820361302657505f92915050565b5f6001600160a01b0384165f516020614a065f395f51905f52146130b5576002546040516341976e0960e01b81526001600160a01b038681166004830152909116906341976e0990602401602060405180830381865afa15801561308c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b091906146c7565b61312c565b6002546040516341976e0960e01b81525f516020614a065f395f51905f5260048201526001600160a01b03909116906341976e0990602401602060405180830381865afa158015613108573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061312c91906146c7565b90505f846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561316b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061318f91906146f9565b905061319c81600a6147fc565b83516131a89084614684565b6131b29190614665565b95945050505050565b60015461010090046001600160a01b031633146131ea5760405162461bcd60e51b8152600401610b18906145bb565b606481111561320b5760405162461bcd60e51b8152600401610b1890614962565b600455565b60015461010090046001600160a01b0316331461323f5760405162461bcd60e51b8152600401610b18906145bb565b600b55565b60015461010090046001600160a01b031633146132735760405162461bcd60e51b8152600401610b18906145bb565b600655565b60015461010090046001600160a01b031633146132a75760405162461bcd60e51b8152600401610b18906145bb565b60648111156132c85760405162461bcd60e51b8152600401610b1890614962565b600f55565b60015461010090046001600160a01b031633146132fc5760405162461bcd60e51b8152600401610b18906145bb565b613304613617565b4781111561334b5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606401610b18565b6001546040515f9161010090046001600160a01b03169083908381818185875af1925050503d805f811461339a576040519150601f19603f3d011682016040523d82523d5f602084013e61339f565b606091505b50509050806133e75760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610b18565b6001546040518381526101009091046001600160a01b0316907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2506114c260015f55565b60015461010090046001600160a01b031633146134665760405162461bcd60e51b8152600401610b18906145bb565b600d55565b60015461010090046001600160a01b0316331461349a5760405162461bcd60e51b8152600401610b18906145bb565b6001600160a01b0383165f9081526013602052604090205460ff16156134f25760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481859191959609a1b6044820152606401610b18565b60408051606081018252600180825260208083018681528385018681526001600160a01b0389165f908152601384528681209551865460ff191690151517865591519385019390935591516002909301929092556015909152205460ff166135b7576018805460018082019092557fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0180546001600160a01b0319166001600160a01b0386169081179091555f908152601560205260409020805460ff191690911790555b6040516001600160a01b038416907f0e3c58ebfb2e7465fbb1c32e6b4f40c3c4f5ca77e8218a386aff8617831260d7905f90a2505050565b601881815481106135fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b60025f54036136685760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b18565b60025f55565b60608201515f90819083116136875760019150506138d1565b8360800151831061369c5760019150506138d1565b600a5484604001516136ae9190614652565b42106136be5760019150506138d1565b600254604051631f67214b60e11b81526001600160a01b0387811660048301525f928392911690633ece4296906024016040805180830381865afa158015613708573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061372c91906149b8565b60025460405163079aac9360e11b81526001600160a01b038b811660048301529395509193506046921690630f35592690602401602060405180830381865afa15801561377b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061379f91906146c7565b11156137bb57808212156137bb57826137b78161490d565b9350505b808212156138c757600254604051630f29ff8b60e41b81525f916001600160a01b03169063f29ff8b0906137f6908b90600990600401614606565b602060405180830381865afa158015613811573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061383591906146c7565b600254604051630f29ff8b60e41b81529192505f916001600160a01b039091169063f29ff8b09061386d908c90601590600401614606565b602060405180830381865afa158015613888573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ac91906146c7565b9050808210156138c457846138c08161490d565b9550505b50505b5050600954111590505b9392505050565b5f6064600f5460646138ea919061493b565b6138f49084614684565b6138fe9190614665565b92915050565b61390c614234565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b61395e613991565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833613939565b60015460ff161561172d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b18565b5f80806001600160a01b0384165f516020614a065f395f51905f52146139fd5783613a0c565b5f516020614a065f395f51905f525b90505f6001600160a01b0385165f516020614a065f395f51905f5214613a48576001600160a01b0385165f908152601360205260409020613a7f565b5f516020614a065f395f51905f525f5260136020527fbe6c30520b3d8deacb33b9f68d6cf3c89a92460085a4ca8b69a3bd0d9245d3425b60408051606081018252825460ff16151581526001830154602082015260029283015481830152915490516341976e0960e01b81526001600160a01b0385811660048301529293509116906341976e0990602401602060405180830381865afa158015613aee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1291906146c7565b600254604051636447798760e11b81529194505f916001600160a01b039091169063c88ef30e90613b4a908690600590600401614606565b602060405180830381865afa158015613b65573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8991906146c7565b9050808411613bcc5760405162461bcd60e51b815260206004820152600f60248201526e50726963652062656c6f7720534d4160881b6044820152606401610b18565b600254604051630cae548f60e11b81526001600160a01b0385811660048301525f92169063195ca91e90602401602060405180830381865afa158015613c14573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3891906146c7565b9050600c54811315613cd5576001600160a01b0387165f90815260176020526040902054801580613c755750600d54613c719082614652565b4210155b15613c99576001600160a01b0388165f908152601760205260409020429055613cd3565b60405162461bcd60e51b815260206004820152600f60248201526e436f6f6c646f776e2061637469766560881b6044820152606401610b18565b505b6002546040516302ca469760e01b81526001600160a01b0386811660048301525f9283929116906302ca469790602401606060405180830381865afa158015613d20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d4491906149da565b92505091508187118015613d5757508087105b613da35760405162461bcd60e51b815260206004820152601d60248201527f5072696365206f75747369646520426f6c6c696e6765722042616e64730000006044820152606401610b18565b84602001518710158015613dbb575084604001518711155b613dfd5760405162461bcd60e51b81526020600482015260136024820152725072696365206f7574206f6620626f756e647360681b6044820152606401610b18565b60025460405163079aac9360e11b81526001600160a01b038b811660048301525f9a506023921690630f35592690602401602060405180830381865afa158015613e49573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e6d91906146c7565b108015613f555750600254604051630f29ff8b60e41b81526001600160a01b039091169063f29ff8b090613ea8908c90601490600401614606565b602060405180830381865afa158015613ec3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ee791906146c7565b60025460405163a8d2c30560e01b81526001600160a01b038c811660048301529091169063a8d2c30590602401602060405180830381865afa158015613f2f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f5391906146c7565b115b15613f6857613f65600289614652565b97505b600254604051631f67214b60e11b81526001600160a01b0388811660048301525f928392911690633ece4296906024016040805180830381865afa158015613fb2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd691906149b8565b60025460405163079aac9360e11b81526001600160a01b038f811660048301529395509193506023921690630f35592690602401602060405180830381865afa158015614025573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061404991906146c7565b10801561405557508082135b156140685761406560028b614652565b99505b6140718b61427d565b156140845761408160018b614652565b99505b600254604051630f29ff8b60e41b81526001600160a01b039091169063f29ff8b0906140b7908b90601490600401614606565b602060405180830381865afa1580156140d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f691906146c7565b60025460405163a8d2c30560e01b81526001600160a01b038b811660048301529091169063a8d2c30590602401602060405180830381865afa15801561413e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416291906146c7565b111561417657896141728161490d565b9a50505b5050505050505050915091565b5f6064600b546064614195919061493b565b61419f9084614684565b6141a99190614665565b90505f606460115460646141bd9190614652565b6141c79085614684565b6141d19190614665565b6040805160a08101825295865260208087019586524287830190815260608801958652608088019384526001600160a01b039098165f90815260149091522094518555925160018501555092516002830155915160038201559051600490910155565b60015460ff1661172d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b18565b600254604051630f29ff8b60e41b81525f9182916001600160a01b039091169063f29ff8b0906142b4908690600990600401614606565b602060405180830381865afa1580156142cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f391906146c7565b600254604051630f29ff8b60e41b81529192505f916001600160a01b039091169063f29ff8b09061432b908790601590600401614606565b602060405180830381865afa158015614346573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061436a91906146c7565b9091119392505050565b6001600160a01b03811681146114c2575f5ffd5b5f60208284031215614398575f5ffd5b81356138d181614374565b5f602082840312156143b3575f5ffd5b5035919050565b5f8151808452602084019350602083015f5b828110156143f35781516001600160a01b03168652602095860195909101906001016143cc565b5093949350505050565b604081525f61440f60408301856143ba565b82810360208401528084518083526020830191506020860192505f5b8181101561446757835180511515845260208101516020850152604081015160408501525060608301925060208401935060018101905061442b565b50909695505050505050565b5f5f5f5f60808587031215614486575f5ffd5b843561449181614374565b966020860135965060408601359560600135945092505050565b5f5f604083850312156144bc575f5ffd5b82356144c781614374565b946020939093013593505050565b5f5f83601f8401126144e5575f5ffd5b50813567ffffffffffffffff8111156144fc575f5ffd5b6020830191508360208260051b8501011115614516575f5ffd5b9250929050565b5f5f5f5f60408587031215614530575f5ffd5b843567ffffffffffffffff811115614546575f5ffd5b614552878288016144d5565b909550935050602085013567ffffffffffffffff811115614571575f5ffd5b61457d878288016144d5565b95989497509550505050565b5f5f5f6060848603121561459b575f5ffd5b83356145a681614374565b95602085013595506040909401359392505050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b6001600160a01b03929092168252602082015260400190565b5f6020828403121561462f575f5ffd5b815180151581146138d1575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156138fe576138fe61463e565b5f8261467f57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176138fe576138fe61463e565b60208082526012908201527110dbdbdb191bdddb881a5b881959999958dd60721b604082015260600190565b5f602082840312156146d7575f5ffd5b5051919050565b5f602082840312156146ee575f5ffd5b81516138d181614374565b5f60208284031215614709575f5ffd5b815160ff811681146138d1575f5ffd5b6001815b6001841115614754578085048111156147385761473861463e565b600184161561474657908102905b60019390931c92800261471d565b935093915050565b5f8261476a575060016138fe565b8161477657505f6138fe565b816001811461478c5760028114614796576147b2565b60019150506138fe565b60ff8411156147a7576147a761463e565b50506001821b6138fe565b5060208310610133831016604e8410600b84101617156147d5575081810a6138fe565b6147e15f198484614719565b805f19048211156147f4576147f461463e565b029392505050565b5f6138d160ff84168361475c565b85815284602082015260a060408201525f61482860a08301866143ba565b6001600160a01b0394909416606083015250608001529392505050565b5f60208284031215614855575f5ffd5b815167ffffffffffffffff81111561486b575f5ffd5b8201601f8101841361487b575f5ffd5b805167ffffffffffffffff811115614895576148956145de565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156148c2576148c26145de565b6040529182526020818401810192908101878411156148df575f5ffd5b6020850194505b83851015614902578451808252602095860195909350016148e6565b509695505050505050565b5f6001820161491e5761491e61463e565b5060010190565b5f82518060208501845e5f920191825250919050565b818103818111156138fe576138fe61463e565b634e487b7160e01b5f52603160045260245ffd5b6020808252600890820152670a8dede40d0d2ced60c31b604082015260600190565b848152608060208201525f61499c60808301866143ba565b6001600160a01b03949094166040830152506060015292915050565b5f5f604083850312156149c9575f5ffd5b505080516020909101519092909150565b5f5f5f606084860312156149ec575f5ffd5b505081516020830151604090930151909492935091905056fe000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea2646970667358221220a886eef5c9d64e0f9b362c96d9e0c5331f4dd639ce1673988eb0c0f8ddf6389a64736f6c634300081e0033

Verified Source Code Partial Match

Compiler: v0.8.30+commit.73712a01 EVM: prague Optimization: Yes (200 runs)
InvestmentBot.sol 1163 lines
// SPDX-License-Identifier: MIT




// File: @openzeppelin/contracts/token/ERC20/IERC20.sol




// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)


pragma solidity ^0.8.29;


/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);


    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);




    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);


    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);


    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);


    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);


    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);


    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}


// File: @openzeppelin/contracts/security/ReentrancyGuard.sol




// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)


pragma solidity ^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() {
        _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 making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }


    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");


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


    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }


    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}


// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol




// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)


pragma solidity ^0.8.20;




/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);


    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);


    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File: @openzeppelin/contracts/utils/Context.sol




// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)


pragma solidity ^0.8.20;


/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */


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


    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }


    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}


// File: @openzeppelin/contracts/security/Pausable.sol




// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)


pragma solidity ^0.8.0;




/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);


    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);


    bool private _paused;


    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }


    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }


    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }


    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }


    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }


    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }


    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }


    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}


// File: Investmentbot.sol




pragma solidity ^0.8.29;










// Chainlink Aggregator Interface (add this)
interface AggregatorV3Interface {
    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound
        );
}


interface PriceOracle {
    function getPrice(address token) external view returns (uint256);
    function getSMA(address token, uint256 numDays) external view returns (uint256);
    function getRSI(address token) external view returns (uint256);
    function getMACD(address token) external view returns (int256, int256);
    function getOBV(address token) external view returns (uint256);
    function getEMA(address token, uint256 numDays) external view returns (uint256);
    function getBBands(address token) external view returns (uint256, uint256, uint256);
    function getZScore(address token) external view returns (int256);
    function getMarketCap(address token) external view returns (uint256);
    function getVolume(address token) external view returns (uint256);
    function updatePriceTimestamp(address token) external;
    function isListedOnTopExchange(address token) external view returns (bool);
    function getSpread(address token) external view returns (uint256);
    function hasBullishOBVDivergence(address token) external view returns (bool);
}


interface IUniswapV2Router {
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function WETH() external pure returns (address);
}


contract InvestmentBot is ReentrancyGuard, Pausable {
    address public owner;
    address private constant ETH = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    PriceOracle public priceOracle;
    IUniswapV2Router public dexRouter;


    uint256 public maxSingleAssetExposure = 20;
    uint256 public maxTotalExposure = 70;
    uint256 public minTradeAmount = 0.002 ether;
    uint256 public maxTradeAmount = 0.01 ether;
    uint256 public minScoreToBuy = 2;
    uint256 public minScoreToSell = 1;
    uint256 public maxHoldDuration = 5 days;
    uint256 public maxDrawdownPercent = 5;
    uint256 public zCooldownThreshold = 25;
    uint256 public zCooldownPeriod = 10 minutes;
    uint256 public transactionDeadline = 15 minutes;
    uint256 public maxAllowedSlippagePercent = 2;
    uint256 public maxGasPriceWei = 30;
    uint256 public takeProfitPercent = 15;
    uint256 public maxDailyTrades = 50;


    struct AssetConfig {
        bool enabled;
        uint256 minPrice;
        uint256 maxPrice;
    }


    struct AssetPosition {
        uint256 amount;
        uint256 entryPrice;
        uint256 entryTimestamp;
        uint256 stopLossPrice;
        uint256 takeProfitPrice;
    }


    mapping(address => AssetConfig) public assetConfigs;
    mapping(address => AssetPosition) public assetPositions;
    mapping(address => bool) public isTracked;
    mapping(uint256 => uint256) public tradesPerDay;
    mapping(address => uint256) public lastZCooldown;
    address[] public trackedAssets;


    event AssetAdded(address indexed token);
    event Bought(address indexed token, uint256 amount, uint256 price);
    event Sold(address indexed token, uint256 amount, uint256 price);
    event Withdrawn(address indexed to, uint256 amount);
    event TokenWithdrawn(address indexed token, address indexed to, uint256 amount);
    event PriceOracleUpdated(address indexed newOracle);
   
    modifier onlyOwner() {
        require(msg.sender == owner, "Not owner");
        _;
    }


    modifier enforceTradeLimit() {
        uint256 today = block.timestamp / 1 days;
        require(tradesPerDay[today] < maxDailyTrades, "Daily trade limit reached");
        _;
        tradesPerDay[today]++;
    }


    constructor(address _oracle, address _dexRouter) {
        owner = msg.sender;
        priceOracle = PriceOracle(_oracle);
        dexRouter = IUniswapV2Router(_dexRouter);
    }


    function updatePriceOracle(address newOracle) external onlyOwner {
    require(newOracle != address(0), "Invalid oracle address");
    require(newOracle != address(priceOracle), "Same as current oracle");
   
    // Verify the new oracle has the required functions
    (bool success, ) = newOracle.call(
        abi.encodeWithSignature("getPrice(address)", address(0))
    );
    require(success, "Invalid oracle interface");
   
    priceOracle = PriceOracle(newOracle);
    emit PriceOracleUpdated(newOracle);
}


    function addAsset(address token, uint256 minPrice, uint256 maxPrice) public onlyOwner {
    require(!assetConfigs[token].enabled, "Already added");
    assetConfigs[token] = AssetConfig(true, minPrice, maxPrice);
    if (!isTracked[token]) {
        trackedAssets.push(token);
        isTracked[token] = true;
    }
    emit AssetAdded(token);
}
   


function removeAsset(address token) external onlyOwner {
    // Validate token is configured and has no active positions
    require(assetConfigs[token].enabled, "Asset not enabled");
    require(assetPositions[token].amount == 0, "Active position exists");
   
    // Clean up mappings
    delete assetConfigs[token];
    isTracked[token] = false;
   
    // Remove from trackedAssets array (gas-efficient method)
    uint256 length = trackedAssets.length;
    for (uint256 i = 0; i < length; i++) {
        if (trackedAssets[i] == token) {
            // Swap with last element and pop
            if (i < length - 1) {
                trackedAssets[i] = trackedAssets[length - 1];
            }
            trackedAssets.pop();
            break;
        }
    }


    // Emit event for off-chain tracking
    emit AssetRemoved(token);
}
function updateAssetPriceRange(
    address token,
    uint256 newMinPrice,
    uint256 newMaxPrice
) public onlyOwner {
    require(assetConfigs[token].enabled, "Asset not enabled");
    assetConfigs[token] = AssetConfig(true, newMinPrice, newMaxPrice);
}
// Add this event definition with your other events
event AssetRemoved(address indexed token);


        function disableAsset(address token) external onlyOwner {
    require(assetConfigs[token].enabled, "Not enabled");
    assetConfigs[token].enabled = false;
}










function approveAsset(
    address token,
    uint256 minPrice,
    uint256 maxPrice,
    uint256 amountToApprove
) external onlyOwner {
    if (!assetConfigs[token].enabled) {
        // Directly call addAsset instead of using this.addAsset()
        addAsset(token, minPrice, maxPrice);
    } else {
        // Directly call updateAssetPriceRange
        assetConfigs[token] = AssetConfig(true, minPrice, maxPrice);
    }
   
    // Approval logic remains the same
    IERC20(token).approve(
        address(dexRouter),
        amountToApprove == 0 ? type(uint256).max : amountToApprove
    );
   
    emit TokenApproved(token, minPrice, maxPrice, amountToApprove);
}


    event TokenApproved(
    address indexed token,
    uint256 minPrice,
    uint256 maxPrice,
    uint256 amountApproved
);


    receive() external payable {}


    function getAllApprovedTokens() external view returns (
    address[] memory tokens,
    AssetConfig[] memory configs
) {
    tokens = trackedAssets;
    configs = new AssetConfig[](tokens.length);
   
    for (uint256 i = 0; i < tokens.length; i++) {
        configs[i] = assetConfigs[tokens[i]];
    }
   
    return (tokens, configs);
}


    function removeApprovedAsset(address token) external onlyOwner {
    require(assetConfigs[token].enabled, "Asset not approved");
   
    // Check for and handle any active position
    AssetPosition memory position = assetPositions[token];
    if (position.amount > 0) {
        // Option 1: Revert if position exists (safest)
        revert("Cannot remove asset with active position");
       
        // Option 2: Alternatively, you could automatically sell the position:
        // sellAsset(token);
    }


    // Revoke approval from Uniswap router
    IERC20(token).approve(address(dexRouter), 0);
   
    // Clean up storage
    delete assetConfigs[token];
    isTracked[token] = false;
   
    // Remove from trackedAssets array
    for (uint256 i = 0; i < trackedAssets.length; i++) {
        if (trackedAssets[i] == token) {
            if (i < trackedAssets.length - 1) {
                trackedAssets[i] = trackedAssets[trackedAssets.length - 1];
            }
            trackedAssets.pop();
            break;
        }
    }


    emit AssetRemoved(token);
}




    function batchBuyAssets(address[] calldata tokens, uint256[] calldata ethAmounts) external onlyOwner {
        require(tokens.length == ethAmounts.length, "Length mismatch");
        for (uint i = 0; i < tokens.length; i++) {
            buyAsset(tokens[i], ethAmounts[i]);
        }
    }


    function getTotalExposure() public view returns (uint256) {
    uint256 total = 0;
    for (uint i = 0; i < trackedAssets.length; i++) {
        address token = trackedAssets[i];
        AssetPosition memory p = assetPositions[token];
        if (p.amount > 0) {
            // MODIFIED: Add ETH check
            uint256 price = (token == ETH) ?
                priceOracle.getPrice(ETH) :
                priceOracle.getPrice(token);
            uint8 decimals = IERC20Metadata(token).decimals();
            uint256 tokenValue = (price * p.amount) / (10 ** decimals);
            total += tokenValue;
        }
    }
    return total;
}


function canPerformAction(address token) public view returns (bool) {
    uint256 lastCooldown = lastZCooldown[token];
    if (lastCooldown == 0) {
        return true; // No cooldown, action can be performed
    }


    // Check if the cooldown period has passed
    uint256 cooldownEnd = lastCooldown + zCooldownPeriod;
    return block.timestamp >= cooldownEnd;
}


    function getSingleExposure(address token) public view returns (uint256) {
    AssetPosition memory p = assetPositions[token];
    if (p.amount == 0) return 0;
   
    // MODIFIED: Add ETH check
    uint256 price = (token == ETH) ?
        priceOracle.getPrice(ETH) :
        priceOracle.getPrice(token);
    uint8 decimals = IERC20Metadata(token).decimals();
    return (price * p.amount) / (10 ** decimals);
}


    function autoStopLoss(address token) external {
        AssetPosition memory position = assetPositions[token];
        if (position.amount == 0) return;


        uint256 currentPrice = (token == ETH) ?
            priceOracle.getPrice(ETH) :
            priceOracle.getPrice(token);
        uint256 drawdown = ((position.entryPrice - currentPrice) * 100) / position.entryPrice;
        require(canPerformAction(token), "Cooldown in effect");


        if (drawdown >= maxDrawdownPercent) {
            address[] memory path = new address[](2);
            path[0] = token;
            path[1] = dexRouter.WETH();


            IERC20(token).approve(address(dexRouter), position.amount);
            uint256 expectedOut = (position.amount * currentPrice) / (10 ** IERC20Metadata(token).decimals());
            uint256 amountOutMin = calculateAmountOutMin(expectedOut);


dexRouter.swapExactTokensForETH(
    position.amount,
    amountOutMin,
    path,
    address(this),
    block.timestamp + transactionDeadline
);


            delete assetPositions[token];
            emit Sold(token, position.amount, currentPrice);
        }
    }


    function pause() external onlyOwner {
    _pause();  // Pauses the contract
}


function unpause() external onlyOwner {
    _unpause();  // Unpauses the contract
}
    function setMaxDrawdownPercent(uint256 _value) external onlyOwner {
    maxDrawdownPercent = _value;
}


function setTakeProfitPercent(uint256 _value) external onlyOwner {
    takeProfitPercent = _value;
}


function setMinScoreToBuy(uint256 _value) external onlyOwner {
    minScoreToBuy = _value;
}


function setMinScoreToSell(uint256 _value) external onlyOwner {
    minScoreToSell = _value;
}


function setSlippage(uint256 _percent) external onlyOwner {
    require(_percent <= 100, "Too high");
    maxAllowedSlippagePercent = _percent;
}


    function withdrawETH(uint256 amount) external onlyOwner nonReentrant {
    require(amount <= address(this).balance, "Insufficient balance");
    // Using call with empty data
    (bool sent, ) = owner.call{value: amount}("");
    require(sent, "Failed to send Ether");
    emit Withdrawn(owner, amount);
}


    function withdrawERC20(address token, uint256 amount) external onlyOwner nonReentrant {
        IERC20 erc20Token = IERC20(token);
        uint256 tokenBalance = erc20Token.balanceOf(address(this));
        require(amount <= tokenBalance, "Insufficient balance");
        erc20Token.transfer(owner, amount);
        emit TokenWithdrawn(token, owner, amount);
    }


    function isLiquid(address token) internal view returns (bool) {
    uint256 volume = priceOracle.getVolume(token);
    uint256 marketCap = priceOracle.getMarketCap(token);
    return (volume * 100) / marketCap >= 5; // 5% ratio
}


function isEMABullish(address token) internal view returns (bool) {
    uint ema9 = priceOracle.getEMA(token, 9);
    uint ema21 = priceOracle.getEMA(token, 21);
    return ema9 > ema21;
}


    function isOnTopTierExchange(address token) internal view returns (bool) {
    return priceOracle.isListedOnTopExchange(token);
}


    function isSpreadAcceptable(address token) internal view returns (bool) {
    uint256 spread = priceOracle.getSpread(token);
    return spread < 1 * 10**16; // 1% in basis points
}


    function setMaxGasPriceWei(uint256 _value) external onlyOwner {
    maxGasPriceWei = _value;
}


function setTransactionDeadline(uint256 _seconds) external onlyOwner {
    transactionDeadline = _seconds;
}


function setMaxSingleAssetExposure(uint256 _percent) external onlyOwner {
    require(_percent <= 100, "Too high");
    maxSingleAssetExposure = _percent;
}


function setMaxTotalExposure(uint256 _percent) external onlyOwner {
    require(_percent <= 100, "Too high");
    maxTotalExposure = _percent;
}


function setMinTradeAmount(uint256 _amount) external onlyOwner {
    minTradeAmount = _amount;
}


function setMaxTradeAmount(uint256 _amount) external onlyOwner {
    maxTradeAmount = _amount;
}


function setMaxHoldDuration(uint256 _seconds) external onlyOwner {
    maxHoldDuration = _seconds;
}


function setZCooldownThreshold(uint256 _value) external onlyOwner {
    zCooldownThreshold = _value;
}


function setZCooldownPeriod(uint256 _seconds) external onlyOwner {
    zCooldownPeriod = _seconds;
}


function setMaxDailyTrades(uint256 _count) external onlyOwner {
    maxDailyTrades = _count;
}


    function swapETHForTokens(uint256 ethAmount, address[] memory path) internal returns (uint256[] memory) {
    uint[] memory amounts = dexRouter.swapExactETHForTokens{ value: ethAmount }(
        1,
        path,
        address(this),
        block.timestamp + transactionDeadline
    );
    return amounts;
}


function calculateAmountOutMin(uint256 expectedOut) internal view returns (uint256) {
    return (expectedOut * (100 - maxAllowedSlippagePercent)) / 100;
}


function shouldExitPosition(address token, AssetPosition memory position, uint256 currentPrice) internal view returns (bool) {
    uint256 score = 0;
    if (currentPrice <= position.stopLossPrice) {
        return true;
    }


    if (currentPrice >= position.takeProfitPrice) {
        return true;
    }


    if (block.timestamp >= position.entryTimestamp + maxHoldDuration) {
        return true;
    }


    (int256 macdLine, int256 signalLine) = priceOracle.getMACD(token);
    if (priceOracle.getRSI(token) > 70) {
        if (macdLine < signalLine) {
            score++;
        }
    }


    if (macdLine < signalLine) {
        uint ema9 = priceOracle.getEMA(token, 9);
        uint ema21 = priceOracle.getEMA(token, 21);
        if (ema9 < ema21) {
            score++;
        }
    }


    return score >= minScoreToSell;


}






function evaluateAsset(address token) internal returns (uint256 score, uint256 price) {
    // Single declaration of config with ETH handling
    address priceCheckToken = (token == ETH) ? ETH : token;
    AssetConfig memory config = (token == ETH) ? assetConfigs[ETH] : assetConfigs[token];


   
    //require(priceOracle.getMarketCap(token) >= 5_000_000 * 10**18, "MCap too low");
    //require(priceOracle.getZScore(token) < int256(zCooldownThreshold), "Z-Score too high");
    //require(isLiquid(token), "Insufficient liquidity");
    //require(isSpreadAcceptable(token), "Spread too wide");
    //require(isOnTopTierExchange(token), "Not on top exchange");
   
    price = priceOracle.getPrice(priceCheckToken);
    uint256 sma5 = priceOracle.getSMA(priceCheckToken, 5);
    require(price > sma5, "Price below SMA");


    int256 z = priceOracle.getZScore(priceCheckToken);


    // Z-Score cooldown logic (modify state)
    if (z > int256(zCooldownThreshold)) {
        uint256 lastCooldown = lastZCooldown[token];
       
        if (lastCooldown == 0 || block.timestamp >= lastCooldown + zCooldownPeriod) {
            lastZCooldown[token] = block.timestamp;
        } else {
            revert("Cooldown active");
        }
    }


    (uint256 lowerBand, , uint256 upperBand) = priceOracle.getBBands(priceCheckToken);
    require(price > lowerBand && price < upperBand, "Price outside Bollinger Bands");


    // Use the already-declared config variable
    require(
        price >= config.minPrice &&
        price <= config.maxPrice,
        "Price out of bounds"
    );


   




    score = 0;
    if (priceOracle.getRSI(token) < 35 &&
        priceOracle.getOBV(token) > priceOracle.getEMA(token, 20)) {
        score += 2;
    }
    (int256 macdLine, int256 signalLine) = priceOracle.getMACD(priceCheckToken);
    if (priceOracle.getRSI(token) < 35 && macdLine > signalLine) {
        score += 2;
    }
    if (isEMABullish(token)) {
        score += 1;
    }
    if (priceOracle.getOBV(priceCheckToken) > priceOracle.getEMA(priceCheckToken, 20)) score++;


    return (score, price);
}


function storePosition(address token, uint256 tokensReceived, uint256 price) internal {
    uint256 stopLossPrice = price * (100 - maxDrawdownPercent) / 100;
    uint256 takeProfitPrice = price * (100 + takeProfitPercent) / 100;


    assetPositions[token] = AssetPosition({
        amount: tokensReceived,
        entryPrice: price,
        entryTimestamp: block.timestamp,
        stopLossPrice: stopLossPrice,
        takeProfitPrice: takeProfitPrice
    });
}


function buyAsset(address token, uint256 ethAmount) public onlyOwner nonReentrant enforceTradeLimit whenNotPaused {
    require(tx.gasprice <= maxGasPriceWei * 1 gwei, "Gas price too high");
   
    // Get config with ETH handling
    AssetConfig memory config = (token == ETH) ?
        assetConfigs[ETH] :
        assetConfigs[token];
    require(config.enabled, "Token not enabled");


    require(ethAmount >= minTradeAmount && ethAmount <= maxTradeAmount, "Invalid trade amount");
    require(canPerformAction(token), "Cooldown in effect");


    (uint256 score, uint256 price) = evaluateAsset(token);
    require(score >= minScoreToBuy, "Score too low");
   
    // Use config for price validation
    require(
        price >= config.minPrice &&
        price <= config.maxPrice,
        "Price out of bounds"
    );


    // Rest of the function remains unchanged...
    uint256 newSingleExposure = (price * ethAmount) / 1 ether;
    uint256 totalExposure = getTotalExposure();
    require((newSingleExposure * 100) / (totalExposure + newSingleExposure) <= maxSingleAssetExposure, "Too much exposure in one asset");
    require((totalExposure + newSingleExposure) * 100 / address(this).balance <= maxTotalExposure, "Too much total exposure");


    address[] memory path = new address[](2);
    path[0] = dexRouter.WETH();
    path[1] = token;


    uint8 decimals = IERC20Metadata(token).decimals();
    uint256 expectedOut = (ethAmount * (10 ** decimals)) / price;
    uint256 amountOutMin = calculateAmountOutMin(expectedOut);
   


    uint[] memory amounts = dexRouter.swapExactETHForTokens{ value: ethAmount }(
        amountOutMin,
        path,
        address(this),
        block.timestamp + transactionDeadline
    );
   
    priceOracle.updatePriceTimestamp(token);
    uint256 tokensReceived = amounts[1];
    storePosition(token, tokensReceived, price);
    emit Bought(token, tokensReceived, price);
}


function sellAsset(address token) external onlyOwner nonReentrant enforceTradeLimit {
    AssetPosition memory position = assetPositions[token];
    require(position.amount > 0, "No position");
    require(tx.gasprice <= maxGasPriceWei * 1 gwei, "Gas price too high");
    require(canPerformAction(token), "Cooldown in effect");




    uint256 currentPrice = (token == ETH) ?
        priceOracle.getPrice(ETH) :
        priceOracle.getPrice(token);
    require(shouldExitPosition(token, position, currentPrice), "No valid exit condition");


    address[] memory path = new address[](2);
    path[0] = token;
    path[1] = dexRouter.WETH();
   
    IERC20(token).approve(address(dexRouter), position.amount);
    uint256 expectedOut = (position.amount * currentPrice) / (10 ** IERC20Metadata(token).decimals());
    uint256 amountOutMin = calculateAmountOutMin(expectedOut);


    dexRouter.swapExactTokensForETH(
        position.amount,
        amountOutMin,
        path,
        address(this),
        block.timestamp + transactionDeadline
    );


    delete assetPositions[token];
    emit Sold(token, position.amount, currentPrice);
}
}

Read Contract

assetConfigs 0x7609d7f6 → bool, uint256, uint256
assetPositions 0x062abb08 → uint256, uint256, uint256, uint256, uint256
canPerformAction 0x2975dfaf → bool
dexRouter 0x0758d924 → address
getAllApprovedTokens 0x09b0d50a → address[], tuple[]
getSingleExposure 0xd52855c8 → uint256
getTotalExposure 0x8ac6d217 → uint256
isTracked 0xa8c94d1b → bool
lastZCooldown 0xbb503adf → uint256
maxAllowedSlippagePercent 0x18f173ea → uint256
maxDailyTrades 0x3f6f3cb5 → uint256
maxDrawdownPercent 0xd02eb14b → uint256
maxGasPriceWei 0xef3881c8 → uint256
maxHoldDuration 0x71e16e76 → uint256
maxSingleAssetExposure 0xdb52675c → uint256
maxTotalExposure 0x14a10511 → uint256
maxTradeAmount 0x0537eae0 → uint256
minScoreToBuy 0xa3d1acb0 → uint256
minScoreToSell 0x6a2f199c → uint256
minTradeAmount 0xdda9046f → uint256
owner 0x8da5cb5b → address
paused 0x5c975abb → bool
priceOracle 0x2630c12f → address
takeProfitPercent 0x6e4a37d2 → uint256
trackedAssets 0xf715d99c → address
tradesPerDay 0x849cc7ef → uint256
transactionDeadline 0xa6888c35 → uint256
zCooldownPeriod 0xc67cc210 → uint256
zCooldownThreshold 0x2cb15f81 → uint256

Write Contract 30 functions

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

addAsset 0xf478a0f5
address token
uint256 minPrice
uint256 maxPrice
approveAsset 0x158f4dea
address token
uint256 minPrice
uint256 maxPrice
uint256 amountToApprove
autoStopLoss 0x7f28325f
address token
batchBuyAssets 0x96598cf4
address[] tokens
uint256[] ethAmounts
buyAsset 0x938c7c3a
address token
uint256 ethAmount
disableAsset 0x70807528
address token
pause 0x8456cb59
No parameters
removeApprovedAsset 0x4cc5c1bd
address token
removeAsset 0x4a5e42b1
address token
sellAsset 0x33968ded
address token
setMaxDailyTrades 0x631181b9
uint256 _count
setMaxDrawdownPercent 0xdee18479
uint256 _value
setMaxGasPriceWei 0x4d86fc56
uint256 _value
setMaxHoldDuration 0x97bbdb8c
uint256 _seconds
setMaxSingleAssetExposure 0xd626a959
uint256 _percent
setMaxTotalExposure 0x77d563f8
uint256 _percent
setMaxTradeAmount 0x067542bf
uint256 _amount
setMinScoreToBuy 0x0e88c605
uint256 _value
setMinScoreToSell 0x3ee84091
uint256 _value
setMinTradeAmount 0xe76a0279
uint256 _amount
setSlippage 0xf0fa55a9
uint256 _percent
setTakeProfitPercent 0x4e6daca3
uint256 _value
setTransactionDeadline 0x8dbc640a
uint256 _seconds
setZCooldownPeriod 0xf1512eba
uint256 _seconds
setZCooldownThreshold 0x0fff6e47
uint256 _value
unpause 0x3f4ba83a
No parameters
updateAssetPriceRange 0xa70dd790
address token
uint256 newMinPrice
uint256 newMaxPrice
updatePriceOracle 0x39d1fc82
address newOracle
withdrawERC20 0xa1db9782
address token
uint256 amount
withdrawETH 0xf14210a6
uint256 amount

Recent Transactions

No transactions found for this address