fuel_core/schema/
relayed_tx.rs

1use 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}