Skip to main content

anvil_polkadot/api_server/
mod.rs

1use crate::{
2    AnvilNodeConfig,
3    api_server::filters::Filters,
4    logging::LoggingManager,
5    substrate_node::{
6        impersonation::ImpersonationManager, revert::RevertManager, service::Service,
7    },
8};
9use anvil_core::eth::EthRequest;
10use anvil_rpc::response::ResponseResult;
11use futures::channel::{mpsc, oneshot};
12use server::ApiServer;
13use subxt_signer::eth::Keypair;
14
15pub mod error;
16pub mod filters;
17pub mod revive_conversions;
18mod server;
19mod signer;
20pub mod trace_helpers;
21mod txpool_helpers;
22
23pub use txpool_helpers::TxpoolTransactionInfo;
24
25pub type ApiHandle = mpsc::Sender<ApiRequest>;
26
27pub struct ApiRequest {
28    pub req: EthRequest,
29    pub resp_sender: oneshot::Sender<ResponseResult>,
30}
31
32pub fn spawn(
33    config: &AnvilNodeConfig,
34    substrate_service: &Service,
35    logging_manager: LoggingManager,
36    revert_manager: RevertManager,
37    filters: Filters,
38) -> ApiHandle {
39    let (api_handle, receiver) = mpsc::channel(100);
40
41    let service = substrate_service.clone();
42    let mut impersonation_manager = ImpersonationManager::default();
43    impersonation_manager.set_auto_impersonate_account(config.enable_auto_impersonate);
44    let mut signers = config.signer_accounts.clone();
45    signers.extend(config.genesis.iter().flat_map(|genesis| genesis.alloc.values()).filter_map(
46        |acc| {
47            let private_key = acc.private_key?;
48            Keypair::from_secret_key(*private_key).ok()
49        },
50    ));
51    let revive_rpc_block_limit = config.revive_rpc_block_limit;
52    substrate_service.spawn_handle.spawn("anvil-api-server", "anvil", async move {
53        let api_server = ApiServer::new(
54            service,
55            receiver,
56            logging_manager,
57            revert_manager,
58            impersonation_manager,
59            signers,
60            filters,
61            revive_rpc_block_limit,
62        )
63        .await
64        .unwrap_or_else(|err| panic!("Failed to spawn the API server: {err}"));
65        api_server.run().await;
66    });
67
68    api_handle
69}