openzeppelin_relayer/models/transaction/request/
mod.rs

1pub mod evm;
2pub mod solana;
3pub mod stellar;
4
5use crate::models::rpc::{
6    SolanaFeeEstimateRequestParams, SolanaPrepareTransactionRequestParams,
7    StellarFeeEstimateRequestParams, StellarPrepareTransactionRequestParams,
8};
9use crate::models::{ApiError, NetworkType, RelayerRepoModel};
10use serde::{Deserialize, Serialize};
11
12pub use evm::EvmTransactionRequest;
13pub use solana::SolanaTransactionRequest;
14pub use stellar::StellarTransactionRequest;
15use utoipa::ToSchema;
16
17#[derive(Serialize, ToSchema)]
18#[serde(untagged)]
19pub enum NetworkTransactionRequest {
20    Evm(EvmTransactionRequest),
21    Solana(SolanaTransactionRequest),
22    Stellar(StellarTransactionRequest),
23}
24
25impl NetworkTransactionRequest {
26    pub fn from_json(
27        network_type: &NetworkType,
28        json: serde_json::Value,
29    ) -> Result<Self, ApiError> {
30        match network_type {
31            NetworkType::Evm => Ok(Self::Evm(
32                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
33            )),
34            NetworkType::Solana => Ok(Self::Solana(
35                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
36            )),
37            NetworkType::Stellar => Ok(Self::Stellar(
38                serde_json::from_value(json).map_err(|e| ApiError::BadRequest(e.to_string()))?,
39            )),
40        }
41    }
42
43    pub fn validate(&self, relayer: &RelayerRepoModel) -> Result<(), ApiError> {
44        match self {
45            NetworkTransactionRequest::Evm(request) => request.validate(relayer),
46            NetworkTransactionRequest::Stellar(request) => request.validate(),
47            NetworkTransactionRequest::Solana(request) => request.validate(relayer),
48        }
49    }
50}
51
52/// Network-agnostic fee estimate request parameters for gasless transactions.
53/// Contains network-specific request parameters for fee estimation.
54/// The network type is inferred from the relayer's network configuration.
55///
56/// For Stellar, supports both classic and Soroban gas abstraction:
57/// - Classic: Pass operations or transaction_xdr with classic fee token (native/USDC:GA...)
58/// - Soroban: Pass transaction_xdr containing InvokeHostFunction, user_address, and contract fee token (C...)
59#[derive(Debug, Deserialize, Serialize, PartialEq, ToSchema, Clone)]
60#[serde(untagged)]
61#[schema(as = SponsoredTransactionQuoteRequest)]
62pub enum SponsoredTransactionQuoteRequest {
63    /// Solana-specific fee estimate request parameters
64    Solana(SolanaFeeEstimateRequestParams),
65    /// Stellar-specific fee estimate request parameters (classic and Soroban)
66    Stellar(StellarFeeEstimateRequestParams),
67}
68
69impl SponsoredTransactionQuoteRequest {
70    pub fn validate(&self) -> Result<(), ApiError> {
71        match self {
72            SponsoredTransactionQuoteRequest::Stellar(request) => request.validate(),
73            SponsoredTransactionQuoteRequest::Solana(_) => Ok(()),
74        }
75    }
76}
77
78/// Network-agnostic prepare transaction request parameters for gasless transactions.
79/// Contains network-specific request parameters for preparing transactions with fee payments.
80/// The network type is inferred from the relayer's network configuration.
81///
82/// For Stellar, supports both classic and Soroban gas abstraction:
83/// - Classic: Pass operations or transaction_xdr with classic fee token
84/// - Soroban: Pass transaction_xdr containing InvokeHostFunction, user_address, and contract fee token
85#[derive(Debug, Deserialize, Serialize, PartialEq, ToSchema, Clone)]
86#[serde(untagged)]
87#[schema(as = SponsoredTransactionBuildRequest)]
88pub enum SponsoredTransactionBuildRequest {
89    /// Solana-specific prepare transaction request parameters
90    Solana(SolanaPrepareTransactionRequestParams),
91    /// Stellar-specific prepare transaction request parameters (classic and Soroban)
92    Stellar(StellarPrepareTransactionRequestParams),
93}
94
95impl SponsoredTransactionBuildRequest {
96    pub fn validate(&self) -> Result<(), ApiError> {
97        match self {
98            SponsoredTransactionBuildRequest::Stellar(request) => request.validate(),
99            SponsoredTransactionBuildRequest::Solana(_) => Ok(()),
100        }
101    }
102}