@aztec/txe 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e

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 (72) hide show
  1. package/dest/constants.d.ts +1 -2
  2. package/dest/constants.d.ts.map +1 -1
  3. package/dest/constants.js +0 -1
  4. package/dest/index.d.ts +1 -1
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +88 -54
  7. package/dest/oracle/interfaces.d.ts +29 -28
  8. package/dest/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
  10. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  11. package/dest/oracle/txe_oracle_public_context.js +16 -16
  12. package/dest/oracle/txe_oracle_top_level_context.d.ts +28 -22
  13. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  14. package/dest/oracle/txe_oracle_top_level_context.js +165 -71
  15. package/dest/rpc_translator.d.ts +125 -81
  16. package/dest/rpc_translator.d.ts.map +1 -1
  17. package/dest/rpc_translator.js +426 -179
  18. package/dest/state_machine/archiver.d.ts +20 -69
  19. package/dest/state_machine/archiver.d.ts.map +1 -1
  20. package/dest/state_machine/archiver.js +36 -179
  21. package/dest/state_machine/dummy_p2p_client.d.ts +18 -13
  22. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  23. package/dest/state_machine/dummy_p2p_client.js +33 -18
  24. package/dest/state_machine/global_variable_builder.d.ts +9 -4
  25. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  26. package/dest/state_machine/global_variable_builder.js +9 -3
  27. package/dest/state_machine/index.d.ts +7 -5
  28. package/dest/state_machine/index.d.ts.map +1 -1
  29. package/dest/state_machine/index.js +40 -13
  30. package/dest/state_machine/mock_epoch_cache.d.ts +25 -8
  31. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  32. package/dest/state_machine/mock_epoch_cache.js +46 -9
  33. package/dest/state_machine/synchronizer.d.ts +6 -6
  34. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  35. package/dest/state_machine/synchronizer.js +3 -3
  36. package/dest/txe_session.d.ts +12 -6
  37. package/dest/txe_session.d.ts.map +1 -1
  38. package/dest/txe_session.js +115 -28
  39. package/dest/util/encoding.d.ts +88 -18
  40. package/dest/util/encoding.d.ts.map +1 -1
  41. package/dest/util/encoding.js +4 -0
  42. package/dest/util/txe_public_contract_data_source.d.ts +2 -3
  43. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  44. package/dest/util/txe_public_contract_data_source.js +6 -25
  45. package/dest/utils/block_creation.d.ts +4 -4
  46. package/dest/utils/block_creation.d.ts.map +1 -1
  47. package/dest/utils/block_creation.js +18 -4
  48. package/dest/utils/tx_effect_creation.d.ts +2 -3
  49. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  50. package/dest/utils/tx_effect_creation.js +3 -6
  51. package/package.json +16 -16
  52. package/src/constants.ts +0 -1
  53. package/src/index.ts +89 -52
  54. package/src/oracle/interfaces.ts +32 -31
  55. package/src/oracle/txe_oracle_public_context.ts +16 -18
  56. package/src/oracle/txe_oracle_top_level_context.ts +208 -123
  57. package/src/rpc_translator.ts +493 -204
  58. package/src/state_machine/archiver.ts +38 -234
  59. package/src/state_machine/dummy_p2p_client.ts +46 -24
  60. package/src/state_machine/global_variable_builder.ts +18 -3
  61. package/src/state_machine/index.ts +56 -12
  62. package/src/state_machine/mock_epoch_cache.ts +57 -14
  63. package/src/state_machine/synchronizer.ts +5 -5
  64. package/src/txe_session.ts +132 -88
  65. package/src/util/encoding.ts +5 -0
  66. package/src/util/txe_public_contract_data_source.ts +10 -38
  67. package/src/utils/block_creation.ts +19 -16
  68. package/src/utils/tx_effect_creation.ts +3 -11
  69. package/dest/util/txe_contract_store.d.ts +0 -12
  70. package/dest/util/txe_contract_store.d.ts.map +0 -1
  71. package/dest/util/txe_contract_store.js +0 -22
  72. package/src/util/txe_contract_store.ts +0 -36
@@ -1,12 +1,11 @@
1
1
  import { Fr, Point } from '@aztec/aztec.js/fields';
2
2
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
3
3
  import { BlockNumber } from '@aztec/foundation/branded-types';
4
- import { packAsRetrievedNote } from '@aztec/pxe/simulator';
4
+ import { packAsHintedNote } from '@aztec/pxe/simulator';
5
5
  import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
6
6
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
7
- import { MerkleTreeId } from '@aztec/stdlib/trees';
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
7
+ import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, blockHashFromSingle, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './util/encoding.js';
8
+ const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
10
9
  const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
11
10
  export class UnavailableOracleError extends Error {
12
11
  constructor(oracleName){
@@ -61,59 +60,69 @@ export class RPCTranslator {
61
60
  return this.oracleHandler;
62
61
  }
63
62
  // TXE session state transition functions - these get handled by the state handler
64
- async txeSetTopLevelTXEContext() {
63
+ // eslint-disable-next-line camelcase
64
+ async aztec_txe_setTopLevelTXEContext() {
65
65
  await this.stateHandler.enterTopLevelState();
66
66
  return toForeignCallResult([]);
67
67
  }
68
- async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
68
+ // eslint-disable-next-line camelcase
69
+ async aztec_txe_setPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
69
70
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
70
71
  const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
71
72
  const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
72
73
  return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
73
74
  }
74
- async txeSetPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
75
+ // eslint-disable-next-line camelcase
76
+ async aztec_txe_setPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
75
77
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
76
78
  await this.stateHandler.enterPublicState(contractAddress);
77
79
  return toForeignCallResult([]);
78
80
  }
79
- async txeSetUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
81
+ // eslint-disable-next-line camelcase
82
+ async aztec_txe_setUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
80
83
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
81
84
  await this.stateHandler.enterUtilityState(contractAddress);
82
85
  return toForeignCallResult([]);
83
86
  }
