anvil_polkadot/api_server/
mod.rs1use 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}