Skip to content

Functions

DISCLAIMER // NFA // DYOR

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.

⊙ generated by robots | curated by humans

METADATA
Contract Address 0x99c96efF...Ab2dCC (etherscan)
Network Ethereum Mainnet
Analysis Date 2026-03-29

Function Selectors

SELECTOR FUNCTION SIGNATURE CATEGORY
0x4af9daa8 deposit(uint256) User (payable)
0xde643a71 topUp(uint256,uint256) User (payable)
0x2e1a7d4d withdraw(uint256) User
0x66c91379 withdrawPartial(uint256,uint256) User
0xea0ccfae executeTrade(address,uint256,address,uint24,uint256,uint256,uint256) Keeper
0xd86938ba closeTrade(address,uint256,uint24,uint256,uint256) Keeper
0x748747e6 setKeeper(address) Admin
0xe74b981b setFeeRecipient(address) Admin
0xa9bbd114 setPresaleContract(address) Admin
0xf2fde38b transferOwnership(address) Admin
0x8da5cb5b owner() View
0xaced1661 keeper() View
0x46904840 feeRecipient() View
0x3fc8cef3 weth() View
0xc31c9c07 swapRouter() View
0x444cef88 sentToken() View
0x63d9df85 presaleContract() View
0x1360003f totalProfitGenerated() View
0xd2a037ab totalTradesExecuted() View
0xb5cb15f7 getUserCount() View
0xd0fd9cad MAX_TRADE_ETH() View (constant)
0xcbb117a3 SWAP_DEADLINE_BUFFER() View (constant)
0x365b98b2 users(uint256) View
0x7bbfc69e vaults(address,uint256) View
0xa8c94d1b isTracked(address) View
0xdca11ab8 getEligibility(address) View
0xcbe9e55e getUserTier(address,uint256) View
0xc59d4847 getStats() View
0xf8b8790f (unknown — returns constant 1000e18) View
0x06e20080 (unknown) Unknown
0x1a519533 (unknown) Unknown
0x553a9a93 (unknown) Unknown
0x5b451dff (unknown) Unknown
0x6f747452 (unknown) Unknown
0x8b4c6df1 (unknown) Unknown
0x8c07635a (unknown) Unknown
0xa0aca335 (unknown) Unknown
0xae1e9118 (unknown) Unknown
0xb3051d6e (unknown) Unknown
0xbda962d5 (unknown) Unknown
0xc84d5389 (unknown) Unknown
0xc9b6e079 (unknown) Unknown
0xda91a291 (unknown) Unknown
0xe7ba4fe5 (unknown) Unknown
0xe87ce5ee (unknown) Unknown
0xf1cb0216 (unknown) Unknown

Summary

CATEGORY NUM FUNCTIONS
Total Functions 44+
User Functions 4
Keeper Functions 2
Admin Functions 4
View Functions 18
Unknown/Unmatched 16

User Functions

Function: deposit (0x4af9daa8)

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
6 Increment getUserCount if new user
7 Emit VaultDeposit(user, vaultId, ethAmount, sentAmount)
  • VaultDeposit(address indexed user, uint256 indexed vaultId, uint256 ethAmount, uint256 sentAmount)
