openzeppelin_relayer/domain/relayer/solana/rpc/methods/
mod.rs1mod 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 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}