fuel_core/schema/
relayed_tx.rs1use crate::{
2 fuel_core_graphql_api::query_costs,
3 schema::{
4 ReadViewProvider,
5 scalars::{
6 RelayedTransactionId,
7 U32,
8 },
9 },
10};
11use async_graphql::{
12 Context,
13 Object,
14 Union,
15};
16use fuel_core_types::{
17 entities::relayer::transaction::RelayedTransactionStatus as FuelRelayedTransactionStatus,
18 fuel_types::BlockHeight,
19};
20
21#[derive(Default)]
22pub struct RelayedTransactionQuery {}
23
24#[Object]
25impl RelayedTransactionQuery {
26 #[graphql(complexity = "query_costs().storage_read + child_complexity")]
27 async fn relayed_transaction_status(
28 &self,
29 ctx: &Context<'_>,
30 #[graphql(desc = "The id of the relayed tx")] id: RelayedTransactionId,
31 ) -> async_graphql::Result<Option<RelayedTransactionStatus>> {
32 let query = ctx.read_view()?;
33 let status = query.relayed_tx_status(id.0)?.map(|status| status.into());
34 Ok(status)
35 }
36}
37
38#[derive(Union, Debug)]
39pub enum RelayedTransactionStatus {
40 Failed(RelayedTransactionFailed),
41}
42
43#[derive(Debug)]
44pub struct RelayedTransactionFailed {
45 pub block_height: BlockHeight,
46 pub failure: String,
47}
48
49#[Object]
50impl RelayedTransactionFailed {
51 async fn block_height(&self) -> U32 {
52 let as_u32: u32 = self.block_height.into();
53 as_u32.into()
54 }
55
56 async fn failure(&self) -> String {
57 self.failure.clone()
58 }
59}
60
61impl From<FuelRelayedTransactionStatus> for RelayedTransactionStatus {
62 fn from(status: FuelRelayedTransactionStatus) -> Self {
63 match status {
64 FuelRelayedTransactionStatus::Failed {
65 block_height,
66 failure,
67 } => RelayedTransactionStatus::Failed(RelayedTransactionFailed {
68 block_height,
69 failure,
70 }),
71 }
72 }
73}