@aztec/simulator 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

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 (304) hide show
  1. package/dest/acvm/acvm.js +18 -21
  2. package/dest/acvm/acvm_types.js +3 -2
  3. package/dest/acvm/deserialize.js +9 -13
  4. package/dest/acvm/index.js +0 -1
  5. package/dest/acvm/oracle/index.js +0 -1
  6. package/dest/acvm/oracle/oracle.js +42 -23
  7. package/dest/acvm/oracle/typed_oracle.js +36 -38
  8. package/dest/acvm/serialize.js +7 -14
  9. package/dest/avm/avm_context.js +24 -27
  10. package/dest/avm/avm_contract_call_result.js +12 -7
  11. package/dest/avm/avm_execution_environment.js +10 -7
  12. package/dest/avm/avm_gas.js +93 -56
  13. package/dest/avm/avm_machine_state.js +60 -61
  14. package/dest/avm/avm_memory_types.js +166 -255
  15. package/dest/avm/avm_simulator.js +68 -47
  16. package/dest/avm/avm_tree.js +282 -276
  17. package/dest/avm/bytecode_utils.js +8 -6
  18. package/dest/avm/errors.js +46 -63
  19. package/dest/avm/fixtures/avm_simulation_tester.js +18 -17
  20. package/dest/avm/fixtures/base_avm_simulation_tester.js +21 -16
  21. package/dest/avm/fixtures/index.js +27 -26
  22. package/dest/avm/fixtures/simple_contract_data_source.js +9 -13
  23. package/dest/avm/index.js +0 -1
  24. package/dest/avm/journal/index.js +0 -1
  25. package/dest/avm/journal/journal.js +147 -200
  26. package/dest/avm/journal/nullifiers.js +43 -46
  27. package/dest/avm/journal/public_storage.js +73 -87
  28. package/dest/avm/opcodes/accrued_substate.js +140 -110
  29. package/dest/avm/opcodes/addressing_mode.js +29 -31
  30. package/dest/avm/opcodes/arithmetic.js +17 -15
  31. package/dest/avm/opcodes/bitwise.js +40 -26
  32. package/dest/avm/opcodes/comparators.js +12 -10
  33. package/dest/avm/opcodes/contract.js +31 -29
  34. package/dest/avm/opcodes/control_flow.js +47 -43
  35. package/dest/avm/opcodes/conversion.js +30 -26
  36. package/dest/avm/opcodes/ec_add.js +35 -34
  37. package/dest/avm/opcodes/environment_getters.js +33 -33
  38. package/dest/avm/opcodes/external_calls.js +83 -74
  39. package/dest/avm/opcodes/hashing.js +69 -61
  40. package/dest/avm/opcodes/index.js +0 -1
  41. package/dest/avm/opcodes/instruction.js +31 -40
  42. package/dest/avm/opcodes/instruction_impl.js +12 -15
  43. package/dest/avm/opcodes/memory.js +177 -156
  44. package/dest/avm/opcodes/misc.js +27 -25
  45. package/dest/avm/opcodes/multi_scalar_mul.js +43 -41
  46. package/dest/avm/opcodes/storage.js +28 -25
  47. package/dest/avm/serialization/buffer_cursor.js +4 -4
  48. package/dest/avm/serialization/bytecode_serialization.js +292 -89
  49. package/dest/avm/serialization/instruction_serialization.js +67 -28
  50. package/dest/avm/test_utils.js +6 -9
  51. package/dest/client/client_execution_context.js +197 -219
  52. package/dest/client/db_oracle.js +4 -7
  53. package/dest/client/execution_note_cache.js +80 -81
  54. package/dest/client/index.js +0 -1
  55. package/dest/client/pick_notes.js +27 -30
  56. package/dest/client/private_execution.js +13 -14
  57. package/dest/client/simulator.js +44 -48
  58. package/dest/client/unconstrained_execution.js +8 -11
  59. package/dest/client/view_data_oracle.js +130 -139
  60. package/dest/common/debug_fn_name.js +1 -4
  61. package/dest/common/errors.js +30 -39
  62. package/dest/common/hashed_values_cache.js +16 -20
  63. package/dest/common/index.js +0 -1
  64. package/dest/common/message_load_oracle_inputs.js +7 -7
  65. package/dest/common/simulation_provider.js +3 -6
  66. package/dest/common.js +0 -1
  67. package/dest/providers/acvm_native.js +46 -32
  68. package/dest/providers/acvm_wasm.js +18 -10
  69. package/dest/providers/acvm_wasm_with_blobs.js +2 -5
  70. package/dest/providers/factory.js +5 -5
  71. package/dest/providers/index.js +0 -1
  72. package/dest/public/bytecode_errors.js +1 -2
  73. package/dest/public/db_interfaces.js +1 -2
  74. package/dest/public/execution.js +2 -4
  75. package/dest/public/executor_metrics.js +16 -12
  76. package/dest/public/fee_payment.js +2 -5
  77. package/dest/public/fixtures/index.js +0 -1
  78. package/dest/public/fixtures/public_tx_simulation_tester.js +13 -17
  79. package/dest/public/fixtures/utils.js +11 -14
  80. package/dest/public/index.js +0 -1
  81. package/dest/public/public_db_sources.js +79 -87
  82. package/dest/public/public_processor.js +310 -306
  83. package/dest/public/public_processor_metrics.js +46 -27
  84. package/dest/public/public_tx_context.js +97 -118
  85. package/dest/public/public_tx_simulator.js +299 -314
  86. package/dest/public/side_effect_errors.js +1 -2
  87. package/dest/public/side_effect_trace.js +44 -71
  88. package/dest/public/side_effect_trace_interface.js +1 -2
  89. package/dest/public/unique_class_ids.js +22 -27
  90. package/dest/public/utils.js +16 -11
  91. package/dest/server.js +0 -1
  92. package/dest/stats/index.js +0 -1
  93. package/dest/stats/stats.js +1 -2
  94. package/dest/test/utils.js +5 -4
  95. package/package.json +11 -11
  96. package/src/acvm/oracle/typed_oracle.ts +34 -34
  97. package/src/avm/avm_machine_state.ts +18 -14
  98. package/src/avm/avm_memory_types.ts +43 -183
  99. package/src/avm/avm_simulator.ts +37 -11
  100. package/src/avm/opcodes/accrued_substate.ts +7 -21
  101. package/src/avm/opcodes/addressing_mode.ts +9 -2
  102. package/src/avm/opcodes/arithmetic.ts +1 -3
  103. package/src/avm/opcodes/bitwise.ts +2 -6
  104. package/src/avm/opcodes/comparators.ts +1 -3
  105. package/src/avm/opcodes/contract.ts +1 -3
  106. package/src/avm/opcodes/control_flow.ts +1 -9
  107. package/src/avm/opcodes/conversion.ts +1 -3
  108. package/src/avm/opcodes/ec_add.ts +1 -3
  109. package/src/avm/opcodes/environment_getters.ts +1 -3
  110. package/src/avm/opcodes/external_calls.ts +3 -6
  111. package/src/avm/opcodes/hashing.ts +3 -9
  112. package/src/avm/opcodes/memory.ts +6 -20
  113. package/src/avm/opcodes/misc.ts +1 -3
  114. package/src/avm/opcodes/multi_scalar_mul.ts +1 -7
  115. package/src/avm/opcodes/storage.ts +2 -6
  116. package/src/client/index.ts +2 -2
  117. package/dest/acvm/acvm.d.ts +0 -35
  118. package/dest/acvm/acvm.d.ts.map +0 -1
  119. package/dest/acvm/acvm_types.d.ts +0 -10
  120. package/dest/acvm/acvm_types.d.ts.map +0 -1
  121. package/dest/acvm/deserialize.d.ts +0 -36
  122. package/dest/acvm/deserialize.d.ts.map +0 -1
  123. package/dest/acvm/index.d.ts +0 -6
  124. package/dest/acvm/index.d.ts.map +0 -1
  125. package/dest/acvm/oracle/index.d.ts +0 -14
  126. package/dest/acvm/oracle/index.d.ts.map +0 -1
  127. package/dest/acvm/oracle/oracle.d.ts +0 -49
  128. package/dest/acvm/oracle/oracle.d.ts.map +0 -1
  129. package/dest/acvm/oracle/typed_oracle.d.ts +0 -75
  130. package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
  131. package/dest/acvm/serialize.d.ts +0 -20
  132. package/dest/acvm/serialize.d.ts.map +0 -1
  133. package/dest/avm/avm_context.d.ts +0 -39
  134. package/dest/avm/avm_context.d.ts.map +0 -1
  135. package/dest/avm/avm_contract_call_result.d.ts +0 -30
  136. package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
  137. package/dest/avm/avm_execution_environment.d.ts +0 -21
  138. package/dest/avm/avm_execution_environment.d.ts.map +0 -1
  139. package/dest/avm/avm_gas.d.ts +0 -60
  140. package/dest/avm/avm_gas.d.ts.map +0 -1
  141. package/dest/avm/avm_machine_state.d.ts +0 -93
  142. package/dest/avm/avm_machine_state.d.ts.map +0 -1
  143. package/dest/avm/avm_memory_types.d.ts +0 -310
  144. package/dest/avm/avm_memory_types.d.ts.map +0 -1
  145. package/dest/avm/avm_simulator.d.ts +0 -37
  146. package/dest/avm/avm_simulator.d.ts.map +0 -1
  147. package/dest/avm/avm_tree.d.ts +0 -281
  148. package/dest/avm/avm_tree.d.ts.map +0 -1
  149. package/dest/avm/bytecode_utils.d.ts +0 -5
  150. package/dest/avm/bytecode_utils.d.ts.map +0 -1
  151. package/dest/avm/errors.d.ts +0 -121
  152. package/dest/avm/errors.d.ts.map +0 -1
  153. package/dest/avm/fixtures/avm_simulation_tester.d.ts +0 -21
  154. package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
  155. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +0 -35
  156. package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
  157. package/dest/avm/fixtures/index.d.ts +0 -67
  158. package/dest/avm/fixtures/index.d.ts.map +0 -1
  159. package/dest/avm/fixtures/simple_contract_data_source.d.ts +0 -31
  160. package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
  161. package/dest/avm/index.d.ts +0 -4
  162. package/dest/avm/index.d.ts.map +0 -1
  163. package/dest/avm/journal/index.d.ts +0 -2
  164. package/dest/avm/journal/index.d.ts.map +0 -1
  165. package/dest/avm/journal/journal.d.ts +0 -176
  166. package/dest/avm/journal/journal.d.ts.map +0 -1
  167. package/dest/avm/journal/nullifiers.d.ts +0 -62
  168. package/dest/avm/journal/nullifiers.d.ts.map +0 -1
  169. package/dest/avm/journal/public_storage.d.ts +0 -66
  170. package/dest/avm/journal/public_storage.d.ts.map +0 -1
  171. package/dest/avm/opcodes/accrued_substate.d.ts +0 -75
  172. package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
  173. package/dest/avm/opcodes/addressing_mode.d.ts +0 -27
  174. package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
  175. package/dest/avm/opcodes/arithmetic.d.ts +0 -37
  176. package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
  177. package/dest/avm/opcodes/bitwise.d.ts +0 -50
  178. package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
  179. package/dest/avm/opcodes/comparators.d.ts +0 -25
  180. package/dest/avm/opcodes/comparators.d.ts.map +0 -1
  181. package/dest/avm/opcodes/contract.d.ts +0 -21
  182. package/dest/avm/opcodes/contract.d.ts.map +0 -1
  183. package/dest/avm/opcodes/control_flow.d.ts +0 -41
  184. package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
  185. package/dest/avm/opcodes/conversion.d.ts +0 -17
  186. package/dest/avm/opcodes/conversion.d.ts.map +0 -1
  187. package/dest/avm/opcodes/ec_add.d.ts +0 -19
  188. package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
  189. package/dest/avm/opcodes/environment_getters.d.ts +0 -28
  190. package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
  191. package/dest/avm/opcodes/external_calls.d.ts +0 -50
  192. package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
  193. package/dest/avm/opcodes/hashing.d.ts +0 -36
  194. package/dest/avm/opcodes/hashing.d.ts.map +0 -1
  195. package/dest/avm/opcodes/index.d.ts +0 -16
  196. package/dest/avm/opcodes/index.d.ts.map +0 -1
  197. package/dest/avm/opcodes/instruction.d.ts +0 -70
  198. package/dest/avm/opcodes/instruction.d.ts.map +0 -1
  199. package/dest/avm/opcodes/instruction_impl.d.ts +0 -19
  200. package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
  201. package/dest/avm/opcodes/memory.d.ts +0 -74
  202. package/dest/avm/opcodes/memory.d.ts.map +0 -1
  203. package/dest/avm/opcodes/misc.d.ts +0 -17
  204. package/dest/avm/opcodes/misc.d.ts.map +0 -1
  205. package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
  206. package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
  207. package/dest/avm/opcodes/storage.d.ts +0 -24
  208. package/dest/avm/opcodes/storage.d.ts.map +0 -1
  209. package/dest/avm/serialization/buffer_cursor.d.ts +0 -28
  210. package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
  211. package/dest/avm/serialization/bytecode_serialization.d.ts +0 -21
  212. package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
  213. package/dest/avm/serialization/instruction_serialization.d.ts +0 -105
  214. package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
  215. package/dest/avm/test_utils.d.ts +0 -16
  216. package/dest/avm/test_utils.d.ts.map +0 -1
  217. package/dest/client/client_execution_context.d.ts +0 -214
  218. package/dest/client/client_execution_context.d.ts.map +0 -1
  219. package/dest/client/db_oracle.d.ts +0 -229
  220. package/dest/client/db_oracle.d.ts.map +0 -1
  221. package/dest/client/execution_note_cache.d.ts +0 -93
  222. package/dest/client/execution_note_cache.d.ts.map +0 -1
  223. package/dest/client/index.d.ts +0 -15
  224. package/dest/client/index.d.ts.map +0 -1
  225. package/dest/client/pick_notes.d.ts +0 -85
  226. package/dest/client/pick_notes.d.ts.map +0 -1
  227. package/dest/client/private_execution.d.ts +0 -19
  228. package/dest/client/private_execution.d.ts.map +0 -1
  229. package/dest/client/simulator.d.ts +0 -60
  230. package/dest/client/simulator.d.ts.map +0 -1
  231. package/dest/client/unconstrained_execution.d.ts +0 -10
  232. package/dest/client/unconstrained_execution.d.ts.map +0 -1
  233. package/dest/client/view_data_oracle.d.ts +0 -159
  234. package/dest/client/view_data_oracle.d.ts.map +0 -1
  235. package/dest/common/debug_fn_name.d.ts +0 -4
  236. package/dest/common/debug_fn_name.d.ts.map +0 -1
  237. package/dest/common/errors.d.ts +0 -54
  238. package/dest/common/errors.d.ts.map +0 -1
  239. package/dest/common/hashed_values_cache.d.ts +0 -28
  240. package/dest/common/hashed_values_cache.d.ts.map +0 -1
  241. package/dest/common/index.d.ts +0 -3
  242. package/dest/common/index.d.ts.map +0 -1
  243. package/dest/common/message_load_oracle_inputs.d.ts +0 -15
  244. package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
  245. package/dest/common/simulation_provider.d.ts +0 -19
  246. package/dest/common/simulation_provider.d.ts.map +0 -1
  247. package/dest/common.d.ts +0 -2
  248. package/dest/common.d.ts.map +0 -1
  249. package/dest/providers/acvm_native.d.ts +0 -40
  250. package/dest/providers/acvm_native.d.ts.map +0 -1
  251. package/dest/providers/acvm_wasm.d.ts +0 -15
  252. package/dest/providers/acvm_wasm.d.ts.map +0 -1
  253. package/dest/providers/acvm_wasm_with_blobs.d.ts +0 -19
  254. package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
  255. package/dest/providers/factory.d.ts +0 -12
  256. package/dest/providers/factory.d.ts.map +0 -1
  257. package/dest/providers/index.d.ts +0 -5
  258. package/dest/providers/index.d.ts.map +0 -1
  259. package/dest/public/bytecode_errors.d.ts +0 -4
  260. package/dest/public/bytecode_errors.d.ts.map +0 -1
  261. package/dest/public/db_interfaces.d.ts +0 -105
  262. package/dest/public/db_interfaces.d.ts.map +0 -1
  263. package/dest/public/execution.d.ts +0 -102
  264. package/dest/public/execution.d.ts.map +0 -1
  265. package/dest/public/executor_metrics.d.ts +0 -13
  266. package/dest/public/executor_metrics.d.ts.map +0 -1
  267. package/dest/public/fee_payment.d.ts +0 -11
  268. package/dest/public/fee_payment.d.ts.map +0 -1
  269. package/dest/public/fixtures/index.d.ts +0 -3
  270. package/dest/public/fixtures/index.d.ts.map +0 -1
  271. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +0 -21
  272. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +0 -1
  273. package/dest/public/fixtures/utils.d.ts +0 -17
  274. package/dest/public/fixtures/utils.d.ts.map +0 -1
  275. package/dest/public/index.d.ts +0 -9
  276. package/dest/public/index.d.ts.map +0 -1
  277. package/dest/public/public_db_sources.d.ts +0 -81
  278. package/dest/public/public_db_sources.d.ts.map +0 -1
  279. package/dest/public/public_processor.d.ts +0 -72
  280. package/dest/public/public_processor.d.ts.map +0 -1
  281. package/dest/public/public_processor_metrics.d.ts +0 -27
  282. package/dest/public/public_processor_metrics.d.ts.map +0 -1
  283. package/dest/public/public_tx_context.d.ts +0 -131
  284. package/dest/public/public_tx_context.d.ts.map +0 -1
  285. package/dest/public/public_tx_simulator.d.ts +0 -99
  286. package/dest/public/public_tx_simulator.d.ts.map +0 -1
  287. package/dest/public/side_effect_errors.d.ts +0 -4
  288. package/dest/public/side_effect_errors.d.ts.map +0 -1
  289. package/dest/public/side_effect_trace.d.ts +0 -126
  290. package/dest/public/side_effect_trace.d.ts.map +0 -1
  291. package/dest/public/side_effect_trace_interface.d.ts +0 -32
  292. package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
  293. package/dest/public/unique_class_ids.d.ts +0 -37
  294. package/dest/public/unique_class_ids.d.ts.map +0 -1
  295. package/dest/public/utils.d.ts +0 -5
  296. package/dest/public/utils.d.ts.map +0 -1
  297. package/dest/server.d.ts +0 -6
  298. package/dest/server.d.ts.map +0 -1
  299. package/dest/stats/index.d.ts +0 -2
  300. package/dest/stats/index.d.ts.map +0 -1
  301. package/dest/stats/stats.d.ts +0 -4
  302. package/dest/stats/stats.d.ts.map +0 -1
  303. package/dest/test/utils.d.ts +0 -12
  304. package/dest/test/utils.d.ts.map +0 -1