84
87
  // Other oracles - these get handled by the oracle handler
85
88
  // TXE-specific oracles
86
- txeGetDefaultAddress() {
87
- const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
89
+ // eslint-disable-next-line camelcase
90
+ aztec_txe_getDefaultAddress() {
91
+ const defaultAddress = this.handlerAsTxe().getDefaultAddress();
88
92
  return toForeignCallResult([
89
93
  toSingle(defaultAddress)
90
94
  ]);
91
95
  }
92
- async txeGetNextBlockNumber() {
93
- const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
96
+ // eslint-disable-next-line camelcase
97
+ async aztec_txe_getNextBlockNumber() {
98
+ const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
94
99
  return toForeignCallResult([
95
100
  toSingle(nextBlockNumber)
96
101
  ]);
97
102
  }
98
- async txeGetNextBlockTimestamp() {
99
- const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
103
+ // eslint-disable-next-line camelcase
104
+ async aztec_txe_getNextBlockTimestamp() {
105
+ const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
100
106
  return toForeignCallResult([
101
107
  toSingle(nextBlockTimestamp)
102
108
  ]);
103
109
  }
104
- async txeAdvanceBlocksBy(foreignBlocks) {
110
+ // eslint-disable-next-line camelcase
111
+ async aztec_txe_advanceBlocksBy(foreignBlocks) {
105
112
  const blocks = fromSingle(foreignBlocks).toNumber();
106
- await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
113
+ await this.handlerAsTxe().advanceBlocksBy(blocks);
107
114
  return toForeignCallResult([]);
108
115
  }
109
- txeAdvanceTimestampBy(foreignDuration) {
116
+ // eslint-disable-next-line camelcase
117
+ aztec_txe_advanceTimestampBy(foreignDuration) {
110
118
  const duration = fromSingle(foreignDuration).toBigInt();
111
- this.handlerAsTxe().txeAdvanceTimestampBy(duration);
119
+ this.handlerAsTxe().advanceTimestampBy(duration);
112
120
  return toForeignCallResult([]);
113
121
  }
114
- async txeDeploy(artifact, instance, foreignSecret) {
122
+ // eslint-disable-next-line camelcase
123
+ async aztec_txe_deploy(artifact, instance, foreignSecret) {
115
124
  const secret = fromSingle(foreignSecret);
116
- await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
125
+ await this.handlerAsTxe().deploy(artifact, instance, secret);
117
126
  return toForeignCallResult([
118
127
  toArray([
119
128
  instance.salt,
@@ -124,59 +133,74 @@ export class RPCTranslator {
124
133
  ])
125
134
  ]);
126
135
  }
127
- async txeCreateAccount(foreignSecret) {
136
+ // eslint-disable-next-line camelcase
137
+ async aztec_txe_createAccount(foreignSecret) {
128
138
  const secret = fromSingle(foreignSecret);
129
- const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
139
+ const completeAddress = await this.handlerAsTxe().createAccount(secret);
130
140
  return toForeignCallResult([
131
141
  toSingle(completeAddress.address),
132
142
  ...completeAddress.publicKeys.toFields().map(toSingle)
133
143
  ]);
134
144
  }
135
- async txeAddAccount(artifact, instance, foreignSecret) {
145
+ // eslint-disable-next-line camelcase
146
+ async aztec_txe_addAccount(artifact, instance, foreignSecret) {
136
147
  const secret = fromSingle(foreignSecret);
137
- const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
148
+ const completeAddress = await this.handlerAsTxe().addAccount(artifact, instance, secret);
138
149
  return toForeignCallResult([
139
150
  toSingle(completeAddress.address),
140
151
  ...completeAddress.publicKeys.toFields().map(toSingle)
141
152
  ]);
142
153
  }
143
- async txeAddAuthWitness(foreignAddress, foreignMessageHash) {
154
+ // eslint-disable-next-line camelcase
155
+ async aztec_txe_addAuthWitness(foreignAddress, foreignMessageHash) {
144
156
  const address = addressFromSingle(foreignAddress);
145
157
  const messageHash = fromSingle(foreignMessageHash);
146
- await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
158
+ await this.handlerAsTxe().addAuthWitness(address, messageHash);
147
159
  return toForeignCallResult([]);
148
160
  }
149
161
  // PXE oracles
150
- utilityAssertCompatibleOracleVersion(foreignVersion) {
151
- const version = fromSingle(foreignVersion).toNumber();
152
- this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
162
+ // eslint-disable-next-line camelcase
163
+ aztec_utl_assertCompatibleOracleVersionV2(foreignMajor, foreignMinor) {
164
+ const major = fromSingle(foreignMajor).toNumber();
165
+ const minor = fromSingle(foreignMinor).toNumber();
166
+ this.handlerAsMisc().assertCompatibleOracleVersion(major, minor);
153
167
  return toForeignCallResult([]);
154
168
  }
155
- utilityGetRandomField() {
156
- const randomField = this.handlerAsMisc().utilityGetRandomField();
169
+ // eslint-disable-next-line camelcase
170
+ aztec_utl_getRandomField() {
171
+ const randomField = this.handlerAsMisc().getRandomField();
157
172
  return toForeignCallResult([
158
173
  toSingle(randomField)
159
174
  ]);
160
175
  }
161
- async txeGetLastBlockTimestamp() {
162
- const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
176
+ // eslint-disable-next-line camelcase
177
+ async aztec_txe_getLastBlockTimestamp() {
178
+ const timestamp = await this.handlerAsTxe().getLastBlockTimestamp();
163
179
  return toForeignCallResult([
164
180
  toSingle(new Fr(timestamp))
165
181
  ]);
166
182
  }
167
- async txeGetLastTxEffects() {
168
- const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
183
+ // eslint-disable-next-line camelcase
184
+ async aztec_txe_getLastTxEffects() {
185
+ const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().getLastTxEffects();
169
186
  return toForeignCallResult([
170
187
  toSingle(txHash.hash),
171
188
  ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
172
189
  ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
173
190
  ]);
174
191
  }
175
- async txeGetPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
192
+ // eslint-disable-next-line camelcase
193
+ async aztec_txe_getPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
176
194
  const selector = EventSelector.fromField(fromSingle(foreignSelector));
177
195
  const contractAddress = addressFromSingle(foreignContractAddress);
178
196
  const scope = addressFromSingle(foreignScope);
179
- const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
197
+ // TODO(F-335): Avoid doing the following 2 calls here.
198
+ {
199
+ await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
200
+ // We cycle job to commit the stores after the contract sync.
201
+ await this.stateHandler.cycleJob();
202
+ }
203
+ const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
180
204
  if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
181
205
  throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
182
206
  }
@@ -194,48 +218,54 @@ export class RPCTranslator {
194
218
  toSingle(queryLength)
195
219
  ]);
196
220
  }
197
- privateStoreInExecutionCache(foreignValues, foreignHash) {
221
+ // eslint-disable-next-line camelcase
222
+ aztec_prv_setHashPreimage(foreignValues, foreignHash) {
198
223
  const values = fromArray(foreignValues);
199
224
  const hash = fromSingle(foreignHash);
200
- this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
225
+ this.handlerAsPrivate().setHashPreimage(values, hash);
201
226
  return toForeignCallResult([]);
202
227
  }
203
- async privateLoadFromExecutionCache(foreignHash) {
228
+ // eslint-disable-next-line camelcase
229
+ async aztec_prv_getHashPreimage(foreignHash) {
204
230
  const hash = fromSingle(foreignHash);
205
- const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
231
+ const returns = await this.handlerAsPrivate().getHashPreimage(hash);
206
232
  return toForeignCallResult([
207
233
  toArray(returns)
208
234
  ]);
209
235
  }
210
236
  // When the argument is a slice, noir automatically adds a length field to oracle call.
211
237
  // When the argument is an array, we add the field length manually to the signature.
212
- utilityDebugLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
238
+ // eslint-disable-next-line camelcase
239
+ async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
213
240
  const level = fromSingle(foreignLevel).toNumber();
214
241
  const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
215
242
  const fields = fromArray(foreignFields);
216
- this.handlerAsMisc().utilityDebugLog(level, message, fields);
243
+ await this.handlerAsMisc().log(level, message, fields);
217
244
  return toForeignCallResult([]);
218
245
  }
219
- async utilityStorageRead(foreignContractAddress, foreignStartStorageSlot, foreignBlockNumber, foreignNumberOfElements) {
246
+ // eslint-disable-next-line camelcase
247
+ async aztec_utl_getFromPublicStorage(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
248
+ const blockHash = blockHashFromSingle(foreignBlockHash);
220
249
  const contractAddress = addressFromSingle(foreignContractAddress);
221
250
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
222
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
223
251
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
224
- const values = await this.handlerAsUtility().utilityStorageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements);
252
+ const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
225
253
  return toForeignCallResult([
226
254
  toArray(values)
227
255
  ]);
228
256
  }
229
- async utilityGetPublicDataWitness(foreignBlockNumber, foreignLeafSlot) {
230
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
257
+ // eslint-disable-next-line camelcase
258
+ async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
259
+ const blockHash = blockHashFromSingle(foreignBlockHash);
231
260
  const leafSlot = fromSingle(foreignLeafSlot);
232
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
261
+ const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
233
262
  if (!witness) {
234
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
263
+ throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
235
264
  }
236
265
  return toForeignCallResult(witness.toNoirRepresentation());
237
266
  }
238
- async utilityGetNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
267
+ // eslint-disable-next-line camelcase
268
+ async aztec_utl_getNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedHintedNoteLength) {
239
269
  // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
240
270
  const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
241
271
  const storageSlot = fromSingle(foreignStorageSlot);
@@ -253,23 +283,24 @@ export class RPCTranslator {
253
283
  const offset = fromSingle(foreignOffset).toNumber();
254
284
  const status = fromSingle(foreignStatus).toNumber();
255
285
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
256
- const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
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({
286
+ const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
287
+ const noteDatas = await this.handlerAsUtility().getNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
288
+ const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>packAsHintedNote({
259
289
  contractAddress: noteData.contractAddress,
260
290
  owner: noteData.owner,
261
291
  randomness: noteData.randomness,
262
292
  storageSlot: noteData.storageSlot,
263
293
  noteNonce: noteData.noteNonce,
264
- index: noteData.index,
294
+ isPending: noteData.isPending,
265
295
  note: noteData.note
266
296
  }));
267
297
  // Now we convert each sub-array to an array of ForeignCallSingles
268
298
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
269
299
  // At last we convert the array of arrays to a bounded vec of arrays
270
- return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedRetrievedNoteLength));
300
+ return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
271
301
  }
272
- privateNotifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
302
+ // eslint-disable-next-line camelcase
303
+ aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
273
304
  const owner = addressFromSingle(foreignOwner);
274
305
  const storageSlot = fromSingle(foreignStorageSlot);
275
306
  const randomness = fromSingle(foreignRandomness);
@@ -277,31 +308,44 @@ export class RPCTranslator {
277
308
  const note = fromArray(foreignNote);
278
309
  const noteHash = fromSingle(foreignNoteHash);
279
310
  const counter = fromSingle(foreignCounter).toNumber();
280
- this.handlerAsPrivate().privateNotifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
311
+ this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
281
312
  return toForeignCallResult([]);
282
313
  }
283
- async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
314
+ // eslint-disable-next-line camelcase
315
+ async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
284
316
  const innerNullifier = fromSingle(foreignInnerNullifier);
285
317
  const noteHash = fromSingle(foreignNoteHash);
286
318
  const counter = fromSingle(foreignCounter).toNumber();
287
- await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
319
+ await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
288
320
  return toForeignCallResult([]);
289
321
  }
290
- async privateNotifyCreatedNullifier(foreignInnerNullifier) {
322
+ // eslint-disable-next-line camelcase
323
+ async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
291
324
  const innerNullifier = fromSingle(foreignInnerNullifier);
292
- await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
325
+ await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
293
326
  return toForeignCallResult([]);
294
327
  }
295
- async utilityCheckNullifierExists(foreignInnerNullifier) {
328
+ // eslint-disable-next-line camelcase
329
+ async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
330
+ const innerNullifier = fromSingle(foreignInnerNullifier);
331
+ const contractAddress = addressFromSingle(foreignContractAddress);
332
+ const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
333
+ return toForeignCallResult([
334
+ toSingle(new Fr(isPending))
335
+ ]);
336
+ }
337
+ // eslint-disable-next-line camelcase
338
+ async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
296
339
  const innerNullifier = fromSingle(foreignInnerNullifier);
297
- const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
340
+ const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
298
341
  return toForeignCallResult([
299
342
  toSingle(new Fr(exists))
300
343
  ]);
301
344
  }
302
- async utilityGetContractInstance(foreignAddress) {
345
+ // eslint-disable-next-line camelcase
346
+ async aztec_utl_getContractInstance(foreignAddress) {
303
347
  const address = addressFromSingle(foreignAddress);
304
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
348
+ const instance = await this.handlerAsUtility().getContractInstance(address);
305
349
  return toForeignCallResult([
306
350
  instance.salt,
307
351
  instance.deployer.toField(),
@@ -310,36 +354,53 @@ export class RPCTranslator {
310
354
  ...instance.publicKeys.toFields()
311
355
  ].map(toSingle));
312
356
  }
313
- async utilityGetPublicKeysAndPartialAddress(foreignAddress) {
357
+ // eslint-disable-next-line camelcase
358
+ async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
314
359
  const address = addressFromSingle(foreignAddress);
315
- const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
316
- return toForeignCallResult([
317
- toArray([
318
- ...publicKeys.toFields(),
319
- partialAddress
320
- ])
321
- ]);
360
+ const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
361
+ // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
362
+ // with two fields: `some` (a boolean) and `value` (a field array in this case).
363
+ if (result === undefined) {
364
+ // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
365
+ return toForeignCallResult([
366
+ toSingle(new Fr(0)),
367
+ toArray(Array(13).fill(new Fr(0)))
368
+ ]);
369
+ } else {
370
+ // Data was found so we set `some` to 1 and return it along with `value`.
371
+ return toForeignCallResult([
372
+ toSingle(new Fr(1)),
373
+ toArray([
374
+ ...result.publicKeys.toFields(),
375
+ result.partialAddress
376
+ ])
377
+ ]);
378
+ }
322
379
  }
323
- async utilityGetKeyValidationRequest(foreignPkMHash) {
380
+ // eslint-disable-next-line camelcase
381
+ async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
324
382
  const pkMHash = fromSingle(foreignPkMHash);
325
- const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
383
+ const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
326
384
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
327
385
  }
328
- privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
386
+ // eslint-disable-next-line camelcase
387
+ aztec_prv_callPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
329
388
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
330
389
  }
331
- async utilityGetNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
332
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
390
+ // eslint-disable-next-line camelcase
391
+ async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
392
+ const blockHash = blockHashFromSingle(foreignBlockHash);
333
393
  const nullifier = fromSingle(foreignNullifier);
334
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
394
+ const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
335
395
  if (!witness) {
336
- throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
396
+ throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
337
397
  }
338
398
  return toForeignCallResult(witness.toNoirRepresentation());
339
399
  }
340
- async utilityGetAuthWitness(foreignMessageHash) {
400
+ // eslint-disable-next-line camelcase
401
+ async aztec_utl_getAuthWitness(foreignMessageHash) {
341
402
  const messageHash = fromSingle(foreignMessageHash);
342
- const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
403
+ const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
343
404
  if (!authWitness) {
344
405
  throw new Error(`Auth witness not found for message hash ${messageHash}.`);
345
406
  }
@@ -347,87 +408,152 @@ export class RPCTranslator {
347
408
  toArray(authWitness)
348
409
  ]);
349
410
  }
350
- privateNotifyEnqueuedPublicFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
351
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
352
- }
353
- privateNotifySetPublicTeardownFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
411
+ // eslint-disable-next-line camelcase
412
+ aztec_prv_assertValidPublicCalldata(_foreignCalldataHash) {
354
413
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
355
414
  }
356
- privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
415
+ // eslint-disable-next-line camelcase
416
+ aztec_prv_notifyRevertiblePhaseStart(_foreignMinRevertibleSideEffectCounter) {
357
417
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
358
418
  }
359
- async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
419
+ // eslint-disable-next-line camelcase
420
+ async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
360
421
  const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
361
- const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
422
+ const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
362
423
  return toForeignCallResult([
363
424
  toSingle(new Fr(isRevertible))
364
425
  ]);
365
426
  }
366
- utilityGetUtilityContext() {
367
- const context = this.handlerAsUtility().utilityGetUtilityContext();
427
+ // eslint-disable-next-line camelcase
428
+ aztec_utl_getUtilityContext() {
429
+ const context = this.handlerAsUtility().getUtilityContext();
368
430
  return toForeignCallResult(context.toNoirRepresentation());
369
431
  }
370
- async utilityGetBlockHeader(foreignBlockNumber) {
432
+ // eslint-disable-next-line camelcase
433
+ async aztec_utl_getBlockHeader(foreignBlockNumber) {
371
434
  const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
372
- const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
435
+ const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
373
436
  if (!header) {
374
437
  throw new Error(`Block header not found for block ${blockNumber}.`);
375
438
  }
376
439
  return toForeignCallResult(header.toFields().map(toSingle));
377
440
  }
378
- async utilityGetMembershipWitness(foreignBlockNumber, foreignTreeId, foreignLeafValue) {
379
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
380
- const treeId = fromSingle(foreignTreeId).toNumber();
381
- const leafValue = fromSingle(foreignLeafValue);
382
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
441
+ // eslint-disable-next-line camelcase
442
+ async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
443
+ const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
444
+ const noteHash = fromSingle(foreignNoteHash);
445
+ const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
383
446
  if (!witness) {
384
- throw new Error(`Membership witness in tree ${MerkleTreeId[treeId]} not found for value ${leafValue} at block ${blockNumber}.`);
447
+ throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
385
448
  }
386
- return toForeignCallResult([
387
- toSingle(witness[0]),
388
- toArray(witness.slice(1))
389
- ]);
449
+ return toForeignCallResult(witness.toNoirRepresentation());
390
450
  }
391
- async utilityGetLowNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
392
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
451
+ // eslint-disable-next-line camelcase
452
+ async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
453
+ const anchorBlockHash = blockHashFromSingle(foreignAnchorBlockHash);
454
+ const blockHash = blockHashFromSingle(foreignBlockHash);
455
+ const witness = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
456
+ if (!witness) {
457
+ throw new Error(`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`);
458
+ }
459
+ return toForeignCallResult(witness.toNoirRepresentation());
460
+ }
461
+ // eslint-disable-next-line camelcase
462
+ async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
463
+ const blockHash = blockHashFromSingle(foreignBlockHash);
393
464
  const nullifier = fromSingle(foreignNullifier);
394
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
465
+ const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
395
466
  if (!witness) {
396
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
467
+ throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
397
468
  }
398
469
  return toForeignCallResult(witness.toNoirRepresentation());
399
470
  }
400
- async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
471
+ // eslint-disable-next-line camelcase
472
+ async aztec_utl_getPendingTaggedLogs(foreignPendingTaggedLogArrayBaseSlot, foreignScope) {
401
473
  const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
402
- await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
474
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
475
+ await this.handlerAsUtility().getPendingTaggedLogs(pendingTaggedLogArrayBaseSlot, scope);
403
476
  return toForeignCallResult([]);
404
477
  }
405
- async utilityValidateEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
478
+ // eslint-disable-next-line camelcase
479
+ async aztec_utl_getPendingTaggedLogs_v2(foreignScope) {
480
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
481
+ const slot = await this.handlerAsUtility().getPendingTaggedLogsV2(scope);
482
+ return toForeignCallResult([
483
+ toSingle(slot)
484
+ ]);
485
+ }
486
+ // eslint-disable-next-line camelcase
487
+ async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen, foreignScope) {
406
488
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
407
489
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
408
490
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
409
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
491
+ const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
492
+ const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
493
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
494
+ await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen, scope);
410
495
  return toForeignCallResult([]);
411
496
  }
412
- async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
497
+ // eslint-disable-next-line camelcase
498
+ async aztec_utl_validateAndStoreEnqueuedNotesAndEvents_v2(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen, foreignScope) {
499
+ const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
500
+ const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
501
+ const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
502
+ const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
503
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
504
+ await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEventsV2(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen, scope);
505
+ return toForeignCallResult([]);
506
+ }
507
+ // eslint-disable-next-line camelcase
508
+ async aztec_utl_getLogsByTag(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot, foreignScope) {
413
509
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
414
510
  const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
415
511
  const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
416
- await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
512
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
513
+ await this.handlerAsUtility().getLogsByTag(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot, scope);
514
+ return toForeignCallResult([]);
515
+ }
516
+ // eslint-disable-next-line camelcase
517
+ async aztec_utl_getMessageContextsByTxHash(foreignContractAddress, foreignMessageContextRequestsArrayBaseSlot, foreignMessageContextResponsesArrayBaseSlot, foreignScope) {
518
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
519
+ const messageContextRequestsArrayBaseSlot = fromSingle(foreignMessageContextRequestsArrayBaseSlot);
520
+ const messageContextResponsesArrayBaseSlot = fromSingle(foreignMessageContextResponsesArrayBaseSlot);
521
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
522
+ await this.handlerAsUtility().getMessageContextsByTxHash(contractAddress, messageContextRequestsArrayBaseSlot, messageContextResponsesArrayBaseSlot, scope);
417
523
  return toForeignCallResult([]);
418
524
  }
419
- async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
525
+ // eslint-disable-next-line camelcase
526
+ async aztec_utl_getLogsByTag_v2(foreignRequestArrayBaseSlot) {
527
+ const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
528
+ const responseSlot = await this.handlerAsUtility().getLogsByTagV2(requestArrayBaseSlot);
529
+ return toForeignCallResult([
530
+ toSingle(responseSlot)
531
+ ]);
532
+ }
533
+ // eslint-disable-next-line camelcase
534
+ async aztec_utl_getMessageContextsByTxHash_v2(foreignRequestArrayBaseSlot) {
535
+ const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
536
+ const responseSlot = await this.handlerAsUtility().getMessageContextsByTxHashV2(requestArrayBaseSlot);
537
+ return toForeignCallResult([
538
+ toSingle(responseSlot)
539
+ ]);
540
+ }
541
+ // eslint-disable-next-line camelcase
542
+ aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
420
543
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
421
544
  const slot = fromSingle(foreignSlot);
422
545
  const capsule = fromArray(foreignCapsule);
423
- await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
546
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
547
+ this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
424
548
  return toForeignCallResult([]);
425
549
  }
426
- async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
550
+ // eslint-disable-next-line camelcase
551
+ async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
427
552
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
428
553
  const slot = fromSingle(foreignSlot);
429
554
  const tSize = fromSingle(foreignTSize).toNumber();
430
- const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
555
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
556
+ const values = await this.handlerAsUtility().getCapsule(contractAddress, slot, scope);
431
557
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
432
558
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
433
559
  if (values === null) {
@@ -444,197 +570,316 @@ export class RPCTranslator {
444
570
  ]);
445
571
  }
446
572
  }
447
- async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
573
+ // eslint-disable-next-line camelcase
574
+ aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
448
575
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
449
576
  const slot = fromSingle(foreignSlot);
450
- await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
577
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
578
+ this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
451
579
  return toForeignCallResult([]);
452
580
  }
453
- async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
581
+ // eslint-disable-next-line camelcase
582
+ async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
454
583
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
455
584
  const srcSlot = fromSingle(foreignSrcSlot);
456
585
  const dstSlot = fromSingle(foreignDstSlot);
457
586
  const numEntries = fromSingle(foreignNumEntries).toNumber();
458
- await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
587
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
588
+ await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
589
+ return toForeignCallResult([]);
590
+ }
591
+ // eslint-disable-next-line camelcase
592
+ aztec_utl_pushEphemeral(foreignSlot, foreignElements) {
593
+ const slot = fromSingle(foreignSlot);
594
+ const elements = fromArray(foreignElements);
595
+ const newLen = this.handlerAsUtility().pushEphemeral(slot, elements);
596
+ return toForeignCallResult([
597
+ toSingle(new Fr(newLen))
598
+ ]);
599
+ }
600
+ // eslint-disable-next-line camelcase
601
+ aztec_utl_popEphemeral(foreignSlot) {
602
+ const slot = fromSingle(foreignSlot);
603
+ const element = this.handlerAsUtility().popEphemeral(slot);
604
+ return toForeignCallResult([
605
+ toArray(element)
606
+ ]);
607
+ }
608
+ // eslint-disable-next-line camelcase
609
+ aztec_utl_getEphemeral(foreignSlot, foreignIndex) {
610
+ const slot = fromSingle(foreignSlot);
611
+ const index = fromSingle(foreignIndex).toNumber();
612
+ const element = this.handlerAsUtility().getEphemeral(slot, index);
613
+ return toForeignCallResult([
614
+ toArray(element)
615
+ ]);
616
+ }
617
+ // eslint-disable-next-line camelcase
618
+ aztec_utl_setEphemeral(foreignSlot, foreignIndex, foreignElements) {
619
+ const slot = fromSingle(foreignSlot);
620
+ const index = fromSingle(foreignIndex).toNumber();
621
+ const elements = fromArray(foreignElements);
622
+ this.handlerAsUtility().setEphemeral(slot, index, elements);
623
+ return toForeignCallResult([]);
624
+ }
625
+ // eslint-disable-next-line camelcase
626
+ aztec_utl_getEphemeralLen(foreignSlot) {
627
+ const slot = fromSingle(foreignSlot);
628
+ const len = this.handlerAsUtility().getEphemeralLen(slot);
629
+ return toForeignCallResult([
630
+ toSingle(new Fr(len))
631
+ ]);
632
+ }
633
+ // eslint-disable-next-line camelcase
634
+ aztec_utl_removeEphemeral(foreignSlot, foreignIndex) {
635
+ const slot = fromSingle(foreignSlot);
636
+ const index = fromSingle(foreignIndex).toNumber();
637
+ this.handlerAsUtility().removeEphemeral(slot, index);
638
+ return toForeignCallResult([]);
639
+ }
640
+ // eslint-disable-next-line camelcase
641
+ aztec_utl_clearEphemeral(foreignSlot) {
642
+ const slot = fromSingle(foreignSlot);
643
+ this.handlerAsUtility().clearEphemeral(slot);
459
644
  return toForeignCallResult([]);
460
645
  }
