@aztec-labs/txe 6.0.0-nightly.20260829

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 (173) hide show
  1. package/dest/AuthRegistry-D4XJULH3.js +3 -0
  2. package/dest/AuthRegistry-D4XJULH3.js.map +7 -0
  3. package/dest/ContractClassRegistry-Q76MXQZD.js +3 -0
  4. package/dest/ContractClassRegistry-Q76MXQZD.js.map +7 -0
  5. package/dest/ContractInstanceRegistry-CTRARU77.js +3 -0
  6. package/dest/ContractInstanceRegistry-CTRARU77.js.map +7 -0
  7. package/dest/FeeJuice-YLTJXWYJ.js +3 -0
  8. package/dest/FeeJuice-YLTJXWYJ.js.map +7 -0
  9. package/dest/HandshakeRegistry-BRPEG7GL.js +3 -0
  10. package/dest/HandshakeRegistry-BRPEG7GL.js.map +7 -0
  11. package/dest/MultiCallEntrypoint-CJHMYQT5.js +3 -0
  12. package/dest/MultiCallEntrypoint-CJHMYQT5.js.map +7 -0
  13. package/dest/SchnorrAccount-OB4N4QIM.js +3 -0
  14. package/dest/SchnorrAccount-OB4N4QIM.js.map +7 -0
  15. package/dest/SchnorrInitializerlessAccount-TWGKRUSY.js +3 -0
  16. package/dest/SchnorrInitializerlessAccount-TWGKRUSY.js.map +7 -0
  17. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  18. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  19. package/dest/bin/check_txe_oracle_version.js +22 -0
  20. package/dest/bin/index.d.ts +3 -0
  21. package/dest/bin/index.d.ts.map +1 -0
  22. package/dest/bin/index.js +4 -0
  23. package/dest/bin/index.js.map +7 -0
  24. package/dest/bin/oracle_test_server.d.ts +3 -0
  25. package/dest/bin/oracle_test_server.d.ts.map +1 -0
  26. package/dest/bin/oracle_test_server.js +41 -0
  27. package/dest/chunk-32UHX7YY.js +3 -0
  28. package/dest/chunk-32UHX7YY.js.map +7 -0
  29. package/dest/chunk-F4QVFWNM.js +258 -0
  30. package/dest/chunk-F4QVFWNM.js.map +7 -0
  31. package/dest/chunk-LILEKW2X.js +304 -0
  32. package/dest/chunk-LILEKW2X.js.map +7 -0
  33. package/dest/constants.d.ts +7 -0
  34. package/dest/constants.d.ts.map +1 -0
  35. package/dest/constants.js +10 -0
  36. package/dest/dispatcher_pool.d.ts +67 -0
  37. package/dest/dispatcher_pool.d.ts.map +1 -0
  38. package/dest/dispatcher_pool.js +288 -0
  39. package/dest/index.d.ts +52 -0
  40. package/dest/index.d.ts.map +1 -0
  41. package/dest/index.js +102 -0
  42. package/dest/metafile.json +38805 -0
  43. package/dest/msgpackr_fr_extension.d.ts +2 -0
  44. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  45. package/dest/msgpackr_fr_extension.js +21 -0
  46. package/dest/oracle/interfaces.d.ts +90 -0
  47. package/dest/oracle/interfaces.d.ts.map +1 -0
  48. package/dest/oracle/interfaces.js +3 -0
  49. package/dest/oracle/noir-structs/gas_settings_data.d.ts +14 -0
  50. package/dest/oracle/noir-structs/gas_settings_data.d.ts.map +1 -0
  51. package/dest/oracle/noir-structs/gas_settings_data.js +1 -0
  52. package/dest/oracle/noir-structs/tx_effects_data.d.ts +11 -0
  53. package/dest/oracle/noir-structs/tx_effects_data.d.ts.map +1 -0
  54. package/dest/oracle/noir-structs/tx_effects_data.js +1 -0
  55. package/dest/oracle/tagging_secret_strategy.d.ts +12 -0
  56. package/dest/oracle/tagging_secret_strategy.d.ts.map +1 -0
  57. package/dest/oracle/tagging_secret_strategy.js +12 -0
  58. package/dest/oracle/test-resolver/default_fixtures.d.ts +16 -0
  59. package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -0
  60. package/dest/oracle/test-resolver/default_fixtures.js +207 -0
  61. package/dest/oracle/test-resolver/index.d.ts +9 -0
  62. package/dest/oracle/test-resolver/index.d.ts.map +1 -0
  63. package/dest/oracle/test-resolver/index.js +32 -0
  64. package/dest/oracle/test-resolver/resolver.d.ts +48 -0
  65. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
  66. package/dest/oracle/test-resolver/resolver.js +181 -0
  67. package/dest/oracle/txe_oracle_public_context.d.ts +58 -0
  68. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -0
  69. package/dest/oracle/txe_oracle_public_context.js +170 -0
  70. package/dest/oracle/txe_oracle_registry.d.ts +164 -0
  71. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
  72. package/dest/oracle/txe_oracle_registry.js +753 -0
  73. package/dest/oracle/txe_oracle_top_level_context.d.ts +128 -0
  74. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -0
  75. package/dest/oracle/txe_oracle_top_level_context.js +815 -0
  76. package/dest/oracle/txe_oracle_version.d.ts +17 -0
  77. package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
  78. package/dest/oracle/txe_oracle_version.js +14 -0
  79. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  80. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  81. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  82. package/dest/rpc_server.d.ts +14 -0
  83. package/dest/rpc_server.d.ts.map +1 -0
  84. package/dest/rpc_server.js +78 -0
  85. package/dest/rpc_translator.d.ts +140 -0
  86. package/dest/rpc_translator.d.ts.map +1 -0
  87. package/dest/rpc_translator.js +976 -0
  88. package/dest/server.bundle.js +3 -0
  89. package/dest/server.bundle.js.map +7 -0
  90. package/dest/state_machine/archiver.d.ts +32 -0
  91. package/dest/state_machine/archiver.d.ts.map +1 -0
  92. package/dest/state_machine/archiver.js +95 -0
  93. package/dest/state_machine/dummy_p2p_client.d.ts +69 -0
  94. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -0
  95. package/dest/state_machine/dummy_p2p_client.js +180 -0
  96. package/dest/state_machine/global_variable_builder.d.ts +15 -0
  97. package/dest/state_machine/global_variable_builder.d.ts.map +1 -0
  98. package/dest/state_machine/global_variable_builder.js +25 -0
  99. package/dest/state_machine/index.d.ts +22 -0
  100. package/dest/state_machine/index.d.ts.map +1 -0
  101. package/dest/state_machine/index.js +110 -0
  102. package/dest/state_machine/mock_epoch_cache.d.ts +43 -0
  103. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -0
  104. package/dest/state_machine/mock_epoch_cache.js +88 -0
  105. package/dest/state_machine/synchronizer.d.ts +41 -0
  106. package/dest/state_machine/synchronizer.d.ts.map +1 -0
  107. package/dest/state_machine/synchronizer.js +70 -0
  108. package/dest/txe_session.d.ts +179 -0
  109. package/dest/txe_session.d.ts.map +1 -0
  110. package/dest/txe_session.js +697 -0
  111. package/dest/utils/block_creation.d.ts +28 -0
  112. package/dest/utils/block_creation.d.ts.map +1 -0
  113. package/dest/utils/block_creation.js +59 -0
  114. package/dest/utils/encoding.d.ts +194 -0
  115. package/dest/utils/encoding.d.ts.map +1 -0
  116. package/dest/utils/encoding.js +136 -0
  117. package/dest/utils/expected_failure_error.d.ts +4 -0
  118. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  119. package/dest/utils/expected_failure_error.js +5 -0
  120. package/dest/utils/tx_effect_creation.d.ts +5 -0
  121. package/dest/utils/tx_effect_creation.d.ts.map +1 -0
  122. package/dest/utils/tx_effect_creation.js +12 -0
  123. package/dest/utils/txe_account_store.d.ts +10 -0
  124. package/dest/utils/txe_account_store.d.ts.map +1 -0
  125. package/dest/utils/txe_account_store.js +17 -0
  126. package/dest/utils/txe_artifact_resolver.d.ts +36 -0
  127. package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
  128. package/dest/utils/txe_artifact_resolver.js +160 -0
  129. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  130. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  131. package/dest/utils/txe_public_contract_data_source.js +51 -0
  132. package/dest/worker.bundle.js +3 -0
  133. package/dest/worker.bundle.js.map +7 -0
  134. package/dest/worker.d.ts +2 -0
  135. package/dest/worker.d.ts.map +1 -0
  136. package/dest/worker.js +92 -0
  137. package/package.json +115 -0
  138. package/src/bin/check_txe_oracle_version.ts +31 -0
  139. package/src/bin/index.ts +49 -0
  140. package/src/bin/oracle_test_server.ts +51 -0
  141. package/src/constants.ts +13 -0
  142. package/src/dispatcher_pool.ts +319 -0
  143. package/src/index.ts +152 -0
  144. package/src/msgpackr_fr_extension.ts +22 -0
  145. package/src/oracle/interfaces.ts +125 -0
  146. package/src/oracle/noir-structs/gas_settings_data.ts +16 -0
  147. package/src/oracle/noir-structs/tx_effects_data.ts +11 -0
  148. package/src/oracle/tagging_secret_strategy.ts +25 -0
  149. package/src/oracle/test-resolver/default_fixtures.ts +278 -0
  150. package/src/oracle/test-resolver/index.ts +43 -0
  151. package/src/oracle/test-resolver/resolver.ts +245 -0
  152. package/src/oracle/txe_oracle_public_context.ts +220 -0
  153. package/src/oracle/txe_oracle_registry.ts +501 -0
  154. package/src/oracle/txe_oracle_top_level_context.ts +1086 -0
  155. package/src/oracle/txe_oracle_version.ts +17 -0
  156. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  157. package/src/rpc_server.ts +86 -0
  158. package/src/rpc_translator.ts +1229 -0
  159. package/src/state_machine/archiver.ts +118 -0
  160. package/src/state_machine/dummy_p2p_client.ts +264 -0
  161. package/src/state_machine/global_variable_builder.ts +39 -0
  162. package/src/state_machine/index.ts +152 -0
  163. package/src/state_machine/mock_epoch_cache.ts +111 -0
  164. package/src/state_machine/synchronizer.ts +105 -0
  165. package/src/txe_session.ts +1107 -0
  166. package/src/utils/block_creation.ts +91 -0
  167. package/src/utils/encoding.ts +171 -0
  168. package/src/utils/expected_failure_error.ts +5 -0
  169. package/src/utils/tx_effect_creation.ts +28 -0
  170. package/src/utils/txe_account_store.ts +23 -0
  171. package/src/utils/txe_artifact_resolver.ts +217 -0
  172. package/src/utils/txe_public_contract_data_source.ts +60 -0
  173. package/src/worker.ts +98 -0
