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;
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}