@aztec/simulator 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f

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 (255) hide show
  1. package/README.md +6 -4
  2. package/dest/common/errors.d.ts +7 -1
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.d.ts +4 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +4 -3
  7. package/dest/private/acvm_native.d.ts +5 -3
  8. package/dest/private/acvm_native.d.ts.map +1 -1
  9. package/dest/private/acvm_native.js +8 -6
  10. package/dest/private/acvm_wasm.d.ts +4 -3
  11. package/dest/private/acvm_wasm.d.ts.map +1 -1
  12. package/dest/private/acvm_wasm.js +7 -5
  13. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  14. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/circuit_recorder.js +22 -19
  16. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  17. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  19. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  20. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  21. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  22. package/dest/private/factory.d.ts +3 -3
  23. package/dest/private/factory.d.ts.map +1 -1
  24. package/dest/private/factory.js +7 -4
  25. package/dest/public/avm/avm_context.d.ts +3 -3
  26. package/dest/public/avm/avm_context.d.ts.map +1 -1
  27. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  28. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  29. package/dest/public/avm/avm_contract_call_result.js +3 -3
  30. package/dest/public/avm/avm_execution_environment.d.ts +6 -5
  31. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  32. package/dest/public/avm/avm_gas.js +3 -3
  33. package/dest/public/avm/avm_machine_state.d.ts +6 -5
  34. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  35. package/dest/public/avm/avm_machine_state.js +3 -2
  36. package/dest/public/avm/avm_memory_types.d.ts +1 -1
  37. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  38. package/dest/public/avm/avm_memory_types.js +3 -0
  39. package/dest/public/avm/avm_simulator.d.ts +3 -2
  40. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  41. package/dest/public/avm/avm_simulator.js +6 -5
  42. package/dest/public/avm/calldata.d.ts +51 -0
  43. package/dest/public/avm/calldata.d.ts.map +1 -0
  44. package/dest/public/avm/calldata.js +64 -0
  45. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  46. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  47. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  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 +3 -2
  51. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -1
  52. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  53. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +17 -2
  54. package/dest/public/avm/fixtures/initializers.d.ts +1 -1
  55. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  56. package/dest/public/avm/fixtures/initializers.js +2 -1
  57. package/dest/public/avm/fixtures/utils.d.ts +1 -1
  58. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  59. package/dest/public/avm/fixtures/utils.js +3 -0
  60. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  61. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/accrued_substate.js +42 -43
  63. package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
  64. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  65. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  66. package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
  67. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  68. package/dest/public/avm/opcodes/bitwise.js +5 -5
  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/comparators.js +1 -1
  72. package/dest/public/avm/opcodes/contract.d.ts +5 -4
  73. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  74. package/dest/public/avm/opcodes/contract.js +13 -9
  75. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  76. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  77. package/dest/public/avm/opcodes/control_flow.js +4 -4
  78. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  79. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  80. package/dest/public/avm/opcodes/conversion.js +4 -4
  81. package/dest/public/avm/opcodes/ec_add.d.ts +4 -6
  82. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  83. package/dest/public/avm/opcodes/ec_add.js +22 -27
  84. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  85. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  86. package/dest/public/avm/opcodes/environment_getters.js +6 -6
  87. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  88. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  89. package/dest/public/avm/opcodes/external_calls.js +23 -22
  90. package/dest/public/avm/opcodes/hashing.d.ts +8 -8
  91. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  92. package/dest/public/avm/opcodes/hashing.js +12 -12
  93. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  94. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  95. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  96. package/dest/public/avm/opcodes/memory.d.ts +14 -14
  97. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  98. package/dest/public/avm/opcodes/memory.js +25 -25
  99. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  100. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  101. package/dest/public/avm/opcodes/misc.js +4 -4
  102. package/dest/public/avm/opcodes/storage.d.ts +16 -15
  103. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  104. package/dest/public/avm/opcodes/storage.js +34 -24
  105. package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
  106. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  107. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  108. package/dest/public/avm/serialization/instruction_serialization.js +1 -1
  109. package/dest/public/contracts_db_checkpoint.d.ts +2 -2
  110. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -1
  111. package/dest/public/contracts_db_checkpoint.js +1 -1
  112. package/dest/public/debug_fn_name.d.ts +4 -4
  113. package/dest/public/debug_fn_name.d.ts.map +1 -1
  114. package/dest/public/debug_fn_name.js +7 -5
  115. package/dest/public/executor_metrics.d.ts +1 -1
  116. package/dest/public/executor_metrics.d.ts.map +1 -1
  117. package/dest/public/executor_metrics.js +12 -33
  118. package/dest/public/fixtures/amm_test.js +2 -2
  119. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  120. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  121. package/dest/public/fixtures/bulk_test.js +32 -21
  122. package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -11
  123. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  124. package/dest/public/fixtures/custom_bytecode_tests.js +79 -19
  125. package/dest/public/fixtures/minimal_public_tx.js +2 -2
  126. package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
  127. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  128. package/dest/public/fixtures/opcode_spammer.js +100 -136
  129. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +6 -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 +37 -10
  132. package/dest/public/fixtures/utils.d.ts +2 -2
  133. package/dest/public/fixtures/utils.d.ts.map +1 -1
  134. package/dest/public/fixtures/utils.js +19 -20
  135. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
  136. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  137. package/dest/public/fuzzing/avm_fuzzer_simulator.js +42 -10
  138. package/dest/public/fuzzing/avm_simulator_bin.js +29 -11
  139. package/dest/public/hinting_db_sources.d.ts +5 -5
  140. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  141. package/dest/public/hinting_db_sources.js +10 -7
  142. package/dest/public/public_db_sources.d.ts +9 -5
  143. package/dest/public/public_db_sources.d.ts.map +1 -1
  144. package/dest/public/public_db_sources.js +20 -14
  145. package/dest/public/public_processor/guarded_merkle_tree.d.ts +5 -5
  146. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  147. package/dest/public/public_processor/guarded_merkle_tree.js +7 -5
  148. package/dest/public/public_processor/public_processor.d.ts +11 -6
  149. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  150. package/dest/public/public_processor/public_processor.js +511 -92
  151. package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
  152. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  153. package/dest/public/public_processor/public_processor_metrics.js +36 -45
  154. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  155. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  156. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +5 -4
  157. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
  158. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  159. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +10 -10
  160. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  161. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  162. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +7 -7
  163. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  164. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  165. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
  166. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  167. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  168. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  169. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  170. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  171. package/dest/public/public_tx_simulator/factories.js +4 -4
  172. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  173. package/dest/public/public_tx_simulator/public_tx_context.d.ts +10 -5
  174. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  175. package/dest/public/public_tx_simulator/public_tx_context.js +16 -18
  176. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +11 -5
  177. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  178. package/dest/public/public_tx_simulator/public_tx_simulator.js +26 -16
  179. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  180. package/dest/public/side_effect_trace.d.ts +5 -4
  181. package/dest/public/side_effect_trace.d.ts.map +1 -1
  182. package/dest/public/side_effect_trace.js +3 -3
  183. package/dest/public/state_manager/state_manager.d.ts +10 -4
  184. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  185. package/dest/public/state_manager/state_manager.js +14 -7
  186. package/dest/public/test_executor_metrics.d.ts +8 -2
  187. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  188. package/dest/public/test_executor_metrics.js +24 -2
  189. package/package.json +17 -17
  190. package/src/private/acvm/acvm.ts +4 -3
  191. package/src/private/acvm_native.ts +11 -5
  192. package/src/private/acvm_wasm.ts +11 -4
  193. package/src/private/circuit_recording/circuit_recorder.ts +23 -20
  194. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  195. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  196. package/src/private/factory.ts +7 -4
  197. package/src/public/avm/avm_context.ts +2 -2
  198. package/src/public/avm/avm_contract_call_result.ts +8 -6
  199. package/src/public/avm/avm_execution_environment.ts +9 -4
  200. package/src/public/avm/avm_gas.ts +2 -2
  201. package/src/public/avm/avm_machine_state.ts +6 -5
  202. package/src/public/avm/avm_memory_types.ts +4 -0
  203. package/src/public/avm/avm_simulator.ts +9 -6
  204. package/src/public/avm/calldata.ts +101 -0
  205. package/src/public/avm/fixtures/account_proof.json +553 -0
  206. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  207. package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -2
  208. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +22 -2
  209. package/src/public/avm/fixtures/initializers.ts +2 -1
  210. package/src/public/avm/fixtures/utils.ts +3 -0
  211. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  212. package/src/public/avm/opcodes/arithmetic.ts +1 -1
  213. package/src/public/avm/opcodes/bitwise.ts +3 -3
  214. package/src/public/avm/opcodes/comparators.ts +1 -1
  215. package/src/public/avm/opcodes/contract.ts +9 -8
  216. package/src/public/avm/opcodes/control_flow.ts +2 -2
  217. package/src/public/avm/opcodes/conversion.ts +3 -3
  218. package/src/public/avm/opcodes/ec_add.ts +21 -31
  219. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  220. package/src/public/avm/opcodes/external_calls.ts +18 -16
  221. package/src/public/avm/opcodes/hashing.ts +6 -6
  222. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  223. package/src/public/avm/opcodes/memory.ts +19 -19
  224. package/src/public/avm/opcodes/misc.ts +2 -2
  225. package/src/public/avm/opcodes/storage.ts +30 -22
  226. package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
  227. package/src/public/avm/serialization/instruction_serialization.ts +1 -1
  228. package/src/public/contracts_db_checkpoint.ts +1 -1
  229. package/src/public/debug_fn_name.ts +10 -8
  230. package/src/public/executor_metrics.ts +9 -33
  231. package/src/public/fixtures/amm_test.ts +2 -2
  232. package/src/public/fixtures/bulk_test.ts +31 -6
  233. package/src/public/fixtures/custom_bytecode_tests.ts +166 -19
  234. package/src/public/fixtures/minimal_public_tx.ts +2 -2
  235. package/src/public/fixtures/opcode_spammer.ts +200 -125
  236. package/src/public/fixtures/public_tx_simulation_tester.ts +47 -6
  237. package/src/public/fixtures/utils.ts +26 -22
  238. package/src/public/fuzzing/avm_fuzzer_simulator.ts +61 -13
  239. package/src/public/fuzzing/avm_simulator_bin.ts +43 -8
  240. package/src/public/hinting_db_sources.ts +10 -7
  241. package/src/public/public_db_sources.ts +36 -19
  242. package/src/public/public_processor/guarded_merkle_tree.ts +6 -6
  243. package/src/public/public_processor/public_processor.ts +156 -93
  244. package/src/public/public_processor/public_processor_metrics.ts +28 -44
  245. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +9 -5
  246. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +17 -7
  247. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +7 -5
  248. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
  249. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  250. package/src/public/public_tx_simulator/factories.ts +6 -3
  251. package/src/public/public_tx_simulator/public_tx_context.ts +21 -16
  252. package/src/public/public_tx_simulator/public_tx_simulator.ts +32 -17
  253. package/src/public/side_effect_trace.ts +5 -2
  254. package/src/public/state_manager/state_manager.ts +29 -20
  255. package/src/public/test_executor_metrics.ts +27 -3
