@aztec/txe 0.0.1-commit.b8a057fa → 0.0.1-commit.be03c316

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 (73) 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-2TZHWOTT.js → ContractInstanceRegistry-FHIWE33X.js} +1 -1
  6. package/dest/{ContractInstanceRegistry-2TZHWOTT.js.map → ContractInstanceRegistry-FHIWE33X.js.map} +1 -1
  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-IGLO227K.js → MultiCallEntrypoint-QG5H33ZZ.js} +1 -1
  12. package/dest/{MultiCallEntrypoint-IGLO227K.js.map → MultiCallEntrypoint-QG5H33ZZ.js.map} +2 -2
  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.js +7 -15
  18. package/dest/bin/index.js +1 -1
  19. package/dest/{chunk-FRF5YZEO.js → chunk-DXIAVNMJ.js} +2 -2
  20. package/dest/{chunk-FRF5YZEO.js.map → chunk-DXIAVNMJ.js.map} +3 -3
  21. package/dest/{chunk-O57S6W5S.js → chunk-JHAAHRCL.js} +13 -13
  22. package/dest/{chunk-O57S6W5S.js.map → chunk-JHAAHRCL.js.map} +4 -4
  23. package/dest/metafile.json +654 -392
  24. package/dest/oracle/interfaces.d.ts +11 -3
  25. package/dest/oracle/interfaces.d.ts.map +1 -1
  26. package/dest/oracle/tagging_secret_strategy.d.ts +12 -0
  27. package/dest/oracle/tagging_secret_strategy.d.ts.map +1 -0
  28. package/dest/oracle/tagging_secret_strategy.js +12 -0
  29. package/dest/oracle/test-resolver/default_fixtures.d.ts +9 -2
  30. package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -1
  31. package/dest/oracle/test-resolver/default_fixtures.js +32 -39
  32. package/dest/oracle/test-resolver/resolver.d.ts +1 -1
  33. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -1
  34. package/dest/oracle/test-resolver/resolver.js +2 -2
  35. package/dest/oracle/txe_oracle_registry.d.ts +8 -5
  36. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -1
  37. package/dest/oracle/txe_oracle_registry.js +52 -30
  38. package/dest/oracle/txe_oracle_top_level_context.d.ts +21 -7
  39. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  40. package/dest/oracle/txe_oracle_top_level_context.js +39 -17
  41. package/dest/oracle/txe_oracle_version.d.ts +4 -4
  42. package/dest/oracle/txe_oracle_version.js +4 -4
  43. package/dest/rpc_translator.d.ts +6 -3
  44. package/dest/rpc_translator.d.ts.map +1 -1
  45. package/dest/rpc_translator.js +31 -7
  46. package/dest/server.bundle.js +1 -1
  47. package/dest/txe_session.d.ts +3 -2
  48. package/dest/txe_session.d.ts.map +1 -1
  49. package/dest/txe_session.js +15 -9
  50. package/dest/worker.bundle.js +1 -1
  51. package/package.json +17 -17
  52. package/src/bin/check_txe_oracle_version.ts +9 -12
  53. package/src/oracle/interfaces.ts +13 -2
  54. package/src/oracle/tagging_secret_strategy.ts +25 -0
  55. package/src/oracle/test-resolver/default_fixtures.ts +58 -69
  56. package/src/oracle/test-resolver/resolver.ts +2 -2
  57. package/src/oracle/txe_oracle_registry.ts +48 -28
  58. package/src/oracle/txe_oracle_top_level_context.ts +47 -12
  59. package/src/oracle/txe_oracle_version.ts +4 -4
  60. package/src/rpc_translator.ts +37 -8
  61. package/src/txe_session.ts +23 -11
  62. package/dest/AuthRegistry-HMC7WEOJ.js +0 -3
  63. package/dest/AuthRegistry-HMC7WEOJ.js.map +0 -7
  64. package/dest/ContractClassRegistry-TXCDCFNC.js +0 -3
  65. package/dest/ContractClassRegistry-TXCDCFNC.js.map +0 -7
  66. package/dest/FeeJuice-FDF3J2Q5.js +0 -3
  67. package/dest/FeeJuice-FDF3J2Q5.js.map +0 -7
  68. package/dest/HandshakeRegistry-C7JF4R54.js +0 -3
  69. package/dest/HandshakeRegistry-C7JF4R54.js.map +0 -7
  70. package/dest/SchnorrAccount-KCIHUCXS.js +0 -3
  71. package/dest/SchnorrAccount-KCIHUCXS.js.map +0 -7
  72. package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js +0 -3
  73. package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js.map +0 -7
