openzeppelin_relayer/domain/relayer/solana/rpc/methods/
mod.rs

1//! # Solana RPC Methods Module
2//!
3//! This module defines the `SolanaRpcMethods` trait which provides an asynchronous interface
4//! for various Solana-specific RPC operations. These operations include fee estimation,
5//! transaction processing (transfer, prepare, sign, and send), token retrieval, and feature
6//! queries.
7mod fee_estimate;
8mod get_features_enabled;
9mod get_supported_tokens;
10mod prepare_transaction;
11mod sign_and_send_transaction;
12mod sign_transaction;
13mod transfer_transaction;
14mod utils;
15
16#[cfg(test)]
17mod test_setup;
18#[cfg(test)]
19use mockall::automock;
20
21use std::sync::Arc;
22
23#[cfg(test)]
24pub use test_setup::*;
25
26// Re-export validation types from transaction domain module
27pub use crate::domain::transaction::solana::{
28    SolanaTransactionValidationError, SolanaTransactionValidator,
29};
30
31use crate::{
32    jobs::{JobProducer, JobProducerTrait},
33    models::{NetworkRepoModel, RelayerRepoModel, TransactionRepoModel},
34    repositories::{Repository, TransactionRepository, TransactionRepositoryStorage},
35    services::{provider::SolanaProviderTrait, signer::SolanaSignTrait, JupiterServiceTrait},
36};
37
38use super::*;
39
40#[cfg(test)]
41use crate::{jobs::MockJobProducerTrait, repositories::MockTransactionRepository};
42
43#[cfg(test)]
44use crate::services::{
45    provider::MockSolanaProviderTrait, signer::MockSolanaSignTrait, MockJupiterServiceTrait,
46};
47use async_trait::async_trait;
48
49use crate::{
50    models::{
51        SolanaFeeEstimateRequestParams, SolanaFeeEstimateResult,
52        SolanaGetFeaturesEnabledRequestParams, SolanaGetFeaturesEnabledResult,
53        SolanaGetSupportedTokensRequestParams, SolanaGetSupportedTokensResult,
54        SolanaPrepareTransactionRequestParams, SolanaPrepareTransactionResult,
55        SolanaSignAndSendTransactionRequestParams, SolanaSignAndSendTransactionResult,
56        SolanaSignTransactionRequestParams, SolanaSignTransactionResult,
57        SolanaTransferTransactionRequestParams, SolanaTransferTransactionResult,
58    },
59    services::{provider::SolanaProvider, signer::SolanaSigner, JupiterService},
60};
61
62#[cfg_attr(test, automock)]
63#[async_trait]
64pub trait SolanaRpcMethods: Send + Sync {
65    async fn fee_estimate(
66        &self,
67        request: SolanaFeeEstimateRequestParams,
68    ) -> Result<SolanaFeeEstimateResult, SolanaRpcError>;
69    async fn transfer_transaction(
70        &self,
71        request: SolanaTransferTransactionRequestParams,
72    ) -> Result<SolanaTransferTransactionResult, SolanaRpcError>;
73    async fn prepare_transaction(
74        &self,
75        request: SolanaPrepareTransactionRequestParams,
76    ) -> Result<SolanaPrepareTransactionResult, SolanaRpcError>;
77    async fn sign_transaction(
78        &self,
79        request: SolanaSignTransactionRequestParams,
80    ) -> Result<SolanaSignTransactionResult, SolanaRpcError>;
81    async fn sign_and_send_transaction(
82        &self,
83        request: SolanaSignAndSendTransactionRequestParams,
84    ) -> Result<SolanaSignAndSendTransactionResult, SolanaRpcError>;
85    async fn get_supported_tokens(
86        &self,
87        request: SolanaGetSupportedTokensRequestParams,
88    ) -> Result<SolanaGetSupportedTokensResult, SolanaRpcError>;
89    async fn get_features_enabled(
90        &self,
91        request: SolanaGetFeaturesEnabledRequestParams,
92    ) -> Result<SolanaGetFeaturesEnabledResult, SolanaRpcError>;
93}
94
95pub type DefaultProvider = SolanaProvider;
96pub type DefaultSigner = SolanaSigner;
97pub type DefaultJupiterService = JupiterService;
98pub type DefaultJobProducer = JobProducer;
99pub type DefaultTransactionRepository = TransactionRepositoryStorage;
100
101#[cfg(test)]
102impl
103    SolanaRpcMethodsImpl<
104        MockSolanaProviderTrait,
105        MockSolanaSignTrait,
106        MockJupiterServiceTrait,
107        MockJobProducerTrait,
108        MockTransactionRepository,
109    >
110{
111    pub fn new_mock(
112        relayer: RelayerRepoModel,
113        network: NetworkRepoModel,
114        provider: Arc<MockSolanaProviderTrait>,
115        signer: Arc<MockSolanaSignTrait>,
116        jupiter_service: Arc<MockJupiterServiceTrait>,
117        job_producer: Arc<MockJobProducerTrait>,
118        transaction_repository: Arc<MockTransactionRepository>,
119    ) -> Self {
120        Self {
121            relayer,
122            network,
123            provider,
124            signer,
125            jupiter_service,
126            job_producer,
127            transaction_repository,
128        }
129    }
130}
131
132pub struct SolanaRpcMethodsImpl<P, S, J, JP, TR>
133where
134    P: SolanaProviderTrait + Send + Sync + 'static,
135    S: SolanaSignTrait + Send + Sync + 'static,
136    J: JupiterServiceTrait + Send + Sync + 'static,
137    JP: JobProducerTrait + Send + Sync + 'static,
138    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
139{
140    pub(crate) relayer: RelayerRepoModel,
141    pub(crate) network: NetworkRepoModel,
142    pub(crate) provider: Arc<P>,
143    pub(crate) signer: Arc<S>,
144    pub(crate) jupiter_service: Arc<J>,
145    pub(crate) job_producer: Arc<JP>,
146    pub(crate) transaction_repository: Arc<TR>,
147}
148
149pub type DefaultSolanaRpcMethodsImpl = SolanaRpcMethodsImpl<
150    DefaultProvider,
151    DefaultSigner,
152    DefaultJupiterService,
153    DefaultJobProducer,
154    DefaultTransactionRepository,
155>;
156
157impl<P, S, J, JP, TR> SolanaRpcMethodsImpl<P, S, J, JP, TR>
158where
159    P: SolanaProviderTrait + Send + Sync + 'static,
160    S: SolanaSignTrait + Send + Sync + 'static,
161    J: JupiterServiceTrait + Send + Sync + 'static,
162    JP: JobProducerTrait + Send + Sync + 'static,
163    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
164{
165    pub fn new(
166        relayer: RelayerRepoModel,
167        network: NetworkRepoModel,
168        provider: Arc<P>,
169        signer: Arc<S>,
170        jupiter_service: Arc<J>,
171        job_producer: Arc<JP>,
172        transaction_repository: Arc<TR>,
173    ) -> Self {
174        Self {
175            relayer,
176            network,
177            provider,
178            signer,
179            jupiter_service,
180            job_producer,
181            transaction_repository,
182        }
183    }
184}
185
186#[async_trait]
187impl<P, S, J, JP, TR> SolanaRpcMethods for SolanaRpcMethodsImpl<P, S, J, JP, TR>
188where
189    P: SolanaProviderTrait + Send + Sync,
190    S: SolanaSignTrait + Send + Sync,
191    J: JupiterServiceTrait + Send + Sync,
192    JP: JobProducerTrait + Send + Sync,
193    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
194{
195    async fn fee_estimate(
196        &self,
197        params: SolanaFeeEstimateRequestParams,
198    ) -> Result<SolanaFeeEstimateResult, SolanaRpcError> {
199        self.fee_estimate_impl(params).await
200    }
201
202    async fn prepare_transaction(
203        &self,
204        params: SolanaPrepareTransactionRequestParams,
205    ) -> Result<SolanaPrepareTransactionResult, SolanaRpcError> {
206        self.prepare_transaction_impl(params).await
207    }
208
209    async fn sign_transaction(
210        &self,
211        params: SolanaSignTransactionRequestParams,
212    ) -> Result<SolanaSignTransactionResult, SolanaRpcError> {
213        self.sign_transaction_impl(params).await
214    }
215
216    async fn sign_and_send_transaction(
217        &self,
218        params: SolanaSignAndSendTransactionRequestParams,
219    ) -> Result<SolanaSignAndSendTransactionResult, SolanaRpcError> {
220        self.sign_and_send_transaction_impl(params).await
221    }
222
223    async fn transfer_transaction(
224        &self,
225        params: SolanaTransferTransactionRequestParams,
226    ) -> Result<SolanaTransferTransactionResult, SolanaRpcError> {
227        self.transfer_transaction_impl(params).await
228    }
229
230    async fn get_supported_tokens(
231        &self,
232        params: SolanaGetSupportedTokensRequestParams,
233    ) -> Result<SolanaGetSupportedTokensResult, SolanaRpcError> {
234        self.get_supported_tokens_impl(params).await
235    }
236
237    async fn get_features_enabled(
238        &self,
239        params: SolanaGetFeaturesEnabledRequestParams,
240    ) -> Result<SolanaGetFeaturesEnabledResult, SolanaRpcError> {
241        self.get_features_enabled_impl(params).await
242    }
243}