@aztec/txe 0.0.1-commit.b655e406 → 0.0.1-commit.c0b82b2

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 (81) hide show
  1. package/dest/bin/index.d.ts +1 -1
  2. package/dest/constants.d.ts +3 -0
  3. package/dest/constants.d.ts.map +1 -0
  4. package/dest/constants.js +2 -0
  5. package/dest/index.d.ts +1 -1
  6. package/dest/index.d.ts.map +1 -1
  7. package/dest/index.js +85 -52
  8. package/dest/oracle/interfaces.d.ts +14 -10
  9. package/dest/oracle/interfaces.d.ts.map +1 -1
  10. package/dest/oracle/txe_oracle_public_context.d.ts +7 -7
  11. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  12. package/dest/oracle/txe_oracle_public_context.js +10 -12
  13. package/dest/oracle/txe_oracle_top_level_context.d.ts +24 -15
  14. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  15. package/dest/oracle/txe_oracle_top_level_context.js +205 -88
  16. package/dest/rpc_translator.d.ts +35 -20
  17. package/dest/rpc_translator.d.ts.map +1 -1
  18. package/dest/rpc_translator.js +151 -65
  19. package/dest/state_machine/archiver.d.ts +21 -51
  20. package/dest/state_machine/archiver.d.ts.map +1 -1
  21. package/dest/state_machine/archiver.js +63 -94
  22. package/dest/state_machine/dummy_p2p_client.d.ts +21 -14
  23. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  24. package/dest/state_machine/dummy_p2p_client.js +42 -22
  25. package/dest/state_machine/global_variable_builder.d.ts +6 -4
  26. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  27. package/dest/state_machine/global_variable_builder.js +13 -1
  28. package/dest/state_machine/index.d.ts +7 -7
  29. package/dest/state_machine/index.d.ts.map +1 -1
  30. package/dest/state_machine/index.js +40 -23
  31. package/dest/state_machine/mock_epoch_cache.d.ts +14 -10
  32. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  33. package/dest/state_machine/mock_epoch_cache.js +21 -13
  34. package/dest/state_machine/synchronizer.d.ts +3 -2
  35. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  36. package/dest/state_machine/synchronizer.js +5 -4
  37. package/dest/txe_session.d.ts +26 -15
  38. package/dest/txe_session.d.ts.map +1 -1
  39. package/dest/txe_session.js +161 -53
  40. package/dest/util/encoding.d.ts +615 -16
  41. package/dest/util/encoding.d.ts.map +1 -1
  42. package/dest/util/encoding.js +1 -1
  43. package/dest/util/expected_failure_error.d.ts +1 -1
  44. package/dest/util/expected_failure_error.d.ts.map +1 -1
  45. package/dest/util/txe_account_store.d.ts +10 -0
  46. package/dest/util/txe_account_store.d.ts.map +1 -0
  47. package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
  48. package/dest/util/txe_public_contract_data_source.d.ts +8 -8
  49. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  50. package/dest/util/txe_public_contract_data_source.js +12 -29
  51. package/dest/utils/block_creation.d.ts +21 -6
  52. package/dest/utils/block_creation.d.ts.map +1 -1
  53. package/dest/utils/block_creation.js +38 -4
  54. package/dest/utils/tx_effect_creation.d.ts +3 -3
  55. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  56. package/dest/utils/tx_effect_creation.js +4 -7
  57. package/package.json +18 -17
  58. package/src/constants.ts +3 -0
  59. package/src/index.ts +97 -60
  60. package/src/oracle/interfaces.ts +16 -8
  61. package/src/oracle/txe_oracle_public_context.ts +12 -19
  62. package/src/oracle/txe_oracle_top_level_context.ts +249 -127
  63. package/src/rpc_translator.ts +179 -68
  64. package/src/state_machine/archiver.ts +63 -117
  65. package/src/state_machine/dummy_p2p_client.ts +59 -29
  66. package/src/state_machine/global_variable_builder.ts +22 -4
  67. package/src/state_machine/index.ts +60 -21
  68. package/src/state_machine/mock_epoch_cache.ts +25 -20
  69. package/src/state_machine/synchronizer.ts +6 -5
  70. package/src/txe_session.ts +222 -101
  71. package/src/util/encoding.ts +1 -1
  72. package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
  73. package/src/util/txe_public_contract_data_source.ts +20 -45
  74. package/src/utils/block_creation.ts +49 -14
  75. package/src/utils/tx_effect_creation.ts +5 -12
  76. package/dest/util/txe_account_data_provider.d.ts +0 -10
  77. package/dest/util/txe_account_data_provider.d.ts.map +0 -1
  78. package/dest/util/txe_contract_data_provider.d.ts +0 -12
  79. package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
  80. package/dest/util/txe_contract_data_provider.js +0 -22
  81. 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 = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
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,12 +276,47 @@ export class RPCTranslator {
266
276
  ]);
