@aztec/simulator 3.0.0-nightly.20251218 → 3.0.0-nightly.20251220

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.
@@ -1,7 +1,7 @@
1
1
  export * from './public_tx_simulation_tester.js';
2
2
  export * from './utils.js';
3
3
  export * from './simple_contract_data_source.js';
4
- export { readAvmMinimalPublicTxInputsFromFile, executeAvmMinimalPublicTx } from './minimal_public_tx.js';
4
+ export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
5
5
  export { TestExecutorMetrics } from '../test_executor_metrics.js';
6
6
  export { ammTest } from './amm_test.js';
7
7
  export { bulkTest, megaBulkTest } from './bulk_test.js';
@@ -9,4 +9,4 @@ export { tokenTest } from './token_test.js';
9
9
  export * from './custom_bytecode_tests.js';
10
10
  export { deployCustomBytecode, executeCustomBytecode, deployAndExecuteCustomBytecode, } from './custom_bytecode_tester.js';
11
11
  export { getSpamConfigsPerOpcode, testOpcodeSpamCase } from './opcode_spammer.js';
12
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyJ9
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,oCAAoC,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACzG,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  export * from './public_tx_simulation_tester.js';
2
2
  export * from './utils.js';
3
3
  export * from './simple_contract_data_source.js';
4
- export { readAvmMinimalPublicTxInputsFromFile, executeAvmMinimalPublicTx } from './minimal_public_tx.js';
4
+ export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
5
5
  export { TestExecutorMetrics } from '../test_executor_metrics.js';
6
6
  export { ammTest } from './amm_test.js';
7
7
  export { bulkTest, megaBulkTest } from './bulk_test.js';
@@ -1,9 +1,4 @@
1
- import { AvmCircuitInputs, type PublicTxResult } from '@aztec/stdlib/avm';
1
+ import type { PublicTxResult } from '@aztec/stdlib/avm';
2
2
  import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
3
3
  export declare function executeAvmMinimalPublicTx(tester: PublicTxSimulationTester): Promise<PublicTxResult>;
4
- /**
5
- * Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
6
- * @returns The AvmCircuitInputs for the minimal public tx.
7
- */
8
- export declare function readAvmMinimalPublicTxInputsFromFile(): AvmCircuitInputs;
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hbF9wdWJsaWNfdHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvbWluaW1hbF9wdWJsaWNfdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFTMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUUsd0JBQXNCLHlCQUF5QixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBZXpHO0FBRUQ7OztHQUdHO0FBQ0gsd0JBQWdCLG9DQUFvQyxJQUFJLGdCQUFnQixDQUV2RSJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW1hbF9wdWJsaWNfdHguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvbWluaW1hbF9wdWJsaWNfdHgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFReEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUUsd0JBQXNCLHlCQUF5QixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBZXpHIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"minimal_public_tx.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/minimal_public_tx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAS1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAezG;AAED;;;GAGG;AACH,wBAAgB,oCAAoC,IAAI,gBAAgB,CAEvE"}
1
+ {"version":3,"file":"minimal_public_tx.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/minimal_public_tx.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAezG"}
@@ -1,8 +1,4 @@
1
- import { AvmCircuitInputs } from '@aztec/stdlib/avm';
2
1
  import { ProtocolContracts } from '@aztec/stdlib/tx';
3
- import avmMinimalCircuitInputsJson from '../../../artifacts/avm_minimal_inputs.json' with {
4
- type: 'json'
5
- };
6
2
  import { TypeTag } from '../avm/avm_memory_types.js';
7
3
  import { Add, Return, Set } from '../avm/opcodes/index.js';
8
4
  import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
@@ -21,9 +17,3 @@ export async function executeAvmMinimalPublicTx(tester) {
21
17
  result.publicInputs.protocolContracts = ProtocolContracts.empty();
22
18
  return result;
23
19
  }
24
- /**
25
- * Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
26
- * @returns The AvmCircuitInputs for the minimal public tx.
27
- */ export function readAvmMinimalPublicTxInputsFromFile() {
28
- return AvmCircuitInputs.schema.parse(avmMinimalCircuitInputsJson);
29
- }
@@ -1,5 +1,8 @@
1
+ import { Fr } from '@aztec/foundation/curves/bn254';
1
2
  import type { Bufferable } from '@aztec/foundation/serialize';
2
- import type { PublicTxResult } from '@aztec/stdlib/avm';
3
+ import { type PublicTxResult } from '@aztec/stdlib/avm';
4
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
3
6
  import { type MemoryValue } from '../avm/avm_memory_types.js';
4
7
  import { Opcode } from '../avm/serialization/instruction_serialization.js';
