1mod 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
26pub 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}