Skip to main content

builder_relayer_client_rust/
types.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)]
4pub enum RelayerTxType {
5    #[serde(rename = "SAFE")]
6    Safe,
7    #[serde(rename = "PROXY")]
8    Proxy,
9}
10
11#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
12pub enum TransactionType {
13    #[serde(rename = "SAFE")]
14    SAFE,
15    #[serde(rename = "SAFE-CREATE")]
16    SafeCreate,
17    #[serde(rename = "PROXY")]
18    Proxy,
19}
20
21#[derive(Clone, Debug, Serialize, Deserialize, Default)]
22pub struct SignatureParams {
23    #[serde(skip_serializing_if = "Option::is_none", rename = "gasPrice")]
24    pub gas_price: Option<String>,
25    #[serde(skip_serializing_if = "Option::is_none", rename = "relayerFee")]
26    pub relayer_fee: Option<String>,
27    #[serde(skip_serializing_if = "Option::is_none", rename = "gasLimit")]
28    pub gas_limit: Option<String>,
29    #[serde(skip_serializing_if = "Option::is_none", rename = "relayHub")]
30    pub relay_hub: Option<String>,
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub relay: Option<String>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub operation: Option<String>,
35    // Match TS SDK naming (safeTxnGas)
36    #[serde(skip_serializing_if = "Option::is_none", rename = "safeTxnGas")]
37    pub safe_txn_gas: Option<String>,
38    #[serde(skip_serializing_if = "Option::is_none", rename = "baseGas")]
39    pub base_gas: Option<String>,
40    #[serde(skip_serializing_if = "Option::is_none", rename = "gasToken")]
41    pub gas_token: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none", rename = "refundReceiver")]
43    pub refund_receiver: Option<String>,
44
45    // SAFE CREATE
46    #[serde(skip_serializing_if = "Option::is_none", rename = "paymentToken")]
47    pub payment_token: Option<String>,
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub payment: Option<String>,
50    #[serde(skip_serializing_if = "Option::is_none", rename = "paymentReceiver")]
51    pub payment_receiver: Option<String>,
52}
53
54#[derive(Clone, Debug, Serialize, Deserialize)]
55pub struct NoncePayload {
56    pub nonce: String,
57}
58
59#[derive(Clone, Debug, Serialize, Deserialize)]
60pub struct TransactionRequest {
61    pub r#type: TransactionType,
62    pub from: String,
63    pub to: String,
64    #[serde(skip_serializing_if = "Option::is_none", rename = "proxyWallet")]
65    pub proxy_wallet: Option<String>,
66    pub data: String,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub nonce: Option<String>,
69    pub signature: String,
70    #[serde(rename = "signatureParams")]
71    pub signature_params: SignatureParams,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub metadata: Option<String>,
74}
75
76#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
77pub enum CallType {
78    #[serde(rename = "0")]
79    Invalid = 0,
80    #[serde(rename = "1")]
81    Call = 1,
82    #[serde(rename = "2")]
83    DelegateCall = 2,
84}
85
86#[derive(Clone, Debug, Serialize, Deserialize)]
87pub struct ProxyTransaction {
88    #[serde(rename = "to")]
89    pub to: String,
90    #[serde(rename = "typeCode")]
91    pub type_code: CallType,
92    pub data: String,
93    pub value: String,
94}
95
96#[derive(Clone, Debug, Serialize, Deserialize)]
97pub struct Transaction {
98    pub to: String,
99    pub data: String,
100    pub value: String,
101}
102
103#[derive(Clone, Debug, Serialize, Deserialize)]
104pub struct ProxyTransactionArgs {
105    pub from: String,
106    pub nonce: String,
107    #[serde(rename = "gasPrice")]
108    pub gas_price: String,
109    #[serde(skip_serializing_if = "Option::is_none", rename = "gasLimit")]
110    pub gas_limit: Option<String>,
111    pub data: String,
112    pub relay: String,
113}
114
115#[derive(Clone, Debug, Serialize, Deserialize)]
116pub struct RelayPayload {
117    pub address: String,
118    pub nonce: String,
119}
120
121#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
122pub enum OperationType {
123    Call = 0,
124    DelegateCall = 1,
125}
126
127#[derive(Clone, Debug, Serialize, Deserialize)]
128pub struct SafeTransaction {
129    pub to: String,
130    pub operation: OperationType,
131    pub data: String,
132    pub value: String,
133}
134
135#[derive(Clone, Debug, Serialize, Deserialize)]
136pub struct SafeTransactionArgs {
137    pub from: String,
138    pub nonce: String,
139    pub chain_id: u64,
140    pub transactions: Vec<SafeTransaction>,
141    /// Optional: specify the actual Safe address instead of deriving it
142    /// If provided, this address will be used directly; otherwise it will be derived from `from`
143    #[serde(skip_serializing_if = "Option::is_none")]
144    pub safe_address: Option<String>,
145}
146
147#[derive(Clone, Debug, Serialize, Deserialize)]
148pub struct SafeCreateTransactionArgs {
149    pub from: String,
150    pub chain_id: u64,
151    pub payment_token: String,
152    pub payment: String,
153    pub payment_receiver: String,
154}
155
156#[derive(Clone, Debug, Serialize, Deserialize)]
157#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
158pub enum RelayerTransactionState {
159    #[serde(rename = "STATE_NEW")]
160    StateNew,
161    #[serde(rename = "STATE_EXECUTED")]
162    StateExecuted,
163    #[serde(rename = "STATE_MINED")]
164    StateMined,
165    #[serde(rename = "STATE_INVALID")]
166    StateInvalid,
167    #[serde(rename = "STATE_CONFIRMED")]
168    StateConfirmed,
169    #[serde(rename = "STATE_FAILED")]
170    StateFailed,
171}
172
173#[derive(Clone, Debug, Serialize, Deserialize)]
174pub struct RelayerTransaction {
175    pub transaction_id: String,
176    pub transaction_hash: String,
177    pub from: String,
178    pub to: String,
179    pub proxy_address: String,
180    pub data: String,
181    pub nonce: String,
182    pub value: String,
183    pub state: String,
184    pub r#type: String,
185    pub metadata: String,
186    pub created_at: String,
187    pub updated_at: String,
188}
189
190/// Error response from the relayer when a transaction fails
191#[derive(Clone, Debug, Serialize, Deserialize)]
192pub struct RelayerErrorResponse {
193    #[serde(default)]
194    pub error: String,
195    #[serde(default)]
196    pub message: String,
197    #[serde(default)]
198    pub reason: String,
199    #[serde(default)]
200    pub code: Option<i32>,
201}
202
203#[derive(Clone, Debug, Serialize, Deserialize)]
204pub struct RelayerTransactionResponse {
205    // Be flexible with field names across relayer versions
206    #[serde(
207        default,
208        rename = "transactionID",
209        alias = "transactionId",
210        alias = "transaction_id",
211        alias = "id"
212    )]
213    pub transaction_id: String,
214
215    #[serde(default, alias = "status", alias = "state")]
216    pub state: String,
217
218    // Some responses use `hash` or `txHash`; keep both `hash` and `transaction_hash`
219    #[serde(default, alias = "txHash", alias = "hash")]
220    pub hash: String,
221
222    #[serde(default, rename = "transactionHash", alias = "transaction_hash")]
223    pub transaction_hash: String,
224
225    // Error fields that may be present when the transaction fails
226    #[serde(default)]
227    pub error: Option<String>,
228    #[serde(default)]
229    pub message: Option<String>,
230    #[serde(default)]
231    pub reason: Option<String>,
232}
233
234#[derive(Clone, Debug, Serialize, Deserialize)]
235pub struct GetDeployedResponse {
236    pub deployed: bool,
237}