@@ -1,21 +1,389 @@
1
- function _ts_decorate(decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1
+ function applyDecs2203RFactory() {
2
+ function createAddInitializerMethod(initializers, decoratorFinishedRef) {
3
+ return function addInitializer(initializer) {
4
+ assertNotFinished(decoratorFinishedRef, "addInitializer");
5
+ assertCallable(initializer, "An initializer");
6
+ initializers.push(initializer);
7
+ };
8
+ }
9
+ function memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value) {
10
+ var kindStr;
11
+ switch(kind){
12
+ case 1:
13
+ kindStr = "accessor";
14
+ break;
15
+ case 2:
16
+ kindStr = "method";
17
+ break;
18
+ case 3:
19
+ kindStr = "getter";
20
+ break;
21
+ case 4:
22
+ kindStr = "setter";
23
+ break;
24
+ default:
25
+ kindStr = "field";
26
+ }
27
+ var ctx = {
28
+ kind: kindStr,
29
+ name: isPrivate ? "#" + name : name,
30
+ static: isStatic,
31
+ private: isPrivate,
32
+ metadata: metadata
33
+ };
34
+ var decoratorFinishedRef = {
35
+ v: false
36
+ };
37
+ ctx.addInitializer = createAddInitializerMethod(initializers, decoratorFinishedRef);
38
+ var get, set;
39
+ if (kind === 0) {
40
+ if (isPrivate) {
41
+ get = desc.get;
42
+ set = desc.set;
43
+ } else {
44
+ get = function() {
45
+ return this[name];
46
+ };
47
+ set = function(v) {
48
+ this[name] = v;
49
+ };
50
+ }
51
+ } else if (kind === 2) {
52
+ get = function() {
53
+ return desc.value;
54
+ };
55
+ } else {
56
+ if (kind === 1 || kind === 3) {
57
+ get = function() {
58
+ return desc.get.call(this);
59
+ };
60
+ }
61
+ if (kind === 1 || kind === 4) {
62
+ set = function(v) {
63
+ desc.set.call(this, v);
64
+ };
65
+ }
66
+ }
67
+ ctx.access = get && set ? {
68
+ get: get,
69
+ set: set
70
+ } : get ? {
71
+ get: get
72
+ } : {
73
+ set: set
74
+ };
75
+ try {
76
+ return dec(value, ctx);
77
+ } finally{
78
+ decoratorFinishedRef.v = true;
79
+ }
80
+ }
81
+ function assertNotFinished(decoratorFinishedRef, fnName) {
82
+ if (decoratorFinishedRef.v) {
83
+ throw new Error("attempted to call " + fnName + " after decoration was finished");
84
+ }
85
+ }
86
+ function assertCallable(fn, hint) {
87
+ if (typeof fn !== "function") {
88
+ throw new TypeError(hint + " must be a function");
89
+ }
90
+ }
91
+ function assertValidReturnValue(kind, value) {
92
+ var type = typeof value;
93
+ if (kind === 1) {
94
+ if (type !== "object" || value === null) {
95
+ throw new TypeError("accessor decorators must return an object with get, set, or init properties or void 0");
96
+ }
97
+ if (value.get !== undefined) {
98
+ assertCallable(value.get, "accessor.get");
99
+ }
100
+ if (value.set !== undefined) {
101
+ assertCallable(value.set, "accessor.set");
102
+ }
103
+ if (value.init !== undefined) {
104
+ assertCallable(value.init, "accessor.init");
105
+ }
106
+ } else if (type !== "function") {
107
+ var hint;
108
+ if (kind === 0) {
109
+ hint = "field";
110
+ } else if (kind === 10) {
111
+ hint = "class";
112
+ } else {
113
+ hint = "method";
114
+ }
115
+ throw new TypeError(hint + " decorators must return a function or void 0");
116
+ }
117
+ }
118
+ function applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata) {
119
+ var decs = decInfo[0];
120
+ var desc, init, value;
121
+ if (isPrivate) {
122
+ if (kind === 0 || kind === 1) {
123
+ desc = {
124
+ get: decInfo[3],
125
+ set: decInfo[4]
126
+ };
127
+ } else if (kind === 3) {
128
+ desc = {
129
+ get: decInfo[3]
130
+ };
131
+ } else if (kind === 4) {
132
+ desc = {
133
+ set: decInfo[3]
134
+ };
135
+ } else {
136
+ desc = {
137
+ value: decInfo[3]
138
+ };
139
+ }
140
+ } else if (kind !== 0) {
141
+ desc = Object.getOwnPropertyDescriptor(base, name);
142
+ }
143
+ if (kind === 1) {
144
+ value = {
145
+ get: desc.get,
146
+ set: desc.set
147
+ };
148
+ } else if (kind === 2) {
149
+ value = desc.value;
150
+ } else if (kind === 3) {
151
+ value = desc.get;
152
+ } else if (kind === 4) {
153
+ value = desc.set;
154
+ }
155
+ var newValue, get, set;
156
+ if (typeof decs === "function") {
157
+ newValue = memberDec(decs, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
158
+ if (newValue !== void 0) {
159
+ assertValidReturnValue(kind, newValue);
160
+ if (kind === 0) {
161
+ init = newValue;
162
+ } else if (kind === 1) {
163
+ init = newValue.init;
164
+ get = newValue.get || value.get;
165
+ set = newValue.set || value.set;
166
+ value = {
167
+ get: get,
168
+ set: set
169
+ };
170
+ } else {
171
+ value = newValue;
172
+ }
173
+ }
174
+ } else {
175
+ for(var i = decs.length - 1; i >= 0; i--){
176
+ var dec = decs[i];
177
+ newValue = memberDec(dec, name, desc, initializers, kind, isStatic, isPrivate, metadata, value);
178
+ if (newValue !== void 0) {
179
+ assertValidReturnValue(kind, newValue);
180
+ var newInit;
181
+ if (kind === 0) {
182
+ newInit = newValue;
183
+ } else if (kind === 1) {
184
+ newInit = newValue.init;
185
+ get = newValue.get || value.get;
186
+ set = newValue.set || value.set;
187
+ value = {
188
+ get: get,
189
+ set: set
190
+ };
191
+ } else {
192
+ value = newValue;
193
+ }
194
+ if (newInit !== void 0) {
195
+ if (init === void 0) {
196
+ init = newInit;
197
+ } else if (typeof init === "function") {
198
+ init = [
199
+ init,
200
+ newInit
201
+ ];
202
+ } else {
203
+ init.push(newInit);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ }
209
+ if (kind === 0 || kind === 1) {
210
+ if (init === void 0) {
211
+ init = function(instance, init) {
212
+ return init;
213
+ };
214
+ } else if (typeof init !== "function") {
215
+ var ownInitializers = init;
216
+ init = function(instance, init) {
217
+ var value = init;
218
+ for(var i = 0; i < ownInitializers.length; i++){
219
+ value = ownInitializers[i].call(instance, value);
220
+ }
221
+ return value;
222
+ };
223
+ } else {
224
+ var originalInitializer = init;
225
+ init = function(instance, init) {
226
+ return originalInitializer.call(instance, init);
227
+ };
228
+ }
229
+ ret.push(init);
230
+ }
231
+ if (kind !== 0) {
232
+ if (kind === 1) {
233
+ desc.get = value.get;
234
+ desc.set = value.set;
235
+ } else if (kind === 2) {
236
+ desc.value = value;
237
+ } else if (kind === 3) {
238
+ desc.get = value;
239
+ } else if (kind === 4) {
240
+ desc.set = value;
241
+ }
242
+ if (isPrivate) {
243
+ if (kind === 1) {
244
+ ret.push(function(instance, args) {
245
+ return value.get.call(instance, args);
246
+ });
247
+ ret.push(function(instance, args) {
248
+ return value.set.call(instance, args);
249
+ });
250
+ } else if (kind === 2) {
251
+ ret.push(value);
252
+ } else {
253
+ ret.push(function(instance, args) {
254
+ return value.call(instance, args);
255
+ });
256
+ }
257
+ } else {
258
+ Object.defineProperty(base, name, desc);
259
+ }
260
+ }
261
+ }
262
+ function applyMemberDecs(Class, decInfos, metadata) {
263
+ var ret = [];
264
+ var protoInitializers;
265
+ var staticInitializers;
266
+ var existingProtoNonFields = new Map();
267
+ var existingStaticNonFields = new Map();
268
+ for(var i = 0; i < decInfos.length; i++){
269
+ var decInfo = decInfos[i];
270
+ if (!Array.isArray(decInfo)) continue;
271
+ var kind = decInfo[1];
272
+ var name = decInfo[2];
273
+ var isPrivate = decInfo.length > 3;
274
+ var isStatic = kind >= 5;
275
+ var base;
276
+ var initializers;
277
+ if (isStatic) {
278
+ base = Class;
279
+ kind = kind - 5;
280
+ staticInitializers = staticInitializers || [];
281
+ initializers = staticInitializers;
282
+ } else {
283
+ base = Class.prototype;
284
+ protoInitializers = protoInitializers || [];
285
+ initializers = protoInitializers;
286
+ }
287
+ if (kind !== 0 && !isPrivate) {
288
+ var existingNonFields = isStatic ? existingStaticNonFields : existingProtoNonFields;
289
+ var existingKind = existingNonFields.get(name) || 0;
290
+ if (existingKind === true || existingKind === 3 && kind !== 4 || existingKind === 4 && kind !== 3) {
291
+ throw new Error("Attempted to decorate a public method/accessor that has the same name as a previously decorated public method/accessor. This is not currently supported by the decorators plugin. Property name was: " + name);
292
+ } else if (!existingKind && kind > 2) {
293
+ existingNonFields.set(name, kind);
294
+ } else {
295
+ existingNonFields.set(name, true);
296
+ }
297
+ }
298
+ applyMemberDec(ret, base, decInfo, name, kind, isStatic, isPrivate, initializers, metadata);
299
+ }
300
+ pushInitializers(ret, protoInitializers);
301
+ pushInitializers(ret, staticInitializers);
302
+ return ret;
303
+ }
304
+ function pushInitializers(ret, initializers) {
305
+ if (initializers) {
306
+ ret.push(function(instance) {
307
+ for(var i = 0; i < initializers.length; i++){
308
+ initializers[i].call(instance);
309
+ }
310
+ return instance;
311
+ });
312
+ }
313
+ }
314
+ function applyClassDecs(targetClass, classDecs, metadata) {
315
+ if (classDecs.length > 0) {
316
+ var initializers = [];
317
+ var newClass = targetClass;
318
+ var name = targetClass.name;
319
+ for(var i = classDecs.length - 1; i >= 0; i--){
320
+ var decoratorFinishedRef = {
321
+ v: false
322
+ };
323
+ try {
324
+ var nextNewClass = classDecs[i](newClass, {
325
+ kind: "class",
326
+ name: name,
327
+ addInitializer: createAddInitializerMethod(initializers, decoratorFinishedRef),
328
+ metadata
329
+ });
330
+ } finally{
331
+ decoratorFinishedRef.v = true;
332
+ }
333
+ if (nextNewClass !== undefined) {
334
+ assertValidReturnValue(10, nextNewClass);
335
+ newClass = nextNewClass;
336
+ }
337
+ }
338
+ return [
339
+ defineMetadata(newClass, metadata),
340
+ function() {
341
+ for(var i = 0; i < initializers.length; i++){
342
+ initializers[i].call(newClass);
343
+ }
344
+ }
345
+ ];
346
+ }
347
+ }
348
+ function defineMetadata(Class, metadata) {
349
+ return Object.defineProperty(Class, Symbol.metadata || Symbol.for("Symbol.metadata"), {
350
+ configurable: true,
351
+ enumerable: true,
352
+ value: metadata
353
+ });
354
+ }
355
+ return function applyDecs2203R(targetClass, memberDecs, classDecs, parentClass) {
356
+ if (parentClass !== void 0) {
357
+ var parentMetadata = parentClass[Symbol.metadata || Symbol.for("Symbol.metadata")];
358
+ }
359
+ var metadata = Object.create(parentMetadata === void 0 ? null : parentMetadata);
360
+ var e = applyMemberDecs(targetClass, memberDecs, metadata);
361
+ if (!classDecs.length) defineMetadata(targetClass, metadata);
362
+ return {
363
+ e: e,
364
+ get c () {
365
+ return applyClassDecs(targetClass, classDecs, metadata);
366
+ }
367
+ };
368
+ };
369
+ }
370
+ function _apply_decs_2203_r(targetClass, memberDecs, classDecs, parentClass) {
371
+ return (_apply_decs_2203_r = applyDecs2203RFactory())(targetClass, memberDecs, classDecs, parentClass);
6
372
  }
373
+ var _dec, _dec1, _dec2, _initProto;
7
374
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
8
375
  import { padArrayEnd } from '@aztec/foundation/collection';
9
376
  import { Fr } from '@aztec/foundation/curves/bn254';
10
377
  import { createLogger } from '@aztec/foundation/log';
11
378
  import { sleep } from '@aztec/foundation/sleep';
12
- import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
379
+ import { DateProvider, Timer, elapsed, execWithSignal } from '@aztec/foundation/timer';
13
380
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
14
381
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
15
382
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
16
383
  import { AvmCircuitInputs, AvmExecutionHints, PublicDataWrite } from '@aztec/stdlib/avm';
17
384
  import { computeTransactionFee } from '@aztec/stdlib/fees';
18
385
  import { Gas } from '@aztec/stdlib/gas';
386
+ import { NullDebugLogStore } from '@aztec/stdlib/logs';
19
387
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
20
388
  import { MerkleTreeId } from '@aztec/stdlib/trees';
21
389
  import { NestedProcessReturnValues, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/stdlib/tx';
@@ -32,24 +400,25 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
32
400
  contractDataSource;
33
401
  dateProvider;
34
402
  telemetryClient;
35
- constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient()){
403
+ log;
404
+ constructor(contractDataSource, dateProvider = new DateProvider(), telemetryClient = getTelemetryClient(), bindings){
36
405
  this.contractDataSource = contractDataSource;
37
406
  this.dateProvider = dateProvider;
38
407
  this.telemetryClient = telemetryClient;
408
+ this.log = createLogger('simulator:public-processor-factory', bindings);
39
409
  }
40
410
  /**
41
411
  * Creates a new instance of a PublicProcessor.
42
412
  * @param globalVariables - The global variables for the block being processed.
43
- * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
413
+ * @param contractsDB - Optional pre-populated contracts DB; a fresh one is constructed if omitted.
44
414
  * @returns A new instance of a PublicProcessor.
45
- */ create(merkleTree, globalVariables, config) {
46
- const contractsDB = new PublicContractsDB(this.contractDataSource);
415
+ */ create(merkleTree, globalVariables, config, contractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings())) {
47
416
  const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
48
417
  const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
49
- return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
418
+ return new PublicProcessor(globalVariables, guardedFork, contractsDB, publicTxSimulator, this.dateProvider, this.telemetryClient, createLogger('simulator:public-processor', this.log.getBindings()));
50
419
  }
51
420
  createPublicTxSimulator(merkleTree, contractsDB, globalVariables, config) {
52
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
421
+ return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config, this.log.getBindings());
53
422
  }
54
423
  }
55
424
  class PublicProcessorTimeoutError extends Error {
@@ -58,6 +427,22 @@ class PublicProcessorTimeoutError extends Error {
58
427
  this.name = 'PublicProcessorTimeoutError';
59
428
  }
60
429
  }
430
+ class PublicProcessorAbortError extends Error {
431
+ constructor(message = 'Aborted while processing tx'){
432
+ super(message);
433
+ this.name = 'PublicProcessorAbortError';
434
+ }
435
+ }
436
+ function isPublicProcessorInterruptError(err) {
437
+ return err?.name === 'PublicProcessorTimeoutError' || err?.name === 'PublicProcessorAbortError';
438
+ }
439
+ _dec = trackSpan('PublicProcessor.processTx', (tx)=>({
440
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
441
+ })), _dec1 = trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
442
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
443
+ })), _dec2 = trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
444
+ [Attributes.TX_HASH]: tx.getTxHash().toString()
445
+ }));
61
446
  /**
62
447
  * Converts Txs lifted from the P2P module into ProcessedTx objects by executing
63
448
  * any public function calls in them. Txs with private calls only are unaffected.
@@ -69,8 +454,28 @@ class PublicProcessorTimeoutError extends Error {
69
454
  dateProvider;
70
455
  log;
71
456
  opts;
457
+ debugLogStore;
458
+ static{
459
+ ({ e: [_initProto] } = _apply_decs_2203_r(this, [
460
+ [
461
+ _dec,
462
+ 2,
463
+ "processTx"
464
+ ],
465
+ [
466
+ _dec1,
467
+ 2,
468
+ "processPrivateOnlyTx"
469
+ ],
470
+ [
471
+ _dec2,
472
+ 2,
473
+ "processTxWithPublicCalls"
474
+ ]
475
+ ], []));
476
+ }
72
477
  metrics;
73
- constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor'), opts = {}){
478
+ constructor(globalVariables, guardedMerkleTree, contractsDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log, opts = {}, debugLogStore = new NullDebugLogStore()){
74
479
  this.globalVariables = globalVariables;
75
480
  this.guardedMerkleTree = guardedMerkleTree;
76
481
  this.contractsDB = contractsDB;
@@ -78,6 +483,8 @@ class PublicProcessorTimeoutError extends Error {
78
483
  this.dateProvider = dateProvider;
79
484
  this.log = log;
80
485
  this.opts = opts;
486
+ this.debugLogStore = debugLogStore;
487
+ _initProto(this);
81
488
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
82
489
  }
83
490
  get tracer() {
@@ -90,43 +497,52 @@ class PublicProcessorTimeoutError extends Error {
90
497
  * @param validator - Pre-process validator and nullifier cache to use for processing the txs.
91
498
  * @returns The list of processed txs with their circuit simulation outputs.
92
499
  */ async process(txs, limits = {}, validator = {}) {
93
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
500
+ const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal, signal } = limits;
94
501
  const { preprocessValidator, nullifierCache } = validator;