@@ -0,0 +1,501 @@
1
+ /* eslint-disable camelcase */
2
+ import {
3
+ MAX_NOTE_HASHES_PER_TX,
4
+ MAX_NULLIFIERS_PER_TX,
5
+ MAX_PRIVATE_LOGS_PER_TX,
6
+ PRIVATE_LOG_SIZE_IN_FIELDS,
7
+ } from '@aztec-labs/constants';
8
+ import { Fr } from '@aztec-labs/foundation/curves/bn254';
9
+ import { Point } from '@aztec-labs/foundation/curves/grumpkin';
10
+ import { withHexPrefix, withoutHexPrefix } from '@aztec-labs/foundation/string';
11
+ import type { TaggingSecretStrategy } from '@aztec-labs/pxe/server';
12
+ import {
13
+ ARRAY,
14
+ AZTEC_ADDRESS,
15
+ BLOCK_HEADER,
16
+ BLOCK_NUMBER,
17
+ BOOL,
18
+ ETH_ADDRESS,
19
+ FIELD,
20
+ FIXED_ARRAY,
21
+ FIXED_BOUNDED_VEC,
22
+ FUNCTION_SELECTOR,
23
+ GAS_FEES,
24
+ type InputSlot,
25
+ LEAF,
26
+ type MaybePromise,
27
+ OPTION,
28
+ ORACLE_REGISTRY,
29
+ type Option,
30
+ type OracleRegistryEntry,
31
+ type OutputSlot,
32
+ PUBLIC_KEYS,
33
+ type ParamTypes,
34
+ SCALAR,
35
+ STR,
36
+ STRUCT,
37
+ TX_HASH,
38
+ type TypeMapping,
39
+ U32,
40
+ U64,
41
+ VECTOR,
42
+ buildACIRCallback,
43
+ makeEntry,
44
+ } from '@aztec-labs/pxe/simulator';
45
+ import { EventSelector } from '@aztec-labs/stdlib/abi';
46
+ import { CompleteAddress } from '@aztec-labs/stdlib/contract';
47
+ import type { PrivateContextInputs } from '@aztec-labs/stdlib/kernel';
48
+ import type { CallContext, TxContext } from '@aztec-labs/stdlib/tx';
49
+
50
+ import {
51
+ MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY,
52
+ MAX_OFFCHAIN_EFFECT_LEN,
53
+ MAX_PRIVATE_EVENTS_PER_TXE_QUERY,
54
+ MAX_PRIVATE_EVENT_LEN,
55
+ } from '../constants.js';
56
+ import type { ForeignCallArgs, ForeignCallResult } from '../utils/encoding.js';
57
+ import type { GasData, GasSettingsData } from './noir-structs/gas_settings_data.js';
58
+ import type { TxEffectsData } from './noir-structs/tx_effects_data.js';
59
+
60
+ // Spreading `ORACLE_REGISTRY` re-materializes its entries into `TXE_ORACLE_REGISTRY`'s inferred type, which names the
61
+ // protocol types below. Re-exporting them gives tsc a portable path to each instead of falling back to a deep
62
+ // node_modules path that breaks .d.ts portability (TS2742).
63
+ export type {
64
+ ContractClassLogData,
65
+ EmbeddedCurvePoint,
66
+ NullifierMembershipWitnessData,
67
+ PublicDataWitnessData,
68
+ TxEffectData,
69
+ } from '@aztec-labs/pxe/simulator';
70
+ export type { BlockHash } from '@aztec-labs/stdlib/block';
71
+ export type { MembershipWitness } from '@aztec-labs/foundation/trees';
72
+
73
+ const GAS: TypeMapping<GasData> = STRUCT([
74
+ { name: 'daGas', type: U32 },
75
+ { name: 'l2Gas', type: U32 },
76
+ ]);
77
+
78
+ const GAS_SETTINGS: TypeMapping<GasSettingsData> = STRUCT([
79
+ { name: 'gasLimits', type: GAS },
80
+ { name: 'teardownGasLimits', type: GAS },
81
+ { name: 'maxFeesPerGas', type: GAS_FEES },
82
+ { name: 'maxPriorityFeesPerGas', type: GAS_FEES },
83
+ ]);
84
+
85
+ // Tagging secret strategy discriminants. Must match the Noir test helper `TaggingSecretStrategy` in
86
+ // aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategies`
87
+ // reads it), so the mapping lives here on the TXE side rather than in the production oracle type mappings.
88
+ const STRATEGY_NON_INTERACTIVE_HANDSHAKE = 1;
89
+ const STRATEGY_ARBITRARY_SECRET = 2;
90
+ const STRATEGY_ADDRESS_DERIVED = 3;
91
+ const STRATEGY_INTERACTIVE_HANDSHAKE = 4;
92
+
93
+ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = LEAF({
94
+ kind: 'tagging-secret-strategy',
95
+ serialization: {
96
+ fn: strategy => {
97
+ switch (strategy.type) {
98
+ case 'non-interactive-handshake':
99
+ return [new Fr(STRATEGY_NON_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
100
+ case 'interactive-handshake':
101
+ return [new Fr(STRATEGY_INTERACTIVE_HANDSHAKE), Fr.ZERO, Fr.ZERO];
102
+ case 'address-derived':
103
+ return [new Fr(STRATEGY_ADDRESS_DERIVED), Fr.ZERO, Fr.ZERO];
104
+ case 'arbitrary-secret':
105
+ return [new Fr(STRATEGY_ARBITRARY_SECRET), strategy.secret.x, strategy.secret.y];
106
+ }
107
+ },
108
+ },
109
+ deserialization: {
110
+ fn: ([kindReader, xReader, yReader]) => {
111
+ const kind = kindReader.readField().toNumber();
112
+ const [x, y] = [xReader.readField(), yReader.readField()];
113
+ switch (kind) {
114
+ case STRATEGY_NON_INTERACTIVE_HANDSHAKE:
115
+ return { type: 'non-interactive-handshake' };
116
+ case STRATEGY_INTERACTIVE_HANDSHAKE:
117
+ return { type: 'interactive-handshake' };
118
+ case STRATEGY_ADDRESS_DERIVED:
119
+ return { type: 'address-derived' };
120
+ case STRATEGY_ARBITRARY_SECRET:
121
+ return { type: 'arbitrary-secret', secret: Point.fromFields([x, y]) };
122
+ default:
123
+ throw new Error(`Unrecognized tagging secret strategy kind: ${kind}`);
124
+ }
125
+ },
126
+ },
127
+ shape: ['scalar', 'scalar', 'scalar'],
128
+ });
129
+
130
+ const CALL_CONTEXT: TypeMapping<CallContext> = STRUCT([
131
+ { name: 'msgSender', type: AZTEC_ADDRESS },
132
+ { name: 'contractAddress', type: AZTEC_ADDRESS },
133
+ { name: 'functionSelector', type: FUNCTION_SELECTOR },
134
+ { name: 'isStaticCall', type: BOOL },
135
+ ]);
136
+
137
+ const TX_CONTEXT: TypeMapping<TxContext> = STRUCT([
138
+ { name: 'chainId', type: FIELD },
139
+ { name: 'version', type: FIELD },
140
+ { name: 'gasSettings', type: GAS_SETTINGS },
141
+ ]);
142
+
143
+ const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = STRUCT([
144
+ { name: 'callContext', type: CALL_CONTEXT },
145
+ { name: 'anchorBlockHeader', type: BLOCK_HEADER },
146
+ { name: 'txContext', type: TX_CONTEXT },
147
+ { name: 'startSideEffectCounter', type: U32 },
148
+ { name: 'txRequestSalt', type: FIELD },
149
+ ]);
150
+
151
+ const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = STRUCT([
152
+ { name: 'address', type: AZTEC_ADDRESS },
153
+ { name: 'publicKeys', type: PUBLIC_KEYS },
154
+ ]);
155
+
156
+ const TXE_TX_EFFECTS: TypeMapping<TxEffectsData> = STRUCT([
157
+ { name: 'txHash', type: TX_HASH },
158
+ { name: 'noteHashes', type: FIXED_BOUNDED_VEC(FIELD, MAX_NOTE_HASHES_PER_TX) },
159
+ { name: 'nullifiers', type: FIXED_BOUNDED_VEC(FIELD, MAX_NULLIFIERS_PER_TX) },
160
+ {
161
+ name: 'privateLogs',
162
+ type: FIXED_BOUNDED_VEC(FIXED_BOUNDED_VEC(FIELD, PRIVATE_LOG_SIZE_IN_FIELDS), MAX_PRIVATE_LOGS_PER_TX),
163
+ },
164
+ ]);
165
+
166
+ const TXE_OFFCHAIN_EFFECTS: TypeMapping<Fr[][]> = FIXED_BOUNDED_VEC(
167
+ FIXED_BOUNDED_VEC(FIELD, MAX_OFFCHAIN_EFFECT_LEN),
168
+ MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY,
169
+ );
170
+
171
+ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Option<Fr>; anchorBlockTimestamp: bigint }> = STRUCT([
172
+ { name: 'txHash', type: OPTION(FIELD) },
173
+ { name: 'anchorBlockTimestamp', type: U64 },
174
+ ]);
175
+
176
+ const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> = FIXED_ARRAY(
177
+ STRUCT([
178
+ { name: 'exists', type: BOOL },
179
+ { name: 'member', type: FIELD },
180
+ ]),
181
+ 1,
182
+ );
183
+
184
+ export const EVENT_SELECTOR: TypeMapping<EventSelector> = SCALAR({
185
+ kind: 'event-selector',
186
+ serialization: { fn: v => [v.toField()] },
187
+ deserialization: { fn: ([reader]) => EventSelector.fromField(reader.readField()) },
188
+ });
189
+
190
+ const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = FIXED_BOUNDED_VEC(
191
+ FIXED_BOUNDED_VEC(FIELD, MAX_PRIVATE_EVENT_LEN),
192
+ MAX_PRIVATE_EVENTS_PER_TXE_QUERY,
193
+ );
194
+
195
+ export const TXE_ORACLE_REGISTRY = {
196
+ ...ORACLE_REGISTRY,
197
+
198
+ aztec_txe_assertCompatibleOracleVersion: makeEntry({
199
+ params: [
200
+ { name: 'major', type: U32 },
201
+ { name: 'minor', type: U32 },
202
+ ],
203
+ }),
204
+
205
+ aztec_txe_setTopLevelTXEContext: makeEntry(),
206
+
207
+ aztec_txe_setPrivateTXEContext: makeEntry({
208
+ params: [
209
+ { name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) },
210
+ { name: 'anchorBlockNumber', type: OPTION(BLOCK_NUMBER) },
211
+ { name: 'gasSettings', type: GAS_SETTINGS },
212
+ ],
213
+ returnType: PRIVATE_CONTEXT_INPUTS,
214
+ }),
215
+
216
+ aztec_txe_setPublicTXEContext: makeEntry({
217
+ params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
218
+ }),
219
+
220
+ aztec_txe_setUtilityTXEContext: makeEntry({
221
+ params: [{ name: 'contractAddress', type: OPTION(AZTEC_ADDRESS) }],
222
+ }),
223
+
224
+ aztec_txe_getDefaultAddress: makeEntry({ returnType: AZTEC_ADDRESS }),
225
+
226
+ aztec_txe_getNextBlockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
227
+
228
+ aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: U64 }),
229
+
230
+ aztec_txe_advanceBlocksBy: makeEntry({
231
+ params: [{ name: 'blocks', type: U32 }],
232
+ }),
233
+
234
+ aztec_txe_advanceTimestampBy: makeEntry({
235
+ params: [{ name: 'duration', type: U64 }],
236
+ }),
237
+
238
+ aztec_txe_deploy: makeEntry({
239
+ params: [
240
+ { name: 'contractPath', type: STR },
241
+ { name: 'initializer', type: STR },
242
+ { name: 'argsLength', type: U32 },
243
+ { name: 'args', type: ARRAY(FIELD) },
244
+ { name: 'secret', type: FIELD },
245
+ { name: 'salt', type: FIELD },
246
+ { name: 'deployer', type: AZTEC_ADDRESS },
247
+ ],
248
+ returnType: ARRAY(FIELD),
249
+ }),
250
+
251
+ aztec_txe_createAccount: makeEntry({
252
+ params: [
253
+ { name: 'secret', type: FIELD },
254
+ { name: 'partialAddress', type: FIELD },
255
+ ],
256
+ returnType: COMPLETE_ADDRESS,
257
+ }),
258
+
259
+ aztec_txe_addAccount: makeEntry({
260
+ params: [{ name: 'secret', type: FIELD }],
261
+ returnType: COMPLETE_ADDRESS,
262
+ }),
263
+
264
+ aztec_txe_addAuthWitness: makeEntry({
265
+ params: [
266
+ { name: 'address', type: AZTEC_ADDRESS },
267
+ { name: 'messageHash', type: FIELD },
268
+ ],
269
+ }),
270
+
271
+ aztec_txe_sendL1ToL2Message: makeEntry({
272
+ params: [
273
+ { name: 'content', type: FIELD },
274
+ { name: 'secretHash', type: FIELD },
275
+ { name: 'sender', type: ETH_ADDRESS },
276
+ { name: 'recipient', type: AZTEC_ADDRESS },
277
+ ],
278
+ returnType: FIELD,
279
+ }),
280
+
281
+ aztec_txe_setTaggingSecretStrategies: makeEntry({
282
+ params: [
283
+ { name: 'unconstrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
284
+ { name: 'constrainedStrategy', type: OPTION(TAGGING_SECRET_STRATEGY) },
285
+ ],
286
+ }),
287
+
288
+ aztec_txe_setAuthorizeAllUtilityCallTargets: makeEntry({
289
+ params: [{ name: 'authorizeAll', type: BOOL }],
290
+ }),
291
+
292
+ aztec_txe_getLastBlockTimestamp: makeEntry({
293
+ returnType: U64,
294
+ }),
295
+
296
+ aztec_txe_getLastTxEffects: makeEntry({ returnType: TXE_TX_EFFECTS }),
297
+ aztec_txe_getLastCallOffchainEffects: makeEntry({ returnType: TXE_OFFCHAIN_EFFECTS }),
298
+ aztec_txe_getLastCallContext: makeEntry({ returnType: TXE_CALL_CONTEXT }),
299
+
300
+ aztec_txe_getPrivateEvents: makeEntry({
301
+ params: [
302
+ { name: 'selector', type: EVENT_SELECTOR },
303
+ { name: 'contractAddress', type: AZTEC_ADDRESS },
304
+ { name: 'scope', type: AZTEC_ADDRESS },
305
+ ],
306
+ returnType: TXE_PRIVATE_EVENTS,
307
+ }),
308
+
309
+ aztec_txe_privateCallNewFlow: makeEntry({
310
+ params: [
311
+ { name: 'from', type: OPTION(AZTEC_ADDRESS) },
312
+ { name: 'targetContractAddress', type: AZTEC_ADDRESS },
313
+ { name: 'functionSelector', type: FUNCTION_SELECTOR },
314
+ { name: 'args', type: ARRAY(FIELD) },
315
+ { name: 'argsHash', type: FIELD },
316
+ { name: 'isStaticCall', type: BOOL },
317
+ { name: 'additionalScopes', type: ARRAY(AZTEC_ADDRESS) },
318
+ { name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
319
+ { name: 'gasSettings', type: GAS_SETTINGS },
320
+ ],
321
+ returnType: ARRAY(FIELD),
322
+ }),
323
+
324
+ aztec_txe_executeUtilityFunction: makeEntry({
325
+ params: [
326
+ { name: 'from', type: OPTION(AZTEC_ADDRESS) },
327
+ { name: 'targetContractAddress', type: AZTEC_ADDRESS },
328
+ { name: 'functionSelector', type: FUNCTION_SELECTOR },
329
+ { name: 'args', type: ARRAY(FIELD) },
330
+ { name: 'authorizedUtilityCallTargets', type: ARRAY(AZTEC_ADDRESS) },
331
+ ],
332
+ returnType: ARRAY(FIELD),
333
+ }),
334
+
335
+ aztec_txe_publicCallNewFlow: makeEntry({
336
+ params: [
337
+ { name: 'from', type: OPTION(AZTEC_ADDRESS) },
338
+ { name: 'address', type: AZTEC_ADDRESS },
339
+ { name: 'calldata', type: ARRAY(FIELD) },
340
+ { name: 'isStaticCall', type: BOOL },
341
+ { name: 'gasSettings', type: GAS_SETTINGS },
342
+ ],
343
+ returnType: ARRAY(FIELD),
344
+ }),
345
+
346
+ aztec_avm_address: makeEntry({ returnType: AZTEC_ADDRESS }),
347
+
348
+ aztec_avm_sender: makeEntry({ returnType: AZTEC_ADDRESS }),
349
+
350
+ aztec_avm_blockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
351
+
352
+ aztec_avm_timestamp: makeEntry({ returnType: U64 }),
353
+
354
+ aztec_avm_isStaticCall: makeEntry({ returnType: BOOL }),
355
+
356
+ aztec_avm_chainId: makeEntry({ returnType: FIELD }),
357
+
358
+ aztec_avm_version: makeEntry({ returnType: FIELD }),
359
+
360
+ aztec_avm_emitNullifier: makeEntry({
361
+ params: [{ name: 'nullifier', type: FIELD }],
362
+ }),
363
+
364
+ aztec_avm_emitNoteHash: makeEntry({
365
+ params: [{ name: 'noteHash', type: FIELD }],
366
+ }),
367
+
368
+ aztec_avm_nullifierExists: makeEntry({
369
+ params: [{ name: 'siloedNullifier', type: FIELD }],
370
+ returnType: BOOL,
371
+ }),
372
+
373
+ aztec_avm_storageRead: makeEntry({
374
+ params: [
375
+ { name: 'slot', type: FIELD },
376
+ { name: 'contractAddress', type: AZTEC_ADDRESS },
377
+ ],
378
+ returnType: FIELD,
379
+ }),
380
+
381
+ aztec_avm_storageWrite: makeEntry({
382
+ params: [
383
+ { name: 'slot', type: FIELD },
384
+ { name: 'value', type: FIELD },
385
+ ],
386
+ }),
387
+
388
+ aztec_avm_emitPublicLog: makeEntry({
389
+ params: [{ name: 'message', type: VECTOR(FIELD) }],
390
+ }),
391
+
392
+ aztec_avm_returndataSize: makeEntry({ returnType: U32 }),
393
+
394
+ aztec_avm_returndataCopy: makeEntry({
395
+ params: [
396
+ { name: 'rdOffset', type: U32 },
397
+ { name: 'copySize', type: U32 },
398
+ ],
399
+ returnType: VECTOR(FIELD),
400
+ }),
401
+
402
+ aztec_avm_call: makeEntry({
403
+ params: [
404
+ { name: 'l2Gas', type: U32 },
405
+ { name: 'daGas', type: U32 },
406
+ { name: 'address', type: AZTEC_ADDRESS },
407
+ { name: 'argsLength', type: U32 },
408
+ { name: 'args', type: ARRAY(FIELD) },
409
+ ],
410
+ }),
411
+
412
+ aztec_avm_staticCall: makeEntry({
413
+ params: [
414
+ { name: 'l2Gas', type: U32 },
415
+ { name: 'daGas', type: U32 },
416
+ { name: 'address', type: AZTEC_ADDRESS },
417
+ { name: 'argsLength', type: U32 },
418
+ { name: 'args', type: ARRAY(FIELD) },
419
+ ],
420
+ }),
421
+
422
+ aztec_avm_successCopy: makeEntry({ returnType: BOOL }),
423
+
424
+ aztec_avm_getContractInstanceDeployer: makeEntry({
425
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
426
+ returnType: CONTRACT_INSTANCE_MEMBER,
427
+ }),
428
+ aztec_avm_getContractInstanceClassId: makeEntry({
429
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
430
+ returnType: CONTRACT_INSTANCE_MEMBER,
431
+ }),
432
+ aztec_avm_getContractInstanceInitializationHash: makeEntry({
433
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
434
+ returnType: CONTRACT_INSTANCE_MEMBER,
435
+ }),
436
+ aztec_avm_getContractInstanceImmutablesHash: makeEntry({
437
+ params: [{ name: 'address', type: AZTEC_ADDRESS }],
438
+ returnType: CONTRACT_INSTANCE_MEMBER,
439
+ }),
440
+ } satisfies Record<string, OracleRegistryEntry>;
441
+
442
+ export function toInputSlots(inputs: ForeignCallArgs): InputSlot[] {
443
+ // TXE foreign calls use bare hex strings, but Fr.fromString requires a 0x prefix to parse as hex.
444
+ return inputs.map(v => (Array.isArray(v) ? (v as string[]).map(withHexPrefix) : [withHexPrefix(v as string)]));
445
+ }
446
+
447
+ /**
448
+ * Deserializes oracle inputs, calls the handler with typed params, serializes the result, and wraps
449
+ * it in a `ForeignCallResult`. Normalizes `ForeignCallArgs` (which may contain bare strings) into
450
+ * `InputSlot[]` (always arrays) before deserialization.
451
+ */
452
+ export async function callTxeHandler<K extends keyof typeof TXE_ORACLE_REGISTRY>({
453
+ oracle,
454
+ inputs,
455
+ handler,
456
+ }: {
457
+ oracle: K;
458
+ inputs: ForeignCallArgs;
459
+ handler: (
460
+ params: ParamTypes<ReturnType<(typeof TXE_ORACLE_REGISTRY)[K]['deserializeParams']>>,
461
+ ) => MaybePromise<Parameters<(typeof TXE_ORACLE_REGISTRY)[K]['serializeReturn']>[0]>;
462
+ }): Promise<ForeignCallResult> {
463
+ const entry = TXE_ORACLE_REGISTRY[oracle] as OracleRegistryEntry;
464
+ const named = entry.deserializeParams(toInputSlots(inputs));
465
+ const positional = named.map((p: { value: unknown }) => p.value);
466
+ const result = await handler(positional as any);
467
+ return outputSlotsToForeignCallResult(entry.serializeReturn(result));
468
+ }
469
+
470
+ /**
471
+ * Dispatches an oracle that has been retired into the PXE legacy registry. TXE has no explicit handler method for such
472
+ * names; this runs them through the same `buildACIRCallback` legacy path that contract execution already uses, so
473
+ * TXE's top-level oracle path and its in-contract path treat the legacy registry identically.
474
+ */
475
+ const legacyCallbacksByHandler = new WeakMap<object, ReturnType<typeof buildACIRCallback>>();
476
+
477
+ export async function callTxeLegacyHandler(
478
+ oracle: string,
479
+ inputs: ForeignCallArgs,
480
+ oracleHandler: Parameters<typeof buildACIRCallback>[0],
481
+ ): Promise<ForeignCallResult> {
482
+ // `buildACIRCallback` materializes the whole real+legacy closure set, so memoize it per handler rather than
483
+ // rebuilding on every call (TXE routes one legacy oracle through here on each top-level discovery).
484
+ let callback = legacyCallbacksByHandler.get(oracleHandler);
485
+ if (!callback) {
486
+ callback = buildACIRCallback(oracleHandler);
487
+ legacyCallbacksByHandler.set(oracleHandler, callback);
488
+ }
489
+ const outputSlots = await callback[oracle](...toInputSlots(inputs));
490
+ return outputSlotsToForeignCallResult(outputSlots);
491
+ }
492
+
493
+ /**
494
+ * Strips the `0x` prefix from each serialized output slot (TXE foreign calls use bare hex strings) and wraps them in a
495
+ * `ForeignCallResult`.
496
+ */
497
+ function outputSlotsToForeignCallResult(outputSlots: OutputSlot[]): ForeignCallResult {
498
+ return {
499
+ values: outputSlots.map(slot => (Array.isArray(slot) ? slot.map(withoutHexPrefix) : withoutHexPrefix(slot))),
500
+ };
501
+ }