@@ -5,7 +5,7 @@ use std::future::Future;
55use std:: sync:: Arc ;
66
77use katana_chain_spec:: ChainSpec ;
8- use katana_core:: backend:: storage:: Database ;
8+ use katana_core:: backend:: storage:: { Database , DatabaseRO , DatabaseRW } ;
99use katana_core:: utils:: get_current_timestamp;
1010use katana_gas_price_oracle:: GasPriceOracle ;
1111use katana_pool:: TransactionPool ;
@@ -24,7 +24,7 @@ use katana_provider::api::transaction::{
2424 ReceiptProvider , TransactionProvider , TransactionStatusProvider , TransactionsProviderExt ,
2525} ;
2626use katana_provider:: api:: ProviderError ;
27- use katana_provider:: BlockchainProvider ;
27+ use katana_provider:: { BlockchainProvider , ProviderFactory } ;
2828use katana_rpc_api:: error:: starknet:: {
2929 CompilationErrorData , PageSizeTooBigData , ProofLimitExceededData , StarknetApiError ,
3030} ;
@@ -77,24 +77,27 @@ pub type StarknetApiResult<T> = Result<T, StarknetApiError>;
7777/// [write](katana_rpc_api::starknet::StarknetWriteApi), and
7878/// [trace](katana_rpc_api::starknet::StarknetTraceApi) APIs.
7979#[ derive( Debug ) ]
80- pub struct StarknetApi < Pool , PP >
80+ pub struct StarknetApi < Pool , PP , S >
8181where
8282 Pool : TransactionPool ,
8383 PP : PendingBlockProvider ,
84+ S : ProviderFactory ,
8485{
85- inner : Arc < StarknetApiInner < Pool , PP > > ,
86+ inner : Arc < StarknetApiInner < Pool , PP , S > > ,
8687}
8788
8889#[ derive( Debug ) ]
89- struct StarknetApiInner < Pool , PP >
90+ struct StarknetApiInner < Pool , PP , S >
9091where
9192 Pool : TransactionPool ,
9293 PP : PendingBlockProvider ,
94+ S : ProviderFactory ,
9395{
9496 pool : Pool ,
9597 chain_spec : Arc < ChainSpec > ,
9698 gas_oracle : GasPriceOracle ,
9799 storage : BlockchainProvider < Box < dyn Database > > ,
100+ storage2 : S ,
98101 forked_client : Option < ForkedClient > ,
99102 task_spawner : TaskSpawner ,
100103 estimate_fee_permit : Permits ,
@@ -106,6 +109,7 @@ impl<Pool, PP> StarknetApi<Pool, PP>
106109where
107110 Pool : TransactionPool ,
108111 PP : PendingBlockProvider ,
112+ S : ProviderFactory ,
109113{
110114 pub fn pool ( & self ) -> & Pool {
111115 & self . inner . pool
@@ -115,6 +119,10 @@ where
115119 & self . inner . storage
116120 }
117121
122+ pub fn storage2 ( & self ) -> & S {
123+ & self . inner . storage
124+ }
125+
118126 pub fn forked_client ( & self ) -> Option < & ForkedClient > {
119127 self . inner . forked_client . as_ref ( )
120128 }
@@ -128,10 +136,13 @@ where
128136 }
129137}
130138
131- impl < Pool , PP > StarknetApi < Pool , PP >
139+ impl < Pool , PP , S > StarknetApi < Pool , PP , S >
132140where
133141 Pool : TransactionPool + ' static ,
134142 PP : PendingBlockProvider ,
143+ S : ProviderFactory ,
144+ <S as ProviderFactory >:: Provider : DatabaseRO ,
145+ <S as ProviderFactory >:: ProviderMut : DatabaseRW ,
135146{
136147 #[ allow( clippy:: too_many_arguments) ]
137148 pub fn new (
@@ -286,7 +297,7 @@ where
286297 }
287298
288299 pub fn state ( & self , block_id : & BlockIdOrTag ) -> StarknetApiResult < Box < dyn StateProvider > > {
289- let provider = & self . inner . storage ;
300+ let provider = self . inner . storage2 . provider ( ) ;
290301
291302 let state = match block_id {
292303 BlockIdOrTag :: PreConfirmed => {
@@ -309,7 +320,7 @@ where
309320 }
310321
311322 fn block_env_at ( & self , block_id : & BlockIdOrTag ) -> StarknetApiResult < BlockEnv > {
312- let provider = & self . inner . storage ;
323+ let provider = self . inner . storage2 . provider ( ) ;
313324
314325 let env = match block_id {
315326 BlockIdOrTag :: PreConfirmed => {
@@ -361,7 +372,7 @@ where
361372 }
362373
363374 fn block_hash_and_number ( & self ) -> StarknetApiResult < BlockHashAndNumberResponse > {
364- let provider = & self . inner . storage ;
375+ let provider = self . inner . storage2 . provider ( ) ;
365376 let hash = provider. latest_hash ( ) ?;
366377 let number = provider. latest_number ( ) ?;
367378 Ok ( BlockHashAndNumberResponse :: new ( hash, number) )
@@ -458,7 +469,7 @@ where
458469 pub async fn block_tx_count ( & self , block_id : BlockIdOrTag ) -> StarknetApiResult < u64 > {
459470 let count = self
460471 . on_io_blocking_task ( move |this| {
461- let provider = & this. inner . storage ;
472+ let provider = this. storage2 ( ) . provider ( ) ;
462473
463474 let block_id: BlockHashOrNumber = match block_id {
464475 BlockIdOrTag :: L1Accepted => return Ok ( None ) ,
@@ -494,7 +505,7 @@ where
494505
495506 async fn latest_block_number ( & self ) -> StarknetApiResult < BlockNumberResponse > {
496507 self . on_io_blocking_task ( move |this| {
497- let block_number = this. inner . storage . latest_number ( ) ?;
508+ let block_number = this. storage2 ( ) . provider ( ) . latest_number ( ) ?;
498509 Ok ( BlockNumberResponse { block_number } )
499510 } )
500511 . await ?
@@ -534,7 +545,7 @@ where
534545 let tx = if BlockIdOrTag :: PreConfirmed == block_id {
535546 this. inner . pending_block_provider . get_pending_transaction_by_index ( index) ?
536547 } else {
537- let provider = & this. inner . storage ;
548+ let provider = this. storage2 ( ) . provider ( ) ;
538549
539550 let block_num = provider
540551 . convert_block_id ( block_id) ?
@@ -590,7 +601,7 @@ where
590601 {
591602 StarknetApiResult :: Ok ( pending_receipt)
592603 } else {
593- let provider = & this. inner . storage ;
604+ let provider = this. storage2 ( ) . provider ( ) ;
594605 StarknetApiResult :: Ok ( ReceiptBuilder :: new ( hash, provider) . build ( ) ?)
595606 }
596607 } )
@@ -608,7 +619,7 @@ where
608619 async fn transaction_status ( & self , hash : TxHash ) -> StarknetApiResult < TxStatus > {
609620 let status = self
610621 . on_io_blocking_task ( move |this| {
611- let provider = & this. inner . storage ;
622+ let provider = this. storage2 ( ) . provider ( ) ;
612623 let status = provider. transaction_status ( hash) ?;
613624
614625 if let Some ( status) = status {
@@ -663,7 +674,7 @@ where
663674 ) -> StarknetApiResult < MaybePreConfirmedBlock > {
664675 let block = self
665676 . on_io_blocking_task ( move |this| {
666- let provider = & this. inner . storage ;
677+ let provider = this. storage2 ( ) . provider ( ) ;
667678
668679 if BlockIdOrTag :: PreConfirmed == block_id {
669680 if let Some ( block) =
@@ -700,7 +711,7 @@ where
700711 ) -> StarknetApiResult < GetBlockWithReceiptsResponse > {
701712 let block = self
702713 . on_io_blocking_task ( move |this| {
703- let provider = & this. inner . storage ;
714+ let provider = this. storage2 ( ) . provider ( ) ;
704715
705716 if BlockIdOrTag :: PreConfirmed == block_id {
706717 if let Some ( block) =
@@ -737,7 +748,7 @@ where
737748 ) -> StarknetApiResult < GetBlockWithTxHashesResponse > {
738749 let block = self
739750 . on_io_blocking_task ( move |this| {
740- let provider = & this. inner . storage ;
751+ let provider = this. storage2 ( ) . provider ( ) ;
741752
742753 if BlockIdOrTag :: PreConfirmed == block_id {
743754 if let Some ( block) =
@@ -771,7 +782,7 @@ where
771782 pub async fn state_update ( & self , block_id : BlockIdOrTag ) -> StarknetApiResult < StateUpdate > {
772783 let state_update = self
773784 . on_io_blocking_task ( move |this| {
774- let provider = & this. inner . storage ;
785+ let provider = this. storage2 ( ) . provider ( ) ;
775786
776787 let block_id = match block_id {
777788 BlockIdOrTag :: Number ( num) => BlockHashOrNumber :: Num ( num) ,
@@ -1125,7 +1136,7 @@ where
11251136 contracts_storage_keys : Option < Vec < ContractStorageKeys > > ,
11261137 ) -> StarknetApiResult < GetStorageProofResponse > {
11271138 self . on_io_blocking_task ( move |this| {
1128- let provider = & this. inner . storage ;
1139+ let provider = this. storage2 ( ) . provider ( ) ;
11291140
11301141 let Some ( block_num) = provider. convert_block_id ( block_id) ? else {
11311142 return Err ( StarknetApiError :: BlockNotFound ) ;
@@ -1213,14 +1224,17 @@ where
12131224// `StarknetApiExt` Implementations
12141225/////////////////////////////////////////////////////
12151226
1216- impl < Pool , PP > StarknetApi < Pool , PP >
1227+ impl < Pool , PP , S > StarknetApi < Pool , PP , S >
12171228where
12181229 Pool : TransactionPool + ' static ,
12191230 PP : PendingBlockProvider ,
1231+ S : ProviderFactory ,
1232+ <S as ProviderFactory >:: Provider : DatabaseRO ,
1233+ <S as ProviderFactory >:: ProviderMut : DatabaseRW ,
12201234{
12211235 async fn blocks ( & self , request : GetBlocksRequest ) -> StarknetApiResult < GetBlocksResponse > {
12221236 self . on_io_blocking_task ( move |this| {
1223- let provider = & this. inner . storage ;
1237+ let provider = this. storage2 ( ) . provider ( ) ;
12241238
12251239 // Parse continuation token to get starting point
12261240 let start_from = if let Some ( token_str) = request. result_page_request . continuation_token
@@ -1296,7 +1310,7 @@ where
12961310 request : GetTransactionsRequest ,
12971311 ) -> StarknetApiResult < GetTransactionsResponse > {
12981312 self . on_io_blocking_task ( move |this| {
1299- let provider = & this. inner . storage ;
1313+ let provider = this. storage2 ( ) . provider ( ) ;
13001314
13011315 // Resolve the starting point for this query.
13021316 let start_from = if let Some ( token_str) = request. result_page_request . continuation_token
@@ -1366,7 +1380,7 @@ where
13661380
13671381 async fn total_transactions ( & self ) -> StarknetApiResult < TxNumber > {
13681382 self . on_io_blocking_task ( move |this| {
1369- let provider = & this. inner . storage ;
1383+ let provider = this. storage2 ( ) . provider ( ) ;
13701384 let total = provider. total_transactions ( ) ? as TxNumber ;
13711385 Ok ( total)
13721386 } )
0 commit comments