@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.
- package/dest/bin/index.d.ts +1 -1
- package/dest/constants.d.ts +3 -0
- package/dest/constants.d.ts.map +1 -0
- package/dest/constants.js +2 -0
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +85 -52
- package/dest/oracle/interfaces.d.ts +14 -10
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.d.ts +7 -7
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +10 -12
- package/dest/oracle/txe_oracle_top_level_context.d.ts +24 -15
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +205 -88
- package/dest/rpc_translator.d.ts +35 -20
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +151 -65
- package/dest/state_machine/archiver.d.ts +21 -51
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +63 -94
- package/dest/state_machine/dummy_p2p_client.d.ts +21 -14
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +42 -22
- package/dest/state_machine/global_variable_builder.d.ts +6 -4
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +13 -1
- package/dest/state_machine/index.d.ts +7 -7
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +40 -23
- package/dest/state_machine/mock_epoch_cache.d.ts +14 -10
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +21 -13
- package/dest/state_machine/synchronizer.d.ts +3 -2
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +5 -4
- package/dest/txe_session.d.ts +26 -15
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +161 -53
- package/dest/util/encoding.d.ts +615 -16
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +1 -1
- package/dest/util/expected_failure_error.d.ts +1 -1
- package/dest/util/expected_failure_error.d.ts.map +1 -1
- package/dest/util/txe_account_store.d.ts +10 -0
- package/dest/util/txe_account_store.d.ts.map +1 -0
- package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
- package/dest/util/txe_public_contract_data_source.d.ts +8 -8
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +12 -29
- package/dest/utils/block_creation.d.ts +21 -6
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +38 -4
- package/dest/utils/tx_effect_creation.d.ts +3 -3
- package/dest/utils/tx_effect_creation.d.ts.map +1 -1
- package/dest/utils/tx_effect_creation.js +4 -7
- package/package.json +18 -17
- package/src/constants.ts +3 -0
- package/src/index.ts +97 -60
- package/src/oracle/interfaces.ts +16 -8
- package/src/oracle/txe_oracle_public_context.ts +12 -19
- package/src/oracle/txe_oracle_top_level_context.ts +249 -127
- package/src/rpc_translator.ts +179 -68
- package/src/state_machine/archiver.ts +63 -117
- package/src/state_machine/dummy_p2p_client.ts +59 -29
- package/src/state_machine/global_variable_builder.ts +22 -4
- package/src/state_machine/index.ts +60 -21
- package/src/state_machine/mock_epoch_cache.ts +25 -20
- package/src/state_machine/synchronizer.ts +6 -5
- package/src/txe_session.ts +222 -101
- package/src/util/encoding.ts +1 -1
- package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
- package/src/util/txe_public_contract_data_source.ts +20 -45
- package/src/utils/block_creation.ts +49 -14
- package/src/utils/tx_effect_creation.ts +5 -12
- package/dest/util/txe_account_data_provider.d.ts +0 -10
- package/dest/util/txe_account_data_provider.d.ts.map +0 -1
- package/dest/util/txe_contract_data_provider.d.ts +0 -12
- package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
- package/dest/util/txe_contract_data_provider.js +0 -22
- package/src/util/txe_contract_data_provider.ts +0 -36
package/src/rpc_translator.ts
CHANGED
|
@@ -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
|
-
|
|
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 {
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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
|
-
|
|
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().
|
|
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(
|
|
332
|
-
const
|
|
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(
|
|
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 ${
|
|
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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
555
|
+
async utilityTryGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
|
|
477
556
|
const address = addressFromSingle(foreignAddress);
|
|
478
557
|
|
|
479
|
-
const
|
|
558
|
+
const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
|
|
480
559
|
|
|
481
|
-
return
|
|
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
|
-
|
|
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(
|
|
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 ${
|
|
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
|
|
553
|
-
const
|
|
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
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|
|
575
|
-
const
|
|
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().
|
|
684
|
+
const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
579
685
|
|
|
580
686
|
if (!witness) {
|
|
581
687
|
throw new Error(
|
|
582
|
-
`
|
|
688
|
+
`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`,
|
|
583
689
|
);
|
|
584
690
|
}
|
|
585
|
-
return toForeignCallResult(
|
|
691
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
586
692
|
}
|
|
587
693
|
|
|
588
694
|
async utilityGetLowNullifierMembershipWitness(
|
|
589
|
-
|
|
695
|
+
foreignBlockHash: ForeignCallSingle,
|
|
590
696
|
foreignNullifier: ForeignCallSingle,
|
|
591
697
|
) {
|
|
592
|
-
const
|
|
698
|
+
const blockHash = new BlockHash(fromSingle(foreignBlockHash));
|
|
593
699
|
const nullifier = fromSingle(foreignNullifier);
|
|
594
700
|
|
|
595
|
-
const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
|
|
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 ${
|
|
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
|
|
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().
|
|
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
|
-
|
|
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(
|
|
834
|
-
const
|
|
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(
|
|
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
|
|
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().
|
|
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
|
|