@@ -2,7 +2,7 @@
2
2
  import type { Logger } from '@aztec/foundation/log';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { withoutHexPrefix } from '@aztec/foundation/string';
5
- import { BOUNDED_VEC, BYTE, BoundedVec, Option, type OracleRegistryEntry, makeEntry } from '@aztec/pxe/simulator';
5
+ import { BOUNDED_VEC, BoundedVec, Option, type OracleRegistryEntry, U8, makeEntry } from '@aztec/pxe/simulator';
6
6
 
7
7
  import type { ForeignCallArgs, ForeignCallResult } from '../../utils/encoding.js';
8
8
  import { toInputSlots } from '../txe_oracle_registry.js';
@@ -10,7 +10,7 @@ import { synthesizeDefaultFixtures } from './default_fixtures.js';
10
10
 
11
11
  /** Name of the meta-oracle that Noir tests call to announce the next call's scenario by name. */
12
12
  const SET_SCENARIO_ORACLE = 'aztec_oracle_test_set_scenario';
13
- export const SET_SCENARIO_ENTRY = makeEntry({ params: [{ name: 'name', type: BOUNDED_VEC(BYTE) }] });
13
+ export const SET_SCENARIO_ENTRY = makeEntry({ params: [{ name: 'name', type: BOUNDED_VEC(U8) }] });
14
14
 
