@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.
- 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 +188 -80
- package/dest/rpc_translator.d.ts +30 -18
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +140 -61
- package/dest/state_machine/archiver.d.ts +21 -52
- 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 +20 -15
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +42 -25
- package/dest/state_machine/global_variable_builder.d.ts +6 -5
- 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 +9 -6
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +14 -7
- 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 +158 -52
- package/dest/util/encoding.d.ts +618 -19
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +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 -18
- 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 +233 -120
- package/src/rpc_translator.ts +171 -60
- package/src/state_machine/archiver.ts +59 -114
- package/src/state_machine/dummy_p2p_client.ts +58 -33
- package/src/state_machine/global_variable_builder.ts +21 -4
- package/src/state_machine/index.ts +60 -21
- package/src/state_machine/mock_epoch_cache.ts +15 -11
- package/src/state_machine/synchronizer.ts +6 -5
- package/src/txe_session.ts +219 -100
- 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 -15
- 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 = 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
|
-
|
|
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().
|
|
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(
|
|
327
|
-
const
|
|
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(
|
|
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 ${
|
|
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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
555
|
+
async utilityTryGetPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
|
|
474
556
|
const address = addressFromSingle(foreignAddress);
|
|
475
557
|
|
|
476
|
-
const
|
|
558
|
+
const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
|
|
477
559
|
|
|
478
|
-
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
|
+
}
|
|
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
|
-
|
|
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(
|
|
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 ${
|
|
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
|
-
|
|
556
|
-
const context =
|
|
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
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
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
|
|
578
|
-
const
|
|
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().
|
|
684
|
+
const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
582
685
|
|
|
583
686
|
if (!witness) {
|
|
584
687
|
throw new Error(
|
|
585
|
-
`
|
|
688
|
+
`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`,
|
|
586
689
|
);
|
|
587
690
|
}
|
|
588
|
-
return toForeignCallResult(
|
|
691
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
589
692
|
}
|
|
590
693
|
|
|
591
694
|
async utilityGetLowNullifierMembershipWitness(
|
|
592
|
-
|
|
695
|
+
foreignBlockHash: ForeignCallSingle,
|
|
593
696
|
foreignNullifier: ForeignCallSingle,
|
|
594
697
|
) {
|
|
595
|
-
const
|
|
698
|
+
const blockHash = new BlockHash(fromSingle(foreignBlockHash));
|
|
596
699
|
const nullifier = fromSingle(foreignNullifier);
|
|
597
700
|
|
|
598
|
-
const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
|
|
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 ${
|
|
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
|
|
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().
|
|
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
|
-
|
|
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(
|
|
837
|
-
const
|
|
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(
|
|
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
|
|
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().
|
|
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
|
|