pallet_revive_eth_rpc/client/
storage_api.rs1use crate::{
19 subxt_client::{
20 self,
21 runtime_types::pallet_revive::storage::{AccountType, ContractInfo},
22 SrcChainConfig,
23 },
24 ClientError, H160,
25};
26use subxt::{storage::Storage, OnlineClient};
27
28#[derive(Clone)]
30pub struct StorageApi(Storage<SrcChainConfig, OnlineClient<SrcChainConfig>>);
31
32impl StorageApi {
33 pub fn new(api: Storage<SrcChainConfig, OnlineClient<SrcChainConfig>>) -> Self {
35 Self(api)
36 }
37
38 pub async fn get_contract_info(
40 &self,
41 contract_address: &H160,
42 ) -> Result<ContractInfo, ClientError> {
43 let contract_address: subxt::utils::H160 = contract_address.0.into();
45
46 let query = subxt_client::storage().revive().account_info_of(contract_address);
47 let Some(info) = self.0.fetch(&query).await? else {
48 return Err(ClientError::ContractNotFound);
49 };
50
51 let AccountType::Contract(contract_info) = info.account_type else {
52 return Err(ClientError::ContractNotFound);
53 };
54
55 Ok(contract_info)
56 }
57
58 pub async fn get_contract_trie_id(&self, address: &H160) -> Result<Vec<u8>, ClientError> {
60 let ContractInfo { trie_id, .. } = self.get_contract_info(address).await?;
61 Ok(trie_id.0)
62 }
63}