95
502
  const result = [];
96
503
  const usedTxs = [];
97
504
  const failed = [];
505
+ const debugLogs = [];
98
506
  const timer = new Timer();
99
507
  let totalSizeInBytes = 0;
100
508
  let returns = [];
101
509
  let totalPublicGas = new Gas(0, 0);
102
510
  let totalBlockGas = new Gas(0, 0);
103
511
  let totalBlobFields = 0;
512
+ let silentlySkippedCount = 0;
513
+ let totalSilentlySkippedDurationMs = 0;
104
514
  for await (const tx of txs){
105
515
  // Only process up to the max tx limit
106
516
  if (maxTransactions !== undefined && result.length >= maxTransactions) {
107
517
  this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
108
518
  break;
109
519
  }
110
- // Bail if we've hit the deadline
520
+ // Bail if we've hit the deadline or have been interrupted.
111
521
  if (deadline && this.dateProvider.now() > +deadline) {
112
522
  this.log.warn(`Stopping tx processing due to timeout.`);
113
523
  break;
114
524
  }
115
- // Skip this tx if it'd exceed max block size
525
+ if (signal?.aborted) {
526
+ this.log.warn(`Stopping tx processing due to abort signal.`);
527
+ break;
528
+ }
116
529
  const txHash = tx.getTxHash().toString();
117
- const preTxSizeInBytes = tx.getEstimatedPrivateTxEffectsSize();
118
- if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
119
- this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
530
+ // Skip this tx if its estimated blob fields would exceed the limit.
531
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
532
+ const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
533
+ if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
534
+ this.log.warn(`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`, {
120
535
  txHash,
121
- sizeInBytes: preTxSizeInBytes,
122
- totalSizeInBytes,
123
- maxBlockSize
536
+ txBlobFields,
537
+ totalBlobFields,
538
+ maxBlobFields
124
539
  });
125
540
  continue;
126
541
  }
