@aztec/txe 4.0.0-nightly.20250907 → 4.0.0-nightly.20260108

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 (100) hide show
  1. package/dest/bin/index.d.ts +1 -1
  2. package/dest/bin/index.js +1 -1
  3. package/dest/constants.d.ts +3 -0
  4. package/dest/constants.d.ts.map +1 -0
  5. package/dest/constants.js +2 -0
  6. package/dest/index.d.ts +1 -1
  7. package/dest/index.d.ts.map +1 -1
  8. package/dest/index.js +8 -4
  9. package/dest/oracle/interfaces.d.ts +57 -0
  10. package/dest/oracle/interfaces.d.ts.map +1 -0
  11. package/dest/oracle/interfaces.js +3 -0
  12. package/dest/oracle/txe_oracle_public_context.d.ts +12 -12
  13. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  14. package/dest/oracle/txe_oracle_public_context.js +30 -34
  15. package/dest/oracle/txe_oracle_top_level_context.d.ts +65 -0
  16. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -0
  17. package/dest/oracle/txe_oracle_top_level_context.js +463 -0
  18. package/dest/rpc_translator.d.ts +246 -0
  19. package/dest/rpc_translator.d.ts.map +1 -0
  20. package/dest/{txe_service/txe_service.js → rpc_translator.js} +201 -124
  21. package/dest/state_machine/archiver.d.ts +34 -13
  22. package/dest/state_machine/archiver.d.ts.map +1 -1
  23. package/dest/state_machine/archiver.js +111 -16
  24. package/dest/state_machine/dummy_p2p_client.d.ts +5 -2
  25. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  26. package/dest/state_machine/dummy_p2p_client.js +9 -1
  27. package/dest/state_machine/global_variable_builder.d.ts +6 -17
  28. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  29. package/dest/state_machine/global_variable_builder.js +16 -23
  30. package/dest/state_machine/index.d.ts +5 -5
  31. package/dest/state_machine/index.d.ts.map +1 -1
  32. package/dest/state_machine/index.js +17 -21
  33. package/dest/state_machine/mock_epoch_cache.d.ts +6 -5
  34. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  35. package/dest/state_machine/mock_epoch_cache.js +8 -7
  36. package/dest/state_machine/synchronizer.d.ts +5 -4
  37. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  38. package/dest/state_machine/synchronizer.js +5 -4
  39. package/dest/txe_session.d.ts +42 -46
  40. package/dest/txe_session.d.ts.map +1 -1
  41. package/dest/txe_session.js +241 -93
  42. package/dest/util/encoding.d.ts +623 -24
  43. package/dest/util/encoding.d.ts.map +1 -1
  44. package/dest/util/encoding.js +1 -1
  45. package/dest/util/expected_failure_error.d.ts +1 -1
  46. package/dest/util/expected_failure_error.d.ts.map +1 -1
  47. package/dest/util/txe_account_store.d.ts +10 -0
  48. package/dest/util/txe_account_store.d.ts.map +1 -0
  49. package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
  50. package/dest/util/txe_contract_store.d.ts +12 -0
  51. package/dest/util/txe_contract_store.d.ts.map +1 -0
  52. package/dest/util/{txe_contract_data_provider.js → txe_contract_store.js} +4 -4
  53. package/dest/util/txe_public_contract_data_source.d.ts +8 -6
  54. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  55. package/dest/util/txe_public_contract_data_source.js +14 -12
  56. package/dest/utils/block_creation.d.ts +28 -0
  57. package/dest/utils/block_creation.d.ts.map +1 -0
  58. package/dest/utils/block_creation.js +45 -0
  59. package/dest/utils/tx_effect_creation.d.ts +6 -0
  60. package/dest/utils/tx_effect_creation.d.ts.map +1 -0
  61. package/dest/utils/tx_effect_creation.js +16 -0
  62. package/package.json +18 -17
  63. package/src/bin/index.ts +1 -1
  64. package/src/constants.ts +3 -0
  65. package/src/index.ts +20 -20
  66. package/src/oracle/interfaces.ts +86 -0
  67. package/src/oracle/txe_oracle_public_context.ts +37 -75
  68. package/src/oracle/txe_oracle_top_level_context.ts +716 -0
  69. package/src/{txe_service/txe_service.ts → rpc_translator.ts} +261 -125
  70. package/src/state_machine/archiver.ts +147 -29
  71. package/src/state_machine/dummy_p2p_client.ts +13 -2
  72. package/src/state_machine/global_variable_builder.ts +25 -42
  73. package/src/state_machine/index.ts +24 -21
  74. package/src/state_machine/mock_epoch_cache.ts +12 -11
  75. package/src/state_machine/synchronizer.ts +8 -7
  76. package/src/txe_session.ts +416 -115
  77. package/src/util/encoding.ts +1 -1
  78. package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
  79. package/src/util/{txe_contract_data_provider.ts → txe_contract_store.ts} +5 -4
  80. package/src/util/txe_public_contract_data_source.ts +16 -13
  81. package/src/utils/block_creation.ts +94 -0
  82. package/src/utils/tx_effect_creation.ts +38 -0
  83. package/dest/oracle/txe_oracle.d.ts +0 -124
  84. package/dest/oracle/txe_oracle.d.ts.map +0 -1
  85. package/dest/oracle/txe_oracle.js +0 -770
  86. package/dest/oracle/txe_typed_oracle.d.ts +0 -42
  87. package/dest/oracle/txe_typed_oracle.d.ts.map +0 -1
  88. package/dest/oracle/txe_typed_oracle.js +0 -83
  89. package/dest/txe_constants.d.ts +0 -2
  90. package/dest/txe_constants.d.ts.map +0 -1
  91. package/dest/txe_constants.js +0 -7
  92. package/dest/txe_service/txe_service.d.ts +0 -231
  93. package/dest/txe_service/txe_service.d.ts.map +0 -1
  94. package/dest/util/txe_account_data_provider.d.ts +0 -10
  95. package/dest/util/txe_account_data_provider.d.ts.map +0 -1
  96. package/dest/util/txe_contract_data_provider.d.ts +0 -11
  97. package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
  98. package/src/oracle/txe_oracle.ts +0 -1287
  99. package/src/oracle/txe_typed_oracle.ts +0 -142
  100. package/src/txe_constants.ts +0 -9
