@aztec/simulator 0.81.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.
Files changed (86) hide show
  1. package/dest/common/db_interfaces.d.ts +6 -12
  2. package/dest/common/db_interfaces.d.ts.map +1 -1
  3. package/dest/common/db_interfaces.js +1 -1
  4. package/dest/common/message_load_oracle_inputs.d.ts +4 -0
  5. package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
  6. package/dest/common/message_load_oracle_inputs.js +9 -0
  7. package/dest/private/acvm/acvm.d.ts +6 -1
  8. package/dest/private/acvm/acvm.d.ts.map +1 -1
  9. package/dest/private/acvm/acvm.js +7 -13
  10. package/dest/private/acvm/deserialize.d.ts +0 -18
  11. package/dest/private/acvm/deserialize.d.ts.map +1 -1
  12. package/dest/private/acvm/deserialize.js +3 -24
  13. package/dest/private/acvm/oracle/oracle.d.ts +34 -34
  14. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
  15. package/dest/private/acvm/oracle/oracle.js +119 -79
  16. package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -1
  17. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
  18. package/dest/private/acvm/oracle/typed_oracle.js +2 -2
  19. package/dest/private/execution_data_provider.d.ts +3 -9
  20. package/dest/private/execution_data_provider.d.ts.map +1 -1
  21. package/dest/private/private_execution.d.ts +2 -2
  22. package/dest/private/private_execution.d.ts.map +1 -1
  23. package/dest/private/private_execution.js +4 -5
  24. package/dest/private/providers/acvm_native.d.ts +6 -4
  25. package/dest/private/providers/acvm_native.d.ts.map +1 -1
  26. package/dest/private/providers/acvm_native.js +6 -3
  27. package/dest/private/providers/acvm_wasm.d.ts +6 -7
  28. package/dest/private/providers/acvm_wasm.d.ts.map +1 -1
  29. package/dest/private/providers/acvm_wasm.js +13 -15
  30. package/dest/private/providers/acvm_wasm_with_blobs.d.ts +5 -5
  31. package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -1
  32. package/dest/private/providers/acvm_wasm_with_blobs.js +7 -9
  33. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +90 -0
  34. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -0
  35. package/dest/private/providers/circuit_recording/circuit_recorder.js +246 -0
  36. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts +18 -0
  37. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts.map +1 -0
  38. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.js +39 -0
  39. package/dest/private/providers/simulation_provider.d.ts +21 -7
  40. package/dest/private/providers/simulation_provider.d.ts.map +1 -1
  41. package/dest/private/simulator.d.ts +3 -2
  42. package/dest/private/simulator.d.ts.map +1 -1
  43. package/dest/private/simulator.js +2 -2
  44. package/dest/private/unconstrained_execution.d.ts +2 -2
  45. package/dest/private/unconstrained_execution.d.ts.map +1 -1
  46. package/dest/private/unconstrained_execution.js +1 -2
  47. package/dest/private/unconstrained_execution_oracle.d.ts +1 -1
  48. package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -1
  49. package/dest/private/unconstrained_execution_oracle.js +3 -3
  50. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  51. package/dest/public/avm/avm_simulator.js +0 -2
  52. package/dest/public/avm/journal/journal.js +1 -1
  53. package/dest/public/avm/test_utils.js +1 -1
  54. package/dest/public/public_db_sources.d.ts +1 -1
  55. package/dest/public/public_db_sources.d.ts.map +1 -1
  56. package/dest/public/public_db_sources.js +3 -3
  57. package/dest/testing.d.ts +2 -0
  58. package/dest/testing.d.ts.map +1 -0
  59. package/dest/testing.js +1 -0
  60. package/package.json +15 -14
  61. package/src/common/db_interfaces.ts +6 -13
  62. package/src/common/message_load_oracle_inputs.ts +8 -0
  63. package/src/private/acvm/acvm.ts +8 -24
  64. package/src/private/acvm/deserialize.ts +3 -30
  65. package/src/private/acvm/oracle/oracle.ts +144 -136
  66. package/src/private/acvm/oracle/typed_oracle.ts +2 -2
  67. package/src/private/execution_data_provider.ts +6 -10
  68. package/src/private/private_execution.ts +11 -7
  69. package/src/private/providers/acvm_native.ts +17 -6
  70. package/src/private/providers/acvm_wasm.ts +27 -20
  71. package/src/private/providers/acvm_wasm_with_blobs.ts +15 -12
  72. package/src/private/providers/circuit_recording/circuit_recorder.ts +283 -0
  73. package/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +82 -0
  74. package/src/private/providers/simulation_provider.ts +30 -5
  75. package/src/private/simulator.ts +5 -3
  76. package/src/private/unconstrained_execution.ts +8 -4
  77. package/src/private/unconstrained_execution_oracle.ts +3 -6
  78. package/src/public/avm/avm_simulator.ts +0 -2
  79. package/src/public/avm/journal/journal.ts +1 -1
  80. package/src/public/avm/test_utils.ts +1 -1
  81. package/src/public/public_db_sources.ts +3 -3
  82. package/src/testing.ts +1 -0
  83. package/dest/public/avm/bytecode_utils.d.ts +0 -5
  84. package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
  85. package/dest/public/avm/bytecode_utils.js +0 -17
  86. package/src/public/avm/bytecode_utils.ts +0 -17
