- Настройка и pre-flight: разворачивание сред, пополнение кошельков, проверка транзакций перед подписью.
- Отладка и post-mortem: выяснение, почему транзакция упала, кто забрал средства или почему swap вернул меньше, чем ожидалось. Здесь особенно полезны инструменты продвинутой навигации по трассе.
- Сценарии в Virtual Environment: имперсонация, многошаговое тестирование, снапшоты, путешествия во времени, переопределение балансов токенов.
- Оптимизация и инспекция: разбивка газа, метаданные контрактов.
Создание Virtual Environment и пополнение кошелька
Что попросить:“Создай Virtual Environment, форкнутый из Ethereum mainnet, и пополни мой кошелёк 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 на 100 ETH.”Что делает Claude:
- Вызывает
list_projects, чтобы найти ваши проекты, затемset_active_project, чтобы выбрать один. - Вызывает
get_networks, чтобы найти network ID для Ethereum mainnet. - Вызывает
create_vnetс network ID, создавая форкнутую среду. Новый Virtual Environment автоматически становится активным. - Вызывает
fund_accountс адресом вашего кошелька, устанавливая баланс 100 ETH в hex wei. Работает автоматически с активным Virtual Environment. - Возвращает детали Virtual Environment, включая URL Admin RPC и Public RPC, готовые для использования в Hardhat, Foundry или любой Web3-библиотеке.
Симуляция swap на Uniswap
Что попросить:“Симулируй swap 1 ETH на USDC в Uniswap V3 от 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 в Ethereum mainnet. Покажи ожидаемый выход и все переводы токенов.”Что делает Claude:
- Вызывает
simulate_transactionс адресом роутера Uniswap V3, адресом отправителя, calldata swap и 1 ETH в качестве value. - Симуляция запускается на текущем состоянии mainnet и возвращает: статус success/revert, использованный газ и декодированное имя метода.
- Вызывает
get_simulation_asset_transfers, чтобы показать все движения токенов — ETH на вход и USDC на выход. - Вызывает
get_simulation_balance_changes, чтобы показать чистое влияние на балансы с USD-значениями.
Pre-flight проверка транзакции перед отправкой
Что попросить:
“Я собираюсь вызвать approve на 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, чтобы дать 0xE592427A0AEce92De3Edee1F18E0157C05861564 безлимитное allowance USDC. Симулируй сначала и покажи, какие approvals и изменения состояния это создаст.”
Что делает Claude:
- Вызывает
simulate_transactionс вашим кошельком как отправителем, контрактом токена как получателем и calldataapprove. - Вызывает
get_simulation_exposure_changes, чтобы показать каждое изменение approvals и allowance — кто получает доступ, к чему и в каком объёме. - Вызывает
get_simulation_state_changes, чтобы показать точные слоты хранилища, которые изменились.
Отладка упавшей ончейн-транзакции
Что попросить:“Почему транзакция 0x6c5df5a1e6b34e2432ae19706e38a84239495cdbf40c2a9d4d79806443c4aa0d упала в Ethereum?”Что делает Claude:
- Вызывает
trace_transactionс хешем транзакции. Возвращает статус (false= revert), использованный газ, декодированное имя метода и сообщение об ошибке. - Вызывает
get_simulation_call_trace, чтобы получить полное внутреннее дерево вызовов — каждый вызов функции с декодированными именами, входами, выходами и указанием, какой конкретно вызов упал. - Вызывает
get_simulation_events, чтобы увидеть, какие события были эмитированы до точки revert. - Опционально вызывает
get_simulation_state_changes, чтобы увидеть, какое состояние было изменено до падения.
"ERC20: transfer amount exceeds balance") и полную трассу вызовов, чтобы увидеть путь исполнения, приведший к падению.
Поиск первопричины revert в глубоко вложенной транзакции
Что попросить:“Транзакция 0x… упала в Ethereum. Это сложный DeFi-вызов с массой внутренних вызовов, найди фактическую ошибку и покажи путь, который к ней привёл.”Что делает Claude:
- Вызывает
trace_transactionдля верхнеуровневой сводки и подтверждает revert. - Вызывает
find_failures, чтобы перечислить все упавшие вызовы в транзакции, а не только самый внешний. Это показывает как первоначальный revert, так и оборачивающиеrequire/try-catch-падения. - Вызывает
get_error_path, чтобы вернуть цепочку виновников от корневого вызова вниз до самого глубокого упавшего вызова, с декодированными входами и выходами на каждом уровне. - Если у какого-то узла всё ещё есть опущенные потомки, вызывает
get_call_trace_nodeдля конкретной позиции, чтобы развернуть его.
get_simulation_call_trace из 200 вызовов.
Навигация по очень большой трассе
Что попросить:
“У этой транзакции сотни внутренних вызовов, и get_simulation_call_trace усечён. Помоги мне понять её структуру и углубиться в важную часть.”
Что делает Claude:
- Вызывает
get_trace_stats, чтобы сообщить общее число вызовов, максимальную глубину, количество ошибок и уникальных контрактов — быстрая проверка размера, которая определяет стратегию. - Вызывает
get_trace_skeleton, чтобы получить сжатое дерево вызовов: имя функции, контракт, глубина и флаг ошибки для каждого узла, без декодированных аргументов. - Определяет интересующее поддерево (падающая ветвь, конкретный протокол или подозрительный контракт) по значениям
absolute_positionиз скелета. - Вызывает
get_call_trace_node, чтобы развернуть это поддерево с полными декодированными входами и выходами. - Опционально вызывает
get_subtree_eventsиget_subtree_state_changes, чтобы увидеть только события и диффы хранилища из этого поддерева.
Поиск в трассе конкретного контракта или функции
Что попросить:
“Вызывалась ли transferFrom на USDC в этой транзакции? Если да, покажи каждый такой вызов с декодированными аргументами.”
Что делает Claude:
- Вызывает
search_call_traceс адресом USDC иtransferFromв качестве фильтров, возвращая только совпадающие вызовы с их декодированными входами, выходами и абсолютными позициями. - Для интересных совпадений вызывает
get_call_trace_node, чтобы получить полный вложенный контекст вокруг.
Отслеживание денег в транзакции
Что попросить:“Для транзакции 0x… в Ethereum покажи, кто, что и кому отправлял по порядку, с USD-значениями.”Что делает Claude:
- Вызывает
get_transaction_fund_flowс хешем транзакции. Возвращает упорядоченные переводы токенов и нативных активов, каждый с адресами from/to и USD-значениями, плюс чистый поток по каждому адресу. - Опционально вызывает
get_contract_infoдля незнакомых адресов, чтобы идентифицировать их (роутер протокола, пул, treasury и т. д.).
Отладка упавшего batch-исполнения Safe multisig
Что попросить:“Наше batch-исполнение Safe в 0x… упало в Ethereum. В batch 12 вызовов. Какой из них на самом деле упал и почему?”Что делает Claude:
- Вызывает
trace_transaction, чтобы подтвердить revert и получить верхнеуровневый метод (execTransactionилиmultiSend). - Вызывает
get_trace_stats— batch’и Safe быстро превращаются в большие трассы, так что статистика определяет следующий шаг. - Вызывает
find_failures: посколькуmultiSendчасто откатывает весь batch при падении любого подвызова, это самый быстрый способ увидеть, какая из 12 операций взорвалась, а не только внешний revert Safe. - Вызывает
get_error_pathдля упавшего подвызова, чтобы получить полную декодированную цепочку input/output на каждом уровне. - Опционально вызывает
get_call_trace_node, если какой-то важный узел был усечён.
Post-mortem эксплойта или подозрительной транзакции
Что попросить:“0x… в Ethereum вывел средства из нашего протокола. Проведи меня по тому, что произошло: у кого оказались деньги, что вызывал атакующий и где эксплойт зашёл в наши контракты.”Что делает Claude:
- Сначала вызывает
get_transaction_fund_flow— упорядоченные переводы токенов и нативных активов плюс чистый поток по каждому адресу сразу выявляют кошелёк атакующего и опустошённые адреса протокола. - Вызывает
get_trace_skeleton, чтобы отобразить структуру вызовов атакующего без загрузки всех аргументов. - Вызывает
search_call_traceдля вызовов в контракты протокола (по адресу), чтобы изолировать точку входа. - Вызывает
get_call_trace_nodeв точке входа для декодированных аргументов, затемget_subtree_state_changes, чтобы увидеть, какое именно состояние мутировал эксплойт. - Вызывает
get_contract_infoдля любых неизвестных контрактов, с которыми взаимодействовал атакующий (хелперы, прокси, известные контракты эксплойтов).
Расследование неожиданной ликвидации
Что попросить:“Мою позицию в Aave ликвидировали в 0x…, выясни почему. Хочу знать цену оракула в момент ликвидации и точный путь health factor.”Что делает Claude:
- Вызывает
trace_transactionиget_trace_skeleton, чтобы отобразить дерево вызовов ликвидации. - Вызывает
search_call_traceдля вызовов оракула (например,latestAnswer,getAssetPrice), чтобы найти чтения цены, использованные ликвидацией. - Вызывает
get_call_trace_nodeдля каждого совпадения, чтобы получить декодированные возвращаемые значения — точную цену, питающую расчёт health factor. - Вызывает
get_transaction_fund_flow, чтобы показать, сколько collateral было изъято, сколько долга погашено и какой бонус получил ликвидатор. - Опционально вызывает
get_subtree_eventsдля поддерева ликвидации — событияLiquidationCallиTransferпо порядку.
Аудит swap через 1inch / агрегатор, который вернул меньше, чем ожидалось
Что попросить:“0x… — это swap через 1inch, где я получил значительно меньше USDC, чем в котировке. Какой пул или hop дал плохую цену?”Что делает Claude:
- Вызывает
get_trace_stats— маршруты агрегатора могут быть глубокими со многими hop’ами через пулы. - Вызывает
get_trace_skeleton, чтобы увидеть последовательность вызовов пулов по порядку. - Вызывает
search_call_traceдляswap,exactInputили селекторов взаимодействия с пулами роутера, вытаскивая каждый hop. - Вызывает
get_call_trace_nodeдля каждого hop’а, чтобы получить декодированные значенияamountIn/amountOut. - Вызывает
get_transaction_fund_flow, чтобы подтвердить итоговое чистое полученное и любые неожиданные переводы (комиссии, ребейты).
Пересимуляция упавшей транзакции с исправлением
Что попросить:“Транзакция 0x… упала с ‘ERC20: transfer amount exceeds balance’. Пересимулируй её, но переопредели мой баланс USDC на 10 000 USDC, чтобы подтвердить, что это единственная проблема.”Что делает Claude:
- Вызывает
resimulate_transactionс оригинальным хешем транзакции и переопределением состояния, устанавливающим ваш баланс токена в 10 000 USDC. - Если симуляция проходит, подтверждает, что корневая причина — недостаточный баланс.
- Вызывает
get_simulation_call_trace, чтобы проверить, что путь исполнения теперь завершается без ошибки. - Опционально вызывает
get_simulation_asset_transfers, чтобы показать, что бы сделала транзакция, если бы прошла.
Понимание того, что сделала транзакция
Что попросить:“Проведи меня по всему, что произошло в транзакции 0x… в Ethereum, каждый внутренний вызов, кто кого вызывал и что изменилось.”Что делает Claude:
- Вызывает
trace_transactionдля верхнеуровневой сводки: имя метода, отправитель, получатель, использованный газ и статус. - Вызывает
get_simulation_call_trace, чтобы получить полное внутреннее дерево вызовов — каждый вложенный вызов с декодированными именами функций, входами, выходами и газом по каждому вызову. - Вызывает
get_simulation_events, чтобы перечислить все эмитированные события по порядку. - Вызывает
get_simulation_state_changes, чтобы показать каждый слот хранилища и баланс, которые изменились.
Инспекция смарт-контракта
Что попросить:“Какой контракт задеплоен по адресу 0xdAC17F958D2ee523a2206206994597C13D831ec7 в Ethereum?”Что делает Claude:
- Вызывает
get_contract_infoс адресом и network ID Ethereum.
Отправка имперсонированной транзакции в Virtual Environment и её трассировка
Что попросить:
“В моём Virtual Environment отправь транзакцию от деплойера Uniswap V2 0x1a9C8182C09F50C8318d769245beA52c32BE35BC на контракт USDC 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, вызывающую функцию transfer, чтобы отправить 1000 USDC на мой кошелёк. Затем протрассируй исполнение.”
Что делает Claude:
- Вызывает
send_vnet_transactionв активном Virtual Environment с деплойером какfrom, USDC какtoи calldatatransfer, закодированной по ABI. Отправитель имперсонируется, приватный ключ не нужен. - Вызывает
get_vnet_transactions, чтобы получитьoperation_idвыполненной транзакции. - Вызывает
trace_vnet_transaction, чтобы получить декодированную сводку исполнения — имя контракта, имя функции, декодированные входные параметры и выход. - Опционально вызывает
get_vnet_simulation_eventsиget_vnet_simulation_state_changesдля более глубоких деталей.
transfer, и эмитированные события (событие Transfer с вашим кошельком в качестве получателя).
Тестирование многошагового взаимодействия с контрактом в Virtual Environment
Что попросить:“В моём Virtual Environment пройди полный цикл approval и swap: сначала одобри роутер Uniswap на трату 1000 USDC с моего кошелька, затем выполни swap. Покажи мои балансы до и после.”Что делает Claude:
- Вызывает
send_vnet_transactionв активном Virtual Environment, чтобы отправить транзакциюapprove, имперсонируя ваш кошелёк — приватный ключ не нужен. - Ещё раз вызывает
send_vnet_transactionс calldata swap. - Вызывает
get_vnet_simulation_asset_changesдля каждой транзакции, чтобы показать движения токенов на каждом шаге. - Вызывает
get_vnet_simulation_balance_changesпосле последнего шага, чтобы показать чистое изменение баланса.
Анализ использования газа для оптимизации
Что попросить:“Симулируй эту транзакцию и покажи разбивку газа, чтобы я мог найти самые дорогие вызовы функций: [вставьте calldata или опишите транзакцию]”Что делает Claude:
- Вызывает
simulate_transactionс параметрами вашей транзакции. - Вызывает
get_simulation_gas_breakdown, чтобы получить потребление газа по каждому вызову, включая intrinsic gas и refunds. - Вызывает
get_simulation_call_trace, чтобы связать стоимость газа с конкретными вызовами функций в дереве исполнения.
Используйте
get_simulation_generated_access_list, чтобы сгенерировать access list EIP-2930, который может снизить стоимость газа за счёт заранее объявленных слотов хранилища и адресов, к которым обратится транзакция.Форк Virtual Environment для параллельного тестирования
Что попросить:“Форкни мой текущий Virtual Environment, чтобы я мог протестировать другой подход, не теряя текущее состояние.”Что делает Claude:
- Вызывает
list_vnets, чтобы найти ваш текущий Virtual Environment, затем при необходимостиset_active_vnet. - Вызывает
fork_vnet, создавая новый Virtual Environment со всем сохранённым состоянием — задеплоенными контрактами, балансами и историей транзакций. Форк автоматически становится активным. - Возвращает детали нового Virtual Environment со свежими RPC URL.
Снапшот, тестирование и откат для стресс-тестирования
Что попросить:“В моём Virtual Environment сделай снапшот текущего состояния, затем симулируй ликвидацию в Aave с разными ценами оракула. Откатывайся к снапшоту между попытками, чтобы я мог сравнить исходы.”Что делает Claude:
- Вызывает
snapshot_vnet, чтобы сохранить текущее состояние Virtual Environment, получая ID снапшота. - Вызывает
set_storage_at, чтобы переопределить цену оракула на конкретное значение. - Вызывает
send_vnet_transaction, чтобы запустить ликвидацию. - Вызывает
get_vnet_simulation_balance_changesиget_vnet_simulation_asset_changes, чтобы зафиксировать исход. - Вызывает
revert_vnet, чтобы восстановить Virtual Environment к состоянию снапшота (снапшот расходуется). - Снова вызывает
snapshot_vnetдля следующей итерации, устанавливает другую цену оракула и повторяет.
Установка балансов ERC-20 для тестирования
Что попросить:“В моём Virtual Environment дай моему кошельку 0xd8da6bf26964af9d7eed9e03e53415d37aa96045 баланс 10 000 USDC и 5 WETH, чтобы я мог протестировать swap.”Что делает Claude:
- Вызывает
set_erc20_balanceс адресом токена USDC, вашим кошельком и нужным количеством. - Ещё раз вызывает
set_erc20_balanceс адресом токена WETH и количеством. - Опционально вызывает
vnet_callс вызовомbalanceOf, чтобы проверить, что балансы установлены корректно.
set_erc20_balance автоматически учитывает раскладку хранилища токена.
Путешествие во времени для тестирования timelock’ов и vesting
Что попросить:“В моём Virtual Environment продвинь часы на 7 дней вперёд, чтобы протестировать, корректно ли разблокируется мой timelock-контракт.”Что делает Claude:
- Вызывает
increase_timeс 604800 секундами (7 дней), чтобы продвинуть часы Virtual Environment. - Вызывает
mine_block, чтобы зафиксировать изменение времени в новом блоке. - Вызывает
vnet_call, чтобы прочитать состояние timelock-контракта (например,isUnlocked()илиreleaseTime()). - Опционально вызывает
send_vnet_transaction, чтобы выполнить разблокировку и убедиться в её успехе.