Skip to main content

blokli_client/api/v1/graphql/
balances.rs

1use super::{InvalidAddressError, MissingFilterError, QueryFailedError, Token, Uint64, schema};
2use crate::{api::types::TokenValueString, errors::BlokliClientError};
3
4#[derive(cynic::QueryVariables)]
5pub struct BalanceVariables {
6    pub address: String,
7    pub token: Option<Token>,
8}
9
10#[derive(cynic::InputObject, Debug, Default, Clone)]
11#[cynic(graphql_type = "RedeemedStatsFilter")]
12pub struct RedeemedStatsFilter {
13    #[cynic(rename = "safeAddress")]
14    pub safe_address: Option<String>,
15    #[cynic(rename = "nodeAddress")]
16    pub node_address: Option<String>,
17}
18
19#[derive(cynic::QueryVariables, Default)]
20pub struct RedeemedStatsVariables {
21    pub filter: RedeemedStatsFilter,
22}
23
24#[derive(cynic::QueryFragment, Debug)]
25#[cynic(graphql_type = "QueryRoot", variables = "BalanceVariables")]
26pub struct QueryHoprBalance {
27    #[arguments(address: $address, token: $token)]
28    pub hopr_balance: HoprBalanceResult,
29}
30
31#[derive(cynic::QueryFragment, Debug)]
32#[cynic(graphql_type = "QueryRoot", variables = "BalanceVariables")]
33pub struct QueryNativeBalance {
34    #[arguments(address: $address)]
35    pub native_balance: NativeBalanceResult,
36}
37
38#[derive(cynic::InlineFragments, Debug)]
39pub enum HoprBalanceResult {
40    HoprBalance(HoprBalance),
41    InvalidAddressError(InvalidAddressError),
42    QueryFailedError(QueryFailedError),
43    #[cynic(fallback)]
44    Unknown,
45}
46
47impl From<HoprBalanceResult> for Result<HoprBalance, BlokliClientError> {
48    fn from(value: HoprBalanceResult) -> Self {
49        match value {
50            HoprBalanceResult::HoprBalance(balance) => Ok(balance),
51            HoprBalanceResult::InvalidAddressError(e) => Err(e.into()),
52            HoprBalanceResult::QueryFailedError(e) => Err(e.into()),
53            HoprBalanceResult::Unknown => Err(crate::errors::ErrorKind::NoData.into()),
54        }
55    }
56}
57
58/// HOPR token balance for an address.
59#[derive(cynic::QueryFragment, Debug, Clone, PartialEq, Eq)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize))]
61pub struct HoprBalance {
62    /// GraphQL concrete type name.
63    pub __typename: String,
64    /// Token balance encoded as a decimal string.
65    pub balance: TokenValueString,
66}
67
68#[derive(cynic::InlineFragments, Debug)]
69pub enum NativeBalanceResult {
70    NativeBalance(NativeBalance),
71    InvalidAddressError(InvalidAddressError),
72    QueryFailedError(QueryFailedError),
73    #[cynic(fallback)]
74    Unknown,
75}
76
77impl From<NativeBalanceResult> for Result<NativeBalance, BlokliClientError> {
78    fn from(value: NativeBalanceResult) -> Self {
79        match value {
80            NativeBalanceResult::NativeBalance(balance) => Ok(balance),
81            NativeBalanceResult::InvalidAddressError(e) => Err(e.into()),
82            NativeBalanceResult::QueryFailedError(e) => Err(e.into()),
83            NativeBalanceResult::Unknown => Err(crate::errors::ErrorKind::NoData.into()),
84        }
85    }
86}
87
88/// Native-chain balance for an address.
89#[derive(cynic::QueryFragment, Debug, Clone, PartialEq, Eq)]
90#[cfg_attr(feature = "serde", derive(serde::Serialize))]
91pub struct NativeBalance {
92    /// GraphQL concrete type name.
93    pub __typename: String,
94    /// Native balance encoded as a decimal string.
95    pub balance: TokenValueString,
96}
97
98/// HOPR token allowance configured for a safe.
99#[derive(cynic::QueryFragment, Debug, Clone, PartialEq, Eq)]
100#[cfg_attr(feature = "serde", derive(serde::Serialize))]
101pub struct SafeHoprAllowance {
102    /// GraphQL concrete type name.
103    pub __typename: String,
104    /// Allowance encoded as a decimal string.
105    pub allowance: TokenValueString,
106}
107
108#[derive(cynic::QueryFragment, Debug)]
109#[cynic(graphql_type = "QueryRoot", variables = "BalanceVariables")]
110pub struct QuerySafeAllowance {
111    #[arguments(address: $address)]
112    pub safe_hopr_allowance: SafeHoprAllowanceResult,
113}
114
115#[derive(cynic::InlineFragments, Debug)]
116pub enum SafeHoprAllowanceResult {
117    SafeHoprAllowance(SafeHoprAllowance),
118    InvalidAddressError(InvalidAddressError),
119    QueryFailedError(QueryFailedError),
120    #[cynic(fallback)]
121    Unknown,
122}
123
124impl From<SafeHoprAllowanceResult> for Result<SafeHoprAllowance, BlokliClientError> {
125    fn from(value: SafeHoprAllowanceResult) -> Self {
126        match value {
127            SafeHoprAllowanceResult::SafeHoprAllowance(allowance) => Ok(allowance),
128            SafeHoprAllowanceResult::InvalidAddressError(e) => Err(e.into()),
129            SafeHoprAllowanceResult::QueryFailedError(e) => Err(e.into()),
130            SafeHoprAllowanceResult::Unknown => Err(crate::errors::ErrorKind::NoData.into()),
131        }
132    }
133}
134
135/// Aggregate ticket redemption statistics.
136#[derive(cynic::QueryFragment, Debug, Clone, PartialEq, Eq)]
137#[cfg_attr(feature = "serde", derive(serde::Serialize))]
138pub struct RedeemedStats {
139    /// GraphQL concrete type name.
140    pub __typename: String,
141    /// Sum of accepted redemption amounts.
142    pub redeemed_amount: TokenValueString,
143    /// Count of accepted redemptions.
144    pub redemption_count: Uint64,
145    /// Sum of rejected redemption amounts.
146    pub rejected_amount: TokenValueString,
147    /// Count of rejected redemptions.
148    pub rejection_count: Uint64,
149}
150
151#[derive(cynic::QueryFragment, Debug)]
152#[cynic(graphql_type = "QueryRoot", variables = "RedeemedStatsVariables")]
153pub struct QueryRedeemedStats {
154    #[arguments(filter: $filter)]
155    #[cynic(rename = "ticketRedemptionStats")]
156    pub ticket_redemption_stats: RedeemedStatsResult,
157}
158
159#[derive(cynic::InlineFragments, Debug)]
160pub enum RedeemedStatsResult {
161    RedeemedStats(RedeemedStats),
162    MissingFilterError(MissingFilterError),
163    InvalidAddressError(InvalidAddressError),
164    QueryFailedError(QueryFailedError),
165    #[cynic(fallback)]
166    Unknown,
167}
168
169impl From<RedeemedStatsResult> for Result<RedeemedStats, BlokliClientError> {
170    fn from(value: RedeemedStatsResult) -> Self {
171        match value {
172            RedeemedStatsResult::RedeemedStats(stats) => Ok(stats),
173            RedeemedStatsResult::MissingFilterError(e) => Err(e.into()),
174            RedeemedStatsResult::InvalidAddressError(e) => Err(e.into()),
175            RedeemedStatsResult::QueryFailedError(e) => Err(e.into()),
176            RedeemedStatsResult::Unknown => Err(crate::errors::ErrorKind::NoData.into()),
177        }
178    }
179}