@aztec/txe 0.0.1-commit.4d79d1f2d → 0.0.1-commit.4d9804df

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