@aztec/txe 0.0.1-commit.9593d84 → 0.0.1-commit.96dac018d

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 (78) hide show
  1. package/dest/constants.d.ts +3 -0
  2. package/dest/constants.d.ts.map +1 -0
  3. package/dest/constants.js +2 -0
  4. package/dest/index.d.ts +1 -1
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +85 -52
  7. package/dest/oracle/interfaces.d.ts +14 -10
  8. package/dest/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/oracle/txe_oracle_public_context.d.ts +7 -7
  10. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  11. package/dest/oracle/txe_oracle_public_context.js +10 -12
  12. package/dest/oracle/txe_oracle_top_level_context.d.ts +24 -15
  13. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  14. package/dest/oracle/txe_oracle_top_level_context.js +188 -80
  15. package/dest/rpc_translator.d.ts +30 -18
  16. package/dest/rpc_translator.d.ts.map +1 -1
  17. package/dest/rpc_translator.js +140 -61
  18. package/dest/state_machine/archiver.d.ts +21 -52
  19. package/dest/state_machine/archiver.d.ts.map +1 -1
  20. package/dest/state_machine/archiver.js +63 -94
  21. package/dest/state_machine/dummy_p2p_client.d.ts +20 -15
  22. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  23. package/dest/state_machine/dummy_p2p_client.js +42 -25
  24. package/dest/state_machine/global_variable_builder.d.ts +6 -5
  25. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  26. package/dest/state_machine/global_variable_builder.js +13 -1
  27. package/dest/state_machine/index.d.ts +7 -7
  28. package/dest/state_machine/index.d.ts.map +1 -1
  29. package/dest/state_machine/index.js +40 -23
  30. package/dest/state_machine/mock_epoch_cache.d.ts +9 -6
  31. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  32. package/dest/state_machine/mock_epoch_cache.js +14 -7
  33. package/dest/state_machine/synchronizer.d.ts +3 -2
  34. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  35. package/dest/state_machine/synchronizer.js +5 -4
  36. package/dest/txe_session.d.ts +26 -15
  37. package/dest/txe_session.d.ts.map +1 -1
  38. package/dest/txe_session.js +158 -52
  39. package/dest/util/encoding.d.ts +618 -19
  40. package/dest/util/encoding.d.ts.map +1 -1
  41. package/dest/util/encoding.js +1 -1
  42. package/dest/util/txe_account_store.d.ts +10 -0
  43. package/dest/util/txe_account_store.d.ts.map +1 -0
  44. package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
  45. package/dest/util/txe_public_contract_data_source.d.ts +8 -8
  46. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  47. package/dest/util/txe_public_contract_data_source.js +12 -29
  48. package/dest/utils/block_creation.d.ts +21 -6
  49. package/dest/utils/block_creation.d.ts.map +1 -1
  50. package/dest/utils/block_creation.js +38 -4
  51. package/dest/utils/tx_effect_creation.d.ts +3 -3
  52. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  53. package/dest/utils/tx_effect_creation.js +4 -7
  54. package/package.json +18 -18
  55. package/src/constants.ts +3 -0
  56. package/src/index.ts +97 -60
  57. package/src/oracle/interfaces.ts +16 -8
  58. package/src/oracle/txe_oracle_public_context.ts +12 -19
  59. package/src/oracle/txe_oracle_top_level_context.ts +233 -120
  60. package/src/rpc_translator.ts +171 -60
  61. package/src/state_machine/archiver.ts +59 -114
  62. package/src/state_machine/dummy_p2p_client.ts +58 -33
  63. package/src/state_machine/global_variable_builder.ts +21 -4
  64. package/src/state_machine/index.ts +60 -21
  65. package/src/state_machine/mock_epoch_cache.ts +15 -11
  66. package/src/state_machine/synchronizer.ts +6 -5
  67. package/src/txe_session.ts +219 -100
  68. package/src/util/encoding.ts +1 -1
  69. package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
  70. package/src/util/txe_public_contract_data_source.ts +20 -45
  71. package/src/utils/block_creation.ts +49 -15
  72. package/src/utils/tx_effect_creation.ts +5 -12
  73. package/dest/util/txe_account_data_provider.d.ts +0 -10
  74. package/dest/util/txe_account_data_provider.d.ts.map +0 -1
  75. package/dest/util/txe_contract_data_provider.d.ts +0 -12
  76. package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
  77. package/dest/util/txe_contract_data_provider.js +0 -22
  78. package/src/util/txe_contract_data_provider.ts +0 -36