127
- // Skip this tx if its gas limit would exceed the block gas limit
542
+ // Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
543
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
128
544
  const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
129
- if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
545
+ if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
130
546
  this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
131
547
  txHash,
132
548
  txGasLimit,
@@ -148,11 +564,6 @@ class PublicProcessorTimeoutError extends Error {
148
564
  });
149
565
  returns.push(new NestedProcessReturnValues([]));
150
566
  continue;
151
- } else if (result.result === 'skipped') {
152
- const reason = result.reason.join(', ');
153
- this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
154
- returns.push(new NestedProcessReturnValues([]));
155
- continue;
156
567
  } else {
157
568
  this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
158
569
  }
@@ -166,39 +577,45 @@ class PublicProcessorTimeoutError extends Error {
166
577
  const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
167
578
  this.contractsDB.createCheckpoint();
168
579
  try {
169
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
580
+ const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(()=>this.processTx(tx, deadline, signal));
170
581
  // Inject a fake processing failure after N txs if requested
171
582
  const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
172
583
  if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
173
584
  throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
174
585
  }
175
586
  const txBlobFields = processedTx.txEffect.getNumBlobFields();
176
- // If the actual size of this tx would exceed block size, skip it
177
587
  const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
178
- if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
179
- this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
588
+ // If the actual blob fields of this tx would exceed the limit, skip it.
589
+ // Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
590
+ if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
591
+ this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
180
592
  txHash,
181
- sizeInBytes: txSize,
182
- totalSizeInBytes,
183
- maxBlockSize
593
+ txBlobFields,
594
+ totalBlobFields,
595
+ maxBlobFields,
596
+ txProcessingTimeMs
184
597
  });
