@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.
Files changed (35) hide show
  1. package/dest/bin/index.js +3 -5
  2. package/dest/index.d.ts +1 -1
  3. package/dest/index.d.ts.map +1 -1
  4. package/dest/index.js +106 -106
  5. package/dest/node/txe_node.d.ts +19 -6
  6. package/dest/node/txe_node.d.ts.map +1 -1
  7. package/dest/node/txe_node.js +303 -334
  8. package/dest/oracle/txe_oracle.d.ts +25 -16
  9. package/dest/oracle/txe_oracle.d.ts.map +1 -1
  10. package/dest/oracle/txe_oracle.js +249 -143
  11. package/dest/txe_service/txe_service.d.ts +3 -3
  12. package/dest/txe_service/txe_service.d.ts.map +1 -1
  13. package/dest/txe_service/txe_service.js +205 -105
  14. package/dest/util/encoding.d.ts +39 -25
  15. package/dest/util/encoding.d.ts.map +1 -1
  16. package/dest/util/encoding.js +45 -11
  17. package/dest/util/expected_failure_error.js +1 -2
  18. package/dest/util/txe_database.d.ts +3 -2
  19. package/dest/util/txe_database.d.ts.map +1 -1
  20. package/dest/util/txe_database.js +6 -10
  21. package/dest/util/txe_public_contract_data_source.d.ts +5 -3
  22. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  23. package/dest/util/txe_public_contract_data_source.js +25 -13
  24. package/dest/util/txe_world_state_db.d.ts +6 -8
  25. package/dest/util/txe_world_state_db.d.ts.map +1 -1
  26. package/dest/util/txe_world_state_db.js +10 -23
  27. package/package.json +14 -15
  28. package/src/index.ts +2 -2
  29. package/src/node/txe_node.ts +64 -42
  30. package/src/oracle/txe_oracle.ts +101 -86
  31. package/src/txe_service/txe_service.ts +25 -28
  32. package/src/util/encoding.ts +32 -5
  33. package/src/util/txe_database.ts +3 -2
  34. package/src/util/txe_public_contract_data_source.ts +8 -9
  35. package/src/util/txe_world_state_db.ts +9 -26
@@ -1,34 +1,41 @@
1
- import { MerkleTreeId, SimulationError } from '@aztec/circuit-types';
2
- import { DEPLOYER_CONTRACT_ADDRESS, Fr, FunctionSelector, PublicDataWrite, computePartialAddress, } from '@aztec/circuits.js';
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 { getCanonicalProtocolContract } from '@aztec/protocol-contracts/bundle';
6
+ import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
10
7
  import { enrichPublicSimulationError } from '@aztec/pxe';
11
- import { HashedValuesCache } from '@aztec/simulator/server';
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, } from '../util/encoding.js';
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
- constructor(logger, typedOracle) {
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(true);
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
- for (const name of protocolContractNames) {
31
- const { contractClass, instance, artifact } = await getCanonicalProtocolContract(name);
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 (let i = 0; i < nBlocks; i++) {
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.contractClassId, artifact);
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.contractClassId,
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([toArray(publicDataWrites.map(write => write.value))]);
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.contractClassId, artifact);
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([toSingle(new Fr(counter))]);
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 = [parsedSelector, ...fromArray(args)];
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([toSingle(this.typedOracle.getRandomField())]);
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([toSingle(contractAddress.toField())]);
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([toSingle(new Fr(blockNumber))]);
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([toSingle(returnsHash)]);
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([toArray(returns)]);
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([toArray(values)]);
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([toArray(newValues)]);
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([toArray(witness.toFields())]);
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 => 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());
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 }) => noteLength === note.items.length)) {
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
- nonce,
218
- index === undefined ? noteTypes.isTransient : noteTypes.isSettled,
219
- ...note.items,
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 = [noteDatas.length, contractAddress.toField(), ...flattenData].map(v => new Fr(v));
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([toArray([...returnData, ...paddedZeros])]);
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([toSingle(new Fr(0))]);
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([toSingle(new Fr(0))]);
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([toSingle(new Fr(0))]);
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([toSingle(new Fr(exists))]);
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.contractClassId,
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([toArray([...publicKeys.toFields(), partialAddress])]);
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([toArray(keyValidationRequest.toFields())]);
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([toArray([result.endSideEffectCounter, result.returnsHash])]);
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([toArray(witness.toFields())]);
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([toArray(authWitness)]);
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([toSingle(newArgsHash)]);
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([toSingle(newArgsHash)]);
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([toSingle(await this.typedOracle.getChainId())]);
361
+ return toForeignCallResult([
362
+ toSingle(await this.typedOracle.getChainId())
363
+ ]);
299
364
  }
300
365
  async getVersion() {
301
- return toForeignCallResult([toSingle(await this.typedOracle.getVersion())]);
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([toArray(header.toFields())]);
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([toArray(witness)]);
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([toArray(witness.toFields())]);
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([toArray(secret.toFields())]);
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([toSingle(new Fr(0)), toArray(Array(fromSingle(tSize).toNumber()).fill(new Fr(0)))]);
347
- }
348
- else {
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([toSingle(new Fr(1)), toArray(values)]);
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 paddedPlaintext = await this.typedOracle.aes128Decrypt(ciphertextBuffer, ivBuffer, symKeyBuffer);
367
- // We convert each byte of the buffer to its own Field, so that the Noir
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([toSingle(value)]);
456
+ return toForeignCallResult([
457
+ toSingle(value)
458
+ ]);
379
459
  }
380
460
  async avmOpcodeStorageWrite(slot, value) {
381
- await this.typedOracle.storageWrite(fromSingle(slot), [fromSingle(value)]);
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.contractClassId),
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([toSingle(sender)]);
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([toSingle(new Fr(exists))]);
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([toSingle(contractAddress.toField())]);
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([toSingle(new Fr(blockNumber))]);
518
+ return toForeignCallResult([
519
+ toSingle(new Fr(blockNumber))
520
+ ]);
431
521
  }
432
522
  avmOpcodeIsStaticCall() {
433
523
  const isStaticCall = this.typedOracle.getIsStaticCall();
434
- return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
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([toSingle(chainId)]);
530
+ return toForeignCallResult([
531
+ toSingle(chainId)
532
+ ]);
439
533
  }
440
534
  async avmOpcodeVersion() {
441
535
  const version = await this.typedOracle.getVersion();
442
- return toForeignCallResult([toSingle(version)]);
536
+ return toForeignCallResult([
537
+ toSingle(version)
538
+ ]);
443
539
  }
444
540
  avmOpcodeReturndataSize() {
445
541
  const size = this.typedOracle.avmOpcodeReturndataSize();
446
- return toForeignCallResult([toSingle(new Fr(size))]);
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([toSingle(new Fr(returndata.length)), toArray(returndata)]);
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([toSingle(new Fr(result.revertCode.isOK()))]);
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([toSingle(new Fr(result.revertCode.isOK()))]);
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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