@aztec/simulator 0.80.0 → 0.82.0

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