This analysis is based on decompiled bytecode — the contract source code is not verified on Etherscan. Function names, parameter types, and internal logic are inferred from selector matching, transaction input decoding, and event log analysis. 16 of 44 function selectors could not be matched to known signatures. We are not smart contract security experts. This document should not be considered a comprehensive security audit or financial advice. Always verify critical information independently.
Primary user function for depositing ETH into the vault system. Users send ETH along with a SENT token amount parameter. Not found in 4byte directory — appears to be a custom function signature.
ATTRIBUTE
VALUE
Selector
0x4af9daa8
Parameters
uint256 sentAmount — declared SENT token holdings
Access
Public, payable
ETH Required
Yes — deposit amount sent as msg.value
FLAG
OBSERVATION
△
Users declare SENT amount but contract does not appear to transfer SENT tokens
△
Flat 0.005 ETH fee sent to feeRecipient on every deposit
☑
Emits VaultDeposit event with user, vaultId, ethAmount, sentAmount
△
Some users deposit with sentAmount = 0 (no SENT required)
STEP
ACTION
1
Validate msg.value > 0
2
Check/register user (add to users array if new)
3
Send 0.005 ETH fee to feeRecipient
4
Create vault entry with deposit details
5
Record deposit amount (msg.value - fee), sentAmount, tier, timestamps
# Example: First deposit
ETH sent: 0.05 ETH
sentAmount: 500 SENT (500e18)
Fee deducted: 0.005 ETH
Net deposit: 0.045 ETH (estimated)
# Example: Deposit without SENT
ETH sent: 0.05 ETH
sentAmount: 0
Fee deducted: 0.005 ETH
// Reconstructed from bytecodefunctiondeposit(uint256sentAmount)externalpayable{require(msg.value>0,"No ETH sent");// Register user if newif(!isTracked[msg.sender]){isTracked[msg.sender]=true;users.push(msg.sender);userCount++;}// Send flat fee to fee recipientuint256fee=0.005ether;(boolsent,)=feeRecipient.call{value:fee}("");require(sent,"Fee transfer failed");// Create vault entryuint256vaultId=nextVaultId[msg.sender];Vaultstoragev=vaults[msg.sender][vaultId];v.depositAmount=msg.value-fee;v.sentAmount=sentAmount;v.active=1;v.depositTimestamp=block.timestamp;nextVaultId[msg.sender]++;totalDeposits+=msg.value-fee;totalOperations++;emitVaultDeposit(msg.sender,vaultId,msg.value-fee,sentAmount);}
Function: topUp(uint256,uint256)
Adds ETH to an existing vault position.
ATTRIBUTE
VALUE
Selector
0xde643a71
Parameters
uint256 vaultId, uint256 unknown
Access
Public, payable
ETH Required
Yes
FLAG
OBSERVATION
☑
Lower gas than initial deposit (~46,581 gas vs ~215,000-321,000)
△
Second parameter purpose unclear from bytecode
☑
Emits TopUpOrWithdraw event
// Reconstructed from bytecodefunctiontopUp(uint256vaultId,uint256unknown)externalpayable{require(msg.value>0,"No ETH sent");Vaultstoragev=vaults[msg.sender][vaultId];require(v.active==1,"Vault not active");v.depositAmount+=msg.value;totalDeposits+=msg.value;totalOperations++;emitTopUpOrWithdraw(msg.sender,vaultId,msg.value);}
Function: withdraw(uint256)
Withdraws the full vault balance for a given vault ID.
ATTRIBUTE
VALUE
Selector
0x2e1a7d4d
Parameters
uint256 vaultId
Access
Public (vault owner only)
Gas
~variable
FLAG
OBSERVATION
△
Only 2 withdraw transactions observed — unclear if users can withdraw freely
△
Withdrawal may be restricted when trades are active
☒
Cannot verify withdrawal restrictions without source code
// Reconstructed from bytecodefunctionwithdraw(uint256vaultId)external{Vaultstoragev=vaults[msg.sender][vaultId];require(v.active==1,"Vault not active");// Possible: require no active tradesuint256amount=v.depositAmount;v.depositAmount=0;v.active=0;totalOperations++;(boolsent,)=msg.sender.call{value:amount}("");require(sent,"ETH transfer failed");emitTopUpOrWithdraw(msg.sender,vaultId,amount);}
Function: withdrawPartial(uint256,uint256)
Withdraws a partial amount from an existing vault.
ATTRIBUTE
VALUE
Selector
0x66c91379
Parameters
uint256 vaultId, uint256 amount
Access
Public (vault owner only)
FLAG
OBSERVATION
△
Not observed in transaction history — may be unused or rarely called
// Reconstructed from bytecodefunctionwithdrawPartial(uint256vaultId,uint256amount)external{Vaultstoragev=vaults[msg.sender][vaultId];require(v.active==1,"Vault not active");require(amount<=v.depositAmount,"Insufficient balance");v.depositAmount-=amount;totalOperations++;(boolsent,)=msg.sender.call{value:amount}("");require(sent,"ETH transfer failed");emitTopUpOrWithdraw(msg.sender,vaultId,amount);}
Keeper Functions
Function: executeTrade (0xea0ccfae)
Executes a trade on behalf of a user vault. The keeper wraps ETH to WETH, approves the Uniswap V3 SwapRouter, and performs a swap. Not found in 4byte directory — custom function signature.
# Typical trade execution
Target Token: USDC (0xa0b86991...eb48) — 0.05% fee tier (500)
Trade Size: 0.008 - 0.2 ETH per execution
Gas: ~290,000 - 325,000
# Example trade
User: 0x5db50b4a...
VaultId: 0
ETH → USDC: 0.04 ETH → 81.16 USDC
Fee Tier: 500 (0.05%)
// Reconstructed from bytecodefunctionexecuteTrade(addressuser,uint256vaultId,addresstargetToken,uint24feeTier,uint256ethAmount,uint256minTokenOut,uint256direction)external{require(msg.sender==keeper,"Not keeper");Vaultstoragev=vaults[user][vaultId];require(v.active==1,"Vault not active");require(ethAmount<=MAX_TRADE_ETH,"Exceeds max trade");// Wrap ETH to WETHIWETH(weth).deposit{value:ethAmount}();// Approve routerIERC20(weth).approve(swapRouter,ethAmount);// Execute swap via Uniswap V3uint256tokenAmount=ISwapRouter(swapRouter).exactInputSingle(ISwapRouter.ExactInputSingleParams({tokenIn:weth,tokenOut:targetToken,fee:feeTier,recipient:address(this),deadline:block.timestamp+SWAP_DEADLINE_BUFFER,amountIn:ethAmount,amountOutMinimum:minTokenOut,sqrtPriceLimitX96:0}));// Update vault statev.tradeCountBuy++;v.lastTradeToken=targetToken;v.lastTradeAmount=tokenAmount;v.lastTradeTimestamp=block.timestamp;totalTradesExecuted++;totalOperations++;// totalProfitGenerated updated based on trade resultemitTradeExecuted(user,vaultId,targetToken,ethAmount,tokenAmount,direction,block.timestamp);}
Function: closeTrade (0xd86938ba)
Appears to close an existing trade position by selling acquired tokens back to ETH via Uniswap V3. Not found in 4byte directory — custom function signature.
ATTRIBUTE
VALUE
Selector
0xd86938ba
Parameters
address user, uint256 vaultId, uint24 feeTier, uint256 amount, uint256 direction
Access
Keeper only
Called By
0x9fBcc72A...63eA03 (owner/keeper)
Transaction Count
5
FLAG
OBSERVATION
△
Sells tokens back to ETH (reverse of executeTrade)
△
Only 5 executions observed — may represent trade closure cycle
☒
Keeper controls when and at what price positions are closed
// Reconstructed from bytecodefunctioncloseTrade(addressuser,uint256vaultId,uint24feeTier,uint256amount,uint256direction)external{require(msg.sender==keeper,"Not keeper");Vaultstoragev=vaults[user][vaultId];require(v.active==1,"Vault not active");addresstokenIn=v.lastTradeToken;// Approve router to spend acquired tokensIERC20(tokenIn).approve(swapRouter,amount);// Swap tokens back to WETHuint256wethOut=ISwapRouter(swapRouter).exactInputSingle(ISwapRouter.ExactInputSingleParams({tokenIn:tokenIn,tokenOut:weth,fee:feeTier,recipient:address(this),deadline:block.timestamp+SWAP_DEADLINE_BUFFER,amountIn:amount,amountOutMinimum:0,sqrtPriceLimitX96:0}));// Unwrap WETH to ETHIWETH(weth).withdraw(wethOut);// Update vault statev.tradeCountSell++;v.lastTradeTimestamp=block.timestamp;// Update profit trackingtotalTradesExecuted++;totalOperations++;emitTradeExecuted(user,vaultId,tokenIn,wethOut,amount,direction,block.timestamp);}
Admin Functions
Function: setKeeper(address)
Changes the keeper address authorized to execute trades.
New keeper immediately gains full trade execution authority
// Reconstructed from bytecodefunctionsetKeeper(addressnewKeeper)external{require(msg.sender==owner,"Not owner");keeper=newKeeper;}
Function: setFeeRecipient(address)
Changes the address that receives deposit fees.
ATTRIBUTE
VALUE
Selector
0xe74b981b
Parameters
address newFeeRecipient
Access
Owner only
// Reconstructed from bytecodefunctionsetFeeRecipient(addressnewFeeRecipient)external{require(msg.sender==owner,"Not owner");feeRecipient=newFeeRecipient;}
Function: setPresaleContract(address)
Sets the presale contract reference. Currently set to address(0).
ATTRIBUTE
VALUE
Selector
0xa9bbd114
Parameters
address presale
Access
Owner only
// Reconstructed from bytecodefunctionsetPresaleContract(addresspresale)external{require(msg.sender==owner,"Not owner");presaleContract=presale;}
// Reconstructed from bytecodefunctiongetStats()externalviewreturns(uint256_totalDeposits,uint256_totalTrades,uint256_totalProfit,uint256_userCount,uint256_totalOperations){return(totalDeposits,totalTradesExecuted,totalProfitGenerated,userCount,totalOperations
);}
Function: vaults(address,uint256)
Returns vault details for a given user and vault ID.
// Reconstructed from bytecodefunctiongetEligibility(addressuser)externalviewreturns(uint256status,uint256sentBalance,uint256eligible,uint256tier){uint256balance=IERC20(sentToken).balanceOf(user);boolisEligible=balance>=sentThreshold;// Returns status flags, SENT balance, eligibility, and tier inforeturn(isTracked[user]?1:0,balance,isEligible?1:0,_calculateTier(balance));}