1use color_eyre::{eyre::eyre, Result};
2use starknet::{
3 accounts::SingleOwnerAccount,
4 core::{
5 types::{BlockId, BlockTag, Felt, FunctionCall},
6 utils::get_selector_from_name,
7 },
8 providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider},
9 signers::LocalWallet,
10};
11use std::sync::Arc;
12
13pub type LocalWalletSignerMiddleware =
14 Arc<SingleOwnerAccount<Arc<JsonRpcClient<HttpTransport>>, LocalWallet>>;
15
16pub async fn call_contract<P>(
17 provider: Arc<P>,
18 address: Felt,
19 method: &str,
20 calldata: Vec<Felt>,
21) -> Result<Vec<Felt>>
22where
23 P: Provider + Sync + Send,
24{
25 let entry_point_selector = get_selector_from_name(method)
26 .map_err(|e| eyre!("Invalid selector for {}: {}", method, e))?;
27 let function_call = FunctionCall {
28 contract_address: address,
29 entry_point_selector,
30 calldata,
31 };
32 provider
33 .call(function_call, BlockId::Tag(BlockTag::Latest))
34 .await
35 .map_err(|e| eyre!("Provider error: {}", e))
36}