@aztec/txe 0.0.1-commit.181e2d196 → 0.0.1-commit.189eedb3

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 (150) hide show
  1. package/dest/ContractClassRegistry-PII7Q556.js +3 -0
  2. package/dest/ContractClassRegistry-PII7Q556.js.map +7 -0
  3. package/dest/ContractInstanceRegistry-3MHLGFNZ.js +3 -0
  4. package/dest/ContractInstanceRegistry-3MHLGFNZ.js.map +7 -0
  5. package/dest/FeeJuice-TQV5AQK7.js +3 -0
  6. package/dest/FeeJuice-TQV5AQK7.js.map +7 -0
  7. package/dest/MultiCallEntrypoint-SBJUIJY7.js +3 -0
  8. package/dest/MultiCallEntrypoint-SBJUIJY7.js.map +7 -0
  9. package/dest/SchnorrAccount-MQXPIZ44.js +3 -0
  10. package/dest/SchnorrAccount-MQXPIZ44.js.map +7 -0
  11. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  12. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  13. package/dest/bin/check_txe_oracle_version.js +61 -0
  14. package/dest/bin/index.js +3 -30
  15. package/dest/bin/index.js.map +7 -0
  16. package/dest/bin/oracle_test_server.d.ts +3 -0
  17. package/dest/bin/oracle_test_server.d.ts.map +1 -0
  18. package/dest/bin/oracle_test_server.js +41 -0
  19. package/dest/chunk-6DNQGQKE.js +265 -0
  20. package/dest/chunk-6DNQGQKE.js.map +7 -0
  21. package/dest/chunk-BJVAAXNA.js +3 -0
  22. package/dest/chunk-BJVAAXNA.js.map +7 -0
  23. package/dest/chunk-IGFYWSUP.js +304 -0
  24. package/dest/chunk-IGFYWSUP.js.map +7 -0
  25. package/dest/constants.d.ts +5 -1
  26. package/dest/constants.d.ts.map +1 -1
  27. package/dest/constants.js +8 -0
  28. package/dest/dispatcher_pool.d.ts +67 -0
  29. package/dest/dispatcher_pool.d.ts.map +1 -0
  30. package/dest/dispatcher_pool.js +284 -0
  31. package/dest/index.d.ts +185 -7
  32. package/dest/index.d.ts.map +1 -1
  33. package/dest/index.js +70 -188
  34. package/dest/metafile.json +38642 -0
  35. package/dest/msgpackr_fr_extension.d.ts +2 -0
  36. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  37. package/dest/msgpackr_fr_extension.js +21 -0
  38. package/dest/oracle/interfaces.d.ts +55 -30
  39. package/dest/oracle/interfaces.d.ts.map +1 -1
  40. package/dest/oracle/test-resolver/fixtures.d.ts +43 -0
  41. package/dest/oracle/test-resolver/fixtures.d.ts.map +1 -0
  42. package/dest/oracle/test-resolver/fixtures.js +39 -0
  43. package/dest/oracle/test-resolver/index.d.ts +9 -0
  44. package/dest/oracle/test-resolver/index.d.ts.map +1 -0
  45. package/dest/oracle/test-resolver/index.js +33 -0
  46. package/dest/oracle/test-resolver/resolver.d.ts +34 -0
  47. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
  48. package/dest/oracle/test-resolver/resolver.js +114 -0
  49. package/dest/oracle/txe_oracle_public_context.d.ts +38 -14
  50. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  51. package/dest/oracle/txe_oracle_public_context.js +55 -13
  52. package/dest/oracle/txe_oracle_registry.d.ts +147 -0
  53. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
  54. package/dest/oracle/txe_oracle_registry.js +562 -0
  55. package/dest/oracle/txe_oracle_top_level_context.d.ts +43 -23
  56. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  57. package/dest/oracle/txe_oracle_top_level_context.js +163 -69
  58. package/dest/oracle/txe_oracle_version.d.ts +17 -0
  59. package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
  60. package/dest/oracle/txe_oracle_version.js +14 -0
  61. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  62. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  63. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  64. package/dest/rpc_server.d.ts +14 -0
  65. package/dest/rpc_server.d.ts.map +1 -0
  66. package/dest/rpc_server.js +78 -0
  67. package/dest/rpc_translator.d.ts +96 -228
  68. package/dest/rpc_translator.d.ts.map +1 -1
  69. package/dest/rpc_translator.js +815 -636
  70. package/dest/server.bundle.js +3 -0
  71. package/dest/server.bundle.js.map +7 -0
  72. package/dest/state_machine/archiver.d.ts +6 -5
  73. package/dest/state_machine/archiver.d.ts.map +1 -1
  74. package/dest/state_machine/archiver.js +30 -21
  75. package/dest/state_machine/dummy_p2p_client.d.ts +13 -7
  76. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  77. package/dest/state_machine/dummy_p2p_client.js +16 -4
  78. package/dest/state_machine/global_variable_builder.d.ts +9 -4
  79. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  80. package/dest/state_machine/global_variable_builder.js +9 -3
  81. package/dest/state_machine/index.d.ts +7 -3
  82. package/dest/state_machine/index.d.ts.map +1 -1
  83. package/dest/state_machine/index.js +23 -5
  84. package/dest/state_machine/mock_epoch_cache.d.ts +16 -3
  85. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  86. package/dest/state_machine/mock_epoch_cache.js +29 -2
  87. package/dest/state_machine/synchronizer.d.ts +5 -5
  88. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  89. package/dest/state_machine/synchronizer.js +4 -4
  90. package/dest/txe_session.d.ts +74 -12
  91. package/dest/txe_session.d.ts.map +1 -1
  92. package/dest/txe_session.js +175 -37
  93. package/dest/utils/encoding.d.ts +191 -0
  94. package/dest/utils/encoding.d.ts.map +1 -0
  95. package/dest/{util → utils}/encoding.js +7 -2
  96. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  97. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  98. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  99. package/dest/utils/txe_account_store.d.ts.map +1 -0
  100. package/dest/utils/txe_artifact_resolver.d.ts +37 -0
  101. package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
  102. package/dest/utils/txe_artifact_resolver.js +161 -0
  103. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  104. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  105. package/dest/{util → utils}/txe_public_contract_data_source.js +1 -3
  106. package/dest/worker.bundle.js +3 -0
  107. package/dest/worker.bundle.js.map +7 -0
  108. package/dest/worker.d.ts +2 -0
  109. package/dest/worker.d.ts.map +1 -0
  110. package/dest/worker.js +92 -0
  111. package/package.json +38 -21
  112. package/src/bin/check_txe_oracle_version.ts +70 -0
  113. package/src/bin/index.ts +11 -2
  114. package/src/bin/oracle_test_server.ts +51 -0
  115. package/src/constants.ts +10 -0
  116. package/src/dispatcher_pool.ts +316 -0
  117. package/src/index.ts +97 -224
  118. package/src/msgpackr_fr_extension.ts +23 -0
  119. package/src/oracle/interfaces.ts +53 -35
  120. package/src/oracle/test-resolver/fixtures.ts +84 -0
  121. package/src/oracle/test-resolver/index.ts +45 -0
  122. package/src/oracle/test-resolver/resolver.ts +165 -0
  123. package/src/oracle/txe_oracle_public_context.ts +72 -12
  124. package/src/oracle/txe_oracle_registry.ts +401 -0
  125. package/src/oracle/txe_oracle_top_level_context.ts +197 -79
  126. package/src/oracle/txe_oracle_version.ts +17 -0
  127. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  128. package/src/rpc_server.ts +87 -0
  129. package/src/rpc_translator.ts +1000 -1021
  130. package/src/state_machine/archiver.ts +42 -20
  131. package/src/state_machine/dummy_p2p_client.ts +31 -11
  132. package/src/state_machine/global_variable_builder.ts +18 -3
  133. package/src/state_machine/index.ts +25 -6
  134. package/src/state_machine/mock_epoch_cache.ts +38 -3
  135. package/src/state_machine/synchronizer.ts +5 -5
  136. package/src/txe_session.ts +286 -40
  137. package/src/{util → utils}/encoding.ts +8 -2
  138. package/src/utils/txe_artifact_resolver.ts +217 -0
  139. package/src/{util → utils}/txe_public_contract_data_source.ts +0 -2
  140. package/src/worker.ts +98 -0
  141. package/dest/util/encoding.d.ts +0 -720
  142. package/dest/util/encoding.d.ts.map +0 -1
  143. package/dest/util/expected_failure_error.d.ts.map +0 -1
  144. package/dest/util/txe_account_store.d.ts.map +0 -1
  145. package/dest/util/txe_public_contract_data_source.d.ts +0 -20
  146. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  147. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  148. /package/dest/{util → utils}/txe_account_store.js +0 -0
  149. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  150. /package/src/{util → utils}/txe_account_store.ts +0 -0