267
277
  }
268
278
 
269
- // Since the argument is a slice, noir automatically adds a length field to oracle call.
270
- privateStoreInExecutionCache(
271
- _foreignLength: ForeignCallSingle,
272
- foreignValues: ForeignCallArray,
273
- foreignHash: ForeignCallSingle,
279
+ async txeGetPrivateEvents(
280
+ foreignSelector: ForeignCallSingle,
281
+ foreignContractAddress: ForeignCallSingle,
282
+ foreignScope: ForeignCallSingle,
274
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
+
319
+ privateStoreInExecutionCache(foreignValues: ForeignCallArray, foreignHash: ForeignCallSingle) {
275
320
  const values = fromArray(foreignValues);
276
321
  const hash = fromSingle(foreignHash);
277
322
 
@@ -290,7 +335,7 @@ export class RPCTranslator {
290
335
 
291
336
  // When the argument is a slice, noir automatically adds a length field to oracle call.
292
337
  // When the argument is an array, we add the field length manually to the signature.
293
- utilityDebugLog(
338
+ async utilityLog(
294
339
  foreignLevel: ForeignCallSingle,
295
340
  foreignMessage: ForeignCallArray,
296
341
  _foreignLength: ForeignCallSingle,
@@ -302,45 +347,47 @@ export class RPCTranslator {
302
347
  .join('');
303
348
  const fields = fromArray(foreignFields);
304
349
 
305
- this.handlerAsMisc().utilityDebugLog(level, message, fields);
350
+ await this.handlerAsMisc().utilityLog(level, message, fields);
306
351
 
307
352
  return toForeignCallResult([]);
308
353
  }
309
354
 
310
355
  async utilityStorageRead(
356
+ foreignBlockHash: ForeignCallSingle,
311
357
  foreignContractAddress: ForeignCallSingle,
312
358
  foreignStartStorageSlot: ForeignCallSingle,
313
- foreignBlockNumber: ForeignCallSingle,
314
359
  foreignNumberOfElements: ForeignCallSingle,
315
360
  ) {
361
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
316
362
  const contractAddress = addressFromSingle(foreignContractAddress);
317
363
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
318
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
319
364
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
320
365
 
321
366
  const values = await this.handlerAsUtility().utilityStorageRead(
367
+ blockHash,
322
368
  contractAddress,
323
369
  startStorageSlot,
324
- blockNumber,
325
370
  numberOfElements,
326
371
  );
327
372
 
328
373
  return toForeignCallResult([toArray(values)]);
329
374
  }
330
375
 
331
- async utilityGetPublicDataWitness(foreignBlockNumber: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
332
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
376
+ async utilityGetPublicDataWitness(foreignBlockHash: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
377
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
333
378
  const leafSlot = fromSingle(foreignLeafSlot);
334
379
 
335
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
380
+ const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockHash, leafSlot);
336
381
 
337
382
  if (!witness) {
338
- 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()}.`);
339
384
  }
340
385
  return toForeignCallResult(witness.toNoirRepresentation());
341
386
  }
342
387
 
343
388
  async utilityGetNotes(
389
+ foreignOwnerIsSome: ForeignCallSingle,
390
+ foreignOwnerValue: ForeignCallSingle,
344
391
  foreignStorageSlot: ForeignCallSingle,
345
392
  foreignNumSelects: ForeignCallSingle,
346
393
  foreignSelectByIndexes: ForeignCallArray,
@@ -356,8 +403,12 @@ export class RPCTranslator {
356
403
  foreignOffset: ForeignCallSingle,
357
404
  foreignStatus: ForeignCallSingle,
358
405
  foreignMaxNotes: ForeignCallSingle,
359
- foreignPackedRetrievedNoteLength: ForeignCallSingle,
406
+ foreignPackedHintedNoteLength: ForeignCallSingle,
360
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;
361
412
  const storageSlot = fromSingle(foreignStorageSlot);
362
413
  const numSelects = fromSingle(foreignNumSelects).toNumber();
363
414
  const selectByIndexes = fromArray(foreignSelectByIndexes).map(fr => fr.toNumber());
@@ -373,9 +424,10 @@ export class RPCTranslator {
373
424
  const offset = fromSingle(foreignOffset).toNumber();
374
425
  const status = fromSingle(foreignStatus).toNumber();
375
426
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
376
- const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
427
+ const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
377
428
 
378
429
  const noteDatas = await this.handlerAsUtility().utilityGetNotes(
430
+ owner,
379
431
  storageSlot,
380
432
  numSelects,
381
433
  selectByIndexes,
@@ -392,7 +444,17 @@ export class RPCTranslator {
392
444
  status,
393
445
  );
394
446
 
395
- 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
+ );
396
458
 
397
459
  // Now we convert each sub-array to an array of ForeignCallSingles
398
460
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map(subArray =>
@@ -401,28 +463,36 @@ export class RPCTranslator {
401
463
 
402
464
  // At last we convert the array of arrays to a bounded vec of arrays
403
465
  return toForeignCallResult(
404
- arrayOfArraysToBoundedVecOfArrays(
405
- returnDataAsArrayOfForeignCallSingleArrays,
406
- maxNotes,
407
- packedRetrievedNoteLength,
408
- ),
466
+ arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength),
409
467
  );
410
468
  }
411
469
 
412
470
  privateNotifyCreatedNote(
471
+ foreignOwner: ForeignCallSingle,
413
472
  foreignStorageSlot: ForeignCallSingle,
473
+ foreignRandomness: ForeignCallSingle,
414
474
  foreignNoteTypeId: ForeignCallSingle,
415
475
  foreignNote: ForeignCallArray,
416
476
  foreignNoteHash: ForeignCallSingle,
417
477
  foreignCounter: ForeignCallSingle,
418
478
  ) {
479
+ const owner = addressFromSingle(foreignOwner);
419
480
  const storageSlot = fromSingle(foreignStorageSlot);
481
+ const randomness = fromSingle(foreignRandomness);
420
482
  const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
421
483
  const note = fromArray(foreignNote);
422
484
  const noteHash = fromSingle(foreignNoteHash);
423
485
  const counter = fromSingle(foreignCounter).toNumber();
424
486
 
425
- this.handlerAsPrivate().privateNotifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter);
487
+ this.handlerAsPrivate().privateNotifyCreatedNote(
488
+ owner,
489
+ storageSlot,
490
+ randomness,
491
+ noteTypeId,
492
+ note,
493
+ noteHash,
494
+ counter,
495
+ );
426
496
 
427
497
  return toForeignCallResult([]);
428
498
  }
@@ -449,6 +519,15 @@ export class RPCTranslator {
449
519
  return toForeignCallResult([]);
450
520
  }
451
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
+
452
531
  async utilityCheckNullifierExists(foreignInnerNullifier: ForeignCallSingle) {
453
532
  const innerNullifier = fromSingle(foreignInnerNullifier);
454
533
 
@@ -473,12 +552,23 @@ export class RPCTranslator {
473
552
  );
474
553
  }
475
554
 
476
- async utilityGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
555
+ async utilityTryGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
477
556
  const address = addressFromSingle(foreignAddress);
478
557
 
479
- const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
558
+ const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
480
559
 
481
- 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
+ }
482
572
  }
483
573
 
484
574
  async utilityGetKeyValidationRequest(foreignPkMHash: ForeignCallSingle) {
@@ -501,17 +591,14 @@ export class RPCTranslator {
501
591
  );
502
592
  }
503
593
 
504
- async utilityGetNullifierMembershipWitness(
505
- foreignBlockNumber: ForeignCallSingle,
506
- foreignNullifier: ForeignCallSingle,
507
- ) {
508
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
594
+ async utilityGetNullifierMembershipWitness(foreignBlockHash: ForeignCallSingle, foreignNullifier: ForeignCallSingle) {
595
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
509
596
  const nullifier = fromSingle(foreignNullifier);
510
597
 
511
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
598
+ const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockHash, nullifier);
512
599
 
513
600
  if (!witness) {
514
- throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
601
+ throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
515
602
  }
516
603
  return toForeignCallResult(witness.toNoirRepresentation());
517
604
  }
@@ -549,14 +636,20 @@ export class RPCTranslator {
549
636
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
550
637
  }
551
638
 
552
- async utilityGetUtilityContext() {
553
- const context = await this.handlerAsUtility().utilityGetUtilityContext();
639
+ public async privateIsSideEffectCounterRevertible(foreignSideEffectCounter: ForeignCallSingle) {
640
+ const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
641
+ const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
642
+ return toForeignCallResult([toSingle(new Fr(isRevertible))]);
643
+ }
644
+
645
+ utilityGetUtilityContext() {
646
+ const context = this.handlerAsUtility().utilityGetUtilityContext();
554
647
 
555
648
  return toForeignCallResult(context.toNoirRepresentation());
556
649
  }
557
650
 
558
651
  async utilityGetBlockHeader(foreignBlockNumber: ForeignCallSingle) {
559
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
652
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
560
653
 
561
654
  const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
562
655
 
@@ -566,36 +659,49 @@ export class RPCTranslator {
566
659
  return toForeignCallResult(header.toFields().map(toSingle));
567
660
  }
568
661
 
569
- async utilityGetMembershipWitness(
570
- foreignBlockNumber: ForeignCallSingle,
571
- foreignTreeId: ForeignCallSingle,
572
- 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,
573
680
  ) {
574
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
575
- const treeId = fromSingle(foreignTreeId).toNumber();
576
- const leafValue = fromSingle(foreignLeafValue);
681
+ const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
682
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
577
683
 
578
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
684
+ const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
579
685
 
580
686
  if (!witness) {
581
687
  throw new Error(
582
- `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()}.`,
583
689
  );
584
690
  }
585
- return toForeignCallResult([toSingle(witness[0]), toArray(witness.slice(1))]);
691
+ return toForeignCallResult(witness.toNoirRepresentation());
586
692
  }
587
693
 
588
694
  async utilityGetLowNullifierMembershipWitness(
589
- foreignBlockNumber: ForeignCallSingle,
695
+ foreignBlockHash: ForeignCallSingle,
590
696
  foreignNullifier: ForeignCallSingle,
591
697
  ) {
592
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
698
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
593
699
  const nullifier = fromSingle(foreignNullifier);
594
700
 
595
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
701
+ const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockHash, nullifier);
596
702
 
597
703
  if (!witness) {
598
- 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}.`);
599
705
  }
600
706
  return toForeignCallResult(witness.toNoirRepresentation());
601
707
  }
@@ -608,7 +714,7 @@ export class RPCTranslator {
608
714
  return toForeignCallResult([]);
609
715
  }
610
716
 
611
- public async utilityValidateEnqueuedNotesAndEvents(
717
+ public async utilityValidateAndStoreEnqueuedNotesAndEvents(
612
718
  foreignContractAddress: ForeignCallSingle,
613
719
  foreignNoteValidationRequestsArrayBaseSlot: ForeignCallSingle,
614
720
  foreignEventValidationRequestsArrayBaseSlot: ForeignCallSingle,
@@ -617,7 +723,7 @@ export class RPCTranslator {
617
723
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
618
724
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
619
725
 
620
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(
726
+ await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
621
727
  contractAddress,
622
728
  noteValidationRequestsArrayBaseSlot,
623
729
  eventValidationRequestsArrayBaseSlot,
@@ -750,15 +856,16 @@ export class RPCTranslator {
750
856
 
751
857
  // AVM opcodes
752
858
 
753
- avmOpcodeEmitUnencryptedLog(_foreignMessage: ForeignCallArray) {
859
+ avmOpcodeEmitPublicLog(_foreignMessage: ForeignCallArray) {
754
860
  // TODO(#8811): Implement
755
861
  return toForeignCallResult([]);
756
862
  }
757
863
 
758
- async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle) {
864
+ async avmOpcodeStorageRead(foreignSlot: ForeignCallSingle, foreignContractAddress: ForeignCallSingle) {
759
865
  const slot = fromSingle(foreignSlot);
866
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
760
867
 
761
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
868
+ const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot, contractAddress)).value;
762
869
 
763
870
  return toForeignCallResult([toSingle(new Fr(value))]);
764
871
  }
@@ -830,11 +937,10 @@ export class RPCTranslator {
830
937
  return toForeignCallResult([]);
831
938
  }
832
939
 
833
- async avmOpcodeNullifierExists(foreignInnerNullifier: ForeignCallSingle, foreignTargetAddress: ForeignCallSingle) {
834
- const innerNullifier = fromSingle(foreignInnerNullifier);
835
- const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
940
+ async avmOpcodeNullifierExists(foreignSiloedNullifier: ForeignCallSingle) {
941
+ const siloedNullifier = fromSingle(foreignSiloedNullifier);
836
942
 
837
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
943
+ const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(siloedNullifier);
838
944
 
839
945
  return toForeignCallResult([toSingle(new Fr(exists))]);
840
946
  }
@@ -921,7 +1027,6 @@ export class RPCTranslator {
921
1027
  foreignFrom: ForeignCallSingle,
922
1028
  foreignTargetContractAddress: ForeignCallSingle,
923
1029
  foreignFunctionSelector: ForeignCallSingle,
924
- _foreignArgsLength: ForeignCallSingle,
925
1030
  foreignArgs: ForeignCallArray,
926
1031
  foreignArgsHash: ForeignCallSingle,
927
1032
  foreignIsStaticCall: ForeignCallSingle,
@@ -940,34 +1045,38 @@ export class RPCTranslator {
940
1045
  args,
941
1046
  argsHash,
942
1047
  isStaticCall,
1048
+ this.stateHandler.getCurrentJob(),
943
1049
  );
944
1050
 
1051
+ // TODO(F-335): Avoid doing the following call here.
1052
+ await this.stateHandler.cycleJob();
945
1053
  return toForeignCallResult([toArray(returnValues)]);
946
1054
  }
947
1055
 
948
- async txeSimulateUtilityFunction(
1056
+ async txeExecuteUtilityFunction(
949
1057
  foreignTargetContractAddress: ForeignCallSingle,
950
1058
  foreignFunctionSelector: ForeignCallSingle,
951
- _foreignArgsLength: ForeignCallSingle,
952
1059
  foreignArgs: ForeignCallArray,
953
1060
  ) {
954
1061
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
955
1062
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
956
1063
  const args = fromArray(foreignArgs);
957
1064
 
958
- const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(
1065
+ const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction(
959
1066
  targetContractAddress,
960
1067
  functionSelector,
961
1068
  args,
1069
+ this.stateHandler.getCurrentJob(),
962
1070
  );
963
1071
 
1072
+ // TODO(F-335): Avoid doing the following call here.
1073
+ await this.stateHandler.cycleJob();
964
1074
  return toForeignCallResult([toArray(returnValues)]);
965
1075
  }
966
1076
 
967
1077
  async txePublicCallNewFlow(
968
1078
  foreignFrom: ForeignCallSingle,
969
1079
  foreignAddress: ForeignCallSingle,
970
- _foreignLength: ForeignCallSingle,
971
1080
  foreignCalldata: ForeignCallArray,
972
1081
  foreignIsStaticCall: ForeignCallSingle,
973
1082
  ) {
@@ -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