/** * Anvil snapshot/revert helpers for the red-team agent feedback loop. * * snapshot() and revert() use Anvil's proprietary RPC methods to save and * restore chain state, allowing scenarios to run mutating actions and then * reset the fork cleanly. * * mineBlocks is re-exported from recenter.ts so callers can import both * snapshot helpers and block-mining from a single module. */ import { rpcCall } from './rpc.js'; export { mineBlocks } from './recenter.js'; /** * Take an Anvil chain snapshot. * * @returns The snapshot ID (hex string) to pass to revert(). */ export async function snapshot(rpcUrl: string): Promise { const id = (await rpcCall(rpcUrl, 'anvil_snapshot', [])) as string; console.log(`[anvil] Snapshot taken: ${id}`); return id; } /** * Revert the chain to a previously taken snapshot. * * ⚠️ anvil_revert is one-shot: the snapshot is consumed on success and the ID * becomes invalid afterward. Callers that need to reuse a checkpoint must * call snapshot() again after each revert. * * Throws if Anvil reports the revert as unsuccessful (e.g. unknown or already-used * snapshot ID). * * @param snapshotId - The hex snapshot ID returned by snapshot(). */ export async function revert(rpcUrl: string, snapshotId: string): Promise { const success = (await rpcCall(rpcUrl, 'anvil_revert', [snapshotId])) as boolean; if (!success) throw new Error(`[anvil] revert failed for snapshot ${snapshotId}`); console.log(`[anvil] Reverted to snapshot: ${snapshotId}`); }