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::{NetworkType, RelayerError, RelayerRepoModel, SignerRepoModel, SolanaNetwork},
20 repositories::{
21 InMemoryNetworkRepository, InMemoryRelayerRepository, InMemoryTransactionRepository,
22 RelayerRepositoryStorage,
23 },
24 services::{get_network_provider, JupiterService, SolanaSignerFactory},
25};
26
27pub 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}