@@ -1,36 +1,41 @@
1
- import { __esDecorate, __runInitializers } from "tslib";
2
- import { MerkleTreeId, NestedProcessReturnValues, Tx, TxExecutionPhase, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls, } from '@aztec/circuit-types';
3
- import { Fr, Gas, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, PublicDataWrite, } from '@aztec/circuits.js';
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;
6
+ }
7
+ import { MerkleTreeId, NestedProcessReturnValues, Tx, TxExecutionPhase, makeProcessedTxFromPrivateOnlyTx, makeProcessedTxFromTxWithPublicCalls } from '@aztec/circuit-types';
8
+ import { Fr, Gas, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT, PublicDataWrite } from '@aztec/circuits.js';
4
9
  import { padArrayEnd } from '@aztec/foundation/collection';
5
10
  import { createLogger } from '@aztec/foundation/log';
6
11
  import { Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
7
12
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
8
13
  import { ContractClassRegisteredEvent } from '@aztec/protocol-contracts/class-registerer';
9
- import { Attributes, getTelemetryClient, trackSpan, } from '@aztec/telemetry-client';
14
+ import { Attributes, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
10
15
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from './fee_payment.js';
11
16
  import { WorldStateDB } from './public_db_sources.js';
12
17
  import { PublicProcessorMetrics } from './public_processor_metrics.js';
13
18
  import { PublicTxSimulator } from './public_tx_simulator.js';
14
19
  /**
15
20
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
16
- */
17
- export class PublicProcessorFactory {
18
- constructor(contractDataSource, dateProvider, telemetryClient = getTelemetryClient()) {
21
+ */ export class PublicProcessorFactory {
22
+ contractDataSource;
23
+ dateProvider;
24
+ telemetryClient;
25
+ constructor(contractDataSource, dateProvider, telemetryClient = getTelemetryClient()){
19
26
  this.contractDataSource = contractDataSource;
20
27
  this.dateProvider = dateProvider;
21
28
  this.telemetryClient = telemetryClient;
22
29
  }
23
30
  /**
24
- * Creates a new instance of a PublicProcessor.
25
- * @param historicalHeader - The header of a block previous to the one in which the tx is included.
26
- * @param globalVariables - The global variables for the block being processed.
27
- * @param enforceFeePayment - Allows disabling balance checks for fee estimations.
28
- * @returns A new instance of a PublicProcessor.
29
- */
30
- create(merkleTree, globalVariables, enforceFeePayment) {
31
+ * Creates a new instance of a PublicProcessor.
32
+ * @param historicalHeader - The header of a block previous to the one in which the tx is included.
33
+ * @param globalVariables - The global variables for the block being processed.
34
+ * @param enforceFeePayment - Allows disabling balance checks for fee estimations.
35
+ * @returns A new instance of a PublicProcessor.
36
+ */ create(merkleTree, globalVariables, enforceFeePayment) {
31
37
  const worldStateDB = new WorldStateDB(merkleTree, this.contractDataSource);
32
- const publicTxSimulator = this.createPublicTxSimulator(merkleTree, worldStateDB, globalVariables,
33
- /*doMerkleOperations=*/ true, enforceFeePayment, this.telemetryClient);
38
+ const publicTxSimulator = this.createPublicTxSimulator(merkleTree, worldStateDB, globalVariables, /*doMerkleOperations=*/ true, enforceFeePayment, this.telemetryClient);
34
39
  return new PublicProcessor(merkleTree, globalVariables, worldStateDB, publicTxSimulator, this.dateProvider, this.telemetryClient);
35
40
  }
36
41
  createPublicTxSimulator(db, worldStateDB, globalVariables, doMerkleOperations, enforceFeePayment, telemetryClient) {
@@ -38,7 +43,7 @@ export class PublicProcessorFactory {
38
43
  }
39
44
  }
40
45
  class PublicProcessorTimeoutError extends Error {
41
- constructor(message = 'Timed out while processing tx') {
46
+ constructor(message = 'Timed out while processing tx'){
42
47
  super(message);
43
48
  this.name = 'PublicProcessorTimeoutError';
44
49
  }
@@ -46,307 +51,306 @@ class PublicProcessorTimeoutError extends Error {
46
51
  /**
47
52
  * Converts Txs lifted from the P2P module into ProcessedTx objects by executing
48
53
  * any public function calls in them. Txs with private calls only are unaffected.
49
- */
50
- let PublicProcessor = (() => {
51
- var _a;
52
- let _instanceExtraInitializers = [];
53
- let _processTx_decorators;
54
- let _processPrivateOnlyTx_decorators;
55
- let _processTxWithPublicCalls_decorators;
56
- return _a = class PublicProcessor {
57
- constructor(db, globalVariables, worldStateDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor')) {
58
- this.db = (__runInitializers(this, _instanceExtraInitializers), db);
59
- this.globalVariables = globalVariables;
60
- this.worldStateDB = worldStateDB;
61
- this.publicTxSimulator = publicTxSimulator;
62
- this.dateProvider = dateProvider;
63
- this.log = log;
64
- this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
54
+ */ export class PublicProcessor {
55
+ db;
56
+ globalVariables;
57
+ worldStateDB;
58
+ publicTxSimulator;
59
+ dateProvider;
60
+ log;
61
+ metrics;
62
+ constructor(db, globalVariables, worldStateDB, publicTxSimulator, dateProvider, telemetryClient = getTelemetryClient(), log = createLogger('simulator:public-processor')){
63
+ this.db = db;
64
+ this.globalVariables = globalVariables;
65
+ this.worldStateDB = worldStateDB;
66
+ this.publicTxSimulator = publicTxSimulator;
67
+ this.dateProvider = dateProvider;
68
+ this.log = log;
69
+ this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
70
+ }
71
+ get tracer() {
72
+ return this.metrics.tracer;
73
+ }
74
+ /**
75
+ * Run each tx through the public circuit and the public kernel circuit if needed.
76
+ * @param txs - Txs to process.
77
+ * @param processedTxHandler - Handler for processed txs in the context of block building or proving.
78
+ * @returns The list of processed txs with their circuit simulation outputs.
79
+ */ async process(txs, limits = {}, validators = {}) {
80
+ const { maxTransactions, maxBlockSize, deadline, maxBlockGas } = limits;
81
+ const { preprocessValidator, postprocessValidator, nullifierCache } = validators;
82
+ const result = [];
83
+ const failed = [];
84
+ const timer = new Timer();
85
+ let totalSizeInBytes = 0;
86
+ let returns = [];
87
+ let totalPublicGas = new Gas(0, 0);
88
+ let totalBlockGas = new Gas(0, 0);
89
+ for await (const origTx of txs){
90
+ // Only process up to the max tx limit
91
+ if (maxTransactions !== undefined && result.length >= maxTransactions) {
92
+ this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
93
+ break;
65
94
  }
66
- get tracer() {
67
- return this.metrics.tracer;
95
+ // Bail if we've hit the deadline
96
+ if (deadline && this.dateProvider.now() > +deadline) {
97
+ this.log.warn(`Stopping tx processing due to timeout.`);
98
+ break;
68
99
  }
69
- /**
70
- * Run each tx through the public circuit and the public kernel circuit if needed.
71
- * @param txs - Txs to process.
72
- * @param processedTxHandler - Handler for processed txs in the context of block building or proving.
73
- * @returns The list of processed txs with their circuit simulation outputs.
74
- */
75
- async process(txs, limits = {}, validators = {}) {
76
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas } = limits;
77
- const { preprocessValidator, postprocessValidator, nullifierCache } = validators;
78
- const result = [];
79
- const failed = [];
80
- const timer = new Timer();
81
- let totalSizeInBytes = 0;
82
- let returns = [];
83
- let totalPublicGas = new Gas(0, 0);
84
- let totalBlockGas = new Gas(0, 0);
85
- for await (const origTx of txs) {
86
- // Only process up to the max tx limit
87
- if (maxTransactions !== undefined && result.length >= maxTransactions) {
88
- this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
89
- break;
90
- }
91
- // Bail if we've hit the deadline
92
- if (deadline && this.dateProvider.now() > +deadline) {
93
- this.log.warn(`Stopping tx processing due to timeout.`);
94
- break;
95
- }
96
- // Skip this tx if it'd exceed max block size
97
- const txHash = (await origTx.getTxHash()).toString();
98
- const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
99
- if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
100
- this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
101
- txHash,
102
- sizeInBytes: preTxSizeInBytes,
103
- totalSizeInBytes,
104
- maxBlockSize,
105
- });
106
- continue;
107
- }
108
- // Skip this tx if its gas limit would exceed the block gas limit
109
- const txGasLimit = origTx.data.constants.txContext.gasSettings.gasLimits;
110
- if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
111
- this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
112
- txHash,
113
- txGasLimit,
114
- totalBlockGas,
115
- maxBlockGas,
116
- });
117
- continue;
118
- }
119
- // The processor modifies the tx objects in place, so we need to clone them.
120
- const tx = Tx.clone(origTx);
121
- // We validate the tx before processing it, to avoid unnecessary work.
122
- if (preprocessValidator) {
123
- const result = await preprocessValidator.validateTx(tx);
124
- const txHash = await tx.getTxHash();
125
- if (result.result === 'invalid') {
126
- const reason = result.reason.join(', ');
127
- this.log.warn(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
128
- failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
129
- returns.push(new NestedProcessReturnValues([]));
130
- continue;
131
- }
132
- else if (result.result === 'skipped') {
133
- const reason = result.reason.join(', ');
134
- this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
135
- returns.push(new NestedProcessReturnValues([]));
136
- continue;
137
- }
138
- else {
139
- this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
140
- }
141
- }
142
- try {
143
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
144
- // If the actual size of this tx would exceed block size, skip it
145
- const txSize = processedTx.txEffect.getDASize();
146
- if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
147
- this.log.warn(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
148
- txHash,
149
- sizeInBytes: txSize,
150
- totalSizeInBytes,
151
- maxBlockSize,
152
- });
153
- continue;
154
- }
155
- // Re-validate the transaction
156
- if (postprocessValidator) {
157
- // Only accept processed transactions that are not double-spends,
158
- // public functions emitting nullifiers would pass earlier check but fail here.
159
- // Note that we're checking all nullifiers generated in the private execution twice,
160
- // we could store the ones already checked and skip them here as an optimization.
161
- // TODO(palla/txs): Can we get into this case? AVM validates this. We should be able to remove it.
162
- const result = await postprocessValidator.validateTx(processedTx);
163
- if (result.result !== 'valid') {
164
- const reason = result.reason.join(', ');
165
- this.log.error(`Rejecting tx ${processedTx.hash} after processing: ${reason}.`);
166
- failed.push({ tx, error: new Error(`Tx failed post-process validation: ${reason}`) });
167
- continue;
168
- }
169
- else {
170
- this.log.trace(`Tx ${(await tx.getTxHash()).toString()} is valid post processing.`);
171
- }
172
- }
173
- // Otherwise, commit tx state for the next tx to be processed
174
- await this.commitTxState(processedTx);
175
- nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
176
- result.push(processedTx);
177
- returns = returns.concat(returnValues);
178
- totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
179
- totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
180
- totalSizeInBytes += txSize;
181
- }
182
- catch (err) {
183
- if (err?.name === 'PublicProcessorTimeoutError') {
184
- this.log.warn(`Stopping tx processing due to timeout.`);
185
- break;
186
- }
187
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
188
- this.log.warn(`Failed to process tx ${tx.getTxHash()}: ${errorMessage} ${err?.stack}`);
189
- failed.push({ tx, error: err instanceof Error ? err : new Error(errorMessage) });
190
- returns.push(new NestedProcessReturnValues([]));
191
- }
192
- }
193
- const duration = timer.s();
194
- const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
195
- this.metrics.recordAllTxs(totalPublicGas, rate);
196
- this.log.info(`Processed ${result.length} successful txs and ${failed.length} txs in ${duration}s`, {
197
- duration,
198
- rate,
199
- totalPublicGas,
200
- totalBlockGas,
100
+ // Skip this tx if it'd exceed max block size
101
+ const txHash = (await origTx.getTxHash()).toString();
102
+ const preTxSizeInBytes = origTx.getEstimatedPrivateTxEffectsSize();
103
+ if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
104
+ this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
105
+ txHash,
106
+ sizeInBytes: preTxSizeInBytes,
201
107
  totalSizeInBytes,
108
+ maxBlockSize
202
109
  });
203
- return [result, failed, returns];
110
+ continue;
204
111
  }
205
- async processTx(tx, deadline) {
206
- const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline));
207
- this.log.verbose(!tx.hasPublicCalls()
208
- ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms`
209
- : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls in ${time}ms`, {
210
- txHash: processedTx.hash,
211
- txFee: processedTx.txEffect.transactionFee.toBigInt(),
212
- revertCode: processedTx.txEffect.revertCode.getCode(),
213
- revertReason: processedTx.revertReason,
214
- gasUsed: processedTx.gasUsed,
215
- publicDataWriteCount: processedTx.txEffect.publicDataWrites.length,
216
- nullifierCount: processedTx.txEffect.nullifiers.length,
217
- noteHashCount: processedTx.txEffect.noteHashes.length,
218
- contractClassLogCount: processedTx.txEffect.contractClassLogs.getTotalLogCount(),
219
- publicLogCount: processedTx.txEffect.publicLogs.length,
220
- privateLogCount: processedTx.txEffect.privateLogs.length,
221
- l2ToL1MessageCount: processedTx.txEffect.l2ToL1Msgs.length,
222
- durationMs: time,
112
+ // Skip this tx if its gas limit would exceed the block gas limit
113
+ const txGasLimit = origTx.data.constants.txContext.gasSettings.gasLimits;
114
+ if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
115
+ this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
116
+ txHash,
117
+ txGasLimit,
118
+ totalBlockGas,
119
+ maxBlockGas
223
120
  });
224
- return [processedTx, returnValues ?? []];
121
+ continue;
225
122
  }
226
- async commitTxState(processedTx, txValidator) {
227
- // Commit the state updates from this transaction
228
- // TODO(palla/txs): It seems like this doesn't do anything...?
229
- await this.worldStateDB.commit();
230
- // Update the state so that the next tx in the loop has the correct .startState
231
- // NB: before this change, all .startStates were actually incorrect, but the issue was never caught because we either:
232
- // a) had only 1 tx with public calls per block, so this loop had len 1
233
- // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop
234
- // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
235
- // The below is taken from buildBaseRollupHints:
236
- const treeInsertionStart = process.hrtime.bigint();
237
- await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
238
- try {
239
- await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
240
- }
241
- catch (error) {
242
- if (txValidator) {
243
- // Ideally the validator has already caught this above, but just in case:
244
- throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`);
245
- }
246
- else {
247
- // We have no validator and assume this call should blindly process txs with duplicates being caught later
248
- this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`);
249
- }
250
- }
251
- await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, processedTx.txEffect.publicDataWrites.map(x => x.toBuffer()));
252
- const treeInsertionEnd = process.hrtime.bigint();
253
- this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1000);
254
- }
255
- /** Processes the given tx within deadline. Returns timeout if deadline is hit. */
256
- async processTxWithinDeadline(tx, deadline) {
257
- const processFn = tx.hasPublicCalls()
258
- ? () => this.processTxWithPublicCalls(tx)
259
- : () => this.processPrivateOnlyTx(tx);
260
- if (!deadline) {
261
- return await processFn();
262
- }
123
+ // The processor modifies the tx objects in place, so we need to clone them.
124
+ const tx = Tx.clone(origTx);
125
+ // We validate the tx before processing it, to avoid unnecessary work.
126
+ if (preprocessValidator) {
127
+ const result = await preprocessValidator.validateTx(tx);
263
128
  const txHash = await tx.getTxHash();
264
- const timeout = +deadline - this.dateProvider.now();
265
- if (timeout <= 0) {
266
- throw new PublicProcessorTimeoutError();
129
+ if (result.result === 'invalid') {
130
+ const reason = result.reason.join(', ');
131
+ this.log.warn(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
132
+ failed.push({
133
+ tx,
134
+ error: new Error(`Tx failed preprocess validation: ${reason}`)
135
+ });
136
+ returns.push(new NestedProcessReturnValues([]));
137
+ continue;
138
+ } else if (result.result === 'skipped') {
139
+ const reason = result.reason.join(', ');
140
+ this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
141
+ returns.push(new NestedProcessReturnValues([]));
142
+ continue;
143
+ } else {
144
+ this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
267
145
  }
268
- this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
269
- deadline: deadline.toISOString(),
270
- now: new Date(this.dateProvider.now()).toISOString(),
271
- txHash,
272
- });
273
- return await executeTimeout(() => processFn(), timeout, () => new PublicProcessorTimeoutError());
274
146
  }
275
- /**
276
- * Creates the public data write for paying the tx fee.
277
- * This is used in private only txs, since for txs with public calls
278
- * the avm handles the fee payment itself.
279
- */
280
- async getFeePaymentPublicDataWrite(txFee, feePayer) {
281
- if (feePayer.isZero()) {
282
- this.log.debug(`No one is paying the fee of ${txFee.toBigInt()}`);
283
- return;
147
+ try {
148
+ const [processedTx, returnValues] = await this.processTx(tx, deadline);
149
+ // If the actual size of this tx would exceed block size, skip it
150
+ const txSize = processedTx.txEffect.getDASize();
151
+ if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
152
+ this.log.warn(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
153
+ txHash,
154
+ sizeInBytes: txSize,
155
+ totalSizeInBytes,
156
+ maxBlockSize
157
+ });
158
+ continue;
284
159
  }
285
- const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
286
- const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
287
- const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
288
- this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
289
- const balance = await this.worldStateDB.storageRead(feeJuiceAddress, balanceSlot);
290
- if (balance.lt(txFee)) {
291
- throw new Error(`Not enough balance for fee payer to pay for transaction (got ${balance.toBigInt()} needs ${txFee.toBigInt()})`);
160
+ // Re-validate the transaction
161
+ if (postprocessValidator) {
162
+ // Only accept processed transactions that are not double-spends,
163
+ // public functions emitting nullifiers would pass earlier check but fail here.
164
+ // Note that we're checking all nullifiers generated in the private execution twice,
165
+ // we could store the ones already checked and skip them here as an optimization.
166
+ // TODO(palla/txs): Can we get into this case? AVM validates this. We should be able to remove it.
167
+ const result = await postprocessValidator.validateTx(processedTx);
168
+ if (result.result !== 'valid') {
169
+ const reason = result.reason.join(', ');
170
+ this.log.error(`Rejecting tx ${processedTx.hash} after processing: ${reason}.`);
171
+ failed.push({
172
+ tx,
173
+ error: new Error(`Tx failed post-process validation: ${reason}`)
174
+ });
175
+ continue;
176
+ } else {
177
+ this.log.trace(`Tx ${(await tx.getTxHash()).toString()} is valid post processing.`);
178
+ }
292
179
  }
293
- const updatedBalance = balance.sub(txFee);
294
- await this.worldStateDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
295
- return new PublicDataWrite(leafSlot, updatedBalance);
296
- }
297
- async processPrivateOnlyTx(tx) {
298
- const gasFees = this.globalVariables.gasFees;
299
- const transactionFee = tx.data.gasUsed.computeFee(gasFees);
300
- const feePaymentPublicDataWrite = await this.getFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
301
- const processedTx = await makeProcessedTxFromPrivateOnlyTx(tx, transactionFee, feePaymentPublicDataWrite, this.globalVariables);
302
- this.metrics.recordClassRegistration(...tx.contractClassLogs
303
- .unrollLogs()
304
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data))
305
- .map(log => ContractClassRegisteredEvent.fromLog(log.data)));
306
- return [processedTx, undefined];
307
- }
308
- async processTxWithPublicCalls(tx) {
309
- const timer = new Timer();
310
- const { avmProvingRequest, gasUsed, revertCode, revertReason, processedPhases } = await this.publicTxSimulator.simulate(tx);
311
- if (!avmProvingRequest) {
312
- this.metrics.recordFailedTx();
313
- throw new Error('Avm proving result was not generated.');
180
+ // Otherwise, commit tx state for the next tx to be processed
181
+ await this.commitTxState(processedTx);
182
+ nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map((n)=>n.toBuffer()));
183
+ result.push(processedTx);
184
+ returns = returns.concat(returnValues);
185
+ totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
186
+ totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
187
+ totalSizeInBytes += txSize;
188
+ } catch (err) {
189
+ if (err?.name === 'PublicProcessorTimeoutError') {
190
+ this.log.warn(`Stopping tx processing due to timeout.`);
191
+ break;
314
192
  }
315
- processedPhases.forEach(phase => {
316
- if (phase.revertReason) {
317
- this.metrics.recordRevertedPhase(phase.phase);
318
- }
319
- else {
320
- this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
321
- }
193
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
194
+ this.log.warn(`Failed to process tx ${tx.getTxHash()}: ${errorMessage} ${err?.stack}`);
195
+ failed.push({
196
+ tx,
197
+ error: err instanceof Error ? err : new Error(errorMessage)
322
198
  });
323
- this.metrics.recordClassRegistration(...tx.contractClassLogs
324
- .unrollLogs()
325
- .filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data))
326
- .map(log => ContractClassRegisteredEvent.fromLog(log.data)));
327
- const phaseCount = processedPhases.length;
328
- const durationMs = timer.ms();
329
- this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
330
- const processedTx = await makeProcessedTxFromTxWithPublicCalls(tx, avmProvingRequest, gasUsed, revertCode, revertReason);
331
- const returnValues = processedPhases.find(({ phase }) => phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
332
- return [processedTx, returnValues];
199
+ returns.push(new NestedProcessReturnValues([]));
333
200
  }
334
- },
335
- (() => {
336
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(null) : void 0;
337
- _processTx_decorators = [trackSpan('PublicProcessor.processTx', async (tx) => ({ [Attributes.TX_HASH]: (await tx.getTxHash()).toString() }))];
338
- _processPrivateOnlyTx_decorators = [trackSpan('PublicProcessor.processPrivateOnlyTx', async (tx) => ({
339
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
340
- }))];
341
- _processTxWithPublicCalls_decorators = [trackSpan('PublicProcessor.processTxWithPublicCalls', async (tx) => ({
342
- [Attributes.TX_HASH]: (await tx.getTxHash()).toString(),
343
- }))];
344
- __esDecorate(_a, null, _processTx_decorators, { kind: "method", name: "processTx", static: false, private: false, access: { has: obj => "processTx" in obj, get: obj => obj.processTx }, metadata: _metadata }, null, _instanceExtraInitializers);
345
- __esDecorate(_a, null, _processPrivateOnlyTx_decorators, { kind: "method", name: "processPrivateOnlyTx", static: false, private: false, access: { has: obj => "processPrivateOnlyTx" in obj, get: obj => obj.processPrivateOnlyTx }, metadata: _metadata }, null, _instanceExtraInitializers);
346
- __esDecorate(_a, null, _processTxWithPublicCalls_decorators, { kind: "method", name: "processTxWithPublicCalls", static: false, private: false, access: { has: obj => "processTxWithPublicCalls" in obj, get: obj => obj.processTxWithPublicCalls }, metadata: _metadata }, null, _instanceExtraInitializers);
347
- if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
348
- })(),
349
- _a;
350
- })();
351
- export { PublicProcessor };
352
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX3Byb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvcHVibGljX3Byb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFlBQVksRUFFWix5QkFBeUIsRUFFekIsRUFBRSxFQUNGLGdCQUFnQixFQUVoQixnQ0FBZ0MsRUFDaEMsb0NBQW9DLEdBQ3JDLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUdMLEVBQUUsRUFDRixHQUFHLEVBRUgsc0JBQXNCLEVBQ3RCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFxQixLQUFLLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzVGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzFGLE9BQU8sRUFDTCxVQUFVLEVBSVYsa0JBQWtCLEVBQ2xCLFNBQVMsR0FDVixNQUFNLHlCQUF5QixDQUFDO0FBRWpDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUU3RDs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxrQkFBc0MsRUFDdEMsWUFBMEIsRUFDMUIsa0JBQW1DLGtCQUFrQixFQUFFO1FBRnZELHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsb0JBQWUsR0FBZixlQUFlLENBQXdDO0lBQzlELENBQUM7SUFFSjs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQ1gsVUFBcUMsRUFDckMsZUFBZ0MsRUFDaEMsaUJBQTBCO1FBRTFCLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FDcEQsVUFBVSxFQUNWLFlBQVksRUFDWixlQUFlO1FBQ2YsdUJBQXVCLENBQUMsSUFBSSxFQUM1QixpQkFBaUIsRUFDakIsSUFBSSxDQUFDLGVBQWUsQ0FDckIsQ0FBQztRQUVGLE9BQU8sSUFBSSxlQUFlLENBQ3hCLFVBQVUsRUFDVixlQUFlLEVBQ2YsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixJQUFJLENBQUMsWUFBWSxFQUNqQixJQUFJLENBQUMsZUFBZSxDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVTLHVCQUF1QixDQUMvQixFQUE2QixFQUM3QixZQUEwQixFQUMxQixlQUFnQyxFQUNoQyxrQkFBMkIsRUFDM0IsaUJBQTBCLEVBQzFCLGVBQWdDO1FBRWhDLE9BQU8sSUFBSSxpQkFBaUIsQ0FDMUIsRUFBRSxFQUNGLFlBQVksRUFDWixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixlQUFlLENBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLDJCQUE0QixTQUFRLEtBQUs7SUFDN0MsWUFBWSxVQUFrQiwrQkFBK0I7UUFDM0QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyw2QkFBNkIsQ0FBQztJQUM1QyxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7SUFDVSxlQUFlOzs7Ozs7c0JBQWYsZUFBZTtZQUUxQixZQUNZLEVBQTZCLEVBQzdCLGVBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLGlCQUFvQyxFQUN0QyxZQUEwQixFQUNsQyxrQkFBbUMsa0JBQWtCLEVBQUUsRUFDL0MsTUFBTSxZQUFZLENBQUMsNEJBQTRCLENBQUM7Z0JBTjlDLE9BQUUsSUFISCxtREFBZSxFQUdkLEVBQUUsRUFBMkI7Z0JBQzdCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtnQkFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7Z0JBQzFCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7Z0JBQ3RDLGlCQUFZLEdBQVosWUFBWSxDQUFjO2dCQUUxQixRQUFHLEdBQUgsR0FBRyxDQUE2QztnQkFFeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7WUFFRCxJQUFJLE1BQU07Z0JBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM3QixDQUFDO1lBRUQ7Ozs7O2VBS0c7WUFDSSxLQUFLLENBQUMsT0FBTyxDQUNsQixHQUFxQyxFQUNyQyxTQUtJLEVBQUUsRUFDTixhQUlJLEVBQUU7Z0JBRU4sTUFBTSxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQztnQkFDeEUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQztnQkFDakYsTUFBTSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxNQUFNLEdBQWUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUUxQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztnQkFDekIsSUFBSSxPQUFPLEdBQWdDLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRWxDLElBQUksS0FBSyxFQUFFLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUMvQixzQ0FBc0M7b0JBQ3RDLElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO3dCQUN0RSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO3dCQUMzRSxNQUFNO29CQUNSLENBQUM7b0JBRUQsaUNBQWlDO29CQUNqQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3BELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7d0JBQ3hELE1BQU07b0JBQ1IsQ0FBQztvQkFFRCw2Q0FBNkM7b0JBQzdDLE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztvQkFDbkUsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLGdCQUFnQixHQUFHLGdCQUFnQixHQUFHLFlBQVksRUFBRSxDQUFDO3dCQUNyRixJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsTUFBTSxVQUFVLGdCQUFnQixnQ0FBZ0MsRUFBRTs0QkFDM0csTUFBTTs0QkFDTixXQUFXLEVBQUUsZ0JBQWdCOzRCQUM3QixnQkFBZ0I7NEJBQ2hCLFlBQVk7eUJBQ2IsQ0FBQyxDQUFDO3dCQUNILFNBQVM7b0JBQ1gsQ0FBQztvQkFFRCxpRUFBaUU7b0JBQ2pFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO29CQUN6RSxJQUFJLFdBQVcsS0FBSyxTQUFTLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLE1BQU0seUJBQXlCLEVBQUU7NEJBQzFFLE1BQU07NEJBQ04sVUFBVTs0QkFDVixhQUFhOzRCQUNiLFdBQVc7eUJBQ1osQ0FBQyxDQUFDO3dCQUNILFNBQVM7b0JBQ1gsQ0FBQztvQkFFRCw0RUFBNEU7b0JBQzVFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBRTVCLHNFQUFzRTtvQkFDdEUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO3dCQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDeEQsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ3BDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDaEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixNQUFNLENBQUMsUUFBUSxFQUFFLHdDQUF3QyxNQUFNLEVBQUUsQ0FBQyxDQUFDOzRCQUNqRyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7NEJBQ3BGLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNoRCxTQUFTO3dCQUNYLENBQUM7NkJBQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDOzRCQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs0QkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxNQUFNLENBQUMsUUFBUSxFQUFFLG1DQUFtQyxNQUFNLEVBQUUsQ0FBQyxDQUFDOzRCQUMzRixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDaEQsU0FBUzt3QkFDWCxDQUFDOzZCQUFNLENBQUM7NEJBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLDhCQUE4QixDQUFDLENBQUM7d0JBQ3hFLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxJQUFJLENBQUM7d0JBQ0gsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dCQUV2RSxpRUFBaUU7d0JBQ2pFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2hELElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLEdBQUcsWUFBWSxFQUFFLENBQUM7NEJBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixNQUFNLFVBQVUsTUFBTSx5QkFBeUIsRUFBRTtnQ0FDdEYsTUFBTTtnQ0FDTixXQUFXLEVBQUUsTUFBTTtnQ0FDbkIsZ0JBQWdCO2dDQUNoQixZQUFZOzZCQUNiLENBQUMsQ0FBQzs0QkFDSCxTQUFTO3dCQUNYLENBQUM7d0JBRUQsOEJBQThCO3dCQUM5QixJQUFJLG9CQUFvQixFQUFFLENBQUM7NEJBQ3pCLGlFQUFpRTs0QkFDakUsK0VBQStFOzRCQUMvRSxvRkFBb0Y7NEJBQ3BGLGlGQUFpRjs0QkFDakYsa0dBQWtHOzRCQUNsRyxNQUFNLE1BQU0sR0FBRyxNQUFNLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDbEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dDQUM5QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLFdBQVcsQ0FBQyxJQUFJLHNCQUFzQixNQUFNLEdBQUcsQ0FBQyxDQUFDO2dDQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ3RGLFNBQVM7NEJBQ1gsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDOzRCQUN0RixDQUFDO3dCQUNILENBQUM7d0JBRUQsNkRBQTZEO3dCQUM3RCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQ3RDLGNBQWMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdEYsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDekIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBRXZDLGNBQWMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7d0JBQ25FLGFBQWEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ2hFLGdCQUFnQixJQUFJLE1BQU0sQ0FBQztvQkFDN0IsQ0FBQztvQkFBQyxPQUFPLEdBQVEsRUFBRSxDQUFDO3dCQUNsQixJQUFJLEdBQUcsRUFBRSxJQUFJLEtBQUssNkJBQTZCLEVBQUUsQ0FBQzs0QkFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQzs0QkFDeEQsTUFBTTt3QkFDUixDQUFDO3dCQUNELE1BQU0sWUFBWSxHQUFHLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQzt3QkFDMUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7d0JBRXZGLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNqRixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUkseUJBQXlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbEQsQ0FBQztnQkFDSCxDQUFDO2dCQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixNQUFNLENBQUMsTUFBTSxXQUFXLFFBQVEsR0FBRyxFQUFFO29CQUNsRyxRQUFRO29CQUNSLElBQUk7b0JBQ0osY0FBYztvQkFDZCxhQUFhO29CQUNiLGdCQUFnQjtpQkFDakIsQ0FBQyxDQUFDO2dCQUVILE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFHTyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQU0sRUFBRSxRQUFlO2dCQUM3QyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2dCQUU1RyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FDZCxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUU7b0JBQ2xCLENBQUMsQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDLElBQUksNEJBQTRCLElBQUksSUFBSTtvQkFDdEUsQ0FBQyxDQUFDLGdCQUFnQixXQUFXLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLG9CQUFvQixJQUFJLElBQUksRUFDOUc7b0JBQ0UsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJO29CQUN4QixLQUFLLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO29CQUNyRCxVQUFVLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFO29CQUNyRCxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7b0JBQ3RDLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztvQkFDNUIsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO29CQUNsRSxjQUFjLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtvQkFDdEQsYUFBYSxFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU07b0JBQ3JELHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ2hGLGNBQWMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNO29CQUN0RCxlQUFlLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsTUFBTTtvQkFDeEQsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTTtvQkFDMUQsVUFBVSxFQUFFLElBQUk7aUJBQ2pCLENBQ0YsQ0FBQztnQkFFRixPQUFPLENBQUMsV0FBVyxFQUFFLFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxXQUF3QixFQUFFLFdBQXNDO2dCQUMxRixpREFBaUQ7Z0JBQ2pELDhEQUE4RDtnQkFDOUQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUVqQywrRUFBK0U7Z0JBQy9FLHNIQUFzSDtnQkFDdEgsdUVBQXVFO2dCQUN2RSxnSUFBZ0k7Z0JBQ2hJLDRIQUE0SDtnQkFDNUgsZ0RBQWdEO2dCQUNoRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQ3hCLFlBQVksQ0FBQyxjQUFjLEVBQzNCLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLHNCQUFzQixDQUFDLENBQzlFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQ3ZCLFlBQVksQ0FBQyxjQUFjLEVBQzNCLFdBQVcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQ25HLHdCQUF3QixDQUN6QixDQUFDO2dCQUNKLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNoQix5RUFBeUU7d0JBQ3pFLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxXQUFXLENBQUMsSUFBSSw0Q0FBNEMsQ0FBQyxDQUFDO29CQUMvRixDQUFDO3lCQUFNLENBQUM7d0JBQ04sMEdBQTBHO3dCQUMxRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyw2REFBNkQsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ2xHLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQzVCLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FDN0QsQ0FBQztnQkFDRixNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsSUFBSyxDQUFDLENBQUM7WUFDM0YsQ0FBQztZQUVELGtGQUFrRjtZQUMxRSxLQUFLLENBQUMsdUJBQXVCLENBQ25DLEVBQU0sRUFDTixRQUFlO2dCQUVmLE1BQU0sU0FBUyxHQUEwRSxFQUFFLENBQUMsY0FBYyxFQUFFO29CQUMxRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNkLE9BQU8sTUFBTSxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQztnQkFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDcEQsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sSUFBSSwyQkFBMkIsRUFBRSxDQUFDO2dCQUMxQyxDQUFDO2dCQUVELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGlCQUFpQixNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsT0FBTyxJQUFJLEVBQUU7b0JBQ3ZFLFFBQVEsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFO29CQUNoQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRTtvQkFDcEQsTUFBTTtpQkFDUCxDQUFDLENBQUM7Z0JBRUgsT0FBTyxNQUFNLGNBQWMsQ0FDekIsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQ2pCLE9BQU8sRUFDUCxHQUFHLEVBQUUsQ0FBQyxJQUFJLDJCQUEyQixFQUFFLENBQ3hDLENBQUM7WUFDSixDQUFDO1lBRUQ7Ozs7ZUFJRztZQUNLLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxLQUFTLEVBQUUsUUFBc0I7Z0JBQzFFLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUNsRSxPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxlQUFlLEdBQUcsdUJBQXVCLENBQUMsUUFBUSxDQUFDO2dCQUN6RCxNQUFNLFdBQVcsR0FBRyxNQUFNLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN0RSxNQUFNLFFBQVEsR0FBRyxNQUFNLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVoRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLEtBQUssQ0FBQyxRQUFRLEVBQUUsNkJBQTZCLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBRXJGLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUVsRixJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FDYixnRUFBZ0UsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUNoSCxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUVuRixPQUFPLElBQUksZUFBZSxDQUFDLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBS08sS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQU07Z0JBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDO2dCQUM3QyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTNELE1BQU0seUJBQXlCLEdBQUcsTUFBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTVHLE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0NBQWdDLENBQ3hELEVBQUUsRUFDRixjQUFjLEVBQ2QseUJBQXlCLEVBQ3pCLElBQUksQ0FBQyxlQUFlLENBQ3JCLENBQUM7Z0JBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FDbEMsR0FBRyxFQUFFLENBQUMsaUJBQWlCO3FCQUNwQixVQUFVLEVBQUU7cUJBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNwRixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzlELENBQUM7Z0JBQ0YsT0FBTyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBS08sS0FBSyxDQUFDLHdCQUF3QixDQUFDLEVBQU07Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBRTFCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsR0FDN0UsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUU1QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO2dCQUVELGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzlCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQ2xFLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FDbEMsR0FBRyxFQUFFLENBQUMsaUJBQWlCO3FCQUNwQixVQUFVLEVBQUU7cUJBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNwRixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQzlELENBQUM7Z0JBRUYsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFakUsTUFBTSxXQUFXLEdBQUcsTUFBTSxvQ0FBb0MsQ0FDNUQsRUFBRSxFQUNGLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsVUFBVSxFQUNWLFlBQVksQ0FDYixDQUFDO2dCQUVGLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQztnQkFFbkgsT0FBTyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNyQyxDQUFDOzs7O3FDQXhNQSxTQUFTLENBQUMsMkJBQTJCLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0RBbUlqSCxTQUFTLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxFQUFFLEVBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDcEUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtpQkFDeEQsQ0FBQyxDQUFDO29EQXVCRixTQUFTLENBQUMsMENBQTBDLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBQyxFQUFFLENBQUMsQ0FBQztvQkFDbEUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtpQkFDeEQsQ0FBQyxDQUFDO1lBN0pILDRLQUFjLFNBQVMsNkRBeUJ0QjtZQTRHRCw2TUFBYyxvQkFBb0IsNkRBb0JqQztZQUtELHlOQUFjLHdCQUF3Qiw2REF5Q3JDOzs7OztTQTVYVSxlQUFlIn0=
201
+ }
202
+ const duration = timer.s();
203
+ const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
204
+ this.metrics.recordAllTxs(totalPublicGas, rate);
205
+ this.log.info(`Processed ${result.length} successful txs and ${failed.length} txs in ${duration}s`, {
206
+ duration,
207
+ rate,
208
+ totalPublicGas,
209
+ totalBlockGas,
210
+ totalSizeInBytes
211
+ });
212
+ return [
213
+ result,
214
+ failed,
215
+ returns
216
+ ];
217
+ }
218
+ async processTx(tx, deadline) {
219
+ const [time, [processedTx, returnValues]] = await elapsed(()=>this.processTxWithinDeadline(tx, deadline));
220
+ this.log.verbose(!tx.hasPublicCalls() ? `Processed tx ${processedTx.hash} with no public calls in ${time}ms` : `Processed tx ${processedTx.hash} with ${tx.enqueuedPublicFunctionCalls.length} public calls in ${time}ms`, {
221
+ txHash: processedTx.hash,
222
+ txFee: processedTx.txEffect.transactionFee.toBigInt(),
223
+ revertCode: processedTx.txEffect.revertCode.getCode(),
224
+ revertReason: processedTx.revertReason,
225
+ gasUsed: processedTx.gasUsed,
226
+ publicDataWriteCount: processedTx.txEffect.publicDataWrites.length,
227
+ nullifierCount: processedTx.txEffect.nullifiers.length,
228
+ noteHashCount: processedTx.txEffect.noteHashes.length,
229
+ contractClassLogCount: processedTx.txEffect.contractClassLogs.getTotalLogCount(),
230
+ publicLogCount: processedTx.txEffect.publicLogs.length,
231
+ privateLogCount: processedTx.txEffect.privateLogs.length,
232
+ l2ToL1MessageCount: processedTx.txEffect.l2ToL1Msgs.length,
233
+ durationMs: time
234
+ });
235
+ return [
236
+ processedTx,
237
+ returnValues ?? []
238
+ ];
239
+ }
240
+ async commitTxState(processedTx, txValidator) {
241
+ // Commit the state updates from this transaction
242
+ // TODO(palla/txs): It seems like this doesn't do anything...?
243
+ await this.worldStateDB.commit();
244
+ // Update the state so that the next tx in the loop has the correct .startState
245
+ // NB: before this change, all .startStates were actually incorrect, but the issue was never caught because we either:
246
+ // a) had only 1 tx with public calls per block, so this loop had len 1
247
+ // b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop
248
+ // To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
249
+ // The below is taken from buildBaseRollupHints:
250
+ const treeInsertionStart = process.hrtime.bigint();
251
+ await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX));
252
+ try {
253
+ await this.db.batchInsert(MerkleTreeId.NULLIFIER_TREE, padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map((n)=>n.toBuffer()), NULLIFIER_SUBTREE_HEIGHT);
254
+ } catch (error) {
255
+ if (txValidator) {
256
+ // Ideally the validator has already caught this above, but just in case:
257
+ throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`);
258
+ } else {
259
+ // We have no validator and assume this call should blindly process txs with duplicates being caught later
260
+ this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`);
261
+ }
262
+ }
263
+ await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, processedTx.txEffect.publicDataWrites.map((x)=>x.toBuffer()));
264
+ const treeInsertionEnd = process.hrtime.bigint();
265
+ this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
266
+ }
267
+ /** Processes the given tx within deadline. Returns timeout if deadline is hit. */ async processTxWithinDeadline(tx, deadline) {
268
+ const processFn = tx.hasPublicCalls() ? ()=>this.processTxWithPublicCalls(tx) : ()=>this.processPrivateOnlyTx(tx);
269
+ if (!deadline) {
270
+ return await processFn();
271
+ }
272
+ const txHash = await tx.getTxHash();
273
+ const timeout = +deadline - this.dateProvider.now();
274
+ if (timeout <= 0) {
275
+ throw new PublicProcessorTimeoutError();
276
+ }
277
+ this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
278
+ deadline: deadline.toISOString(),
279
+ now: new Date(this.dateProvider.now()).toISOString(),
280
+ txHash
281
+ });
282
+ return await executeTimeout(()=>processFn(), timeout, ()=>new PublicProcessorTimeoutError());
283
+ }
284
+ /**
285
+ * Creates the public data write for paying the tx fee.
286
+ * This is used in private only txs, since for txs with public calls
287
+ * the avm handles the fee payment itself.
288
+ */ async getFeePaymentPublicDataWrite(txFee, feePayer) {
289
+ if (feePayer.isZero()) {
290
+ this.log.debug(`No one is paying the fee of ${txFee.toBigInt()}`);
291
+ return;
292
+ }
293
+ const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
294
+ const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
295
+ const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
296
+ this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
297
+ const balance = await this.worldStateDB.storageRead(feeJuiceAddress, balanceSlot);
298
+ if (balance.lt(txFee)) {
299
+ throw new Error(`Not enough balance for fee payer to pay for transaction (got ${balance.toBigInt()} needs ${txFee.toBigInt()})`);
300
+ }
301
+ const updatedBalance = balance.sub(txFee);
302
+ await this.worldStateDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
303
+ return new PublicDataWrite(leafSlot, updatedBalance);
304
+ }
305
+ async processPrivateOnlyTx(tx) {
306
+ const gasFees = this.globalVariables.gasFees;
307
+ const transactionFee = tx.data.gasUsed.computeFee(gasFees);
308
+ const feePaymentPublicDataWrite = await this.getFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
309
+ const processedTx = await makeProcessedTxFromPrivateOnlyTx(tx, transactionFee, feePaymentPublicDataWrite, this.globalVariables);
310
+ this.metrics.recordClassRegistration(...tx.contractClassLogs.unrollLogs().filter((log)=>ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)).map((log)=>ContractClassRegisteredEvent.fromLog(log.data)));
311
+ return [
312
+ processedTx,
313
+ undefined
314
+ ];
315
+ }
316
+ async processTxWithPublicCalls(tx) {
317
+ const timer = new Timer();
318
+ const { avmProvingRequest, gasUsed, revertCode, revertReason, processedPhases } = await this.publicTxSimulator.simulate(tx);
319
+ if (!avmProvingRequest) {
320
+ this.metrics.recordFailedTx();
321
+ throw new Error('Avm proving result was not generated.');
322
+ }
323
+ processedPhases.forEach((phase)=>{
324
+ if (phase.revertReason) {
325
+ this.metrics.recordRevertedPhase(phase.phase);
326
+ } else {
327
+ this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
328
+ }
329
+ });
330
+ this.metrics.recordClassRegistration(...tx.contractClassLogs.unrollLogs().filter((log)=>ContractClassRegisteredEvent.isContractClassRegisteredEvent(log.data)).map((log)=>ContractClassRegisteredEvent.fromLog(log.data)));
331
+ const phaseCount = processedPhases.length;
332
+ const durationMs = timer.ms();
333
+ this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
334
+ const processedTx = await makeProcessedTxFromTxWithPublicCalls(tx, avmProvingRequest, gasUsed, revertCode, revertReason);
335
+ const returnValues = processedPhases.find(({ phase })=>phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
336
+ return [
337
+ processedTx,
338
+ returnValues
339
+ ];
340
+ }
341
+ }
342
+ _ts_decorate([
343
+ trackSpan('PublicProcessor.processTx', async (tx)=>({
344
+ [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
345
+ }))
346
+ ], PublicProcessor.prototype, "processTx", null);
347
+ _ts_decorate([
348
+ trackSpan('PublicProcessor.processPrivateOnlyTx', async (tx)=>({
349
+ [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
350
+ }))
351
+ ], PublicProcessor.prototype, "processPrivateOnlyTx", null);
352
+ _ts_decorate([
353
+ trackSpan('PublicProcessor.processTxWithPublicCalls', async (tx)=>({
354
+ [Attributes.TX_HASH]: (await tx.getTxHash()).toString()
355
+ }))
356
+ ], PublicProcessor.prototype, "processTxWithPublicCalls", null);