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;
15mod validations;
16
17#[cfg(test)]
18mod test_setup;
19#[cfg(test)]
20use mockall::automock;
21
22use std::sync::Arc;
23
24#[cfg(test)]
25pub use test_setup::*;
26pub use validations::*;
27
28use crate::{
29    jobs::{JobProducer, JobProducerTrait},
30    models::RelayerRepoModel,
31    services::{JupiterServiceTrait, SolanaProviderTrait, SolanaSignTrait},
32};
33
34use super::*;
35
36#[cfg(test)]
37use crate::jobs::MockJobProducerTrait;
38
39#[cfg(test)]
40use crate::services::{MockJupiterServiceTrait, MockSolanaProviderTrait, MockSolanaSignTrait};
41use async_trait::async_trait;
42
43use crate::{
44    models::{
45        FeeEstimateRequestParams, FeeEstimateResult, GetFeaturesEnabledRequestParams,
46        GetFeaturesEnabledResult, GetSupportedTokensRequestParams, GetSupportedTokensResult,
47        PrepareTransactionRequestParams, PrepareTransactionResult,
48        SignAndSendTransactionRequestParams, SignAndSendTransactionResult,
49        SignTransactionRequestParams, SignTransactionResult, TransferTransactionRequestParams,
50        TransferTransactionResult,
51    },
52    services::{JupiterService, SolanaProvider, SolanaSigner},
53};
54
55#[cfg_attr(test, automock)]
56#[async_trait]
57pub trait SolanaRpcMethods: Send + Sync {
58    async fn fee_estimate(
59        &self,
60        request: FeeEstimateRequestParams,
61    ) -> Result<FeeEstimateResult, SolanaRpcError>;
62    async fn transfer_transaction(
63        &self,
64        request: TransferTransactionRequestParams,
65    ) -> Result<TransferTransactionResult, SolanaRpcError>;
66    async fn prepare_transaction(
67        &self,
68        request: PrepareTransactionRequestParams,
69    ) -> Result<PrepareTransactionResult, SolanaRpcError>;
70    async fn sign_transaction(
71        &self,
72        request: SignTransactionRequestParams,
73    ) -> Result<SignTransactionResult, SolanaRpcError>;
74    async fn sign_and_send_transaction(
75        &self,
76        request: SignAndSendTransactionRequestParams,
77    ) -> Result<SignAndSendTransactionResult, SolanaRpcError>;
78    async fn get_supported_tokens(
79        &self,
80        request: GetSupportedTokensRequestParams,
81    ) -> Result<GetSupportedTokensResult, SolanaRpcError>;
82    async fn get_features_enabled(
83        &self,
84        request: GetFeaturesEnabledRequestParams,
85    ) -> Result<GetFeaturesEnabledResult, SolanaRpcError>;
86}
87
88pub type DefaultProvider = SolanaProvider;
89pub type DefaultSigner = SolanaSigner;
90pub type DefaultJupiterService = JupiterService;
91pub type DefaultJobProducer = JobProducer;
92
93#[cfg(test)]
94impl
95    SolanaRpcMethodsImpl<
96        MockSolanaProviderTrait,
97        MockSolanaSignTrait,
98        MockJupiterServiceTrait,
99        MockJobProducerTrait,
100    >
101{
102    pub fn new_mock(
103        relayer: RelayerRepoModel,
104        provider: Arc<MockSolanaProviderTrait>,
105        signer: Arc<MockSolanaSignTrait>,
106        jupiter_service: Arc<MockJupiterServiceTrait>,
107        job_producer: Arc<MockJobProducerTrait>,
108    ) -> Self {
109        Self {
110            relayer,
111            provider,
112            signer,
113            jupiter_service,
114            job_producer,
115        }
116    }
117}
118
119pub struct SolanaRpcMethodsImpl<P, S, J, JP>
120where
121    P: SolanaProviderTrait + Send + Sync + 'static,
122    S: SolanaSignTrait + Send + Sync + 'static,
123    J: JupiterServiceTrait + Send + Sync + 'static,
124    JP: JobProducerTrait + Send + Sync + 'static,
125{
126    pub(crate) relayer: RelayerRepoModel,
127    pub(crate) provider: Arc<P>,
128    pub(crate) signer: Arc<S>,
129    pub(crate) jupiter_service: Arc<J>,
130    pub(crate) job_producer: Arc<JP>,
131}
132
133pub type DefaultSolanaRpcMethodsImpl =
134    SolanaRpcMethodsImpl<DefaultProvider, DefaultSigner, DefaultJupiterService, DefaultJobProducer>;
135
136impl<P, S, J, JP> SolanaRpcMethodsImpl<P, S, J, JP>
137where
138    P: SolanaProviderTrait + Send + Sync + 'static,
139    S: SolanaSignTrait + Send + Sync + 'static,
140    J: JupiterServiceTrait + Send + Sync + 'static,
141    JP: JobProducerTrait + Send + Sync + 'static,
142{
143    pub fn new(
144        relayer: RelayerRepoModel,
145        provider: Arc<P>,
146        signer: Arc<S>,
147        jupiter_service: Arc<J>,
148        job_producer: Arc<JP>,
149    ) -> Self {
150        Self {
151            relayer,
152            provider,
153            signer,
154            jupiter_service,
155            job_producer,
156        }
157    }
158}
159
160#[async_trait]
161impl<P, S, J, JP> SolanaRpcMethods for SolanaRpcMethodsImpl<P, S, J, JP>
162where
163    P: SolanaProviderTrait + Send + Sync,
164    S: SolanaSignTrait + Send + Sync,
165    J: JupiterServiceTrait + Send + Sync,
166    JP: JobProducerTrait + Send + Sync,
167{
168    async fn fee_estimate(
169        &self,
170        params: FeeEstimateRequestParams,
171    ) -> Result<FeeEstimateResult, SolanaRpcError> {
172        self.fee_estimate_impl(params).await
173    }
174
175    async fn prepare_transaction(
176        &self,
177        params: PrepareTransactionRequestParams,
178    ) -> Result<PrepareTransactionResult, SolanaRpcError> {
179        self.prepare_transaction_impl(params).await
180    }
181
182    async fn sign_transaction(
183        &self,
184        params: SignTransactionRequestParams,
185    ) -> Result<SignTransactionResult, SolanaRpcError> {
186        self.sign_transaction_impl(params).await
187    }
188
189    async fn sign_and_send_transaction(
190        &self,
191        params: SignAndSendTransactionRequestParams,
192    ) -> Result<SignAndSendTransactionResult, SolanaRpcError> {
193        self.sign_and_send_transaction_impl(params).await
194    }
195
196    async fn transfer_transaction(
197        &self,
198        params: TransferTransactionRequestParams,
199    ) -> Result<TransferTransactionResult, SolanaRpcError> {
200        self.transfer_transaction_impl(params).await
201    }
202
203    async fn get_supported_tokens(
204        &self,
205        params: GetSupportedTokensRequestParams,
206    ) -> Result<GetSupportedTokensResult, SolanaRpcError> {
207        self.get_supported_tokens_impl(params).await
208    }
209
210    async fn get_features_enabled(
211        &self,
212        params: GetFeaturesEnabledRequestParams,
213    ) -> Result<GetFeaturesEnabledResult, SolanaRpcError> {
214        self.get_features_enabled_impl(params).await
215    }
216}