@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.
- package/dest/common/db_interfaces.d.ts +30 -17
- package/dest/common/db_interfaces.d.ts.map +1 -1
- package/dest/common/db_interfaces.js +1 -1
- package/dest/common/debug_fn_name.d.ts +2 -2
- package/dest/common/debug_fn_name.d.ts.map +1 -1
- package/dest/common/message_load_oracle_inputs.d.ts +4 -0
- package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/common/message_load_oracle_inputs.js +9 -0
- package/dest/private/acvm/acvm.d.ts +6 -1
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +7 -13
- package/dest/private/acvm/deserialize.d.ts +19 -18
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +31 -23
- package/dest/private/acvm/oracle/oracle.d.ts +36 -34
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/private/acvm/oracle/oracle.js +134 -79
- package/dest/private/acvm/oracle/typed_oracle.d.ts +3 -2
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/private/acvm/oracle/typed_oracle.js +5 -2
- package/dest/private/acvm/serialize.d.ts +11 -0
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +27 -0
- package/dest/private/execution_data_provider.d.ts +15 -13
- package/dest/private/execution_data_provider.d.ts.map +1 -1
- package/dest/private/private_execution.d.ts +2 -2
- package/dest/private/private_execution.d.ts.map +1 -1
- package/dest/private/private_execution.js +4 -5
- package/dest/private/private_execution_oracle.d.ts.map +1 -1
- package/dest/private/private_execution_oracle.js +1 -1
- package/dest/private/providers/acvm_native.d.ts +6 -4
- package/dest/private/providers/acvm_native.d.ts.map +1 -1
- package/dest/private/providers/acvm_native.js +6 -3
- package/dest/private/providers/acvm_wasm.d.ts +6 -7
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm.js +13 -15
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts +5 -5
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -1
- package/dest/private/providers/acvm_wasm_with_blobs.js +7 -9
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +90 -0
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -0
- package/dest/private/providers/circuit_recording/circuit_recorder.js +246 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts +18 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts.map +1 -0
- package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.js +39 -0
- package/dest/private/providers/simulation_provider.d.ts +21 -7
- package/dest/private/providers/simulation_provider.d.ts.map +1 -1
- package/dest/private/simulator.d.ts +3 -2
- package/dest/private/simulator.d.ts.map +1 -1
- package/dest/private/simulator.js +2 -2
- package/dest/private/unconstrained_execution.d.ts +2 -2
- package/dest/private/unconstrained_execution.d.ts.map +1 -1
- package/dest/private/unconstrained_execution.js +1 -2
- package/dest/private/unconstrained_execution_oracle.d.ts +5 -3
- package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -1
- package/dest/private/unconstrained_execution_oracle.js +9 -5
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +0 -2
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +5 -5
- package/dest/public/avm/fixtures/index.d.ts +4 -4
- package/dest/public/avm/fixtures/index.d.ts.map +1 -1
- package/dest/public/avm/fixtures/index.js +9 -6
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +1 -2
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -1
- package/dest/public/avm/fixtures/simple_contract_data_source.js +0 -3
- package/dest/public/avm/journal/journal.d.ts +16 -70
- package/dest/public/avm/journal/journal.d.ts.map +1 -1
- package/dest/public/avm/journal/journal.js +88 -210
- package/dest/public/avm/journal/nullifiers.d.ts +2 -2
- package/dest/public/avm/journal/nullifiers.d.ts.map +1 -1
- package/dest/public/avm/journal/public_storage.d.ts +2 -2
- package/dest/public/avm/journal/public_storage.d.ts.map +1 -1
- package/dest/public/avm/test_utils.d.ts +10 -13
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +8 -13
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +3 -3
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +10 -9
- package/dest/public/hinting_db_sources.d.ts +19 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -0
- package/dest/public/hinting_db_sources.js +36 -0
- package/dest/public/public_db_sources.d.ts +46 -22
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +82 -27
- package/dest/public/public_processor/public_processor.d.ts +5 -5
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +21 -20
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +9 -14
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +15 -19
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +9 -6
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +28 -14
- package/dest/public/side_effect_trace.d.ts +6 -22
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +11 -70
- package/dest/public/side_effect_trace_interface.d.ts +5 -19
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/testing.d.ts +2 -0
- package/dest/testing.d.ts.map +1 -0
- package/dest/testing.js +1 -0
- package/package.json +15 -14
- package/src/common/db_interfaces.ts +32 -18
- package/src/common/debug_fn_name.ts +2 -2
- package/src/common/message_load_oracle_inputs.ts +8 -0
- package/src/private/acvm/acvm.ts +8 -24
- package/src/private/acvm/deserialize.ts +35 -29
- package/src/private/acvm/oracle/oracle.ts +171 -129
- package/src/private/acvm/oracle/typed_oracle.ts +7 -3
- package/src/private/acvm/serialize.ts +28 -0
- package/src/private/execution_data_provider.ts +19 -14
- package/src/private/private_execution.ts +11 -7
- package/src/private/private_execution_oracle.ts +5 -1
- package/src/private/providers/acvm_native.ts +17 -6
- package/src/private/providers/acvm_wasm.ts +27 -20
- package/src/private/providers/acvm_wasm_with_blobs.ts +15 -12
- package/src/private/providers/circuit_recording/circuit_recorder.ts +283 -0
- package/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +82 -0
- package/src/private/providers/simulation_provider.ts +30 -5
- package/src/private/simulator.ts +5 -3
- package/src/private/unconstrained_execution.ts +8 -4
- package/src/private/unconstrained_execution_oracle.ts +15 -9
- package/src/public/avm/avm_simulator.ts +0 -2
- package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -5
- package/src/public/avm/fixtures/index.ts +16 -10
- package/src/public/avm/fixtures/simple_contract_data_source.ts +1 -10
- package/src/public/avm/journal/journal.ts +119 -353
- package/src/public/avm/journal/nullifiers.ts +2 -2
- package/src/public/avm/journal/public_storage.ts +2 -2
- package/src/public/avm/test_utils.ts +20 -29
- package/src/public/fixtures/public_tx_simulation_tester.ts +9 -12
- package/src/public/hinting_db_sources.ts +71 -0
- package/src/public/public_db_sources.ts +134 -32
- package/src/public/public_processor/public_processor.ts +22 -21
- package/src/public/public_tx_simulator/public_tx_context.ts +30 -38
- package/src/public/public_tx_simulator/public_tx_simulator.ts +47 -17
- package/src/public/side_effect_trace.ts +8 -172
- package/src/public/side_effect_trace_interface.ts +4 -55
- package/src/testing.ts +1 -0
- package/dest/public/avm/bytecode_utils.d.ts +0 -5
- package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/public/avm/bytecode_utils.js +0 -17
- 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 {
|
|
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(
|
|
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(
|
|
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
|
|
51
|
+
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(Fr.fromString(pkMHash));
|
|
52
52
|
|
|
53
|
-
return
|
|
53
|
+
return keyValidationRequest.toFields().map(toACVMField);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
async getContractInstance([address]: ACVMField[]) {
|
|
57
|
-
const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(
|
|
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 =
|
|
74
|
-
const parsedTreeId =
|
|
75
|
-
const parsedLeafValue =
|
|
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 =
|
|
91
|
-
const parsedNullifier =
|
|
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.
|
|
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 =
|
|
105
|
-
const parsedNullifier =
|
|
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.
|
|
113
|
+
return witness.toNoirRepresentation();
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
async
|
|
117
|
-
|
|
118
|
-
|
|
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.
|
|
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.
|
|
127
|
+
return witness.toNoirRepresentation();
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
async getBlockHeader([blockNumber]: ACVMField[]): Promise<ACVMField[]> {
|
|
128
|
-
const parsedBlockNumber =
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
224
|
-
NoteSelector.fromField(
|
|
225
|
-
note.map(
|
|
226
|
-
|
|
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
|
|
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(
|
|
238
|
-
return
|
|
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(
|
|
243
|
-
return
|
|
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(
|
|
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
|
-
|
|
259
|
-
|
|
261
|
+
Fr.fromString(messageHash),
|
|
262
|
+
Fr.fromString(secret),
|
|
260
263
|
);
|
|
261
|
-
return message.
|
|
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(
|
|
272
|
-
|
|
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(
|
|
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(
|
|
285
|
-
|
|
286
|
-
|
|
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[]):
|
|
292
|
-
const messageStr = message.map(acvmField => String.fromCharCode(
|
|
293
|
-
const fieldsFr = fields.map(
|
|
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(
|
|
306
|
-
FunctionSelector.fromField(
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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(
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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(
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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(
|
|
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
|
-
|
|
388
|
-
|
|
399
|
+
Fr.fromString(storageSlot),
|
|
400
|
+
Fr.fromString(nonce),
|
|
389
401
|
fromBoundedVec(content, contentLength),
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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(
|
|
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(
|
|
412
|
-
|
|
413
|
-
capsule.map(
|
|
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(
|
|
424
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
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
|
-
|
|
91
|
-
return Promise.reject(new OracleMethodNotAvailableError('
|
|
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
|
+
}
|