598
+ silentlySkippedCount += 1;
599
+ totalSilentlySkippedDurationMs += txProcessingTimeMs;
600
+ this.metrics.recordSilentlySkipped(txProcessingTimeMs);
185
601
  // Need to revert the checkpoint here and don't go any further
186
602
  await checkpoint.revert();
187
603
  this.contractsDB.revertCheckpoint();
188
604
  continue;
189
605
  }
190
- // If the actual blob fields of this tx would exceed the limit, skip it
191
- if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
192
- this.log.debug(`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`, {
606
+ // During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
607
+ // Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
608
+ // this uses actual gas and stops processing when the limit is exceeded.
609
+ if (!isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)) {
610
+ this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
193
611
  txHash,
194
- txBlobFields,
195
- totalBlobFields,
196
- maxBlobFields
612
+ txGas: processedTx.gasUsed.totalGas,
613
+ totalBlockGas,
614
+ maxBlockGas
197
615
  });
198
- // Need to revert the checkpoint here and don't go any further
199
616
  await checkpoint.revert();
200
617
  this.contractsDB.revertCheckpoint();
201
- continue;
618
+ break;
202
619
  }
203
620
  // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
204
621
  // I'd rather pass the validators the processedTx as well and let them deal with it.
@@ -206,42 +623,39 @@ class PublicProcessorTimeoutError extends Error {
206
623
  result.push(processedTx);
207
624
  usedTxs.push(tx);
208
625
  returns = returns.concat(returnValues);
626
+ debugLogs.push(...txDebugLogs);
627
+ this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
209
628
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
210
629
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
211
630
  totalSizeInBytes += txSize;
212
631
  totalBlobFields += txBlobFields;
632
+ // Commit the tx-level contracts checkpoint on success
633
+ this.contractsDB.commitCheckpoint();
213
634
  } catch (err) {
214
- if (err?.name === 'PublicProcessorTimeoutError') {
215
- this.log.warn(`Stopping tx processing due to timeout.`);
216
- // We hit the transaction execution deadline.
217
- // There may still be a transaction executing on a worker thread (C++ via NAPI).
218
- // Signal cancellation AND WAIT for the simulation to actually stop.
219
- // This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
220
- // and won't check the cancellation flag until that operation completes.
221
- // Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
222
- // Wait for C++ to stop gracefully.
635
+ if (isPublicProcessorInterruptError(err)) {
636
+ const interruptReason = err.name === 'PublicProcessorTimeoutError' ? 'timeout' : 'abort signal';
637
+ this.log.warn(`Stopping tx processing due to ${interruptReason}.`);
638
+ // The tx may still be executing on a worker thread (C++ via NAPI).
639
+ // Signal cancellation AND WAIT for the simulation to actually stop before touching fork checkpoints.
223
640
  await this.publicTxSimulator.cancel?.();
224
641
  // Now stop the guarded fork to prevent any further TS-side access to the world state.
225
642
  await this.guardedMerkleTree.stop();
226
643
  // We now know there can't be any further access to world state. The fork is in a state where there is:
227
644
  // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
228
645
  // 2. Possible state updates on that checkpoint or any others created during execution.
229
- // First we revert a checkpoint as managed by the ForkCheckpoint. This will revert whatever is the current checkpoint
230
- // which may not be the one originally created by this object. But that is ok, we do this to fulfil the ForkCheckpoint
231
- // lifecycle expectations and ensure it doesn't attempt to commit later on.
232
- await checkpoint.revert();
233
- // Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
234
- // This needs to be done directly on the underlying fork as the guarded fork has been stopped.
235
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
646
+ // Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
647
+ // updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
648
+ // created by callers below our depth.
649
+ await checkpoint.revertToCheckpoint();
236
650
  // Revert any contracts added to the DB for the tx.
237
651
  this.contractsDB.revertCheckpoint();
238
652
  // Ensure we're at the same state as when we started processing this tx.
239
653
  await this.checkWorldStateUnchanged(startStateReference, txHash, err);
240
654
  break;
241
655
  }
242
- // Roll back state to start of TX before proceeding to next TX
243
- await checkpoint.revert();
244
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
656
+ // Roll back state to start of TX before proceeding to next TX.
657
+ // Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
658
+ await checkpoint.revertToCheckpoint();
245
659
  this.contractsDB.revertCheckpoint();
246
660
  const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
247
661
  this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
@@ -255,24 +669,30 @@ class PublicProcessorTimeoutError extends Error {
255
669
  } finally{
256
670
  // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
257
671
  await checkpoint.commit();
258
- this.contractsDB.commitCheckpointOkIfNone();
259
672
  }
260
673
  }
261
674
  const duration = timer.s();
262
675
  const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
263
676
  this.metrics.recordAllTxs(totalPublicGas, rate);
264
- this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs in ${duration}s`, {
677
+ const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
678
+ this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs ` + `(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` + `in ${duration}s`, {
679
+ blockNumber: this.globalVariables.blockNumber,
680
+ successfulCount: result.length,
681
+ failedCount: failed.length,
265
682
  duration,
266
683
  rate,
267
684
  totalPublicGas,
268
685
  totalBlockGas,
269
- totalSizeInBytes
686
+ totalSizeInBytes,
687
+ silentlySkippedCount,
688
+ silentlySkippedDurationMs
270
689
  });