5
8
  import type { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
@@ -49,6 +52,40 @@ export interface SpamConfigsForOpcode {
49
52
  /** All spam configs for this opcode (one or more) */
50
53
  configs: SpamConfig[];
51
54
  }
55
+ /**
56
+ * Constants for "warm" tree reads - these values are inserted into the trees
57
+ * before running the spammer so that existence checks can find them.
58
+ */
59
+ export declare const WARM_NOTE_HASH: Fr;
60
+ export declare const WARM_L1_TO_L2_MSG: Fr;
61
+ /** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */
62
+ export declare const WARM_NULLIFIER: Fr;
63
+ export declare const WARM_NULLIFIER_ADDRESS: AztecAddress;
64
+ /** Warm storage constants - storage is inserted for the deployed contract's address */
65
+ export declare const WARM_STORAGE_SLOT: Fr;
66
+ export declare const WARM_STORAGE_VALUE: Fr;
67
+ /**
68
+ * Leaf indices inserted to by insertWarmTreeEntries().
69
+ * Ideally we'd getTreeInfo and set dynamically, but that doesn't
70
+ * work easily with static spam configs, so we assume intial index 0.
71
+ */
72
+ export declare const WARM_NOTE_HASH_LEAF_INDEX = 0n;
73
+ export declare const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
74
+ /**
75
+ * Insert entries into the trees so that "warm" configs can find them with existence checks.
76
+ * Call this before running the opcode spammer to enable warm tree reads.
77
+ *
78
+ * Inserts:
79
+ * - Note hash into NOTE_HASH_TREE
80
+ * - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
81
+ * - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
82
+ * - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
83
+ */
84
+ export declare function insertWarmTreeEntries(merkleTrees: MerkleTreeWriteOperations, contractAddress: AztecAddress): Promise<void>;
85
+ /**
86
+ * A SpamConfig for to make external CALLs to an address specified in calldata[0].
87
+ */
88
+ export declare const EXTERNAL_CALL_CONFIG: SpamConfig;
52
89
  /**
53
90
  * Opcode spammer configs for ~all opcodes.
54
91
  * Each opcode maps to an array of configs (usually one, but can be multiple for type variants, etc.)
@@ -83,4 +120,4 @@ export declare function createOpcodeSpamBytecode(config: SpamConfig): Buffer;
83
120
  export declare function createSideEffectSpamBytecode(config: SpamConfig): Buffer;
84
121
  export declare function testOpcodeSpamCase(tester: PublicTxSimulationTester, config: SpamConfig, expectToBeTrue?: (x: boolean) => void): Promise<PublicTxResult>;
85
122
  export {};
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Bjb2RlX3NwYW1tZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvb3Bjb2RlX3NwYW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUtBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFxQixjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUkzRSxPQUFPLEVBQVMsS0FBSyxXQUFXLEVBQXdDLE1BQU0sNEJBQTRCLENBQUM7QUFrRDNHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUUzRSxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTWpGOztHQUVHO0FBQ0gsVUFBVSxRQUFRO0lBQ2hCLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixLQUFLLEVBQUUsV0FBVyxDQUFDO0NBQ3BCO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxTQUFTLEdBQUcsUUFBUSxHQUFHLENBQUMsTUFBTSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBRWpEOztHQUVHO0FBQ0gsTUFBTSxXQUFXLFVBQVU7SUFDekIsaUNBQWlDO0lBQ2pDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUVuQixzREFBc0Q7SUFDdEQsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUV2QywyREFBMkQ7SUFDM0QsbUJBQW1CLENBQUMsRUFBRSxNQUFNLFVBQVUsRUFBRSxDQUFDO0lBRXpDOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUM7SUFFZixzRUFBc0U7SUFDdEUsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWYsMERBQTBEO0lBQzFELGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDO0NBQzdCO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLG9CQUFvQjtJQUNuQyxrQ0FBa0M7SUFDbEMsTUFBTSxFQUFFLE1BQU0sQ0FBQztJQUVmLHFEQUFxRDtJQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7Q0FDdkI7QUFzS0Q7Ozs7R0FJRztBQUNILGVBQU8sTUFBTSxZQUFZLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0F1ekI5RCxDQUFDO0FBRUY7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCx3QkFBZ0IsdUJBQXVCLENBQUMsbUJBQW1CLEdBQUUsTUFBaUIsR0FBRyxvQkFBb0IsRUFBRSxDQXNCdEc7QUE0RkQ7OztHQUdHO0FBQ0gsd0JBQWdCLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxVQUFVLEdBQUcsTUFBTSxDQWVuRTtBQUVEOzs7Ozs7R0FNRztBQUNILHdCQUFnQiw0QkFBNEIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FtQnZFO0FBeURELHdCQUFzQixrQkFBa0IsQ0FDdEMsTUFBTSxFQUFFLHdCQUF3QixFQUNoQyxNQUFNLEVBQUUsVUFBVSxFQUNsQixjQUFjLEdBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxLQUFLLElBQWUsR0FDOUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUt6QiJ9
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Bjb2RlX3NwYW1tZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvb3Bjb2RlX3NwYW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0tBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQTJDLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLakYsT0FBTyxFQUFTLEtBQUssV0FBVyxFQUFnRCxNQUFNLDRCQUE0QixDQUFDO0FBa0RuSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFM0UsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU1qRjs7R0FFRztBQUNILFVBQVUsUUFBUTtJQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsS0FBSyxFQUFFLFdBQVcsQ0FBQztDQUNwQjtBQUVEOzs7R0FHRztBQUNILEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQztBQUVqRDs7R0FFRztBQUNILE1BQU0sV0FBVyxVQUFVO0lBQ3pCLGlDQUFpQztJQUNqQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFFbkIsc0RBQXNEO0lBQ3RELGtCQUFrQixFQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7SUFFdkMsMkRBQTJEO0lBQzNELG1CQUFtQixDQUFDLEVBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWYsc0VBQXNFO0lBQ3RFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVmLDBEQUEwRDtJQUMxRCxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUM3QjtBQUVEOzs7R0FHRztBQUNILE1BQU0sV0FBVyxvQkFBb0I7SUFDbkMsa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFZixxREFBcUQ7SUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3ZCO0FBTUQ7OztHQUdHO0FBQ0gsZUFBTyxNQUFNLGNBQWMsSUFBc0IsQ0FBQztBQUNsRCxlQUFPLE1BQU0saUJBQWlCLElBQThCLENBQUM7QUFFN0QsdUdBQXVHO0FBQ3ZHLGVBQU8sTUFBTSxjQUFjLElBQTBCLENBQUM7QUFDdEQsZUFBTyxNQUFNLHNCQUFzQixjQUFrQyxDQUFDO0FBRXRFLHVGQUF1RjtBQUN2RixlQUFPLE1BQU0saUJBQWlCLElBQTBCLENBQUM7QUFDekQsZUFBTyxNQUFNLGtCQUFrQixJQUEwQixDQUFDO0FBRTFEOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0seUJBQXlCLEtBQUssQ0FBQztBQUM1QyxlQUFPLE1BQU0sNEJBQTRCLEtBQUssQ0FBQztBQUUvQzs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IscUJBQXFCLENBQ3pDLFdBQVcsRUFBRSx5QkFBeUIsRUFDdEMsZUFBZSxFQUFFLFlBQVksR0FDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWVmO0FBbUdEOztHQUVHO0FBQ0gsZUFBTyxNQUFNLG9CQUFvQixFQUFFLFVBMEJsQyxDQUFDO0FBa0NGOzs7O0dBSUc7QUFDSCxlQUFPLE1BQU0sWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBcTNCOUQsQ0FBQztBQUVGOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsd0JBQWdCLHVCQUF1QixDQUFDLG1CQUFtQixHQUFFLE1BQWlCLEdBQUcsb0JBQW9CLEVBQUUsQ0FzQnRHO0FBNEZEOzs7R0FHRztBQUNILHdCQUFnQix3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FlbkU7QUFFRDs7Ozs7O0dBTUc7QUFDSCx3QkFBZ0IsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxNQUFNLENBbUJ2RTtBQTRERCx3QkFBc0Isa0JBQWtCLENBQ3RDLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsTUFBTSxFQUFFLFVBQVUsRUFDbEIsY0FBYyxHQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sS0FBSyxJQUFlLEdBQzlDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FLekIifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"AAmKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAI3E,OAAO,EAAS,KAAK,WAAW,EAAwC,MAAM,4BAA4B,CAAC;AAkD3G,OAAO,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAMjF;;GAEG;AACH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IAEnB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;IAEvC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,UAAU,EAAE,CAAC;IAEzC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAsKD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAuzB9D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,mBAAmB,GAAE,MAAiB,GAAG,oBAAoB,EAAE,CAsBtG;AA4FD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAenE;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBvE;AAyDD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,UAAU,EAClB,cAAc,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAe,GAC9C,OAAO,CAAC,cAAc,CAAC,CAKzB"}
1
+ {"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"AAkKA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAKjF,OAAO,EAAS,KAAK,WAAW,EAAgD,MAAM,4BAA4B,CAAC;AAkDnH,OAAO,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAMjF;;GAEG;AACH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IAEnB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;IAEvC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,UAAU,EAAE,CAAC;IAEzC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,IAAsB,CAAC;AAClD,eAAO,MAAM,iBAAiB,IAA8B,CAAC;AAE7D,uGAAuG;AACvG,eAAO,MAAM,cAAc,IAA0B,CAAC;AACtD,eAAO,MAAM,sBAAsB,cAAkC,CAAC;AAEtE,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,IAA0B,CAAC;AACzD,eAAO,MAAM,kBAAkB,IAA0B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAef;AAmGD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA0BlC,CAAC;AAkCF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAq3B9D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,mBAAmB,GAAE,MAAiB,GAAG,oBAAoB,EAAE,CAsBtG;AA4FD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAenE;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBvE;AA4DD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,UAAU,EAClB,cAAc,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAe,GAC9C,OAAO,CAAC,cAAc,CAAC,CAKzB"}
@@ -151,8 +151,12 @@
151
151
  import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
152
152
  import { randomBigInt } from '@aztec/foundation/crypto/random';
153
153
  import { Fr } from '@aztec/foundation/curves/bn254';
154
+ import { PublicDataWrite } from '@aztec/stdlib/avm';
155
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
156
+ import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
157
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
154
158
  import assert from 'assert';
155
- import { Field, TaggedMemory, TypeTag, Uint1, Uint32 } from '../avm/avm_memory_types.js';
159
+ import { Field, TaggedMemory, TypeTag, Uint1, Uint32, Uint64 } from '../avm/avm_memory_types.js';
156
160
  import { Add, And, Call, CalldataCopy, Cast, DebugLog, Div, EcAdd, EmitNoteHash, EmitNullifier, EmitUnencryptedLog, Eq, FieldDiv, GetContractInstance, GetEnvVar, InternalCall, InternalReturn, Jump, JumpI, KeccakF1600, L1ToL2MessageExists, Lt, Lte, Mov, Mul, Not, NoteHashExists, NullifierExists, Or, Poseidon2, Return, ReturndataCopy, ReturndataSize, Revert, SLoad, SStore, SendL2ToL1Message, Set, Sha256Compression, Shl, Shr, StaticCall, Sub, SuccessCopy, ToRadixBE, Xor } from '../avm/opcodes/index.js';
157
161
  import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
158
162
  import { Opcode } from '../avm/serialization/instruction_serialization.js';
@@ -160,6 +164,51 @@ import { deployCustomBytecode, executeCustomBytecode } from './custom_bytecode_t
160
164
  // ============================================================================
161
165
  // Constants
162
166
  // ============================================================================
167
+ /**
168
+ * Constants for "warm" tree reads - these values are inserted into the trees
169
+ * before running the spammer so that existence checks can find them.
170
+ */ export const WARM_NOTE_HASH = new Fr(0xdeadbeefn);
171
+ export const WARM_L1_TO_L2_MSG = new Fr(0xcafebabedeadbeefn);
172
+ /** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */ export const WARM_NULLIFIER = new Fr(0xdeadbeef0001n);
173
+ export const WARM_NULLIFIER_ADDRESS = AztecAddress.fromNumber(0xbeef);
174
+ /** Warm storage constants - storage is inserted for the deployed contract's address */ export const WARM_STORAGE_SLOT = new Fr(0xdeadbeef0002n);
175
+ export const WARM_STORAGE_VALUE = new Fr(0xcafebabe0003n);
176
+ /**
177
+ * Leaf indices inserted to by insertWarmTreeEntries().
178
+ * Ideally we'd getTreeInfo and set dynamically, but that doesn't
179
+ * work easily with static spam configs, so we assume intial index 0.
180
+ */ export const WARM_NOTE_HASH_LEAF_INDEX = 0n;
181
+ export const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
182
+ /**
183
+ * Insert entries into the trees so that "warm" configs can find them with existence checks.
184
+ * Call this before running the opcode spammer to enable warm tree reads.
185
+ *
186
+ * Inserts:
187
+ * - Note hash into NOTE_HASH_TREE
188
+ * - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
189
+ * - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
190
+ * - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
191
+ */ export async function insertWarmTreeEntries(merkleTrees, contractAddress) {
192
+ // Insert into note hash tree
193
+ await merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [
194
+ WARM_NOTE_HASH
195
+ ]);
196
+ // Insert into L1 to L2 message tree
197
+ await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [
198
+ WARM_L1_TO_L2_MSG
199
+ ]);
200
+ // Insert siloed nullifier into nullifier tree
201
+ const siloedNullifier = await siloNullifier(WARM_NULLIFIER_ADDRESS, WARM_NULLIFIER);
202
+ await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [
203
+ siloedNullifier.toBuffer()
204
+ ]);
205
+ // Insert storage value into public data tree
206
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, WARM_STORAGE_SLOT);
207
+ const publicDataWrite = new PublicDataWrite(leafSlot, WARM_STORAGE_VALUE);
208
+ await merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
209
+ publicDataWrite.toBuffer()
210
+ ]);
211
+ }
163
212
  /**
164
213
  * Maximum bytecode size in bytes.
165
214
  *
@@ -251,7 +300,7 @@ const CALL_ARGS_SIZE_OFFSET = CONST_1_OFFSET; // argsSize = 1 (forward calldata[
251
300
  const MAX_U32 = 0xffffffffn;
252
301
  /**
253
302
  * A SpamConfig for to make external CALLs to an address specified in calldata[0].
254
- */ const EXTERNAL_CALL_CONFIG = {
303
+ */ export const EXTERNAL_CALL_CONFIG = {
255
304
  setup: [
256
305
  // calldata will contain 1 item: the external call address
257
306
  {
@@ -855,7 +904,20 @@ const STATIC_CALL_CONFIG = {
855
904
  ]
856
905
  },
857
906
  {
858
- label: 'Warm read (SSTORE first)',
907
+ label: 'Warm read (from tree)',
908
+ // Uses pre-inserted storage from insertWarmTreeEntries() which is called after contract deployment
909
+ setup: [
910
+ {
911
+ offset: 0,
912
+ value: new Field(WARM_STORAGE_SLOT)
913
+ }
914
+ ],
915
+ targetInstructions: ()=>[
916
+ new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)
917
+ ]
918
+ },
919
+ {
920
+ label: 'Warm read (SSTORE first, unique slot per SLOAD)',
859
921
  // Memory layout: slot (incremented), value, constant 1, revertSize, loaded value
860
922
  setup: [
861
923
  {
@@ -888,6 +950,7 @@ const STATIC_CALL_CONFIG = {
888
950
  ],
889
951
  [Opcode.NOTEHASHEXISTS]: [
890
952
  {
953
+ label: 'Cold (non-existent)',
891
954
  // Note: Can't easily do "write first" version - would need to know the leaf index
892
955
  // that EMITNOTEHASH will produce, which depends on tree state
893
956
  setup: [
@@ -903,6 +966,23 @@ const STATIC_CALL_CONFIG = {
903
966
  targetInstructions: ()=>[
904
967
  new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2)
905
968
  ]
969
+ },
970
+ {
971
+ label: 'Warm (exists in tree)',
972
+ // Uses pre-inserted note hash from insertWarmTreeEntries()
973
+ setup: [
974
+ {
975
+ offset: 0,
976
+ value: new Field(WARM_NOTE_HASH)
977
+ },
978
+ {
979
+ offset: 1,
980
+ value: new Uint64(WARM_NOTE_HASH_LEAF_INDEX)
981
+ }
982
+ ],
983
+ targetInstructions: ()=>[
984
+ new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2)
985
+ ]
906
986
  }
907
987
  ],
908
988
  [Opcode.NULLIFIEREXISTS]: [
@@ -923,7 +1003,24 @@ const STATIC_CALL_CONFIG = {
923
1003
  ]
924
1004
  },
925
1005
  {
926
- label: 'Existing nullifier (EMITNULLIFIER first)',
1006
+ label: 'Existing nullifier (warm - from tree)',
1007
+ // Uses pre-inserted nullifier from insertWarmTreeEntries()
1008
+ setup: [
1009
+ {
1010
+ offset: 0,
1011
+ value: new Field(WARM_NULLIFIER)
1012
+ },
1013
+ {
1014
+ offset: 1,
1015
+ value: new Field(WARM_NULLIFIER_ADDRESS.toField())
1016
+ }
1017
+ ],
1018
+ targetInstructions: ()=>[
1019
+ new NullifierExists(/*indirect=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2)
1020
+ ]
1021
+ },
1022
+ {
1023
+ label: 'Existing nullifier (warm - EMITNULLIFIER first)',
927
1024
  // Memory layout: nullifier (incremented), constant 1, current address (from GETENVVAR), revertSize, exists result
928
1025
  setup: [
929
1026
  {
@@ -956,6 +1053,7 @@ const STATIC_CALL_CONFIG = {
956
1053
  ],
957
1054
  [Opcode.L1TOL2MSGEXISTS]: [
958
1055
  {
1056
+ label: 'Cold (non-existent)',
959
1057
  setup: [
960
1058
  {
961
1059
  offset: 0,
@@ -969,6 +1067,23 @@ const STATIC_CALL_CONFIG = {
969
1067
  targetInstructions: ()=>[
970
1068
  new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2)
971
1069
  ]
1070
+ },
1071
+ {
1072
+ label: 'Warm (exists in tree)',
1073
+ // Uses pre-inserted L1 to L2 message from insertWarmTreeEntries()
1074
+ setup: [
1075
+ {
1076
+ offset: 0,
1077
+ value: new Field(WARM_L1_TO_L2_MSG)
1078
+ },
1079
+ {
1080
+ offset: 1,
1081
+ value: new Uint64(WARM_L1_TO_L2_MSG_LEAF_INDEX)
1082
+ }
1083
+ ],
1084
+ targetInstructions: ()=>[
1085
+ new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2)
1086
+ ]
972
1087
  }
973
1088
  ],
974
1089
  [Opcode.GETCONTRACTINSTANCE]: [
@@ -1303,6 +1418,32 @@ const STATIC_CALL_CONFIG = {
1303
1418
  targetInstructions: ()=>[
1304
1419
  new ToRadixBE(/*indirect=*/ 0, /*srcOffset=*/ 0, /*radixOffset=*/ 1, /*numLimbsOffset=*/ 2, /*outputBitsOffset=*/ 3, /*dstOffset=*/ 4)
1305
1420
  ]
1421
+ },
1422
+ {
1423
+ label: 'Radix 3 (slow divmod path)',
1424
+ // Radix 3 bypasses the fast path for power-of-2 radixes (4, 8, 16, 32, 64, 128, 256)
1425
+ // and uses the slow divmod implementation instead
1426
+ setup: [
1427
+ {
1428
+ offset: 0,
1429
+ value: new Field(Fr.random())
1430
+ },
1431
+ {
1432
+ offset: 1,
1433
+ value: new Uint32(3n)
1434
+ },
1435
+ {
1436
+ offset: 2,
1437
+ value: new Uint32(161n)
1438
+ },
1439
+ {
1440
+ offset: 3,
1441
+ value: new Uint1(0n)
1442
+ }
1443
+ ],
1444
+ targetInstructions: ()=>[
1445
+ new ToRadixBE(/*indirect=*/ 0, /*srcOffset=*/ 0, /*radixOffset=*/ 1, /*numLimbsOffset=*/ 2, /*outputBitsOffset=*/ 3, /*dstOffset=*/ 4)
1446
+ ]
1306
1447
  }
1307
1448
  ],
1308
1449
  // ═══════════════════════════════════════════════════════════════════════════
@@ -1479,6 +1620,7 @@ const STATIC_CALL_CONFIG = {
1479
1620
  async function testStandardOpcodeSpam(tester, config, expectToBeTrue) {
1480
1621
  const bytecode = createOpcodeSpamBytecode(config);
1481
1622
  const contract = await deployCustomBytecode(bytecode, tester, config.label);
1623
+ await insertWarmTreeEntries(tester.merkleTrees, contract.address);
1482
1624
  // Should we pass the contract address as calldata?
1483
1625
  const calldata = config.addressAsCalldata ? [
1484
1626
  contract.address.toField()
@@ -23,4 +23,4 @@ export declare function createTxForPublicCalls(privateInsertions: TestPrivateIns
23
23
  export declare function createTxForPrivateOnly(feePayer?: AztecAddress, gasUsedByPrivate?: Gas): Promise<Tx>;
24
24
  export declare function addNewContractClassToTx(tx: Tx, contractClass: ContractClassPublic, skipNullifierInsertion?: boolean): Promise<void>;
25
25
  export declare function addNewContractInstanceToTx(tx: Tx, contractInstance: ContractInstanceWithAddress, skipNullifierInsertion?: boolean): Promise<void>;
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxHQUFHLEVBQXdCLE1BQU0sbUJBQW1CLENBQUM7QUFVOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBRUwsZUFBZSxFQUVmLDZCQUE2QixFQUM3QixFQUFFLEVBR0gsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixNQUFNLE1BQU0scUJBQXFCLEdBQUc7SUFDbEMsVUFBVSxDQUFDLEVBQUU7UUFDWCxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0tBQ3BDLENBQUM7SUFDRixhQUFhLENBQUMsRUFBRTtRQUNkLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7S0FDcEMsQ0FBQztDQUNILENBQUM7QUFFRjs7R0FFRztBQUNILHdCQUFzQixzQkFBc0IsQ0FDMUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQ3hDLGlCQUFpQixFQUFFLDZCQUE2QixFQUFFLEVBQ2xELGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxFQUNoRCxtQkFBbUIsQ0FBQyxFQUFFLDZCQUE2QixFQUNuRCxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQWlCLEVBQ25DLE9BQU8sR0FBRSxlQUF5QyxHQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLENBK0ZiO0FBRUQsd0JBQXNCLHNCQUFzQixDQUMxQyxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQXFCLEdBQ3RDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0EwQmI7QUFFRCx3QkFBc0IsdUJBQXVCLENBQzNDLEVBQUUsRUFBRSxFQUFFLEVBQ04sYUFBYSxFQUFFLG1CQUFtQixFQUNsQyxzQkFBc0IsVUFBUSxpQkE2Qi9CO0FBRUQsd0JBQXNCLDBCQUEwQixDQUM5QyxFQUFFLEVBQUUsRUFBRSxFQUNOLGdCQUFnQixFQUFFLDJCQUEyQixFQUM3QyxzQkFBc0IsVUFBUSxpQkEwQy9CIn0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxtQkFBbUIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxHQUFHLEVBQXdCLE1BQU0sbUJBQW1CLENBQUM7QUFVOUQsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRSxPQUFPLEVBRUwsZUFBZSxFQUVmLDZCQUE2QixFQUM3QixFQUFFLEVBR0gsTUFBTSxrQkFBa0IsQ0FBQztBQUkxQixNQUFNLE1BQU0scUJBQXFCLEdBQUc7SUFDbEMsVUFBVSxDQUFDLEVBQUU7UUFDWCxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNsQixVQUFVLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0tBQ3BDLENBQUM7SUFDRixhQUFhLENBQUMsRUFBRTtRQUNkLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLENBQUM7S0FDcEMsQ0FBQztDQUNILENBQUM7QUFFRjs7R0FFRztBQUNILHdCQUFzQixzQkFBc0IsQ0FDMUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQ3hDLGlCQUFpQixFQUFFLDZCQUE2QixFQUFFLEVBQ2xELGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxFQUNoRCxtQkFBbUIsQ0FBQyxFQUFFLDZCQUE2QixFQUNuRCxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQWlCLEVBQ25DLE9BQU8sR0FBRSxlQUF5QyxHQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLENBOEZiO0FBRUQsd0JBQXNCLHNCQUFzQixDQUMxQyxRQUFRLGVBQXNCLEVBQzlCLGdCQUFnQixHQUFFLEdBQXFCLEdBQ3RDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0EwQmI7QUFFRCx3QkFBc0IsdUJBQXVCLENBQzNDLEVBQUUsRUFBRSxFQUFFLEVBQ04sYUFBYSxFQUFFLG1CQUFtQixFQUNsQyxzQkFBc0IsVUFBUSxpQkE2Qi9CO0FBRUQsd0JBQXNCLDBCQUEwQixDQUM5QyxFQUFFLEVBQUUsRUFBRSxFQUNOLGdCQUFnQixFQUFFLDJCQUEyQixFQUM3QyxzQkFBc0IsVUFBUSxpQkEwQy9CIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/utils.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,GAAG,EAAwB,MAAM,mBAAmB,CAAC;AAU9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAEL,eAAe,EAEf,6BAA6B,EAC7B,EAAE,EAGH,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,qBAAqB,EACxC,iBAAiB,EAAE,6BAA6B,EAAE,EAClD,eAAe,EAAE,6BAA6B,EAAE,EAChD,mBAAmB,CAAC,EAAE,6BAA6B,EACnD,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAiB,EACnC,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,EAAE,CAAC,CA+Fb;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAqB,GACtC,OAAO,CAAC,EAAE,CAAC,CA0Bb;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,mBAAmB,EAClC,sBAAsB,UAAQ,iBA6B/B;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,gBAAgB,EAAE,2BAA2B,EAC7C,sBAAsB,UAAQ,iBA0C/B"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/utils.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,GAAG,EAAwB,MAAM,mBAAmB,CAAC;AAU9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAEL,eAAe,EAEf,6BAA6B,EAC7B,EAAE,EAGH,MAAM,kBAAkB,CAAC;AAI1B,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,CAAC,EAAE;QACX,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;IACF,aAAa,CAAC,EAAE;QACd,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,qBAAqB,EACxC,iBAAiB,EAAE,6BAA6B,EAAE,EAClD,eAAe,EAAE,6BAA6B,EAAE,EAChD,mBAAmB,CAAC,EAAE,6BAA6B,EACnD,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAiB,EACnC,OAAO,GAAE,eAAyC,GACjD,OAAO,CAAC,EAAE,CAAC,CA8Fb;AAED,wBAAsB,sBAAsB,CAC1C,QAAQ,eAAsB,EAC9B,gBAAgB,GAAE,GAAqB,GACtC,OAAO,CAAC,EAAE,CAAC,CA0Bb;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,mBAAmB,EAClC,sBAAsB,UAAQ,iBA6B/B;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,EAAE,EACN,gBAAgB,EAAE,2BAA2B,EAC7C,sBAAsB,UAAQ,iBA0C/B"}
@@ -72,8 +72,9 @@ import { strict as assert } from 'assert';
72
72
  const teardownGasLimits = teardownCallRequest ? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT) : Gas.empty();
73
73
  const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
74
74
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
75
- const header = BlockHeader.empty();
76
- header.globalVariables = globals;
75
+ const header = BlockHeader.empty({
76
+ globalVariables: globals
77
+ });
77
78
  const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
78
79
  const includeByTimestamp = 0n; // Not used in the simulator.
79
80
  const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ gasUsedByPrivate, feePayer, includeByTimestamp, forPublic);
@@ -43,4 +43,4 @@ export declare class AvmFuzzerSimulator extends BaseAvmSimulationTester {
43
43
  */
44
44
  addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void>;
45
45
  }
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX2Z1enplcl9zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZnV6emluZy9hdm1fZnV6emVyX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFZbkUsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRSxPQUFPLEVBQWUsZUFBZSxFQUF1RCxNQUFNLGtCQUFrQixDQUFDO0FBQ3JILE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJdEY7OztHQUdHO0FBQ0gscUJBQWEsdUJBQXVCO2FBRWhCLFNBQVMsRUFBRSxNQUFNO2FBQ2pCLFdBQVcsRUFBRSxNQUFNO2FBQ25CLEVBQUUsRUFBRSxTQUFTO2FBQ2IsT0FBTyxFQUFFLGVBQWU7YUFDeEIsZUFBZSxFQUFFLEdBQUcsRUFBRTthQUN0QixpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtJQU5qRCxZQUNrQixTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsTUFBTSxFQUNuQixFQUFFLEVBQUUsU0FBUyxFQUNiLE9BQU8sRUFBRSxlQUFlLEVBQ3hCLGVBQWUsRUFBRSxHQUFHLEVBQUUsRUFDdEIsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDN0M7SUFFSixNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsdUJBQXVCLENBWXhEO0NBQ0Y7QUFtSEQ7OztHQUdHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsdUJBQXVCO0lBQzdELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBRXJDLFlBQ0UsV0FBVyxFQUFFLHlCQUF5QixFQUN0QyxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFXekI7SUFFRDs7T0FFRztJQUNILE9BQW9CLE1BQU0sQ0FDeEIsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQzFDLE9BQU8sRUFBRSxlQUFlLEdBQ3ZCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUk3QjtJQUVEOztPQUVHO0lBQ1UsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUdoRTtJQUVEOztPQUVHO0lBQ1UsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBR2pFO0lBRUQ7OztPQUdHO0lBQ1UsMEJBQTBCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJeEY7Q0FDRiJ9
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX2Z1enplcl9zaW11bGF0b3IuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZnV6emluZy9hdm1fZnV6emVyX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFZbkUsT0FBTyxLQUFLLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRSxPQUFPLEVBQWUsZUFBZSxFQUF1RCxNQUFNLGtCQUFrQixDQUFDO0FBQ3JILE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFJdEY7OztHQUdHO0FBQ0gscUJBQWEsdUJBQXVCO2FBRWhCLFNBQVMsRUFBRSxNQUFNO2FBQ2pCLFdBQVcsRUFBRSxNQUFNO2FBQ25CLEVBQUUsRUFBRSxTQUFTO2FBQ2IsT0FBTyxFQUFFLGVBQWU7YUFDeEIsZUFBZSxFQUFFLEdBQUcsRUFBRTthQUN0QixpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRTtJQU5qRCxZQUNrQixTQUFTLEVBQUUsTUFBTSxFQUNqQixXQUFXLEVBQUUsTUFBTSxFQUNuQixFQUFFLEVBQUUsU0FBUyxFQUNiLE9BQU8sRUFBRSxlQUFlLEVBQ3hCLGVBQWUsRUFBRSxHQUFHLEVBQUUsRUFDdEIsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFDN0M7SUFFSixNQUFNLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsdUJBQXVCLENBWXhEO0NBQ0Y7QUFtSEQ7OztHQUdHO0FBQ0gscUJBQWEsa0JBQW1CLFNBQVEsdUJBQXVCO0lBQzdELE9BQU8sQ0FBQyxTQUFTLENBQW9CO0lBRXJDLFlBQ0UsV0FBVyxFQUFFLHlCQUF5QixFQUN0QyxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFXekI7SUFFRDs7T0FFRztJQUNILE9BQW9CLE1BQU0sQ0FDeEIsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQzFDLE9BQU8sRUFBRSxlQUFlLEdBQ3ZCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUk3QjtJQUVEOztPQUVHO0lBQ1UsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQVVoRTtJQUVEOztPQUVHO0lBQ1UsdUJBQXVCLENBQUMsUUFBUSxFQUFFLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBR2pFO0lBRUQ7OztPQUdHO0lBQ1UsMEJBQTBCLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FJeEY7Q0FDRiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"avm_fuzzer_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/fuzzing/avm_fuzzer_simulator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,eAAe,EAAuD,MAAM,kBAAkB,CAAC;AACrH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF;;;GAGG;AACH,qBAAa,uBAAuB;aAEhB,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;aACnB,EAAE,EAAE,SAAS;aACb,OAAO,EAAE,eAAe;aACxB,eAAe,EAAE,GAAG,EAAE;aACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IANjD,YACkB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,GAAG,EAAE,EACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC7C;IAEJ,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAYxD;CACF;AAmHD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAAuB;IAC7D,OAAO,CAAC,SAAS,CAAoB;IAErC,YACE,WAAW,EAAE,yBAAyB,EACtC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,eAAe,EAWzB;IAED;;OAEG;IACH,OAAoB,MAAM,CACxB,iBAAiB,EAAE,uBAAuB,EAC1C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;IAED;;OAEG;IACU,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAGhE;IAED;;OAEG;IACU,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;IAED;;;OAGG;IACU,0BAA0B,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxF;CACF"}
1
+ {"version":3,"file":"avm_fuzzer_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/fuzzing/avm_fuzzer_simulator.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAYnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAe,eAAe,EAAuD,MAAM,kBAAkB,CAAC;AACrH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AACxF,OAAO,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAItF;;;GAGG;AACH,qBAAa,uBAAuB;aAEhB,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;aACnB,EAAE,EAAE,SAAS;aACb,OAAO,EAAE,eAAe;aACxB,eAAe,EAAE,GAAG,EAAE;aACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IANjD,YACkB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,eAAe,EACxB,eAAe,EAAE,GAAG,EAAE,EACtB,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAC7C;IAEJ,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,uBAAuB,CAYxD;CACF;AAmHD;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,uBAAuB;IAC7D,OAAO,CAAC,SAAS,CAAoB;IAErC,YACE,WAAW,EAAE,yBAAyB,EACtC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,EAAE,eAAe,EAWzB;IAED;;OAEG;IACH,OAAoB,MAAM,CACxB,iBAAiB,EAAE,uBAAuB,EAC1C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAI7B;IAED;;OAEG;IACU,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAUhE;IAED;;OAEG;IACU,uBAAuB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGjE;IAED;;;OAGG;IACU,0BAA0B,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxF;CACF"}
@@ -99,7 +99,7 @@ import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js
99
99
  super(contractDataSource, merkleTrees);
100
100
  const contractsDb = new PublicContractsDB(contractDataSource);
101
101
  this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
102
- skipFeeEnforcement: true,
102
+ skipFeeEnforcement: false,
103
103
  collectDebugLogs: false,
104
104
  collectHints: false,
105
105
  collectStatistics: false,
@@ -116,6 +116,9 @@ import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js
116
116
  /**
117
117
  * Simulate a transaction from a C++ AvmTxHint.
118
118
  */ async simulate(txHint) {
119
+ // Compute fee from gas limits and max fees per gas (upper bound on fee)
120
+ const totalFee = BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas + BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
121
+ await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
119
122
  const tx = await createTxFromHint(txHint);
120
123
  return await this.simulator.simulate(tx);
121
124
  }
@@ -60,6 +60,7 @@ async function execute(base64Line) {
60
60
  });
61
61
  writeSync(process.stdout.fd, resultBuffer.toString('base64') + '\n');
62
62
  } catch (error) {
63
+ // If we error, treat as reverted
63
64
  const errorResult = serializeWithMessagePack({
64
65
  reverted: true,
65
66
  output: [],
@@ -15,7 +15,7 @@ import { PublicTxSimulator } from './public_tx_simulator.js';
15
15
  log;
16
16
  constructor(merkleTree, contractsDB, globalVariables, config){
17
17
  super(merkleTree, contractsDB, globalVariables, config);
18
- this.log = createLogger(`simulator:cpp_public_tx_simulator`);
18
+ this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
19
19
  }
20
20
  /**
21
21
  * Simulate a transaction's public portion using the C++ avvm simulator.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "3.0.0-nightly.20251218",
3
+ "version": "3.0.0-nightly.20251220",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./server": "./dest/server.js",
@@ -64,26 +64,26 @@
64
64
  ]
65
65
  },
66
66
  "dependencies": {
67
- "@aztec/constants": "3.0.0-nightly.20251218",
68
- "@aztec/foundation": "3.0.0-nightly.20251218",
69
- "@aztec/native": "3.0.0-nightly.20251218",
70
- "@aztec/noir-acvm_js": "3.0.0-nightly.20251218",
71
- "@aztec/noir-noirc_abi": "3.0.0-nightly.20251218",
72
- "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251218",
73
- "@aztec/noir-types": "3.0.0-nightly.20251218",
74
- "@aztec/protocol-contracts": "3.0.0-nightly.20251218",
75
- "@aztec/stdlib": "3.0.0-nightly.20251218",
76
- "@aztec/telemetry-client": "3.0.0-nightly.20251218",
77
- "@aztec/world-state": "3.0.0-nightly.20251218",
67
+ "@aztec/constants": "3.0.0-nightly.20251220",
68
+ "@aztec/foundation": "3.0.0-nightly.20251220",
69
+ "@aztec/native": "3.0.0-nightly.20251220",
70
+ "@aztec/noir-acvm_js": "3.0.0-nightly.20251220",
71
+ "@aztec/noir-noirc_abi": "3.0.0-nightly.20251220",
72
+ "@aztec/noir-protocol-circuits-types": "3.0.0-nightly.20251220",
73
+ "@aztec/noir-types": "3.0.0-nightly.20251220",
74
+ "@aztec/protocol-contracts": "3.0.0-nightly.20251220",
75
+ "@aztec/stdlib": "3.0.0-nightly.20251220",
76
+ "@aztec/telemetry-client": "3.0.0-nightly.20251220",
77
+ "@aztec/world-state": "3.0.0-nightly.20251220",
78
78
  "lodash.clonedeep": "^4.5.0",
79
79
  "lodash.merge": "^4.6.2",
80
80
  "tslib": "^2.4.0"
81
81
  },
82
82
  "devDependencies": {
83
- "@aztec/kv-store": "3.0.0-nightly.20251218",
84
- "@aztec/merkle-tree": "3.0.0-nightly.20251218",
85
- "@aztec/noir-contracts.js": "3.0.0-nightly.20251218",
86
- "@aztec/noir-test-contracts.js": "3.0.0-nightly.20251218",
83
+ "@aztec/kv-store": "3.0.0-nightly.20251220",
84
+ "@aztec/merkle-tree": "3.0.0-nightly.20251220",
85
+ "@aztec/noir-contracts.js": "3.0.0-nightly.20251220",
86
+ "@aztec/noir-test-contracts.js": "3.0.0-nightly.20251220",
87
87
  "@jest/globals": "^30.0.0",
88
88
  "@types/jest": "^30.0.0",
89
89
  "@types/lodash.clonedeep": "^4.5.7",
@@ -1,7 +1,7 @@
1
1
  export * from './public_tx_simulation_tester.js';
2
2
  export * from './utils.js';
3
3
  export * from './simple_contract_data_source.js';
4
- export { readAvmMinimalPublicTxInputsFromFile, executeAvmMinimalPublicTx } from './minimal_public_tx.js';
4
+ export { executeAvmMinimalPublicTx } from './minimal_public_tx.js';
5
5
  export { TestExecutorMetrics } from '../test_executor_metrics.js';
6
6
  export { ammTest } from './amm_test.js';
7
7
  export { bulkTest, megaBulkTest } from './bulk_test.js';
@@ -1,7 +1,6 @@
1
- import { AvmCircuitInputs, type PublicTxResult } from '@aztec/stdlib/avm';
1
+ import type { PublicTxResult } from '@aztec/stdlib/avm';
2
2
  import { ProtocolContracts } from '@aztec/stdlib/tx';
3
3
 
4
- import avmMinimalCircuitInputsJson from '../../../artifacts/avm_minimal_inputs.json' with { type: 'json' };
5
4
  import { TypeTag } from '../avm/avm_memory_types.js';
6
5
  import { Add, Return, Set } from '../avm/opcodes/index.js';
7
6
  import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
@@ -25,11 +24,3 @@ export async function executeAvmMinimalPublicTx(tester: PublicTxSimulationTester
25
24
 
26
25
  return result;
27
26
  }
28
-
29
- /**
30
- * Reads the AVM circuit inputs for the minimal public tx from a pre-generated JSON file.
31
- * @returns The AvmCircuitInputs for the minimal public tx.
32
- */
33
- export function readAvmMinimalPublicTxInputsFromFile(): AvmCircuitInputs {
34
- return AvmCircuitInputs.schema.parse(avmMinimalCircuitInputsJson);
35
- }
@@ -162,11 +162,15 @@ import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
162
162
  import { randomBigInt } from '@aztec/foundation/crypto/random';
163
163
  import { Fr } from '@aztec/foundation/curves/bn254';
164
164
  import type { Bufferable } from '@aztec/foundation/serialize';
165
- import type { CallStackMetadata, PublicTxResult } from '@aztec/stdlib/avm';
165
+ import { type CallStackMetadata, PublicDataWrite, type PublicTxResult } from '@aztec/stdlib/avm';
166
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
167
+ import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
168
+ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
169
+ import { MerkleTreeId } from '@aztec/stdlib/trees';
166
170
 
167
171
  import assert from 'assert';
168
172
 
169
- import { Field, type MemoryValue, TaggedMemory, TypeTag, Uint1, Uint32 } from '../avm/avm_memory_types.js';
173
+ import { Field, type MemoryValue, TaggedMemory, TypeTag, Uint1, Uint32, Uint64 } from '../avm/avm_memory_types.js';
170
174
  import {
171
175
  Add,
172
176
  And,
@@ -284,6 +288,59 @@ export interface SpamConfigsForOpcode {
284
288
  // Constants
285
289
  // ============================================================================
286
290
 
291
+ /**
292
+ * Constants for "warm" tree reads - these values are inserted into the trees
293
+ * before running the spammer so that existence checks can find them.
294
+ */
295
+ export const WARM_NOTE_HASH = new Fr(0xdeadbeefn);
296
+ export const WARM_L1_TO_L2_MSG = new Fr(0xcafebabedeadbeefn);
297
+
298
+ /** Warm nullifier constants - uses a fixed address since NULLIFIEREXISTS takes address as parameter */
299
+ export const WARM_NULLIFIER = new Fr(0xdeadbeef0001n);
300
+ export const WARM_NULLIFIER_ADDRESS = AztecAddress.fromNumber(0xbeef);
301
+
302
+ /** Warm storage constants - storage is inserted for the deployed contract's address */
303
+ export const WARM_STORAGE_SLOT = new Fr(0xdeadbeef0002n);
304
+ export const WARM_STORAGE_VALUE = new Fr(0xcafebabe0003n);
305
+
306
+ /**
307
+ * Leaf indices inserted to by insertWarmTreeEntries().
308
+ * Ideally we'd getTreeInfo and set dynamically, but that doesn't
309
+ * work easily with static spam configs, so we assume intial index 0.
310
+ */
311
+ export const WARM_NOTE_HASH_LEAF_INDEX = 0n;
312
+ export const WARM_L1_TO_L2_MSG_LEAF_INDEX = 0n;
313
+
314
+ /**
315
+ * Insert entries into the trees so that "warm" configs can find them with existence checks.
316
+ * Call this before running the opcode spammer to enable warm tree reads.
317
+ *
318
+ * Inserts:
319
+ * - Note hash into NOTE_HASH_TREE
320
+ * - L1 to L2 message into L1_TO_L2_MESSAGE_TREE
321
+ * - Siloed nullifier into NULLIFIER_TREE (for NULLIFIEREXISTS warm check)
322
+ * - Storage value into PUBLIC_DATA_TREE (for SLOAD warm check)
323
+ */
324
+ export async function insertWarmTreeEntries(
325
+ merkleTrees: MerkleTreeWriteOperations,
326
+ contractAddress: AztecAddress,
327
+ ): Promise<void> {
328
+ // Insert into note hash tree
329
+ await merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [WARM_NOTE_HASH]);
330
+
331
+ // Insert into L1 to L2 message tree
332
+ await merkleTrees.appendLeaves(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, [WARM_L1_TO_L2_MSG]);
333
+
334
+ // Insert siloed nullifier into nullifier tree
335
+ const siloedNullifier = await siloNullifier(WARM_NULLIFIER_ADDRESS, WARM_NULLIFIER);
336
+ await merkleTrees.sequentialInsert(MerkleTreeId.NULLIFIER_TREE, [siloedNullifier.toBuffer()]);
337
+
338
+ // Insert storage value into public data tree
339
+ const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, WARM_STORAGE_SLOT);
340
+ const publicDataWrite = new PublicDataWrite(leafSlot, WARM_STORAGE_VALUE);
341
+ await merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [publicDataWrite.toBuffer()]);
342
+ }
343
+
287
344
  /**
288
345
  * Maximum bytecode size in bytes.
289
346
  *
@@ -384,7 +441,7 @@ const MAX_U32 = 0xffffffffn;
384
441
  /**
385
442
  * A SpamConfig for to make external CALLs to an address specified in calldata[0].
386
443
  */
387
- const EXTERNAL_CALL_CONFIG: SpamConfig = {
444
+ export const EXTERNAL_CALL_CONFIG: SpamConfig = {
388
445
  setup: [
389
446
  // calldata will contain 1 item: the external call address
390
447
  { offset: CONST_0_OFFSET, value: new Uint32(0) }, // used for cdStartOffset
@@ -883,7 +940,13 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
883
940
  targetInstructions: () => [new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)],
884
941
  },
885
942
  {
886
- label: 'Warm read (SSTORE first)',
943
+ label: 'Warm read (from tree)',
944
+ // Uses pre-inserted storage from insertWarmTreeEntries() which is called after contract deployment
945
+ setup: [{ offset: 0, value: new Field(WARM_STORAGE_SLOT) }], // pre-inserted slot
946
+ targetInstructions: () => [new SLoad(/*indirect=*/ 0, /*slotOffset=*/ 0, /*dstOffset=*/ 1)],
947
+ },
948
+ {
949
+ label: 'Warm read (SSTORE first, unique slot per SLOAD)',
887
950
  // Memory layout: slot (incremented), value, constant 1, revertSize, loaded value
888
951
  setup: [
889
952
  { offset: 0, value: new Field(Fr.random()) }, // slot (will be incremented)
@@ -905,6 +968,7 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
905
968
 
906
969
  [Opcode.NOTEHASHEXISTS]: [
907
970
  {
971
+ label: 'Cold (non-existent)',
908
972
  // Note: Can't easily do "write first" version - would need to know the leaf index
909
973
  // that EMITNOTEHASH will produce, which depends on tree state
910
974
  setup: [
@@ -915,6 +979,17 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
915
979
  new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2),
916
980
  ],
917
981
  },
982
+ {
983
+ label: 'Warm (exists in tree)',
984
+ // Uses pre-inserted note hash from insertWarmTreeEntries()
985
+ setup: [
986
+ { offset: 0, value: new Field(WARM_NOTE_HASH) }, // pre-inserted noteHash
987
+ { offset: 1, value: new Uint64(WARM_NOTE_HASH_LEAF_INDEX) }, // known leafIndex
988
+ ],
989
+ targetInstructions: () => [
990
+ new NoteHashExists(/*indirect=*/ 0, /*noteHashOffset=*/ 0, /*leafIndexOffset=*/ 1, /*existsOffset=*/ 2),
991
+ ],
992
+ },
918
993
  ],
919
994
 
920
995
  [Opcode.NULLIFIEREXISTS]: [
@@ -929,7 +1004,18 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
929
1004
  ],
930
1005
  },
931
1006
  {
932
- label: 'Existing nullifier (EMITNULLIFIER first)',
1007
+ label: 'Existing nullifier (warm - from tree)',
1008
+ // Uses pre-inserted nullifier from insertWarmTreeEntries()
1009
+ setup: [
1010
+ { offset: 0, value: new Field(WARM_NULLIFIER) }, // pre-inserted nullifier
1011
+ { offset: 1, value: new Field(WARM_NULLIFIER_ADDRESS.toField()) }, // address it was siloed with
1012
+ ],
1013
+ targetInstructions: () => [
1014
+ new NullifierExists(/*indirect=*/ 0, /*nullifierOffset=*/ 0, /*addressOffset=*/ 1, /*existsOffset=*/ 2),
1015
+ ],
1016
+ },
1017
+ {
1018
+ label: 'Existing nullifier (warm - EMITNULLIFIER first)',
933
1019
  // Memory layout: nullifier (incremented), constant 1, current address (from GETENVVAR), revertSize, exists result
934
1020
  setup: [
935
1021
  { offset: 0, value: new Field(Fr.random()) }, // nullifier (will be incremented)
@@ -957,6 +1043,7 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
957
1043
 
958
1044
  [Opcode.L1TOL2MSGEXISTS]: [
959
1045
  {
1046
+ label: 'Cold (non-existent)',
960
1047
  setup: [
961
1048
  { offset: 0, value: new Field(Fr.random()) }, // random msgHash
962
1049
  { offset: 1, value: randomWithTag(TypeTag.UINT64) }, // random msgLeafIndex
@@ -965,6 +1052,17 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
965
1052
  new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2),
966
1053
  ],
967
1054
  },
1055
+ {
1056
+ label: 'Warm (exists in tree)',
1057
+ // Uses pre-inserted L1 to L2 message from insertWarmTreeEntries()
1058
+ setup: [
1059
+ { offset: 0, value: new Field(WARM_L1_TO_L2_MSG) }, // pre-inserted msgHash
1060
+ { offset: 1, value: new Uint64(WARM_L1_TO_L2_MSG_LEAF_INDEX) }, // known msgLeafIndex
1061
+ ],
1062
+ targetInstructions: () => [
1063
+ new L1ToL2MessageExists(/*indirect=*/ 0, /*msgHashOffset=*/ 0, /*msgLeafIndexOffset=*/ 1, /*existsOffset=*/ 2),
1064
+ ],
1065
+ },
968
1066
  ],
969
1067
 
970
1068
  [Opcode.GETCONTRACTINSTANCE]: [
@@ -1222,6 +1320,27 @@ export const SPAM_CONFIGS: Partial<Record<Opcode, SpamConfig[]>> = {
1222
1320
  ),
1223
1321
  ],
1224
1322
  },
1323
+ {
1324
+ label: 'Radix 3 (slow divmod path)',
1325
+ // Radix 3 bypasses the fast path for power-of-2 radixes (4, 8, 16, 32, 64, 128, 256)
1326
+ // and uses the slow divmod implementation instead
1327
+ setup: [
1328
+ { offset: 0, value: new Field(Fr.random()) }, // random field value
1329
+ { offset: 1, value: new Uint32(3n) }, // radix = 3 (non-power-of-2)
1330
+ { offset: 2, value: new Uint32(161n) }, // numLimbs = 161 (ceil(256 / log2(3)) ≈ 161 limbs to represent 256 bits)
1331
+ { offset: 3, value: new Uint1(0n) }, // outputBits = false
1332
+ ],
1333
+ targetInstructions: () => [
1334
+ new ToRadixBE(
1335
+ /*indirect=*/ 0,
1336
+ /*srcOffset=*/ 0,
1337
+ /*radixOffset=*/ 1,
1338
+ /*numLimbsOffset=*/ 2,
1339
+ /*outputBitsOffset=*/ 3,
1340
+ /*dstOffset=*/ 4,
1341
+ ),
1342
+ ],
1343
+ },
1225
1344
  ],
1226
1345
 
1227
1346
  // ═══════════════════════════════════════════════════════════════════════════
@@ -1456,6 +1575,9 @@ async function testStandardOpcodeSpam(
1456
1575
  ): Promise<PublicTxResult> {
1457
1576
  const bytecode = createOpcodeSpamBytecode(config);
1458
1577
  const contract = await deployCustomBytecode(bytecode, tester, config.label);
1578
+
1579
+ await insertWarmTreeEntries(tester.merkleTrees, contract.address);
1580
+
1459
1581
  // Should we pass the contract address as calldata?
1460
1582
  const calldata = config.addressAsCalldata ? [contract.address.toField()] : [];
1461
1583
  const result = await executeCustomBytecode(contract, tester, config.label, calldata);
@@ -132,8 +132,7 @@ export async function createTxForPublicCalls(
132
132
  : Gas.empty();
133
133
  const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
134
134
  const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
135
- const header = BlockHeader.empty();
136
- header.globalVariables = globals;
135
+ const header = BlockHeader.empty({ globalVariables: globals });
137
136
  const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
138
137
  const includeByTimestamp = 0n; // Not used in the simulator.
139
138
 
@@ -185,7 +185,7 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
185
185
  super(contractDataSource, merkleTrees);
186
186
  const contractsDb = new PublicContractsDB(contractDataSource);
187
187
  this.simulator = new PublicTxSimulator(merkleTrees, contractsDb, globals, {
188
- skipFeeEnforcement: true,
188
+ skipFeeEnforcement: false,
189
189
  collectDebugLogs: false,
190
190
  collectHints: false,
191
191
  collectStatistics: false,
@@ -209,6 +209,13 @@ export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
209
209
  * Simulate a transaction from a C++ AvmTxHint.
210
210
  */
211
211
  public async simulate(txHint: AvmTxHint): Promise<PublicTxResult> {
212
+ // Compute fee from gas limits and max fees per gas (upper bound on fee)
213
+ const totalFee =
214
+ BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas +
215
+ BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
216
+
217
+ await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
218
+
212
219
  const tx = await createTxFromHint(txHint);
213
220
  return await this.simulator.simulate(tx);
214
221
  }
@@ -98,6 +98,7 @@ async function execute(base64Line: string): Promise<void> {
98
98
  });
99
99
  writeSync(process.stdout.fd, resultBuffer.toString('base64') + '\n');
100
100
  } catch (error: any) {
101
+ // If we error, treat as reverted
101
102
  const errorResult = serializeWithMessagePack({
102
103
  reverted: true,
103
104
  output: [] as string[],
@@ -39,7 +39,7 @@ export class CppVsTsPublicTxSimulator extends PublicTxSimulator implements Publi
39
39
  config?: Partial<PublicSimulatorConfig>,
40
40
  ) {
41
41
  super(merkleTree, contractsDB, globalVariables, config);
42
- this.log = createLogger(`simulator:cpp_public_tx_simulator`);
42
+ this.log = createLogger(`simulator:cpp_vs_public_tx_simulator`);
43
43
  }
44
44
 
45
45
  /**