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::{
20        NetworkRepoModel, NetworkType, RelayerError, RelayerRepoModel, SignerRepoModel,
21        SolanaNetwork, TransactionRepoModel,
22    },
23    repositories::{NetworkRepository, RelayerRepository, Repository, TransactionRepository},
24    services::{get_network_provider, JupiterService, SolanaSignerFactory},
25};
26
27/// Function to create a Solana relayer instance
28pub async fn create_solana_relayer<
29    J: JobProducerTrait + 'static,
30    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
31    NR: NetworkRepository + Repository<NetworkRepoModel, String> + Send + Sync + 'static,
32    RR: RelayerRepository + Repository<RelayerRepoModel, String> + Send + Sync + 'static,
33>(
34    relayer: RelayerRepoModel,
35    signer: SignerRepoModel,
36    relayer_repository: Arc<RR>,
37    network_repository: Arc<NR>,
38    transaction_repository: Arc<TR>,
39    job_producer: Arc<J>,
40) -> Result<DefaultSolanaRelayer<J, TR, RR, NR>, RelayerError> {
41    let network_repo = network_repository
42        .get_by_name(NetworkType::Solana, &relayer.network)
43        .await
44        .ok()
45        .flatten()
46        .ok_or_else(|| {
47            RelayerError::NetworkConfiguration(format!("Network {} not found", relayer.network))
48        })?;
49
50    let network = SolanaNetwork::try_from(network_repo.clone())?;
51    let provider = Arc::new(get_network_provider(
52        &network,
53        relayer.custom_rpc_urls.clone(),
54    )?);
55    let signer_service = Arc::new(SolanaSignerFactory::create_solana_signer(&signer.into())?);
56    let jupiter_service = Arc::new(JupiterService::new_from_network(relayer.network.as_str()));
57    let rpc_methods = SolanaRpcMethodsImpl::new(
58        relayer.clone(),
59        network_repo.clone(),
60        provider.clone(),
61        signer_service.clone(),
62        jupiter_service.clone(),
63        job_producer.clone(),
64        transaction_repository.clone(),
65    );
66    let rpc_handler = Arc::new(SolanaRpcHandler::new(rpc_methods));
67    let dex_service = create_network_dex_generic(
68        &relayer,
69        provider.clone(),
70        signer_service.clone(),
71        jupiter_service.clone(),
72    )?;
73
74    let relayer = DefaultSolanaRelayer::<J, TR, RR, NR>::new(
75        relayer,
76        signer_service,
77        relayer_repository,
78        network_repository,
79        provider,
80        rpc_handler,
81        transaction_repository,
82        job_producer,
83        Arc::new(dex_service),
84    )
85    .await?;
86
87    Ok(relayer)
88}