Skip to content

Commit 4870e47

Browse files
feat(starknet_gateway): state_reader_get_compiled_classes_from_class_manager
1 parent a001ab3 commit 4870e47

File tree

4 files changed

+70
-22
lines changed

4 files changed

+70
-22
lines changed

crates/starknet_gateway/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ papyrus_network_types = { workspace = true, features = ["testing"] }
4848
papyrus_test_utils.workspace = true
4949
pretty_assertions.workspace = true
5050
rstest.workspace = true
51+
starknet_class_manager_types = { workspace = true, features = ["testing"] }
5152
starknet_mempool.workspace = true
5253
starknet_mempool_types = { workspace = true, features = ["testing"] }
5354
starknet_state_sync_types = { workspace = true, features = ["testing"] }

crates/starknet_gateway/src/gateway.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,10 @@ pub fn create_gateway(
171171
mempool_client: SharedMempoolClient,
172172
class_manager_client: SharedClassManagerClient,
173173
) -> Gateway {
174-
let state_reader_factory = Arc::new(SyncStateReaderFactory { shared_state_sync_client });
174+
let state_reader_factory = Arc::new(SyncStateReaderFactory {
175+
shared_state_sync_client,
176+
class_manager_client: class_manager_client.clone(),
177+
});
175178

176179
let transaction_converter =
177180
TransactionConverter::new(class_manager_client, config.chain_info.chain_id.clone());

crates/starknet_gateway/src/sync_state_reader.rs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ use starknet_api::contract_class::ContractClass;
77
use starknet_api::core::{ClassHash, CompiledClassHash, ContractAddress, Nonce};
88
use starknet_api::data_availability::L1DataAvailabilityMode;
99
use starknet_api::state::StorageKey;
10+
use starknet_class_manager_types::{
11+
ClassManagerClientError,
12+
ClassManagerError,
13+
ClassStorageError,
14+
SharedClassManagerClient,
15+
};
1016
use starknet_state_sync_types::communication::{
1117
SharedStateSyncClient,
1218
StateSyncClientError,
@@ -20,14 +26,16 @@ use crate::state_reader::{MempoolStateReader, StateReaderFactory};
2026
pub(crate) struct SyncStateReader {
2127
block_number: BlockNumber,
2228
state_sync_client: SharedStateSyncClient,
29+
class_manager_client: SharedClassManagerClient,
2330
}
2431

2532
impl SyncStateReader {
2633
pub fn from_number(
2734
state_sync_client: SharedStateSyncClient,
35+
class_manager_client: SharedClassManagerClient,
2836
block_number: BlockNumber,
2937
) -> Self {
30-
Self { block_number, state_sync_client }
38+
Self { block_number, state_sync_client, class_manager_client }
3139
}
3240
}
3341

@@ -99,10 +107,19 @@ impl BlockifierStateReader for SyncStateReader {
99107
}
100108

101109
fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult<RunnableCompiledClass> {
102-
let contract_class = block_on(
103-
self.state_sync_client.get_compiled_class_deprecated(self.block_number, class_hash),
104-
)
105-
.map_err(|e| StateError::StateReadError(e.to_string()))?;
110+
let res = block_on(self.class_manager_client.get_executable(class_hash));
111+
112+
let contract_class = match res {
113+
Ok(value) => value,
114+
// TODO(noamsp): Remove this once the class manager component is ready.
115+
Err(ClassManagerClientError::ClassManagerError(
116+
ClassManagerError::ClassStorageError(ClassStorageError::ClassNotFound { .. }),
117+
)) => block_on(
118+
self.state_sync_client.get_compiled_class_deprecated(self.block_number, class_hash),
119+
)
120+
.map_err(|e| StateError::StateReadError(e.to_string()))?,
121+
Err(e) => return Err(StateError::StateReadError(e.to_string())),
122+
};
106123

107124
match contract_class {
108125
ContractClass::V1(casm_contract_class) => {
@@ -134,6 +151,7 @@ impl BlockifierStateReader for SyncStateReader {
134151

135152
pub struct SyncStateReaderFactory {
136153
pub shared_state_sync_client: SharedStateSyncClient,
154+
pub class_manager_client: SharedClassManagerClient,
137155
}
138156

139157
impl StateReaderFactory for SyncStateReaderFactory {
@@ -146,11 +164,16 @@ impl StateReaderFactory for SyncStateReaderFactory {
146164

147165
Ok(Box::new(SyncStateReader::from_number(
148166
self.shared_state_sync_client.clone(),
167+
self.class_manager_client.clone(),
149168
latest_block_number,
150169
)))
151170
}
152171

153172
fn get_state_reader(&self, block_number: BlockNumber) -> Box<dyn MempoolStateReader> {
154-
Box::new(SyncStateReader::from_number(self.shared_state_sync_client.clone(), block_number))
173+
Box::new(SyncStateReader::from_number(
174+
self.shared_state_sync_client.clone(),
175+
self.class_manager_client.clone(),
176+
block_number,
177+
))
155178
}
156179
}

crates/starknet_gateway/src/sync_state_reader_test.rs

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use starknet_api::contract_class::{ContractClass, SierraVersion};
1919
use starknet_api::core::SequencerContractAddress;
2020
use starknet_api::data_availability::L1DataAvailabilityMode;
2121
use starknet_api::{class_hash, contract_address, felt, nonce, storage_key};
22+
use starknet_class_manager_types::MockClassManagerClient;
2223
use starknet_state_sync_types::communication::MockStateSyncClient;
2324
use starknet_state_sync_types::state_sync_types::SyncBlock;
2425

@@ -27,6 +28,7 @@ use crate::sync_state_reader::SyncStateReader;
2728
#[tokio::test]
2829
async fn test_get_block_info() {
2930
let mut mock_state_sync_client = MockStateSyncClient::new();
31+
let mock_class_manager_client = MockClassManagerClient::new();
3032
let block_number = BlockNumber(1);
3133
let block_timestamp = BlockTimestamp(2);
3234
let sequencer_address = contract_address!("0x3");
@@ -55,8 +57,11 @@ async fn test_get_block_info() {
5557
},
5658
);
5759

58-
let state_sync_reader =
59-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
60+
let state_sync_reader = SyncStateReader::from_number(
61+
Arc::new(mock_state_sync_client),
62+
Arc::new(mock_class_manager_client),
63+
block_number,
64+
);
6065
let result = state_sync_reader.get_block_info().unwrap();
6166

6267
assert_eq!(
@@ -92,6 +97,7 @@ async fn test_get_block_info() {
9297
#[tokio::test]
9398
async fn test_get_storage_at() {
9499
let mut mock_state_sync_client = MockStateSyncClient::new();
100+
let mock_class_manager_client = MockClassManagerClient::new();
95101
let block_number = BlockNumber(1);
96102
let contract_address = contract_address!("0x2");
97103
let storage_key = storage_key!("0x3");
@@ -106,8 +112,11 @@ async fn test_get_storage_at() {
106112
)
107113
.returning(move |_, _, _| Ok(value));
108114

109-
let state_sync_reader =
110-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
115+
let state_sync_reader = SyncStateReader::from_number(
116+
Arc::new(mock_state_sync_client),
117+
Arc::new(mock_class_manager_client),
118+
block_number,
119+
);
111120

112121
let result = state_sync_reader.get_storage_at(contract_address, storage_key).unwrap();
113122
assert_eq!(result, value);
@@ -116,6 +125,7 @@ async fn test_get_storage_at() {
116125
#[tokio::test]
117126
async fn test_get_nonce_at() {
118127
let mut mock_state_sync_client = MockStateSyncClient::new();
128+
let mock_class_manager_client = MockClassManagerClient::new();
119129
let block_number = BlockNumber(1);
120130
let contract_address = contract_address!("0x2");
121131
let expected_result = nonce!(0x3);
@@ -126,8 +136,11 @@ async fn test_get_nonce_at() {
126136
.with(predicate::eq(block_number), predicate::eq(contract_address))
127137
.returning(move |_, _| Ok(expected_result));
128138

129-
let state_sync_reader =
130-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
139+
let state_sync_reader = SyncStateReader::from_number(
140+
Arc::new(mock_state_sync_client),
141+
Arc::new(mock_class_manager_client),
142+
block_number,
143+
);
131144

132145
let result = state_sync_reader.get_nonce_at(contract_address).unwrap();
133146
assert_eq!(result, expected_result);
@@ -136,6 +149,7 @@ async fn test_get_nonce_at() {
136149
#[tokio::test]
137150
async fn test_get_class_hash_at() {
138151
let mut mock_state_sync_client = MockStateSyncClient::new();
152+
let mock_class_manager_client = MockClassManagerClient::new();
139153
let block_number = BlockNumber(1);
140154
let contract_address = contract_address!("0x2");
141155
let expected_result = class_hash!("0x3");
@@ -146,16 +160,20 @@ async fn test_get_class_hash_at() {
146160
.with(predicate::eq(block_number), predicate::eq(contract_address))
147161
.returning(move |_, _| Ok(expected_result));
148162

149-
let state_sync_reader =
150-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
163+
let state_sync_reader = SyncStateReader::from_number(
164+
Arc::new(mock_state_sync_client),
165+
Arc::new(mock_class_manager_client),
166+
block_number,
167+
);
151168

152169
let result = state_sync_reader.get_class_hash_at(contract_address).unwrap();
153170
assert_eq!(result, expected_result);
154171
}
155172

156173
#[tokio::test]
157174
async fn test_get_compiled_class() {
158-
let mut mock_state_sync_client = MockStateSyncClient::new();
175+
let mock_state_sync_client = MockStateSyncClient::new();
176+
let mut mock_class_manager_client = MockClassManagerClient::new();
159177
let block_number = BlockNumber(1);
160178
let class_hash = class_hash!("0x2");
161179
let casm_contract_class = CasmContractClass {
@@ -169,16 +187,19 @@ async fn test_get_compiled_class() {
169187
};
170188
let expected_result = casm_contract_class.clone();
171189

172-
mock_state_sync_client
173-
.expect_get_compiled_class_deprecated()
190+
mock_class_manager_client
191+
.expect_get_executable()
174192
.times(1)
175-
.with(predicate::eq(block_number), predicate::eq(class_hash))
176-
.returning(move |_, _| {
193+
.with(predicate::eq(class_hash))
194+
.returning(move |_| {
177195
Ok(ContractClass::V1((casm_contract_class.clone(), SierraVersion::default())))
178196
});
179197

180-
let state_sync_reader =
181-
SyncStateReader::from_number(Arc::new(mock_state_sync_client), block_number);
198+
let state_sync_reader = SyncStateReader::from_number(
199+
Arc::new(mock_state_sync_client),
200+
Arc::new(mock_class_manager_client),
201+
block_number,
202+
);
182203

183204
let result = state_sync_reader.get_compiled_class(class_hash).unwrap();
184205
assert_eq!(

0 commit comments

Comments
 (0)