461
646
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
462
647
  // The compiler didn't throw an error, so it took me a while to learn of the existence of this file, and that I need
463
648
  // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
464
649
  // existence of a txe_oracle method?
465
- async utilityAes128Decrypt(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
650
+ // eslint-disable-next-line camelcase
651
+ async aztec_utl_decryptAes128(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
466
652
  const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
467
653
  const iv = fromUintArray(foreignIv, 8);
468
654
  const symKey = fromUintArray(foreignSymKey, 8);
469
- const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
470
- return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length));
655
+ // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
656
+ try {
657
+ const plaintextBuffer = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
658
+ const [storage, length] = arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length);
659
+ return toForeignCallResult([
660
+ toSingle(new Fr(1)),
661
+ storage,
662
+ length
663
+ ]);
664
+ } catch {
665
+ const zeroStorage = toArray(Array(foreignCiphertextBVecStorage.length).fill(new Fr(0)));
666
+ return toForeignCallResult([
667
+ toSingle(new Fr(0)),
668
+ zeroStorage,
669
+ toSingle(new Fr(0))
670
+ ]);
671
+ }
471
672
  }
472
- async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
673
+ // eslint-disable-next-line camelcase
674
+ async aztec_utl_getSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2, foreignContractAddress) {
473
675
  const address = AztecAddress.fromField(fromSingle(foreignAddress));
474
676
  const ephPK = Point.fromFields([
475
677
  fromSingle(foreignEphPKField0),
476
678
  fromSingle(foreignEphPKField1),
477
679
  fromSingle(foreignEphPKField2)
478
680
  ]);
479
- const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
480
- return toForeignCallResult(secret.toFields().map(toSingle));
681
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
682
+ const secret = await this.handlerAsUtility().getSharedSecret(address, ephPK, contractAddress);
683
+ return toForeignCallResult([
684
+ toSingle(secret)
685
+ ]);
686
+ }
687
+ // eslint-disable-next-line camelcase
688
+ aztec_utl_setContractSyncCacheInvalid(foreignContractAddress, foreignScopes, foreignScopeCount) {
689
+ const contractAddress = addressFromSingle(foreignContractAddress);
690
+ const count = fromSingle(foreignScopeCount).toNumber();
691
+ const scopes = fromArray(foreignScopes).slice(0, count).map((f)=>new AztecAddress(f));
692
+ this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
693
+ return Promise.resolve(toForeignCallResult([]));
481
694
  }
