Skip to main content

blokli_client/api/v1/graphql/
tickets.rs

1use hex::ToHex;
2
3use super::{Uint64, schema};
4use crate::api::v1::TicketSelector;
5
6/// GraphQL subscription variables for the `ticketRedeemed` subscription.
7///
8/// At most one filter field should be set; all `None` matches every redemption.
9/// Constructed via the [`From<TicketSelector>`] impl.
10#[derive(cynic::QueryVariables, Default)]
11pub struct TicketRedeemedVariables {
12    pub channel_id: Option<cynic::Id>,
13    pub issuer_address: Option<cynic::Id>,
14    pub recipient_address: Option<cynic::Id>,
15}
16
17impl From<TicketSelector> for TicketRedeemedVariables {
18    fn from(value: TicketSelector) -> Self {
19        match value {
20            TicketSelector::ChannelId(channel_id) => TicketRedeemedVariables {
21                channel_id: Some(channel_id.encode_hex::<String>().into()),
22                ..Default::default()
23            },
24            TicketSelector::IssuerAddress(address) => TicketRedeemedVariables {
25                issuer_address: Some(address.encode_hex::<String>().into()),
26                ..Default::default()
27            },
28            TicketSelector::RecipientAddress(address) => TicketRedeemedVariables {
29                recipient_address: Some(address.encode_hex::<String>().into()),
30                ..Default::default()
31            },
32            TicketSelector::Any => TicketRedeemedVariables::default(),
33        }
34    }
35}
36
37/// cynic query fragment for the `ticketRedeemed` GraphQL subscription.
38///
39/// Use [`TicketRedeemedVariables`] to set optional filters before executing.
40#[derive(cynic::QueryFragment, Debug)]
41#[cynic(graphql_type = "SubscriptionRoot", variables = "TicketRedeemedVariables")]
42pub struct SubscribeTicketRedeemed {
43    #[arguments(channelId: $channel_id, issuerAddress: $issuer_address, recipientAddress: $recipient_address)]
44    pub ticket_redeemed: RedeemTicketDetails,
45}
46
47/// Details of a single on-chain ticket redemption event.
48///
49/// Returned as stream items by [`crate::api::BlokliSubscriptionClient::subscribe_ticket_redeemed`].
50/// The `epoch` and `index` fields identify which ticket was redeemed; `result` indicates
51/// whether the chain accepted or rejected it.
52#[derive(cynic::QueryFragment, Debug, Clone, PartialEq)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize))]
54pub struct RedeemTicketDetails {
55    /// Ticket issuer address encoded as a hex string.
56    pub issuer_address: String,
57    /// Ticket recipient address encoded as a hex string.
58    pub recipient_address: String,
59    /// Ticket epoch.
60    pub epoch: Uint64,
61    /// Ticket index within the channel epoch.
62    pub index: Uint64,
63    /// Redemption outcome reported by the chain.
64    pub result: RedemptionResult,
65}
66
67/// Outcome of an on-chain ticket redemption attempt.
68#[derive(cynic::Enum, Clone, Copy, Debug, PartialEq, Eq)]
69pub enum RedemptionResult {
70    #[cynic(rename = "REDEEMED")]
71    Redeemed,
72    #[cynic(rename = "REJECTED")]
73    Rejected,
74}