@aztec/simulator 0.23.0 → 0.26.1

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 (177) hide show
  1. package/dest/acvm/deserialize.d.ts +5 -0
  2. package/dest/acvm/deserialize.d.ts.map +1 -1
  3. package/dest/acvm/deserialize.js +8 -1
  4. package/dest/acvm/oracle/oracle.d.ts +7 -6
  5. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/oracle.js +28 -15
  7. package/dest/acvm/oracle/typed_oracle.d.ts +9 -11
  8. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/typed_oracle.js +11 -11
  10. package/dest/avm/avm_context.d.ts +4 -4
  11. package/dest/avm/avm_context.d.ts.map +1 -1
  12. package/dest/avm/avm_context.js +6 -6
  13. package/dest/avm/avm_execution_environment.d.ts +3 -2
  14. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  15. package/dest/avm/avm_execution_environment.js +6 -5
  16. package/dest/avm/avm_memory_types.d.ts +127 -37
  17. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  18. package/dest/avm/avm_memory_types.js +98 -106
  19. package/dest/avm/avm_simulator.d.ts +6 -4
  20. package/dest/avm/avm_simulator.d.ts.map +1 -1
  21. package/dest/avm/avm_simulator.js +17 -19
  22. package/dest/avm/errors.d.ts +3 -1
  23. package/dest/avm/errors.d.ts.map +1 -1
  24. package/dest/avm/errors.js +9 -3
  25. package/dest/avm/fixtures/index.d.ts +21 -5
  26. package/dest/avm/fixtures/index.d.ts.map +1 -1
  27. package/dest/avm/fixtures/index.js +28 -9
  28. package/dest/avm/journal/host_storage.d.ts +1 -1
  29. package/dest/avm/journal/host_storage.d.ts.map +1 -1
  30. package/dest/avm/journal/host_storage.js +1 -1
  31. package/dest/avm/journal/journal.d.ts +78 -50
  32. package/dest/avm/journal/journal.d.ts.map +1 -1
  33. package/dest/avm/journal/journal.js +125 -169
  34. package/dest/avm/journal/nullifiers.d.ts +85 -0
  35. package/dest/avm/journal/nullifiers.d.ts.map +1 -0
  36. package/dest/avm/journal/nullifiers.js +147 -0
  37. package/dest/avm/journal/public_storage.d.ts +88 -0
  38. package/dest/avm/journal/public_storage.d.ts.map +1 -0
  39. package/dest/avm/journal/public_storage.js +135 -0
  40. package/dest/avm/journal/trace.d.ts +43 -0
  41. package/dest/avm/journal/trace.d.ts.map +1 -0
  42. package/dest/avm/journal/trace.js +204 -0
  43. package/dest/avm/journal/trace_types.d.ts +26 -0
  44. package/dest/avm/journal/trace_types.d.ts.map +1 -0
  45. package/dest/avm/journal/trace_types.js +6 -0
  46. package/dest/avm/opcodes/accrued_substate.d.ts +37 -4
  47. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  48. package/dest/avm/opcodes/accrued_substate.js +109 -12
  49. package/dest/avm/opcodes/addressing_mode.d.ts +24 -0
  50. package/dest/avm/opcodes/addressing_mode.d.ts.map +1 -0
  51. package/dest/avm/opcodes/addressing_mode.js +62 -0
  52. package/dest/avm/opcodes/environment_getters.d.ts +14 -13
  53. package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
  54. package/dest/avm/opcodes/environment_getters.js +1 -1
  55. package/dest/avm/opcodes/external_calls.js +5 -5
  56. package/dest/avm/opcodes/hashing.d.ts +48 -0
  57. package/dest/avm/opcodes/hashing.d.ts.map +1 -0
  58. package/dest/avm/opcodes/hashing.js +127 -0
  59. package/dest/avm/opcodes/instruction.d.ts +4 -4
  60. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  61. package/dest/avm/opcodes/instruction.js +1 -1
  62. package/dest/avm/opcodes/memory.d.ts.map +1 -1
  63. package/dest/avm/opcodes/memory.js +5 -3
  64. package/dest/avm/opcodes/storage.d.ts.map +1 -1
  65. package/dest/avm/opcodes/storage.js +3 -3
  66. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  67. package/dest/avm/serialization/bytecode_serialization.js +28 -22
  68. package/dest/avm/serialization/instruction_serialization.d.ts +21 -16
  69. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  70. package/dest/avm/serialization/instruction_serialization.js +23 -18
  71. package/dest/avm/temporary_executor_migration.d.ts +25 -0
  72. package/dest/avm/temporary_executor_migration.d.ts.map +1 -0
  73. package/dest/avm/temporary_executor_migration.js +71 -0
  74. package/dest/client/client_execution_context.d.ts +13 -7
  75. package/dest/client/client_execution_context.d.ts.map +1 -1
  76. package/dest/client/client_execution_context.js +52 -27
  77. package/dest/client/db_oracle.d.ts +7 -0
  78. package/dest/client/db_oracle.d.ts.map +1 -1
  79. package/dest/client/db_oracle.js +1 -1
  80. package/dest/client/execution_note_cache.js +1 -1
  81. package/dest/client/execution_result.d.ts +4 -2
  82. package/dest/client/execution_result.d.ts.map +1 -1
  83. package/dest/client/execution_result.js +1 -1
  84. package/dest/client/private_execution.d.ts.map +1 -1
  85. package/dest/client/private_execution.js +4 -4
  86. package/dest/client/simulator.d.ts +11 -6
  87. package/dest/client/simulator.d.ts.map +1 -1
  88. package/dest/client/simulator.js +21 -12
  89. package/dest/client/unconstrained_execution.js +2 -2
  90. package/dest/client/view_data_oracle.d.ts +9 -2
  91. package/dest/client/view_data_oracle.d.ts.map +1 -1
  92. package/dest/client/view_data_oracle.js +13 -5
  93. package/dest/public/db.d.ts +17 -4
  94. package/dest/public/db.d.ts.map +1 -1
  95. package/dest/public/execution.d.ts +9 -4
  96. package/dest/public/execution.d.ts.map +1 -1
  97. package/dest/public/execution.js +18 -5
  98. package/dest/public/executor.d.ts +7 -0
  99. package/dest/public/executor.d.ts.map +1 -1
  100. package/dest/public/executor.js +40 -6
  101. package/dest/public/public_execution_context.d.ts +5 -4
  102. package/dest/public/public_execution_context.d.ts.map +1 -1
  103. package/dest/public/public_execution_context.js +24 -13
  104. package/dest/public/state_actions.d.ts +1 -1
  105. package/dest/public/state_actions.d.ts.map +1 -1
  106. package/dest/public/state_actions.js +6 -7
  107. package/dest/test/utils.js +4 -4
  108. package/dest/utils.d.ts +5 -20
  109. package/dest/utils.d.ts.map +1 -1
  110. package/dest/utils.js +4 -21
  111. package/package.json +9 -6
  112. package/src/acvm/acvm.ts +156 -0
  113. package/src/acvm/acvm_types.ts +11 -0
  114. package/src/acvm/deserialize.ts +44 -0
  115. package/src/acvm/index.ts +5 -0
  116. package/src/acvm/oracle/debug.ts +109 -0
  117. package/src/acvm/oracle/index.ts +17 -0
  118. package/src/acvm/oracle/oracle.ts +356 -0
  119. package/src/acvm/oracle/typed_oracle.ts +225 -0
  120. package/src/acvm/serialize.ts +75 -0
  121. package/src/avm/avm_context.ts +63 -0
  122. package/src/avm/avm_execution_environment.ts +98 -0
  123. package/src/avm/avm_machine_state.ts +93 -0
  124. package/src/avm/avm_memory_types.ts +324 -0
  125. package/src/avm/avm_message_call_result.ts +29 -0
  126. package/src/avm/avm_simulator.ts +87 -0
  127. package/src/avm/errors.ts +57 -0
  128. package/src/avm/fixtures/index.ts +115 -0
  129. package/src/avm/journal/host_storage.ts +14 -0
  130. package/src/avm/journal/index.ts +2 -0
  131. package/src/avm/journal/journal.ts +231 -0
  132. package/src/avm/journal/nullifiers.ts +170 -0
  133. package/src/avm/journal/public_storage.ts +149 -0
  134. package/src/avm/journal/trace.ts +223 -0
  135. package/src/avm/journal/trace_types.ts +79 -0
  136. package/src/avm/opcodes/.eslintrc.cjs +8 -0
  137. package/src/avm/opcodes/accrued_substate.ts +214 -0
  138. package/src/avm/opcodes/addressing_mode.ts +66 -0
  139. package/src/avm/opcodes/arithmetic.ts +79 -0
  140. package/src/avm/opcodes/bitwise.ts +129 -0
  141. package/src/avm/opcodes/comparators.ts +69 -0
  142. package/src/avm/opcodes/control_flow.ts +129 -0
  143. package/src/avm/opcodes/environment_getters.ts +201 -0
  144. package/src/avm/opcodes/external_calls.ts +122 -0
  145. package/src/avm/opcodes/hashing.ts +170 -0
  146. package/src/avm/opcodes/index.ts +10 -0
  147. package/src/avm/opcodes/instruction.ts +64 -0
  148. package/src/avm/opcodes/instruction_impl.ts +52 -0
  149. package/src/avm/opcodes/memory.ts +194 -0
  150. package/src/avm/opcodes/storage.ts +79 -0
  151. package/src/avm/serialization/buffer_cursor.ts +109 -0
  152. package/src/avm/serialization/bytecode_serialization.ts +179 -0
  153. package/src/avm/serialization/instruction_serialization.ts +170 -0
  154. package/src/avm/temporary_executor_migration.ts +109 -0
  155. package/src/client/client_execution_context.ts +502 -0
  156. package/src/client/db_oracle.ts +192 -0
  157. package/src/client/execution_note_cache.ts +90 -0
  158. package/src/client/execution_result.ts +89 -0
  159. package/src/client/index.ts +3 -0
  160. package/src/client/pick_notes.ts +125 -0
  161. package/src/client/private_execution.ts +79 -0
  162. package/src/client/simulator.ts +317 -0
  163. package/src/client/unconstrained_execution.ts +49 -0
  164. package/src/client/view_data_oracle.ts +253 -0
  165. package/src/common/errors.ts +61 -0
  166. package/src/common/index.ts +3 -0
  167. package/src/common/packed_args_cache.ts +55 -0
  168. package/src/common/side_effect_counter.ts +12 -0
  169. package/src/index.ts +3 -0
  170. package/src/public/db.ts +100 -0
  171. package/src/public/execution.ts +161 -0
  172. package/src/public/executor.ts +178 -0
  173. package/src/public/index.ts +9 -0
  174. package/src/public/public_execution_context.ts +241 -0
  175. package/src/public/state_actions.ts +100 -0
  176. package/src/test/utils.ts +38 -0
  177. package/src/utils.ts +18 -0
