openzeppelin_relayer/domain/relayer/solana/
mod.rs

1/// Module for Solana relayer functionality
2mod solana_relayer;
3use std::sync::Arc;
4
5pub use solana_relayer::*;
6
7/// Module for Solana RPC functionality
8mod rpc;
9pub use rpc::*;
10
11mod dex;
12pub use dex::*;
13
14mod token;
15pub use token::*;
16
17use crate::{
18    jobs::JobProducerTrait,
19    models::{NetworkType, RelayerError, RelayerRepoModel, SignerRepoModel, SolanaNetwork},
20    repositories::{
21        InMemoryNetworkRepository, InMemoryRelayerRepository, InMemoryTransactionRepository,
22        RelayerRepositoryStorage,
23    },
24    services::{get_network_provider, JupiterService, SolanaSignerFactory},
25};
26
27/// Function to create a Solana relayer instance
28pub async fn create_solana_relayer<J: JobProducerTrait + 'static>(
29    relayer: RelayerRepoModel,
30    signer: SignerRepoModel,
31    relayer_repository: Arc<RelayerRepositoryStorage<InMemoryRelayerRepository>>,
32    network_repository: Arc<InMemoryNetworkRepository>,
33    transaction_repository: Arc<InMemoryTransactionRepository>,
34    job_producer: Arc<J>,
35) -> Result<DefaultSolanaRelayer<J>, RelayerError> {
36    let network_repo = network_repository
37        .get(NetworkType::Solana, &relayer.network)
38        .await
39        .ok()
40        .flatten()
41        .ok_or_else(|| {
42            RelayerError::NetworkConfiguration(format!("Network {} not found", relayer.network))
43        })?;
44
45    let network = SolanaNetwork::try_from(network_repo)?;
46    let provider = Arc::new(get_network_provider(
47        &network,
48        relayer.custom_rpc_urls.clone(),
49    )?);
50    let signer_service = Arc::new(SolanaSignerFactory::create_solana_signer(&signer)?);
51    let jupiter_service = Arc::new(JupiterService::new_from_network(relayer.network.as_str()));
52    let rpc_methods = SolanaRpcMethodsImpl::new(
53        relayer.clone(),
54        provider.clone(),
55        signer_service.clone(),
56        jupiter_service.clone(),
57        job_producer.clone(),
58    );
59    let rpc_handler = Arc::new(SolanaRpcHandler::new(rpc_methods));
60    let dex_service = create_network_dex_generic(
61        &relayer,
62        provider.clone(),
63        signer_service.clone(),
64        jupiter_service.clone(),
65    )?;
66
67    let relayer = DefaultSolanaRelayer::<J>::new(
68        relayer,
69        signer_service,
70        relayer_repository,
71        network_repository,
72        provider,
73        rpc_handler,
74        transaction_repository,
75        job_producer,
76        Arc::new(dex_service),
77    )
78    .await?;
79
80    Ok(relayer)
81}