15
15
  export type OracleTestCallInput = {
16
16
  session_id: number;
@@ -14,7 +14,6 @@ import type { TaggingSecretStrategy } from '@aztec/pxe/server';
14
14
  import {
15
15
  ARRAY,
16
16
  AZTEC_ADDRESS,
17
- BIGINT,
18
17
  BLOCK_NUMBER,
19
18
  BOOL,
20
19
  ETH_ADDRESS,
@@ -22,17 +21,20 @@ import {
22
21
  FIXED_ARRAY,
23
22
  FUNCTION_SELECTOR,
24
23
  type InputSlot,
24
+ LEAF,
25
25
  type MaybePromise,
26
26
  OPTION,
27
27
  ORACLE_REGISTRY,
28
28
  type OracleRegistryEntry,
29
29
  type OutputSlot,
30
30
  type ParamTypes,
31
+ SCALAR,
31
32
  STR,
32
33
  STRUCT,
33
34
  type SlotShape,
34
35
  type TypeMapping,
35
36
  U32,
37
+ U64,
36
38
  buildACIRCallback,
37
39
  makeEntry,
38
40
  } from '@aztec/pxe/simulator';
@@ -59,22 +61,24 @@ export type { BlockHash } from '@aztec/stdlib/block';
59
61
  export type { MembershipWitness } from '@aztec/foundation/trees';
60
62
  export type { NullifierMembershipWitness, PublicDataWitness } from '@aztec/stdlib/trees';
61
63
 
62
- const GAS_SETTINGS: TypeMapping<GasSettings> = {
64
+ const GAS_SETTINGS: TypeMapping<GasSettings> = LEAF({
65
+ kind: 'gas-settings',
63
66
  deserialization: {
64
67
  fn: ([reader]) => GasSettings.fromFields(reader.readFieldArray(GAS_SETTINGS_LENGTH)),
65
68
  },
66
69
  shape: [{ len: GAS_SETTINGS_LENGTH }],
67
- };
70
+ });
68
71
 
69
72
  // Tagging secret strategy discriminants. Must match the Noir test helper `TaggingSecretStrategy` in
70
- // aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategy`
73
+ // aztec-nr `test/helpers/tagging_secret_strategy.nr`. This is a test-only oracle (only `set_tagging_secret_strategies`
71
74
  // reads it), so the mapping lives here on the TXE side rather than in the production oracle type mappings.
72
75
  const STRATEGY_NON_INTERACTIVE_HANDSHAKE = 1;
73
76
  const STRATEGY_ARBITRARY_SECRET = 2;
74
77
  const STRATEGY_ADDRESS_DERIVED = 3;
75
78
  const STRATEGY_INTERACTIVE_HANDSHAKE = 4;
76
79
 
77
- const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
80
+ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = LEAF({
81
+ kind: 'tagging-secret-strategy',
78
82
  serialization: {
79
83
  fn: strategy => {
80
84
  switch (strategy.type) {
@@ -108,24 +112,27 @@ const TAGGING_SECRET_STRATEGY: TypeMapping<TaggingSecretStrategy> = {
108
112
  },
109
113
  },
110
114
  shape: ['scalar', 'scalar', 'scalar'],
111
- };
115
+ });
112
116
 
113
- const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = {
117
+ const PRIVATE_CONTEXT_INPUTS: TypeMapping<PrivateContextInputs> = LEAF({
118
+ kind: 'private-context-inputs',
114
119
  serialization: { fn: v => v.toFields() },
115
120
  shape: Array<SlotShape>(PRIVATE_CONTEXT_INPUTS_LENGTH).fill('scalar'),
116
- };
121
+ });
117
122
 
118
- const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = {
123
+ const COMPLETE_ADDRESS: TypeMapping<CompleteAddress> = LEAF({
124
+ kind: 'complete-address',
119
125
  serialization: { fn: v => [v.address.toField(), ...v.publicKeys.toFields()] },
120
126
  shape: Array<SlotShape>(8).fill('scalar'), // address + 7 public-key fields
121
- };
127
+ });
122
128
 
123
129
  const TXE_TX_EFFECTS: TypeMapping<{
124
130
  txHash: TxHash;
125
131
  noteHashes: Fr[];
126
132
  nullifiers: Fr[];
127
133
  privateLogs: PrivateLog[];
128
- }> = {
134
+ }> = LEAF({
135
+ kind: 'txe-tx-effects',
129
136
  serialization: {
130
137
  fn: ({ txHash, noteHashes, nullifiers, privateLogs }) => {
131
138
  const emittedLogs = privateLogs.map(log => log.getEmittedFields());
@@ -164,9 +171,10 @@ const TXE_TX_EFFECTS: TypeMapping<{
164
171
  { len: MAX_PRIVATE_LOGS_PER_TX },
165
172
  'scalar',
166
173
  ],
167
- };
174
+ });
168
175
 
169
- const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = {
176
+ const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = LEAF({
177
+ kind: 'txe-offchain-effects',
170
178
  serialization: {
171
179
  fn: ({ effects }) => {
172
180
  const rawArrayStorage = effects
@@ -188,9 +196,10 @@ const TXE_OFFCHAIN_EFFECTS: TypeMapping<{ effects: Fr[][] }> = {
188
196
  { len: MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY },
189
197
  'scalar',
190
198
  ],
191
- };
199
+ });
192
200
 
193
- const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = {
201
+ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }> = LEAF({
202
+ kind: 'txe-call-context',
194
203
  serialization: {
195
204
  fn: ({ txHash, anchorBlockTimestamp }) => {
196
205
  const isSome = txHash.isZero() ? 0 : 1;
@@ -198,7 +207,7 @@ const TXE_CALL_CONTEXT: TypeMapping<{ txHash: Fr; anchorBlockTimestamp: bigint }
198
207
  },
199
208
  },
200
209
  shape: ['scalar', 'scalar', 'scalar'], // discriminant, txHash, anchor block timestamp
201
- };
210
+ });
202
211
 
203
212
  const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> = FIXED_ARRAY(
204
213
  STRUCT([
@@ -208,13 +217,14 @@ const CONTRACT_INSTANCE_MEMBER: TypeMapping<{ exists: boolean; member: Fr }[]> =
208
217
  1,
209
218
  );
210
219
 
211
- const EVENT_SELECTOR: TypeMapping<EventSelector> = {
220
+ const EVENT_SELECTOR: TypeMapping<EventSelector> = SCALAR({
221
+ kind: 'event-selector',
212
222
  serialization: { fn: v => [v.toField()] },
213
223
  deserialization: { fn: ([reader]) => EventSelector.fromField(reader.readField()) },
214
- shape: ['scalar'],
215
- };
224
+ });
216
225
 
217
- const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = {
226
+ const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = LEAF({
227
+ kind: 'txe-private-events',
218
228
  serialization: {
219
229
  fn: events => {
220
230
  const rawArrayStorage = events
@@ -235,7 +245,7 @@ const TXE_PRIVATE_EVENTS: TypeMapping<Fr[][]> = {
235
245
  { len: MAX_PRIVATE_EVENTS_PER_TXE_QUERY },
236
246
  'scalar',
237
247
  ],
238
- };
248
+ });
239
249
 
240
250
  export const TXE_ORACLE_REGISTRY = {
241
251
  ...ORACLE_REGISTRY,
@@ -270,14 +280,14 @@ export const TXE_ORACLE_REGISTRY = {
270
280
 
271
281
  aztec_txe_getNextBlockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
272
282
 
273
- aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: BIGINT }),
283
+ aztec_txe_getNextBlockTimestamp: makeEntry({ returnType: U64 }),
274
284
 
275
285
  aztec_txe_advanceBlocksBy: makeEntry({
276
286
  params: [{ name: 'blocks', type: U32 }],
277
287
  }),
278
288
 
279
289
  aztec_txe_advanceTimestampBy: makeEntry({
280
- params: [{ name: 'duration', type: BIGINT }],
290
+ params: [{ name: 'duration', type: U64 }],
281
291
  }),
282
292
 
283
293
  aztec_txe_deploy: makeEntry({
@@ -294,7 +304,10 @@ export const TXE_ORACLE_REGISTRY = {
294
304
  }),
295
305
 
296
306
  aztec_txe_createAccount: makeEntry({
297
- params: [{ name: 'secret', type: FIELD }],
307
+ params: [
308
+ { name: 'secret', type: FIELD },
309
+ { name: 'partialAddress', type: FIELD },
310
+ ],
298
311
  returnType: COMPLETE_ADDRESS,
299
312
  }),
300
313
 
@@ -320,12 +333,19 @@ export const TXE_ORACLE_REGISTRY = {
320
333
  returnType: FIELD,
321
334
  }),
322
335
 
323
- aztec_txe_setTaggingSecretStrategy: makeEntry({
324
- params: [{ name: 'strategy', type: OPTION(TAGGING_SECRET_STRATEGY) }],
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 }],
325
345
  }),
326
346
 
327
347
  aztec_txe_getLastBlockTimestamp: makeEntry({
328
- returnType: BIGINT,
348
+ returnType: U64,
329
349
  }),
330
350
 
331
351
  aztec_txe_getLastTxEffects: makeEntry({ returnType: TXE_TX_EFFECTS }),
@@ -384,7 +404,7 @@ export const TXE_ORACLE_REGISTRY = {
384
404
 
385
405
  aztec_avm_blockNumber: makeEntry({ returnType: BLOCK_NUMBER }),
386
406
 
387
- aztec_avm_timestamp: makeEntry({ returnType: BIGINT }),
407
+ aztec_avm_timestamp: makeEntry({ returnType: U64 }),
388
408
 
389
409
  aztec_avm_isStaticCall: makeEntry({ returnType: BOOL }),
390
410
 
@@ -73,6 +73,7 @@ import {
73
73
  } from '@aztec/stdlib/kernel';
74
74
  import { deriveKeys, hashPublicKey } from '@aztec/stdlib/keys';
75
75
  import type { PrivateLog } from '@aztec/stdlib/logs';
76
+ import { AppTaggingSecretKind } from '@aztec/stdlib/logs';
76
77
  import { L1Actor, L1ToL2Message, L2Actor } from '@aztec/stdlib/messaging';
77
78
  import { ChonkProof } from '@aztec/stdlib/proofs';
78
79
  import { makeGlobalVariables } from '@aztec/stdlib/testing';
@@ -99,6 +100,7 @@ import type { TXEAccountStore } from '../utils/txe_account_store.js';
99
100
  import type { TXEArtifactResolver } from '../utils/txe_artifact_resolver.js';
100
101
  import { TXEPublicContractDataSource } from '../utils/txe_public_contract_data_source.js';
101
102
  import type { ITxeExecutionOracle } from './interfaces.js';
103
+ import { type TXETaggingSecretStrategies, makeResolveTaggingSecretStrategyHook } from './tagging_secret_strategy.js';
102
104
 
103
105
  export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracle {
104
106
  isMisc = true as const;
@@ -123,7 +125,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
123
125
  private version: Fr,
124
126
  private chainId: Fr,
125
127
  private authwits: Map<string, AuthWitness>,
126
- private taggingSecretStrategy: TaggingSecretStrategy | undefined,
128
+ private taggingSecretStrategies: TXETaggingSecretStrategies,
129
+ private authorizeAllUtilityCallTargets: boolean,
127
130
  private readonly artifactResolver: TXEArtifactResolver,
128
131
  private readonly rootPath: string,
129
132
  private readonly packageName: string,
@@ -333,9 +336,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
333
336
  return completeAddress;
334
337
  }
335
338
 
336
- async createAccount(secret: Fr) {
337
- // This is a foot gun !
338
- const completeAddress = await this.keyStore.addAccount(await deriveKeys(secret), secret);
339
+ async createAccount(secret: Fr, partialAddress: Fr) {
340
+ const completeAddress = await this.keyStore.addAccount(await deriveKeys(secret), partialAddress);
339
341
  await this.accountStore.setAccount(completeAddress.address, completeAddress);
340
342
  await this.addressStore.addCompleteAddress(completeAddress);
341
343
  this.logger.debug(`Created account ${completeAddress.address}`);
@@ -356,8 +358,23 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
356
358
  this.authwits.set(authWitness.requestHash.toString(), authWitness);
357
359
  }
358
360
 
359
- setTaggingSecretStrategy(strategy: Option<TaggingSecretStrategy>): void {
360
- this.taggingSecretStrategy = strategy.value;
361
+ setTaggingSecretStrategies(
362
+ unconstrainedStrategy: Option<TaggingSecretStrategy>,
363
+ constrainedStrategy: Option<TaggingSecretStrategy>,
364
+ ): void {
365
+ const apply = (mode: AppTaggingSecretKind, strategy: Option<TaggingSecretStrategy>) => {
366
+ if (strategy.isSome()) {
367
+ this.taggingSecretStrategies.set(mode, strategy.value);
368
+ } else {
369
+ this.taggingSecretStrategies.delete(mode);
370
+ }
371
+ };
372
+ apply(AppTaggingSecretKind.UNCONSTRAINED, unconstrainedStrategy);
373
+ apply(AppTaggingSecretKind.CONSTRAINED, constrainedStrategy);
374
+ }
375
+
376
+ setAuthorizeAllUtilityCallTargets(authorizeAll: boolean): void {
377
+ this.authorizeAllUtilityCallTargets = authorizeAll;
361
378
  }
362
379
 
363
380
  async sendL1ToL2Message(content: Fr, secretHash: Fr, sender: EthAddress, recipient: AztecAddress): Promise<Fr> {
@@ -471,7 +488,6 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
471
488
  const simulator = new WASMSimulator();
472
489
 
473
490
  const transientArrayService = new TransientArrayService();
474
- const taggingSecretStrategy = this.taggingSecretStrategy;
475
491
  const privateExecutionOracle = new PrivateExecutionOracle({
476
492
  argsHash,
477
493
  txContext,
@@ -511,9 +527,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
511
527
  isStaticCall ? 'private view' : 'private',
512
528
  authorizedUtilityCallTargets,
513
529
  ),
514
- // Only configure the hook when a strategy was explicitly set, so that otherwise the default tagging secret
515
- // strategy is exercised.
516
- resolveTaggingSecretStrategy: taggingSecretStrategy ? () => Promise.resolve(taggingSecretStrategy) : undefined,
530
+ resolveTaggingSecretStrategy: makeResolveTaggingSecretStrategyHook(this.taggingSecretStrategies),
517
531
  }),
518
532
  transientArrayService,
519
533
  });
@@ -973,9 +987,19 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
973
987
  }
974
988
  }
975
989
 
976
- close(): [bigint, Map<string, AuthWitness>, TaggingSecretStrategy | undefined] {
990
+ close(): {
991
+ nextBlockTimestamp: bigint;
992
+ authwits: Map<string, AuthWitness>;
993
+ taggingSecretStrategies: TXETaggingSecretStrategies;
994
+ authorizeAllUtilityCallTargets: boolean;
995
+ } {
977
996
  this.logger.debug('Exiting Top Level Context');
978
- return [this.nextBlockTimestamp, this.authwits, this.taggingSecretStrategy];
997
+ return {
998
+ nextBlockTimestamp: this.nextBlockTimestamp,
999
+ authwits: this.authwits,
1000
+ taggingSecretStrategies: this.taggingSecretStrategies,
1001
+ authorizeAllUtilityCallTargets: this.authorizeAllUtilityCallTargets,
1002
+ };
979
1003
  }
980
1004
 
981
1005
  private async getLastBlockNumber(): Promise<BlockNumber> {
@@ -987,6 +1011,9 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
987
1011
  callerContext: 'private' | 'private view' | 'utility',
988
1012
  authorizedTargets: AztecAddress[],
989
1013
  ): ExecutionHooks['authorizeUtilityCall'] | undefined {
1014
+ if (this.authorizeAllUtilityCallTargets) {
1015
+ return authorizeAllUtilityCallsHook;
1016
+ }
990
1017
  if (authorizedTargets.length === 0) {
991
1018
  return undefined;
992
1019
  }
@@ -996,3 +1023,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
996
1023
  });
997
1024
  }
998
1025
  }
1026
+
1027
+ /**
1028
+ * An `authorizeUtilityCall` hook that authorizes every cross-contract utility call.
1029
+ *
1030
+ * Backs the `aztec_txe_setAuthorizeAllUtilityCallTargets` oracle.
1031
+ */
1032
+ export const authorizeAllUtilityCallsHook: NonNullable<ExecutionHooks['authorizeUtilityCall']> = () =>
1033
+ Promise.resolve({ authorized: true });
@@ -5,13 +5,13 @@
5
5
  *
6
6
  * The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
7
7
  */
8
- export const TXE_ORACLE_VERSION_MAJOR = 2;
9
- export const TXE_ORACLE_VERSION_MINOR = 3;
8
+ export const TXE_ORACLE_VERSION_MAJOR = 4;
9
+ export const TXE_ORACLE_VERSION_MINOR = 1;
10
10
 
11
11
  /**
12
- * This hash is computed from the TXE oracle interfaces (IAvmExecutionOracle and ITxeExecutionOracle) and is used to
12
+ * This hash is computed from the TXE-specific entries in `TXE_ORACLE_REGISTRY` and is used to
13
13
  * detect when those interfaces change. When it does, bump:
14
14
  * - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
15
15
  * - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
16
16
  */
17
- export const TXE_ORACLE_INTERFACE_HASH = '4ed3618087fafb4aa63c6580996a69bf6bc257844035a2019692586b5b8daf34';
17
+ export const TXE_ORACLE_INTERFACE_HASH = '1a6c578d0a47cd8dd7dae07fd00abe781225a73920c596d873afcc061c0e4284';
@@ -188,7 +188,7 @@ export class RPCTranslator {
188
188
  return callTxeHandler({
189
189
  oracle: 'aztec_txe_createAccount',
190
190
  inputs,
191
- handler: ([secret]) => this.handlerAsTxe().createAccount(secret),
191
+ handler: ([secret, partialAddress]) => this.handlerAsTxe().createAccount(secret, partialAddress),
192
192
  });
193
193
  }
194
194
 
@@ -221,11 +221,21 @@ export class RPCTranslator {
221
221
  }
222
222
 
223
223
  // eslint-disable-next-line camelcase
224
- aztec_txe_setTaggingSecretStrategy(...inputs: ForeignCallArgs) {
224
+ aztec_txe_setTaggingSecretStrategies(...inputs: ForeignCallArgs) {
225
225
  return callTxeHandler({
226
- oracle: 'aztec_txe_setTaggingSecretStrategy',
226
+ oracle: 'aztec_txe_setTaggingSecretStrategies',
227
227
  inputs,
228
- handler: ([strategy]) => this.handlerAsTxe().setTaggingSecretStrategy(strategy),
228
+ handler: ([unconstrainedStrategy, constrainedStrategy]) =>
229
+ this.handlerAsTxe().setTaggingSecretStrategies(unconstrainedStrategy, constrainedStrategy),
230
+ });
231
+ }
232
+
233
+ // eslint-disable-next-line camelcase
234
+ aztec_txe_setAuthorizeAllUtilityCallTargets(...inputs: ForeignCallArgs) {
235
+ return callTxeHandler({
236
+ oracle: 'aztec_txe_setAuthorizeAllUtilityCallTargets',
237
+ inputs,
238
+ handler: ([authorizeAll]) => this.handlerAsTxe().setAuthorizeAllUtilityCallTargets(authorizeAll),
229
239
  });
230
240
  }
231
241
 
@@ -488,12 +498,12 @@ export class RPCTranslator {
488
498
  }
489
499
 
490
500
  // eslint-disable-next-line camelcase
491
- aztec_utl_getL1ToL2MembershipWitness(...inputs: ForeignCallArgs) {
501
+ aztec_utl_getL1ToL2MembershipWitnessV2(...inputs: ForeignCallArgs) {
492
502
  return callTxeHandler({
493
- oracle: 'aztec_utl_getL1ToL2MembershipWitness',
503
+ oracle: 'aztec_utl_getL1ToL2MembershipWitnessV2',
494
504
  inputs,
495
- handler: ([contractAddress, messageHash, secret]) =>
496
- this.handlerAsUtility().getL1ToL2MembershipWitness(contractAddress, messageHash, secret),
505
+ handler: ([messageHash, nullifier]) =>
506
+ this.handlerAsUtility().getL1ToL2MembershipWitnessV2(messageHash, nullifier),
497
507
  });
498
508
  }
499
509
 
@@ -571,6 +581,16 @@ export class RPCTranslator {
571
581
  });
572
582
  }
573
583
 
584
+ // eslint-disable-next-line camelcase
585
+ aztec_utl_areBlockHashesInArchive(...inputs: ForeignCallArgs) {
586
+ return callTxeHandler({
587
+ oracle: 'aztec_utl_areBlockHashesInArchive',
588
+ inputs,
589
+ handler: ([anchorBlockHash, blockHashes]) =>
590
+ this.handlerAsUtility().areBlockHashesInArchive(anchorBlockHash, blockHashes),
591
+ });
592
+ }
593
+
574
594
  // eslint-disable-next-line camelcase
575
595
  aztec_utl_getLowNullifierMembershipWitness(...inputs: ForeignCallArgs) {
576
596
  return callTxeHandler({
@@ -622,6 +642,15 @@ export class RPCTranslator {
622
642
  });
623
643
  }
624
644
 
645
+ // eslint-disable-next-line camelcase
646
+ aztec_utl_getTxEffects(...inputs: ForeignCallArgs) {
647
+ return callTxeHandler({
648
+ oracle: 'aztec_utl_getTxEffects',
649
+ inputs,
650
+ handler: ([txHashes]) => this.handlerAsUtility().getTxEffects(txHashes),
651
+ });
652
+ }
653
+
625
654
  // eslint-disable-next-line camelcase
626
655
  aztec_utl_setCapsule(...inputs: ForeignCallArgs) {
627
656
  return callTxeHandler({
@@ -20,7 +20,6 @@ import {
20
20
  RecipientTaggingStore,
21
21
  SenderTaggingStore,
22
22
  TaggingSecretSourcesStore,
23
- type TaggingSecretStrategy,
24
23
  composeHooks,
25
24
  } from '@aztec/pxe/server';
26
25
  import {
@@ -58,9 +57,13 @@ import { z } from 'zod';
58
57
 
59
58
  import { DEFAULT_ADDRESS, MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY, MAX_OFFCHAIN_EFFECT_LEN } from './constants.js';
60
59
  import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
60
+ import {
61
+ type TXETaggingSecretStrategies,
62
+ makeResolveTaggingSecretStrategyHook,
63
+ } from './oracle/tagging_secret_strategy.js';
61
64
  import { TXEOraclePublicContext } from './oracle/txe_oracle_public_context.js';
62
65
  import { callTxeLegacyHandler } from './oracle/txe_oracle_registry.js';
63
- import { TXEOracleTopLevelContext } from './oracle/txe_oracle_top_level_context.js';
66
+ import { TXEOracleTopLevelContext, authorizeAllUtilityCallsHook } from './oracle/txe_oracle_top_level_context.js';
64
67
  import { TXE_ORACLE_VERSION_MAJOR, TXE_ORACLE_VERSION_MINOR } from './oracle/txe_oracle_version.js';
65
68
  import { TXEPrivateExecutionOracle } from './oracle/txe_private_execution_oracle.js';
66
69
  import { RPCTranslator, UnavailableOracleError } from './rpc_translator.js';
@@ -237,7 +240,8 @@ function emptyLastCallState(): LastCallState {
237
240
  export class TXESession implements TXESessionStateHandler {
238
241
  private state: SessionState = { name: 'TOP_LEVEL' };
239
242
  private authwits: Map<string, AuthWitness> = new Map();
240
- private taggingSecretStrategy: TaggingSecretStrategy | undefined = undefined;
243
+ private taggingSecretStrategies: TXETaggingSecretStrategies = new Map();
244
+ private authorizeAllUtilityCallTargets = false;
241
245
  private lastCallInfo: LastCallState = emptyLastCallState();
242
246
  private txeOracleVersion: { major: number; minor: number } | undefined;
243
247
 
@@ -365,7 +369,8 @@ export class TXESession implements TXESessionStateHandler {
365
369
  version,
366
370
  chainId,
367
371
  new Map(),
368
- undefined,
372
+ new Map(),
373
+ false, // authorizeAllUtilityCallTargets
369
374
  artifactResolver,
370
375
  rootPath,
371
376
  packageName,
@@ -695,7 +700,8 @@ export class TXESession implements TXESessionStateHandler {
695
700
  this.version,
696
701
  this.chainId,
697
702
  this.authwits,
698
- this.taggingSecretStrategy,
703
+ this.taggingSecretStrategies,
704
+ this.authorizeAllUtilityCallTargets,
699
705
  this.artifactResolver,
700
706
  this.rootPath,
701
707
  this.packageName,
@@ -745,7 +751,6 @@ export class TXESession implements TXESessionStateHandler {
745
751
  this.stateMachine.contractClassService,
746
752
  anchorBlock!,
747
753
  );
748
- const taggingSecretStrategy = this.taggingSecretStrategy;
749
754
  this.oracleHandler = new TXEPrivateExecutionOracle({
750
755
  argsHash: Fr.ZERO,
751
756
  txContext: new TxContext(this.chainId, this.version, gasSettings),
@@ -776,7 +781,8 @@ export class TXESession implements TXESessionStateHandler {
776
781
  txResolver: this.stateMachine.txResolver,
777
782
  simulator: new WASMSimulator(),
778
783
  hooks: composeHooks({
779
- resolveTaggingSecretStrategy: taggingSecretStrategy ? () => Promise.resolve(taggingSecretStrategy) : undefined,
784
+ resolveTaggingSecretStrategy: makeResolveTaggingSecretStrategyHook(this.taggingSecretStrategies),
785
+ authorizeUtilityCall: this.authorizeAllUtilityCallTargets ? authorizeAllUtilityCallsHook : undefined,
780
786
  }),
781
787
  transientArrayService,
782
788
  });
@@ -877,6 +883,9 @@ export class TXESession implements TXESessionStateHandler {
877
883
  scopes: await this.keyStore.getAccounts(),
878
884
  simulator: new WASMSimulator(),
879
885
  utilityExecutor: this.utilityExecutorForContractSync(anchorBlockHeader),
886
+ hooks: composeHooks({
887
+ authorizeUtilityCall: this.authorizeAllUtilityCallTargets ? authorizeAllUtilityCallsHook : undefined,
888
+ }),
880
889
  // Execution-tree root (top-level utility run): own store; nested frames inherit it.
881
890
  transientArrayService: new TransientArrayService(),
882
891
  });
@@ -899,15 +908,18 @@ export class TXESession implements TXESessionStateHandler {
899
908
  // accounts to PXE (via `addAccount`), etc. This is a slight inconsistency in the working model of this class, but
900
909
  // is not too bad. The `close` call below therefore only hands back the session-scoped values that a test
901
910
  // sets directly at the top level, outside any contract execution (e.g. via `advanceTimestampBy`,
902
- // `addAuthWitness`, `setTaggingSecretStrategy`). The oracle handler is discarded on every state transition,
911
+ // `addAuthWitness`, `setTaggingSecretStrategies`). The oracle handler is discarded on every state transition,
903
912
  // so the session must seed these values into the contexts it creates later.
904
913
 
905
914
  // TODO: persisting authwits this way is quite unfortunate: they create a temporary utility context that would
906
915
  // otherwise reset them, so we'd not be able to pass more than one per execution. Ideally authwits would be passed
907
916
  // alongside a contract call instead of pre-seeded.
908
- [this.nextBlockTimestamp, this.authwits, this.taggingSecretStrategy] = (
909
- this.oracleHandler as TXEOracleTopLevelContext
910
- ).close();
917
+ ({
918
+ nextBlockTimestamp: this.nextBlockTimestamp,
919
+ authwits: this.authwits,
920
+ taggingSecretStrategies: this.taggingSecretStrategies,
921
+ authorizeAllUtilityCallTargets: this.authorizeAllUtilityCallTargets,
922
+ } = (this.oracleHandler as TXEOracleTopLevelContext).close());
911
923
  }
912
924
 
913
925
  private async exitPrivateState() {