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