482
- emitOffchainEffect(_foreignData) {
695
+ // eslint-disable-next-line camelcase
696
+ aztec_utl_emitOffchainEffect(_foreignData) {
483
697
  throw new Error('Offchain effects are not yet supported in the TestEnvironment');
484
698
  }
485
699
  // AVM opcodes
486
- avmOpcodeEmitUnencryptedLog(_foreignMessage) {
700
+ // eslint-disable-next-line camelcase
701
+ aztec_avm_emitPublicLog(_foreignMessage) {
487
702
  // TODO(#8811): Implement
488
703
  return toForeignCallResult([]);
489
704
  }
490
- async avmOpcodeStorageRead(foreignSlot) {
705
+ // eslint-disable-next-line camelcase
706
+ async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
491
707
  const slot = fromSingle(foreignSlot);
492
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
708
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
709
+ const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
493
710
  return toForeignCallResult([
494
711
  toSingle(new Fr(value))
495
712
  ]);
496
713
  }
497
- async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
714
+ // eslint-disable-next-line camelcase
715
+ async aztec_avm_storageWrite(foreignSlot, foreignValue) {
498
716
  const slot = fromSingle(foreignSlot);
499
717
  const value = fromSingle(foreignValue);
500
- await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
718
+ await this.handlerAsAvm().storageWrite(slot, value);
501
719
  return toForeignCallResult([]);
502
720
  }
503
- async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
721
+ // eslint-disable-next-line camelcase
722
+ async aztec_avm_getContractInstanceDeployer(foreignAddress) {
504
723
  const address = addressFromSingle(foreignAddress);
505
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
724
+ const instance = await this.handlerAsUtility().getContractInstance(address);
506
725
  return toForeignCallResult([
507
726
  toSingle(instance.deployer),
508
727
  // AVM requires an extra boolean indicating the instance was found
509
728
  toSingle(new Fr(1))
510
729
  ]);
511
730
  }
512
- async avmOpcodeGetContractInstanceClassId(foreignAddress) {
731
+ // eslint-disable-next-line camelcase
732
+ async aztec_avm_getContractInstanceClassId(foreignAddress) {
513
733
  const address = addressFromSingle(foreignAddress);
514
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
734
+ const instance = await this.handlerAsUtility().getContractInstance(address);
515
735
  return toForeignCallResult([
516
736
  toSingle(instance.currentContractClassId),
517
737
  // AVM requires an extra boolean indicating the instance was found
518
738
  toSingle(new Fr(1))
519
739
  ]);
520
740
  }
521
- async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
741
+ // eslint-disable-next-line camelcase
742
+ async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
522
743
  const address = addressFromSingle(foreignAddress);
523
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
744
+ const instance = await this.handlerAsUtility().getContractInstance(address);
524
745
  return toForeignCallResult([
525
746
  toSingle(instance.initializationHash),
526
747
  // AVM requires an extra boolean indicating the instance was found
527
748
  toSingle(new Fr(1))
528
749
  ]);
529
750
  }
530
- async avmOpcodeSender() {
531
- const sender = await this.handlerAsAvm().avmOpcodeSender();
751
+ // eslint-disable-next-line camelcase
752
+ async aztec_avm_sender() {
753
+ const sender = await this.handlerAsAvm().sender();
532
754
  return toForeignCallResult([
533
755
  toSingle(sender)
534
756
  ]);
535
757
  }
536
- async avmOpcodeEmitNullifier(foreignNullifier) {
758
+ // eslint-disable-next-line camelcase
759
+ async aztec_avm_emitNullifier(foreignNullifier) {
537
760
  const nullifier = fromSingle(foreignNullifier);
538
- await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
761
+ await this.handlerAsAvm().emitNullifier(nullifier);
539
762
  return toForeignCallResult([]);
540
763
  }
541
- async avmOpcodeEmitNoteHash(foreignNoteHash) {
764
+ // eslint-disable-next-line camelcase
765
+ async aztec_avm_emitNoteHash(foreignNoteHash) {
542
766
  const noteHash = fromSingle(foreignNoteHash);
543
- await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
767
+ await this.handlerAsAvm().emitNoteHash(noteHash);
544
768
  return toForeignCallResult([]);
545
769
  }
546
- async avmOpcodeNullifierExists(foreignInnerNullifier, foreignTargetAddress) {
547
- const innerNullifier = fromSingle(foreignInnerNullifier);
548
- const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
549
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
770
+ // eslint-disable-next-line camelcase
771
+ async aztec_avm_nullifierExists(foreignSiloedNullifier) {
772
+ const siloedNullifier = fromSingle(foreignSiloedNullifier);
773
+ const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
550
774
  return toForeignCallResult([
551
775
  toSingle(new Fr(exists))
552
776
  ]);
553
777
  }
554
- async avmOpcodeAddress() {
555
- const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
778
+ // eslint-disable-next-line camelcase
779
+ async aztec_avm_address() {
780
+ const contractAddress = await this.handlerAsAvm().address();
556
781
  return toForeignCallResult([
557
782
  toSingle(contractAddress.toField())
558
783
  ]);
559
784
  }
560
- async avmOpcodeBlockNumber() {
561
- const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
785
+ // eslint-disable-next-line camelcase
786
+ async aztec_avm_blockNumber() {
787
+ const blockNumber = await this.handlerAsAvm().blockNumber();
562
788
  return toForeignCallResult([
563
789
  toSingle(new Fr(blockNumber))
564
790
  ]);
565
791
  }
566
- async avmOpcodeTimestamp() {
567
- const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
792
+ // eslint-disable-next-line camelcase
793
+ async aztec_avm_timestamp() {
794
+ const timestamp = await this.handlerAsAvm().timestamp();
568
795
  return toForeignCallResult([
569
796
  toSingle(new Fr(timestamp))
570
797
  ]);
571
798
  }
572
- async avmOpcodeIsStaticCall() {
573
- const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
799
+ // eslint-disable-next-line camelcase
800
+ async aztec_avm_isStaticCall() {
801
+ const isStaticCall = await this.handlerAsAvm().isStaticCall();
574
802
  return toForeignCallResult([
575
803
  toSingle(new Fr(isStaticCall ? 1 : 0))
576
804
  ]);
577
805
  }
578
- async avmOpcodeChainId() {
579
- const chainId = await this.handlerAsAvm().avmOpcodeChainId();
806
+ // eslint-disable-next-line camelcase
807
+ async aztec_avm_chainId() {
808
+ const chainId = await this.handlerAsAvm().chainId();
580
809
  return toForeignCallResult([
581
810
  toSingle(chainId)
582
811
  ]);
583
812
  }
584
- async avmOpcodeVersion() {
585
- const version = await this.handlerAsAvm().avmOpcodeVersion();
813
+ // eslint-disable-next-line camelcase
814
+ async aztec_avm_version() {
815
+ const version = await this.handlerAsAvm().version();
586
816
  return toForeignCallResult([
587
817
  toSingle(version)
588
818
  ]);
589
819
  }
590
- avmOpcodeReturndataSize() {
820
+ // eslint-disable-next-line camelcase
821
+ aztec_avm_returndataSize() {
591
822
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
592
823
  }
593
- avmOpcodeReturndataCopy(_foreignRdOffset, _foreignCopySize) {
824
+ // eslint-disable-next-line camelcase
825
+ aztec_avm_returndataCopy(_foreignRdOffset, _foreignCopySize) {
594
826
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
595
827
  }
596
- avmOpcodeCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
828
+ // eslint-disable-next-line camelcase
829
+ aztec_avm_call(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
597
830
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
598
831
  }
599
- avmOpcodeStaticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
832
+ // eslint-disable-next-line camelcase
833
+ aztec_avm_staticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
600
834
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
601
835
  }
602
- avmOpcodeSuccessCopy() {
836
+ // eslint-disable-next-line camelcase
837
+ aztec_avm_successCopy() {
603
838
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
604
839
  }
605
- async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
840
+ // eslint-disable-next-line camelcase
841
+ async aztec_txe_privateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
606
842
  const from = addressFromSingle(foreignFrom);
607
843
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
608
844
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
609
845
  const args = fromArray(foreignArgs);
610
846
  const argsHash = fromSingle(foreignArgsHash);
611
847
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
612
- const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
848
+ const returnValues = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, this.stateHandler.getCurrentJob());
849
+ // TODO(F-335): Avoid doing the following call here.
850
+ await this.stateHandler.cycleJob();
613
851
  return toForeignCallResult([
614
852
  toArray(returnValues)
615
853
  ]);
616
854
  }
617
- async txeSimulateUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
855
+ // eslint-disable-next-line camelcase
856
+ async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
618
857
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
619
858
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
620
859
  const args = fromArray(foreignArgs);
621
- const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(targetContractAddress, functionSelector, args);
860
+ const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob());
861
+ // TODO(F-335): Avoid doing the following call here.
862
+ await this.stateHandler.cycleJob();
622
863
  return toForeignCallResult([
623
864
  toArray(returnValues)
624
865
  ]);
625
866
  }
626
- async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
867
+ // eslint-disable-next-line camelcase
868
+ async aztec_txe_publicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
627
869
  const from = addressFromSingle(foreignFrom);
628
870
  const address = addressFromSingle(foreignAddress);
629
871
  const calldata = fromArray(foreignCalldata);
630
872
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
631
- const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
873
+ const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall);
874
+ // TODO(F-335): Avoid doing the following call here.
875
+ await this.stateHandler.cycleJob();
632
876
  return toForeignCallResult([
633
877
  toArray(returnValues)
634
878
  ]);
635
879
  }
636
- async privateGetSenderForTags() {
637
- const sender = await this.handlerAsPrivate().privateGetSenderForTags();
880
+ // eslint-disable-next-line camelcase
881
+ async aztec_prv_getSenderForTags() {
882
+ const sender = await this.handlerAsPrivate().getSenderForTags();
638
883
  // Return a Noir Option struct with `some` and `value` fields
639
884
  if (sender === undefined) {
640
885
  // No sender found, return Option with some=0 and value=0
@@ -650,15 +895,17 @@ export class RPCTranslator {
650
895
  ]);
651
896
  }
652
897
  }
653
- async privateSetSenderForTags(foreignSenderForTags) {
898
+ // eslint-disable-next-line camelcase
899
+ async aztec_prv_setSenderForTags(foreignSenderForTags) {
654
900
  const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
655
- await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
901
+ await this.handlerAsPrivate().setSenderForTags(senderForTags);
656
902
  return toForeignCallResult([]);
657
903
  }
658
- async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
904
+ // eslint-disable-next-line camelcase
905
+ async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
659
906
  const sender = AztecAddress.fromField(fromSingle(foreignSender));
660
907
  const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
661
- const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
908
+ const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
662
909
  return toForeignCallResult([
663
910
  toSingle(nextAppTag.value)
664
911
  ]);