@aztec/simulator 0.63.0 → 0.64.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/avm/avm_contract_call_result.d.ts +18 -1
- package/dest/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/avm/avm_contract_call_result.js +30 -3
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +7 -11
- package/dest/avm/avm_simulator.d.ts +6 -1
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +29 -8
- package/dest/avm/avm_tree.d.ts +4 -18
- package/dest/avm/avm_tree.d.ts.map +1 -1
- package/dest/avm/avm_tree.js +71 -53
- package/dest/avm/errors.d.ts +7 -0
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +11 -1
- package/dest/avm/fixtures/index.d.ts +2 -2
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +1 -1
- package/dest/avm/index.d.ts +1 -0
- package/dest/avm/index.d.ts.map +1 -1
- package/dest/avm/index.js +2 -1
- package/dest/avm/journal/journal.d.ts +14 -13
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +81 -68
- package/dest/avm/journal/public_storage.d.ts +0 -1
- package/dest/avm/journal/public_storage.d.ts.map +1 -1
- package/dest/avm/journal/public_storage.js +6 -6
- package/dest/avm/opcodes/accrued_substate.js +2 -2
- package/dest/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/avm/opcodes/addressing_mode.js +8 -2
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +2 -4
- package/dest/avm/opcodes/instruction.d.ts +1 -1
- package/dest/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction.js +1 -1
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/public/dual_side_effect_trace.d.ts +3 -9
- package/dest/public/dual_side_effect_trace.d.ts.map +1 -1
- package/dest/public/dual_side_effect_trace.js +5 -11
- package/dest/public/enqueued_call_side_effect_trace.d.ts +4 -10
- package/dest/public/enqueued_call_side_effect_trace.d.ts.map +1 -1
- package/dest/public/enqueued_call_side_effect_trace.js +6 -15
- package/dest/public/executor_metrics.d.ts +1 -2
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +2 -8
- package/dest/public/fixtures/index.d.ts +14 -0
- package/dest/public/fixtures/index.d.ts.map +1 -0
- package/dest/public/fixtures/index.js +100 -0
- package/dest/public/index.d.ts +1 -2
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +1 -2
- package/dest/public/public_processor.d.ts +0 -2
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +5 -12
- package/dest/public/public_tx_context.d.ts +6 -4
- package/dest/public/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_context.js +11 -7
- package/dest/public/public_tx_simulator.d.ts +56 -5
- package/dest/public/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator.js +106 -26
- package/dest/public/side_effect_trace.d.ts +4 -10
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +6 -15
- package/dest/public/side_effect_trace_interface.d.ts +3 -9
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/transitional_adapters.d.ts +1 -2
- package/dest/public/transitional_adapters.d.ts.map +1 -1
- package/dest/public/transitional_adapters.js +8 -10
- package/package.json +10 -10
- package/src/avm/avm_contract_call_result.ts +39 -2
- package/src/avm/avm_memory_types.ts +6 -10
- package/src/avm/avm_simulator.ts +58 -8
- package/src/avm/avm_tree.ts +88 -64
- package/src/avm/errors.ts +11 -0
- package/src/avm/fixtures/index.ts +4 -3
- package/src/avm/index.ts +1 -0
- package/src/avm/journal/journal.ts +118 -126
- package/src/avm/journal/public_storage.ts +5 -6
- package/src/avm/opcodes/accrued_substate.ts +1 -1
- package/src/avm/opcodes/addressing_mode.ts +7 -2
- package/src/avm/opcodes/external_calls.ts +1 -3
- package/src/avm/opcodes/instruction.ts +1 -1
- package/src/index.ts +0 -1
- package/src/public/dual_side_effect_trace.ts +4 -13
- package/src/public/enqueued_call_side_effect_trace.ts +14 -17
- package/src/public/executor_metrics.ts +1 -9
- package/src/public/fixtures/index.ts +158 -0
- package/src/public/index.ts +1 -5
- package/src/public/public_processor.ts +5 -27
- package/src/public/public_tx_context.ts +13 -8
- package/src/public/public_tx_simulator.ts +182 -50
- package/src/public/side_effect_trace.ts +9 -19
- package/src/public/side_effect_trace_interface.ts +3 -9
- package/src/public/transitional_adapters.ts +12 -12
- package/dest/mocks/fixtures.d.ts +0 -28
- package/dest/mocks/fixtures.d.ts.map +0 -1
- package/dest/mocks/fixtures.js +0 -48
- package/dest/mocks/index.d.ts +0 -2
- package/dest/mocks/index.d.ts.map +0 -1
- package/dest/mocks/index.js +0 -2
- package/dest/public/executor.d.ts +0 -47
- package/dest/public/executor.d.ts.map +0 -1
- package/dest/public/executor.js +0 -90
- package/src/mocks/fixtures.ts +0 -72
- package/src/mocks/index.ts +0 -1
- package/src/public/executor.ts +0 -154
|
@@ -3,9 +3,8 @@ import { AvmCircuitInputs, AvmCircuitPublicInputs, AztecAddress, ContractStorage
|
|
|
3
3
|
import { computeNoteHashNonce, computeUniqueNoteHash, computeVarArgsHash, siloNoteHash } from '@aztec/circuits.js/hash';
|
|
4
4
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
5
5
|
import { assertLength } from '@aztec/foundation/serialize';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { createAvmExecutionEnvironment } from './executor.js';
|
|
6
|
+
import { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
|
|
7
|
+
import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
9
8
|
export function generateAvmCircuitPublicInputs(trace, globalVariables, startStateReference, startGasUsed, gasSettings, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, endStateReference, endGasUsed, transactionFee, revertCode) {
|
|
10
9
|
const startTreeSnapshots = new TreeSnapshots(startStateReference.l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
|
|
11
10
|
const endTreeSnapshots = new TreeSnapshots(endStateReference.l1ToL2MessageTree, endStateReference.partial.noteHashTree, endStateReference.partial.nullifierTree, endStateReference.partial.publicDataTree);
|
|
@@ -64,16 +63,15 @@ export function generateAvmCircuitPublicInputs(trace, globalVariables, startStat
|
|
|
64
63
|
//console.log(`AvmCircuitPublicInputs:\n${inspect(avmCircuitPublicInputs)}`);
|
|
65
64
|
return avmCircuitPublicInputs;
|
|
66
65
|
}
|
|
67
|
-
export
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
const avmCallResult = new
|
|
66
|
+
export function generateAvmProvingRequest(real, fnName, stateManager, historicalHeader, globalVariables, executionRequest, result, allocatedGas, transactionFee) {
|
|
67
|
+
const avmExecutionEnv = new AvmExecutionEnvironment(executionRequest.callContext.contractAddress, executionRequest.callContext.msgSender, executionRequest.callContext.functionSelector,
|
|
68
|
+
/*contractCallDepth=*/ Fr.zero(), transactionFee, globalVariables, executionRequest.callContext.isStaticCall, executionRequest.args);
|
|
69
|
+
const avmCallResult = new AvmFinalizedCallResult(result.reverted, result.returnValues, result.endGasLeft);
|
|
71
70
|
// Generate an AVM proving request
|
|
72
71
|
let avmProvingRequest;
|
|
73
72
|
if (real) {
|
|
74
73
|
const deprecatedFunctionCallResult = stateManager.trace.toPublicFunctionCallResult(avmExecutionEnv,
|
|
75
|
-
/*startGasLeft=*/ allocatedGas,
|
|
76
|
-
/*endGasLeft=*/ Gas.from(result.endGasLeft), Buffer.alloc(0), avmCallResult, fnName);
|
|
74
|
+
/*startGasLeft=*/ allocatedGas, Buffer.alloc(0), avmCallResult, fnName);
|
|
77
75
|
const publicInputs = getPublicCircuitPublicInputs(historicalHeader, globalVariables, deprecatedFunctionCallResult);
|
|
78
76
|
avmProvingRequest = makeAvmProvingRequest(publicInputs, deprecatedFunctionCallResult);
|
|
79
77
|
}
|
|
@@ -124,4 +122,4 @@ function getPublicCircuitPublicInputs(historicalHeader, globalVariables, result)
|
|
|
124
122
|
revertCode: result.reverted ? RevertCode.APP_LOGIC_REVERTED : RevertCode.OK,
|
|
125
123
|
});
|
|
126
124
|
}
|
|
127
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixrQkFBa0IsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBQ0YsR0FBRyxFQUlILGFBQWEsRUFDYixPQUFPLEVBQ1AsMkJBQTJCLEVBQzNCLHVDQUF1QyxFQUN2QywwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsaURBQWlELEVBQ2pELG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDOUIsd0NBQXdDLEVBQ3hDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsUUFBUSxFQUNSLFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBRXZDLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsVUFBVSxFQUVWLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9B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
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixrQkFBa0IsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBQ0YsR0FBRyxFQUlILGFBQWEsRUFDYixPQUFPLEVBQ1AsMkJBQTJCLEVBQzNCLHVDQUF1QyxFQUN2QywwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsaURBQWlELEVBQ2pELG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDOUIsd0NBQXdDLEVBQ3hDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsUUFBUSxFQUNSLFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBRXZDLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsVUFBVSxFQUVWLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9B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
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.64.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./
|
|
7
|
+
"./public/fixtures": "./dest/public/fixtures/index.js"
|
|
8
8
|
},
|
|
9
9
|
"typedocOptions": {
|
|
10
10
|
"entryPoints": [
|
|
@@ -59,14 +59,14 @@
|
|
|
59
59
|
]
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@aztec/circuit-types": "0.
|
|
63
|
-
"@aztec/circuits.js": "0.
|
|
64
|
-
"@aztec/foundation": "0.
|
|
65
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
66
|
-
"@aztec/protocol-contracts": "0.
|
|
67
|
-
"@aztec/telemetry-client": "0.
|
|
68
|
-
"@aztec/types": "0.
|
|
69
|
-
"@aztec/world-state": "0.
|
|
62
|
+
"@aztec/circuit-types": "0.64.0",
|
|
63
|
+
"@aztec/circuits.js": "0.64.0",
|
|
64
|
+
"@aztec/foundation": "0.64.0",
|
|
65
|
+
"@aztec/noir-protocol-circuits-types": "0.64.0",
|
|
66
|
+
"@aztec/protocol-contracts": "0.64.0",
|
|
67
|
+
"@aztec/telemetry-client": "0.64.0",
|
|
68
|
+
"@aztec/types": "0.64.0",
|
|
69
|
+
"@aztec/world-state": "0.64.0",
|
|
70
70
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
71
71
|
"@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
|
|
72
72
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
@@ -1,15 +1,52 @@
|
|
|
1
|
+
import { type SimulationError } from '@aztec/circuit-types';
|
|
2
|
+
import { Gas } from '@aztec/circuits.js';
|
|
1
3
|
import { type Fr } from '@aztec/foundation/fields';
|
|
2
4
|
|
|
5
|
+
import { inspect } from 'util';
|
|
6
|
+
|
|
7
|
+
import { createSimulationError } from '../common/errors.js';
|
|
8
|
+
import { type Gas as AvmGas } from './avm_gas.js';
|
|
3
9
|
import { type AvmRevertReason } from './errors.js';
|
|
4
10
|
|
|
5
11
|
/**
|
|
6
12
|
* Results of an contract call's execution in the AVM.
|
|
7
13
|
*/
|
|
8
14
|
export class AvmContractCallResult {
|
|
9
|
-
constructor(
|
|
15
|
+
constructor(
|
|
16
|
+
public reverted: boolean,
|
|
17
|
+
public output: Fr[],
|
|
18
|
+
public gasLeft: AvmGas,
|
|
19
|
+
public revertReason?: AvmRevertReason,
|
|
20
|
+
) {}
|
|
21
|
+
|
|
22
|
+
toString(): string {
|
|
23
|
+
let resultsStr = `reverted: ${this.reverted}, output: ${this.output}, gasLeft: ${inspect(this.gasLeft)}`;
|
|
24
|
+
if (this.revertReason) {
|
|
25
|
+
resultsStr += `, revertReason: ${this.revertReason}`;
|
|
26
|
+
}
|
|
27
|
+
return resultsStr;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
finalize(): AvmFinalizedCallResult {
|
|
31
|
+
const revertReason = this.revertReason ? createSimulationError(this.revertReason, this.output) : undefined;
|
|
32
|
+
return new AvmFinalizedCallResult(this.reverted, this.output, Gas.from(this.gasLeft), revertReason);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Similar to AvmContractCallResult, but with a SimulationError and standard Gas
|
|
38
|
+
* which are useful for consumption external to core AVM simulation.
|
|
39
|
+
*/
|
|
40
|
+
export class AvmFinalizedCallResult {
|
|
41
|
+
constructor(
|
|
42
|
+
public reverted: boolean,
|
|
43
|
+
public output: Fr[],
|
|
44
|
+
public gasLeft: Gas,
|
|
45
|
+
public revertReason?: SimulationError,
|
|
46
|
+
) {}
|
|
10
47
|
|
|
11
48
|
toString(): string {
|
|
12
|
-
let resultsStr = `reverted: ${this.reverted}, output: ${this.output}`;
|
|
49
|
+
let resultsStr = `reverted: ${this.reverted}, output: ${this.output}, gasLeft: ${inspect(this.gasLeft)}`;
|
|
13
50
|
if (this.revertReason) {
|
|
14
51
|
resultsStr += `, revertReason: ${this.revertReason}`;
|
|
15
52
|
}
|
|
@@ -232,8 +232,8 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
232
232
|
// Whether to track and validate memory accesses for each instruction.
|
|
233
233
|
static readonly TRACK_MEMORY_ACCESSES = process.env.NODE_ENV === 'test';
|
|
234
234
|
|
|
235
|
-
// FIXME: memory should be 2^32, but TS
|
|
236
|
-
static readonly MAX_MEMORY_SIZE = Number((1n << 32n) -
|
|
235
|
+
// FIXME: memory should be 2^32, but TS max array size is: 2^32 - 1
|
|
236
|
+
static readonly MAX_MEMORY_SIZE = Number((1n << 32n) - 1n);
|
|
237
237
|
private _mem: MemoryValue[];
|
|
238
238
|
|
|
239
239
|
constructor() {
|
|
@@ -264,8 +264,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
public getSlice(offset: number, size: number): MemoryValue[] {
|
|
267
|
-
assert(offset
|
|
268
|
-
assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
|
|
267
|
+
assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
|
|
269
268
|
const value = this._mem.slice(offset, offset + size);
|
|
270
269
|
TaggedMemory.log.debug(`getSlice(${offset}, ${size}) = ${value}`);
|
|
271
270
|
for (let i = 0; i < value.length; i++) {
|
|
@@ -278,14 +277,12 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
278
277
|
}
|
|
279
278
|
|
|
280
279
|
public getSliceAs<T>(offset: number, size: number): T[] {
|
|
281
|
-
assert(offset
|
|
282
|
-
assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
|
|
280
|
+
assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
|
|
283
281
|
return this.getSlice(offset, size) as T[];
|
|
284
282
|
}
|
|
285
283
|
|
|
286
284
|
public getSliceTags(offset: number, size: number): TypeTag[] {
|
|
287
|
-
assert(offset
|
|
288
|
-
assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
|
|
285
|
+
assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
|
|
289
286
|
return this._mem.slice(offset, offset + size).map(TaggedMemory.getTag);
|
|
290
287
|
}
|
|
291
288
|
|
|
@@ -296,8 +293,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
296
293
|
}
|
|
297
294
|
|
|
298
295
|
public setSlice(offset: number, vs: MemoryValue[]) {
|
|
299
|
-
assert(offset
|
|
300
|
-
assert(offset + vs.length < TaggedMemory.MAX_MEMORY_SIZE);
|
|
296
|
+
assert(offset + vs.length <= TaggedMemory.MAX_MEMORY_SIZE);
|
|
301
297
|
// We may need to extend the memory size, otherwise splice doesn't insert.
|
|
302
298
|
if (offset + vs.length > this._mem.length) {
|
|
303
299
|
this._mem.length = offset + vs.length;
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -1,20 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type AztecAddress,
|
|
3
|
+
Fr,
|
|
4
|
+
type FunctionSelector,
|
|
5
|
+
type GlobalVariables,
|
|
6
|
+
MAX_L2_GAS_PER_ENQUEUED_CALL,
|
|
7
|
+
} from '@aztec/circuits.js';
|
|
2
8
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
3
9
|
|
|
4
10
|
import { strict as assert } from 'assert';
|
|
5
11
|
|
|
6
12
|
import { SideEffectLimitReachedError } from '../public/side_effect_errors.js';
|
|
7
|
-
import
|
|
13
|
+
import { AvmContext } from './avm_context.js';
|
|
8
14
|
import { AvmContractCallResult } from './avm_contract_call_result.js';
|
|
15
|
+
import { AvmExecutionEnvironment } from './avm_execution_environment.js';
|
|
9
16
|
import { type Gas } from './avm_gas.js';
|
|
17
|
+
import { AvmMachineState } from './avm_machine_state.js';
|
|
10
18
|
import { isAvmBytecode } from './bytecode_utils.js';
|
|
11
19
|
import {
|
|
12
20
|
AvmExecutionError,
|
|
21
|
+
AvmRevertReason,
|
|
13
22
|
InvalidProgramCounterError,
|
|
14
|
-
NoBytecodeForContractError,
|
|
15
23
|
revertReasonFromExceptionalHalt,
|
|
16
24
|
revertReasonFromExplicitRevert,
|
|
17
25
|
} from './errors.js';
|
|
26
|
+
import { type AvmPersistableStateManager } from './journal/journal.js';
|
|
18
27
|
import { decodeInstructionFromBytecode } from './serialization/bytecode_serialization.js';
|
|
19
28
|
|
|
20
29
|
type OpcodeTally = {
|
|
@@ -41,16 +50,57 @@ export class AvmSimulator {
|
|
|
41
50
|
this.log = createDebugLogger(`aztec:avm_simulator:core(f:${context.environment.functionSelector.toString()})`);
|
|
42
51
|
}
|
|
43
52
|
|
|
53
|
+
public static create(
|
|
54
|
+
stateManager: AvmPersistableStateManager,
|
|
55
|
+
address: AztecAddress,
|
|
56
|
+
sender: AztecAddress,
|
|
57
|
+
functionSelector: FunctionSelector, // may be temporary (#7224)
|
|
58
|
+
transactionFee: Fr,
|
|
59
|
+
globals: GlobalVariables,
|
|
60
|
+
isStaticCall: boolean,
|
|
61
|
+
calldata: Fr[],
|
|
62
|
+
allocatedGas: Gas,
|
|
63
|
+
) {
|
|
64
|
+
const avmExecutionEnv = new AvmExecutionEnvironment(
|
|
65
|
+
address,
|
|
66
|
+
sender,
|
|
67
|
+
functionSelector,
|
|
68
|
+
/*contractCallDepth=*/ Fr.zero(),
|
|
69
|
+
transactionFee,
|
|
70
|
+
globals,
|
|
71
|
+
isStaticCall,
|
|
72
|
+
calldata,
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const avmMachineState = new AvmMachineState(allocatedGas);
|
|
76
|
+
const avmContext = new AvmContext(stateManager, avmExecutionEnv, avmMachineState);
|
|
77
|
+
return new AvmSimulator(avmContext);
|
|
78
|
+
}
|
|
79
|
+
|
|
44
80
|
/**
|
|
45
81
|
* Fetch the bytecode and execute it in the current context.
|
|
46
82
|
*/
|
|
47
83
|
public async execute(): Promise<AvmContractCallResult> {
|
|
48
84
|
const bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
|
|
49
85
|
|
|
50
|
-
// This assumes that we will not be able to send messages to accounts without code
|
|
51
|
-
// Pending classes and instances impl details
|
|
52
86
|
if (!bytecode) {
|
|
53
|
-
|
|
87
|
+
// revert, consuming all gas
|
|
88
|
+
const message = `No bytecode found at: ${this.context.environment.address}. Reverting...`;
|
|
89
|
+
const revertReason = new AvmRevertReason(
|
|
90
|
+
message,
|
|
91
|
+
/*failingFunction=*/ {
|
|
92
|
+
contractAddress: this.context.environment.address,
|
|
93
|
+
functionSelector: this.context.environment.functionSelector,
|
|
94
|
+
},
|
|
95
|
+
/*noirCallStack=*/ [],
|
|
96
|
+
);
|
|
97
|
+
this.log.warn(message);
|
|
98
|
+
return new AvmContractCallResult(
|
|
99
|
+
/*reverted=*/ true,
|
|
100
|
+
/*output=*/ [],
|
|
101
|
+
/*gasLeft=*/ { l2Gas: 0, daGas: 0 },
|
|
102
|
+
revertReason,
|
|
103
|
+
);
|
|
54
104
|
}
|
|
55
105
|
|
|
56
106
|
return await this.executeBytecode(bytecode);
|
|
@@ -119,7 +169,7 @@ export class AvmSimulator {
|
|
|
119
169
|
const output = machineState.getOutput();
|
|
120
170
|
const reverted = machineState.getReverted();
|
|
121
171
|
const revertReason = reverted ? revertReasonFromExplicitRevert(output, this.context) : undefined;
|
|
122
|
-
const results = new AvmContractCallResult(reverted, output, revertReason);
|
|
172
|
+
const results = new AvmContractCallResult(reverted, output, machineState.gasLeft, revertReason);
|
|
123
173
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
124
174
|
|
|
125
175
|
this.printOpcodeTallies();
|
|
@@ -134,7 +184,7 @@ export class AvmSimulator {
|
|
|
134
184
|
|
|
135
185
|
const revertReason = revertReasonFromExceptionalHalt(err, this.context);
|
|
136
186
|
// Note: "exceptional halts" cannot return data, hence [].
|
|
137
|
-
const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], revertReason);
|
|
187
|
+
const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], machineState.gasLeft, revertReason);
|
|
138
188
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
139
189
|
|
|
140
190
|
this.printOpcodeTallies();
|
package/src/avm/avm_tree.ts
CHANGED
|
@@ -51,11 +51,10 @@ export class AvmEphemeralForest {
|
|
|
51
51
|
constructor(
|
|
52
52
|
public treeDb: MerkleTreeReadOperations,
|
|
53
53
|
public treeMap: Map<MerkleTreeId, EphemeralAvmTree>,
|
|
54
|
-
// This contains the preimage and the leaf index of leaf in the ephemeral tree that contains the lowest key (i.e. nullifier value or public data tree slot)
|
|
55
|
-
public indexedTreeMin: Map<IndexedTreeId, [IndexedTreeLeafPreimage, bigint]>,
|
|
56
54
|
// This contains the [leaf index,indexed leaf preimages] tuple that were updated or inserted in the ephemeral tree
|
|
57
55
|
// This is needed since we have a sparse collection of keys sorted leaves in the ephemeral tree
|
|
58
56
|
public indexedUpdates: Map<IndexedTreeId, Map<bigint, IndexedTreeLeafPreimage>>,
|
|
57
|
+
public indexedSortedKeys: Map<IndexedTreeId, [Fr, bigint][]>,
|
|
59
58
|
) {}
|
|
60
59
|
|
|
61
60
|
static async create(treeDb: MerkleTreeReadOperations): Promise<AvmEphemeralForest> {
|
|
@@ -65,15 +64,18 @@ export class AvmEphemeralForest {
|
|
|
65
64
|
const tree = await EphemeralAvmTree.create(treeInfo.size, treeInfo.depth, treeDb, treeType);
|
|
66
65
|
treeMap.set(treeType, tree);
|
|
67
66
|
}
|
|
68
|
-
|
|
67
|
+
const indexedSortedKeys = new Map<IndexedTreeId, [Fr, bigint][]>();
|
|
68
|
+
indexedSortedKeys.set(MerkleTreeId.NULLIFIER_TREE as IndexedTreeId, []);
|
|
69
|
+
indexedSortedKeys.set(MerkleTreeId.PUBLIC_DATA_TREE as IndexedTreeId, []);
|
|
70
|
+
return new AvmEphemeralForest(treeDb, treeMap, new Map(), indexedSortedKeys);
|
|
69
71
|
}
|
|
70
72
|
|
|
71
73
|
fork(): AvmEphemeralForest {
|
|
72
74
|
return new AvmEphemeralForest(
|
|
73
75
|
this.treeDb,
|
|
74
76
|
cloneDeep(this.treeMap),
|
|
75
|
-
cloneDeep(this.indexedTreeMin),
|
|
76
77
|
cloneDeep(this.indexedUpdates),
|
|
78
|
+
cloneDeep(this.indexedSortedKeys),
|
|
77
79
|
);
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -166,7 +168,8 @@ export class AvmEphemeralForest {
|
|
|
166
168
|
const insertionPath = tree.getSiblingPath(insertionIndex)!;
|
|
167
169
|
|
|
168
170
|
// Even though we append an empty leaf into the tree as a part of update - it doesnt seem to impact future inserts...
|
|
169
|
-
this.
|
|
171
|
+
this._updateSortedKeys(treeId, [updatedPreimage.slot], [index]);
|
|
172
|
+
|
|
170
173
|
return {
|
|
171
174
|
leafIndex: insertionIndex,
|
|
172
175
|
insertionPath,
|
|
@@ -193,8 +196,10 @@ export class AvmEphemeralForest {
|
|
|
193
196
|
);
|
|
194
197
|
const insertionPath = this.appendIndexedTree(treeId, index, updatedLowLeaf, newPublicDataLeaf);
|
|
195
198
|
|
|
196
|
-
//
|
|
197
|
-
|
|
199
|
+
// Even though the low leaf key is not updated, we still need to update the sorted keys in case we have
|
|
200
|
+
// not seen the low leaf before
|
|
201
|
+
this._updateSortedKeys(treeId, [newPublicDataLeaf.slot, updatedLowLeaf.slot], [insertionIndex, index]);
|
|
202
|
+
|
|
198
203
|
return {
|
|
199
204
|
leafIndex: insertionIndex,
|
|
200
205
|
insertionPath: insertionPath,
|
|
@@ -208,28 +213,25 @@ export class AvmEphemeralForest {
|
|
|
208
213
|
};
|
|
209
214
|
}
|
|
210
215
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
if (preimages[i].getKey() <= currentMin.preimage.getKey()) {
|
|
229
|
-
currentMin = { preimage: preimages[i], index: indices[i] };
|
|
216
|
+
private _updateSortedKeys(treeId: IndexedTreeId, keys: Fr[], index: bigint[]): void {
|
|
217
|
+
// This is a reference
|
|
218
|
+
const existingKeyVector = this.indexedSortedKeys.get(treeId)!;
|
|
219
|
+
// Should already be sorted so not need to re-sort if we just update or splice
|
|
220
|
+
for (let i = 0; i < keys.length; i++) {
|
|
221
|
+
const foundIndex = existingKeyVector.findIndex(x => x[1] === index[i]);
|
|
222
|
+
if (foundIndex === -1) {
|
|
223
|
+
// New element, we splice it into the correct location
|
|
224
|
+
const spliceIndex =
|
|
225
|
+
this.searchForKey(
|
|
226
|
+
keys[i],
|
|
227
|
+
existingKeyVector.map(x => x[0]),
|
|
228
|
+
) + 1;
|
|
229
|
+
existingKeyVector.splice(spliceIndex, 0, [keys[i], index[i]]);
|
|
230
|
+
} else {
|
|
231
|
+
// Update the existing element
|
|
232
|
+
existingKeyVector[foundIndex][0] = keys[i];
|
|
230
233
|
}
|
|
231
234
|
}
|
|
232
|
-
this.setMinInfo(treeId, currentMin.preimage, currentMin.index);
|
|
233
235
|
}
|
|
234
236
|
|
|
235
237
|
/**
|
|
@@ -258,8 +260,14 @@ export class AvmEphemeralForest {
|
|
|
258
260
|
const newNullifierLeaf = new NullifierLeafPreimage(nullifier, preimage.nextNullifier, preimage.nextIndex);
|
|
259
261
|
const insertionPath = this.appendIndexedTree(treeId, index, updatedLowNullifier, newNullifierLeaf);
|
|
260
262
|
|
|
261
|
-
//
|
|
262
|
-
|
|
263
|
+
// Even though the low nullifier key is not updated, we still need to update the sorted keys in case we have
|
|
264
|
+
// not seen the low nullifier before
|
|
265
|
+
this._updateSortedKeys(
|
|
266
|
+
treeId,
|
|
267
|
+
[newNullifierLeaf.nullifier, updatedLowNullifier.nullifier],
|
|
268
|
+
[insertionIndex, index],
|
|
269
|
+
);
|
|
270
|
+
|
|
263
271
|
return {
|
|
264
272
|
leafIndex: insertionIndex,
|
|
265
273
|
insertionPath: insertionPath,
|
|
@@ -286,31 +294,6 @@ export class AvmEphemeralForest {
|
|
|
286
294
|
return insertionPath!;
|
|
287
295
|
}
|
|
288
296
|
|
|
289
|
-
/**
|
|
290
|
-
* This is wrapper around treeId to get the correct minimum leaf preimage
|
|
291
|
-
*/
|
|
292
|
-
private getMinInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
|
|
293
|
-
treeId: ID,
|
|
294
|
-
): { preimage: T; index: bigint } | undefined {
|
|
295
|
-
const start = this.indexedTreeMin.get(treeId);
|
|
296
|
-
if (start === undefined) {
|
|
297
|
-
return undefined;
|
|
298
|
-
}
|
|
299
|
-
const [preimage, index] = start;
|
|
300
|
-
return { preimage: preimage as T, index };
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* This is wrapper around treeId to set the correct minimum leaf preimage
|
|
305
|
-
*/
|
|
306
|
-
private setMinInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
|
|
307
|
-
treeId: ID,
|
|
308
|
-
preimage: T,
|
|
309
|
-
index: bigint,
|
|
310
|
-
): void {
|
|
311
|
-
this.indexedTreeMin.set(treeId, [preimage, index]);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
297
|
/**
|
|
315
298
|
* This is wrapper around treeId to set values in the indexedUpdates map
|
|
316
299
|
*/
|
|
@@ -353,6 +336,28 @@ export class AvmEphemeralForest {
|
|
|
353
336
|
return updates.has(index);
|
|
354
337
|
}
|
|
355
338
|
|
|
339
|
+
private searchForKey(key: Fr, arr: Fr[]): number {
|
|
340
|
+
// We are looking for the index of the largest element in the array that is less than the key
|
|
341
|
+
let start = 0;
|
|
342
|
+
let end = arr.length;
|
|
343
|
+
// Note that the easiest way is to increment the search key by 1 and then do a binary search
|
|
344
|
+
const searchKey = key.add(Fr.ONE);
|
|
345
|
+
while (start < end) {
|
|
346
|
+
const mid = Math.floor((start + end) / 2);
|
|
347
|
+
if (arr[mid].cmp(searchKey) < 0) {
|
|
348
|
+
// The key + 1 is greater than the arr element, so we can continue searching the top half
|
|
349
|
+
start = mid + 1;
|
|
350
|
+
} else {
|
|
351
|
+
// The key + 1 is LT or EQ the arr element, so we can continue searching the bottom half
|
|
352
|
+
end = mid;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// We either found key + 1 or start is now at the index of the largest element that we would have inserted key + 1
|
|
356
|
+
// Therefore start - 1 is the index of the element just below - note it can be -1 if the first element in the array is
|
|
357
|
+
// greater than the key
|
|
358
|
+
return start - 1;
|
|
359
|
+
}
|
|
360
|
+
|
|
356
361
|
/**
|
|
357
362
|
* This gets the low leaf preimage and the index of the low leaf in the indexed tree given a value (slot or nullifier value)
|
|
358
363
|
* If the value is not found in the tree, it does an external lookup to the merkleDB
|
|
@@ -365,23 +370,42 @@ export class AvmEphemeralForest {
|
|
|
365
370
|
treeId: ID,
|
|
366
371
|
key: Fr,
|
|
367
372
|
): Promise<PreimageWitness<T>> {
|
|
373
|
+
const keyOrderedVector = this.indexedSortedKeys.get(treeId)!;
|
|
374
|
+
|
|
375
|
+
const vectorIndex = this.searchForKey(
|
|
376
|
+
key,
|
|
377
|
+
keyOrderedVector.map(x => x[0]),
|
|
378
|
+
);
|
|
379
|
+
// We have a match in our local updates
|
|
380
|
+
let minPreimage = undefined;
|
|
381
|
+
|
|
382
|
+
if (vectorIndex !== -1) {
|
|
383
|
+
const [_, leafIndex] = keyOrderedVector[vectorIndex];
|
|
384
|
+
minPreimage = {
|
|
385
|
+
preimage: this.getIndexedUpdates(treeId, leafIndex) as T,
|
|
386
|
+
index: leafIndex,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
368
389
|
// This can probably be done better, we want to say if the minInfo is undefined (because this is our first operation) we do the external lookup
|
|
369
|
-
const minPreimage = this.getMinInfo(treeId);
|
|
370
390
|
const start = minPreimage?.preimage;
|
|
371
391
|
const bigIntKey = key.toBigInt();
|
|
372
|
-
|
|
373
|
-
if
|
|
374
|
-
|
|
392
|
+
|
|
393
|
+
// If we don't have a first element or if that first element is already greater than the target key, we need to do an external lookup
|
|
394
|
+
// The low public data witness is in the previous tree
|
|
395
|
+
if (start === undefined || start.getKey() > key.toBigInt()) {
|
|
396
|
+
// This function returns the leaf index to the actual element if it exists or the leaf index to the low leaf otherwise
|
|
375
397
|
const { index, alreadyPresent } = (await this.treeDb.getPreviousValueIndex(treeId, bigIntKey))!;
|
|
376
398
|
const preimage = await this.treeDb.getLeafPreimage(treeId, index);
|
|
377
399
|
|
|
378
|
-
// Since we have never seen this before - we should insert it into our tree
|
|
379
|
-
const siblingPath =
|
|
400
|
+
// Since we have never seen this before - we should insert it into our tree, as we know we will modify this leaf node
|
|
401
|
+
const siblingPath = await this.getSiblingPath(treeId, index);
|
|
402
|
+
// const siblingPath = (await this.treeDb.getSiblingPath(treeId, index)).toFields();
|
|
380
403
|
|
|
381
|
-
// Is it enough to just insert the sibling path without inserting the leaf? -
|
|
404
|
+
// Is it enough to just insert the sibling path without inserting the leaf? - now probably since we will update this low nullifier index in append
|
|
382
405
|
this.treeMap.get(treeId)!.insertSiblingPath(index, siblingPath);
|
|
383
406
|
|
|
384
407
|
const lowPublicDataPreimage = preimage as T;
|
|
408
|
+
|
|
385
409
|
return { preimage: lowPublicDataPreimage, index: index, update: alreadyPresent };
|
|
386
410
|
}
|
|
387
411
|
|
|
@@ -392,18 +416,18 @@ export class AvmEphemeralForest {
|
|
|
392
416
|
// (3) Max Condition: curr.next_index == 0 and curr.key < key
|
|
393
417
|
// Note the min condition does not need to be handled since indexed trees are prefilled with at least the 0 element
|
|
394
418
|
let found = false;
|
|
395
|
-
let curr = minPreimage
|
|
419
|
+
let curr = minPreimage!.preimage as T;
|
|
396
420
|
let result: PreimageWitness<T> | undefined = undefined;
|
|
397
421
|
// Temp to avoid infinite loops - the limit is the number of leaves we may have to read
|
|
398
422
|
const LIMIT = 2n ** BigInt(getTreeHeight(treeId)) - 1n;
|
|
399
423
|
let counter = 0n;
|
|
400
|
-
let lowPublicDataIndex = minPreimage
|
|
424
|
+
let lowPublicDataIndex = minPreimage!.index;
|
|
401
425
|
while (!found && counter < LIMIT) {
|
|
402
426
|
if (curr.getKey() === bigIntKey) {
|
|
403
427
|
// We found an exact match - therefore this is an update
|
|
404
428
|
found = true;
|
|
405
429
|
result = { preimage: curr, index: lowPublicDataIndex, update: true };
|
|
406
|
-
} else if (curr.getKey() < bigIntKey && (curr.
|
|
430
|
+
} else if (curr.getKey() < bigIntKey && (curr.getNextIndex() === 0n || curr.getNextKey() > bigIntKey)) {
|
|
407
431
|
// We found it via sandwich or max condition, this is a low nullifier
|
|
408
432
|
found = true;
|
|
409
433
|
result = { preimage: curr, index: lowPublicDataIndex, update: false };
|
package/src/avm/errors.ts
CHANGED
|
@@ -67,6 +67,17 @@ export class TagCheckError extends AvmExecutionError {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Error is thrown when a relative memory address resolved to an offset which
|
|
72
|
+
* is out of range, i.e, greater than maxUint32.
|
|
73
|
+
*/
|
|
74
|
+
export class AddressOutOfRangeError extends AvmExecutionError {
|
|
75
|
+
constructor(baseAddr: number, relOffset: number) {
|
|
76
|
+
super(`Address out of range. Base address ${baseAddr}, relative offset ${relOffset}`);
|
|
77
|
+
this.name = 'AddressOutOfRangeError';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
70
81
|
/** Error thrown when out of gas. */
|
|
71
82
|
export class OutOfGasError extends AvmExecutionError {
|
|
72
83
|
constructor(dimensions: string[]) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isNoirCallStackUnresolved } from '@aztec/circuit-types';
|
|
2
2
|
import { GasFees, GlobalVariables, MAX_L2_GAS_PER_ENQUEUED_CALL } from '@aztec/circuits.js';
|
|
3
3
|
import { type FunctionArtifact, FunctionSelector } from '@aztec/foundation/abi';
|
|
4
4
|
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
@@ -16,6 +16,7 @@ import { AvmContext } from '../avm_context.js';
|
|
|
16
16
|
import { AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
17
17
|
import { AvmMachineState } from '../avm_machine_state.js';
|
|
18
18
|
import { Field, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
|
|
19
|
+
import { type AvmEphemeralForest } from '../avm_tree.js';
|
|
19
20
|
import { type AvmRevertReason } from '../errors.js';
|
|
20
21
|
import { AvmPersistableStateManager } from '../journal/journal.js';
|
|
21
22
|
import { NullifierManager } from '../journal/nullifiers.js';
|
|
@@ -43,7 +44,7 @@ export function initPersistableStateManager(overrides?: {
|
|
|
43
44
|
publicStorage?: PublicStorage;
|
|
44
45
|
nullifiers?: NullifierManager;
|
|
45
46
|
doMerkleOperations?: boolean;
|
|
46
|
-
merkleTrees?:
|
|
47
|
+
merkleTrees?: AvmEphemeralForest;
|
|
47
48
|
}): AvmPersistableStateManager {
|
|
48
49
|
const worldStateDB = overrides?.worldStateDB || mock<WorldStateDB>();
|
|
49
50
|
return new AvmPersistableStateManager(
|
|
@@ -52,7 +53,7 @@ export function initPersistableStateManager(overrides?: {
|
|
|
52
53
|
overrides?.publicStorage || new PublicStorage(worldStateDB),
|
|
53
54
|
overrides?.nullifiers || new NullifierManager(worldStateDB),
|
|
54
55
|
overrides?.doMerkleOperations || false,
|
|
55
|
-
overrides?.merkleTrees || mock<
|
|
56
|
+
overrides?.merkleTrees || mock<AvmEphemeralForest>(),
|
|
56
57
|
);
|
|
57
58
|
}
|
|
58
59
|
|
package/src/avm/index.ts
CHANGED