@aztec/txe 0.76.4 → 0.77.0-testnet-ignition.21
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 +3 -5
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +106 -106
- package/dest/node/txe_node.d.ts +19 -6
- package/dest/node/txe_node.d.ts.map +1 -1
- package/dest/node/txe_node.js +303 -334
- package/dest/oracle/txe_oracle.d.ts +25 -16
- package/dest/oracle/txe_oracle.d.ts.map +1 -1
- package/dest/oracle/txe_oracle.js +249 -143
- package/dest/txe_service/txe_service.d.ts +3 -3
- package/dest/txe_service/txe_service.d.ts.map +1 -1
- package/dest/txe_service/txe_service.js +205 -105
- package/dest/util/encoding.d.ts +39 -25
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +45 -11
- package/dest/util/expected_failure_error.js +1 -2
- package/dest/util/txe_database.d.ts +3 -2
- package/dest/util/txe_database.d.ts.map +1 -1
- package/dest/util/txe_database.js +6 -10
- package/dest/util/txe_public_contract_data_source.d.ts +5 -3
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +25 -13
- package/dest/util/txe_world_state_db.d.ts +6 -8
- package/dest/util/txe_world_state_db.d.ts.map +1 -1
- package/dest/util/txe_world_state_db.js +10 -23
- package/package.json +14 -15
- package/src/index.ts +2 -2
- package/src/node/txe_node.ts +64 -42
- package/src/oracle/txe_oracle.ts +101 -86
- package/src/txe_service/txe_service.ts +25 -28
- package/src/util/encoding.ts +32 -5
- package/src/util/txe_database.ts +3 -2
- package/src/util/txe_public_contract_data_source.ts +8 -9
- package/src/util/txe_world_state_db.ts +9 -26
|
@@ -1,34 +1,41 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DEPLOYER_CONTRACT_ADDRESS
|
|
3
|
-
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/circuits.js/hash';
|
|
4
|
-
import { NoteSelector } from '@aztec/foundation/abi';
|
|
5
|
-
import { AztecAddress } from '@aztec/foundation/aztec-address';
|
|
1
|
+
import { Fr } from '@aztec/aztec.js';
|
|
2
|
+
import { DEPLOYER_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
6
3
|
import { KeyStore } from '@aztec/key-store';
|
|
7
|
-
import { openTmpStore } from '@aztec/kv-store/lmdb';
|
|
4
|
+
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
8
5
|
import { protocolContractNames } from '@aztec/protocol-contracts';
|
|
9
|
-
import {
|
|
6
|
+
import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
|
|
10
7
|
import { enrichPublicSimulationError } from '@aztec/pxe';
|
|
11
|
-
import { HashedValuesCache } from '@aztec/simulator/
|
|
8
|
+
import { HashedValuesCache } from '@aztec/simulator/client';
|
|
9
|
+
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
10
|
+
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
11
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
12
|
+
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
13
|
+
import { SimulationError } from '@aztec/stdlib/errors';
|
|
14
|
+
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
15
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
12
16
|
import { NativeWorldStateService } from '@aztec/world-state';
|
|
13
17
|
import { TXE } from '../oracle/txe_oracle.js';
|
|
14
|
-
import { addressFromSingle, fromArray, fromSingle, fromUintArray, toArray, toForeignCallResult, toSingle
|
|
18
|
+
import { addressFromSingle, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, toArray, toForeignCallResult, toSingle } from '../util/encoding.js';
|
|
15
19
|
import { ExpectedFailureError } from '../util/expected_failure_error.js';
|
|
16
20
|
import { TXEDatabase } from '../util/txe_database.js';
|
|
17
21
|
export class TXEService {
|
|
18
|
-
|
|
22
|
+
logger;
|
|
23
|
+
typedOracle;
|
|
24
|
+
constructor(logger, typedOracle){
|
|
19
25
|
this.logger = logger;
|
|
20
26
|
this.typedOracle = typedOracle;
|
|
21
27
|
}
|
|
22
28
|
static async init(logger) {
|
|
23
|
-
const store = openTmpStore(
|
|
29
|
+
const store = await openTmpStore('test');
|
|
24
30
|
const executionCache = new HashedValuesCache();
|
|
25
31
|
const nativeWorldStateService = await NativeWorldStateService.tmp();
|
|
26
32
|
const baseFork = await nativeWorldStateService.fork();
|
|
27
33
|
const keyStore = new KeyStore(store);
|
|
28
34
|
const txeDatabase = new TXEDatabase(store);
|
|
29
35
|
// Register protocol contracts.
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
const provider = new BundledProtocolContractsProvider();
|
|
37
|
+
for (const name of protocolContractNames){
|
|
38
|
+
const { contractClass, instance, artifact } = await provider.getProtocolContractArtifact(name);
|
|
32
39
|
await txeDatabase.addContractArtifact(contractClass.id, artifact);
|
|
33
40
|
await txeDatabase.addContractInstance(instance);
|
|
34
41
|
}
|
|
@@ -46,7 +53,7 @@ export class TXEService {
|
|
|
46
53
|
async advanceBlocksBy(blocks) {
|
|
47
54
|
const nBlocks = fromSingle(blocks).toNumber();
|
|
48
55
|
this.logger.debug(`time traveling ${nBlocks} blocks`);
|
|
49
|
-
for
|
|
56
|
+
for(let i = 0; i < nBlocks; i++){
|
|
50
57
|
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
51
58
|
await this.typedOracle.commitState();
|
|
52
59
|
this.typedOracle.setBlockNumber(blockNumber + 1);
|
|
@@ -65,37 +72,38 @@ export class TXEService {
|
|
|
65
72
|
async deploy(artifact, instance, secret) {
|
|
66
73
|
// Emit deployment nullifier
|
|
67
74
|
this.typedOracle.addSiloedNullifiersFromPublic([
|
|
68
|
-
await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), instance.address.toField())
|
|
75
|
+
await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), instance.address.toField())
|
|
69
76
|
]);
|
|
70
77
|
if (!fromSingle(secret).equals(Fr.ZERO)) {
|
|
71
78
|
await this.addAccount(artifact, instance, secret);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
79
|
+
} else {
|
|
74
80
|
await this.typedOracle.addContractInstance(instance);
|
|
75
|
-
await this.typedOracle.addContractArtifact(instance.
|
|
81
|
+
await this.typedOracle.addContractArtifact(instance.currentContractClassId, artifact);
|
|
76
82
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
77
83
|
}
|
|
78
84
|
return toForeignCallResult([
|
|
79
85
|
toArray([
|
|
80
86
|
instance.salt,
|
|
81
87
|
instance.deployer.toField(),
|
|
82
|
-
instance.
|
|
88
|
+
instance.currentContractClassId,
|
|
83
89
|
instance.initializationHash,
|
|
84
|
-
...instance.publicKeys.toFields()
|
|
85
|
-
])
|
|
90
|
+
...instance.publicKeys.toFields()
|
|
91
|
+
])
|
|
86
92
|
]);
|
|
87
93
|
}
|
|
88
94
|
async directStorageWrite(contractAddress, startStorageSlot, values) {
|
|
89
95
|
const startStorageSlotFr = fromSingle(startStorageSlot);
|
|
90
96
|
const valuesFr = fromArray(values);
|
|
91
97
|
const contractAddressFr = addressFromSingle(contractAddress);
|
|
92
|
-
const publicDataWrites = await Promise.all(valuesFr.map(async (value, i)
|
|
98
|
+
const publicDataWrites = await Promise.all(valuesFr.map(async (value, i)=>{
|
|
93
99
|
const storageSlot = startStorageSlotFr.add(new Fr(i));
|
|
94
100
|
this.logger.debug(`Oracle storage write: slot=${storageSlot.toString()} value=${value}`);
|
|
95
101
|
return new PublicDataWrite(await computePublicDataTreeLeafSlot(contractAddressFr, storageSlot), value);
|
|
96
102
|
}));
|
|
97
103
|
await this.typedOracle.addPublicDataWrites(publicDataWrites);
|
|
98
|
-
return toForeignCallResult([
|
|
104
|
+
return toForeignCallResult([
|
|
105
|
+
toArray(publicDataWrites.map((write)=>write.value))
|
|
106
|
+
]);
|
|
99
107
|
}
|
|
100
108
|
async createAccount(secret) {
|
|
101
109
|
const keyStore = this.typedOracle.getKeyStore();
|
|
@@ -107,13 +115,13 @@ export class TXEService {
|
|
|
107
115
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
108
116
|
return toForeignCallResult([
|
|
109
117
|
toSingle(completeAddress.address),
|
|
110
|
-
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
118
|
+
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
111
119
|
]);
|
|
112
120
|
}
|
|
113
121
|
async addAccount(artifact, instance, secret) {
|
|
114
122
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
115
123
|
await this.typedOracle.addContractInstance(instance);
|
|
116
|
-
await this.typedOracle.addContractArtifact(instance.
|
|
124
|
+
await this.typedOracle.addContractArtifact(instance.currentContractClassId, artifact);
|
|
117
125
|
const keyStore = this.typedOracle.getKeyStore();
|
|
118
126
|
const completeAddress = await keyStore.addAccount(fromSingle(secret), await computePartialAddress(instance));
|
|
119
127
|
const accountStore = this.typedOracle.getTXEDatabase();
|
|
@@ -121,12 +129,14 @@ export class TXEService {
|
|
|
121
129
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
122
130
|
return toForeignCallResult([
|
|
123
131
|
toSingle(completeAddress.address),
|
|
124
|
-
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
132
|
+
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
125
133
|
]);
|
|
126
134
|
}
|
|
127
135
|
getSideEffectsCounter() {
|
|
128
136
|
const counter = this.typedOracle.getSideEffectsCounter();
|
|
129
|
-
return toForeignCallResult([
|
|
137
|
+
return toForeignCallResult([
|
|
138
|
+
toSingle(new Fr(counter))
|
|
139
|
+
]);
|
|
130
140
|
}
|
|
131
141
|
async addAuthWitness(address, messageHash) {
|
|
132
142
|
await this.typedOracle.addAuthWitness(addressFromSingle(address), fromSingle(messageHash));
|
|
@@ -135,7 +145,10 @@ export class TXEService {
|
|
|
135
145
|
async assertPublicCallFails(address, functionSelector, _length, args) {
|
|
136
146
|
const parsedAddress = addressFromSingle(address);
|
|
137
147
|
const parsedSelector = fromSingle(functionSelector);
|
|
138
|
-
const extendedArgs = [
|
|
148
|
+
const extendedArgs = [
|
|
149
|
+
parsedSelector,
|
|
150
|
+
...fromArray(args)
|
|
151
|
+
];
|
|
139
152
|
const result = await this.typedOracle.avmOpcodeCall(parsedAddress, extendedArgs, false);
|
|
140
153
|
if (result.revertCode.isOK()) {
|
|
141
154
|
throw new ExpectedFailureError('Public call did not revert');
|
|
@@ -146,8 +159,7 @@ export class TXEService {
|
|
|
146
159
|
try {
|
|
147
160
|
await this.typedOracle.callPrivateFunction(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
148
161
|
throw new ExpectedFailureError('Private call did not fail');
|
|
149
|
-
}
|
|
150
|
-
catch (e) {
|
|
162
|
+
} catch (e) {
|
|
151
163
|
if (e instanceof ExpectedFailureError) {
|
|
152
164
|
throw e;
|
|
153
165
|
}
|
|
@@ -156,41 +168,53 @@ export class TXEService {
|
|
|
156
168
|
}
|
|
157
169
|
// PXE oracles
|
|
158
170
|
getRandomField() {
|
|
159
|
-
return toForeignCallResult([
|
|
171
|
+
return toForeignCallResult([
|
|
172
|
+
toSingle(this.typedOracle.getRandomField())
|
|
173
|
+
]);
|
|
160
174
|
}
|
|
161
175
|
async getContractAddress() {
|
|
162
176
|
const contractAddress = await this.typedOracle.getContractAddress();
|
|
163
|
-
return toForeignCallResult([
|
|
177
|
+
return toForeignCallResult([
|
|
178
|
+
toSingle(contractAddress.toField())
|
|
179
|
+
]);
|
|
164
180
|
}
|
|
165
181
|
async getBlockNumber() {
|
|
166
182
|
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
167
|
-
return toForeignCallResult([
|
|
183
|
+
return toForeignCallResult([
|
|
184
|
+
toSingle(new Fr(blockNumber))
|
|
185
|
+
]);
|
|
168
186
|
}
|
|
169
187
|
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
170
188
|
async storeInExecutionCache(_length, values) {
|
|
171
189
|
const returnsHash = await this.typedOracle.storeInExecutionCache(fromArray(values));
|
|
172
|
-
return toForeignCallResult([
|
|
190
|
+
return toForeignCallResult([
|
|
191
|
+
toSingle(returnsHash)
|
|
192
|
+
]);
|
|
173
193
|
}
|
|
174
194
|
async loadFromExecutionCache(hash) {
|
|
175
195
|
const returns = await this.typedOracle.loadFromExecutionCache(fromSingle(hash));
|
|
176
|
-
return toForeignCallResult([
|
|
196
|
+
return toForeignCallResult([
|
|
197
|
+
toArray(returns)
|
|
198
|
+
]);
|
|
177
199
|
}
|
|
178
200
|
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
179
201
|
debugLog(message, _length, fields) {
|
|
180
|
-
const messageStr = fromArray(message)
|
|
181
|
-
.map(field => String.fromCharCode(field.toNumber()))
|
|
182
|
-
.join('');
|
|
202
|
+
const messageStr = fromArray(message).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
183
203
|
const fieldsFr = fromArray(fields);
|
|
184
204
|
this.typedOracle.debugLog(messageStr, fieldsFr);
|
|
185
205
|
return toForeignCallResult([]);
|
|
186
206
|
}
|
|
187
207
|
async storageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements) {
|
|
188
208
|
const values = await this.typedOracle.storageRead(addressFromSingle(contractAddress), fromSingle(startStorageSlot), fromSingle(blockNumber).toNumber(), fromSingle(numberOfElements).toNumber());
|
|
189
|
-
return toForeignCallResult([
|
|
209
|
+
return toForeignCallResult([
|
|
210
|
+
toArray(values)
|
|
211
|
+
]);
|
|
190
212
|
}
|
|
191
213
|
async storageWrite(startStorageSlot, values) {
|
|
192
214
|
const newValues = await this.typedOracle.storageWrite(fromSingle(startStorageSlot), fromArray(values));
|
|
193
|
-
return toForeignCallResult([
|
|
215
|
+
return toForeignCallResult([
|
|
216
|
+
toArray(newValues)
|
|
217
|
+
]);
|
|
194
218
|
}
|
|
195
219
|
async getPublicDataTreeWitness(blockNumber, leafSlot) {
|
|
196
220
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
@@ -199,48 +223,67 @@ export class TXEService {
|
|
|
199
223
|
if (!witness) {
|
|
200
224
|
throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
|
|
201
225
|
}
|
|
202
|
-
return toForeignCallResult([
|
|
226
|
+
return toForeignCallResult([
|
|
227
|
+
toArray(witness.toFields())
|
|
228
|
+
]);
|
|
203
229
|
}
|
|
204
230
|
async getNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status, returnSize) {
|
|
205
|
-
const noteDatas = await this.typedOracle.getNotes(fromSingle(storageSlot), fromSingle(numSelects).toNumber(), fromArray(selectByIndexes).map(fr
|
|
231
|
+
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());
|
|
206
232
|
const noteLength = noteDatas?.[0]?.note.items.length ?? 0;
|
|
207
|
-
if (!noteDatas.every(({ note })
|
|
233
|
+
if (!noteDatas.every(({ note })=>noteLength === note.items.length)) {
|
|
208
234
|
throw new Error('Notes should all be the same length.');
|
|
209
235
|
}
|
|
210
236
|
const contractAddress = noteDatas[0]?.contractAddress ?? Fr.ZERO;
|
|
211
237
|
// Values indicates whether the note is settled or transient.
|
|
212
238
|
const noteTypes = {
|
|
213
239
|
isSettled: new Fr(0),
|
|
214
|
-
isTransient: new Fr(1)
|
|
240
|
+
isTransient: new Fr(1)
|
|
215
241
|
};
|
|
216
|
-
const flattenData = noteDatas.flatMap(({ nonce, note, index })
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
242
|
+
const flattenData = noteDatas.flatMap(({ nonce, note, index })=>[
|
|
243
|
+
nonce,
|
|
244
|
+
index === undefined ? noteTypes.isTransient : noteTypes.isSettled,
|
|
245
|
+
...note.items
|
|
246
|
+
]);
|
|
221
247
|
const returnFieldSize = fromSingle(returnSize).toNumber();
|
|
222
|
-
const returnData = [
|
|
248
|
+
const returnData = [
|
|
249
|
+
noteDatas.length,
|
|
250
|
+
contractAddress.toField(),
|
|
251
|
+
...flattenData
|
|
252
|
+
].map((v)=>new Fr(v));
|
|
223
253
|
if (returnData.length > returnFieldSize) {
|
|
224
254
|
throw new Error(`Return data size too big. Maximum ${returnFieldSize} fields. Got ${flattenData.length}.`);
|
|
225
255
|
}
|
|
226
256
|
const paddedZeros = Array(returnFieldSize - returnData.length).fill(new Fr(0));
|
|
227
|
-
return toForeignCallResult([
|
|
257
|
+
return toForeignCallResult([
|
|
258
|
+
toArray([
|
|
259
|
+
...returnData,
|
|
260
|
+
...paddedZeros
|
|
261
|
+
])
|
|
262
|
+
]);
|
|
228
263
|
}
|
|
229
264
|
notifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter) {
|
|
230
265
|
this.typedOracle.notifyCreatedNote(fromSingle(storageSlot), NoteSelector.fromField(fromSingle(noteTypeId)), fromArray(note), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
231
|
-
return toForeignCallResult([
|
|
266
|
+
return toForeignCallResult([
|
|
267
|
+
toSingle(new Fr(0))
|
|
268
|
+
]);
|
|
232
269
|
}
|
|
233
270
|
async notifyNullifiedNote(innerNullifier, noteHash, counter) {
|
|
234
271
|
await this.typedOracle.notifyNullifiedNote(fromSingle(innerNullifier), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
235
|
-
return toForeignCallResult([
|
|
272
|
+
return toForeignCallResult([
|
|
273
|
+
toSingle(new Fr(0))
|
|
274
|
+
]);
|
|
236
275
|
}
|
|
237
276
|
async notifyCreatedNullifier(innerNullifier) {
|
|
238
277
|
await this.typedOracle.notifyCreatedNullifier(fromSingle(innerNullifier));
|
|
239
|
-
return toForeignCallResult([
|
|
278
|
+
return toForeignCallResult([
|
|
279
|
+
toSingle(new Fr(0))
|
|
280
|
+
]);
|
|
240
281
|
}
|
|
241
282
|
async checkNullifierExists(innerNullifier) {
|
|
242
283
|
const exists = await this.typedOracle.checkNullifierExists(fromSingle(innerNullifier));
|
|
243
|
-
return toForeignCallResult([
|
|
284
|
+
return toForeignCallResult([
|
|
285
|
+
toSingle(new Fr(exists))
|
|
286
|
+
]);
|
|
244
287
|
}
|
|
245
288
|
async getContractInstance(address) {
|
|
246
289
|
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
@@ -248,24 +291,36 @@ export class TXEService {
|
|
|
248
291
|
toArray([
|
|
249
292
|
instance.salt,
|
|
250
293
|
instance.deployer.toField(),
|
|
251
|
-
instance.
|
|
294
|
+
instance.currentContractClassId,
|
|
252
295
|
instance.initializationHash,
|
|
253
|
-
...instance.publicKeys.toFields()
|
|
254
|
-
])
|
|
296
|
+
...instance.publicKeys.toFields()
|
|
297
|
+
])
|
|
255
298
|
]);
|
|
256
299
|
}
|
|
257
300
|
async getPublicKeysAndPartialAddress(address) {
|
|
258
301
|
const parsedAddress = addressFromSingle(address);
|
|
259
302
|
const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
|
|
260
|
-
return toForeignCallResult([
|
|
303
|
+
return toForeignCallResult([
|
|
304
|
+
toArray([
|
|
305
|
+
...publicKeys.toFields(),
|
|
306
|
+
partialAddress
|
|
307
|
+
])
|
|
308
|
+
]);
|
|
261
309
|
}
|
|
262
310
|
async getKeyValidationRequest(pkMHash) {
|
|
263
311
|
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(fromSingle(pkMHash));
|
|
264
|
-
return toForeignCallResult([
|
|
312
|
+
return toForeignCallResult([
|
|
313
|
+
toArray(keyValidationRequest.toFields())
|
|
314
|
+
]);
|
|
265
315
|
}
|
|
266
316
|
async callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
267
317
|
const result = await this.typedOracle.callPrivateFunction(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
268
|
-
return toForeignCallResult([
|
|
318
|
+
return toForeignCallResult([
|
|
319
|
+
toArray([
|
|
320
|
+
result.endSideEffectCounter,
|
|
321
|
+
result.returnsHash
|
|
322
|
+
])
|
|
323
|
+
]);
|
|
269
324
|
}
|
|
270
325
|
async getNullifierMembershipWitness(blockNumber, nullifier) {
|
|
271
326
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
@@ -273,7 +328,9 @@ export class TXEService {
|
|
|
273
328
|
if (!witness) {
|
|
274
329
|
throw new Error(`Nullifier membership witness not found at block ${parsedBlockNumber}.`);
|
|
275
330
|
}
|
|
276
|
-
return toForeignCallResult([
|
|
331
|
+
return toForeignCallResult([
|
|
332
|
+
toArray(witness.toFields())
|
|
333
|
+
]);
|
|
277
334
|
}
|
|
278
335
|
async getAuthWitness(messageHash) {
|
|
279
336
|
const parsedMessageHash = fromSingle(messageHash);
|
|
@@ -281,31 +338,43 @@ export class TXEService {
|
|
|
281
338
|
if (!authWitness) {
|
|
282
339
|
throw new Error(`Auth witness not found for message hash ${parsedMessageHash}.`);
|
|
283
340
|
}
|
|
284
|
-
return toForeignCallResult([
|
|
341
|
+
return toForeignCallResult([
|
|
342
|
+
toArray(authWitness)
|
|
343
|
+
]);
|
|
285
344
|
}
|
|
286
345
|
async enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
287
346
|
const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
288
|
-
return toForeignCallResult([
|
|
347
|
+
return toForeignCallResult([
|
|
348
|
+
toSingle(newArgsHash)
|
|
349
|
+
]);
|
|
289
350
|
}
|
|
290
351
|
async setPublicTeardownFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
291
352
|
const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
292
|
-
return toForeignCallResult([
|
|
353
|
+
return toForeignCallResult([
|
|
354
|
+
toSingle(newArgsHash)
|
|
355
|
+
]);
|
|
293
356
|
}
|
|
294
357
|
notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
|
|
295
358
|
this.typedOracle.notifySetMinRevertibleSideEffectCounter(fromSingle(minRevertibleSideEffectCounter).toNumber());
|
|
296
359
|
}
|
|
297
360
|
async getChainId() {
|
|
298
|
-
return toForeignCallResult([
|
|
361
|
+
return toForeignCallResult([
|
|
362
|
+
toSingle(await this.typedOracle.getChainId())
|
|
363
|
+
]);
|
|
299
364
|
}
|
|
300
365
|
async getVersion() {
|
|
301
|
-
return toForeignCallResult([
|
|
366
|
+
return toForeignCallResult([
|
|
367
|
+
toSingle(await this.typedOracle.getVersion())
|
|
368
|
+
]);
|
|
302
369
|
}
|
|
303
370
|
async getBlockHeader(blockNumber) {
|
|
304
371
|
const header = await this.typedOracle.getBlockHeader(fromSingle(blockNumber).toNumber());
|
|
305
372
|
if (!header) {
|
|
306
373
|
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
307
374
|
}
|
|
308
|
-
return toForeignCallResult([
|
|
375
|
+
return toForeignCallResult([
|
|
376
|
+
toArray(header.toFields())
|
|
377
|
+
]);
|
|
309
378
|
}
|
|
310
379
|
async getMembershipWitness(blockNumber, treeId, leafValue) {
|
|
311
380
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
@@ -315,7 +384,9 @@ export class TXEService {
|
|
|
315
384
|
if (!witness) {
|
|
316
385
|
throw new Error(`Membership witness in tree ${MerkleTreeId[parsedTreeId]} not found for value ${parsedLeafValue} at block ${parsedBlockNumber}.`);
|
|
317
386
|
}
|
|
318
|
-
return toForeignCallResult([
|
|
387
|
+
return toForeignCallResult([
|
|
388
|
+
toArray(witness)
|
|
389
|
+
]);
|
|
319
390
|
}
|
|
320
391
|
async getLowNullifierMembershipWitness(blockNumber, nullifier) {
|
|
321
392
|
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
@@ -323,11 +394,15 @@ export class TXEService {
|
|
|
323
394
|
if (!witness) {
|
|
324
395
|
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${parsedBlockNumber}.`);
|
|
325
396
|
}
|
|
326
|
-
return toForeignCallResult([
|
|
397
|
+
return toForeignCallResult([
|
|
398
|
+
toArray(witness.toFields())
|
|
399
|
+
]);
|
|
327
400
|
}
|
|
328
401
|
async getIndexedTaggingSecretAsSender(sender, recipient) {
|
|
329
402
|
const secret = await this.typedOracle.getIndexedTaggingSecretAsSender(AztecAddress.fromField(fromSingle(sender)), AztecAddress.fromField(fromSingle(recipient)));
|
|
330
|
-
return toForeignCallResult([
|
|
403
|
+
return toForeignCallResult([
|
|
404
|
+
toArray(secret.toFields())
|
|
405
|
+
]);
|
|
331
406
|
}
|
|
332
407
|
async syncNotes() {
|
|
333
408
|
await this.typedOracle.syncNotes();
|
|
@@ -343,11 +418,16 @@ export class TXEService {
|
|
|
343
418
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
344
419
|
if (values === null) {
|
|
345
420
|
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
346
|
-
return toForeignCallResult([
|
|
347
|
-
|
|
348
|
-
|
|
421
|
+
return toForeignCallResult([
|
|
422
|
+
toSingle(new Fr(0)),
|
|
423
|
+
toArray(Array(fromSingle(tSize).toNumber()).fill(new Fr(0)))
|
|
424
|
+
]);
|
|
425
|
+
} else {
|
|
349
426
|
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
350
|
-
return toForeignCallResult([
|
|
427
|
+
return toForeignCallResult([
|
|
428
|
+
toSingle(new Fr(1)),
|
|
429
|
+
toArray(values)
|
|
430
|
+
]);
|
|
351
431
|
}
|
|
352
432
|
}
|
|
353
433
|
async deleteCapsule(contractAddress, slot) {
|
|
@@ -363,10 +443,8 @@ export class TXEService {
|
|
|
363
443
|
const ciphertextBuffer = fromUintArray(ciphertext, 8);
|
|
364
444
|
const ivBuffer = fromUintArray(iv, 8);
|
|
365
445
|
const symKeyBuffer = fromUintArray(symKey, 8);
|
|
366
|
-
const
|
|
367
|
-
|
|
368
|
-
// function correctly receives [u8; N].
|
|
369
|
-
return toForeignCallResult([toArray(Array.from(paddedPlaintext).map(byte => new Fr(byte)))]);
|
|
446
|
+
const plaintextBuffer = await this.typedOracle.aes128Decrypt(ciphertextBuffer, ivBuffer, symKeyBuffer);
|
|
447
|
+
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), ciphertextBuffer.length));
|
|
370
448
|
}
|
|
371
449
|
// AVM opcodes
|
|
372
450
|
avmOpcodeEmitUnencryptedLog(_message) {
|
|
@@ -375,10 +453,14 @@ export class TXEService {
|
|
|
375
453
|
}
|
|
376
454
|
async avmOpcodeStorageRead(slot) {
|
|
377
455
|
const value = await this.typedOracle.avmOpcodeStorageRead(fromSingle(slot));
|
|
378
|
-
return toForeignCallResult([
|
|
456
|
+
return toForeignCallResult([
|
|
457
|
+
toSingle(value)
|
|
458
|
+
]);
|
|
379
459
|
}
|
|
380
460
|
async avmOpcodeStorageWrite(slot, value) {
|
|
381
|
-
await this.typedOracle.storageWrite(fromSingle(slot), [
|
|
461
|
+
await this.typedOracle.storageWrite(fromSingle(slot), [
|
|
462
|
+
fromSingle(value)
|
|
463
|
+
]);
|
|
382
464
|
return toForeignCallResult([]);
|
|
383
465
|
}
|
|
384
466
|
async avmOpcodeGetContractInstanceDeployer(address) {
|
|
@@ -386,15 +468,15 @@ export class TXEService {
|
|
|
386
468
|
return toForeignCallResult([
|
|
387
469
|
toSingle(instance.deployer),
|
|
388
470
|
// AVM requires an extra boolean indicating the instance was found
|
|
389
|
-
toSingle(new Fr(1))
|
|
471
|
+
toSingle(new Fr(1))
|
|
390
472
|
]);
|
|
391
473
|
}
|
|
392
474
|
async avmOpcodeGetContractInstanceClassId(address) {
|
|
393
475
|
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
394
476
|
return toForeignCallResult([
|
|
395
|
-
toSingle(instance.
|
|
477
|
+
toSingle(instance.currentContractClassId),
|
|
396
478
|
// AVM requires an extra boolean indicating the instance was found
|
|
397
|
-
toSingle(new Fr(1))
|
|
479
|
+
toSingle(new Fr(1))
|
|
398
480
|
]);
|
|
399
481
|
}
|
|
400
482
|
async avmOpcodeGetContractInstanceInitializationHash(address) {
|
|
@@ -402,12 +484,14 @@ export class TXEService {
|
|
|
402
484
|
return toForeignCallResult([
|
|
403
485
|
toSingle(instance.initializationHash),
|
|
404
486
|
// AVM requires an extra boolean indicating the instance was found
|
|
405
|
-
toSingle(new Fr(1))
|
|
487
|
+
toSingle(new Fr(1))
|
|
406
488
|
]);
|
|
407
489
|
}
|
|
408
490
|
avmOpcodeSender() {
|
|
409
491
|
const sender = this.typedOracle.getMsgSender();
|
|
410
|
-
return toForeignCallResult([
|
|
492
|
+
return toForeignCallResult([
|
|
493
|
+
toSingle(sender)
|
|
494
|
+
]);
|
|
411
495
|
}
|
|
412
496
|
async avmOpcodeEmitNullifier(nullifier) {
|
|
413
497
|
await this.typedOracle.avmOpcodeEmitNullifier(fromSingle(nullifier));
|
|
@@ -419,66 +503,82 @@ export class TXEService {
|
|
|
419
503
|
}
|
|
420
504
|
async avmOpcodeNullifierExists(innerNullifier, targetAddress) {
|
|
421
505
|
const exists = await this.typedOracle.avmOpcodeNullifierExists(fromSingle(innerNullifier), AztecAddress.fromField(fromSingle(targetAddress)));
|
|
422
|
-
return toForeignCallResult([
|
|
506
|
+
return toForeignCallResult([
|
|
507
|
+
toSingle(new Fr(exists))
|
|
508
|
+
]);
|
|
423
509
|
}
|
|
424
510
|
async avmOpcodeAddress() {
|
|
425
511
|
const contractAddress = await this.typedOracle.getContractAddress();
|
|
426
|
-
return toForeignCallResult([
|
|
512
|
+
return toForeignCallResult([
|
|
513
|
+
toSingle(contractAddress.toField())
|
|
514
|
+
]);
|
|
427
515
|
}
|
|
428
516
|
async avmOpcodeBlockNumber() {
|
|
429
517
|
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
430
|
-
return toForeignCallResult([
|
|
518
|
+
return toForeignCallResult([
|
|
519
|
+
toSingle(new Fr(blockNumber))
|
|
520
|
+
]);
|
|
431
521
|
}
|
|
432
522
|
avmOpcodeIsStaticCall() {
|
|
433
523
|
const isStaticCall = this.typedOracle.getIsStaticCall();
|
|
434
|
-
return toForeignCallResult([
|
|
524
|
+
return toForeignCallResult([
|
|
525
|
+
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
526
|
+
]);
|
|
435
527
|
}
|
|
436
528
|
async avmOpcodeChainId() {
|
|
437
529
|
const chainId = await this.typedOracle.getChainId();
|
|
438
|
-
return toForeignCallResult([
|
|
530
|
+
return toForeignCallResult([
|
|
531
|
+
toSingle(chainId)
|
|
532
|
+
]);
|
|
439
533
|
}
|
|
440
534
|
async avmOpcodeVersion() {
|
|
441
535
|
const version = await this.typedOracle.getVersion();
|
|
442
|
-
return toForeignCallResult([
|
|
536
|
+
return toForeignCallResult([
|
|
537
|
+
toSingle(version)
|
|
538
|
+
]);
|
|
443
539
|
}
|
|
444
540
|
avmOpcodeReturndataSize() {
|
|
445
541
|
const size = this.typedOracle.avmOpcodeReturndataSize();
|
|
446
|
-
return toForeignCallResult([
|
|
542
|
+
return toForeignCallResult([
|
|
543
|
+
toSingle(new Fr(size))
|
|
544
|
+
]);
|
|
447
545
|
}
|
|
448
546
|
avmOpcodeReturndataCopy(rdOffset, copySize) {
|
|
449
547
|
const returndata = this.typedOracle.avmOpcodeReturndataCopy(fromSingle(rdOffset).toNumber(), fromSingle(copySize).toNumber());
|
|
450
548
|
// This is a slice, so we need to return the length as well.
|
|
451
|
-
return toForeignCallResult([
|
|
549
|
+
return toForeignCallResult([
|
|
550
|
+
toSingle(new Fr(returndata.length)),
|
|
551
|
+
toArray(returndata)
|
|
552
|
+
]);
|
|
452
553
|
}
|
|
453
554
|
async avmOpcodeCall(_gas, address, _length, args) {
|
|
454
|
-
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args),
|
|
455
|
-
/* isStaticCall */ false);
|
|
555
|
+
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args), /* isStaticCall */ false);
|
|
456
556
|
// Poor man's revert handling
|
|
457
557
|
if (!result.revertCode.isOK()) {
|
|
458
558
|
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
459
559
|
await enrichPublicSimulationError(result.revertReason, this.typedOracle.getContractDataOracle(), this.typedOracle.getTXEDatabase(), this.logger);
|
|
460
560
|
throw new Error(result.revertReason.message);
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
561
|
+
} else {
|
|
463
562
|
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
464
563
|
}
|
|
465
564
|
}
|
|
466
|
-
return toForeignCallResult([
|
|
565
|
+
return toForeignCallResult([
|
|
566
|
+
toSingle(new Fr(result.revertCode.isOK()))
|
|
567
|
+
]);
|
|
467
568
|
}
|
|
468
569
|
async avmOpcodeStaticCall(_gas, address, _length, args) {
|
|
469
|
-
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args),
|
|
470
|
-
/* isStaticCall */ true);
|
|
570
|
+
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args), /* isStaticCall */ true);
|
|
471
571
|
// Poor man's revert handling
|
|
472
572
|
if (!result.revertCode.isOK()) {
|
|
473
573
|
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
474
574
|
await enrichPublicSimulationError(result.revertReason, this.typedOracle.getContractDataOracle(), this.typedOracle.getTXEDatabase(), this.logger);
|
|
475
575
|
throw new Error(result.revertReason.message);
|
|
476
|
-
}
|
|
477
|
-
else {
|
|
576
|
+
} else {
|
|
478
577
|
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
479
578
|
}
|
|
480
579
|
}
|
|
481
|
-
return toForeignCallResult([
|
|
580
|
+
return toForeignCallResult([
|
|
581
|
+
toSingle(new Fr(result.revertCode.isOK()))
|
|
582
|
+
]);
|
|
482
583
|
}
|
|
483
584
|
}
|
|
484
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHhlX3NlcnZpY2UvdHhlX3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBRUwseUJBQXlCLEVBQ3pCLEVBQUUsRUFDRixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLHFCQUFxQixHQUN0QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RixPQUFPLEVBQXlCLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUMsT0FBTyxFQUdMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLGFBQWEsRUFDYixPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLFFBQVEsR0FDVCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxvQkFBb0IsRUFB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
|