# 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 bytecode
function deposit(uint256 sentAmount) external payable {
    require(msg.value > 0, "No ETH sent");

    // Register user if new
    if (!isTracked[msg.sender]) {
        isTracked[msg.sender] = true;
        users.push(msg.sender);
        userCount++;
    }

    // Send flat fee to fee recipient
    uint256 fee = 0.005 ether;
    (bool sent, ) = feeRecipient.call{value: fee}("");
    require(sent, "Fee transfer failed");

    // Create vault entry
    uint256 vaultId = nextVaultId[msg.sender];
    Vault storage v = 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++;

    emit VaultDeposit(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 bytecode
function topUp(uint256 vaultId, uint256 unknown) external payable {
    require(msg.value > 0, "No ETH sent");

    Vault storage v = vaults[msg.sender][vaultId];
    require(v.active == 1, "Vault not active");

    v.depositAmount += msg.value;
    totalDeposits += msg.value;
    totalOperations++;

    emit TopUpOrWithdraw(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 bytecode
function withdraw(uint256 vaultId) external {
    Vault storage v = vaults[msg.sender][vaultId];
    require(v.active == 1, "Vault not active");
    // Possible: require no active trades

    uint256 amount = v.depositAmount;
    v.depositAmount = 0;
    v.active = 0;

    totalOperations++;

    (bool sent, ) = msg.sender.call{value: amount}("");
    require(sent, "ETH transfer failed");

    emit TopUpOrWithdraw(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 bytecode
function withdrawPartial(uint256 vaultId, uint256 amount) external {
    Vault storage v = vaults[msg.sender][vaultId];
    require(v.active == 1, "Vault not active");
    require(amount <= v.depositAmount, "Insufficient balance");

    v.depositAmount -= amount;
    totalOperations++;

    (bool sent, ) = msg.sender.call{value: amount}("");
    require(sent, "ETH transfer failed");

    emit TopUpOrWithdraw(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.

ATTRIBUTE VALUE
Selector 0xea0ccfae
Parameters address user, uint256 vaultId, address targetToken, uint24 feeTier, uint256 ethAmount, uint256 minTokenOut, uint256 direction
Access Keeper only
Called By 0x9fBcc72A...63eA03 (owner/keeper)
Gas Usage ~280,000 - 325,000
FLAG OBSERVATION
Keeper has full discretion over trade parameters
No user approval required for individual trades
No on-chain strategy or automated trigger
Uses Uniswap V3 exactInputSingle for swaps
minTokenOut set by keeper — slippage protection is keeper-defined
STEP ACTION
1 Verify msg.sender == keeper
2 Load vault for user/vaultId
3 Wrap ethAmount ETH → WETH (call WETH.deposit)
4 Approve SwapRouter to spend WETH
5 Call router.exactInputSingle(WETH → targetToken, feeTier, ethAmount, minTokenOut)
6 Receive target tokens
7 Update vault: increment trade count, record last token, update profit, timestamp
8 Increment totalTradesExecuted
9 Update totalProfitGenerated
10 Emit TradeExecuted event
  • TradeExecuted(address indexed user, uint256 indexed vaultId, address indexed token, uint256 ethAmount, uint256 tokenAmount, uint256 direction, uint256 timestamp)
# 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 bytecode
function executeTrade(
    address user,
    uint256 vaultId,
    address targetToken,
    uint24 feeTier,
    uint256 ethAmount,
    uint256 minTokenOut,
    uint256 direction
) external {
    require(msg.sender == keeper, "Not keeper");

    Vault storage v = vaults[user][vaultId];
    require(v.active == 1, "Vault not active");
    require(ethAmount <= MAX_TRADE_ETH, "Exceeds max trade");

    // Wrap ETH to WETH
    IWETH(weth).deposit{value: ethAmount}();

    // Approve router
    IERC20(weth).approve(swapRouter, ethAmount);

    // Execute swap via Uniswap V3
    uint256 tokenAmount = 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 state
    v.tradeCountBuy++;
    v.lastTradeToken = targetToken;
    v.lastTradeAmount = tokenAmount;
    v.lastTradeTimestamp = block.timestamp;

    totalTradesExecuted++;
    totalOperations++;
    // totalProfitGenerated updated based on trade result

    emit TradeExecuted(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 bytecode
function closeTrade(
    address user,
    uint256 vaultId,
    uint24 feeTier,
    uint256 amount,
    uint256 direction
) external {
    require(msg.sender == keeper, "Not keeper");

    Vault storage v = vaults[user][vaultId];
    require(v.active == 1, "Vault not active");

    address tokenIn = v.lastTradeToken;

    // Approve router to spend acquired tokens
    IERC20(tokenIn).approve(swapRouter, amount);

    // Swap tokens back to WETH
    uint256 wethOut = 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 ETH
    IWETH(weth).withdraw(wethOut);

    // Update vault state
    v.tradeCountSell++;
    v.lastTradeTimestamp = block.timestamp;
    // Update profit tracking

    totalTradesExecuted++;
    totalOperations++;

    emit TradeExecuted(user, vaultId, tokenIn, wethOut, amount, direction, block.timestamp);
}

Admin Functions

Function: setKeeper(address)

Changes the keeper address authorized to execute trades.

ATTRIBUTE VALUE
Selector 0x748747e6
Parameters address newKeeper
Access Owner only
FLAG OBSERVATION
No timelock — takes effect immediately
No Multisig requirement
New keeper immediately gains full trade execution authority
// Reconstructed from bytecode
function setKeeper(address newKeeper) 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 bytecode
function setFeeRecipient(address newFeeRecipient) 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 bytecode
function setPresaleContract(address presale) external {
    require(msg.sender == owner, "Not owner");
    presaleContract = presale;
}

Function: transferOwnership(address)

Transfers contract ownership.

ATTRIBUTE VALUE
Selector 0xf2fde38b
Parameters address newOwner
Access Owner only
FLAG OBSERVATION
No timelock or delay
No Multisig requirement
// Reconstructed from bytecode
function transferOwnership(address newOwner) external {
    require(msg.sender == owner, "Not owner");
    require(newOwner != address(0), "Zero address");
    owner = newOwner;
}

View Functions

Function: getStats()

Returns aggregate contract statistics.

ATTRIBUTE VALUE
Selector 0xc59d4847
Returns uint256 totalDeposits, uint256 totalTrades, uint256 totalProfit, uint256 userCount, uint256 totalOperations
STAT VALUE
Total Deposits ~5.09 ETH
Total Trades 162
Total Profit ~0.018 ETH
User Count 85
Total Operations 215
// Reconstructed from bytecode
function getStats() external view returns (
    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.

ATTRIBUTE VALUE
Selector 0x7bbfc69e
Parameters address user, uint256 vaultId
Returns Vault struct (profit, depositAmount, sentAmount, tradeCountBuy, tradeCountSell, active, depositTimestamp, lastTradeTimestamp, lastTradeToken, lastTradeAmount, accumulatedValue)
FIELD TYPE DESCRIPTION
Field 0 uint256 Accumulated profit (wei)
Field 1 uint256 Deposit amount (wei)
Field 2 uint256 SENT token amount declared
Field 3 uint256 Trade count (buys)
Field 4 uint256 Trade count (sells)
Field 5 uint256 Active flag (1 = active)
Field 6 uint256 Deposit timestamp
Field 7 uint256 Last trade timestamp
Field 8 address Last traded token address
Field 9 uint256 Last trade token amount
Field 10 uint256 Accumulated value (wei)
// Reconstructed from bytecode
struct Vault {
    uint256 profit;
    uint256 depositAmount;
    uint256 sentAmount;
    uint256 tradeCountBuy;
    uint256 tradeCountSell;
    uint256 active;
    uint256 depositTimestamp;
    uint256 lastTradeTimestamp;
    address lastTradeToken;
    uint256 lastTradeAmount;
    uint256 accumulatedValue;
}

// Auto-generated getter for: mapping(address => mapping(uint256 => Vault))
function vaults(address user, uint256 vaultId) external view returns (
    uint256 profit,
    uint256 depositAmount,
    uint256 sentAmount,
    uint256 tradeCountBuy,
    uint256 tradeCountSell,
    uint256 active,
    uint256 depositTimestamp,
    uint256 lastTradeTimestamp,
    address lastTradeToken,
    uint256 lastTradeAmount,
    uint256 accumulatedValue
) {
    Vault storage v = vaults[user][vaultId];
    return (
        v.profit,
        v.depositAmount,
        v.sentAmount,
        v.tradeCountBuy,
        v.tradeCountSell,
        v.active,
        v.depositTimestamp,
        v.lastTradeTimestamp,
        v.lastTradeToken,
        v.lastTradeAmount,
        v.accumulatedValue
    );
}

Function: getEligibility(address)

Returns eligibility information for a user, appears to check SENT token balance.

ATTRIBUTE VALUE
Selector 0xdca11ab8
Parameters address user
Returns uint256, uint256, uint256, uint256 (status flags + SENT balance + eligible)
// Reconstructed from bytecode
function getEligibility(address user) external view returns (
    uint256 status,
    uint256 sentBalance,
    uint256 eligible,
    uint256 tier
) {
    uint256 balance = IERC20(sentToken).balanceOf(user);
    bool isEligible = balance >= sentThreshold;
    // Returns status flags, SENT balance, eligibility, and tier info
    return (
        isTracked[user] ? 1 : 0,
        balance,
        isEligible ? 1 : 0,
        _calculateTier(balance)
    );
}

Other View Functions

FUNCTION SELECTOR RETURNS
owner() 0x8da5cb5b address — current owner
keeper() 0xaced1661 address — current keeper
feeRecipient() 0x46904840 address — fee recipient
weth() 0x3fc8cef3 address — WETH contract
swapRouter() 0xc31c9c07 address — Uniswap V3 router
sentToken() 0x444cef88 address — SENT token
presaleContract() 0x63d9df85 address — presale contract (currently 0x0)
totalProfitGenerated() 0x1360003f uint256 — total profit in wei
totalTradesExecuted() 0xd2a037ab uint256 — trade counter
getUserCount() 0xb5cb15f7 uint256 — registered user count
MAX_TRADE_ETH() 0xd0fd9cad uint256 — 0.5 ETH max per trade
SWAP_DEADLINE_BUFFER() 0xcbb117a3 uint256 — 60 seconds
users(uint256) 0x365b98b2 address — user at index
isTracked(address) 0xa8c94d1b bool — whether address is registered
getUserTier(address,uint256) 0xcbe9e55e uint256 — tier for user/vault

Verification Commands

# View functions
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "owner()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "keeper()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "feeRecipient()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "weth()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "swapRouter()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "sentToken()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "getStats()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "getUserCount()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "totalProfitGenerated()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "totalTradesExecuted()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "MAX_TRADE_ETH()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "SWAP_DEADLINE_BUFFER()"
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "vaults(address,uint256)" <ADDRESS> <VAULT_ID>
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "getEligibility(address)" <ADDRESS>
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "getUserTier(address,uint256)" <ADDRESS> <VAULT_ID>
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "isTracked(address)" <ADDRESS>
cast call 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC "users(uint256)" <INDEX>

# Contract balance
cast balance 0x99c96efFDbd52C6868CB500f10350DF444Ab2dCC --ether