@@ -5,14 +5,7 @@ import { ContractClassLog, LogWithTxData } from '@aztec/stdlib/logs';
5
5
  import { MerkleTreeId } from '@aztec/stdlib/trees';
6
6
 
7
7
  import type { ACVMField } from '../acvm_types.js';
8
- import {
9
- frToBoolean,
10
- frToNumber,
11
- fromACVMField,
12
- fromBoundedVec,
13
- fromUintArray,
14
- fromUintBoundedVec,
15
- } from '../deserialize.js';
8
+ import { fromBoundedVec, fromUintArray, fromUintBoundedVec } from '../deserialize.js';
16
9
  import { bufferToBoundedVec, toACVMField, toACVMFieldSingleOrArray } from '../serialize.js';
17
10
  import type { TypedOracle } from './typed_oracle.js';
18
11
 
@@ -22,46 +15,46 @@ import type { TypedOracle } from './typed_oracle.js';
22
15
  export class Oracle {
23
16
  constructor(private typedOracle: TypedOracle) {}
24
17
 
25
- getRandomField(): ACVMField {
18
+ getRandomField(): Promise<ACVMField[]> {
26
19
  const val = this.typedOracle.getRandomField();
27
- return toACVMField(val);
20
+ return Promise.resolve([toACVMField(val)]);
28
21
  }
29
22
 
30
23
  // Since the argument is a slice, noir automatically adds a length field to oracle call.
31
- async storeInExecutionCache(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField> {
32
- const hash = await this.typedOracle.storeInExecutionCache(values.map(fromACVMField));
33
- return toACVMField(hash);
24
+ async storeInExecutionCache(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField[]> {
25
+ const hash = await this.typedOracle.storeInExecutionCache(values.map(Fr.fromString));
26
+ return [toACVMField(hash)];
34
27
  }
35
28
 
36
- async loadFromExecutionCache([returnsHash]: ACVMField[]): Promise<ACVMField[]> {
37
- const values = await this.typedOracle.loadFromExecutionCache(fromACVMField(returnsHash));
38
- return values.map(toACVMField);
29
+ async loadFromExecutionCache([returnsHash]: ACVMField[]): Promise<ACVMField[][]> {
30
+ const values = await this.typedOracle.loadFromExecutionCache(Fr.fromString(returnsHash));
31
+ return [values.map(toACVMField)];
39
32
  }
40
33
 
41
- async getBlockNumber(): Promise<ACVMField> {
42
- return toACVMField(await this.typedOracle.getBlockNumber());
34
+ async getBlockNumber(): Promise<ACVMField[]> {
35
+ return [toACVMField(await this.typedOracle.getBlockNumber())];
43
36
  }
44
37
 
45
- async getContractAddress(): Promise<ACVMField> {
46
- return toACVMField(await this.typedOracle.getContractAddress());
38
+ async getContractAddress(): Promise<ACVMField[]> {
39
+ return [toACVMField(await this.typedOracle.getContractAddress())];
47
40
  }
48
41
 
49
- async getVersion(): Promise<ACVMField> {
50
- return toACVMField(await this.typedOracle.getVersion());
42
+ async getVersion(): Promise<ACVMField[]> {
43
+ return [toACVMField(await this.typedOracle.getVersion())];
51
44
  }
52
45
 
53
- async getChainId(): Promise<ACVMField> {
54
- return toACVMField(await this.typedOracle.getChainId());
46
+ async getChainId(): Promise<ACVMField[]> {
47
+ return [toACVMField(await this.typedOracle.getChainId())];
55
48
  }
56
49
 
57
50
  async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
58
- const { pkM, skApp } = await this.typedOracle.getKeyValidationRequest(fromACVMField(pkMHash));
51
+ const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(Fr.fromString(pkMHash));
59
52
 
60
- return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(pkM.isInfinite), toACVMField(skApp)];
53
+ return keyValidationRequest.toFields().map(toACVMField);
61
54
  }
62
55
 
63
- async getContractInstance([address]: ACVMField[]) {
64
- const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(fromACVMField(address)));
56
+ async getContractInstance([address]: ACVMField[]): Promise<ACVMField[]> {
57
+ const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(Fr.fromString(address)));
65
58
 
66
59
  return [
67
60
  instance.salt,
@@ -76,10 +69,10 @@ export class Oracle {
76
69
  [blockNumber]: ACVMField[],
77
70
  [treeId]: ACVMField[],
78
71
  [leafValue]: ACVMField[],
79
- ): Promise<ACVMField[]> {
80
- const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
81
- const parsedTreeId = frToNumber(fromACVMField(treeId));
82
- const parsedLeafValue = fromACVMField(leafValue);
72
+ ): Promise<(ACVMField | ACVMField[])[]> {
73
+ const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
74
+ const parsedTreeId = Fr.fromString(treeId).toNumber();
75
+ const parsedLeafValue = Fr.fromString(leafValue);
83
76
 
84
77
  const witness = await this.typedOracle.getMembershipWitness(parsedBlockNumber, parsedTreeId, parsedLeafValue);
85
78
  if (!witness) {
@@ -87,29 +80,29 @@ export class Oracle {
87
80
  `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
88
81
  );
89
82
  }
90
- return witness.map(toACVMField);
83
+ return [toACVMField(witness[0]), witness.slice(1).map(toACVMField)];
91
84
  }
92
85
 
93
86
  async getNullifierMembershipWitness(
94
87
  [blockNumber]: ACVMField[],
95
88
  [nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
96
- ): Promise<ACVMField[]> {
97
- const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
98
- const parsedNullifier = fromACVMField(nullifier);
89
+ ): Promise<(ACVMField | ACVMField[])[]> {
90
+ const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
91
+ const parsedNullifier = Fr.fromString(nullifier);
99
92
 
100
93
  const witness = await this.typedOracle.getNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
101
94
  if (!witness) {
102
95
  throw new Error(`Nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`);
103
96
  }
104
- return witness.toFields().map(toACVMField);
97
+ return witness.toNoirRepresentation();
105
98
  }
106
99
 
107
100
  async getLowNullifierMembershipWitness(
108
101
  [blockNumber]: ACVMField[],
109
102
  [nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
110
- ): Promise<ACVMField[]> {
111
- const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
112
- const parsedNullifier = fromACVMField(nullifier);
103
+ ): Promise<(ACVMField | ACVMField[])[]> {
104
+ const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
105
+ const parsedNullifier = Fr.fromString(nullifier);
113
106
 
114
107
  const witness = await this.typedOracle.getLowNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
115
108
  if (!witness) {
@@ -117,22 +110,25 @@ export class Oracle {
117
110
  `Low nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`,
118
111
  );
119
112
  }
120
- return witness.toFields().map(toACVMField);
113
+ return witness.toNoirRepresentation();
121
114
  }
122
115
 
123
- async getPublicDataTreeWitness([blockNumber]: ACVMField[], [leafSlot]: ACVMField[]): Promise<ACVMField[]> {
124
- const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
125
- const parsedLeafSlot = fromACVMField(leafSlot);
116
+ async getPublicDataWitness(
117
+ [blockNumber]: ACVMField[],
118
+ [leafSlot]: ACVMField[],
119
+ ): Promise<(ACVMField | ACVMField[])[]> {
120
+ const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
121
+ const parsedLeafSlot = Fr.fromString(leafSlot);
126
122
 
127
- const witness = await this.typedOracle.getPublicDataTreeWitness(parsedBlockNumber, parsedLeafSlot);
123
+ const witness = await this.typedOracle.getPublicDataWitness(parsedBlockNumber, parsedLeafSlot);
128
124
  if (!witness) {
129
125
  throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
130
126
  }
131
- return witness.toFields().map(toACVMField);
127
+ return witness.toNoirRepresentation();
132
128
  }
133
129
 
134
130
  async getBlockHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
135
- const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
131
+ const parsedBlockNumber = Fr.fromString(blockNumber).toNumber();
136
132
 
137
133
  const header = await this.typedOracle.getBlockHeader(parsedBlockNumber);
138
134
  if (!header) {
@@ -141,20 +137,20 @@ export class Oracle {
141
137
  return header.toFields().map(toACVMField);
142
138
  }
143
139
 
144
- async getAuthWitness([messageHash]: ACVMField[]): Promise<ACVMField[]> {
145
- const messageHashField = fromACVMField(messageHash);
140
+ async getAuthWitness([messageHash]: ACVMField[]): Promise<ACVMField[][]> {
141
+ const messageHashField = Fr.fromString(messageHash);
146
142
  const witness = await this.typedOracle.getAuthWitness(messageHashField);
147
143
  if (!witness) {
148
144
  throw new Error(`Unknown auth witness for message hash ${messageHashField}`);
149
145
  }
150
- return witness.map(toACVMField);
146
+ return [witness.map(toACVMField)];
151
147
  }
152
148
 
153
- async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
154
- const parsedAddress = AztecAddress.fromField(fromACVMField(address));
149
+ async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[][]> {
150
+ const parsedAddress = AztecAddress.fromField(Fr.fromString(address));
155
151
  const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
156
152
 
157
- return [...publicKeys.toFields(), partialAddress].map(toACVMField);
153
+ return [[...publicKeys.toFields(), partialAddress].map(toACVMField)];
158
154
  }
159
155
 
160
156
  async getNotes(
@@ -173,14 +169,14 @@ export class Oracle {
173
169
  [offset]: ACVMField[],
174
170
  [status]: ACVMField[],
175
171
  [returnSize]: ACVMField[],
176
- ): Promise<ACVMField[]> {
172
+ ): Promise<ACVMField[][]> {
177
173
  const noteDatas = await this.typedOracle.getNotes(
178
- fromACVMField(storageSlot),
174
+ Fr.fromString(storageSlot),
179
175
  +numSelects,
180
176
  selectByIndexes.map(s => +s),
181
177
  selectByOffsets.map(s => +s),
182
178
  selectByLengths.map(s => +s),
183
- selectValues.map(fromACVMField),
179
+ selectValues.map(Fr.fromString),
184
180
  selectComparators.map(s => +s),
185
181
  sortByIndexes.map(s => +s),
186
182
  sortByOffsets.map(s => +s),
@@ -216,7 +212,7 @@ export class Oracle {
216
212
  }
217
213
 
218
214
  const paddedZeros = Array(returnFieldSize - returnData.length).fill(toACVMField(0));
219
- return returnData.concat(paddedZeros);
215
+ return [returnData.concat(paddedZeros)];
220
216
  }
221
217
 
222
218
  notifyCreatedNote(
@@ -225,47 +221,47 @@ export class Oracle {
225
221
  note: ACVMField[],
226
222
  [noteHash]: ACVMField[],
227
223
  [counter]: ACVMField[],
228
- ): ACVMField {
224
+ ): Promise<ACVMField[]> {
229
225
  this.typedOracle.notifyCreatedNote(
230
- fromACVMField(storageSlot),
231
- NoteSelector.fromField(fromACVMField(noteTypeId)),
232
- note.map(fromACVMField),
233
- fromACVMField(noteHash),
226
+ Fr.fromString(storageSlot),
227
+ NoteSelector.fromField(Fr.fromString(noteTypeId)),
228
+ note.map(Fr.fromString),
229
+ Fr.fromString(noteHash),
234
230
  +counter,
235
231
  );
236
- return toACVMField(0);
232
+ return Promise.resolve([]);
237
233
  }
238
234
 
239
235
  async notifyNullifiedNote(
240
236
  [innerNullifier]: ACVMField[],
241
237
  [noteHash]: ACVMField[],
242
238
  [counter]: ACVMField[],
243
- ): Promise<ACVMField> {
244
- await this.typedOracle.notifyNullifiedNote(fromACVMField(innerNullifier), fromACVMField(noteHash), +counter);
245
- return toACVMField(0);
239
+ ): Promise<ACVMField[]> {
240
+ await this.typedOracle.notifyNullifiedNote(Fr.fromString(innerNullifier), Fr.fromString(noteHash), +counter);
241
+ return [];
246
242
  }
247
243
 
248
- async notifyCreatedNullifier([innerNullifier]: ACVMField[]): Promise<ACVMField> {
249
- await this.typedOracle.notifyCreatedNullifier(fromACVMField(innerNullifier));
250
- return toACVMField(0);
244
+ async notifyCreatedNullifier([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
245
+ await this.typedOracle.notifyCreatedNullifier(Fr.fromString(innerNullifier));
246
+ return [];
251
247
  }
252
248
 
253
- async checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField> {
254
- const exists = await this.typedOracle.checkNullifierExists(fromACVMField(innerNullifier));
255
- return toACVMField(exists);
249
+ async checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
250
+ const exists = await this.typedOracle.checkNullifierExists(Fr.fromString(innerNullifier));
251
+ return [toACVMField(exists)];
256
252
  }
257
253
 
258
254
  async getL1ToL2MembershipWitness(
259
255
  [contractAddress]: ACVMField[],
260
256
  [messageHash]: ACVMField[],
261
257
  [secret]: ACVMField[],
262
- ): Promise<ACVMField[]> {
258
+ ): Promise<(ACVMField | ACVMField[])[]> {
263
259
  const message = await this.typedOracle.getL1ToL2MembershipWitness(
264
260
  AztecAddress.fromString(contractAddress),
265
- fromACVMField(messageHash),
266
- fromACVMField(secret),
261
+ Fr.fromString(messageHash),
262
+ Fr.fromString(secret),
267
263
  );
268
- return message.toFields().map(toACVMField);
264
+ return message.toNoirRepresentation();
269
265
  }
270
266
 
271
267
  async storageRead(
@@ -273,32 +269,38 @@ export class Oracle {
273
269
  [startStorageSlot]: ACVMField[],
274
270
  [blockNumber]: ACVMField[],
275
271
  [numberOfElements]: ACVMField[],
276
- ): Promise<ACVMField[]> {
272
+ ): Promise<ACVMField[][]> {
277
273
  const values = await this.typedOracle.storageRead(
278
- new AztecAddress(fromACVMField(contractAddress)),
279
- fromACVMField(startStorageSlot),
274
+ new AztecAddress(Fr.fromString(contractAddress)),
275
+ Fr.fromString(startStorageSlot),
280
276
  +blockNumber,
281
277
  +numberOfElements,
282
278
  );
283
- return values.map(toACVMField);
279
+ return [values.map(toACVMField)];
284
280
  }
285
281
 
286
282
  async storageWrite([startStorageSlot]: ACVMField[], values: ACVMField[]): Promise<ACVMField[]> {
287
- const newValues = await this.typedOracle.storageWrite(fromACVMField(startStorageSlot), values.map(fromACVMField));
283
+ const newValues = await this.typedOracle.storageWrite(Fr.fromString(startStorageSlot), values.map(Fr.fromString));
288
284
  return newValues.map(toACVMField);
289
285
  }
290
286
 
291
- notifyCreatedContractClassLog([contractAddress]: ACVMField[], message: ACVMField[], [counter]: ACVMField[]): void {
292
- const logPayload = message.map(fromACVMField);
293
- const log = new ContractClassLog(new AztecAddress(fromACVMField(contractAddress)), logPayload);
287
+ notifyCreatedContractClassLog(
288
+ [contractAddress]: ACVMField[],
289
+ message: ACVMField[],
290
+ [counter]: ACVMField[],
291
+ ): Promise<ACVMField[]> {
292
+ const logPayload = message.map(Fr.fromString);
293
+ const log = new ContractClassLog(new AztecAddress(Fr.fromString(contractAddress)), logPayload);
294
294
 
295
295
  this.typedOracle.notifyCreatedContractClassLog(log, +counter);
296
+ return Promise.resolve([]);
296
297
  }
297
298
 
298
- debugLog(message: ACVMField[], _ignoredFieldsSize: ACVMField[], fields: ACVMField[]): void {
299
- const messageStr = message.map(acvmField => String.fromCharCode(fromACVMField(acvmField).toNumber())).join('');
300
- const fieldsFr = fields.map(fromACVMField);
299
+ debugLog(message: ACVMField[], _ignoredFieldsSize: ACVMField[], fields: ACVMField[]): Promise<ACVMField[]> {
300
+ const messageStr = message.map(acvmField => String.fromCharCode(Fr.fromString(acvmField).toNumber())).join('');
301
+ const fieldsFr = fields.map(Fr.fromString);
301
302
  this.typedOracle.debugLog(messageStr, fieldsFr);
303
+ return Promise.resolve([]);
302
304
  }
303
305
 
304
306
  async callPrivateFunction(
@@ -307,15 +309,15 @@ export class Oracle {
307
309
  [argsHash]: ACVMField[],
308
310
  [sideEffectCounter]: ACVMField[],
309
311
  [isStaticCall]: ACVMField[],
310
- ): Promise<ACVMField[]> {
312
+ ): Promise<ACVMField[][]> {
311
313
  const { endSideEffectCounter, returnsHash } = await this.typedOracle.callPrivateFunction(
312
- AztecAddress.fromField(fromACVMField(contractAddress)),
313
- FunctionSelector.fromField(fromACVMField(functionSelector)),
314
- fromACVMField(argsHash),
315
- frToNumber(fromACVMField(sideEffectCounter)),
316
- frToBoolean(fromACVMField(isStaticCall)),
314
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
315
+ FunctionSelector.fromField(Fr.fromString(functionSelector)),
316
+ Fr.fromString(argsHash),
317
+ Fr.fromString(sideEffectCounter).toNumber(),
318
+ Fr.fromString(isStaticCall).toBool(),
317
319
  );
318
- return [endSideEffectCounter, returnsHash].map(toACVMField);
320
+ return [[endSideEffectCounter, returnsHash].map(toACVMField)];
319
321
  }
320
322
 
321
323
  async enqueuePublicFunctionCall(
@@ -324,15 +326,15 @@ export class Oracle {
324
326
  [argsHash]: ACVMField[],
325
327
  [sideEffectCounter]: ACVMField[],
326
328
  [isStaticCall]: ACVMField[],
327
- ): Promise<ACVMField> {
329
+ ): Promise<ACVMField[]> {
328
330
  const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(
329
331
  AztecAddress.fromString(contractAddress),
330
- FunctionSelector.fromField(fromACVMField(functionSelector)),
331
- fromACVMField(argsHash),
332
- frToNumber(fromACVMField(sideEffectCounter)),
333
- frToBoolean(fromACVMField(isStaticCall)),
332
+ FunctionSelector.fromField(Fr.fromString(functionSelector)),
333
+ Fr.fromString(argsHash),
334
+ Fr.fromString(sideEffectCounter).toNumber(),
335
+ Fr.fromString(isStaticCall).toBool(),
334
336
  );
335
- return toACVMField(newArgsHash);
337
+ return [toACVMField(newArgsHash)];
336
338
  }
337
339
 
338
340
  async setPublicTeardownFunctionCall(
@@ -341,38 +343,41 @@ export class Oracle {
341
343
  [argsHash]: ACVMField[],
342
344
  [sideEffectCounter]: ACVMField[],
343
345
  [isStaticCall]: ACVMField[],
344
- ): Promise<ACVMField> {
346
+ ): Promise<ACVMField[]> {
345
347
  const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(
346
348
  AztecAddress.fromString(contractAddress),
347
- FunctionSelector.fromField(fromACVMField(functionSelector)),
348
- fromACVMField(argsHash),
349
- frToNumber(fromACVMField(sideEffectCounter)),
350
- frToBoolean(fromACVMField(isStaticCall)),
349
+ FunctionSelector.fromField(Fr.fromString(functionSelector)),
350
+ Fr.fromString(argsHash),
351
+ Fr.fromString(sideEffectCounter).toNumber(),
352
+ Fr.fromString(isStaticCall).toBool(),
351
353
  );
352
- return toACVMField(newArgsHash);
354
+ return [toACVMField(newArgsHash)];
353
355
  }
354
356
 
355
- notifySetMinRevertibleSideEffectCounter([minRevertibleSideEffectCounter]: ACVMField[]) {
356
- this.typedOracle.notifySetMinRevertibleSideEffectCounter(frToNumber(fromACVMField(minRevertibleSideEffectCounter)));
357
+ notifySetMinRevertibleSideEffectCounter([minRevertibleSideEffectCounter]: ACVMField[]): Promise<ACVMField[]> {
358
+ this.typedOracle.notifySetMinRevertibleSideEffectCounter(Fr.fromString(minRevertibleSideEffectCounter).toNumber());
359
+ return Promise.resolve([]);
357
360
  }
358
361
 
359
- async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
362
+ async getIndexedTaggingSecretAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[][]> {
360
363
  const taggingSecret = await this.typedOracle.getIndexedTaggingSecretAsSender(
361
364
  AztecAddress.fromString(sender),
362
365
  AztecAddress.fromString(recipient),
363
366
  );
364
- return taggingSecret.toFields().map(toACVMField);
367
+ return [taggingSecret.toFields().map(toACVMField)];
365
368
  }
366
369
 
367
- async incrementAppTaggingSecretIndexAsSender([sender]: ACVMField[], [recipient]: ACVMField[]) {
370
+ async incrementAppTaggingSecretIndexAsSender([sender]: ACVMField[], [recipient]: ACVMField[]): Promise<ACVMField[]> {
368
371
  await this.typedOracle.incrementAppTaggingSecretIndexAsSender(
369
372
  AztecAddress.fromString(sender),
370
373
  AztecAddress.fromString(recipient),
371
374
  );
375
+ return [];
372
376
  }
373
377
 
374
- async syncNotes() {
378
+ async syncNotes(): Promise<ACVMField[]> {
375
379
  await this.typedOracle.syncNotes();
380
+ return [];
376
381
  }
377
382
 
378
383
  async deliverNote(
@@ -385,26 +390,26 @@ export class Oracle {
385
390
  [nullifier]: ACVMField[],
386
391
  [txHash]: ACVMField[],
387
392
  [recipient]: ACVMField[],
388
- ): Promise<ACVMField> {
393
+ ): Promise<ACVMField[]> {
389
394
  // TODO(#10728): try-catch this block and return false if we get an exception so that the contract can decide what
390
395
  // to do if a note fails delivery (e.g. not increment the tagging index, or add it to some pending work list).
391
396
  // Delivery might fail due to temporary issues, such as poor node connectivity.
392
397
  await this.typedOracle.deliverNote(
393
398
  AztecAddress.fromString(contractAddress),
394
- fromACVMField(storageSlot),
395
- fromACVMField(nonce),
399
+ Fr.fromString(storageSlot),
400
+ Fr.fromString(nonce),
396
401
  fromBoundedVec(content, contentLength),
397
- fromACVMField(noteHash),
398
- fromACVMField(nullifier),
399
- fromACVMField(txHash),
402
+ Fr.fromString(noteHash),
403
+ Fr.fromString(nullifier),
404
+ Fr.fromString(txHash),
400
405
  AztecAddress.fromString(recipient),
401
406
  );
402
407
 
403
- return toACVMField(true);
408
+ return [toACVMField(true)];
404
409
  }
405
410
 
406
411
  async getLogByTag([tag]: ACVMField[]): Promise<(ACVMField | ACVMField[])[]> {
407
- const log = await this.typedOracle.getLogByTag(fromACVMField(tag));
412
+ const log = await this.typedOracle.getLogByTag(Fr.fromString(tag));
408
413
 
409
414
  if (log == null) {
410
415
  return [toACVMField(0), ...LogWithTxData.noirSerializationOfEmpty().map(toACVMFieldSingleOrArray)];
@@ -413,12 +418,13 @@ export class Oracle {
413
418
  }
414
419
  }
415
420
 
416
- async storeCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[], capsule: ACVMField[]) {
421
+ async storeCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[], capsule: ACVMField[]): Promise<ACVMField[]> {
417
422
  await this.typedOracle.storeCapsule(
418
- AztecAddress.fromField(fromACVMField(contractAddress)),
419
- fromACVMField(slot),
420
- capsule.map(fromACVMField),
423
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
424
+ Fr.fromString(slot),
425
+ capsule.map(Fr.fromString),
421
426
  );
427
+ return [];
422
428
  }
423
429
 
424
430
  async loadCapsule(
@@ -427,23 +433,24 @@ export class Oracle {
427
433
  [tSize]: ACVMField[],
428
434
  ): Promise<(ACVMField | ACVMField[])[]> {
429
435
  const values = await this.typedOracle.loadCapsule(
430
- AztecAddress.fromField(fromACVMField(contractAddress)),
431
- fromACVMField(slot),
436
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
437
+ Fr.fromString(slot),
432
438
  );
433
439
 
434
440
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
435
441
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
436
442
  if (values === null) {
437
443
  // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
438
- return [toACVMField(0), Array(frToNumber(fromACVMField(tSize))).fill(toACVMField(0))];
444
+ return [toACVMField(0), Array(Fr.fromString(tSize).toNumber()).fill(toACVMField(0))];
439
445
  } else {
440
446
  // Data was found so we set `some` to 1 and return it along with `value`.
441
447
  return [toACVMField(1), values.map(toACVMField)];
442
448
  }
443
449
  }
444
450
 
445
- async deleteCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[]) {
446
- await this.typedOracle.deleteCapsule(AztecAddress.fromField(fromACVMField(contractAddress)), fromACVMField(slot));
451
+ async deleteCapsule([contractAddress]: ACVMField[], [slot]: ACVMField[]): Promise<ACVMField[]> {
452
+ await this.typedOracle.deleteCapsule(AztecAddress.fromField(Fr.fromString(contractAddress)), Fr.fromString(slot));
453
+ return [];
447
454
  }
448
455
 
449
456
  async copyCapsule(
@@ -451,13 +458,14 @@ export class Oracle {
451
458
  [srcSlot]: ACVMField[],
452
459
  [dstSlot]: ACVMField[],
453
460
  [numEntries]: ACVMField[],
454
- ) {
461
+ ): Promise<ACVMField[]> {
455
462
  await this.typedOracle.copyCapsule(
456
- AztecAddress.fromField(fromACVMField(contractAddress)),
457
- fromACVMField(srcSlot),
458
- fromACVMField(dstSlot),
459
- frToNumber(fromACVMField(numEntries)),
463
+ AztecAddress.fromField(Fr.fromString(contractAddress)),
464
+ Fr.fromString(srcSlot),
465
+ Fr.fromString(dstSlot),
466
+ Fr.fromString(numEntries).toNumber(),
460
467
  );
468
+ return [];
461
469
  }
462
470
 
463
471
  async aes128Decrypt(
@@ -481,8 +489,8 @@ export class Oracle {
481
489
  [ephPKField2]: ACVMField[],
482
490
  ): Promise<ACVMField[]> {
483
491
  const secret = await this.typedOracle.getSharedSecret(
484
- AztecAddress.fromField(fromACVMField(address)),
485
- Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(fromACVMField)),
492
+ AztecAddress.fromField(Fr.fromString(address)),
493
+ Point.fromFields([ephPKField0, ephPKField1, ephPKField2].map(Fr.fromString)),
486
494
  );
487
495
  return secret.toFields().map(toACVMField);
488
496
  }
@@ -87,8 +87,8 @@ export abstract class TypedOracle {
87
87
  return Promise.reject(new OracleMethodNotAvailableError('getNullifierMembershipWitness'));
88
88
  }
89
89
 
90
- getPublicDataTreeWitness(_blockNumber: number, _leafSlot: Fr): Promise<PublicDataWitness | undefined> {
91
- return Promise.reject(new OracleMethodNotAvailableError('getPublicDataTreeWitness'));
90
+ getPublicDataWitness(_blockNumber: number, _leafSlot: Fr): Promise<PublicDataWitness | undefined> {
91
+ return Promise.reject(new OracleMethodNotAvailableError('getPublicDataWitness'));
92
92
  }
93
93
 
94
94
  getLowNullifierMembershipWitness(
@@ -1,5 +1,5 @@
1
1
  import type { Fr, Point } from '@aztec/foundation/fields';
2
- import type { FunctionArtifact, FunctionSelector } from '@aztec/stdlib/abi';
2
+ import type { FunctionArtifact, FunctionArtifactWithContractName, FunctionSelector } from '@aztec/stdlib/abi';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import type { L2Block } from '@aztec/stdlib/block';
5
5
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
@@ -49,13 +49,6 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
49
49
  */
50
50
  getCompleteAddress(account: AztecAddress): Promise<CompleteAddress>;
51
51
 
52
- /**
53
- * Retrieve the auth witness for a given message hash.
54
- * @param messageHash - The message hash.
55
- * @returns A Promise that resolves to an array of field elements representing the auth witness.
56
- */
57
- getAuthWitness(messageHash: Fr): Promise<Fr[] | undefined>;
58
-
59
52
  /**
60
53
  * Retrieve keys associated with a specific master public key and app address.
61
54
  * @param pkMHash - The master public key hash.
@@ -90,7 +83,10 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
90
83
  * @param selector - The corresponding function selector.
91
84
  * @returns A Promise that resolves to a FunctionArtifact object.
92
85
  */
93
- getFunctionArtifact(contractAddress: AztecAddress, selector: FunctionSelector): Promise<FunctionArtifact>;
86
+ getFunctionArtifact(
87
+ contractAddress: AztecAddress,
88
+ selector: FunctionSelector,
89
+ ): Promise<FunctionArtifactWithContractName>;
94
90
 
95
91
  /**
96
92
  * Generates a stable function name for debug purposes.
@@ -157,7 +153,7 @@ export interface ExecutionDataProvider extends CommitmentsDBInterface {
157
153
  * @param blockNumber - The block number at which to get the witness.
158
154
  * @param leafSlot - The slot of the public data in the public data tree.
159
155
  */
160
- getPublicDataTreeWitness(blockNumber: number, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
156
+ getPublicDataWitness(blockNumber: number, leafSlot: Fr): Promise<PublicDataWitness | undefined>;
161
157
 
162
158
  /**
163
159
  * Gets the storage value at the given contract storage slot.
@@ -3,7 +3,12 @@ import { Fr } from '@aztec/foundation/fields';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { Timer } from '@aztec/foundation/timer';
5
5
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
6
- import { type FunctionArtifact, type FunctionSelector, countArgumentsSize } from '@aztec/stdlib/abi';
6
+ import {
7
+ type FunctionArtifact,
8
+ type FunctionArtifactWithContractName,
9
+ type FunctionSelector,
10
+ countArgumentsSize,
11
+ } from '@aztec/stdlib/abi';
7
12
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
8
13
  import type { ContractInstance } from '@aztec/stdlib/contract';
9
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
@@ -13,7 +18,7 @@ import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats';
13
18
  import { PrivateCallExecutionResult } from '@aztec/stdlib/tx';
14
19
 
15
20
  import { ExecutionError, resolveAssertionMessageFromError } from '../common/errors.js';
16
- import { fromACVMField, witnessMapToFields } from './acvm/deserialize.js';
21
+ import { witnessMapToFields } from './acvm/deserialize.js';
17
22
  import { type ACVMWitness, Oracle, extractCallStack } from './acvm/index.js';
18
23
  import type { ExecutionDataProvider } from './execution_data_provider.js';
19
24
  import type { PrivateExecutionOracle } from './private_execution_oracle.js';
@@ -25,19 +30,18 @@ import type { SimulationProvider } from './providers/simulation_provider.js';
25
30
  export async function executePrivateFunction(
26
31
  simulator: SimulationProvider,
27
32
  privateExecutionOracle: PrivateExecutionOracle,
28
- artifact: FunctionArtifact,
33
+ artifact: FunctionArtifactWithContractName,
29
34
  contractAddress: AztecAddress,
30
35
  functionSelector: FunctionSelector,
31
36
  log = createLogger('simulator:private_execution'),
32
37
  ): Promise<PrivateCallExecutionResult> {
33
38
  const functionName = await privateExecutionOracle.getDebugFunctionName();
34
39
  log.verbose(`Executing private function ${functionName}`, { contract: contractAddress });
35
- const acir = artifact.bytecode;
36
40
  const initialWitness = privateExecutionOracle.getInitialWitness(artifact);
37
41
  const acvmCallback = new Oracle(privateExecutionOracle);
38
42
  const timer = new Timer();
39
43
  const acirExecutionResult = await simulator
40
- .executeUserCircuit(acir, initialWitness, acvmCallback)
44
+ .executeUserCircuit(initialWitness, artifact, acvmCallback)
41
45
  .catch((err: Error) => {
42
46
  err.message = resolveAssertionMessageFromError(err, artifact);
43
47
  throw new ExecutionError(
@@ -79,7 +83,7 @@ export async function executePrivateFunction(
79
83
  log.debug(`Returning from call to ${contractAddress.toString()}:${functionSelector}`);
80
84
 
81
85
  return new PrivateCallExecutionResult(
82
- acir,
86
+ artifact.bytecode,
83
87
  Buffer.from(artifact.verificationKey!, 'base64'),
84
88
  partialWitness,
85
89
  publicInputs,
@@ -113,7 +117,7 @@ export function extractPrivateCircuitPublicInputs(
113
117
  if (returnedField === undefined) {
114
118
  throw new Error(`Missing return value for index ${i}`);
115
119
  }
116
- returnData.push(fromACVMField(returnedField));
120
+ returnData.push(Fr.fromString(returnedField));
117
121
  }
118
122
  return PrivateCircuitPublicInputs.fromFields(returnData);
119
123
  }