@aztec/txe 0.80.0 → 0.82.0
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.js +1 -0
- package/dest/node/txe_node.d.ts +10 -39
- package/dest/node/txe_node.d.ts.map +1 -1
- package/dest/node/txe_node.js +64 -88
- package/dest/oracle/txe_oracle.d.ts +8 -7
- package/dest/oracle/txe_oracle.d.ts.map +1 -1
- package/dest/oracle/txe_oracle.js +23 -20
- package/dest/txe_service/txe_service.d.ts +11 -2
- package/dest/txe_service/txe_service.d.ts.map +1 -1
- package/dest/txe_service/txe_service.js +54 -42
- package/dest/util/encoding.d.ts +14 -3
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +27 -8
- package/dest/util/txe_public_contract_data_source.d.ts +1 -3
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +0 -15
- package/dest/util/{txe_world_state_db.d.ts → txe_public_dbs.d.ts} +4 -5
- package/dest/util/txe_public_dbs.d.ts.map +1 -0
- package/dest/util/{txe_world_state_db.js → txe_public_dbs.js} +4 -4
- package/package.json +12 -12
- package/src/bin/index.ts +1 -0
- package/src/node/txe_node.ts +86 -129
- package/src/oracle/txe_oracle.ts +49 -33
- package/src/txe_service/txe_service.ts +76 -21
- package/src/util/encoding.ts +33 -8
- package/src/util/txe_public_contract_data_source.ts +0 -14
- package/src/util/{txe_world_state_db.ts → txe_public_dbs.ts} +4 -5
- package/dest/util/txe_world_state_db.d.ts.map +0 -1
|
@@ -6,10 +6,10 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
6
6
|
import { applyStringFormatting } from '@aztec/foundation/log';
|
|
7
7
|
import { Timer } from '@aztec/foundation/timer';
|
|
8
8
|
import { KeyStore } from '@aztec/key-store';
|
|
9
|
-
import { AddressDataProvider,
|
|
9
|
+
import { AddressDataProvider, CapsuleDataProvider, ContractDataProvider, NoteDataProvider, PXEOracleInterface, SyncDataProvider, TaggingDataProvider, enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
10
10
|
import { ExecutionNoteCache, HashedValuesCache, Oracle, WASMSimulator, extractCallStack, extractPrivateCircuitPublicInputs, pickNotes, toACVMWitness, witnessMapToFields } from '@aztec/simulator/client';
|
|
11
11
|
import { createTxForPublicCalls } from '@aztec/simulator/public/fixtures';
|
|
12
|
-
import { ExecutionError, PublicTxSimulator, createSimulationError, resolveAssertionMessageFromError } from '@aztec/simulator/server';
|
|
12
|
+
import { ExecutionError, PublicContractsDB, PublicTxSimulator, createSimulationError, resolveAssertionMessageFromError } from '@aztec/simulator/server';
|
|
13
13
|
import { FunctionSelector, countArgumentsSize } from '@aztec/stdlib/abi';
|
|
14
14
|
import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
15
15
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
@@ -26,7 +26,7 @@ import { ForkCheckpoint, NativeWorldStateService } from '@aztec/world-state/nati
|
|
|
26
26
|
import { TXENode } from '../node/txe_node.js';
|
|
27
27
|
import { TXEAccountDataProvider } from '../util/txe_account_data_provider.js';
|
|
28
28
|
import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
|
|
29
|
-
import {
|
|
29
|
+
import { TXEPublicTreesDB } from '../util/txe_public_dbs.js';
|
|
30
30
|
export class TXE {
|
|
31
31
|
logger;
|
|
32
32
|
keyStore;
|
|
@@ -36,7 +36,6 @@ export class TXE {
|
|
|
36
36
|
syncDataProvider;
|
|
37
37
|
taggingDataProvider;
|
|
38
38
|
addressDataProvider;
|
|
39
|
-
authWitnessDataProvider;
|
|
40
39
|
accountDataProvider;
|
|
41
40
|
executionCache;
|
|
42
41
|
contractAddress;
|
|
@@ -62,7 +61,8 @@ export class TXE {
|
|
|
62
61
|
node;
|
|
63
62
|
simulationProvider;
|
|
64
63
|
noteCache;
|
|
65
|
-
|
|
64
|
+
authwits;
|
|
65
|
+
constructor(logger, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, accountDataProvider, executionCache, contractAddress, nativeWorldStateService, baseFork){
|
|
66
66
|
this.logger = logger;
|
|
67
67
|
this.keyStore = keyStore;
|
|
68
68
|
this.contractDataProvider = contractDataProvider;
|
|
@@ -71,7 +71,6 @@ export class TXE {
|
|
|
71
71
|
this.syncDataProvider = syncDataProvider;
|
|
72
72
|
this.taggingDataProvider = taggingDataProvider;
|
|
73
73
|
this.addressDataProvider = addressDataProvider;
|
|
74
|
-
this.authWitnessDataProvider = authWitnessDataProvider;
|
|
75
74
|
this.accountDataProvider = accountDataProvider;
|
|
76
75
|
this.executionCache = executionCache;
|
|
77
76
|
this.contractAddress = contractAddress;
|
|
@@ -92,18 +91,18 @@ export class TXE {
|
|
|
92
91
|
this.VERSION = 1;
|
|
93
92
|
this.CHAIN_ID = 1;
|
|
94
93
|
this.simulationProvider = new WASMSimulator();
|
|
94
|
+
this.authwits = new Map();
|
|
95
95
|
this.noteCache = new ExecutionNoteCache(this.getTxRequestHash());
|
|
96
96
|
this.node = new TXENode(this.blockNumber, this.VERSION, this.CHAIN_ID, nativeWorldStateService, baseFork);
|
|
97
97
|
// Default msg_sender (for entrypoints) is now Fr.max_value rather than 0 addr (see #7190 & #7404)
|
|
98
98
|
this.msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE);
|
|
99
|
-
this.pxeOracleInterface = new PXEOracleInterface(this.node, this.keyStore, this.simulationProvider, this.contractDataProvider, this.noteDataProvider, this.capsuleDataProvider, this.syncDataProvider, this.taggingDataProvider, this.addressDataProvider, this.
|
|
99
|
+
this.pxeOracleInterface = new PXEOracleInterface(this.node, this.keyStore, this.simulationProvider, this.contractDataProvider, this.noteDataProvider, this.capsuleDataProvider, this.syncDataProvider, this.taggingDataProvider, this.addressDataProvider, this.logger);
|
|
100
100
|
}
|
|
101
101
|
static async create(logger, store, protocolContracts) {
|
|
102
102
|
const executionCache = new HashedValuesCache();
|
|
103
103
|
const nativeWorldStateService = await NativeWorldStateService.tmp();
|
|
104
104
|
const baseFork = await nativeWorldStateService.fork();
|
|
105
105
|
const addressDataProvider = new AddressDataProvider(store);
|
|
106
|
-
const authWitnessDataProvider = new AuthWitnessDataProvider(store);
|
|
107
106
|
const contractDataProvider = new ContractDataProvider(store);
|
|
108
107
|
const noteDataProvider = await NoteDataProvider.create(store);
|
|
109
108
|
const syncDataProvider = new SyncDataProvider(store);
|
|
@@ -116,7 +115,7 @@ export class TXE {
|
|
|
116
115
|
await contractDataProvider.addContractArtifact(contractClass.id, artifact);
|
|
117
116
|
await contractDataProvider.addContractInstance(instance);
|
|
118
117
|
}
|
|
119
|
-
return new TXE(logger, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider,
|
|
118
|
+
return new TXE(logger, keyStore, contractDataProvider, noteDataProvider, capsuleDataProvider, syncDataProvider, taggingDataProvider, addressDataProvider, accountDataProvider, executionCache, await AztecAddress.random(), nativeWorldStateService, baseFork);
|
|
120
119
|
}
|
|
121
120
|
// Utils
|
|
122
121
|
getNativeWorldStateService() {
|
|
@@ -205,7 +204,7 @@ export class TXE {
|
|
|
205
204
|
const authWitness = new AuthWitness(messageHash, [
|
|
206
205
|
...signature.toBuffer()
|
|
207
206
|
]);
|
|
208
|
-
return this.
|
|
207
|
+
return this.authwits.set(authWitness.requestHash.toString(), authWitness);
|
|
209
208
|
}
|
|
210
209
|
async addPublicDataWrites(writes) {
|
|
211
210
|
this.publicDataWrites.push(...writes);
|
|
@@ -316,7 +315,7 @@ export class TXE {
|
|
|
316
315
|
}
|
|
317
316
|
return new NullifierMembershipWitness(BigInt(index), leafPreimage, siblingPath);
|
|
318
317
|
}
|
|
319
|
-
async
|
|
318
|
+
async getPublicDataWitness(blockNumber, leafSlot) {
|
|
320
319
|
const snap = this.nativeWorldStateService.getSnapshot(blockNumber);
|
|
321
320
|
const lowLeafResult = await snap.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot.toBigInt());
|
|
322
321
|
if (!lowLeafResult) {
|
|
@@ -358,7 +357,8 @@ export class TXE {
|
|
|
358
357
|
return Promise.resolve(this.accountDataProvider.getAccount(account));
|
|
359
358
|
}
|
|
360
359
|
getAuthWitness(messageHash) {
|
|
361
|
-
|
|
360
|
+
const authwit = this.authwits.get(messageHash.toString());
|
|
361
|
+
return Promise.resolve(authwit?.witness);
|
|
362
362
|
}
|
|
363
363
|
async getNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status) {
|
|
364
364
|
// Nullified pending notes are already removed from the list.
|
|
@@ -508,8 +508,7 @@ export class TXE {
|
|
|
508
508
|
}
|
|
509
509
|
}
|
|
510
510
|
await this.node.setTxEffect(blockNumber, new TxHash(new Fr(blockNumber)), txEffect);
|
|
511
|
-
this.node.
|
|
512
|
-
this.node.addNoteLogsByTags(this.blockNumber, this.privateLogs);
|
|
511
|
+
this.node.addPrivateLogsByTags(this.blockNumber, this.privateLogs);
|
|
513
512
|
this.node.addPublicLogsByTags(this.blockNumber, this.publicLogs);
|
|
514
513
|
const stateReference = await fork.getStateReference();
|
|
515
514
|
const archiveInfo = await fork.getTreeInfo(MerkleTreeId.ARCHIVE);
|
|
@@ -548,11 +547,10 @@ export class TXE {
|
|
|
548
547
|
this.setContractAddress(targetContractAddress);
|
|
549
548
|
this.setFunctionSelector(functionSelector);
|
|
550
549
|
const artifact = await this.contractDataProvider.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
551
|
-
const acir = artifact.bytecode;
|
|
552
550
|
const initialWitness = await this.getInitialWitness(artifact, argsHash, sideEffectCounter, isStaticCall);
|
|
553
551
|
const acvmCallback = new Oracle(this);
|
|
554
552
|
const timer = new Timer();
|
|
555
|
-
const acirExecutionResult = await this.simulationProvider.executeUserCircuit(
|
|
553
|
+
const acirExecutionResult = await this.simulationProvider.executeUserCircuit(initialWitness, artifact, acvmCallback).catch((err)=>{
|
|
556
554
|
err.message = resolveAssertionMessageFromError(err, artifact);
|
|
557
555
|
const execError = new ExecutionError(err.message, {
|
|
558
556
|
contractAddress: targetContractAddress,
|
|
@@ -635,7 +633,9 @@ export class TXE {
|
|
|
635
633
|
// See note at revert below.
|
|
636
634
|
const checkpoint = await ForkCheckpoint.new(db);
|
|
637
635
|
try {
|
|
638
|
-
const
|
|
636
|
+
const treesDB = new TXEPublicTreesDB(db, this);
|
|
637
|
+
const contractsDB = new PublicContractsDB(new TXEPublicContractDataSource(this));
|
|
638
|
+
const simulator = new PublicTxSimulator(treesDB, contractsDB, globalVariables, /*doMerkleOperations=*/ true);
|
|
639
639
|
const { usedTxRequestHashForNonces } = this.noteCache.finish();
|
|
640
640
|
const firstNullifier = usedTxRequestHashForNonces ? this.getTxRequestHash() : this.noteCache.getAllNullifiers()[0];
|
|
641
641
|
// When setting up a teardown call, we tell it that
|
|
@@ -719,13 +719,13 @@ export class TXE {
|
|
|
719
719
|
async syncNotes() {
|
|
720
720
|
const taggedLogsByRecipient = await this.pxeOracleInterface.syncTaggedLogs(this.contractAddress, await this.getBlockNumber(), undefined);
|
|
721
721
|
for (const [recipient, taggedLogs] of taggedLogsByRecipient.entries()){
|
|
722
|
-
await this.pxeOracleInterface.processTaggedLogs(taggedLogs, AztecAddress.fromString(recipient));
|
|
722
|
+
await this.pxeOracleInterface.processTaggedLogs(this.contractAddress, taggedLogs, AztecAddress.fromString(recipient));
|
|
723
723
|
}
|
|
724
724
|
await this.pxeOracleInterface.removeNullifiedNotes(this.contractAddress);
|
|
725
725
|
return Promise.resolve();
|
|
726
726
|
}
|
|
727
|
-
deliverNote(
|
|
728
|
-
|
|
727
|
+
async deliverNote(contractAddress, storageSlot, nonce, content, noteHash, nullifier, txHash, recipient) {
|
|
728
|
+
await this.pxeOracleInterface.deliverNote(contractAddress, storageSlot, nonce, content, noteHash, nullifier, txHash, recipient);
|
|
729
729
|
}
|
|
730
730
|
async getLogByTag(tag) {
|
|
731
731
|
return await this.pxeOracleInterface.getLogByTag(tag);
|
|
@@ -831,4 +831,7 @@ export class TXE {
|
|
|
831
831
|
const aes128 = new Aes128();
|
|
832
832
|
return aes128.decryptBufferCBC(ciphertext, iv, symKey);
|
|
833
833
|
}
|
|
834
|
+
getSharedSecret(address, ephPk) {
|
|
835
|
+
return this.pxeOracleInterface.getSharedSecret(address, ephPk);
|
|
836
|
+
}
|
|
834
837
|
}
|
|
@@ -69,7 +69,7 @@ export declare class TXEService {
|
|
|
69
69
|
storageWrite(startStorageSlot: ForeignCallSingle, values: ForeignCallArray): Promise<{
|
|
70
70
|
values: (string | ForeignCallArray)[];
|
|
71
71
|
}>;
|
|
72
|
-
|
|
72
|
+
getPublicDataWitness(blockNumber: ForeignCallSingle, leafSlot: ForeignCallSingle): Promise<{
|
|
73
73
|
values: (string | ForeignCallArray)[];
|
|
74
74
|
}>;
|
|
75
75
|
getNotes(storageSlot: ForeignCallSingle, numSelects: ForeignCallSingle, selectByIndexes: ForeignCallArray, selectByOffsets: ForeignCallArray, selectByLengths: ForeignCallArray, selectValues: ForeignCallArray, selectComparators: ForeignCallArray, sortByIndexes: ForeignCallArray, sortByOffsets: ForeignCallArray, sortByLengths: ForeignCallArray, sortOrder: ForeignCallArray, limit: ForeignCallSingle, offset: ForeignCallSingle, status: ForeignCallSingle, returnSize: ForeignCallSingle): Promise<{
|
|
@@ -133,6 +133,12 @@ export declare class TXEService {
|
|
|
133
133
|
syncNotes(): Promise<{
|
|
134
134
|
values: (string | ForeignCallArray)[];
|
|
135
135
|
}>;
|
|
136
|
+
deliverNote(contractAddress: ForeignCallSingle, storageSlot: ForeignCallSingle, nonce: ForeignCallSingle, content: ForeignCallArray, contentLength: ForeignCallSingle, noteHash: ForeignCallSingle, nullifier: ForeignCallSingle, txHash: ForeignCallSingle, recipient: ForeignCallSingle): Promise<{
|
|
137
|
+
values: (string | ForeignCallArray)[];
|
|
138
|
+
}>;
|
|
139
|
+
getLogByTag(tag: ForeignCallSingle): Promise<{
|
|
140
|
+
values: (string | ForeignCallArray)[];
|
|
141
|
+
}>;
|
|
136
142
|
storeCapsule(contractAddress: ForeignCallSingle, slot: ForeignCallSingle, capsule: ForeignCallArray): Promise<{
|
|
137
143
|
values: (string | ForeignCallArray)[];
|
|
138
144
|
}>;
|
|
@@ -145,7 +151,10 @@ export declare class TXEService {
|
|
|
145
151
|
copyCapsule(contractAddress: ForeignCallSingle, srcSlot: ForeignCallSingle, dstSlot: ForeignCallSingle, numEntries: ForeignCallSingle): Promise<{
|
|
146
152
|
values: (string | ForeignCallArray)[];
|
|
147
153
|
}>;
|
|
148
|
-
aes128Decrypt(
|
|
154
|
+
aes128Decrypt(ciphertextBVecStorage: ForeignCallArray, ciphertextLength: ForeignCallSingle, iv: ForeignCallArray, symKey: ForeignCallArray): Promise<{
|
|
155
|
+
values: (string | ForeignCallArray)[];
|
|
156
|
+
}>;
|
|
157
|
+
getSharedSecret(address: ForeignCallSingle, ephPk: ForeignCallArray): Promise<{
|
|
149
158
|
values: (string | ForeignCallArray)[];
|
|
150
159
|
}>;
|
|
151
160
|
avmOpcodeEmitUnencryptedLog(_message: ForeignCallArray): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txe_service.d.ts","sourceRoot":"","sources":["../../src/txe_service/txe_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,2BAA2B,
|
|
1
|
+
{"version":3,"file":"txe_service.d.ts","sourceRoot":"","sources":["../../src/txe_service/txe_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fr } from '@aztec/aztec.js';
|
|
1
|
+
import { Fr, Point } from '@aztec/aztec.js';
|
|
2
2
|
import { DEPLOYER_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
3
3
|
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
4
4
|
import { enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
@@ -8,9 +8,10 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
8
8
|
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
9
9
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
10
10
|
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
11
|
+
import { LogWithTxData } from '@aztec/stdlib/logs';
|
|
11
12
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
12
13
|
import { TXE } from '../oracle/txe_oracle.js';
|
|
13
|
-
import { addressFromSingle, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, toArray, toForeignCallResult, toSingle } from '../util/encoding.js';
|
|
14
|
+
import { addressFromSingle, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle, toSingleOrArray } from '../util/encoding.js';
|
|
14
15
|
import { ExpectedFailureError } from '../util/expected_failure_error.js';
|
|
15
16
|
export class TXEService {
|
|
16
17
|
logger;
|
|
@@ -202,16 +203,14 @@ export class TXEService {
|
|
|
202
203
|
toArray(newValues)
|
|
203
204
|
]);
|
|
204
205
|
}
|
|
205
|
-
async
|
|
206
|
+
async getPublicDataWitness(blockNumber, leafSlot) {
|
|
206
207
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
207
208
|
const parsedLeafSlot = fromSingle(leafSlot);
|
|
208
|
-
const witness = await this.typedOracle.
|
|
209
|
+
const witness = await this.typedOracle.getPublicDataWitness(parsedBlockNumber, parsedLeafSlot);
|
|
209
210
|
if (!witness) {
|
|
210
211
|
throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
|
|
211
212
|
}
|
|
212
|
-
return toForeignCallResult(
|
|
213
|
-
toArray(witness.toFields())
|
|
214
|
-
]);
|
|
213
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
215
214
|
}
|
|
216
215
|
async getNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status, returnSize) {
|
|
217
216
|
const noteDatas = await this.typedOracle.getNotes(fromSingle(storageSlot), fromSingle(numSelects).toNumber(), fromArray(selectByIndexes).map((fr)=>fr.toNumber()), fromArray(selectByOffsets).map((fr)=>fr.toNumber()), fromArray(selectByLengths).map((fr)=>fr.toNumber()), fromArray(selectValues), fromArray(selectComparators).map((fr)=>fr.toNumber()), fromArray(sortByIndexes).map((fr)=>fr.toNumber()), fromArray(sortByOffsets).map((fr)=>fr.toNumber()), fromArray(sortByLengths).map((fr)=>fr.toNumber()), fromArray(sortOrder).map((fr)=>fr.toNumber()), fromSingle(limit).toNumber(), fromSingle(offset).toNumber(), fromSingle(status).toNumber());
|
|
@@ -249,21 +248,15 @@ export class TXEService {
|
|
|
249
248
|
}
|
|
250
249
|
notifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter) {
|
|
251
250
|
this.typedOracle.notifyCreatedNote(fromSingle(storageSlot), NoteSelector.fromField(fromSingle(noteTypeId)), fromArray(note), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
252
|
-
return toForeignCallResult([
|
|
253
|
-
toSingle(new Fr(0))
|
|
254
|
-
]);
|
|
251
|
+
return toForeignCallResult([]);
|
|
255
252
|
}
|
|
256
253
|
async notifyNullifiedNote(innerNullifier, noteHash, counter) {
|
|
257
254
|
await this.typedOracle.notifyNullifiedNote(fromSingle(innerNullifier), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
258
|
-
return toForeignCallResult([
|
|
259
|
-
toSingle(new Fr(0))
|
|
260
|
-
]);
|
|
255
|
+
return toForeignCallResult([]);
|
|
261
256
|
}
|
|
262
257
|
async notifyCreatedNullifier(innerNullifier) {
|
|
263
258
|
await this.typedOracle.notifyCreatedNullifier(fromSingle(innerNullifier));
|
|
264
|
-
return toForeignCallResult([
|
|
265
|
-
toSingle(new Fr(0))
|
|
266
|
-
]);
|
|
259
|
+
return toForeignCallResult([]);
|
|
267
260
|
}
|
|
268
261
|
async checkNullifierExists(innerNullifier) {
|
|
269
262
|
const exists = await this.typedOracle.checkNullifierExists(fromSingle(innerNullifier));
|
|
@@ -274,14 +267,12 @@ export class TXEService {
|
|
|
274
267
|
async getContractInstance(address) {
|
|
275
268
|
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
276
269
|
return toForeignCallResult([
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
])
|
|
284
|
-
]);
|
|
270
|
+
instance.salt,
|
|
271
|
+
instance.deployer.toField(),
|
|
272
|
+
instance.currentContractClassId,
|
|
273
|
+
instance.initializationHash,
|
|
274
|
+
...instance.publicKeys.toFields()
|
|
275
|
+
].map(toSingle));
|
|
285
276
|
}
|
|
286
277
|
async getPublicKeysAndPartialAddress(address) {
|
|
287
278
|
const parsedAddress = addressFromSingle(address);
|
|
@@ -295,9 +286,7 @@ export class TXEService {
|
|
|
295
286
|
}
|
|
296
287
|
async getKeyValidationRequest(pkMHash) {
|
|
297
288
|
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(fromSingle(pkMHash));
|
|
298
|
-
return toForeignCallResult(
|
|
299
|
-
toArray(keyValidationRequest.toFields())
|
|
300
|
-
]);
|
|
289
|
+
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
301
290
|
}
|
|
302
291
|
async callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
303
292
|
const result = await this.typedOracle.callPrivateFunction(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
@@ -314,9 +303,7 @@ export class TXEService {
|
|
|
314
303
|
if (!witness) {
|
|
315
304
|
throw new Error(`Nullifier membership witness not found at block ${parsedBlockNumber}.`);
|
|
316
305
|
}
|
|
317
|
-
return toForeignCallResult(
|
|
318
|
-
toArray(witness.toFields())
|
|
319
|
-
]);
|
|
306
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
320
307
|
}
|
|
321
308
|
async getAuthWitness(messageHash) {
|
|
322
309
|
const parsedMessageHash = fromSingle(messageHash);
|
|
@@ -358,9 +345,7 @@ export class TXEService {
|
|
|
358
345
|
if (!header) {
|
|
359
346
|
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
360
347
|
}
|
|
361
|
-
return toForeignCallResult(
|
|
362
|
-
toArray(header.toFields())
|
|
363
|
-
]);
|
|
348
|
+
return toForeignCallResult(header.toFields().map(toSingle));
|
|
364
349
|
}
|
|
365
350
|
async getMembershipWitness(blockNumber, treeId, leafValue) {
|
|
366
351
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
@@ -371,7 +356,8 @@ export class TXEService {
|
|
|
371
356
|
throw new Error(`Membership witness in tree ${MerkleTreeId[parsedTreeId]} not found for value ${parsedLeafValue} at block ${parsedBlockNumber}.`);
|
|
372
357
|
}
|
|
373
358
|
return toForeignCallResult([
|
|
374
|
-
|
|
359
|
+
toSingle(witness[0]),
|
|
360
|
+
toArray(witness.slice(1))
|
|
375
361
|
]);
|
|
376
362
|
}
|
|
377
363
|
async getLowNullifierMembershipWitness(blockNumber, nullifier) {
|
|
@@ -380,9 +366,7 @@ export class TXEService {
|
|
|
380
366
|
if (!witness) {
|
|
381
367
|
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${parsedBlockNumber}.`);
|
|
382
368
|
}
|
|
383
|
-
return toForeignCallResult(
|
|
384
|
-
toArray(witness.toFields())
|
|
385
|
-
]);
|
|
369
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
386
370
|
}
|
|
387
371
|
async getIndexedTaggingSecretAsSender(sender, recipient) {
|
|
388
372
|
const secret = await this.typedOracle.getIndexedTaggingSecretAsSender(AztecAddress.fromField(fromSingle(sender)), AztecAddress.fromField(fromSingle(recipient)));
|
|
@@ -394,6 +378,27 @@ export class TXEService {
|
|
|
394
378
|
await this.typedOracle.syncNotes();
|
|
395
379
|
return toForeignCallResult([]);
|
|
396
380
|
}
|
|
381
|
+
async deliverNote(contractAddress, storageSlot, nonce, content, contentLength, noteHash, nullifier, txHash, recipient) {
|
|
382
|
+
await this.typedOracle.deliverNote(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(storageSlot), fromSingle(nonce), fromArray(content.slice(0, Number(BigInt(contentLength)))), fromSingle(noteHash), fromSingle(nullifier), fromSingle(txHash), AztecAddress.fromField(fromSingle(recipient)));
|
|
383
|
+
return toForeignCallResult([
|
|
384
|
+
toSingle(Fr.ONE)
|
|
385
|
+
]);
|
|
386
|
+
}
|
|
387
|
+
async getLogByTag(tag) {
|
|
388
|
+
// TODO(AD): this was warning that getLogByTag did not return a promise.
|
|
389
|
+
const log = await Promise.resolve(this.typedOracle.getLogByTag(fromSingle(tag)));
|
|
390
|
+
if (log == null) {
|
|
391
|
+
return toForeignCallResult([
|
|
392
|
+
toSingle(Fr.ZERO),
|
|
393
|
+
...LogWithTxData.noirSerializationOfEmpty().map(toSingleOrArray)
|
|
394
|
+
]);
|
|
395
|
+
} else {
|
|
396
|
+
return toForeignCallResult([
|
|
397
|
+
toSingle(Fr.ONE),
|
|
398
|
+
...log.toNoirSerialization().map(toSingleOrArray)
|
|
399
|
+
]);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
397
402
|
async storeCapsule(contractAddress, slot, capsule) {
|
|
398
403
|
await this.typedOracle.storeCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(slot), fromArray(capsule));
|
|
399
404
|
return toForeignCallResult([]);
|
|
@@ -424,13 +429,20 @@ export class TXEService {
|
|
|
424
429
|
await this.typedOracle.copyCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(srcSlot), fromSingle(dstSlot), fromSingle(numEntries).toNumber());
|
|
425
430
|
return toForeignCallResult([]);
|
|
426
431
|
}
|
|
427
|
-
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
428
|
-
|
|
429
|
-
|
|
432
|
+
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
433
|
+
// The compiler didn't throw an error, so it took me a while to learn of the existence of this file, and that I need
|
|
434
|
+
// to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
|
|
435
|
+
// existence of a txe_oracle method?
|
|
436
|
+
async aes128Decrypt(ciphertextBVecStorage, ciphertextLength, iv, symKey) {
|
|
437
|
+
const ciphertext = fromUintBoundedVec(ciphertextBVecStorage, ciphertextLength, 8);
|
|
430
438
|
const ivBuffer = fromUintArray(iv, 8);
|
|
431
439
|
const symKeyBuffer = fromUintArray(symKey, 8);
|
|
432
|
-
const plaintextBuffer = await this.typedOracle.aes128Decrypt(
|
|
433
|
-
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer),
|
|
440
|
+
const plaintextBuffer = await this.typedOracle.aes128Decrypt(ciphertext, ivBuffer, symKeyBuffer);
|
|
441
|
+
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), ciphertextBVecStorage.length));
|
|
442
|
+
}
|
|
443
|
+
async getSharedSecret(address, ephPk) {
|
|
444
|
+
const secret = await this.typedOracle.getSharedSecret(AztecAddress.fromField(fromSingle(address)), Point.fromFields(fromArray(ephPk)));
|
|
445
|
+
return toForeignCallResult(secret.toFields().map(toSingle));
|
|
434
446
|
}
|
|
435
447
|
// AVM opcodes
|
|
436
448
|
avmOpcodeEmitUnencryptedLog(_message) {
|
package/dest/util/encoding.d.ts
CHANGED
|
@@ -17,21 +17,32 @@ export declare function fromArray(obj: ForeignCallArray): Fr[];
|
|
|
17
17
|
/**
|
|
18
18
|
* Converts an array of Noir unsigned integers to a single tightly-packed buffer.
|
|
19
19
|
* @param uintBitSize If it's an array of Noir u8's, put `8`, etc.
|
|
20
|
-
* @returns
|
|
20
|
+
* @returns A buffer where each byte is correctly represented as a single byte in the buffer.
|
|
21
21
|
*/
|
|
22
22
|
export declare function fromUintArray(obj: ForeignCallArray, uintBitSize: number): Buffer;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a Noir BoundedVec of unsigned integers into a Buffer. Note that BoundedVecs are structs, and therefore
|
|
25
|
+
* translated as two separate ForeignCallArray and ForeignCallSingle values (an array and a single field).
|
|
26
|
+
*
|
|
27
|
+
* @param storage The array with the BoundedVec's storage (i.e. BoundedVec::storage())
|
|
28
|
+
* @param length The length of the BoundedVec (i.e. BoundedVec::len())
|
|
29
|
+
* @param uintBitSize If it's an array of Noir u8's, put `8`, etc.
|
|
30
|
+
* @returns A buffer containing the unsigned integers tightly packed
|
|
31
|
+
*/
|
|
32
|
+
export declare function fromUintBoundedVec(storage: ForeignCallArray, length: ForeignCallSingle, uintBitSize: number): Buffer;
|
|
23
33
|
export declare function toSingle(obj: Fr | AztecAddress): ForeignCallSingle;
|
|
24
34
|
export declare function toArray(objs: Fr[]): ForeignCallArray;
|
|
35
|
+
export declare function toSingleOrArray(value: Fr | Fr[]): string | string[];
|
|
25
36
|
export declare function bufferToU8Array(buffer: Buffer): ForeignCallArray;
|
|
26
37
|
/**
|
|
27
38
|
* Converts a ForeignCallArray into a tuple which represents a nr BoundedVec.
|
|
28
39
|
* If the input array is shorter than the maxLen, it pads the result with zeros,
|
|
29
40
|
* so that nr can correctly coerce this result into a BoundedVec.
|
|
30
|
-
* @param array
|
|
41
|
+
* @param bVecStorage - The array underlying the BoundedVec.
|
|
31
42
|
* @param maxLen - the max length of the BoundedVec.
|
|
32
43
|
* @returns a tuple representing a BoundedVec.
|
|
33
44
|
*/
|
|
34
|
-
export declare function arrayToBoundedVec(
|
|
45
|
+
export declare function arrayToBoundedVec(bVecStorage: ForeignCallArray, maxLen: number): [ForeignCallArray, ForeignCallSingle];
|
|
35
46
|
export declare function toForeignCallResult(obj: (ForeignCallSingle | ForeignCallArray)[]): {
|
|
36
47
|
values: (string | ForeignCallArray)[];
|
|
37
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/util/encoding.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,KAAK,2BAA2B,EAAqC,MAAM,wBAAwB,CAAC;AAE7G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,2BAA2B,CAAC,EAAE,CAAC;AAExH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,EAAE,CAAC;CAClD,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,iBAAiB,MAEhD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,gBAEvD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,QAE9C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,GAAG,iBAAiB,CAElE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAEpD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/util/encoding.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,KAAK,2BAA2B,EAAqC,MAAM,wBAAwB,CAAC;AAE7G,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC;AAExC,MAAM,MAAM,eAAe,GAAG,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,2BAA2B,CAAC,EAAE,CAAC;AAExH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,EAAE,CAAC;CAClD,CAAC;AAEF,wBAAgB,UAAU,CAAC,GAAG,EAAE,iBAAiB,MAEhD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,gBAEvD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,gBAAgB,QAE9C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAOpH;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,GAAG,iBAAiB,CAElE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,gBAAgB,CAEpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,qBAE/C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,MAAM,GACb,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAYvC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,EAAE;;EAEhF;AAED,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,eAAO,MAAM,sBAAsB,iCAAsB,CAAC;AAE1D,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEjC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;EAElC,CAAC"}
|
package/dest/util/encoding.js
CHANGED
|
@@ -16,7 +16,7 @@ export function fromArray(obj) {
|
|
|
16
16
|
/**
|
|
17
17
|
* Converts an array of Noir unsigned integers to a single tightly-packed buffer.
|
|
18
18
|
* @param uintBitSize If it's an array of Noir u8's, put `8`, etc.
|
|
19
|
-
* @returns
|
|
19
|
+
* @returns A buffer where each byte is correctly represented as a single byte in the buffer.
|
|
20
20
|
*/ export function fromUintArray(obj, uintBitSize) {
|
|
21
21
|
if (uintBitSize % 8 !== 0) {
|
|
22
22
|
throw new Error(`u${uintBitSize} is not a supported type in Noir`);
|
|
@@ -24,12 +24,31 @@ export function fromArray(obj) {
|
|
|
24
24
|
const uintByteSize = uintBitSize / 8;
|
|
25
25
|
return Buffer.concat(obj.map((str)=>hexToBuffer(str).slice(-uintByteSize)));
|
|
26
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Converts a Noir BoundedVec of unsigned integers into a Buffer. Note that BoundedVecs are structs, and therefore
|
|
29
|
+
* translated as two separate ForeignCallArray and ForeignCallSingle values (an array and a single field).
|
|
30
|
+
*
|
|
31
|
+
* @param storage The array with the BoundedVec's storage (i.e. BoundedVec::storage())
|
|
32
|
+
* @param length The length of the BoundedVec (i.e. BoundedVec::len())
|
|
33
|
+
* @param uintBitSize If it's an array of Noir u8's, put `8`, etc.
|
|
34
|
+
* @returns A buffer containing the unsigned integers tightly packed
|
|
35
|
+
*/ export function fromUintBoundedVec(storage, length, uintBitSize) {
|
|
36
|
+
if (uintBitSize % 8 !== 0) {
|
|
37
|
+
throw new Error(`u${uintBitSize} is not a supported type in Noir`);
|
|
38
|
+
}
|
|
39
|
+
const uintByteSize = uintBitSize / 8;
|
|
40
|
+
const boundedStorage = storage.slice(0, fromSingle(length).toNumber());
|
|
41
|
+
return Buffer.concat(boundedStorage.map((str)=>hexToBuffer(str).slice(-uintByteSize)));
|
|
42
|
+
}
|
|
27
43
|
export function toSingle(obj) {
|
|
28
44
|
return obj.toString().slice(2);
|
|
29
45
|
}
|
|
30
46
|
export function toArray(objs) {
|
|
31
47
|
return objs.map((obj)=>obj.toString());
|
|
32
48
|
}
|
|
49
|
+
export function toSingleOrArray(value) {
|
|
50
|
+
return Array.isArray(value) ? value.map(toSingle) : toSingle(value);
|
|
51
|
+
}
|
|
33
52
|
export function bufferToU8Array(buffer) {
|
|
34
53
|
return toArray(Array.from(buffer).map((byte)=>new Fr(byte)));
|
|
35
54
|
}
|
|
@@ -37,19 +56,19 @@ export function bufferToU8Array(buffer) {
|
|
|
37
56
|
* Converts a ForeignCallArray into a tuple which represents a nr BoundedVec.
|
|
38
57
|
* If the input array is shorter than the maxLen, it pads the result with zeros,
|
|
39
58
|
* so that nr can correctly coerce this result into a BoundedVec.
|
|
40
|
-
* @param array
|
|
59
|
+
* @param bVecStorage - The array underlying the BoundedVec.
|
|
41
60
|
* @param maxLen - the max length of the BoundedVec.
|
|
42
61
|
* @returns a tuple representing a BoundedVec.
|
|
43
|
-
*/ export function arrayToBoundedVec(
|
|
44
|
-
if (
|
|
45
|
-
throw new Error(`Array of length ${
|
|
62
|
+
*/ export function arrayToBoundedVec(bVecStorage, maxLen) {
|
|
63
|
+
if (bVecStorage.length > maxLen) {
|
|
64
|
+
throw new Error(`Array of length ${bVecStorage.length} larger than maxLen ${maxLen}`);
|
|
46
65
|
}
|
|
47
|
-
const lengthDiff = maxLen -
|
|
66
|
+
const lengthDiff = maxLen - bVecStorage.length;
|
|
48
67
|
// We pad the array to the maxLen of the BoundedVec.
|
|
49
68
|
const zeroPaddingArray = toArray(Array(lengthDiff).fill(new Fr(0)));
|
|
50
69
|
// These variable names match with the BoundedVec members in nr:
|
|
51
|
-
const storage =
|
|
52
|
-
const len = toSingle(new Fr(
|
|
70
|
+
const storage = bVecStorage.concat(zeroPaddingArray);
|
|
71
|
+
const len = toSingle(new Fr(bVecStorage.length));
|
|
53
72
|
return [
|
|
54
73
|
storage,
|
|
55
74
|
len
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
2
|
import { type ContractArtifact, FunctionSelector } from '@aztec/stdlib/abi';
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
-
import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress
|
|
4
|
+
import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
5
5
|
import type { TXE } from '../oracle/txe_oracle.js';
|
|
6
6
|
export declare class TXEPublicContractDataSource implements ContractDataSource {
|
|
7
7
|
private txeOracle;
|
|
8
8
|
constructor(txeOracle: TXE);
|
|
9
|
-
getPublicFunction(address: AztecAddress, selector: FunctionSelector): Promise<PublicFunction | undefined>;
|
|
10
9
|
getBlockNumber(): Promise<number>;
|
|
11
10
|
getContractClass(id: Fr): Promise<ContractClassPublic | undefined>;
|
|
12
11
|
getBytecodeCommitment(id: Fr): Promise<Fr | undefined>;
|
|
@@ -15,6 +14,5 @@ export declare class TXEPublicContractDataSource implements ContractDataSource {
|
|
|
15
14
|
getContractArtifact(address: AztecAddress): Promise<ContractArtifact | undefined>;
|
|
16
15
|
getContractFunctionName(address: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
|
|
17
16
|
registerContractFunctionSignatures(_address: AztecAddress, _signatures: []): Promise<void>;
|
|
18
|
-
addContractClass(_contractClass: ContractClassPublic): Promise<void>;
|
|
19
17
|
}
|
|
20
18
|
//# sourceMappingURL=txe_public_contract_data_source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txe_public_contract_data_source.d.ts","sourceRoot":"","sources":["../../src/util/txe_public_contract_data_source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,
|
|
1
|
+
{"version":3,"file":"txe_public_contract_data_source.d.ts","sourceRoot":"","sources":["../../src/util/txe_public_contract_data_source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,KAAK,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,2BAA2B,EAGjC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,qBAAa,2BAA4B,YAAW,kBAAkB;IACxD,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,GAAG;IAElC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAI3B,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IA0BlE,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAKtD,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAK1F,mBAAmB,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;IAI9B,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAKjF,uBAAuB,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAgB7G,kCAAkC,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3F"}
|
|
@@ -8,16 +8,6 @@ export class TXEPublicContractDataSource {
|
|
|
8
8
|
constructor(txeOracle){
|
|
9
9
|
this.txeOracle = txeOracle;
|
|
10
10
|
}
|
|
11
|
-
async getPublicFunction(address, selector) {
|
|
12
|
-
const bytecode = await this.txeOracle.getContractDataProvider().getBytecode(address, selector);
|
|
13
|
-
if (!bytecode) {
|
|
14
|
-
return undefined;
|
|
15
|
-
}
|
|
16
|
-
return {
|
|
17
|
-
bytecode,
|
|
18
|
-
selector
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
11
|
getBlockNumber() {
|
|
22
12
|
return this.txeOracle.getBlockNumber();
|
|
23
13
|
}
|
|
@@ -80,9 +70,4 @@ export class TXEPublicContractDataSource {
|
|
|
80
70
|
registerContractFunctionSignatures(_address, _signatures) {
|
|
81
71
|
return Promise.resolve();
|
|
82
72
|
}
|
|
83
|
-
// TODO(#10007): Remove this method.
|
|
84
|
-
addContractClass(_contractClass) {
|
|
85
|
-
// We don't really need to do anything for the txe here
|
|
86
|
-
return Promise.resolve();
|
|
87
|
-
}
|
|
88
73
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import {
|
|
2
|
+
import { PublicTreesDB } from '@aztec/simulator/server';
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
-
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
5
4
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
6
5
|
import type { TXE } from '../oracle/txe_oracle.js';
|
|
7
|
-
export declare class
|
|
6
|
+
export declare class TXEPublicTreesDB extends PublicTreesDB {
|
|
8
7
|
private merkleDb;
|
|
9
8
|
private txe;
|
|
10
|
-
constructor(merkleDb: MerkleTreeWriteOperations,
|
|
9
|
+
constructor(merkleDb: MerkleTreeWriteOperations, txe: TXE);
|
|
11
10
|
storageRead(contract: AztecAddress, slot: Fr): Promise<Fr>;
|
|
12
11
|
storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<void>;
|
|
13
12
|
}
|
|
14
|
-
//# sourceMappingURL=
|
|
13
|
+
//# sourceMappingURL=txe_public_dbs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txe_public_dbs.d.ts","sourceRoot":"","sources":["../../src/util/txe_public_dbs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGjF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,qBAAa,gBAAiB,SAAQ,aAAa;IACrC,OAAO,CAAC,QAAQ;IAA6B,OAAO,CAAC,GAAG;gBAAhD,QAAQ,EAAE,yBAAyB,EAAU,GAAG,EAAE,GAAG;IAI1D,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAgB1D,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3F"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import {
|
|
2
|
+
import { PublicTreesDB } from '@aztec/simulator/server';
|
|
3
3
|
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
4
4
|
import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
|
|
5
5
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
|
-
export class
|
|
6
|
+
export class TXEPublicTreesDB extends PublicTreesDB {
|
|
7
7
|
merkleDb;
|
|
8
8
|
txe;
|
|
9
|
-
constructor(merkleDb,
|
|
10
|
-
super(merkleDb
|
|
9
|
+
constructor(merkleDb, txe){
|
|
10
|
+
super(merkleDb), this.merkleDb = merkleDb, this.txe = txe;
|
|
11
11
|
}
|
|
12
12
|
async storageRead(contract, slot) {
|
|
13
13
|
const leafSlot = (await computePublicDataTreeLeafSlot(contract, slot)).toBigInt();
|