import { type Logger, type LoggerBindings } from '@aztec/foundation/log'; import type { ForeignCallHandler } from '@aztec/noir-acvm_js'; import type { ACIRCallback } from '../acvm/acvm.js'; import type { ACVMWitness } from '../acvm/acvm_types.js'; export type OracleCall = { name: string; inputs: unknown[]; outputs: unknown; time: number; stackDepth: number; }; export declare class CircuitRecording { circuitName: string; functionName: string; bytecodeSHA512Hash: string; timestamp: number; inputs: Record; oracleCalls: OracleCall[]; error?: string; parent?: CircuitRecording; constructor(circuitName: string, functionName: string, bytecodeSHA512Hash: string, inputs: Record); setParent(recording?: CircuitRecording): void; } /** Inputs needed to open a recording for a single circuit execution. */ export type RecordingMetadata = { input: ACVMWitness; bytecode: Buffer; circuitName: string; functionName: string; }; /** * Class responsible for recording circuit inputs necessary to replay the circuit. These inputs are the initial witness * map and the oracle calls made during the circuit execution/witness generation. * * The active recording for an execution lives in `AsyncLocalStorage`, so each (possibly nested) circuit execution owns * its own recording and concurrent or re-entrant executions cannot corrupt one another's state. Nested executions * (`aztec_prv_callPrivateFunction`, utility calls) re-enter {@link record}, which links the child to the recording * active in the enclosing async context and lets ALS restore the parent automatically when the child completes. * * Example recording object: * ```json * { * "circuitName": "AMM", * "functionName": "add_liquidity", * "bytecodeSHA512Hash": "b46c640ed38f20eac5f61a5e41d8dd1e", * "timestamp": 1740691464360, * "inputs": { * "0": "0x1e89de1f0ad5204263733b7ddf65bec45b8f44714a4da85a46474dad677679ef", * "1": "0x00f4d59c0ff773427bb0fed5b422557ca4dc5655abe53d31fa9408cb3c5a672f", * "5": "0x000000000000000000000000000000000000000000000000000000000000000f" * }, * "oracleCalls": [ * { * "name": "loadCapsule", * "inputs": [ * [ * "0x102422483bad6abd385948435667e144ac4c272576e325e7563608876cd446fd" * ], * [ * "0x000000000000000000000000000000000000000000000000000000000000004d" * ], * [ * "0x0000000000000000000000000000000000000000000000000000000000000001" * ] * ], * "outputs": [ * "0x0000000000000000000000000000000000000000000000000000000000000000", * [ * "0x0000000000000000000000000000000000000000000000000000000000000000" * ] * ] * }, * { * "name": "fetchTaggedLogs", * "inputs": [] * } * ] * } * ``` */ export declare class CircuitRecorder { #private; protected readonly logger: Logger; protected constructor(loggerOrBindings?: Logger | LoggerBindings); /** * Records a single circuit execution. Opens a recording for the circuit (linked as a child of the recording active * in the current async context, if any), runs `fn` within that recording's context, and finalizes it. The recording * is returned alongside the result so callers can derive per-circuit stats (e.g. oracle timings). * * Recorder bookkeeping never alters execution: if `fn` throws, the error is attached to the recording and re-thrown * unchanged. * @param metadata - Identifies the circuit and its initial witness. * @param fn - Runs the circuit execution; its oracle calls are recorded into this recording. */ record(metadata: RecordingMetadata, fn: () => Promise): Promise<{ result: T; recording: CircuitRecording; }>; /** * Wraps a callback to record all oracle/foreign calls. * @param callback - The original callback to wrap, either a user circuit callback or protocol circuit callback. * @returns A wrapped callback that records all oracle interactions. */ wrapCallback(callback: ACIRCallback | ForeignCallHandler | undefined): ACIRCallback | ForeignCallHandler | undefined; /** * Records a single oracle/foreign call with its inputs and outputs against the recording active in the current * async context. * @param name - Name of the call * @param inputs - Input arguments * @param outputs - Output results */ recordCall(name: string, inputs: unknown[], outputs: unknown, time: number): Promise; /** The recording active in the current async context, if any. */ protected currentRecording(): CircuitRecording | undefined; /** Hook invoked when a recording opens, within the recording's context. Overridden to persist recordings. */ protected onStart(_recording: CircuitRecording): Promise; /** Hook invoked when a recording completes successfully, within the recording's context. */ protected onFinish(_recording: CircuitRecording): Promise; /** Hook invoked when a recording's execution throws, within the recording's context. */ protected onError(_recording: CircuitRecording, _error: unknown): Promise; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY3VpdF9yZWNvcmRlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ByaXZhdGUvY2lyY3VpdF9yZWNvcmRpbmcvY2lyY3VpdF9yZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsS0FBSyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQWlCLE1BQU0sdUJBQXVCLENBQUM7QUFFeEYsT0FBTyxLQUFLLEVBQUUsa0JBQWtCLEVBQXVDLE1BQU0scUJBQXFCLENBQUM7QUFJbkcsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsTUFBTSxNQUFNLFVBQVUsR0FBRztJQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQU1iLFVBQVUsRUFBRSxNQUFNLENBQUM7Q0FDcEIsQ0FBQztBQUVGLHFCQUFhLGdCQUFnQjtJQUMzQixXQUFXLEVBQUUsTUFBTSxDQUFDO0lBQ3BCLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBQzNCLFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0IsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFCLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNmLE1BQU0sQ0FBQyxFQUFFLGdCQUFnQixDQUFDO0lBRTFCLFlBQVksV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFPaEg7SUFFRCxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsZ0JBQWdCLEdBQUcsSUFBSSxDQUU1QztDQUNGO0FBRUQsd0VBQXdFO0FBQ3hFLE1BQU0sTUFBTSxpQkFBaUIsR0FBRztJQUM5QixLQUFLLEVBQUUsV0FBVyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQixZQUFZLEVBQUUsTUFBTSxDQUFDO0NBQ3RCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQUNILHFCQUFhLGVBQWU7O0lBQzFCLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUlsQyxTQUFTLGFBQWEsZ0JBQWdCLENBQUMsRUFBRSxNQUFNLEdBQUcsY0FBYyxFQUUvRDtJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxNQUFNLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7UUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFBO0tBQUUsQ0FBQyxDQXNCaEg7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLEdBQUcsa0JBQWtCLEdBQUcsU0FBUyxHQUFHLFlBQVksR0FBRyxrQkFBa0IsR0FBRyxTQUFTLENBUW5IO0lBeUREOzs7Ozs7T0FNRztJQUNILFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQWEvRjtJQUVELGlFQUFpRTtJQUNqRSxTQUFTLENBQUMsZ0JBQWdCLElBQUksZ0JBQWdCLEdBQUcsU0FBUyxDQUV6RDtJQUVELDZHQUE2RztJQUM3RyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTdEO0lBRUQsNEZBQTRGO0lBQzVGLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFOUQ7SUFFRCx3RkFBd0Y7SUFDeEYsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTlFO0NBQ0YifQ==