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

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 +5 -16
  28. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  29. package/dest/state_machine/global_variable_builder.js +15 -22
  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 +24 -41
  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,14 +1,23 @@
1
- import { Fr, Point } from '@aztec/aztec.js';
1
+ import { Fr, Point } from '@aztec/aztec.js/fields';
2
+ import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
3
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
4
  import { packAsRetrievedNote } from '@aztec/pxe/simulator';
3
- import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
5
+ import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
4
6
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
7
  import { MerkleTreeId } from '@aztec/stdlib/trees';
6
- import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from '../util/encoding.js';
7
- export class TXEService {
8
+ import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './util/encoding.js';
9
+ const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
10
+ const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
11
+ export class UnavailableOracleError extends Error {
12
+ constructor(oracleName){
13
+ super(`${oracleName} oracles not available with the current handler`);
14
+ }
15
+ }
16
+ export class RPCTranslator {
8
17
  stateHandler;
9
18
  oracleHandler;
10
19
  /**
11
- * Create a new instance of `TXEService` that will translate all TXE RPC calls to and from the foreign
20
+ * Create a new instance of `RPCTranslator` that will translate all TXE RPC calls to and from the foreign
12
21
  * (`ForeignCallSingle`, `ForeignCallResult`, etc.) and native TS types, delegating actual execution of the oracles
13
22
  * to the different handlers.
14
23
  * @param stateHandler The handler that will process TXE session state transitions, such as entering a private or
@@ -19,42 +28,92 @@ export class TXEService {
19
28
  this.stateHandler = stateHandler;
20
29
  this.oracleHandler = oracleHandler;
21
30
  }
31
+ // Note: If you rename the following functions to not start with "handlerAs", you must also update the validation
32
+ // check in `TXESession.processFunction`.
33
+ handlerAsMisc() {
34
+ if (!('isMisc' in this.oracleHandler)) {
35
+ throw new UnavailableOracleError('Misc');
36
+ }
37
+ return this.oracleHandler;
38
+ }
39
+ handlerAsUtility() {
40
+ if (!('isUtility' in this.oracleHandler)) {
41
+ throw new UnavailableOracleError('Utility');
42
+ }
43
+ return this.oracleHandler;
44
+ }
45
+ handlerAsPrivate() {
46
+ if (!('isPrivate' in this.oracleHandler)) {
47
+ throw new UnavailableOracleError('Private');
48
+ }
49
+ return this.oracleHandler;
50
+ }
51
+ handlerAsAvm() {
52
+ if (!('isAvm' in this.oracleHandler)) {
53
+ throw new UnavailableOracleError('Avm');
54
+ }
55
+ return this.oracleHandler;
56
+ }
57
+ handlerAsTxe() {
58
+ if (!('isTxe' in this.oracleHandler)) {
59
+ throw new UnavailableOracleError('Txe');
60
+ }
61
+ return this.oracleHandler;
62
+ }
22
63
  // TXE session state transition functions - these get handled by the state handler
23
64
  async txeSetTopLevelTXEContext() {
24
- await this.stateHandler.setTopLevelContext();
65
+ await this.stateHandler.enterTopLevelState();
25
66
  return toForeignCallResult([]);
26
67
  }
27
- async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignHistoricalBlockNumberIsSome, foreignHistoricalBlockNumberValue) {
68
+ async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
28
69
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
29
- const historicalBlockNumber = fromSingle(foreignHistoricalBlockNumberIsSome).toBool() ? fromSingle(foreignHistoricalBlockNumberValue).toNumber() : undefined;
30
- const privateContextInputs = await this.stateHandler.setPrivateContext(contractAddress, historicalBlockNumber);
70
+ const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
71
+ const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
31
72
  return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
32
73
  }
33
74
  async txeSetPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
34
75
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
35
- await this.stateHandler.setPublicContext(contractAddress);
76
+ await this.stateHandler.enterPublicState(contractAddress);
36
77
  return toForeignCallResult([]);
37
78
  }
38
79
  async txeSetUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
39
80
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
40
- await this.stateHandler.setUtilityContext(contractAddress);
81
+ await this.stateHandler.enterUtilityState(contractAddress);
41
82
  return toForeignCallResult([]);
42
83
  }
43
84
  // Other oracles - these get handled by the oracle handler
44
85
  // TXE-specific oracles
86
+ txeGetDefaultAddress() {
87
+ const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
88
+ return toForeignCallResult([
89
+ toSingle(defaultAddress)
90
+ ]);
91
+ }
92
+ async txeGetNextBlockNumber() {
93
+ const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
94
+ return toForeignCallResult([
95
+ toSingle(nextBlockNumber)
96
+ ]);
97
+ }
98
+ async txeGetNextBlockTimestamp() {
99
+ const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
100
+ return toForeignCallResult([
101
+ toSingle(nextBlockTimestamp)
102
+ ]);
103
+ }
45
104
  async txeAdvanceBlocksBy(foreignBlocks) {
46
105
  const blocks = fromSingle(foreignBlocks).toNumber();
47
- await this.oracleHandler.txeAdvanceBlocksBy(blocks);
106
+ await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
48
107
  return toForeignCallResult([]);
49
108
  }
50
109
  txeAdvanceTimestampBy(foreignDuration) {
51
110
  const duration = fromSingle(foreignDuration).toBigInt();
52
- this.oracleHandler.txeAdvanceTimestampBy(duration);
111
+ this.handlerAsTxe().txeAdvanceTimestampBy(duration);
53
112
  return toForeignCallResult([]);
54
113
  }
55
114
  async txeDeploy(artifact, instance, foreignSecret) {
56
115
  const secret = fromSingle(foreignSecret);
57
- await this.oracleHandler.txeDeploy(artifact, instance, secret);
116
+ await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
58
117
  return toForeignCallResult([
59
118
  toArray([
60
119
  instance.salt,
@@ -67,7 +126,7 @@ export class TXEService {
67
126
  }
68
127
  async txeCreateAccount(foreignSecret) {
69
128
  const secret = fromSingle(foreignSecret);
70
- const completeAddress = await this.oracleHandler.txeCreateAccount(secret);
129
+ const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
71
130
  return toForeignCallResult([
72
131
  toSingle(completeAddress.address),
73
132
  ...completeAddress.publicKeys.toFields().map(toSingle)
@@ -75,7 +134,7 @@ export class TXEService {
75
134
  }
76
135
  async txeAddAccount(artifact, instance, foreignSecret) {
77
136
  const secret = fromSingle(foreignSecret);
78
- const completeAddress = await this.oracleHandler.txeAddAccount(artifact, instance, secret);
137
+ const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
79
138
  return toForeignCallResult([
80
139
  toSingle(completeAddress.address),
81
140
  ...completeAddress.publicKeys.toFields().map(toSingle)
@@ -84,87 +143,101 @@ export class TXEService {
84
143
  async txeAddAuthWitness(foreignAddress, foreignMessageHash) {
85
144
  const address = addressFromSingle(foreignAddress);
86
145
  const messageHash = fromSingle(foreignMessageHash);
87
- await this.oracleHandler.txeAddAuthWitness(address, messageHash);
146
+ await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
88
147
  return toForeignCallResult([]);
89
148
  }
90
149
  // PXE oracles
91
150
  utilityAssertCompatibleOracleVersion(foreignVersion) {
92
151
  const version = fromSingle(foreignVersion).toNumber();
93
- this.oracleHandler.utilityAssertCompatibleOracleVersion(version);
152
+ this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
94
153
  return toForeignCallResult([]);
95
154
  }
96
155
  utilityGetRandomField() {
97
- const randomField = this.oracleHandler.utilityGetRandomField();
156
+ const randomField = this.handlerAsMisc().utilityGetRandomField();
98
157
  return toForeignCallResult([
99
158
  toSingle(randomField)
100
159
  ]);
101
160
  }
102
- async utilityGetContractAddress() {
103
- const contractAddress = await this.oracleHandler.utilityGetContractAddress();
104
- return toForeignCallResult([
105
- toSingle(contractAddress.toField())
106
- ]);
107
- }
108
- async utilityGetBlockNumber() {
109
- const blockNumber = await this.oracleHandler.utilityGetBlockNumber();
161
+ async txeGetLastBlockTimestamp() {
162
+ const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
110
163
  return toForeignCallResult([
111
- toSingle(new Fr(blockNumber))
164
+ toSingle(new Fr(timestamp))
112
165
  ]);
113
166
  }
114
- // seems to be used to mean the timestamp of the last mined block in txe (but that's not what is done here)
115
- async utilityGetTimestamp() {
116
- const timestamp = await this.oracleHandler.utilityGetTimestamp();
167
+ async txeGetLastTxEffects() {
168
+ const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
117
169
  return toForeignCallResult([
118
- toSingle(new Fr(timestamp))
170
+ toSingle(txHash.hash),
171
+ ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
172
+ ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
119
173
  ]);
120
174
  }
121
- async txeGetLastBlockTimestamp() {
122
- const timestamp = await this.oracleHandler.txeGetLastBlockTimestamp();
175
+ async txeGetPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
176
+ const selector = EventSelector.fromField(fromSingle(foreignSelector));
177
+ const contractAddress = addressFromSingle(foreignContractAddress);
178
+ const scope = addressFromSingle(foreignScope);
179
+ const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
180
+ if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
181
+ throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
182
+ }
183
+ if (events.some((e)=>e.length > MAX_EVENT_LEN)) {
184
+ throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
185
+ }
186
+ // This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
187
+ // multidimensional array in get_private_events_oracle and create the BoundedVecs here.
188
+ const rawArrayStorage = events.map((e)=>e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0)))).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0)))).flat();
189
+ const eventLengths = events.map((e)=>new Fr(e.length)).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
190
+ const queryLength = new Fr(events.length);
123
191
  return toForeignCallResult([
124
- toSingle(new Fr(timestamp))
192
+ toArray(rawArrayStorage),
193
+ toArray(eventLengths),
194
+ toSingle(queryLength)
125
195
  ]);
126
196
  }
127
- // Since the argument is a slice, noir automatically adds a length field to oracle call.
128
- privateStoreInExecutionCache(_foreignLength, foreignValues, foreignHash) {
197
+ privateStoreInExecutionCache(foreignValues, foreignHash) {
129
198
  const values = fromArray(foreignValues);
130
199
  const hash = fromSingle(foreignHash);
131
- this.oracleHandler.privateStoreInExecutionCache(values, hash);
200
+ this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
132
201
  return toForeignCallResult([]);
133
202
  }
134
203
  async privateLoadFromExecutionCache(foreignHash) {
135
204
  const hash = fromSingle(foreignHash);
136
- const returns = await this.oracleHandler.privateLoadFromExecutionCache(hash);
205
+ const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
137
206
  return toForeignCallResult([
138
207
  toArray(returns)
139
208
  ]);
140
209
  }
141
- // Since the argument is a slice, noir automatically adds a length field to oracle call.
142
- utilityDebugLog(foreignMessage, _foreignLength, foreignFields) {
210
+ // When the argument is a slice, noir automatically adds a length field to oracle call.
211
+ // When the argument is an array, we add the field length manually to the signature.
212
+ utilityDebugLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
213
+ const level = fromSingle(foreignLevel).toNumber();
143
214
  const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
144
215
  const fields = fromArray(foreignFields);
145
- this.oracleHandler.utilityDebugLog(message, fields);
216
+ this.handlerAsMisc().utilityDebugLog(level, message, fields);
146
217
  return toForeignCallResult([]);
147
218
  }
148
219
  async utilityStorageRead(foreignContractAddress, foreignStartStorageSlot, foreignBlockNumber, foreignNumberOfElements) {
149
220
  const contractAddress = addressFromSingle(foreignContractAddress);
150
221
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
151
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
222
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
152
223
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
153
- const values = await this.oracleHandler.utilityStorageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements);
224
+ const values = await this.handlerAsUtility().utilityStorageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements);
154
225
  return toForeignCallResult([
155
226
  toArray(values)
156
227
  ]);
157
228
  }
158
229
  async utilityGetPublicDataWitness(foreignBlockNumber, foreignLeafSlot) {
159
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
230
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
160
231
  const leafSlot = fromSingle(foreignLeafSlot);
161
- const witness = await this.oracleHandler.utilityGetPublicDataWitness(blockNumber, leafSlot);
232
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
162
233
  if (!witness) {
163
234
  throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
164
235
  }
165
236
  return toForeignCallResult(witness.toNoirRepresentation());
166
237
  }
167
- async utilityGetNotes(foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
238
+ async utilityGetNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
239
+ // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
240
+ const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
168
241
  const storageSlot = fromSingle(foreignStorageSlot);
169
242
  const numSelects = fromSingle(foreignNumSelects).toNumber();
170
243
  const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
@@ -181,44 +254,54 @@ export class TXEService {
181
254
  const status = fromSingle(foreignStatus).toNumber();
182
255
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
183
256
  const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
184
- const noteDatas = await this.oracleHandler.utilityGetNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
185
- const returnDataAsArrayOfArrays = noteDatas.map(packAsRetrievedNote);
257
+ const noteDatas = await this.handlerAsUtility().utilityGetNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
258
+ const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>packAsRetrievedNote({
259
+ contractAddress: noteData.contractAddress,
260
+ owner: noteData.owner,
261
+ randomness: noteData.randomness,
262
+ storageSlot: noteData.storageSlot,
263
+ noteNonce: noteData.noteNonce,
264
+ index: noteData.index,
265
+ note: noteData.note
266
+ }));
186
267
  // Now we convert each sub-array to an array of ForeignCallSingles
187
268
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
188
269
  // At last we convert the array of arrays to a bounded vec of arrays
189
270
  return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedRetrievedNoteLength));
190
271
  }
191
- privateNotifyCreatedNote(foreignStorageSlot, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
272
+ privateNotifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
273
+ const owner = addressFromSingle(foreignOwner);
192
274
  const storageSlot = fromSingle(foreignStorageSlot);
275
+ const randomness = fromSingle(foreignRandomness);
193
276
  const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
194
277
  const note = fromArray(foreignNote);
195
278
  const noteHash = fromSingle(foreignNoteHash);
196
279
  const counter = fromSingle(foreignCounter).toNumber();
197
- this.oracleHandler.privateNotifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter);
280
+ this.handlerAsPrivate().privateNotifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
198
281
  return toForeignCallResult([]);
199
282
  }
200
283
  async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
201
284
  const innerNullifier = fromSingle(foreignInnerNullifier);
202
285
  const noteHash = fromSingle(foreignNoteHash);
203
286
  const counter = fromSingle(foreignCounter).toNumber();
204
- await this.oracleHandler.privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
287
+ await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
205
288
  return toForeignCallResult([]);
206
289
  }
207
290
  async privateNotifyCreatedNullifier(foreignInnerNullifier) {
208
291
  const innerNullifier = fromSingle(foreignInnerNullifier);
209
- await this.oracleHandler.privateNotifyCreatedNullifier(innerNullifier);
292
+ await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
210
293
  return toForeignCallResult([]);
211
294
  }
212
295
  async utilityCheckNullifierExists(foreignInnerNullifier) {
213
296
  const innerNullifier = fromSingle(foreignInnerNullifier);
214
- const exists = await this.oracleHandler.utilityCheckNullifierExists(innerNullifier);
297
+ const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
215
298
  return toForeignCallResult([
216
299
  toSingle(new Fr(exists))
217
300
  ]);
218
301
  }
219
302
  async utilityGetContractInstance(foreignAddress) {
220
303
  const address = addressFromSingle(foreignAddress);
221
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
304
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
222
305
  return toForeignCallResult([
223
306
  instance.salt,
224
307
  instance.deployer.toField(),
@@ -229,7 +312,7 @@ export class TXEService {
229
312
  }
230
313
  async utilityGetPublicKeysAndPartialAddress(foreignAddress) {
231
314
  const address = addressFromSingle(foreignAddress);
232
- const { publicKeys, partialAddress } = await this.oracleHandler.utilityGetCompleteAddress(address);
315
+ const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
233
316
  return toForeignCallResult([
234
317
  toArray([
235
318
  ...publicKeys.toFields(),
@@ -239,16 +322,16 @@ export class TXEService {
239
322
  }
240
323
  async utilityGetKeyValidationRequest(foreignPkMHash) {
241
324
  const pkMHash = fromSingle(foreignPkMHash);
242
- const keyValidationRequest = await this.oracleHandler.utilityGetKeyValidationRequest(pkMHash);
325
+ const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
243
326
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
244
327
  }
245
328
  privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
246
329
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
247
330
  }
248
331
  async utilityGetNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
249
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
332
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
250
333
  const nullifier = fromSingle(foreignNullifier);
251
- const witness = await this.oracleHandler.utilityGetNullifierMembershipWitness(blockNumber, nullifier);
334
+ const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
252
335
  if (!witness) {
253
336
  throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
254
337
  }
@@ -256,7 +339,7 @@ export class TXEService {
256
339
  }
257
340
  async utilityGetAuthWitness(foreignMessageHash) {
258
341
  const messageHash = fromSingle(foreignMessageHash);
259
- const authWitness = await this.oracleHandler.utilityGetAuthWitness(messageHash);
342
+ const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
260
343
  if (!authWitness) {
261
344
  throw new Error(`Auth witness not found for message hash ${messageHash}.`);
262
345
  }
@@ -273,31 +356,30 @@ export class TXEService {
273
356
  privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
274
357
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
275
358
  }
276
- async utilityGetChainId() {
277
- const chainId = await this.oracleHandler.utilityGetChainId();
359
+ async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
360
+ const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
361
+ const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
278
362
  return toForeignCallResult([
279
- toSingle(chainId)
363
+ toSingle(new Fr(isRevertible))
280
364
  ]);
281
365
  }
282
- async utilityGetVersion() {
283
- const version = await this.oracleHandler.utilityGetVersion();
284
- return toForeignCallResult([
285
- toSingle(version)
286
- ]);
366
+ utilityGetUtilityContext() {
367
+ const context = this.handlerAsUtility().utilityGetUtilityContext();
368
+ return toForeignCallResult(context.toNoirRepresentation());
287
369
  }
288
370
  async utilityGetBlockHeader(foreignBlockNumber) {
289
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
290
- const header = await this.oracleHandler.utilityGetBlockHeader(blockNumber);
371
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
372
+ const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
291
373
  if (!header) {
292
374
  throw new Error(`Block header not found for block ${blockNumber}.`);
293
375
  }
294
376
  return toForeignCallResult(header.toFields().map(toSingle));
295
377
  }
296
378
  async utilityGetMembershipWitness(foreignBlockNumber, foreignTreeId, foreignLeafValue) {
297
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
379
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
298
380
  const treeId = fromSingle(foreignTreeId).toNumber();
299
381
  const leafValue = fromSingle(foreignLeafValue);
300
- const witness = await this.oracleHandler.utilityGetMembershipWitness(blockNumber, treeId, leafValue);
382
+ const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
301
383
  if (!witness) {
302
384
  throw new Error(`Membership witness in tree ${MerkleTreeId[treeId]} not found for value ${leafValue} at block ${blockNumber}.`);
303
385
  }
@@ -307,51 +389,45 @@ export class TXEService {
307
389
  ]);
308
390
  }
309
391
  async utilityGetLowNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
310
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
392
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
311
393
  const nullifier = fromSingle(foreignNullifier);
312
- const witness = await this.oracleHandler.utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
394
+ const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
313
395
  if (!witness) {
314
396
  throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
315
397
  }
316
398
  return toForeignCallResult(witness.toNoirRepresentation());
317
399
  }
318
- async utilityGetIndexedTaggingSecretAsSender(foreignSender, foreignRecipient) {
319
- const sender = AztecAddress.fromField(fromSingle(foreignSender));
320
- const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
321
- const secret = await this.oracleHandler.utilityGetIndexedTaggingSecretAsSender(sender, recipient);
322
- return toForeignCallResult(secret.toFields().map(toSingle));
323
- }
324
400
  async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
325
401
  const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
326
- await this.oracleHandler.utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
402
+ await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
327
403
  return toForeignCallResult([]);
328
404
  }
329
405
  async utilityValidateEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
330
406
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
331
407
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
332
408
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
333
- await this.oracleHandler.utilityValidateEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
409
+ await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
334
410
  return toForeignCallResult([]);
335
411
  }
336
412
  async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
337
413
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
338
414
  const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
339
415
  const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
340
- await this.oracleHandler.utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
416
+ await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
341
417
  return toForeignCallResult([]);
342
418
  }
343
419
  async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
344
420
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
345
421
  const slot = fromSingle(foreignSlot);
346
422
  const capsule = fromArray(foreignCapsule);
347
- await this.oracleHandler.utilityStoreCapsule(contractAddress, slot, capsule);
423
+ await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
348
424
  return toForeignCallResult([]);
349
425
  }
350
426
  async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
351
427
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
352
428
  const slot = fromSingle(foreignSlot);
353
429
  const tSize = fromSingle(foreignTSize).toNumber();
354
- const values = await this.oracleHandler.utilityLoadCapsule(contractAddress, slot);
430
+ const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
355
431
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
356
432
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
357
433
  if (values === null) {
@@ -371,7 +447,7 @@ export class TXEService {
371
447
  async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
372
448
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
373
449
  const slot = fromSingle(foreignSlot);
374
- await this.oracleHandler.utilityDeleteCapsule(contractAddress, slot);
450
+ await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
375
451
  return toForeignCallResult([]);
376
452
  }
377
453
  async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
@@ -379,7 +455,7 @@ export class TXEService {
379
455
  const srcSlot = fromSingle(foreignSrcSlot);
380
456
  const dstSlot = fromSingle(foreignDstSlot);
381
457
  const numEntries = fromSingle(foreignNumEntries).toNumber();
382
- await this.oracleHandler.utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
458
+ await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
383
459
  return toForeignCallResult([]);
384
460
  }
385
461
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
@@ -390,7 +466,7 @@ export class TXEService {
390
466
  const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
391
467
  const iv = fromUintArray(foreignIv, 8);
392
468
  const symKey = fromUintArray(foreignSymKey, 8);
393
- const plaintextBuffer = await this.oracleHandler.utilityAes128Decrypt(ciphertext, iv, symKey);
469
+ const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
394
470
  return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length));
395
471
  }
396
472
  async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
@@ -400,7 +476,7 @@ export class TXEService {
400
476
  fromSingle(foreignEphPKField1),
401
477
  fromSingle(foreignEphPKField2)
402
478
  ]);
403
- const secret = await this.oracleHandler.utilityGetSharedSecret(address, ephPK);
479
+ const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
404
480
  return toForeignCallResult(secret.toFields().map(toSingle));
405
481
  }
406
482
  emitOffchainEffect(_foreignData) {
@@ -413,7 +489,7 @@ export class TXEService {
413
489
  }
414
490
  async avmOpcodeStorageRead(foreignSlot) {
415
491
  const slot = fromSingle(foreignSlot);
416
- const value = (await this.oracleHandler.avmOpcodeStorageRead(slot)).value;
492
+ const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
417
493
  return toForeignCallResult([
418
494
  toSingle(new Fr(value))
419
495
  ]);
@@ -421,12 +497,12 @@ export class TXEService {
421
497
  async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
422
498
  const slot = fromSingle(foreignSlot);
423
499
  const value = fromSingle(foreignValue);
424
- await this.oracleHandler.avmOpcodeStorageWrite(slot, value);
500
+ await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
425
501
  return toForeignCallResult([]);
426
502
  }
427
503
  async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
428
504
  const address = addressFromSingle(foreignAddress);
429
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
505
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
430
506
  return toForeignCallResult([
431
507
  toSingle(instance.deployer),
432
508
  // AVM requires an extra boolean indicating the instance was found
@@ -435,7 +511,7 @@ export class TXEService {
435
511
  }
436
512
  async avmOpcodeGetContractInstanceClassId(foreignAddress) {
437
513
  const address = addressFromSingle(foreignAddress);
438
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
514
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
439
515
  return toForeignCallResult([
440
516
  toSingle(instance.currentContractClassId),
441
517
  // AVM requires an extra boolean indicating the instance was found
@@ -444,69 +520,69 @@ export class TXEService {
444
520
  }
445
521
  async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
446
522
  const address = addressFromSingle(foreignAddress);
447
- const instance = await this.oracleHandler.utilityGetContractInstance(address);
523
+ const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
448
524
  return toForeignCallResult([
449
525
  toSingle(instance.initializationHash),
450
526
  // AVM requires an extra boolean indicating the instance was found
451
527
  toSingle(new Fr(1))
452
528
  ]);
453
529
  }
454
- avmOpcodeSender() {
455
- const sender = this.oracleHandler.getMsgSender();
530
+ async avmOpcodeSender() {
531
+ const sender = await this.handlerAsAvm().avmOpcodeSender();
456
532
  return toForeignCallResult([
457
533
  toSingle(sender)
458
534
  ]);
459
535
  }
460
536
  async avmOpcodeEmitNullifier(foreignNullifier) {
461
537
  const nullifier = fromSingle(foreignNullifier);
462
- await this.oracleHandler.avmOpcodeEmitNullifier(nullifier);
538
+ await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
463
539
  return toForeignCallResult([]);
464
540
  }
465
541
  async avmOpcodeEmitNoteHash(foreignNoteHash) {
466
542
  const noteHash = fromSingle(foreignNoteHash);
467
- await this.oracleHandler.avmOpcodeEmitNoteHash(noteHash);
543
+ await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
468
544
  return toForeignCallResult([]);
469
545
  }
470
546
  async avmOpcodeNullifierExists(foreignInnerNullifier, foreignTargetAddress) {
471
547
  const innerNullifier = fromSingle(foreignInnerNullifier);
472
548
  const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
473
- const exists = await this.oracleHandler.avmOpcodeNullifierExists(innerNullifier, targetAddress);
549
+ const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
474
550
  return toForeignCallResult([
475
551
  toSingle(new Fr(exists))
476
552
  ]);
477
553
  }
478
554
  async avmOpcodeAddress() {
479
- const contractAddress = await this.oracleHandler.avmOpcodeAddress();
555
+ const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
480
556
  return toForeignCallResult([
481
557
  toSingle(contractAddress.toField())
482
558
  ]);
483
559
  }
484
560
  async avmOpcodeBlockNumber() {
485
- const blockNumber = await this.oracleHandler.avmOpcodeBlockNumber();
561
+ const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
486
562
  return toForeignCallResult([
487
563
  toSingle(new Fr(blockNumber))
488
564
  ]);
489
565
  }
490
566
  async avmOpcodeTimestamp() {
491
- const timestamp = await this.oracleHandler.avmOpcodeTimestamp();
567
+ const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
492
568
  return toForeignCallResult([
493
569
  toSingle(new Fr(timestamp))
494
570
  ]);
495
571
  }
496
572
  async avmOpcodeIsStaticCall() {
497
- const isStaticCall = await this.oracleHandler.avmOpcodeIsStaticCall();
573
+ const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
498
574
  return toForeignCallResult([
499
575
  toSingle(new Fr(isStaticCall ? 1 : 0))
500
576
  ]);
501
577
  }
502
578
  async avmOpcodeChainId() {
503
- const chainId = await this.oracleHandler.avmOpcodeChainId();
579
+ const chainId = await this.handlerAsAvm().avmOpcodeChainId();
504
580
  return toForeignCallResult([
505
581
  toSingle(chainId)
506
582
  ]);
507
583
  }
508
584
  async avmOpcodeVersion() {
509
- const version = await this.oracleHandler.avmOpcodeVersion();
585
+ const version = await this.handlerAsAvm().avmOpcodeVersion();
510
586
  return toForeignCallResult([
511
587
  toSingle(version)
512
588
  ]);
@@ -526,46 +602,39 @@ export class TXEService {
526
602
  avmOpcodeSuccessCopy() {
527
603
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
528
604
  }
529
- async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, _foreignArgsLength, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
605
+ async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
530
606
  const from = addressFromSingle(foreignFrom);
531
607
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
532
608
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
533
609
  const args = fromArray(foreignArgs);
534
610
  const argsHash = fromSingle(foreignArgsHash);
535
611
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
536
- const result = await this.oracleHandler.txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
612
+ const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
537
613
  return toForeignCallResult([
538
- toArray([
539
- result.endSideEffectCounter,
540
- result.returnsHash,
541
- result.txHash.hash
542
- ])
614
+ toArray(returnValues)
543
615
  ]);
544
616
  }
545
- async simulateUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgsHash) {
617
+ async txeSimulateUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
546
618
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
547
619
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
548
- const argsHash = fromSingle(foreignArgsHash);
549
- const result = await this.oracleHandler.simulateUtilityFunction(targetContractAddress, functionSelector, argsHash);
620
+ const args = fromArray(foreignArgs);
621
+ const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(targetContractAddress, functionSelector, args);
550
622
  return toForeignCallResult([
551
- toSingle(result)
623
+ toArray(returnValues)
552
624
  ]);
553
625
  }
554
- async txePublicCallNewFlow(foreignFrom, foreignAddress, _foreignLength, foreignCalldata, foreignIsStaticCall) {
626
+ async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
555
627
  const from = addressFromSingle(foreignFrom);
556
628
  const address = addressFromSingle(foreignAddress);
557
629
  const calldata = fromArray(foreignCalldata);
558
630
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
559
- const result = await this.oracleHandler.txePublicCallNewFlow(from, address, calldata, isStaticCall);
631
+ const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
560
632
  return toForeignCallResult([
561
- toArray([
562
- result.returnsHash,
563
- result.txHash.hash
564
- ])
633
+ toArray(returnValues)
565
634
  ]);
566
635
  }
567
636
  async privateGetSenderForTags() {
568
- const sender = await this.oracleHandler.privateGetSenderForTags();
637
+ const sender = await this.handlerAsPrivate().privateGetSenderForTags();
569
638
  // Return a Noir Option struct with `some` and `value` fields
570
639
  if (sender === undefined) {
571
640
  // No sender found, return Option with some=0 and value=0
@@ -583,7 +652,15 @@ export class TXEService {
583
652
  }
584
653
  async privateSetSenderForTags(foreignSenderForTags) {
585
654
  const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
586
- await this.oracleHandler.privateSetSenderForTags(senderForTags);
655
+ await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
587
656
  return toForeignCallResult([]);
588
657
  }
658
+ async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
659
+ const sender = AztecAddress.fromField(fromSingle(foreignSender));
660
+ const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
661
+ const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
662
+ return toForeignCallResult([
663
+ toSingle(nextAppTag.value)
664
+ ]);
665
+ }
589
666
  }