271
690
  return [
272
691
  result,
273
692
  failed,
274
693
  usedTxs,
275
- returns
694
+ returns,
695
+ debugLogs
276
696
  ];
277
697
  }
278
698
  async checkWorldStateUnchanged(startStateReference, txHash, cause) {
@@ -288,8 +708,8 @@ class PublicProcessorTimeoutError extends Error {
288
708
  });
289
709
  }
290
710
  }
291
- async processTx(tx, deadline) {
292
- const [time, [processedTx, returnValues]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
711
+ async processTx(tx, deadline, signal) {
712
+ const [time, [processedTx, returnValues, debugLogs]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline, signal));
293
713
  this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`, {
294
714
  txHash: processedTx.hash,
295
715
  txFee: processedTx.txEffect.transactionFee.toBigInt(),
@@ -307,7 +727,8 @@ class PublicProcessorTimeoutError extends Error {
307
727
  });
308
728
  return [
309
729
  processedTx,
310
- returnValues ?? []
730
+ returnValues ?? [],
731
+ debugLogs
311
732
  ];
312
733
  }
313
734
  async doTreeInsertionsForPrivateOnlyTx(processedTx) {
@@ -329,7 +750,7 @@ class PublicProcessorTimeoutError extends Error {
329
750
  const treeInsertionEnd = process.hrtime.bigint();
330
751
  this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
331
752
  }
332
- /** Processes the given tx within deadline. Returns timeout if deadline is hit. */ async processTxWithinDeadline(tx, deadline) {
753
+ /** Processes the given tx within deadline or until the signal is aborted. */ async processTxWithinDeadline(tx, deadline, signal) {
333
754
  const innerProcessFn = tx.hasPublicCalls() ? ()=>this.processTxWithPublicCalls(tx) : ()=>this.processPrivateOnlyTx(tx);
334
755
  // Fake a delay per tx if instructed (used for tests)
335
756
  const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
@@ -339,20 +760,31 @@ class PublicProcessorTimeoutError extends Error {
339
760
  await sleep(fakeDelayPerTxMs);
340
761
  return result;
341
762
  } : innerProcessFn;
342
- if (!deadline) {
763
+ const processingSignal = this.getProcessingSignal(tx, deadline, signal);
764
+ if (!processingSignal) {
343
765
  return await processFn();
344
766
  }
345
- const txHash = tx.getTxHash();
767
+ return await execWithSignal(()=>processFn(), processingSignal, (signal)=>signal.reason?.name === 'TimeoutError' ? new PublicProcessorTimeoutError() : new PublicProcessorAbortError());
768
+ }
769
+ getProcessingSignal(tx, deadline, signal) {
770
+ if (!deadline) {
771
+ return signal;
772
+ }
346
773
  const timeout = +deadline - this.dateProvider.now();
347
774
  if (timeout <= 0) {
348
775
  throw new PublicProcessorTimeoutError();
349
776
  }
777
+ const txHash = tx.getTxHash();
350
778
  this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
351
779
  deadline: deadline.toISOString(),
352
780
  now: new Date(this.dateProvider.now()).toISOString(),
353
781
  txHash
354
782
  });
355
- return await executeTimeout(()=>processFn(), timeout, ()=>new PublicProcessorTimeoutError());
783
+ const timeoutSignal = AbortSignal.timeout(timeout);
784
+ return signal ? AbortSignal.any([
785
+ signal,
786
+ timeoutSignal
787
+ ]) : timeoutSignal;
356
788
  }
357
789
  /**
358
790
  * Creates the public data write for paying the tx fee.
@@ -381,10 +813,11 @@ class PublicProcessorTimeoutError extends Error {
381
813
  this.metrics.recordClassPublication(...tx.getContractClassLogs().filter((log)=>ContractClassPublishedEvent.isContractClassPublishedEvent(log)).map((log)=>ContractClassPublishedEvent.fromLog(log)));
382
814
  // Fee payment insertion has already been done. Do the rest.
383
815
  await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
384
- await this.contractsDB.addNewContracts(tx);
816
+ this.contractsDB.addNewContracts(tx);
385
817
  return [
386
818
  processedTx,
387
- undefined
819
+ undefined,
820
+ []
388
821
  ];
389
822
  }
390
823
  async processTxWithPublicCalls(tx) {
@@ -406,7 +839,8 @@ class PublicProcessorTimeoutError extends Error {
406
839
  const processedTx = makeProcessedTxFromTxWithPublicCalls(tx, this.globalVariables, avmProvingRequest, publicTxEffect, gasUsed, revertCode, revertReason);
407
840
  return [
408
841
  processedTx,
409
- appLogicReturnValues
842
+ appLogicReturnValues,
843
+ result.logs ?? []
410
844
  ];
411
845
  }
412
846
  /**
@@ -418,18 +852,3 @@ class PublicProcessorTimeoutError extends Error {
418
852
  };
419
853
  }
420
854
  }
421
- _ts_decorate([
422
- trackSpan('PublicProcessor.processTx', (tx)=>({
423
- [Attributes.TX_HASH]: tx.getTxHash().toString()
424
- }))
425
- ], PublicProcessor.prototype, "processTx", null);
426
- _ts_decorate([
427
- trackSpan('PublicProcessor.processPrivateOnlyTx', (tx)=>({
428
- [Attributes.TX_HASH]: tx.getTxHash().toString()
429
- }))
430
- ], PublicProcessor.prototype, "processPrivateOnlyTx", null);
431
- _ts_decorate([
432
- trackSpan('PublicProcessor.processTxWithPublicCalls', (tx)=>({
433
- [Attributes.TX_HASH]: tx.getTxHash().toString()
434
- }))
435
- ], PublicProcessor.prototype, "processTxWithPublicCalls", null);