- Setup & pre-flight: spinning up environments, funding wallets, checking transactions before you sign.
- Debugging & post-mortem: figuring out why a transaction failed, who took funds, or why a swap returned less than expected. The advanced trace navigation tools shine here.
- Virtual Environment workflows: impersonation, multi-step testing, snapshots, time-travel, token balance overrides.
- Optimization & inspection: gas breakdowns, contract metadata.
Create a Virtual Environment and fund a wallet
What to ask:“Create a Virtual Environment forked from Ethereum mainnet and fund my wallet 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 with 100 ETH.”What Claude does:
- Calls
list_projectsto find your projects, thenset_active_projectto select one. - Calls
get_networksto find the Ethereum mainnet network ID. - Calls
create_vnetwith the network ID, creating a forked environment. The new Virtual Environment is automatically set as active. - Calls
fund_accountwith your wallet address, setting the balance to 100 ETH in hex wei. Operates on the active Virtual Environment automatically. - Returns the Virtual Environment details including Admin RPC and Public RPC URLs, ready for use in Hardhat, Foundry, or any Web3 library.
Simulate a Uniswap swap
What to ask:“Simulate a swap of 1 ETH for USDC on Uniswap V3 from 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 on Ethereum mainnet. Show me the expected output and any token transfers.”What Claude does:
- Calls
simulate_transactionwith the Uniswap V3 router address, your sender address, the swap calldata, and 1 ETH as value. - The simulation runs against current mainnet state and returns: success/revert status, gas used, and decoded method name.
- Calls
get_simulation_asset_transfersto show all token movements, the ETH going in and USDC coming out. - Calls
get_simulation_balance_changesto show the net impact on your balances with USD values.
Pre-flight check a transaction before sending
What to ask:
“I’m about to call approve on 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 to give 0xE592427A0AEce92De3Edee1F18E0157C05861564 unlimited USDC allowance. Simulate it first and show me exactly what approvals and state changes it will create.”
What Claude does:
- Calls
simulate_transactionwith your wallet as sender, the token contract as recipient, and theapprovecalldata. - Calls
get_simulation_exposure_changesto show every approval and allowance change, which spender gets access to what, and how much. - Calls
get_simulation_state_changesto show the exact storage slots modified.
Debug a failed on-chain transaction
What to ask:“Why did transaction 0x6c5df5a1e6b34e2432ae19706e38a84239495cdbf40c2a9d4d79806443c4aa0d revert on Ethereum?”What Claude does:
- Calls
trace_transactionwith the tx hash. Returns the status (false= reverted), gas used, decoded method name, and error message. - Calls
get_simulation_call_traceto get the full internal call tree, every function call, with decoded names, inputs, outputs, and which specific call failed. - Calls
get_simulation_eventsto see what events were emitted before the revert point. - Optionally calls
get_simulation_state_changesto see what state was modified up to the failure.
"ERC20: transfer amount exceeds balance"), and the full call trace so you can see the execution path leading up to the failure.
Find the root cause of a revert in a deeply nested transaction
What to ask:“Transaction 0x… reverted on Ethereum. It’s a complex DeFi call with lots of internal calls, find the actual error and show me the path that led to it.”What Claude does:
- Calls
trace_transactionfor the top-level summary and confirms the revert. - Calls
find_failuresto list every failing call in the transaction, not just the outermost one. This surfaces both the originating revert and any wrappingrequire/try-catch failures. - Calls
get_error_pathto return the blame chain from the root call down to the deepest failing call, with decoded inputs and outputs at each level. - If any node still has omitted children, calls
get_call_trace_nodeon the specific position to expand it.
get_simulation_call_trace output.
Navigate a very large trace
What to ask:
“This transaction has hundreds of internal calls and get_simulation_call_trace is truncated. Help me understand its structure and drill into the part that matters.”
What Claude does:
- Calls
get_trace_statsto report total calls, max depth, error count, and unique contracts, a quick size check that decides the strategy. - Calls
get_trace_skeletonto get a compressed call tree: function name, contract, depth, and error flag per node, without decoded args. - Identifies the interesting subtree (a failing branch, a specific protocol, or a suspicious contract) using
absolute_positionvalues from the skeleton. - Calls
get_call_trace_nodeto expand that subtree with full decoded inputs and outputs. - Optionally calls
get_subtree_eventsandget_subtree_state_changesto see only the events and storage diffs from that subtree.
Search a trace for a specific contract or function
What to ask:
“Did this transaction ever call transferFrom on USDC? If so, show me every call with the decoded args.”
What Claude does:
- Calls
search_call_tracewith the USDC address andtransferFromas filters, returning only matching calls with their decoded inputs, outputs, and absolute positions. - For any match that’s interesting, calls
get_call_trace_nodeto fetch the full nested context around it.
Follow the money through a transaction
What to ask:“For transaction 0x… on Ethereum, show me who sent what to whom, in order, with USD values.”What Claude does:
- Calls
get_transaction_fund_flowwith the tx hash. Returns ordered token and native transfers, each with from/to addresses and USD values, plus a net flow per address. - Optionally calls
get_contract_infoon any unfamiliar address to identify it (protocol router, pool, treasury, etc.).
Debug a failed Safe multisig batch execution
What to ask:“Our Safe batch execution at 0x… reverted on Ethereum. The batch has 12 calls. Which one actually failed and why?”What Claude does:
- Calls
trace_transactionto confirm the revert and get the top-level method (execTransactionormultiSend). - Calls
get_trace_stats, Safe batches explode into large traces quickly, so the stats decide the next step. - Calls
find_failures, becausemultiSendoften reverts the whole batch on any sub-call failure, this is the fastest way to see which of the 12 operations blew up, not just the outer Safe revert. - Calls
get_error_pathon the failing sub-call for the full decoded input/output chain at each level. - Optionally calls
get_call_trace_nodeif any relevant node was truncated.
Post-mortem an exploit or suspicious transaction
What to ask:“0x… on Ethereum drained funds from our protocol. Walk me through what happened: who ended up with the money, what the attacker called, and where the exploit entered our contracts.”What Claude does:
- Calls
get_transaction_fund_flowfirst, the ordered token and native flows plus per-address net flow surface the attacker’s wallet and the drained protocol addresses immediately. - Calls
get_trace_skeletonto map the attacker’s call structure without loading every argument. - Calls
search_call_tracefor calls into the protocol’s contracts (by address) to isolate the entry point. - Calls
get_call_trace_nodeon the entry point for decoded args, thenget_subtree_state_changesto see exactly what state the exploit mutated. - Calls
get_contract_infoon any unknown contracts the attacker interacted with (helpers, proxies, known exploit contracts).
Investigate an unexpected liquidation
What to ask:“My Aave position got liquidated in 0x…, figure out why. I want to know the oracle price at liquidation time and the exact health-factor path.”What Claude does:
- Calls
trace_transactionandget_trace_skeletonto map the liquidation call tree. - Calls
search_call_tracefor oracle calls (e.g.,latestAnswer,getAssetPrice) to find the price reads the liquidation used. - Calls
get_call_trace_nodeon each match for the decoded return values, the exact price feeding the health-factor math. - Calls
get_transaction_fund_flowto show how much collateral was seized, the debt repaid, and the liquidator’s bonus. - Optionally calls
get_subtree_eventson the liquidation subtree forLiquidationCallandTransferevents in order.
Audit a 1inch / aggregator swap that returned less than expected
What to ask:“0x… was a 1inch swap where I got significantly less USDC than the quote. Which pool or hop gave the bad price?”What Claude does:
- Calls
get_trace_stats, aggregator routes can be deep with many pool hops. - Calls
get_trace_skeletonto see the sequence of pool calls in order. - Calls
search_call_traceforswap,exactInput, or the router’s pool-interaction selectors, pulling out each hop. - Calls
get_call_trace_nodeon each hop for decodedamountIn/amountOutvalues. - Calls
get_transaction_fund_flowto confirm the final net received and any unexpected transfers (fees, rebates).
Re-simulate a failed transaction with a fix
What to ask:“Transaction 0x… failed with ‘ERC20: transfer amount exceeds balance’. Re-simulate it but override my USDC balance to 10,000 USDC to confirm that’s the only issue.”What Claude does:
- Calls
resimulate_transactionwith the original tx hash and a state override setting your token balance to 10,000 USDC. - If the simulation succeeds, confirms the root cause was insufficient balance.
- Calls
get_simulation_call_traceto verify the execution path now completes without error. - Optionally calls
get_simulation_asset_transfersto show what the transaction would have done if it had succeeded.
Understand what a transaction did
What to ask:“Walk me through everything that happened in transaction 0x… on Ethereum, every internal call, who called who, and what changed.”What Claude does:
- Calls
trace_transactionfor a top-level summary: method name, sender, recipient, gas used, and status. - Calls
get_simulation_call_traceto get the full internal call tree, every nested call with decoded function names, inputs, outputs, and per-call gas. - Calls
get_simulation_eventsto list all events emitted in order. - Calls
get_simulation_state_changesto show every storage slot and balance that changed.
Inspect a smart contract
What to ask:“What contract is deployed at 0xdAC17F958D2ee523a2206206994597C13D831ec7 on Ethereum?”What Claude does:
- Calls
get_contract_infowith the address and Ethereum’s network ID.
Send an impersonated transaction on a Virtual Environment and trace it
What to ask:
“On my Virtual Environment, send a transaction from the Uniswap V2 deployer 0x1a9C8182C09F50C8318d769245beA52c32BE35BC to the USDC contract 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 calling the transfer function to send 1000 USDC to my wallet. Then trace the execution.”
What Claude does:
- Calls
send_vnet_transactionon the active Virtual Environment with the deployer asfrom, USDC asto, and the ABI-encodedtransfercalldata. The sender is impersonated, no private key needed. - Calls
get_vnet_transactionsto get theoperation_idof the executed transaction. - Calls
trace_vnet_transactionto get the decoded execution summary, contract name, function name, decoded input parameters, and output. - Optionally calls
get_vnet_simulation_eventsandget_vnet_simulation_state_changesfor deeper details.
transfer call succeeded, and the events emitted (Transfer event with your wallet as recipient).
Test a multi-step contract interaction on a Virtual Environment
What to ask:“On my Virtual Environment, run the full approval and swap flow: first approve the Uniswap router to spend 1000 USDC from my wallet, then execute the swap. Show me my balances before and after.”What Claude does:
- Calls
send_vnet_transactionon the active Virtual Environment to submit theapprovetransaction, impersonating your wallet, no private key needed. - Calls
send_vnet_transactionagain with the swap calldata. - Calls
get_vnet_simulation_asset_changeson each transaction to show token movements per step. - Calls
get_vnet_simulation_balance_changesafter the final step to show the net balance impact.
Analyze gas usage for optimization
What to ask:“Simulate this transaction and show me a gas breakdown so I can find the most expensive function calls: [paste calldata or describe the transaction]”What Claude does:
- Calls
simulate_transactionwith your transaction parameters. - Calls
get_simulation_gas_breakdownto get per-call gas consumption including intrinsic gas and refunds. - Calls
get_simulation_call_traceto map gas costs to specific function calls in the execution tree.
Use
get_simulation_generated_access_list to generate an EIP-2930 access list, which can reduce gas costs by pre-declaring which storage slots and addresses the transaction will access.Fork a Virtual Environment for parallel testing
What to ask:“Fork my current Virtual Environment so I can test a different approach without losing the current state.”What Claude does:
- Calls
list_vnetsto find your current Virtual Environment, thenset_active_vnetif needed. - Calls
fork_vnet, creating a new Virtual Environment with all state preserved, deployed contracts, balances, and transaction history. The fork is automatically set as active. - Returns the new Virtual Environment details with fresh RPC URLs.
Snapshot, test, and revert for stress-testing
What to ask:“On my Virtual Environment, snapshot the current state, then simulate a liquidation on Aave with different oracle prices. Revert to the snapshot between each attempt so I can compare outcomes.”What Claude does:
- Calls
snapshot_vnetto save the current Virtual Environment state, receiving a snapshot ID. - Calls
set_storage_atto override the oracle price to a specific value. - Calls
send_vnet_transactionto trigger the liquidation. - Calls
get_vnet_simulation_balance_changesandget_vnet_simulation_asset_changesto capture the outcome. - Calls
revert_vnetto restore the Virtual Environment to the snapshot state (the snapshot is consumed). - Calls
snapshot_vnetagain for the next iteration, sets a different oracle price, and repeats.
Set ERC-20 balances for testing
What to ask:“On my Virtual Environment, give my wallet 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 a balance of 10,000 USDC and 5 WETH so I can test a swap.”What Claude does:
- Calls
set_erc20_balancewith the USDC token address, your wallet, and the desired amount. - Calls
set_erc20_balanceagain with the WETH token address and amount. - Optionally calls
vnet_callwith abalanceOfcall to verify the balances were set correctly.
set_erc20_balance handles the token’s storage layout automatically.
Time-travel to test timelocks and vesting
What to ask:“On my Virtual Environment, advance the clock by 7 days to test whether my timelock contract unlocks correctly.”What Claude does:
- Calls
increase_timewith 604800 seconds (7 days) to advance the Virtual Environment clock. - Calls
mine_blockto commit the time change to a new block. - Calls
vnet_callto read the timelock contract’s state (e.g.,isUnlocked()orreleaseTime()). - Optionally calls
send_vnet_transactionto execute the unlock and verify it succeeds.