@@ -0,0 +1,11 @@
1
+ import { WitnessMap } from '@noir-lang/acvm_js';
2
+
3
+ /**
4
+ * ACVMField
5
+ */
6
+ export type ACVMField = string;
7
+
8
+ /**
9
+ * The format for witnesses of the ACVM.
10
+ */
11
+ export type ACVMWitness = WitnessMap;
@@ -0,0 +1,44 @@
1
+ import { Fr } from '@aztec/foundation/fields';
2
+
3
+ import { getReturnWitness } from '@noir-lang/acvm_js';
4
+
5
+ import { ACVMField, ACVMWitness } from './acvm_types.js';
6
+
7
+ /**
8
+ * Converts an ACVM field to a Fr.
9
+ * @param field - The ACVM field to convert.
10
+ * @returns The Fr.
11
+ */
12
+ export function fromACVMField(field: ACVMField): Fr {
13
+ return Fr.fromBuffer(Buffer.from(field.slice(2), 'hex'));
14
+ }
15
+
16
+ /**
17
+ * Converts a field to a number.
18
+ * @param fr - The field to convert.
19
+ * @returns The number.
20
+ * TODO(#4102): Nuke this once block number is big int.
21
+ */
22
+ export function frToNumber(fr: Fr): number {
23
+ return Number(fr.value);
24
+ }
25
+
26
+ /**
27
+ * Converts a field to a boolean.
28
+ * @param fr - The field to convert.
29
+ */
30
+ export function frToBoolean(fr: Fr): boolean {
31
+ return fr.toBigInt() === BigInt(1);
32
+ }
33
+
34
+ /**
35
+ * Extracts the return fields of a given partial witness.
36
+ * @param acir - The bytecode of the function.
37
+ * @param partialWitness - The witness to extract from.
38
+ * @returns The return values.
39
+ */
40
+ export function extractReturnWitness(acir: Buffer, partialWitness: ACVMWitness): Fr[] {
41
+ const returnWitness = getReturnWitness(acir, partialWitness);
42
+ const sortedKeys = [...returnWitness.keys()].sort((a, b) => a - b);
43
+ return sortedKeys.map(key => returnWitness.get(key)!).map(fromACVMField);
44
+ }
@@ -0,0 +1,5 @@
1
+ export * from './acvm.js';
2
+ export * from './acvm_types.js';
3
+ export * from './deserialize.js';
4
+ export * from './oracle/index.js';
5
+ export * from './serialize.js';
@@ -0,0 +1,109 @@
1
+ import { ForeignCallInput } from '@noir-lang/acvm_js';
2
+
3
+ import { ACVMField } from '../acvm_types.js';
4
+
5
+ /**
6
+ * Convert an array of ACVMFields to a string.
7
+ *
8
+ * @param msg - array of ACVMFields where each represents a single ascii character
9
+ * @returns string representation of the message
10
+ */
11
+ export function acvmFieldMessageToString(msg: ACVMField[]): string {
12
+ let msgStr = '';
13
+ for (const msgChar of msg) {
14
+ const asciiCode = Number(msgChar);
15
+ const asciiChar = String.fromCharCode(asciiCode);
16
+ msgStr = msgStr.concat(asciiChar);
17
+ }
18
+ // cut off string in case of preemptive null termination
19
+ const nullCharIndex = msgStr.indexOf('\\0');
20
+ if (nullCharIndex >= 0) {
21
+ msgStr = msgStr.substring(0, nullCharIndex);
22
+ }
23
+ return msgStr.replaceAll('\\n', '\n').replaceAll('\\t', '\t');
24
+ }
25
+
26
+ /**
27
+ * Format a debug string for Aztec.nr filling in `'{0}'` entries with their
28
+ * corresponding values from the args array.
29
+ *
30
+ * @param formatStr - str of form `'this is a string with some entries like {0} and {1}'`
31
+ * @param args - array of fields to fill in the string format entries with
32
+ * @returns formatted string
33
+ */
34
+ function applyStringFormatting(formatStr: string, args: ACVMField[]): string {
35
+ const matches = formatStr.match(/{\d+}/g);
36
+ if (matches == null) {
37
+ return formatStr;
38
+ }
39
+ // Get the numeric values within the curly braces, convert them to numbers,
40
+ // and find the maximum value.
41
+ const maxIndex = Math.max(...matches.map(match => Number(match.slice(1, -1))));
42
+ const argsPadded = args.concat(Array.from({ length: Math.max(0, maxIndex - args.length) }, () => '0xBAD'));
43
+
44
+ return formatStr.replace(/{(\d+)}/g, function (match, index) {
45
+ return typeof args[index] != 'undefined' ? argsPadded[index] : match;
46
+ });
47
+ }
48
+
49
+ /**
50
+ * Convert an array of ACVMFields from ACVM to a formatted string.
51
+ *
52
+ * @param parameters - either one parameter representing a simple field or array, or two parameters when
53
+ * It's a message without args or three parameters when it's a message with arguments.
54
+ *
55
+ * @returns formatted string
56
+ */
57
+ export function oracleDebugCallToFormattedStr(parameters: ForeignCallInput[]): string {
58
+ if (parameters.length === 1) {
59
+ return processFieldOrArray(parameters[0]);
60
+ }
61
+
62
+ let formatArgs: string[] = [];
63
+
64
+ if (parameters.length > 2) {
65
+ formatArgs = parameters[1];
66
+ }
67
+
68
+ const formattedMsg = applyStringFormatting(acvmFieldMessageToString(parameters[0]), formatArgs);
69
+
70
+ return formattedMsg;
71
+ }
72
+
73
+ /**
74
+ * Processes a field or an array and returns a string representation.
75
+ * @param fieldOrArray - The field or array to be processed.
76
+ * @returns Returns the processed string representation of the field or array.
77
+ */
78
+ function processFieldOrArray(fieldOrArray: string[]) {
79
+ if (fieldOrArray.length === 1) {
80
+ return `${fieldOrArray[0]}`;
81
+ }
82
+
83
+ // Check if all the elements start with 63 zero bytes
84
+ // --> if yes, we have an array of bytes and we print as hex
85
+ if (onlyBytes(fieldOrArray)) {
86
+ const decimalArray = fieldOrArray.map(element => parseInt(element, 16));
87
+ return '0x' + Buffer.from(decimalArray).toString('hex');
88
+ }
89
+
90
+ return '[' + fieldOrArray.join(', ') + ']';
91
+ }
92
+
93
+ /**
94
+ * Checks if all elements in the array are valid byte representations.
95
+ * @param array - The array to be checked.
96
+ * @returns Returns `true` if all elements are valid byte representations, `false` otherwise.
97
+ * @throws Throws an error if any element has an invalid length.
98
+ */
99
+ function onlyBytes(array: string[]): boolean {
100
+ for (const element of array) {
101
+ if (element.length != 66) {
102
+ throw new Error('Invalid element length. Expected 66 chars, got ' + element.length + ' chars.');
103
+ }
104
+ if (!element.startsWith('0x00000000000000000000000000000000000000000000000000000000000000')) {
105
+ return false;
106
+ }
107
+ }
108
+ return true;
109
+ }
@@ -0,0 +1,17 @@
1
+ import { Oracle } from './oracle.js';
2
+
3
+ export * from './debug.js';
4
+ export * from './oracle.js';
5
+ export * from './typed_oracle.js';
6
+
7
+ /**
8
+ * A conditional type that takes a type `T` and returns a union of its method names.
9
+ */
10
+ type MethodNames<T> = {
11
+ [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never;
12
+ }[keyof T];
13
+
14
+ /**
15
+ * Available oracle function names.
16
+ */
17
+ export type ORACLE_NAMES = MethodNames<Oracle>;
@@ -0,0 +1,356 @@
1
+ import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
+ import { RETURN_VALUES_LENGTH } from '@aztec/circuits.js';
3
+ import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
4
+ import { AztecAddress } from '@aztec/foundation/aztec-address';
5
+ import { padArrayEnd } from '@aztec/foundation/collection';
6
+ import { Fr, Point } from '@aztec/foundation/fields';
7
+ import { createDebugLogger } from '@aztec/foundation/log';
8
+
9
+ import { ACVMField } from '../acvm_types.js';
10
+ import { frToBoolean, frToNumber, fromACVMField } from '../deserialize.js';
11
+ import { toACVMField, toAcvmEnqueuePublicFunctionResult } from '../serialize.js';
12
+ import { acvmFieldMessageToString, oracleDebugCallToFormattedStr } from './debug.js';
13
+ import { TypedOracle } from './typed_oracle.js';
14
+
15
+ /**
16
+ * A data source that has all the apis required by Aztec.nr.
17
+ */
18
+ export class Oracle {
19
+ constructor(private typedOracle: TypedOracle, private log = createDebugLogger('aztec:simulator:oracle')) {}
20
+
21
+ getRandomField(): ACVMField {
22
+ const val = this.typedOracle.getRandomField();
23
+ return toACVMField(val);
24
+ }
25
+
26
+ async packArguments(args: ACVMField[]): Promise<ACVMField> {
27
+ const packed = await this.typedOracle.packArguments(args.map(fromACVMField));
28
+ return toACVMField(packed);
29
+ }
30
+
31
+ async getNullifierKeyPair([accountAddress]: ACVMField[]): Promise<ACVMField[]> {
32
+ const { publicKey, secretKey } = await this.typedOracle.getNullifierKeyPair(fromACVMField(accountAddress));
33
+ return [
34
+ toACVMField(publicKey.x),
35
+ toACVMField(publicKey.y),
36
+ toACVMField(secretKey.high),
37
+ toACVMField(secretKey.low),
38
+ ];
39
+ }
40
+
41
+ async getPublicKeyAndPartialAddress([address]: ACVMField[]) {
42
+ const { publicKey, partialAddress } = await this.typedOracle.getCompleteAddress(
43
+ AztecAddress.fromField(fromACVMField(address)),
44
+ );
45
+ return [publicKey.x, publicKey.y, partialAddress].map(toACVMField);
46
+ }
47
+
48
+ async getContractInstance([address]: ACVMField[]) {
49
+ const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(fromACVMField(address)));
50
+ // TODO(#4434) Add deployer field to ContractInstance
51
+ const deployer = Fr.ZERO;
52
+ return [
53
+ instance.salt,
54
+ deployer,
55
+ instance.contractClassId,
56
+ instance.initializationHash,
57
+ instance.portalContractAddress,
58
+ instance.publicKeysHash,
59
+ ].map(toACVMField);
60
+ }
61
+
62
+ async getMembershipWitness(
63
+ [blockNumber]: ACVMField[],
64
+ [treeId]: ACVMField[],
65
+ [leafValue]: ACVMField[],
66
+ ): Promise<ACVMField[]> {
67
+ const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
68
+ const parsedTreeId = frToNumber(fromACVMField(treeId));
69
+ const parsedLeafValue = fromACVMField(leafValue);
70
+
71
+ const witness = await this.typedOracle.getMembershipWitness(parsedBlockNumber, parsedTreeId, parsedLeafValue);
72
+ if (!witness) {
73
+ throw new Error(
74
+ `Leaf ${leafValue} not found in the tree ${MerkleTreeId[parsedTreeId]} at block ${parsedBlockNumber}.`,
75
+ );
76
+ }
77
+ return witness.map(toACVMField);
78
+ }
79
+
80
+ async getSiblingPath(
81
+ [blockNumber]: ACVMField[],
82
+ [treeId]: ACVMField[],
83
+ [leafIndex]: ACVMField[],
84
+ ): Promise<ACVMField[]> {
85
+ const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
86
+ const parsedTreeId = frToNumber(fromACVMField(treeId));
87
+ const parsedLeafIndex = fromACVMField(leafIndex);
88
+
89
+ const path = await this.typedOracle.getSiblingPath(parsedBlockNumber, parsedTreeId, parsedLeafIndex);
90
+ return path.map(toACVMField);
91
+ }
92
+
93
+ async getNullifierMembershipWitness(
94
+ [blockNumber]: ACVMField[],
95
+ [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);
99
+
100
+ const witness = await this.typedOracle.getNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
101
+ if (!witness) {
102
+ throw new Error(`Nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`);
103
+ }
104
+ return witness.toFields().map(toACVMField);
105
+ }
106
+
107
+ async getLowNullifierMembershipWitness(
108
+ [blockNumber]: ACVMField[],
109
+ [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);
113
+
114
+ const witness = await this.typedOracle.getLowNullifierMembershipWitness(parsedBlockNumber, parsedNullifier);
115
+ if (!witness) {
116
+ throw new Error(
117
+ `Low nullifier witness not found for nullifier ${parsedNullifier} at block ${parsedBlockNumber}.`,
118
+ );
119
+ }
120
+ return witness.toFields().map(toACVMField);
121
+ }
122
+
123
+ async getPublicDataTreeWitness([blockNumber]: ACVMField[], [leafSlot]: ACVMField[]): Promise<ACVMField[]> {
124
+ const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
125
+ const parsedLeafSlot = fromACVMField(leafSlot);
126
+
127
+ const witness = await this.typedOracle.getPublicDataTreeWitness(parsedBlockNumber, parsedLeafSlot);
128
+ if (!witness) {
129
+ throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
130
+ }
131
+ return witness.toFields().map(toACVMField);
132
+ }
133
+
134
+ async getHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
135
+ const parsedBlockNumber = frToNumber(fromACVMField(blockNumber));
136
+
137
+ const header = await this.typedOracle.getHeader(parsedBlockNumber);
138
+ if (!header) {
139
+ throw new Error(`Block header not found for block ${parsedBlockNumber}.`);
140
+ }
141
+ return header.toFields().map(toACVMField);
142
+ }
143
+
144
+ async getAuthWitness([messageHash]: ACVMField[]): Promise<ACVMField[]> {
145
+ const messageHashField = fromACVMField(messageHash);
146
+ const witness = await this.typedOracle.getAuthWitness(messageHashField);
147
+ if (!witness) {
148
+ throw new Error(`Authorization not found for message hash ${messageHashField}`);
149
+ }
150
+ return witness.map(toACVMField);
151
+ }
152
+
153
+ async popCapsule(): Promise<ACVMField[]> {
154
+ const capsule = await this.typedOracle.popCapsule();
155
+ if (!capsule) {
156
+ throw new Error(`No capsules available`);
157
+ }
158
+ return capsule.map(toACVMField);
159
+ }
160
+
161
+ async getNotes(
162
+ [storageSlot]: ACVMField[],
163
+ [numSelects]: ACVMField[],
164
+ selectBy: ACVMField[],
165
+ selectValues: ACVMField[],
166
+ selectComparators: ACVMField[],
167
+ sortBy: ACVMField[],
168
+ sortOrder: ACVMField[],
169
+ [limit]: ACVMField[],
170
+ [offset]: ACVMField[],
171
+ [status]: ACVMField[],
172
+ [returnSize]: ACVMField[],
173
+ ): Promise<ACVMField[]> {
174
+ const noteDatas = await this.typedOracle.getNotes(
175
+ fromACVMField(storageSlot),
176
+ +numSelects,
177
+ selectBy.map(s => +s),
178
+ selectValues.map(fromACVMField),
179
+ selectComparators.map(s => +s),
180
+ sortBy.map(s => +s),
181
+ sortOrder.map(s => +s),
182
+ +limit,
183
+ +offset,
184
+ +status,
185
+ );
186
+
187
+ const noteLength = noteDatas?.[0]?.note.items.length ?? 0;
188
+ if (!noteDatas.every(({ note }) => noteLength === note.items.length)) {
189
+ throw new Error('Notes should all be the same length.');
190
+ }
191
+
192
+ const contractAddress = noteDatas[0]?.contractAddress ?? Fr.ZERO;
193
+
194
+ // Values indicates whether the note is settled or transient.
195
+ const noteTypes = {
196
+ isSettled: new Fr(0),
197
+ isTransient: new Fr(1),
198
+ };
199
+ const flattenData = noteDatas.flatMap(({ nonce, note, index }) => [
200
+ nonce,
201
+ index === undefined ? noteTypes.isTransient : noteTypes.isSettled,
202
+ ...note.items,
203
+ ]);
204
+
205
+ const returnFieldSize = +returnSize;
206
+ const returnData = [noteDatas.length, contractAddress, ...flattenData].map(v => toACVMField(v));
207
+ if (returnData.length > returnFieldSize) {
208
+ throw new Error(`Return data size too big. Maximum ${returnFieldSize} fields. Got ${flattenData.length}.`);
209
+ }
210
+
211
+ const paddedZeros = Array(returnFieldSize - returnData.length).fill(toACVMField(0));
212
+ return returnData.concat(paddedZeros);
213
+ }
214
+
215
+ notifyCreatedNote(
216
+ [storageSlot]: ACVMField[],
217
+ [noteTypeId]: ACVMField[],
218
+ note: ACVMField[],
219
+ [innerNoteHash]: ACVMField[],
220
+ ): ACVMField {
221
+ this.typedOracle.notifyCreatedNote(
222
+ fromACVMField(storageSlot),
223
+ fromACVMField(noteTypeId),
224
+ note.map(fromACVMField),
225
+ fromACVMField(innerNoteHash),
226
+ );
227
+ return toACVMField(0);
228
+ }
229
+
230
+ async notifyNullifiedNote([innerNullifier]: ACVMField[], [innerNoteHash]: ACVMField[]): Promise<ACVMField> {
231
+ await this.typedOracle.notifyNullifiedNote(fromACVMField(innerNullifier), fromACVMField(innerNoteHash));
232
+ return toACVMField(0);
233
+ }
234
+
235
+ async checkNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField> {
236
+ const exists = await this.typedOracle.checkNullifierExists(fromACVMField(innerNullifier));
237
+ return toACVMField(exists);
238
+ }
239
+
240
+ async getL1ToL2MembershipWitness([entryKey]: ACVMField[]): Promise<ACVMField[]> {
241
+ const message = await this.typedOracle.getL1ToL2MembershipWitness(fromACVMField(entryKey));
242
+ return message.toFields().map(toACVMField);
243
+ }
244
+
245
+ async getPortalContractAddress([aztecAddress]: ACVMField[]): Promise<ACVMField> {
246
+ const contractAddress = AztecAddress.fromString(aztecAddress);
247
+ const portalContactAddress = await this.typedOracle.getPortalContractAddress(contractAddress);
248
+ return toACVMField(portalContactAddress);
249
+ }
250
+
251
+ async storageRead([startStorageSlot]: ACVMField[], [numberOfElements]: ACVMField[]): Promise<ACVMField[]> {
252
+ const values = await this.typedOracle.storageRead(fromACVMField(startStorageSlot), +numberOfElements);
253
+ return values.map(toACVMField);
254
+ }
255
+
256
+ async storageWrite([startStorageSlot]: ACVMField[], values: ACVMField[]): Promise<ACVMField[]> {
257
+ const newValues = await this.typedOracle.storageWrite(fromACVMField(startStorageSlot), values.map(fromACVMField));
258
+ return newValues.map(toACVMField);
259
+ }
260
+
261
+ emitEncryptedLog(
262
+ [contractAddress]: ACVMField[],
263
+ [storageSlot]: ACVMField[],
264
+ [noteTypeId]: ACVMField[],
265
+ [publicKeyX]: ACVMField[],
266
+ [publicKeyY]: ACVMField[],
267
+ log: ACVMField[],
268
+ ): ACVMField {
269
+ const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
270
+ this.typedOracle.emitEncryptedLog(
271
+ AztecAddress.fromString(contractAddress),
272
+ Fr.fromString(storageSlot),
273
+ Fr.fromString(noteTypeId),
274
+ publicKey,
275
+ log.map(fromACVMField),
276
+ );
277
+ return toACVMField(0);
278
+ }
279
+
280
+ emitUnencryptedLog([contractAddress]: ACVMField[], [eventSelector]: ACVMField[], message: ACVMField[]): ACVMField {
281
+ const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
282
+ const log = new UnencryptedL2Log(
283
+ AztecAddress.fromString(contractAddress),
284
+ EventSelector.fromField(fromACVMField(eventSelector)),
285
+ logPayload,
286
+ );
287
+
288
+ this.typedOracle.emitUnencryptedLog(log);
289
+ return toACVMField(0);
290
+ }
291
+
292
+ debugLog(...args: ACVMField[][]): ACVMField {
293
+ this.log(oracleDebugCallToFormattedStr(args));
294
+ return toACVMField(0);
295
+ }
296
+
297
+ debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
298
+ this.log(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
299
+ return toACVMField(0);
300
+ }
301
+
302
+ async callPrivateFunction(
303
+ [contractAddress]: ACVMField[],
304
+ [functionSelector]: ACVMField[],
305
+ [argsHash]: ACVMField[],
306
+ [sideffectCounter]: ACVMField[],
307
+ [isStaticCall]: ACVMField[],
308
+ [isDelegateCall]: ACVMField[],
309
+ ): Promise<ACVMField[]> {
310
+ const callStackItem = await this.typedOracle.callPrivateFunction(
311
+ AztecAddress.fromField(fromACVMField(contractAddress)),
312
+ FunctionSelector.fromField(fromACVMField(functionSelector)),
313
+ fromACVMField(argsHash),
314
+ frToNumber(fromACVMField(sideffectCounter)),
315
+ frToBoolean(fromACVMField(isStaticCall)),
316
+ frToBoolean(fromACVMField(isDelegateCall)),
317
+ );
318
+ return callStackItem.toFields().map(toACVMField);
319
+ }
320
+
321
+ async callPublicFunction(
322
+ [contractAddress]: ACVMField[],
323
+ [functionSelector]: ACVMField[],
324
+ [argsHash]: ACVMField[],
325
+ [isStaticCall]: ACVMField[],
326
+ [isDelegateCall]: ACVMField[],
327
+ ): Promise<ACVMField[]> {
328
+ const returnValues = await this.typedOracle.callPublicFunction(
329
+ AztecAddress.fromField(fromACVMField(contractAddress)),
330
+ FunctionSelector.fromField(fromACVMField(functionSelector)),
331
+ fromACVMField(argsHash),
332
+ frToBoolean(fromACVMField(isStaticCall)),
333
+ frToBoolean(fromACVMField(isDelegateCall)),
334
+ );
335
+ return padArrayEnd(returnValues, Fr.ZERO, RETURN_VALUES_LENGTH).map(toACVMField);
336
+ }
337
+
338
+ async enqueuePublicFunctionCall(
339
+ [contractAddress]: ACVMField[],
340
+ [functionSelector]: ACVMField[],
341
+ [argsHash]: ACVMField[],
342
+ [sideffectCounter]: ACVMField[],
343
+ [isStaticCall]: ACVMField[],
344
+ [isDelegateCall]: ACVMField[],
345
+ ) {
346
+ const enqueuedRequest = await this.typedOracle.enqueuePublicFunctionCall(
347
+ AztecAddress.fromString(contractAddress),
348
+ FunctionSelector.fromField(fromACVMField(functionSelector)),
349
+ fromACVMField(argsHash),
350
+ frToNumber(fromACVMField(sideffectCounter)),
351
+ frToBoolean(fromACVMField(isStaticCall)),
352
+ frToBoolean(fromACVMField(isDelegateCall)),
353
+ );
354
+ return toAcvmEnqueuePublicFunctionResult(enqueuedRequest);
355
+ }
356
+ }