@aztec/simulator 0.0.1-commit.b655e406 → 0.0.1-commit.d3ec352c

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.
Files changed (248) hide show
  1. package/dest/client.d.ts +1 -1
  2. package/dest/common/errors.d.ts +1 -7
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/common/index.d.ts +1 -1
  5. package/dest/common/stats/index.d.ts +1 -1
  6. package/dest/common/stats/stats.d.ts +1 -1
  7. package/dest/private/acvm/acvm.d.ts +1 -1
  8. package/dest/private/acvm/acvm_types.d.ts +1 -1
  9. package/dest/private/acvm/deserialize.d.ts +1 -1
  10. package/dest/private/acvm/index.d.ts +1 -1
  11. package/dest/private/acvm/serialize.d.ts +1 -1
  12. package/dest/private/acvm_native.d.ts +1 -1
  13. package/dest/private/acvm_native.d.ts.map +1 -1
  14. package/dest/private/acvm_wasm.d.ts +1 -1
  15. package/dest/private/acvm_wasm.d.ts.map +1 -1
  16. package/dest/private/acvm_wasm_with_blobs.d.ts +1 -1
  17. package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/circuit_recorder.d.ts +1 -1
  19. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  20. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +1 -1
  21. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  22. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +1 -1
  23. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  24. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
  25. package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
  26. package/dest/private/circuit_simulator.d.ts +1 -1
  27. package/dest/private/factory.d.ts +1 -1
  28. package/dest/public/avm/avm_context.d.ts +1 -1
  29. package/dest/public/avm/avm_context.d.ts.map +1 -1
  30. package/dest/public/avm/avm_contract_call_result.d.ts +1 -1
  31. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  32. package/dest/public/avm/avm_execution_environment.d.ts +4 -4
  33. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  34. package/dest/public/avm/avm_execution_environment.js +4 -7
  35. package/dest/public/avm/avm_gas.d.ts +2 -2
  36. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  37. package/dest/public/avm/avm_machine_state.d.ts +1 -1
  38. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  39. package/dest/public/avm/avm_memory_types.d.ts +13 -13
  40. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  41. package/dest/public/avm/avm_simulator.d.ts +3 -2
  42. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  43. package/dest/public/avm/avm_simulator.js +7 -6
  44. package/dest/public/avm/avm_simulator_interface.d.ts +1 -1
  45. package/dest/public/avm/errors.d.ts +7 -1
  46. package/dest/public/avm/errors.d.ts.map +1 -1
  47. package/dest/public/avm/errors.js +14 -2
  48. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  49. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  50. package/dest/public/avm/fixtures/avm_simulation_tester.js +11 -2
  51. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +1 -1
  52. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  53. package/dest/public/avm/fixtures/initializers.d.ts +1 -2
  54. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  55. package/dest/public/avm/fixtures/initializers.js +6 -4
  56. package/dest/public/avm/fixtures/utils.d.ts +3 -2
  57. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  58. package/dest/public/avm/fixtures/utils.js +2 -1
  59. package/dest/public/avm/index.d.ts +1 -1
  60. package/dest/public/avm/opcodes/accrued_substate.d.ts +1 -1
  61. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/addressing_mode.d.ts +1 -1
  63. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  64. package/dest/public/avm/opcodes/addressing_mode.js +2 -2
  65. package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
  66. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  67. package/dest/public/avm/opcodes/bitwise.d.ts +5 -5
  68. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  69. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  70. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  71. package/dest/public/avm/opcodes/contract.d.ts +1 -1
  72. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  73. package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
  74. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  75. package/dest/public/avm/opcodes/conversion.d.ts +1 -1
  76. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  77. package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
  78. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  79. package/dest/public/avm/opcodes/environment_getters.d.ts +1 -1
  80. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  81. package/dest/public/avm/opcodes/external_calls.d.ts +1 -1
  82. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  83. package/dest/public/avm/opcodes/hashing.d.ts +2 -2
  84. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  85. package/dest/public/avm/opcodes/index.d.ts +1 -1
  86. package/dest/public/avm/opcodes/instruction.d.ts +2 -2
  87. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  88. package/dest/public/avm/opcodes/instruction_impl.d.ts +1 -1
  89. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  90. package/dest/public/avm/opcodes/memory.d.ts +2 -2
  91. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  92. package/dest/public/avm/opcodes/misc.d.ts +1 -1
  93. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  94. package/dest/public/avm/opcodes/misc.js +4 -4
  95. package/dest/public/avm/opcodes/storage.d.ts +3 -3
  96. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  97. package/dest/public/avm/revert_reason.d.ts +1 -1
  98. package/dest/public/avm/revert_reason.d.ts.map +1 -1
  99. package/dest/public/avm/revert_reason.js +3 -2
  100. package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -1
  101. package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
  102. package/dest/public/avm/serialization/bytecode_serialization.d.ts +1 -1
  103. package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  104. package/dest/public/avm/serialization/bytecode_serialization.js +9 -6
  105. package/dest/public/avm/serialization/instruction_serialization.d.ts +1 -1
  106. package/dest/public/avm/test_utils.d.ts +1 -1
  107. package/dest/public/contracts_db_checkpoint.d.ts +16 -0
  108. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
  109. package/dest/public/contracts_db_checkpoint.js +30 -0
  110. package/dest/public/db_interfaces.d.ts +13 -1
  111. package/dest/public/db_interfaces.d.ts.map +1 -1
  112. package/dest/public/debug_fn_name.d.ts +14 -1
  113. package/dest/public/debug_fn_name.d.ts.map +1 -1
  114. package/dest/public/debug_fn_name.js +19 -0
  115. package/dest/public/executor_metrics.d.ts +3 -2
  116. package/dest/public/executor_metrics.d.ts.map +1 -1
  117. package/dest/public/executor_metrics.js +1 -1
  118. package/dest/public/executor_metrics_interface.d.ts +3 -2
  119. package/dest/public/executor_metrics_interface.d.ts.map +1 -1
  120. package/dest/public/fixtures/amm_test.d.ts +1 -1
  121. package/dest/public/fixtures/bulk_test.d.ts +1 -1
  122. package/dest/public/fixtures/custom_bytecode_tester.d.ts +2 -2
  123. package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
  124. package/dest/public/fixtures/custom_bytecode_tests.d.ts +1 -1
  125. package/dest/public/fixtures/index.d.ts +1 -1
  126. package/dest/public/fixtures/minimal_public_tx.d.ts +2 -3
  127. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
  128. package/dest/public/fixtures/minimal_public_tx.js +2 -2
  129. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +10 -5
  130. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  131. package/dest/public/fixtures/public_tx_simulation_tester.js +26 -13
  132. package/dest/public/fixtures/simple_contract_data_source.d.ts +4 -3
  133. package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
  134. package/dest/public/fixtures/simple_contract_data_source.js +4 -4
  135. package/dest/public/fixtures/token_test.d.ts +6 -2
  136. package/dest/public/fixtures/token_test.d.ts.map +1 -1
  137. package/dest/public/fixtures/token_test.js +12 -11
  138. package/dest/public/fixtures/utils.d.ts +1 -1
  139. package/dest/public/hinting_db_sources.d.ts +12 -3
  140. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  141. package/dest/public/hinting_db_sources.js +64 -11
  142. package/dest/public/index.d.ts +3 -2
  143. package/dest/public/index.d.ts.map +1 -1
  144. package/dest/public/index.js +1 -1
  145. package/dest/public/public_db_sources.d.ts +21 -62
  146. package/dest/public/public_db_sources.d.ts.map +1 -1
  147. package/dest/public/public_db_sources.js +73 -130
  148. package/dest/public/public_errors.d.ts +1 -1
  149. package/dest/public/public_errors.d.ts.map +1 -1
  150. package/dest/public/public_processor/guarded_merkle_tree.d.ts +5 -4
  151. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  152. package/dest/public/public_processor/public_processor.d.ts +11 -18
  153. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  154. package/dest/public/public_processor/public_processor.js +34 -35
  155. package/dest/public/public_processor/public_processor_metrics.d.ts +1 -1
  156. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  157. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +30 -0
  158. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
  159. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +133 -0
  160. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +19 -22
  161. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  162. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +54 -50
  163. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
  164. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
  165. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
  166. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
  167. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
  168. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +170 -0
  169. package/dest/public/public_tx_simulator/index.d.ts +3 -1
  170. package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
  171. package/dest/public/public_tx_simulator/index.js +1 -0
  172. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +13 -6
  173. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
  174. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +5 -5
  175. package/dest/public/public_tx_simulator/public_tx_context.d.ts +5 -2
  176. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  177. package/dest/public/public_tx_simulator/public_tx_context.js +12 -4
  178. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +10 -30
  179. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  180. package/dest/public/public_tx_simulator/public_tx_simulator.js +106 -125
  181. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +2 -2
  182. package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
  183. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +3 -3
  184. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
  185. package/dest/public/side_effect_errors.d.ts +1 -1
  186. package/dest/public/side_effect_errors.d.ts.map +1 -1
  187. package/dest/public/side_effect_trace.d.ts +1 -2
  188. package/dest/public/side_effect_trace.d.ts.map +1 -1
  189. package/dest/public/side_effect_trace_interface.d.ts +2 -3
  190. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  191. package/dest/public/state_manager/index.d.ts +1 -1
  192. package/dest/public/state_manager/nullifiers.d.ts +1 -1
  193. package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
  194. package/dest/public/state_manager/public_storage.d.ts +1 -1
  195. package/dest/public/state_manager/public_storage.d.ts.map +1 -1
  196. package/dest/public/state_manager/state_manager.d.ts +8 -10
  197. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  198. package/dest/public/state_manager/state_manager.js +9 -5
  199. package/dest/public/test_executor_metrics.d.ts +4 -3
  200. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  201. package/dest/public/test_executor_metrics.js +5 -4
  202. package/dest/public/unique_class_ids.d.ts +1 -1
  203. package/dest/public/unique_class_ids.d.ts.map +1 -1
  204. package/dest/public/utils.d.ts +1 -1
  205. package/dest/server.d.ts +1 -1
  206. package/dest/testing.d.ts +1 -1
  207. package/package.json +21 -20
  208. package/src/public/avm/avm_execution_environment.ts +3 -5
  209. package/src/public/avm/avm_simulator.ts +10 -8
  210. package/src/public/avm/errors.ts +16 -2
  211. package/src/public/avm/fixtures/avm_simulation_tester.ts +9 -1
  212. package/src/public/avm/fixtures/initializers.ts +7 -9
  213. package/src/public/avm/fixtures/utils.ts +2 -1
  214. package/src/public/avm/opcodes/addressing_mode.ts +2 -2
  215. package/src/public/avm/opcodes/misc.ts +4 -4
  216. package/src/public/avm/revert_reason.ts +5 -2
  217. package/src/public/avm/serialization/bytecode_serialization.ts +17 -6
  218. package/src/public/contracts_db_checkpoint.ts +41 -0
  219. package/src/public/db_interfaces.ts +15 -0
  220. package/src/public/debug_fn_name.ts +25 -0
  221. package/src/public/executor_metrics.ts +2 -1
  222. package/src/public/executor_metrics_interface.ts +2 -1
  223. package/src/public/fixtures/custom_bytecode_tester.ts +1 -1
  224. package/src/public/fixtures/minimal_public_tx.ts +3 -4
  225. package/src/public/fixtures/public_tx_simulation_tester.ts +45 -15
  226. package/src/public/fixtures/simple_contract_data_source.ts +7 -8
  227. package/src/public/fixtures/token_test.ts +17 -9
  228. package/src/public/hinting_db_sources.ts +106 -8
  229. package/src/public/index.ts +4 -4
  230. package/src/public/public_db_sources.ts +92 -171
  231. package/src/public/public_processor/guarded_merkle_tree.ts +4 -3
  232. package/src/public/public_processor/public_processor.ts +57 -47
  233. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +162 -0
  234. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +84 -57
  235. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +132 -0
  236. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +240 -0
  237. package/src/public/public_tx_simulator/index.ts +2 -0
  238. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +9 -13
  239. package/src/public/public_tx_simulator/public_tx_context.ts +8 -2
  240. package/src/public/public_tx_simulator/public_tx_simulator.ts +148 -191
  241. package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +1 -2
  242. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +2 -2
  243. package/src/public/state_manager/state_manager.ts +12 -12
  244. package/src/public/test_executor_metrics.ts +7 -5
  245. package/dest/public/tx_contract_cache.d.ts +0 -41
  246. package/dest/public/tx_contract_cache.d.ts.map +0 -1
  247. package/dest/public/tx_contract_cache.js +0 -49
  248. package/src/public/tx_contract_cache.ts +0 -69