@@ -0,0 +1,401 @@
1
+ /* eslint-disable camelcase */
2
+ import {
3
+ GAS_SETTINGS_LENGTH,
4
+ MAX_NOTE_HASHES_PER_TX,
5
+ MAX_NULLIFIERS_PER_TX,
6
+ MAX_PRIVATE_LOGS_PER_TX,
7
+ PRIVATE_LOG_SIZE_IN_FIELDS,
8
+ } from '@aztec/constants';
9
+ import { Fr } from '@aztec/foundation/curves/bn254';
10
+ import { withHexPrefix, withoutHexPrefix } from '@aztec/foundation/string';
11
+ import {
12
+ ARRAY,
13
+ AZTEC_ADDRESS,
14
+ BIGINT,
15
+ BLOCK_NUMBER,
16
+ BOOL,
17
+ FIELD,
18
+ FUNCTION_SELECTOR,
19
+ type InputSlot,
20
+ type MaybePromise,
21
+ OPTION,
22
+ ORACLE_REGISTRY,
23
+ type OracleRegistryEntry,
24
+ type ParamTypes,
25
+ STR,
26
+ type TypeMapping,
27
+ U32,
28
+ makeEntry,
29
+ } from '@aztec/pxe/simulator';
30
+ import { EventSelector } from '@aztec/stdlib/abi';
31
+ import { CompleteAddress } from '@aztec/stdlib/contract';
32
+ import { GasSettings } from '@aztec/stdlib/gas';
33
+ import { PrivateContextInputs } from '@aztec/stdlib/kernel';
34
+ import type { PrivateLog } from '@aztec/stdlib/logs';
35
+ import type { TxHash } from '@aztec/stdlib/tx';
36
+
37
+ import {
38
+ MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY,
39
+ MAX_OFFCHAIN_EFFECT_LEN,
40
+ MAX_PRIVATE_EVENTS_PER_TXE_QUERY,
41
+ MAX_PRIVATE_EVENT_LEN,
42
+ } from '../constants.js';
43
+ import type { ForeignCallArgs, ForeignCallResult } from '../utils/encoding.js';
44
+
45
+ const GAS_SETTINGS: TypeMapping<GasSettings> = {
46
+ serialization: { fn: v => v.toFields() },
47
+ deserialization: {
48
+ fn: ([reader]) => GasSettings.fromFields(reader.readFieldArray(GAS_SETTINGS_LENGTH)),
49
+ slots: 1,
50
+ },
51
+ };
52
+
53
+ const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = {
54
+ serialization: { fn: v => v.toFields() },
55
+ };
56
+
57
+ const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = {
58
+ serialization: { fn: v => [v.address.toField(), ...v.publicKeys.toFields()] },
59
+ };
60
+
61
+ const TXE_TX_EFFECTS: TypeMapping<{
62
+ txHash: TxHash;
63
+ noteHashes: Fr[];
64
+ nullifiers: Fr[];
65
+ privateLogs: PrivateLog[];
66
+ }> = {
67
+ serialization: {
68
+ fn: ({ txHash, noteHashes, nullifiers, privateLogs }) => {
69
+ const emittedLogs = privateLogs.map(log => log.getEmittedFields());
70
+ const rawLogStorage = emittedLogs
71
+ .map(fields => fields.concat(Array(PRIVATE_LOG_SIZE_IN_FIELDS - fields.length).fill(Fr.ZERO)))
72
+ .concat(
73
+ Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Array(PRIVATE_LOG_SIZE_IN_FIELDS).fill(Fr.ZERO)),
74
+ )
75
+ .flat();
76
+ const logLengths = emittedLogs
77
+ .map(fields => new Fr(fields.length))
78
+ .concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Fr.ZERO));
79
+ const paddedNoteHashes = noteHashes.concat(Array(MAX_NOTE_HASHES_PER_TX - noteHashes.length).fill(Fr.ZERO));
80
+ const paddedNullifiers = nullifiers.concat(Array(MAX_NULLIFIERS_PER_TX - nullifiers.length).fill(Fr.ZERO));
81
+
82
+ return [
83
+ txHash.hash,
84
+ paddedNoteHashes,
85
+ new Fr(noteHashes.length),
86
+ paddedNullifiers,
87
+ new Fr(nullifiers.length),
88
+ rawLogStorage,
89
+ logLengths,
90
+ new Fr(emittedLogs.length),
91
+ ] as (Fr | Fr[])[];
92
+ },
93
+ },
94
+ };
95
+
96
+ const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = {
97
+ serialization: {
98
+ fn: ({ effects }) => {
99
+ const rawArrayStorage = effects
100
+ .map(e => e.concat(Array(MAX_OFFCHAIN_EFFECT_LEN - e.length).fill(Fr.ZERO)))
101
+ .concat(
102
+ Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Array(MAX_OFFCHAIN_EFFECT_LEN).fill(Fr.ZERO)),
103
+ )
104
+ .flat();
105
+ const effectLengths = effects
106
+ .map(e => new Fr(e.length))
107
+ .concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Fr.ZERO));
108
+
109
+ return [rawArrayStorage, effectLengths, new Fr(effects.length)] as (Fr | Fr[])[];
110
+ },
111
+ },
112
+ };
113
+
114
+ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = {
115
+ serialization: {
116
+ fn: ({ txHash, anchorBlockTimestamp }) => {
117
+ const isSome = txHash.isZero() ? 0 : 1;
118
+ return [new Fr(isSome), txHash, new Fr(anchorBlockTimestamp)];
119
+ },
120
+ },
121
+ };
122
+
123
+ const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ member: Fr; exists: boolean }> = {
124
+ serialization: { fn: ({ member, exists }) => [member, new Fr(exists)] },
125
+ };
126
+
127
+ const EVENT_SELECTOR: TypeMapping<EventSelector> = {
128
+ serialization: { fn: v => [v.toField()] },
129
+ deserialization: { fn: ([reader]) => EventSelector.fromField(reader.readField()), slots: 1 },
130
+ };
131
+
132
+ const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = {
133
+ serialization: {
134
+ fn: events => {
135
+ const rawArrayStorage = events
136
+ .map(e => e.concat(Array(MAX_PRIVATE_EVENT_LEN - e.length).fill(Fr.ZERO)))
137
+ .concat(
138
+ Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_PRIVATE_EVENT_LEN).fill(Fr.ZERO)),
139
+ )
140
+ .flat();
141
+ const eventLengths = events
142
+ .map(e => new Fr(e.length))
143
+ .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Fr.ZERO));
144
+ return [rawArrayStorage, eventLengths, new Fr(events.length)] as (Fr | Fr[])[];
145
+ },
146
+ },
147
+ };
148
+
149
+ export const TXE_ORACLE_REGISTRY = {
150
+ ...ORACLE_REGISTRY,
151
+
152
+ aztec_txe_assertCompatibleOracleVersion: makeEntry({
153
+ params: [
154
+ { name: 'major', type: U32 },
155
+ { name: 'minor', type: U32 },
156
+ ],
157
+ }),
158
+
159
+ aztec_txe_setTopLevelTXEContext: makeEntry(),
160
+
161
+ aztec_txe_setPrivateTXEContext: makeEntry({
162
+ params: [
163
+ { name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) },
164
+ { name: 'anchorBlockNumber', type: OPTION(BLOCK_NUMBER) },
165
+ { name: 'gasSettings', type: GAS_SETTINGS },
166
+ ],
167
+ returnType: PRIVATE_CONTEXT_INPUTS,
168
+ }),
169
+
170
+ aztec_txe_setPublicTXEContext: makeEntry({
171
+ params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
172
+ }),
173
+
174
+ aztec_txe_setUtilityTXEContext: makeEntry({
175
+ params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
176
+ }),
177
+
178
+ aztec_txe_getDefaultAddress: makeEntry({ returnType: AZTEC_ADDRESS }),
179
+
180
+ aztec_txe_getNextBlockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
181
+
182
+ aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: BIGINT }),
183
+
184
+ aztec_txe_advanceBlocksBy: makeEntry({
185
+ params: [{ name: 'blocks', type: U32 }],
186
+ }),
187
+
188
+ aztec_txe_advanceTimestampBy: makeEntry({
189
+ params: [{ name: 'duration', type: BIGINT }],
190
+ }),
191
+
192
+ aztec_txe_deploy: makeEntry({
193
+ params: [
194
+ { name: 'contractPath', type: STR },
195
+ { name: 'initializer', type: STR },
196
+ { name: 'argsLength', type: U32 },
197
+ { name: 'args', type: ARRAY(FIELD) },
198
+ { name: 'secret', type: FIELD },
199
+ { name: 'salt', type: FIELD },
200
+ { name: 'deployer', type: AZTEC_ADDRESS },
201
+ ],
202
+ returnType: ARRAY(FIELD),
203
+ }),
204
+
205
+ aztec_txe_createAccount: makeEntry({
206
+ params: [{ name: 'secret', type: FIELD }],
207
+ returnType: COMPLETE_ADDRESS,
208
+ }),
209
+
210
+ aztec_txe_addAccount: makeEntry({
211
+ params: [{ name: 'secret', type: FIELD }],
212
+ returnType: COMPLETE_ADDRESS,
213
+ }),
214
+
215
+ aztec_txe_addAuthWitness: makeEntry({
216
+ params: [
217
+ { name: 'address', type: AZTEC_ADDRESS },
218
+ { name: 'messageHash', type: FIELD },
219
+ ],
220
+ }),
221
+
222
+ aztec_txe_getLastBlockTimestamp: makeEntry({
223
+ returnType: BIGINT,
224
+ }),
225
+
226
+ aztec_txe_getLastTxEffects: makeEntry({ returnType: TXE_TX_EFFECTS }),
227
+ aztec_txe_getLastCallOffchainEffects: makeEntry({ returnType: TXE_OFFCHAIN_EFFECTS }),
228
+ aztec_txe_getLastCallContext: makeEntry({ returnType: TXE_CALL_CONTEXT }),
229
+
230
+ aztec_txe_getPrivateEvents: makeEntry({
231
+ params: [
232
+ { name: 'selector', type: EVENT_SELECTOR },
233
+ { name: 'contractAddress', type: AZTEC_ADDRESS },
234
+ { name: 'scope', type: AZTEC_ADDRESS },
235
+ ],
236
+ returnType: TXE_PRIVATE_EVENTS,
237
+ }),
238
+
239
+ aztec_txe_privateCallNewFlow: makeEntry({
240
+ params: [
241
+ { name: 'from', type: OPTION(AZTEC_ADDRESS) },
242
+ { name: 'targetContractAddress', type: AZTEC_ADDRESS },
243
+ { name: 'functionSelector', type: FUNCTION_SELECTOR },
244
+ { name: 'args', type: ARRAY(FIELD) },
245
+ { name: 'argsHash', type: FIELD },
246
+ { name: 'isStaticCall', type: BOOL },
247
+ { name: 'additionalScopes', type: ARRAY(AZTEC_ADDRESS) },
248
+ { name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
249
+ { name: 'gasSettings', type: GAS_SETTINGS },
250
+ ],
251
+ returnType: ARRAY(FIELD),
252
+ }),
253
+
254
+ aztec_txe_executeUtilityFunction: makeEntry({
255
+ params: [
256
+ { name: 'targetContractAddress', type: AZTEC_ADDRESS },
257
+ { name: 'functionSelector', type: FUNCTION_SELECTOR },
258
+ { name: 'args', type: ARRAY(FIELD) },
259
+ { name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
260
+ ],
261
+ returnType: ARRAY(FIELD),
262
+ }),
263
+
264
+ aztec_txe_publicCallNewFlow: makeEntry({
265
+ params: [
266
+ { name: 'from', type: OPTION(AZTEC_ADDRESS) },
267
+ { name: 'address', type: AZTEC_ADDRESS },
268
+ { name: 'calldata', type: ARRAY(FIELD) },
269
+ { name: 'isStaticCall', type: BOOL },
270
+ { name: 'gasSettings', type: GAS_SETTINGS },
271
+ ],
272
+ returnType: ARRAY(FIELD),
273
+ }),
274
+
275
+ aztec_avm_address: makeEntry({ returnType: AZTEC_ADDRESS }),
276
+
277
+ aztec_avm_sender: makeEntry({ returnType: AZTEC_ADDRESS }),
278
+
279
+ aztec_avm_blockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
280
+
281
+ aztec_avm_timestamp: makeEntry({ returnType: BIGINT }),
282
+
283
+ aztec_avm_isStaticCall: makeEntry({ returnType: BOOL }),
284
+
285
+ aztec_avm_chainId: makeEntry({ returnType: FIELD }),
286
+
287
+ aztec_avm_version: makeEntry({ returnType: FIELD }),
288
+
289
+ aztec_avm_emitNullifier: makeEntry({
290
+ params: [{ name: 'nullifier', type: FIELD }],
291
+ }),
292
+
293
+ aztec_avm_emitNoteHash: makeEntry({
294
+ params: [{ name: 'noteHash', type: FIELD }],
295
+ }),
296
+
297
+ aztec_avm_nullifierExists: makeEntry({
298
+ params: [{ name: 'siloedNullifier', type: FIELD }],
299
+ returnType: BOOL,
300
+ }),
301
+
302
+ aztec_avm_storageRead: makeEntry({
303
+ params: [
304
+ { name: 'slot', type: FIELD },
305
+ { name: 'contractAddress', type: AZTEC_ADDRESS },
306
+ ],
307
+ returnType: FIELD,
308
+ }),
309
+
310
+ aztec_avm_storageWrite: makeEntry({
311
+ params: [
312
+ { name: 'slot', type: FIELD },
313
+ { name: 'value', type: FIELD },
314
+ ],
315
+ }),
316
+
317
+ aztec_avm_emitPublicLog: makeEntry({
318
+ params: [{ name: 'message', type: ARRAY(FIELD) }],
319
+ }),
320
+
321
+ aztec_avm_returndataSize: makeEntry({ returnType: FIELD }),
322
+
323
+ aztec_avm_returndataCopy: makeEntry({
324
+ params: [
325
+ { name: 'rdOffset', type: U32 },
326
+ { name: 'copySize', type: U32 },
327
+ ],
328
+ returnType: ARRAY(FIELD),
329
+ }),
330
+
331
+ aztec_avm_call: makeEntry({
332
+ params: [
333
+ { name: 'l2Gas', type: U32 },
334
+ { name: 'daGas', type: U32 },
335
+ { name: 'address', type: AZTEC_ADDRESS },
336
+ { name: 'argsLength', type: U32 },
337
+ { name: 'args', type: ARRAY(FIELD) },
338
+ ],
339
+ returnType: ARRAY(FIELD),
340
+ }),
341
+
342
+ aztec_avm_staticCall: makeEntry({
343
+ params: [
344
+ { name: 'l2Gas', type: U32 },
345
+ { name: 'daGas', type: U32 },
346
+ { name: 'address', type: AZTEC_ADDRESS },
347
+ { name: 'argsLength', type: U32 },
348
+ { name: 'args', type: ARRAY(FIELD) },
349
+ ],
350
+ returnType: ARRAY(FIELD),
351
+ }),
352
+
353
+ aztec_avm_successCopy: makeEntry({ returnType: FIELD }),
354
+
355
+ aztec_avm_getContractInstanceDeployer: makeEntry({
356
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
357
+ returnType: CONTRACT_INSTANCE_MEMBER,
358
+ }),
359
+ aztec_avm_getContractInstanceClassId: makeEntry({
360
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
361
+ returnType: CONTRACT_INSTANCE_MEMBER,
362
+ }),
363
+ aztec_avm_getContractInstanceInitializationHash: makeEntry({
364
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
365
+ returnType: CONTRACT_INSTANCE_MEMBER,
366
+ }),
367
+ aztec_avm_getContractInstanceImmutablesHash: makeEntry({
368
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
369
+ returnType: CONTRACT_INSTANCE_MEMBER,
370
+ }),
371
+ } satisfies Record<string, OracleRegistryEntry>;
372
+
373
+ /**
374
+ * Deserializes oracle inputs, calls the handler with typed params, serializes the result, and wraps
375
+ * it in a `ForeignCallResult`. Normalizes `ForeignCallArgs` (which may contain bare strings) into
376
+ * `InputSlot[]` (always arrays) before deserialization.
377
+ */
378
+ export async function callTxeHandler<K extends keyof typeof TXE_ORACLE_REGISTRY>({
379
+ oracle,
380
+ inputs,
381
+ handler,
382
+ }: {
383
+ oracle: K;
384
+ inputs: ForeignCallArgs;
385
+ handler: (
386
+ params: ParamTypes<ReturnType<(typeof TXE_ORACLE_REGISTRY)[K]['deserializeParams']>>,
387
+ ) => MaybePromise<Parameters<(typeof TXE_ORACLE_REGISTRY)[K]['serializeReturn']>[0]>;
388
+ }): Promise<ForeignCallResult> {
389
+ const entry = TXE_ORACLE_REGISTRY[oracle] as OracleRegistryEntry;
390
+ // TXE foreign calls use bare hex strings, but Fr.fromString requires a 0x prefix to parse as hex.
391
+ const normalized: InputSlot[] = inputs.map(v =>
392
+ Array.isArray(v) ? (v as string[]).map(withHexPrefix) : [withHexPrefix(v as string)],
393
+ );
394
+ const named = entry.deserializeParams(normalized);
395
+ const positional = named.map((p: { value: unknown }) => p.value);
396
+ const result = await handler(positional as any);
397
+ const outputSlots = entry.serializeReturn(result);
398
+ return {
399
+ values: outputSlots.map(slot => (Array.isArray(slot) ? slot.map(withoutHexPrefix) : withoutHexPrefix(slot))),
400
+ };
401
+ }