1use ethers_core::types::{Bytes, H160, H256, U256, U64};
2use once_cell::sync::Lazy;
3use serde::{Deserialize, Serialize};
4use serde_repr::{Deserialize_repr, Serialize_repr};
5
6static NATIVE_TOKEN: Lazy<FeeToken> = Lazy::new(|| {
8 FeeToken(
9 "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
10 .parse()
11 .unwrap(),
12 )
13});
14
15#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
19pub struct FeeToken(H160);
20
21impl std::ops::Deref for FeeToken {
22 type Target = H160;
23
24 fn deref(&self) -> &Self::Target {
25 &self.0
26 }
27}
28
29impl Default for FeeToken {
30 fn default() -> Self {
31 *NATIVE_TOKEN
32 }
33}
34
35impl From<H160> for FeeToken {
36 fn from(token: H160) -> Self {
37 Self(token)
38 }
39}
40
41#[derive(Debug, Copy, Clone, Serialize_repr, Deserialize_repr, PartialEq, Eq)]
44#[repr(u8)]
45pub enum PaymentType {
46 Synchronous = 0,
50 AsyncGasTank = 1,
60 SyncGasTank = 2,
66 SyncPullFee = 3,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
77#[serde(rename_all = "camelCase")]
78pub struct ForwardRequest {
79 pub type_id: &'static str,
81 pub chain_id: usize,
83 pub target: H160,
85 pub data: Bytes,
87 pub fee_token: H160,
89 pub payment_type: usize, pub max_fee: U64,
93 pub gas: U64,
95 pub sponsor: H160,
97 pub sponsor_chain_id: usize,
100 pub nonce: usize,
103 pub enforce_sponsor_nonce: bool,
106 pub enforce_sponsor_nonce_ordering: Option<bool>,
109 pub sponsor_signature: ethers_core::types::Signature,
111}
112
113#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
115#[serde(rename_all = "camelCase")]
116pub struct RelayRequest {
117 pub dest: H160,
119 pub data: Bytes,
121 pub token: FeeToken,
123 pub relayer_fee: U64,
125}
126
127#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
129#[serde(rename_all = "camelCase")]
130pub struct EstimatedFeeRequest {
131 pub payment_token: FeeToken,
133 pub gas_limit: U64,
135 pub is_high_priority: bool,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
141#[serde(rename_all = "camelCase")]
142pub struct RelayResponse {
143 pub task_id: H256,
145}
146
147#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
149#[serde(rename_all = "camelCase")]
150pub(crate) struct EstimatedFeeResponse {
151 estimated_fee: String,
153}
154
155impl EstimatedFeeResponse {
156 pub(crate) fn estimated_fee(&self) -> usize {
157 self.estimated_fee.parse().unwrap()
158 }
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
163#[serde(rename_all = "camelCase")]
164pub(crate) struct RelayChainsResponse {
165 relays: Vec<String>,
167}
168
169impl RelayChainsResponse {
170 pub(crate) fn relays(&self) -> impl Iterator<Item = usize> + '_ {
171 self.relays.iter().map(|s| s.parse().unwrap())
172 }
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
177#[serde(rename_all = "camelCase")]
178pub struct TaskStatusResponse {
179 data: Vec<TransactionStatus>,
180}
181
182impl std::ops::Deref for TaskStatusResponse {
183 type Target = Vec<TransactionStatus>;
184
185 fn deref(&self) -> &Self::Target {
186 &self.data
187 }
188}
189
190impl IntoIterator for TaskStatusResponse {
191 type Item = TransactionStatus;
192
193 type IntoIter = <Vec<TransactionStatus> as IntoIterator>::IntoIter;
194
195 fn into_iter(self) -> Self::IntoIter {
196 self.data.into_iter()
197 }
198}
199
200#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
202#[serde(rename_all = "camelCase")]
203pub struct TransactionStatus {
204 pub service: String,
206 pub chain: String,
208 pub task_id: H256,
210 pub task_state: TaskState,
212 #[serde(rename = "created_at")]
214 pub created_at: String, pub last_check: Option<CheckOrDate>,
217 pub execution: Option<Execution>,
219 pub last_execution: String, }
222
223#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
225#[serde(rename_all = "camelCase")]
226pub struct Execution {
227 pub status: String,
229 pub transaction_hash: H256,
231 pub block_number: usize,
233 #[serde(rename = "created_at")]
235 pub created_at: String,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
240#[serde(untagged, rename_all = "camelCase")]
241pub enum CheckOrDate {
242 Date(String),
244 Check(Check),
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
250#[serde(rename_all = "camelCase")]
251pub struct Check {
252 pub task_state: TaskState,
254 pub message: Option<String>,
256 #[serde(rename = "created_at")]
258 pub created_at: Option<String>,
259}
260
261#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
263#[serde(rename_all = "camelCase")]
264pub struct Payload {
265 pub to: H160,
267 pub data: Bytes,
269 pub fee_data: FeeData,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
275#[serde(rename_all = "camelCase")]
276pub struct FeeData {
277 pub gas_price: U256,
279 pub max_fee_per_gas: U256,
281 pub max_priority_fee_per_gas: U256,
283}
284
285#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
287pub enum TaskState {
288 CheckPending,
290 ExecPending,
292 ExecSuccess,
294 ExecReverted,
296 WaitingForConfirmation,
298 Blacklisted,
300 Cancelled,
302 NotFound,
304}