openzeppelin_relayer/domain/relayer/solana/
mod.rs1mod solana_relayer;
3use std::sync::Arc;
4
5pub use solana_relayer::*;
6
7mod 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
27pub 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}