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        FeeEstimateRequestParams, FeeEstimateResult, GetFeaturesEnabledRequestParams,
52        GetFeaturesEnabledResult, GetSupportedTokensRequestParams, GetSupportedTokensResult,
53        PrepareTransactionRequestParams, PrepareTransactionResult,
54        SignAndSendTransactionRequestParams, SignAndSendTransactionResult,
55        SignTransactionRequestParams, SignTransactionResult, TransferTransactionRequestParams,
56        TransferTransactionResult,
57    },
58    services::{provider::SolanaProvider, signer::SolanaSigner, JupiterService},
59};
60
61#[cfg_attr(test, automock)]
62#[async_trait]
63pub trait SolanaRpcMethods: Send + Sync {
64    async fn fee_estimate(
65        &self,
66        request: FeeEstimateRequestParams,
67    ) -> Result<FeeEstimateResult, SolanaRpcError>;
68    async fn transfer_transaction(
69        &self,
70        request: TransferTransactionRequestParams,
71    ) -> Result<TransferTransactionResult, SolanaRpcError>;
72    async fn prepare_transaction(
73        &self,
74        request: PrepareTransactionRequestParams,
75    ) -> Result<PrepareTransactionResult, SolanaRpcError>;
76    async fn sign_transaction(
77        &self,
78        request: SignTransactionRequestParams,
79    ) -> Result<SignTransactionResult, SolanaRpcError>;
80    async fn sign_and_send_transaction(
81        &self,
82        request: SignAndSendTransactionRequestParams,
83    ) -> Result<SignAndSendTransactionResult, SolanaRpcError>;
84    async fn get_supported_tokens(
85        &self,
86        request: GetSupportedTokensRequestParams,
87    ) -> Result<GetSupportedTokensResult, SolanaRpcError>;
88    async fn get_features_enabled(
89        &self,
90        request: GetFeaturesEnabledRequestParams,
91    ) -> Result<GetFeaturesEnabledResult, SolanaRpcError>;
92}
93
94pub type DefaultProvider = SolanaProvider;
95pub type DefaultSigner = SolanaSigner;
96pub type DefaultJupiterService = JupiterService;
97pub type DefaultJobProducer = JobProducer;
98pub type DefaultTransactionRepository = TransactionRepositoryStorage;
99
100#[cfg(test)]
101impl
102    SolanaRpcMethodsImpl<
103        MockSolanaProviderTrait,
104        MockSolanaSignTrait,
105        MockJupiterServiceTrait,
106        MockJobProducerTrait,
107        MockTransactionRepository,
108    >
109{
110    pub fn new_mock(
111        relayer: RelayerRepoModel,
112        network: NetworkRepoModel,
113        provider: Arc<MockSolanaProviderTrait>,
114        signer: Arc<MockSolanaSignTrait>,
115        jupiter_service: Arc<MockJupiterServiceTrait>,
116        job_producer: Arc<MockJobProducerTrait>,
117        transaction_repository: Arc<MockTransactionRepository>,
118    ) -> Self {
119        Self {
120            relayer,
121            network,
122            provider,
123            signer,
124            jupiter_service,
125            job_producer,
126            transaction_repository,
127        }
128    }
129}
130
131pub struct SolanaRpcMethodsImpl<P, S, J, JP, TR>
132where
133    P: SolanaProviderTrait + Send + Sync + 'static,
134    S: SolanaSignTrait + Send + Sync + 'static,
135    J: JupiterServiceTrait + Send + Sync + 'static,
136    JP: JobProducerTrait + Send + Sync + 'static,
137    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
138{
139    pub(crate) relayer: RelayerRepoModel,
140    pub(crate) network: NetworkRepoModel,
141    pub(crate) provider: Arc<P>,
142    pub(crate) signer: Arc<S>,
143    pub(crate) jupiter_service: Arc<J>,
144    pub(crate) job_producer: Arc<JP>,
145    pub(crate) transaction_repository: Arc<TR>,
146}
147
148pub type DefaultSolanaRpcMethodsImpl = SolanaRpcMethodsImpl<
149    DefaultProvider,
150    DefaultSigner,
151    DefaultJupiterService,
152    DefaultJobProducer,
153    DefaultTransactionRepository,
154>;
155
156impl<P, S, J, JP, TR> SolanaRpcMethodsImpl<P, S, J, JP, TR>
157where
158    P: SolanaProviderTrait + Send + Sync + 'static,
159    S: SolanaSignTrait + Send + Sync + 'static,
160    J: JupiterServiceTrait + Send + Sync + 'static,
161    JP: JobProducerTrait + Send + Sync + 'static,
162    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
163{
164    pub fn new(
165        relayer: RelayerRepoModel,
166        network: NetworkRepoModel,
167        provider: Arc<P>,
168        signer: Arc<S>,
169        jupiter_service: Arc<J>,
170        job_producer: Arc<JP>,
171        transaction_repository: Arc<TR>,
172    ) -> Self {
173        Self {
174            relayer,
175            network,
176            provider,
177            signer,
178            jupiter_service,
179            job_producer,
180            transaction_repository,
181        }
182    }
183}
184
185#[async_trait]
186impl<P, S, J, JP, TR> SolanaRpcMethods for SolanaRpcMethodsImpl<P, S, J, JP, TR>
187where
188    P: SolanaProviderTrait + Send + Sync,
189    S: SolanaSignTrait + Send + Sync,
190    J: JupiterServiceTrait + Send + Sync,
191    JP: JobProducerTrait + Send + Sync,
192    TR: TransactionRepository + Repository<TransactionRepoModel, String> + Send + Sync + 'static,
193{
194    async fn fee_estimate(
195        &self,
196        params: FeeEstimateRequestParams,
197    ) -> Result<FeeEstimateResult, SolanaRpcError> {
198        self.fee_estimate_impl(params).await
199    }
200
201    async fn prepare_transaction(
202        &self,
203        params: PrepareTransactionRequestParams,
204    ) -> Result<PrepareTransactionResult, SolanaRpcError> {
205        self.prepare_transaction_impl(params).await
206    }
207
208    async fn sign_transaction(
209        &self,
210        params: SignTransactionRequestParams,
211    ) -> Result<SignTransactionResult, SolanaRpcError> {
212        self.sign_transaction_impl(params).await
213    }
214
215    async fn sign_and_send_transaction(
216        &self,
217        params: SignAndSendTransactionRequestParams,
218    ) -> Result<SignAndSendTransactionResult, SolanaRpcError> {
219        self.sign_and_send_transaction_impl(params).await
220    }
221
222    async fn transfer_transaction(
223        &self,
224        params: TransferTransactionRequestParams,
225    ) -> Result<TransferTransactionResult, SolanaRpcError> {
226        self.transfer_transaction_impl(params).await
227    }
228
229    async fn get_supported_tokens(
230        &self,
231        params: GetSupportedTokensRequestParams,
232    ) -> Result<GetSupportedTokensResult, SolanaRpcError> {
233        self.get_supported_tokens_impl(params).await
234    }
235
236    async fn get_features_enabled(
237        &self,
238        params: GetFeaturesEnabledRequestParams,
239    ) -> Result<GetFeaturesEnabledResult, SolanaRpcError> {
240        self.get_features_enabled_impl(params).await
241    }
242}