@@ -1,4 +1,5 @@
1
1
  import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS } from '@aztec/constants';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/fields';
3
4
  import {
4
5
  type ContractArtifact,
@@ -28,7 +29,7 @@ import type { AvmRevertReason } from '../errors.js';
28
29
 
29
30
  export const PUBLIC_DISPATCH_FN_NAME = 'public_dispatch';
30
31
  export const DEFAULT_TIMESTAMP: UInt64 = 99833n;
31
- export const DEFAULT_BLOCK_NUMBER = 42;
32
+ export const DEFAULT_BLOCK_NUMBER = BlockNumber(42);
32
33
 
33
34
  /**
34
35
  * Create a new object with all the same properties as the original, except for the ones in the overrides object.
@@ -83,7 +83,7 @@ export class Addressing {
83
83
  baseAddr = mem.get(0);
84
84
  const baseAddrTag = baseAddr.getTag();
85
85
  if (!TaggedMemory.isValidMemoryAddressTag(baseAddrTag!)) {
86
- throw TagCheckError.forOffset(0, TypeTag[baseAddrTag!], TypeTag[TypeTag.UINT32]);
86
+ throw TagCheckError.forBaseAddress(TypeTag[baseAddrTag!]);
87
87
  }
88
88
  }
89
89
  // Here we know that resolved[i] is at most 32 bits and baseAddr is at most 32 bits.
@@ -100,7 +100,7 @@ export class Addressing {
100
100
 
101
101
  // Final check.
102
102
  if (!TaggedMemory.isValidMemoryAddressTag(resolvedTag)) {
103
- throw TagCheckError.forOffset(resolved[i], TypeTag[resolvedTag], TypeTag[TypeTag.UINT32]);
103
+ throw TagCheckError.forIndirectAddress(resolved[i], TypeTag[resolvedTag]);
104
104
  }
105
105
 
106
106
  resolved[i] = Number(resolvedValue.toBigInt());
@@ -44,10 +44,10 @@ export class DebugLog extends Instruction {
44
44
  const operands = [this.levelOffset, this.messageOffset, this.fieldsOffset, this.fieldsSizeOffset];
45
45
  const [levelOffset, messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory);
46
46
 
47
- // DebugLog is a no-op except when doing client-initiated simulation.
47
+ // DebugLog is a no-op except unless the config is set to collect debug logs.
48
48
  // Note that we still do address resolution and basic tag-checking (above)
49
49
  // To avoid a special-case in the witness generator and circuit.
50
- if (context.environment.clientInitiatedSimulation) {
50
+ if (context.environment.config.collectDebugLogs) {
51
51
  memory.checkTag(TypeTag.UINT8, levelOffset);
52
52
  const levelNumber = memory.get(levelOffset).toNumber();
53
53
  memory.checkTag(TypeTag.UINT32, fieldsSizeOffset);
@@ -56,11 +56,11 @@ export class DebugLog extends Instruction {
56
56
  const memoryReads = 1 /* level */ + 1 /* fieldsSize */ + this.messageSize /* message */ + fieldsSize; /* fields */
57
57
  if (
58
58
  context.persistableState.getDebugLogMemoryReads() + memoryReads >
59
- context.environment.maxDebugLogMemoryReads
59
+ context.environment.config.collectionLimits.maxDebugLogMemoryReads
60
60
  ) {
61
61
  // Regular error on purpose: this is not a recoverable error.
62
62
  throw new Error(
63
- `Max debug log memory reads exceeded: ${context.persistableState.getDebugLogMemoryReads() + memoryReads} > ${context.environment.maxDebugLogMemoryReads}`,
63
+ `Max debug log memory reads exceeded: ${context.persistableState.getDebugLogMemoryReads() + memoryReads} > ${context.environment.config.collectionLimits.maxDebugLogMemoryReads}`,
64
64
  );
65
65
  }
66
66
  context.persistableState.writeDebugLogMemoryReads(memoryReads);
@@ -18,13 +18,16 @@ async function createRevertReason(message: string, revertData: Fr[], context: Av
18
18
  message = context.machineState.collectedRevertInfo.recursiveRevertReason.message;
19
19
  }
20
20
 
21
- const fnName = await context.persistableState.getPublicFunctionDebugName(context.environment);
21
+ const { functionSelector, functionName } = await context.persistableState.getPublicFunctionSelectorAndName(
22
+ context.environment,
23
+ );
22
24
 
23
25
  return new AvmRevertReason(
24
26
  message,
25
27
  /*failingFunction=*/ {
26
28
  contractAddress: context.environment.address,
27
- functionName: fnName,
29
+ functionSelector,
30
+ functionName,
28
31
  },
29
32
  /*noirCallStack=*/ [...internalCallStack, context.machineState.pc].map(pc => `0.${pc}`),
30
33
  /*options=*/ { cause: nestedError },
@@ -1,6 +1,13 @@
1
1
  import { type Bufferable, serializeToBuffer } from '@aztec/foundation/serialize';
2
2
 
3
- import { AvmExecutionError, AvmParsingError, InvalidOpcodeError, InvalidProgramCounterError } from '../errors.js';
3
+ import {
4
+ AvmExecutionError,
5
+ AvmParsingError,
6
+ InvalidOpcodeError,
7
+ InvalidProgramCounterError,
8
+ InvalidTagValueError,
9
+ duringInstrFetch,
10
+ } from '../errors.js';
4
11
  import {
5
12
  Add,
6
13
  And,
@@ -172,7 +179,7 @@ export function decodeInstructionFromBytecode(
172
179
  instructionSet: InstructionSet = INSTRUCTION_SET,
173
180
  ): [Instruction, number] {
174
181
  if (pc >= bytecode.length) {
175
- throw new InvalidProgramCounterError(pc, bytecode.length);
182
+ throw new InvalidProgramCounterError(pc, bytecode.length - 1);
176
183
  }
177
184
 
178
185
  try {
@@ -182,7 +189,7 @@ export function decodeInstructionFromBytecode(
182
189
 
183
190
  if (opcode > MAX_OPCODE_VALUE) {
184
191
  throw new InvalidOpcodeError(
185
- `Opcode ${opcode} (0x${opcode.toString(16)}) value is not in the range of valid opcodes.`,
192
+ `Opcode ${opcode} (0x${opcode.toString(16)}) value is not in the range of valid opcodes (at PC ${pc}).`,
186
193
  );
187
194
  }
188
195
 
@@ -192,13 +199,17 @@ export function decodeInstructionFromBytecode(
192
199
  }
193
200
 
194
201
  const instructionDeserializer: InstructionDeserializer = instructionDeserializerOrUndef;
202
+
195
203
  const instruction = instructionDeserializer(cursor);
196
204
  return [instruction, cursor.position() - startingPosition];
197
205
  } catch (error) {
198
- if (error instanceof InvalidOpcodeError || error instanceof AvmExecutionError) {
199
- throw error;
206
+ if (error instanceof InvalidTagValueError || error instanceof InvalidOpcodeError) {
207
+ throw duringInstrFetch(error, pc);
208
+ } else if (error instanceof AvmExecutionError) {
209
+ throw new AvmParsingError(`Instruction parsing error at pc ${pc}: ${error.message}`);
200
210
  } else {
201
- throw new AvmParsingError(`${error}`);
211
+ const msg = error instanceof Error ? `: ${error.message}` : '';
212
+ throw new AvmParsingError(`Instruction fetching error at pc ${pc}${msg}`);
202
213
  }
203
214
  }
204
215
  }
@@ -0,0 +1,41 @@
1
+ import type { Fr } from '@aztec/foundation/fields';
2
+ import type { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
4
+
5
+ export class ContractsDbCheckpoint {
6
+ private instances: Map<string, ContractInstanceWithAddress> = new Map();
7
+ private classes: Map<string, ContractClassPublic> = new Map();
8
+ private bytecodeCommitments: Map<string, Fr> = new Map();
9
+
10
+ public addInstance(address: AztecAddress, instance: ContractInstanceWithAddress): void {
11
+ this.instances.set(address.toString(), instance);
12
+ }
13
+
14
+ public addClass(classId: Fr, contractClass: ContractClassPublic): void {
15
+ this.classes.set(classId.toString(), contractClass);
16
+ }
17
+
18
+ public addBytecodeCommitment(classId: Fr, commitment: Fr): void {
19
+ this.bytecodeCommitments.set(classId.toString(), commitment);
20
+ }
21
+
22
+ public getInstance(address: AztecAddress): ContractInstanceWithAddress | undefined {
23
+ return this.instances.get(address.toString());
24
+ }
25
+
26
+ public getClass(classId: Fr): ContractClassPublic | undefined {
27
+ return this.classes.get(classId.toString());
28
+ }
29
+
30
+ public getBytecodeCommitment(classId: Fr): Fr | undefined {
31
+ return this.bytecodeCommitments.get(classId.toString());
32
+ }
33
+
34
+ public deepCopy(): ContractsDbCheckpoint {
35
+ const copy = new ContractsDbCheckpoint();
36
+ this.instances.forEach((value, key) => copy.instances.set(key, value));
37
+ this.classes.forEach((value, key) => copy.classes.set(key, value));
38
+ this.bytecodeCommitments.forEach((value, key) => copy.bytecodeCommitments.set(key, value));
39
+ return copy;
40
+ }
41
+ }
@@ -58,4 +58,19 @@ export interface PublicContractsDBInterface {
58
58
  * @returns The name of the function or undefined if not found.
59
59
  */
60
60
  getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
61
+
62
+ /**
63
+ * Creates a checkpoint of the current contract state.
64
+ */
65
+ createCheckpoint(): void;
66
+
67
+ /**
68
+ * Commits the current checkpoint, merging its state with the parent.
69
+ */
70
+ commitCheckpoint(): void;
71
+
72
+ /**
73
+ * Reverts the current checkpoint, discarding its state.
74
+ */
75
+ revertCheckpoint(): void;
61
76
  }
@@ -16,3 +16,28 @@ export async function getPublicFunctionDebugName(
16
16
  const selector = FunctionSelector.fromField(calldata[0]);
17
17
  return (await db.getDebugFunctionName(contractAddress, selector)) ?? selector.toString();
18
18
  }
19
+
20
+ /**
21
+ * Get the function selector and optional debug name for a public function.
22
+ * Returns the selector and name separately, with name only populated if a debug name is available.
23
+ * @param db - The contracts database
24
+ * @param contractAddress - The contract address
25
+ * @param calldata - The calldata (selector is in calldata[0])
26
+ * @returns An object with functionSelector (always if calldata[0] exists) and functionName (only if debug name found)
27
+ */
28
+ export async function getPublicFunctionSelectorAndName(
29
+ db: PublicContractsDBInterface,
30
+ contractAddress: AztecAddress,
31
+ calldata: Fr[],
32
+ ): Promise<{ functionSelector?: FunctionSelector; functionName?: string }> {
33
+ // Public function is dispatched and therefore the target function is passed in the first argument.
34
+ if (!calldata[0]) {
35
+ return {};
36
+ }
37
+ const selector = FunctionSelector.fromField(calldata[0]);
38
+ const debugName = await db.getDebugFunctionName(contractAddress, selector);
39
+ return {
40
+ functionSelector: selector,
41
+ functionName: debugName ?? undefined,
42
+ };
43
+ }
@@ -1,4 +1,5 @@
1
1
  import type { RevertCode } from '@aztec/stdlib/avm';
2
+ import type { GasUsed } from '@aztec/stdlib/gas';
2
3
  import {
3
4
  Attributes,
4
5
  type Histogram,
@@ -70,7 +71,7 @@ export class ExecutorMetrics implements ExecutorMetricsInterface {
70
71
  // do nothing (unimplemented)
71
72
  }
72
73
 
73
- stopRecordingTxSimulation(_txLabel: string, _revertedCode?: RevertCode) {
74
+ stopRecordingTxSimulation(_txLabel: string, _gasUsed?: GasUsed, _revertedCode?: RevertCode) {
74
75
  // do nothing (unimplemented)
75
76
  }
76
77
 
@@ -1,8 +1,9 @@
1
1
  import type { RevertCode } from '@aztec/stdlib/avm';
2
+ import type { GasUsed } from '@aztec/stdlib/gas';
2
3
 
3
4
  export interface ExecutorMetricsInterface {
4
5
  startRecordingTxSimulation(txLabel: string): void;
5
- stopRecordingTxSimulation(txLabel: string, revertedCode?: RevertCode): void;
6
+ stopRecordingTxSimulation(txLabel: string, gasUsed?: GasUsed, revertedCode?: RevertCode): void;
6
7
  recordEnqueuedCallSimulation(fnName: string, durationMs: number, manaUsed: number, totalInstructions: number): void;
7
8
  recordEnqueuedCallSimulationFailure(
8
9
  fnName: string,
@@ -1,7 +1,7 @@
1
1
  import { FunctionType, emptyContractArtifact, emptyFunctionArtifact } from '@aztec/stdlib/abi';
2
+ import type { PublicTxResult } from '@aztec/stdlib/avm';
2
3
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
4
 
4
- import type { PublicTxResult } from '../public_tx_simulator/public_tx_simulator.js';
5
5
  import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
6
6
 
7
7
  /**
@@ -1,4 +1,4 @@
1
- import { AvmCircuitInputs } from '@aztec/stdlib/avm';
1
+ import { AvmCircuitInputs, type PublicTxResult } from '@aztec/stdlib/avm';
2
2
  import { ProtocolContracts } from '@aztec/stdlib/tx';
3
3
 
4
4
  import avmMinimalCircuitInputsJson from '../../../artifacts/avm_minimal_inputs.json' with { type: 'json' };
@@ -6,7 +6,6 @@ import { TypeTag } from '../avm/avm_memory_types.js';
6
6
  import { Add, Return, Set } from '../avm/opcodes/index.js';
7
7
  import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
8
8
  import { Opcode } from '../avm/serialization/instruction_serialization.js';
9
- import type { PublicTxResult } from '../public_tx_simulator/public_tx_simulator.js';
10
9
  import { testCustomBytecode } from './custom_bytecode_tester.js';
11
10
  import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
12
11
 
@@ -21,8 +20,8 @@ export async function executeAvmMinimalPublicTx(tester: PublicTxSimulationTester
21
20
  const result = await testCustomBytecode(minimalBytecode, tester, 'MinimalTx', 'AvmMinimalContract');
22
21
 
23
22
  // Modify the protocol contracts to be all zeros
24
- result.avmProvingRequest.inputs.hints.protocolContracts = ProtocolContracts.empty();
25
- result.avmProvingRequest.inputs.publicInputs.protocolContracts = ProtocolContracts.empty();
23
+ result.hints!.protocolContracts = ProtocolContracts.empty();
24
+ result.publicInputs.protocolContracts = ProtocolContracts.empty();
26
25
 
27
26
  return result;
28
27
  }
@@ -1,6 +1,9 @@
1
+ import { DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT } from '@aztec/constants';
1
2
  import { asyncMap } from '@aztec/foundation/async-map';
3
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
4
  import { Fr } from '@aztec/foundation/fields';
3
5
  import { type ContractArtifact, encodeArguments } from '@aztec/stdlib/abi';
6
+ import { PublicSimulatorConfig, type PublicTxResult } from '@aztec/stdlib/avm';
4
7
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
8
  import { Gas, GasFees } from '@aztec/stdlib/gas';
6
9
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
@@ -16,9 +19,8 @@ import {
16
19
  getFunctionSelector,
17
20
  } from '../avm/fixtures/utils.js';
18
21
  import { PublicContractsDB } from '../public_db_sources.js';
19
- import { MeasuredCppPublicTxSimulatorHintedDbs } from '../public_tx_simulator/cpp_public_tx_simulator.js';
20
- import { MeasuredPublicTxSimulator } from '../public_tx_simulator/measured_public_tx_simulator.js';
21
- import type { PublicTxResult } from '../public_tx_simulator/public_tx_simulator.js';
22
+ import { MeasuredCppPublicTxSimulator } from '../public_tx_simulator/cpp_public_tx_simulator.js';
23
+ import { MeasuredCppVsTsPublicTxSimulator } from '../public_tx_simulator/cpp_vs_ts_public_tx_simulator.js';
22
24
  import type { MeasuredPublicTxSimulatorInterface } from '../public_tx_simulator/public_tx_simulator_interface.js';
23
25
  import { TestExecutorMetrics } from '../test_executor_metrics.js';
24
26
  import { SimpleContractDataSource } from './simple_contract_data_source.js';
@@ -35,6 +37,25 @@ export type TestEnqueuedCall = {
35
37
  contractArtifact?: ContractArtifact;
36
38
  };
37
39
 
40
+ const defaultConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
41
+ skipFeeEnforcement: false,
42
+ collectCallMetadata: true,
43
+ collectDebugLogs: true,
44
+ collectHints: false,
45
+ collectStatistics: false,
46
+ });
47
+
48
+ /**
49
+ * Factory type for creating a MeasuredPublicTxSimulatorInterface.
50
+ */
51
+ export type MeasuredSimulatorFactory = (
52
+ merkleTree: MerkleTreeWriteOperations,
53
+ contractsDB: PublicContractsDB,
54
+ globals: GlobalVariables,
55
+ metrics: TestExecutorMetrics,
56
+ config: PublicSimulatorConfig,
57
+ ) => MeasuredPublicTxSimulatorInterface;
58
+
38
59
  /**
39
60
  * A test class that extends the BaseAvmSimulationTester to enable real-app testing of the PublicTxSimulator.
40
61
  * It provides an interface for simulating one transaction at a time and maintains state between subsequent
@@ -50,19 +71,17 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
50
71
  contractDataSource: SimpleContractDataSource,
51
72
  globals: GlobalVariables = defaultGlobals(),
52
73
  private metrics: TestExecutorMetrics = new TestExecutorMetrics(),
53
- useCppSimulator: boolean = false,
74
+ simulatorFactory?: MeasuredSimulatorFactory,
75
+ config: PublicSimulatorConfig = defaultConfig,
54
76
  ) {
55
77
  super(contractDataSource, merkleTree);
56
78
 
57
79
  const contractsDB = new PublicContractsDB(contractDataSource);
58
- const config = {
59
- doMerkleOperations: true,
60
- skipFeeEnforcement: false,
61
- clientInitiatedSimulation: true,
62
- };
63
- this.simulator = useCppSimulator
64
- ? new MeasuredCppPublicTxSimulatorHintedDbs(merkleTree, contractsDB, globals, this.metrics, config)
65
- : new MeasuredPublicTxSimulator(merkleTree, contractsDB, globals, this.metrics, config);
80
+ if (simulatorFactory) {
81
+ this.simulator = simulatorFactory(merkleTree, contractsDB, globals, this.metrics, config);
82
+ } else {
83
+ this.simulator = new MeasuredCppPublicTxSimulator(merkleTree, contractsDB, globals, this.metrics, config);
84
+ }
66
85
  }
67
86
 
68
87
  public static async create(
@@ -70,10 +89,14 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
70
89
  globals: GlobalVariables = defaultGlobals(),
71
90
  metrics: TestExecutorMetrics = new TestExecutorMetrics(),
72
91
  useCppSimulator = false,
92
+ config: PublicSimulatorConfig = defaultConfig,
73
93
  ): Promise<PublicTxSimulationTester> {
74
94
  const contractDataSource = new SimpleContractDataSource();
75
95
  const merkleTree = await worldStateService.fork();
76
- return new PublicTxSimulationTester(merkleTree, contractDataSource, globals, metrics, useCppSimulator);
96
+ const simulatorFactory: MeasuredSimulatorFactory = useCppSimulator
97
+ ? (mt, cdb, g, m, c) => new MeasuredCppPublicTxSimulator(mt, cdb, g, m, c)
98
+ : (mt, cdb, g, m, c) => new MeasuredCppVsTsPublicTxSimulator(mt, cdb, g, m, c);
99
+ return new PublicTxSimulationTester(merkleTree, contractDataSource, globals, metrics, simulatorFactory, config);
77
100
  }
78
101
 
79
102
  public setMetricsPrefix(prefix: string) {
@@ -106,7 +129,9 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
106
129
  appCallRequests,
107
130
  teardownCallRequest,
108
131
  feePayer,
109
- /*gasUsedByPrivate*/ Gas.empty(),
132
+ /*gasUsedByPrivate*/ teardownCall
133
+ ? new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT)
134
+ : Gas.empty(),
110
135
  defaultGlobals(),
111
136
  );
112
137
  }
@@ -128,6 +153,11 @@ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
128
153
  const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
129
154
  const fullTxLabel = this.metricsPrefix ? `${this.metricsPrefix}/${txLabelWithCount}` : txLabelWithCount;
130
155
 
156
+ if (!this.simulator) {
157
+ throw new Error(
158
+ 'No simulator configured. Pass a simulatorFactory to the constructor or use PublicTxSimulationTester.create()',
159
+ );
160
+ }
131
161
  const avmResult = await this.simulator.simulate(tx, fullTxLabel);
132
162
 
133
163
  // Something like this is often useful for debugging:
@@ -219,6 +249,6 @@ export function defaultGlobals() {
219
249
  const globals = GlobalVariables.empty();
220
250
  globals.timestamp = DEFAULT_TIMESTAMP;
221
251
  globals.gasFees = DEFAULT_GAS_FEES; // apply some nonzero default gas fees
222
- globals.blockNumber = DEFAULT_BLOCK_NUMBER;
252
+ globals.blockNumber = BlockNumber(DEFAULT_BLOCK_NUMBER);
223
253
  return globals;
224
254
  }
@@ -1,3 +1,4 @@
1
+ import type { BlockNumber } from '@aztec/foundation/branded-types';
1
2
  import type { Fr } from '@aztec/foundation/fields';
2
3
  import { createLogger } from '@aztec/foundation/log';
3
4
  import type { ContractArtifact, FunctionSelector } from '@aztec/stdlib/abi';
@@ -59,7 +60,7 @@ export class SimpleContractDataSource implements ContractDataSource {
59
60
 
60
61
  /////////////////////////////////////////////////////////////
61
62
  // ContractDataSource function implementations
62
- getBlockNumber(): Promise<number> {
63
+ getBlockNumber(): Promise<BlockNumber> {
63
64
  throw new Error('Method not implemented.');
64
65
  }
65
66
 
@@ -90,19 +91,17 @@ export class SimpleContractDataSource implements ContractDataSource {
90
91
  return this.contractArtifacts.get(contractInstance!.currentContractClassId.toString());
91
92
  }
92
93
 
93
- async getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string> {
94
+ async getDebugFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined> {
94
95
  const contractInstance = await this.getContract(address);
95
96
  if (!contractInstance) {
96
- this.logger.warn(
97
- `Couldn't get fn name for debugging. Contract not in tester's ContractDataSource. Using selector:${selector} instead...`,
98
- );
99
- return `selector:${selector.toString()}`;
97
+ this.logger.warn(`Couldn't get fn name for debugging. Contract not in tester's ContractDataSource.`);
98
+ return undefined;
100
99
  }
101
100
  const key = `${contractInstance.currentContractClassId.toString()}:${selector.toString()}`;
102
101
  const fnName = this.debugFunctionName.get(key);
103
102
  if (!fnName) {
104
- this.logger.warn(`Couldn't get fn name for debugging. Using selector:${selector} instead...`);
105
- return selector.toString();
103
+ this.logger.warn(`Couldn't get fn name for debugging...`);
104
+ return undefined;
106
105
  }
107
106
  return fnName;
108
107
  }
@@ -7,11 +7,17 @@ import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
7
7
 
8
8
  import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
9
9
 
10
+ export type TokenTestOptions = {
11
+ /** Skip return value assertions in balance checks (useful for benchmarking with collectCallMetadata=false) */
12
+ skipReturnValueAssertions?: boolean;
13
+ };
14
+
10
15
  export async function tokenTest(
11
16
  tester: PublicTxSimulationTester,
12
17
  logger: Logger,
13
18
  tokenArtifact: ContractArtifact,
14
19
  expectToBeTrue: (x: boolean) => void,
20
+ options: TokenTestOptions = {},
15
21
  ) {
16
22
  const timer = new Timer();
17
23
 
@@ -36,7 +42,7 @@ export async function tokenTest(
36
42
  ],
37
43
  );
38
44
  expectToBeTrue(mintResult.revertCode.isOK());
39
- await checkBalance(tester, token, sender, sender, mintAmount, expectToBeTrue);
45
+ await checkBalance(tester, token, sender, sender, mintAmount, expectToBeTrue, options);
40
46
 
41
47
  const authwitNonce = new Fr(0);
42
48
  const transferAmount = 50n;
@@ -54,8 +60,8 @@ export async function tokenTest(
54
60
  ],
55
61
  );
56
62
  expectToBeTrue(transferResult.revertCode.isOK());
57
- await checkBalance(tester, token, sender, receiver, mintAmount - transferAmount, expectToBeTrue);
58
- await checkBalance(tester, token, sender, receiver, transferAmount, expectToBeTrue);
63
+ await checkBalance(tester, token, sender, sender, mintAmount - transferAmount, expectToBeTrue, options);
64
+ await checkBalance(tester, token, sender, receiver, transferAmount, expectToBeTrue, options);
59
65
 
60
66
  // EXECUTE! This means that if using AvmProvingTester subclass, it will PROVE the transaction!
61
67
  const burnResult = await tester.executeTxWithLabel(
@@ -71,7 +77,7 @@ export async function tokenTest(
71
77
  ],
72
78
  );
73
79
  expectToBeTrue(burnResult.revertCode.isOK());
74
- await checkBalance(tester, token, sender, receiver, 0n, expectToBeTrue);
80
+ await checkBalance(tester, token, sender, receiver, 0n, expectToBeTrue, options);
75
81
 
76
82
  logger.info(`TokenContract test took ${timer.ms()}ms\n`);
77
83
  }
@@ -116,6 +122,7 @@ async function checkBalance(
116
122
  account: AztecAddress,
117
123
  expectedBalance: bigint,
118
124
  expectToBeTrue: (x: boolean) => void,
125
+ options: TokenTestOptions = {},
119
126
  ) {
120
127
  // Strictly simulate this! No need to "execute" (aka prove if using AvmProvingTester subclass).
121
128
  const balResult = await tester.simulateTxWithLabel(
@@ -132,9 +139,10 @@ async function checkBalance(
132
139
  ],
133
140
  );
134
141
  expectToBeTrue(balResult.revertCode.isOK());
135
- // should be 1 call with 1 return value that is expectedBalance
136
- expectToBeTrue(balResult.processedPhases.length == 1);
137
- expectToBeTrue(balResult.processedPhases[0].returnValues.length == 1);
138
- expectToBeTrue(balResult.processedPhases[0].returnValues[0].values!.length == 1);
139
- expectToBeTrue(balResult.processedPhases[0].returnValues[0].values![0].toBigInt() == expectedBalance);
142
+ if (!options.skipReturnValueAssertions) {
143
+ // should be 1 call with 1 return value that is expectedBalance
144
+ const appLogicReturnValues = balResult.getAppLogicReturnValues();
145
+ expectToBeTrue(appLogicReturnValues.length === 1);
146
+ expectToBeTrue(appLogicReturnValues[0].values?.[0]?.toBigInt() === expectedBalance);
147
+ }
140
148
  }