@@ -1,11 +1,19 @@
1
- import { type ContractInstanceWithAddress, Fr, Point } from '@aztec/aztec.js';
2
- import { packAsRetrievedNote } from '@aztec/pxe/simulator';
3
- import { type ContractArtifact, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
1
+ import type { ContractInstanceWithAddress } from '@aztec/aztec.js/contracts';
2
+ import { Fr, Point } from '@aztec/aztec.js/fields';
3
+ import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
4
+ import { BlockNumber } from '@aztec/foundation/branded-types';
5
+ import {
6
+ type IMiscOracle,
7
+ type IPrivateExecutionOracle,
8
+ type IUtilityExecutionOracle,
9
+ packAsRetrievedNote,
10
+ } from '@aztec/pxe/simulator';
11
+ import { type ContractArtifact, EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
4
12
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
13
  import { MerkleTreeId } from '@aztec/stdlib/trees';
6
14
 
7
- import type { TXETypedOracle } from '../oracle/txe_typed_oracle.js';
8
- import type { TXESessionStateHandler } from '../txe_session.js';
15
+ import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
16
+ import type { TXESessionStateHandler } from './txe_session.js';
9
17
  import {
10
18
  type ForeignCallArray,
11
19
  type ForeignCallSingle,
@@ -20,11 +28,20 @@ import {
20
28
  toArray,
21
29
  toForeignCallResult,
22
30
  toSingle,
23
- } from '../util/encoding.js';
31
+ } from './util/encoding.js';
32
+
33
+ const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
34
+ const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
35
+
36
+ export class UnavailableOracleError extends Error {
37
+ constructor(oracleName: string) {
38
+ super(`${oracleName} oracles not available with the current handler`);
39
+ }
40
+ }
24
41
 
25
- export class TXEService {
42
+ export class RPCTranslator {
26
43
  /**
27
- * Create a new instance of `TXEService` that will translate all TXE RPC calls to and from the foreign
44
+ * Create a new instance of `RPCTranslator` that will translate all TXE RPC calls to and from the foreign
28
45
  * (`ForeignCallSingle`, `ForeignCallResult`, etc.) and native TS types, delegating actual execution of the oracles
29
46
  * to the different handlers.
30
47
  * @param stateHandler The handler that will process TXE session state transitions, such as entering a private or
@@ -34,13 +51,61 @@ export class TXEService {
34
51
  */
35
52
  constructor(
36
53
  private stateHandler: TXESessionStateHandler,
37
- private oracleHandler: TXETypedOracle,
54
+ private oracleHandler:
55
+ | IMiscOracle
56
+ | IUtilityExecutionOracle
57
+ | IPrivateExecutionOracle
58
+ | IAvmExecutionOracle
59
+ | ITxeExecutionOracle,
38
60
  ) {}
39
61
 
62
+ // Note: If you rename the following functions to not start with "handlerAs", you must also update the validation
63
+ // check in `TXESession.processFunction`.
64
+
65
+ private handlerAsMisc(): IMiscOracle {
66
+ if (!('isMisc' in this.oracleHandler)) {
67
+ throw new UnavailableOracleError('Misc');
68
+ }
69
+
70
+ return this.oracleHandler;
71
+ }
72
+
73
+ private handlerAsUtility(): IUtilityExecutionOracle {
74
+ if (!('isUtility' in this.oracleHandler)) {
75
+ throw new UnavailableOracleError('Utility');
76
+ }
77
+
78
+ return this.oracleHandler;
79
+ }
80
+
81
+ private handlerAsPrivate(): IPrivateExecutionOracle {
82
+ if (!('isPrivate' in this.oracleHandler)) {
83
+ throw new UnavailableOracleError('Private');
84
+ }
85
+
86
+ return this.oracleHandler;
87
+ }
88
+
89
+ private handlerAsAvm(): IAvmExecutionOracle {
90
+ if (!('isAvm' in this.oracleHandler)) {
91
+ throw new UnavailableOracleError('Avm');
92
+ }
93
+
94
+ return this.oracleHandler;
95
+ }
96
+
97
+ private handlerAsTxe(): ITxeExecutionOracle {
98
+ if (!('isTxe' in this.oracleHandler)) {
99
+ throw new UnavailableOracleError('Txe');
100
+ }
101
+
102
+ return this.oracleHandler;
103
+ }
104
+
40
105
  // TXE session state transition functions - these get handled by the state handler
41
106
 
42
107
  async txeSetTopLevelTXEContext() {
43
- await this.stateHandler.setTopLevelContext();
108
+ await this.stateHandler.enterTopLevelState();
44
109
 
45
110
  return toForeignCallResult([]);
46
111
  }
@@ -48,18 +113,18 @@ export class TXEService {
48
113
  async txeSetPrivateTXEContext(
49
114
  foreignContractAddressIsSome: ForeignCallSingle,
50
115
  foreignContractAddressValue: ForeignCallSingle,
51
- foreignHistoricalBlockNumberIsSome: ForeignCallSingle,
52
- foreignHistoricalBlockNumberValue: ForeignCallSingle,
116
+ foreignAnchorBlockNumberIsSome: ForeignCallSingle,
117
+ foreignAnchorBlockNumberValue: ForeignCallSingle,
53
118
  ) {
54
119
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool()
55
120
  ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
56
121
  : undefined;
57
122
 
58
- const historicalBlockNumber = fromSingle(foreignHistoricalBlockNumberIsSome).toBool()
59
- ? fromSingle(foreignHistoricalBlockNumberValue).toNumber()
123
+ const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool()
124
+ ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber())
60
125
  : undefined;
61
126
 
62
- const privateContextInputs = await this.stateHandler.setPrivateContext(contractAddress, historicalBlockNumber);
127
+ const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
63
128
 
64
129
  return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
65
130
  }
@@ -72,7 +137,7 @@ export class TXEService {
72
137
  ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
73
138
  : undefined;
74
139
 
75
- await this.stateHandler.setPublicContext(contractAddress);
140
+ await this.stateHandler.enterPublicState(contractAddress);
76
141
 
77
142
  return toForeignCallResult([]);
78
143
  }
@@ -85,7 +150,7 @@ export class TXEService {
85
150
  ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
86
151
  : undefined;
87
152
 
88
- await this.stateHandler.setUtilityContext(contractAddress);
153
+ await this.stateHandler.enterUtilityState(contractAddress);
89
154
 
90
155
  return toForeignCallResult([]);
91
156
  }
@@ -94,10 +159,28 @@ export class TXEService {
94
159
 
95
160
  // TXE-specific oracles
96
161
 
162
+ txeGetDefaultAddress() {
163
+ const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
164
+
165
+ return toForeignCallResult([toSingle(defaultAddress)]);
166
+ }
167
+
168
+ async txeGetNextBlockNumber() {
169
+ const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
170
+
171
+ return toForeignCallResult([toSingle(nextBlockNumber)]);
172
+ }
173
+
174
+ async txeGetNextBlockTimestamp() {
175
+ const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
176
+
177
+ return toForeignCallResult([toSingle(nextBlockTimestamp)]);
178
+ }
179
+
97
180
  async txeAdvanceBlocksBy(foreignBlocks: ForeignCallSingle) {
98
181
  const blocks = fromSingle(foreignBlocks).toNumber();
99
182
 
100
- await this.oracleHandler.txeAdvanceBlocksBy(blocks);
183
+ await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
101
184
 
102
185
  return toForeignCallResult([]);
103
186
  }
@@ -105,7 +188,7 @@ export class TXEService {
105
188
  txeAdvanceTimestampBy(foreignDuration: ForeignCallSingle) {
106
189
  const duration = fromSingle(foreignDuration).toBigInt();
107
190
 
108
- this.oracleHandler.txeAdvanceTimestampBy(duration);
191
+ this.handlerAsTxe().txeAdvanceTimestampBy(duration);
109
192
 
110
193
  return toForeignCallResult([]);
111
194
  }
@@ -113,7 +196,7 @@ export class TXEService {
113
196
  async txeDeploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, foreignSecret: ForeignCallSingle) {
114
197
  const secret = fromSingle(foreignSecret);
115
198
 
116
- await this.oracleHandler.txeDeploy(artifact, instance, secret);
199
+ await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
117
200
 
118
201
  return toForeignCallResult([
119
202
  toArray([
@@ -129,7 +212,7 @@ export class TXEService {
129
212
  async txeCreateAccount(foreignSecret: ForeignCallSingle) {
130
213
  const secret = fromSingle(foreignSecret);
131
214
 
132
- const completeAddress = await this.oracleHandler.txeCreateAccount(secret);
215
+ const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
133
216
 
134
217
  return toForeignCallResult([
135
218
  toSingle(completeAddress.address),
@@ -144,7 +227,7 @@ export class TXEService {
144
227
  ) {
145
228
  const secret = fromSingle(foreignSecret);
146
229
 
147
- const completeAddress = await this.oracleHandler.txeAddAccount(artifact, instance, secret);
230
+ const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
148
231
 
149
232
  return toForeignCallResult([
150
233
  toSingle(completeAddress.address),
@@ -156,7 +239,7 @@ export class TXEService {
156
239
  const address = addressFromSingle(foreignAddress);
157
240
  const messageHash = fromSingle(foreignMessageHash);
158
241
 
159
- await this.oracleHandler.txeAddAuthWitness(address, messageHash);
242
+ await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
160
243
 
161
244
  return toForeignCallResult([]);
162
245
  }
@@ -166,52 +249,71 @@ export class TXEService {
166
249
  utilityAssertCompatibleOracleVersion(foreignVersion: ForeignCallSingle) {
167
250
  const version = fromSingle(foreignVersion).toNumber();
168
251
 
169
- this.oracleHandler.utilityAssertCompatibleOracleVersion(version);
252
+ this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
170
253
 
171
254
  return toForeignCallResult([]);
172
255
  }
173
256
 
174
257
  utilityGetRandomField() {
175
- const randomField = this.oracleHandler.utilityGetRandomField();
258
+ const randomField = this.handlerAsMisc().utilityGetRandomField();
176
259
 
177
260
  return toForeignCallResult([toSingle(randomField)]);
178
261
  }
179
262
 
180
- async utilityGetContractAddress() {
181
- const contractAddress = await this.oracleHandler.utilityGetContractAddress();
263
+ async txeGetLastBlockTimestamp() {
264
+ const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
182
265
 
183
- return toForeignCallResult([toSingle(contractAddress.toField())]);
266
+ return toForeignCallResult([toSingle(new Fr(timestamp))]);
184
267
  }
185
268
 
186
- async utilityGetBlockNumber() {
187
- const blockNumber = await this.oracleHandler.utilityGetBlockNumber();
269
+ async txeGetLastTxEffects() {
270
+ const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
188
271
 
189
- return toForeignCallResult([toSingle(new Fr(blockNumber))]);
272
+ return toForeignCallResult([
273
+ toSingle(txHash.hash),
274
+ ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
275
+ ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX),
276
+ ]);
190
277
  }
191
278
 
192
- // seems to be used to mean the timestamp of the last mined block in txe (but that's not what is done here)
193
- async utilityGetTimestamp() {
194
- const timestamp = await this.oracleHandler.utilityGetTimestamp();
279
+ async txeGetPrivateEvents(
280
+ foreignSelector: ForeignCallSingle,
281
+ foreignContractAddress: ForeignCallSingle,
282
+ foreignScope: ForeignCallSingle,
283
+ ) {
284
+ const selector = EventSelector.fromField(fromSingle(foreignSelector));
285
+ const contractAddress = addressFromSingle(foreignContractAddress);
286
+ const scope = addressFromSingle(foreignScope);
195
287
 
196
- return toForeignCallResult([toSingle(new Fr(timestamp))]);
197
- }
288
+ const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
198
289
 
199
- async txeGetLastBlockTimestamp() {
200
- const timestamp = await this.oracleHandler.txeGetLastBlockTimestamp();
290
+ if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
291
+ throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
292
+ }
201
293
 
202
- return toForeignCallResult([toSingle(new Fr(timestamp))]);
294
+ if (events.some(e => e.length > MAX_EVENT_LEN)) {
295
+ throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
296
+ }
297
+
298
+ // This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
299
+ // multidimensional array in get_private_events_oracle and create the BoundedVecs here.
300
+ const rawArrayStorage = events
301
+ .map(e => e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0))))
302
+ .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0))))
303
+ .flat();
304
+ const eventLengths = events
305
+ .map(e => new Fr(e.length))
306
+ .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
307
+ const queryLength = new Fr(events.length);
308
+
309
+ return toForeignCallResult([toArray(rawArrayStorage), toArray(eventLengths), toSingle(queryLength)]);
203
310
  }
204
311
 
205
- // Since the argument is a slice, noir automatically adds a length field to oracle call.
206
- privateStoreInExecutionCache(
207
- _foreignLength: ForeignCallSingle,
208
- foreignValues: ForeignCallArray,
209
- foreignHash: ForeignCallSingle,
210
- ) {
312
+ privateStoreInExecutionCache(foreignValues: ForeignCallArray, foreignHash: ForeignCallSingle) {
211
313
  const values = fromArray(foreignValues);
212
314
  const hash = fromSingle(foreignHash);
213
315
 
214
- this.oracleHandler.privateStoreInExecutionCache(values, hash);
316
+ this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
215
317
 
216
318
  return toForeignCallResult([]);
217
319
  }
@@ -219,23 +321,26 @@ export class TXEService {
219
321
  async privateLoadFromExecutionCache(foreignHash: ForeignCallSingle) {
220
322
  const hash = fromSingle(foreignHash);
221
323
 
222
- const returns = await this.oracleHandler.privateLoadFromExecutionCache(hash);
324
+ const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
223
325
 
224
326
  return toForeignCallResult([toArray(returns)]);
225
327
  }
226
328
 
227
- // Since the argument is a slice, noir automatically adds a length field to oracle call.
329
+ // When the argument is a slice, noir automatically adds a length field to oracle call.
330
+ // When the argument is an array, we add the field length manually to the signature.
228
331
  utilityDebugLog(
332
+ foreignLevel: ForeignCallSingle,
229
333
  foreignMessage: ForeignCallArray,
230
334
  _foreignLength: ForeignCallSingle,
231
335
  foreignFields: ForeignCallArray,
232
336
  ) {
337
+ const level = fromSingle(foreignLevel).toNumber();
233
338
  const message = fromArray(foreignMessage)
234
339
  .map(field => String.fromCharCode(field.toNumber()))
235
340
  .join('');
236
341
  const fields = fromArray(foreignFields);
237
342
 
238
- this.oracleHandler.utilityDebugLog(message, fields);
343
+ this.handlerAsMisc().utilityDebugLog(level, message, fields);
239
344
 
240
345
  return toForeignCallResult([]);
241
346
  }
@@ -248,10 +353,10 @@ export class TXEService {
248
353
  ) {
249
354
  const contractAddress = addressFromSingle(foreignContractAddress);
250
355
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
251
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
356
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
252
357
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
253
358
 
254
- const values = await this.oracleHandler.utilityStorageRead(
359
+ const values = await this.handlerAsUtility().utilityStorageRead(
255
360
  contractAddress,
256
361
  startStorageSlot,
257
362
  blockNumber,
@@ -262,10 +367,10 @@ export class TXEService {
262
367
  }
263
368
 
264
369
  async utilityGetPublicDataWitness(foreignBlockNumber: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
265
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
370
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
266
371
  const leafSlot = fromSingle(foreignLeafSlot);
267
372
 
268
- const witness = await this.oracleHandler.utilityGetPublicDataWitness(blockNumber, leafSlot);
373
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
269
374
 
270
375
  if (!witness) {
271
376
  throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
@@ -274,6 +379,8 @@ export class TXEService {
274
379
  }
275
380
 
276
381
  async utilityGetNotes(
382
+ foreignOwnerIsSome: ForeignCallSingle,
383
+ foreignOwnerValue: ForeignCallSingle,
277
384
  foreignStorageSlot: ForeignCallSingle,
278
385
  foreignNumSelects: ForeignCallSingle,
279
386
  foreignSelectByIndexes: ForeignCallArray,
@@ -291,6 +398,10 @@ export class TXEService {
291
398
  foreignMaxNotes: ForeignCallSingle,
292
399
  foreignPackedRetrievedNoteLength: ForeignCallSingle,
293
400
  ) {
401
+ // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
402
+ const owner = fromSingle(foreignOwnerIsSome).toBool()
403
+ ? AztecAddress.fromField(fromSingle(foreignOwnerValue))
404
+ : undefined;
294
405
  const storageSlot = fromSingle(foreignStorageSlot);
295
406
  const numSelects = fromSingle(foreignNumSelects).toNumber();
296
407
  const selectByIndexes = fromArray(foreignSelectByIndexes).map(fr => fr.toNumber());
@@ -308,7 +419,8 @@ export class TXEService {
308
419
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
309
420
  const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
310
421
 
311
- const noteDatas = await this.oracleHandler.utilityGetNotes(
422
+ const noteDatas = await this.handlerAsUtility().utilityGetNotes(
423
+ owner,
312
424
  storageSlot,
313
425
  numSelects,
314
426
  selectByIndexes,
@@ -325,7 +437,17 @@ export class TXEService {
325
437
  status,
326
438
  );
327
439
 
328
- const returnDataAsArrayOfArrays = noteDatas.map(packAsRetrievedNote);
440
+ const returnDataAsArrayOfArrays = noteDatas.map(noteData =>
441
+ packAsRetrievedNote({
442
+ contractAddress: noteData.contractAddress,
443
+ owner: noteData.owner,
444
+ randomness: noteData.randomness,
445
+ storageSlot: noteData.storageSlot,
446
+ noteNonce: noteData.noteNonce,
447
+ index: noteData.index,
448
+ note: noteData.note,
449
+ }),
450
+ );
329
451
 
330
452
  // Now we convert each sub-array to an array of ForeignCallSingles
331
453
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map(subArray =>
@@ -343,19 +465,31 @@ export class TXEService {
343
465
  }
344
466
 
345
467
  privateNotifyCreatedNote(
468
+ foreignOwner: ForeignCallSingle,
346
469
  foreignStorageSlot: ForeignCallSingle,
470
+ foreignRandomness: ForeignCallSingle,
347
471
  foreignNoteTypeId: ForeignCallSingle,
348
472
  foreignNote: ForeignCallArray,
349
473
  foreignNoteHash: ForeignCallSingle,
350
474
  foreignCounter: ForeignCallSingle,
351
475
  ) {
476
+ const owner = addressFromSingle(foreignOwner);
352
477
  const storageSlot = fromSingle(foreignStorageSlot);
478
+ const randomness = fromSingle(foreignRandomness);
353
479
  const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
354
480
  const note = fromArray(foreignNote);
355
481
  const noteHash = fromSingle(foreignNoteHash);
356
482
  const counter = fromSingle(foreignCounter).toNumber();
357
483
 
358
- this.oracleHandler.privateNotifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter);
484
+ this.handlerAsPrivate().privateNotifyCreatedNote(
485
+ owner,
486
+ storageSlot,
487
+ randomness,
488
+ noteTypeId,
489
+ note,
490
+ noteHash,
491
+ counter,
492
+ );
359
493
 
360
494
  return toForeignCallResult([]);
361
495
  }
@@ -369,7 +503,7 @@ export class TXEService {
369
503
  const noteHash = fromSingle(foreignNoteHash);
370
504
  const counter = fromSingle(foreignCounter).toNumber();
371
505
 
372
- await this.oracleHandler.privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
506
+ await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
373
507
 
374
508
  return toForeignCallResult([]);
375
509
  }
@@ -377,7 +511,7 @@ export class TXEService {
377
511
  async privateNotifyCreatedNullifier(foreignInnerNullifier: ForeignCallSingle) {
378
512
  const innerNullifier = fromSingle(foreignInnerNullifier);
379
513
 
380
- await this.oracleHandler.privateNotifyCreatedNullifier(innerNullifier);
514
+ await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
381
515
 
382
516
  return toForeignCallResult([]);
383
517
  }
@@ -385,7 +519,7 @@ export class TXEService {
385
519
  async utilityCheckNullifierExists(foreignInnerNullifier: ForeignCallSingle) {
386
520
  const innerNullifier = fromSingle(foreignInnerNullifier);
387
521
 
388
- const exists = await this.oracleHandler.utilityCheckNullifierExists(innerNullifier);
522
+ const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
389
523
 
390
524
  return toForeignCallResult([toSingle(new Fr(exists))]);
391
525
  }
@@ -393,7 +527,7 @@ export class TXEService {
393
527
  async utilityGetContractInstance(foreignAddress: ForeignCallSingle) {
394
528
  const address = addressFromSingle(foreignAddress);
395
529
 
396
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
530
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
397
531
 
398
532
  return toForeignCallResult(
399
533
  [
@@ -409,7 +543,7 @@ export class TXEService {
409
543
  async utilityGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
410
544
  const address = addressFromSingle(foreignAddress);
411
545
 
412
- const { publicKeys, partialAddress } = await this.oracleHandler.utilityGetCompleteAddress(address);
546
+ const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
413
547
 
414
548
  return toForeignCallResult([toArray([...publicKeys.toFields(), partialAddress])]);
415
549
  }
@@ -417,7 +551,7 @@ export class TXEService {
417
551
  async utilityGetKeyValidationRequest(foreignPkMHash: ForeignCallSingle) {
418
552
  const pkMHash = fromSingle(foreignPkMHash);
419
553
 
420
- const keyValidationRequest = await this.oracleHandler.utilityGetKeyValidationRequest(pkMHash);
554
+ const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
421
555
 
422
556
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
423
557
  }
@@ -438,10 +572,10 @@ export class TXEService {
438
572
  foreignBlockNumber: ForeignCallSingle,
439
573
  foreignNullifier: ForeignCallSingle,
440
574
  ) {
441
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
575
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
442
576
  const nullifier = fromSingle(foreignNullifier);
443
577
 
444
- const witness = await this.oracleHandler.utilityGetNullifierMembershipWitness(blockNumber, nullifier);
578
+ const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
445
579
 
446
580
  if (!witness) {
447
581
  throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
@@ -452,7 +586,7 @@ export class TXEService {
452
586
  async utilityGetAuthWitness(foreignMessageHash: ForeignCallSingle) {
453
587
  const messageHash = fromSingle(foreignMessageHash);
454
588
 
455
- const authWitness = await this.oracleHandler.utilityGetAuthWitness(messageHash);
589
+ const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
456
590
 
457
591
  if (!authWitness) {
458
592
  throw new Error(`Auth witness not found for message hash ${messageHash}.`);
@@ -482,22 +616,22 @@ export class TXEService {
482
616
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
483
617
  }
484
618
 
485
- async utilityGetChainId() {
486
- const chainId = await this.oracleHandler.utilityGetChainId();
487
-
488
- return toForeignCallResult([toSingle(chainId)]);
619
+ public async privateIsSideEffectCounterRevertible(foreignSideEffectCounter: ForeignCallSingle) {
620
+ const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
621
+ const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
622
+ return toForeignCallResult([toSingle(new Fr(isRevertible))]);
489
623
  }
490
624
 
491
- async utilityGetVersion() {
492
- const version = await this.oracleHandler.utilityGetVersion();
625
+ utilityGetUtilityContext() {
626
+ const context = this.handlerAsUtility().utilityGetUtilityContext();
493
627
 
494
- return toForeignCallResult([toSingle(version)]);
628
+ return toForeignCallResult(context.toNoirRepresentation());
495
629
  }
496
630
 
497
631
  async utilityGetBlockHeader(foreignBlockNumber: ForeignCallSingle) {
498
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
632
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
499
633
 
500
- const header = await this.oracleHandler.utilityGetBlockHeader(blockNumber);
634
+ const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
501
635
 
502
636
  if (!header) {
503
637
  throw new Error(`Block header not found for block ${blockNumber}.`);
@@ -510,11 +644,11 @@ export class TXEService {
510
644
  foreignTreeId: ForeignCallSingle,
511
645
  foreignLeafValue: ForeignCallSingle,
512
646
  ) {
513
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
647
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
514
648
  const treeId = fromSingle(foreignTreeId).toNumber();
515
649
  const leafValue = fromSingle(foreignLeafValue);
516
650
 
517
- const witness = await this.oracleHandler.utilityGetMembershipWitness(blockNumber, treeId, leafValue);
651
+ const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
518
652
 
519
653
  if (!witness) {
520
654
  throw new Error(
@@ -528,10 +662,10 @@ export class TXEService {
528
662
  foreignBlockNumber: ForeignCallSingle,
529
663
  foreignNullifier: ForeignCallSingle,
530
664
  ) {
531
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
665
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
532
666
  const nullifier = fromSingle(foreignNullifier);
533
667
 
534
- const witness = await this.oracleHandler.utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
668
+ const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
535
669
 
536
670
  if (!witness) {
537
671
  throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
@@ -539,19 +673,10 @@ export class TXEService {
539
673
  return toForeignCallResult(witness.toNoirRepresentation());
540
674
  }
541
675
 
542
- async utilityGetIndexedTaggingSecretAsSender(foreignSender: ForeignCallSingle, foreignRecipient: ForeignCallSingle) {
543
- const sender = AztecAddress.fromField(fromSingle(foreignSender));
544
- const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
545
-
546
- const secret = await this.oracleHandler.utilityGetIndexedTaggingSecretAsSender(sender, recipient);
547
-
548
- return toForeignCallResult(secret.toFields().map(toSingle));
549
- }
550
-
551
676
  async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot: ForeignCallSingle) {
552
677
  const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
553
678
 
554
- await this.oracleHandler.utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
679
+ await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
555
680
 
556
681
  return toForeignCallResult([]);
557
682
  }
@@ -565,7 +690,7 @@ export class TXEService {
565
690
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
566
691
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
567
692
 
568
- await this.oracleHandler.utilityValidateEnqueuedNotesAndEvents(
693
+ await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
569
694
  contractAddress,
570
695
  noteValidationRequestsArrayBaseSlot,
571
696
  eventValidationRequestsArrayBaseSlot,
@@ -583,7 +708,7 @@ export class TXEService {
583
708
  const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
584
709
  const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
585
710
 
586
- await this.oracleHandler.utilityBulkRetrieveLogs(
711
+ await this.handlerAsUtility().utilityBulkRetrieveLogs(
587
712
  contractAddress,
588
713
  logRetrievalRequestsArrayBaseSlot,
589
714
  logRetrievalResponsesArrayBaseSlot,
@@ -601,7 +726,7 @@ export class TXEService {
601
726
  const slot = fromSingle(foreignSlot);
602
727
  const capsule = fromArray(foreignCapsule);
603
728
 
604
- await this.oracleHandler.utilityStoreCapsule(contractAddress, slot, capsule);
729
+ await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
605
730
 
606
731
  return toForeignCallResult([]);
607
732
  }
@@ -615,7 +740,7 @@ export class TXEService {
615
740
  const slot = fromSingle(foreignSlot);
616
741
  const tSize = fromSingle(foreignTSize).toNumber();
617
742
 
618
- const values = await this.oracleHandler.utilityLoadCapsule(contractAddress, slot);
743
+ const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
619
744
 
620
745
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
621
746
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
@@ -632,7 +757,7 @@ export class TXEService {
632
757
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
633
758
  const slot = fromSingle(foreignSlot);
634
759
 
635
- await this.oracleHandler.utilityDeleteCapsule(contractAddress, slot);
760
+ await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
636
761
 
637
762
  return toForeignCallResult([]);
638
763
  }
@@ -648,7 +773,7 @@ export class TXEService {
648
773
  const dstSlot = fromSingle(foreignDstSlot);
649
774
  const numEntries = fromSingle(foreignNumEntries).toNumber();
650
775
 
651
- await this.oracleHandler.utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
776
+ await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
652
777
 
653
778
  return toForeignCallResult([]);
654
779
  }
@@ -667,7 +792,7 @@ export class TXEService {
667
792
  const iv = fromUintArray(foreignIv, 8);
668
793
  const symKey = fromUintArray(foreignSymKey, 8);
669
794
 
670
- const plaintextBuffer = await this.oracleHandler.utilityAes128Decrypt(ciphertext, iv, symKey);
795
+ const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
671
796
 
672
797
  return toForeignCallResult(
673
798
  arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length),
@@ -687,7 +812,7 @@ export class TXEService {
687
812
  fromSingle(foreignEphPKField2),
688
813
  ]);
689
814
 
690
- const secret = await this.oracleHandler.utilityGetSharedSecret(address, ephPK);
815
+ const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
691
816
 
692
817
  return toForeignCallResult(secret.toFields().map(toSingle));
693
818
  }
@@ -706,7 +831,7 @@ export class TXEService {
706
831
  async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle) {
707
832
  const slot = fromSingle(foreignSlot);
708
833
 
709
- const value = (await this.oracleHandler.avmOpcodeStorageRead(slot)).value;
834
+ const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
710
835
 
711
836
  return toForeignCallResult([toSingle(new Fr(value))]);
712
837
  }
@@ -715,7 +840,7 @@ export class TXEService {
715
840
  const slot = fromSingle(foreignSlot);
716
841
  const value = fromSingle(foreignValue);
717
842
 
718
- await this.oracleHandler.avmOpcodeStorageWrite(slot, value);
843
+ await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
719
844
 
720
845
  return toForeignCallResult([]);
721
846
  }
@@ -723,7 +848,7 @@ export class TXEService {
723
848
  async avmOpcodeGetContractInstanceDeployer(foreignAddress: ForeignCallSingle) {
724
849
  const address = addressFromSingle(foreignAddress);
725
850
 
726
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
851
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
727
852
 
728
853
  return toForeignCallResult([
729
854
  toSingle(instance.deployer),
@@ -735,7 +860,7 @@ export class TXEService {
735
860
  async avmOpcodeGetContractInstanceClassId(foreignAddress: ForeignCallSingle) {
736
861
  const address = addressFromSingle(foreignAddress);
737
862
 
738
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
863
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
739
864
 
740
865
  return toForeignCallResult([
741
866
  toSingle(instance.currentContractClassId),
@@ -747,7 +872,7 @@ export class TXEService {
747
872
  async avmOpcodeGetContractInstanceInitializationHash(foreignAddress: ForeignCallSingle) {
748
873
  const address = addressFromSingle(foreignAddress);
749
874
 
750
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
875
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
751
876
 
752
877
  return toForeignCallResult([
753
878
  toSingle(instance.initializationHash),
@@ -756,8 +881,8 @@ export class TXEService {
756
881
  ]);
757
882
  }
758
883
 
759
- avmOpcodeSender() {
760
- const sender = this.oracleHandler.getMsgSender();
884
+ async avmOpcodeSender() {
885
+ const sender = await this.handlerAsAvm().avmOpcodeSender();
761
886
 
762
887
  return toForeignCallResult([toSingle(sender)]);
763
888
  }
@@ -765,7 +890,7 @@ export class TXEService {
765
890
  async avmOpcodeEmitNullifier(foreignNullifier: ForeignCallSingle) {
766
891
  const nullifier = fromSingle(foreignNullifier);
767
892
 
768
- await this.oracleHandler.avmOpcodeEmitNullifier(nullifier);
893
+ await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
769
894
 
770
895
  return toForeignCallResult([]);
771
896
  }
@@ -773,7 +898,7 @@ export class TXEService {
773
898
  async avmOpcodeEmitNoteHash(foreignNoteHash: ForeignCallSingle) {
774
899
  const noteHash = fromSingle(foreignNoteHash);
775
900
 
776
- await this.oracleHandler.avmOpcodeEmitNoteHash(noteHash);
901
+ await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
777
902
 
778
903
  return toForeignCallResult([]);
779
904
  }
@@ -782,43 +907,43 @@ export class TXEService {
782
907
  const innerNullifier = fromSingle(foreignInnerNullifier);
783
908
  const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
784
909
 
785
- const exists = await this.oracleHandler.avmOpcodeNullifierExists(innerNullifier, targetAddress);
910
+ const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
786
911
 
787
912
  return toForeignCallResult([toSingle(new Fr(exists))]);
788
913
  }
789
914
 
790
915
  async avmOpcodeAddress() {
791
- const contractAddress = await this.oracleHandler.avmOpcodeAddress();
916
+ const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
792
917
 
793
918
  return toForeignCallResult([toSingle(contractAddress.toField())]);
794
919
  }
795
920
 
796
921
  async avmOpcodeBlockNumber() {
797
- const blockNumber = await this.oracleHandler.avmOpcodeBlockNumber();
922
+ const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
798
923
 
799
924
  return toForeignCallResult([toSingle(new Fr(blockNumber))]);
800
925
  }
801
926
 
802
927
  async avmOpcodeTimestamp() {
803
- const timestamp = await this.oracleHandler.avmOpcodeTimestamp();
928
+ const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
804
929
 
805
930
  return toForeignCallResult([toSingle(new Fr(timestamp))]);
806
931
  }
807
932
 
808
933
  async avmOpcodeIsStaticCall() {
809
- const isStaticCall = await this.oracleHandler.avmOpcodeIsStaticCall();
934
+ const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
810
935
 
811
936
  return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
812
937
  }
813
938
 
814
939
  async avmOpcodeChainId() {
815
- const chainId = await this.oracleHandler.avmOpcodeChainId();
940
+ const chainId = await this.handlerAsAvm().avmOpcodeChainId();
816
941
 
817
942
  return toForeignCallResult([toSingle(chainId)]);
818
943
  }
819
944
 
820
945
  async avmOpcodeVersion() {
821
- const version = await this.oracleHandler.avmOpcodeVersion();
946
+ const version = await this.handlerAsAvm().avmOpcodeVersion();
822
947
 
823
948
  return toForeignCallResult([toSingle(version)]);
824
949
  }
@@ -869,7 +994,6 @@ export class TXEService {
869
994
  foreignFrom: ForeignCallSingle,
870
995
  foreignTargetContractAddress: ForeignCallSingle,
871
996
  foreignFunctionSelector: ForeignCallSingle,
872
- _foreignArgsLength: ForeignCallSingle,
873
997
  foreignArgs: ForeignCallArray,
874
998
  foreignArgsHash: ForeignCallSingle,
875
999
  foreignIsStaticCall: ForeignCallSingle,
@@ -881,7 +1005,7 @@ export class TXEService {
881
1005
  const argsHash = fromSingle(foreignArgsHash);
882
1006
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
883
1007
 
884
- const result = await this.oracleHandler.txePrivateCallNewFlow(
1008
+ const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(
885
1009
  from,
886
1010
  targetContractAddress,
887
1011
  functionSelector,
@@ -890,27 +1014,30 @@ export class TXEService {
890
1014
  isStaticCall,
891
1015
  );
892
1016
 
893
- return toForeignCallResult([toArray([result.endSideEffectCounter, result.returnsHash, result.txHash.hash])]);
1017
+ return toForeignCallResult([toArray(returnValues)]);
894
1018
  }
895
1019
 
896
- async simulateUtilityFunction(
1020
+ async txeSimulateUtilityFunction(
897
1021
  foreignTargetContractAddress: ForeignCallSingle,
898
1022
  foreignFunctionSelector: ForeignCallSingle,
899
- foreignArgsHash: ForeignCallSingle,
1023
+ foreignArgs: ForeignCallArray,
900
1024
  ) {
901
1025
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
902
1026
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
903
- const argsHash = fromSingle(foreignArgsHash);
1027
+ const args = fromArray(foreignArgs);
904
1028
 
905
- const result = await this.oracleHandler.simulateUtilityFunction(targetContractAddress, functionSelector, argsHash);
1029
+ const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(
1030
+ targetContractAddress,
1031
+ functionSelector,
1032
+ args,
1033
+ );
906
1034
 
907
- return toForeignCallResult([toSingle(result)]);
1035
+ return toForeignCallResult([toArray(returnValues)]);
908
1036
  }
909
1037
 
910
1038
  async txePublicCallNewFlow(
911
1039
  foreignFrom: ForeignCallSingle,
912
1040
  foreignAddress: ForeignCallSingle,
913
- _foreignLength: ForeignCallSingle,
914
1041
  foreignCalldata: ForeignCallArray,
915
1042
  foreignIsStaticCall: ForeignCallSingle,
916
1043
  ) {
@@ -919,13 +1046,13 @@ export class TXEService {
919
1046
  const calldata = fromArray(foreignCalldata);
920
1047
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
921
1048
 
922
- const result = await this.oracleHandler.txePublicCallNewFlow(from, address, calldata, isStaticCall);
1049
+ const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
923
1050
 
924
- return toForeignCallResult([toArray([result.returnsHash, result.txHash.hash])]);
1051
+ return toForeignCallResult([toArray(returnValues)]);
925
1052
  }
926
1053
 
927
1054
  async privateGetSenderForTags() {
928
- const sender = await this.oracleHandler.privateGetSenderForTags();
1055
+ const sender = await this.handlerAsPrivate().privateGetSenderForTags();
929
1056
 
930
1057
  // Return a Noir Option struct with `some` and `value` fields
931
1058
  if (sender === undefined) {
@@ -940,8 +1067,17 @@ export class TXEService {
940
1067
  async privateSetSenderForTags(foreignSenderForTags: ForeignCallSingle) {
941
1068
  const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
942
1069
 
943
- await this.oracleHandler.privateSetSenderForTags(senderForTags);
1070
+ await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
944
1071
 
945
1072
  return toForeignCallResult([]);
946
1073
  }
1074
+
1075
+ async privateGetNextAppTagAsSender(foreignSender: ForeignCallSingle, foreignRecipient: ForeignCallSingle) {
1076
+ const sender = AztecAddress.fromField(fromSingle(foreignSender));
1077
+ const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
1078
+
1079
+ const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
1080
+
1081
+ return toForeignCallResult([toSingle(nextAppTag.value)]);
1082
+ }
947
1083
  }