@@ -1,15 +1,16 @@
1
1
  import type { ContractInstanceWithAddress } from '@aztec/aztec.js/contracts';
2
2
  import { Fr, Point } from '@aztec/aztec.js/fields';
3
3
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
4
+ import { BlockNumber } from '@aztec/foundation/branded-types';
4
5
  import {
5
6
  type IMiscOracle,
6
7
  type IPrivateExecutionOracle,
7
8
  type IUtilityExecutionOracle,
8
- packAsRetrievedNote,
9
+ packAsHintedNote,
9
10
  } from '@aztec/pxe/simulator';
10
- import { type ContractArtifact, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
11
+ import { type ContractArtifact, EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
11
12
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
12
- import { MerkleTreeId } from '@aztec/stdlib/trees';
13
+ import { BlockHash } from '@aztec/stdlib/block';
13
14
 
14
15
  import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
15
16
  import type { TXESessionStateHandler } from './txe_session.js';
@@ -29,6 +30,9 @@ import {
29
30
  toSingle,
30
31
  } from './util/encoding.js';
31
32
 
33
+ const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
34
+ const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
35
+
32
36
  export class UnavailableOracleError extends Error {
33
37
  constructor(oracleName: string) {
34
38
  super(`${oracleName} oracles not available with the current handler`);
@@ -117,7 +121,7 @@ export class RPCTranslator {
117
121
  : undefined;
118
122
 
119
123
  const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool()
120
- ? fromSingle(foreignAnchorBlockNumberValue).toNumber()
124
+ ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber())
121
125
  : undefined;
122
126
 
123
127
  const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
@@ -155,6 +159,12 @@ export class RPCTranslator {
155
159
 
156
160
  // TXE-specific oracles
157
161
 
162
+ txeGetDefaultAddress() {
163
+ const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
164
+
165
+ return toForeignCallResult([toSingle(defaultAddress)]);
166
+ }
167
+
158
168
  async txeGetNextBlockNumber() {
159
169
  const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
160
170
 
@@ -266,6 +276,46 @@ export class RPCTranslator {
266
276
  ]);
267
277
  }
268
278
 
279
+ async txeGetPrivateEvents(
280
+ foreignSelector: ForeignCallSingle,
281
+ foreignContractAddress: ForeignCallSingle,
282
+ foreignScope: ForeignCallSingle,
283
+ ) {
284
+ const selector = EventSelector.fromField(fromSingle(foreignSelector));
285
+ const contractAddress = addressFromSingle(foreignContractAddress);
286
+ const scope = addressFromSingle(foreignScope);
287
+
288
+ // TODO(F-335): Avoid doing the following 2 calls here.
289
+ {
290
+ await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
291
+ // We cycle job to commit the stores after the contract sync.
292
+ await this.stateHandler.cycleJob();
293
+ }
294
+
295
+ const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
296
+
297
+ if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
298
+ throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
299
+ }
300
+
301
+ if (events.some(e => e.length > MAX_EVENT_LEN)) {
302
+ throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
303
+ }
304
+
305
+ // This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
306
+ // multidimensional array in get_private_events_oracle and create the BoundedVecs here.
307
+ const rawArrayStorage = events
308
+ .map(e => e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0))))
309
+ .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0))))
310
+ .flat();
311
+ const eventLengths = events
312
+ .map(e => new Fr(e.length))
313
+ .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
314
+ const queryLength = new Fr(events.length);
315
+
316
+ return toForeignCallResult([toArray(rawArrayStorage), toArray(eventLengths), toSingle(queryLength)]);
317
+ }
318
+
269
319
  privateStoreInExecutionCache(foreignValues: ForeignCallArray, foreignHash: ForeignCallSingle) {
270
320
  const values = fromArray(foreignValues);
271
321
  const hash = fromSingle(foreignHash);
@@ -285,7 +335,7 @@ export class RPCTranslator {
285
335
 
286
336
  // When the argument is a slice, noir automatically adds a length field to oracle call.
287
337
  // When the argument is an array, we add the field length manually to the signature.
288
- utilityDebugLog(
338
+ async utilityLog(
289
339
  foreignLevel: ForeignCallSingle,
290
340
  foreignMessage: ForeignCallArray,
291
341
  _foreignLength: ForeignCallSingle,
@@ -297,45 +347,47 @@ export class RPCTranslator {
297
347
  .join('');
298
348
  const fields = fromArray(foreignFields);
299
349
 
300
- this.handlerAsMisc().utilityDebugLog(level, message, fields);
350
+ await this.handlerAsMisc().utilityLog(level, message, fields);
301
351
 
302
352
  return toForeignCallResult([]);
303
353
  }
304
354
 
305
355
  async utilityStorageRead(
356
+ foreignBlockHash: ForeignCallSingle,
306
357
  foreignContractAddress: ForeignCallSingle,
307
358
  foreignStartStorageSlot: ForeignCallSingle,
308
- foreignBlockNumber: ForeignCallSingle,
309
359
  foreignNumberOfElements: ForeignCallSingle,
310
360
  ) {
361
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
311
362
  const contractAddress = addressFromSingle(foreignContractAddress);
312
363
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
313
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
314
364
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
315
365
 
316
366
  const values = await this.handlerAsUtility().utilityStorageRead(
367
+ blockHash,
317
368
  contractAddress,
318
369
  startStorageSlot,
319
- blockNumber,
320
370
  numberOfElements,
321
371
  );
322
372
 
323
373
  return toForeignCallResult([toArray(values)]);
324
374
  }
325
375
 
326
- async utilityGetPublicDataWitness(foreignBlockNumber: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
327
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
376
+ async utilityGetPublicDataWitness(foreignBlockHash: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
377
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
328
378
  const leafSlot = fromSingle(foreignLeafSlot);
329
379
 
330
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
380
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockHash, leafSlot);
331
381
 
332
382
  if (!witness) {
333
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
383
+ throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
334
384
  }
335
385
  return toForeignCallResult(witness.toNoirRepresentation());
336
386
  }
337
387
 
338
388
  async utilityGetNotes(
389
+ foreignOwnerIsSome: ForeignCallSingle,
390
+ foreignOwnerValue: ForeignCallSingle,
339
391
  foreignStorageSlot: ForeignCallSingle,
340
392
  foreignNumSelects: ForeignCallSingle,
341
393
  foreignSelectByIndexes: ForeignCallArray,
@@ -351,8 +403,12 @@ export class RPCTranslator {
351
403
  foreignOffset: ForeignCallSingle,
352
404
  foreignStatus: ForeignCallSingle,
353
405
  foreignMaxNotes: ForeignCallSingle,
354
- foreignPackedRetrievedNoteLength: ForeignCallSingle,
406
+ foreignPackedHintedNoteLength: ForeignCallSingle,
355
407
  ) {
408
+ // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
409
+ const owner = fromSingle(foreignOwnerIsSome).toBool()
410
+ ? AztecAddress.fromField(fromSingle(foreignOwnerValue))
411
+ : undefined;
356
412
  const storageSlot = fromSingle(foreignStorageSlot);
357
413
  const numSelects = fromSingle(foreignNumSelects).toNumber();
358
414
  const selectByIndexes = fromArray(foreignSelectByIndexes).map(fr => fr.toNumber());
@@ -368,9 +424,10 @@ export class RPCTranslator {
368
424
  const offset = fromSingle(foreignOffset).toNumber();
369
425
  const status = fromSingle(foreignStatus).toNumber();
370
426
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
371
- const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
427
+ const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
372
428
 
373
429
  const noteDatas = await this.handlerAsUtility().utilityGetNotes(
430
+ owner,
374
431
  storageSlot,
375
432
  numSelects,
376
433
  selectByIndexes,
@@ -387,7 +444,17 @@ export class RPCTranslator {
387
444
  status,
388
445
  );
389
446
 
390
- const returnDataAsArrayOfArrays = noteDatas.map(packAsRetrievedNote);
447
+ const returnDataAsArrayOfArrays = noteDatas.map(noteData =>
448
+ packAsHintedNote({
449
+ contractAddress: noteData.contractAddress,
450
+ owner: noteData.owner,
451
+ randomness: noteData.randomness,
452
+ storageSlot: noteData.storageSlot,
453
+ noteNonce: noteData.noteNonce,
454
+ isPending: noteData.isPending,
455
+ note: noteData.note,
456
+ }),
457
+ );
391
458
 
392
459
  // Now we convert each sub-array to an array of ForeignCallSingles
393
460
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map(subArray =>
@@ -396,15 +463,12 @@ export class RPCTranslator {
396
463
 
397
464
  // At last we convert the array of arrays to a bounded vec of arrays
398
465
  return toForeignCallResult(
399
- arrayOfArraysToBoundedVecOfArrays(
400
- returnDataAsArrayOfForeignCallSingleArrays,
401
- maxNotes,
402
- packedRetrievedNoteLength,
403
- ),
466
+ arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength),
404
467
  );
405
468
  }
406
469
 
407
470
  privateNotifyCreatedNote(
471
+ foreignOwner: ForeignCallSingle,
408
472
  foreignStorageSlot: ForeignCallSingle,
409
473
  foreignRandomness: ForeignCallSingle,
410
474
  foreignNoteTypeId: ForeignCallSingle,
@@ -412,6 +476,7 @@ export class RPCTranslator {
412
476
  foreignNoteHash: ForeignCallSingle,
413
477
  foreignCounter: ForeignCallSingle,
414
478
  ) {
479
+ const owner = addressFromSingle(foreignOwner);
415
480
  const storageSlot = fromSingle(foreignStorageSlot);
416
481
  const randomness = fromSingle(foreignRandomness);
417
482
  const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
@@ -419,7 +484,15 @@ export class RPCTranslator {
419
484
  const noteHash = fromSingle(foreignNoteHash);
420
485
  const counter = fromSingle(foreignCounter).toNumber();
421
486
 
422
- this.handlerAsPrivate().privateNotifyCreatedNote(storageSlot, randomness, noteTypeId, note, noteHash, counter);
487
+ this.handlerAsPrivate().privateNotifyCreatedNote(
488
+ owner,
489
+ storageSlot,
490
+ randomness,
491
+ noteTypeId,
492
+ note,
493
+ noteHash,
494
+ counter,
495
+ );
423
496
 
424
497
  return toForeignCallResult([]);
425
498
  }
@@ -446,6 +519,15 @@ export class RPCTranslator {
446
519
  return toForeignCallResult([]);
447
520
  }
448
521
 
522
+ async privateIsNullifierPending(foreignInnerNullifier: ForeignCallSingle, foreignContractAddress: ForeignCallSingle) {
523
+ const innerNullifier = fromSingle(foreignInnerNullifier);
524
+ const contractAddress = addressFromSingle(foreignContractAddress);
525
+
526
+ const isPending = await this.handlerAsPrivate().privateIsNullifierPending(innerNullifier, contractAddress);
527
+
528
+ return toForeignCallResult([toSingle(new Fr(isPending))]);
529
+ }
530
+
449
531
  async utilityCheckNullifierExists(foreignInnerNullifier: ForeignCallSingle) {
450
532
  const innerNullifier = fromSingle(foreignInnerNullifier);
451
533
 
@@ -470,12 +552,23 @@ export class RPCTranslator {
470
552
  );
471
553
  }
472
554
 
473
- async utilityGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
555
+ async utilityTryGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
474
556
  const address = addressFromSingle(foreignAddress);
475
557
 
476
- const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
558
+ const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
477
559
 
478
- return toForeignCallResult([toArray([...publicKeys.toFields(), partialAddress])]);
560
+ // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
561
+ // with two fields: `some` (a boolean) and `value` (a field array in this case).
562
+ if (result === undefined) {
563
+ // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
564
+ return toForeignCallResult([toSingle(new Fr(0)), toArray(Array(13).fill(new Fr(0)))]);
565
+ } else {
566
+ // Data was found so we set `some` to 1 and return it along with `value`.
567
+ return toForeignCallResult([
568
+ toSingle(new Fr(1)),
569
+ toArray([...result.publicKeys.toFields(), result.partialAddress]),
570
+ ]);
571
+ }
479
572
  }
480
573
 
481
574
  async utilityGetKeyValidationRequest(foreignPkMHash: ForeignCallSingle) {
@@ -498,17 +591,14 @@ export class RPCTranslator {
498
591
  );
499
592
  }
500
593
 
501
- async utilityGetNullifierMembershipWitness(
502
- foreignBlockNumber: ForeignCallSingle,
503
- foreignNullifier: ForeignCallSingle,
504
- ) {
505
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
594
+ async utilityGetNullifierMembershipWitness(foreignBlockHash: ForeignCallSingle, foreignNullifier: ForeignCallSingle) {
595
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
506
596
  const nullifier = fromSingle(foreignNullifier);
507
597
 
508
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
598
+ const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockHash, nullifier);
509
599
 
510
600
  if (!witness) {
511
- throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
601
+ throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
512
602
  }
513
603
  return toForeignCallResult(witness.toNoirRepresentation());
514
604
  }
@@ -552,14 +642,14 @@ export class RPCTranslator {
552
642
  return toForeignCallResult([toSingle(new Fr(isRevertible))]);
553
643
  }
554
644
 
555
- async utilityGetUtilityContext() {
556
- const context = await this.handlerAsUtility().utilityGetUtilityContext();
645
+ utilityGetUtilityContext() {
646
+ const context = this.handlerAsUtility().utilityGetUtilityContext();
557
647
 
558
648
  return toForeignCallResult(context.toNoirRepresentation());
559
649
  }
560
650
 
561
651
  async utilityGetBlockHeader(foreignBlockNumber: ForeignCallSingle) {
562
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
652
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
563
653
 
564
654
  const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
565
655
 
@@ -569,36 +659,49 @@ export class RPCTranslator {
569
659
  return toForeignCallResult(header.toFields().map(toSingle));
570
660
  }
571
661
 
572
- async utilityGetMembershipWitness(
573
- foreignBlockNumber: ForeignCallSingle,
574
- foreignTreeId: ForeignCallSingle,
575
- foreignLeafValue: ForeignCallSingle,
662
+ async utilityGetNoteHashMembershipWitness(
663
+ foreignAnchorBlockHash: ForeignCallSingle,
664
+ foreignNoteHash: ForeignCallSingle,
665
+ ) {
666
+ const blockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
667
+ const noteHash = fromSingle(foreignNoteHash);
668
+
669
+ const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(blockHash, noteHash);
670
+
671
+ if (!witness) {
672
+ throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
673
+ }
674
+ return toForeignCallResult(witness.toNoirRepresentation());
675
+ }
676
+
677
+ async utilityGetBlockHashMembershipWitness(
678
+ foreignAnchorBlockHash: ForeignCallSingle,
679
+ foreignBlockHash: ForeignCallSingle,
576
680
  ) {
577
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
578
- const treeId = fromSingle(foreignTreeId).toNumber();
579
- const leafValue = fromSingle(foreignLeafValue);
681
+ const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
682
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
580
683
 
581
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
684
+ const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
582
685
 
583
686
  if (!witness) {
584
687
  throw new Error(
585
- `Membership witness in tree ${MerkleTreeId[treeId]} not found for value ${leafValue} at block ${blockNumber}.`,
688
+ `Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`,
586
689
  );
587
690
  }
588
- return toForeignCallResult([toSingle(witness[0]), toArray(witness.slice(1))]);
691
+ return toForeignCallResult(witness.toNoirRepresentation());
589
692
  }
590
693
 
591
694
  async utilityGetLowNullifierMembershipWitness(
592
- foreignBlockNumber: ForeignCallSingle,
695
+ foreignBlockHash: ForeignCallSingle,
593
696
  foreignNullifier: ForeignCallSingle,
594
697
  ) {
595
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
698
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
596
699
  const nullifier = fromSingle(foreignNullifier);
597
700
 
598
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
701
+ const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockHash, nullifier);
599
702
 
600
703
  if (!witness) {
601
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
704
+ throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
602
705
  }
603
706
  return toForeignCallResult(witness.toNoirRepresentation());
604
707
  }
@@ -611,7 +714,7 @@ export class RPCTranslator {
611
714
  return toForeignCallResult([]);
612
715
  }
613
716
 
614
- public async utilityValidateEnqueuedNotesAndEvents(
717
+ public async utilityValidateAndStoreEnqueuedNotesAndEvents(
615
718
  foreignContractAddress: ForeignCallSingle,
616
719
  foreignNoteValidationRequestsArrayBaseSlot: ForeignCallSingle,
617
720
  foreignEventValidationRequestsArrayBaseSlot: ForeignCallSingle,
@@ -620,7 +723,7 @@ export class RPCTranslator {
620
723
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
621
724
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
622
725
 
623
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
726
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
624
727
  contractAddress,
625
728
  noteValidationRequestsArrayBaseSlot,
626
729
  eventValidationRequestsArrayBaseSlot,
@@ -753,15 +856,16 @@ export class RPCTranslator {
753
856
 
754
857
  // AVM opcodes
755
858
 
756
- avmOpcodeEmitUnencryptedLog(_foreignMessage: ForeignCallArray) {
859
+ avmOpcodeEmitPublicLog(_foreignMessage: ForeignCallArray) {
757
860
  // TODO(#8811): Implement
758
861
  return toForeignCallResult([]);
759
862
  }
760
863
 
761
- async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle) {
864
+ async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle, foreignContractAddress: ForeignCallSingle) {
762
865
  const slot = fromSingle(foreignSlot);
866
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
763
867
 
764
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
868
+ const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot, contractAddress)).value;
765
869
 
766
870
  return toForeignCallResult([toSingle(new Fr(value))]);
767
871
  }
@@ -833,11 +937,10 @@ export class RPCTranslator {
833
937
  return toForeignCallResult([]);
834
938
  }
835
939
 
836
- async avmOpcodeNullifierExists(foreignInnerNullifier: ForeignCallSingle, foreignTargetAddress: ForeignCallSingle) {
837
- const innerNullifier = fromSingle(foreignInnerNullifier);
838
- const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
940
+ async avmOpcodeNullifierExists(foreignSiloedNullifier: ForeignCallSingle) {
941
+ const siloedNullifier = fromSingle(foreignSiloedNullifier);
839
942
 
840
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
943
+ const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(siloedNullifier);
841
944
 
842
945
  return toForeignCallResult([toSingle(new Fr(exists))]);
843
946
  }
@@ -942,12 +1045,15 @@ export class RPCTranslator {
942
1045
  args,
943
1046
  argsHash,
944
1047
  isStaticCall,
1048
+ this.stateHandler.getCurrentJob(),
945
1049
  );
946
1050
 
1051
+ // TODO(F-335): Avoid doing the following call here.
1052
+ await this.stateHandler.cycleJob();
947
1053
  return toForeignCallResult([toArray(returnValues)]);
948
1054
  }
949
1055
 
950
- async txeSimulateUtilityFunction(
1056
+ async txeExecuteUtilityFunction(
951
1057
  foreignTargetContractAddress: ForeignCallSingle,
952
1058
  foreignFunctionSelector: ForeignCallSingle,
953
1059
  foreignArgs: ForeignCallArray,
@@ -956,12 +1062,15 @@ export class RPCTranslator {
956
1062
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
957
1063
  const args = fromArray(foreignArgs);
958
1064
 
959
- const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(
1065
+ const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction(
960
1066
  targetContractAddress,
961
1067
  functionSelector,
962
1068
  args,
1069
+ this.stateHandler.getCurrentJob(),
963
1070
  );
964
1071
 
1072
+ // TODO(F-335): Avoid doing the following call here.
1073
+ await this.stateHandler.cycleJob();
965
1074
  return toForeignCallResult([toArray(returnValues)]);
966
1075
  }
967
1076
 
@@ -978,6 +1087,8 @@ export class RPCTranslator {
978
1087
 
979
1088
  const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
980
1089
 
1090
+ // TODO(F-335): Avoid doing the following call here.
1091
+ await this.stateHandler.cycleJob();
981
1092
  return toForeignCallResult([toArray(returnValues)]);
982
1093
  }
983
1094