sui_gql_client/queries/
genesis_tx.rs1use af_sui_types::TransactionData;
2use graphql_extract::extract;
3
4use super::Error;
5use crate::{GraphQlClient, GraphQlResponseExt as _, scalars, schema};
6
7pub async fn query<C: GraphQlClient>(client: &C) -> Result<TransactionData, Error<C::Error>> {
8 let data = client
9 .query::<Query, _>(Variables { id: Some(0) })
10 .await
11 .map_err(Error::Client)?
12 .try_into_data()?;
13 extract!(data => {
14 epoch? {
15 transaction_blocks {
16 nodes[] {
17 bcs?
18 }
19 }
20 }
21 });
22 Ok(nodes
23 .into_iter()
24 .next()
25 .ok_or("No transactions in epoch")??
26 .into_inner())
27}
28
29#[derive(cynic::QueryVariables, Clone, Debug)]
30struct Variables {
31 id: Option<af_sui_types::Version>,
32}
33
34#[derive(cynic::QueryFragment, Clone, Debug)]
35#[cynic(graphql_type = "Query", variables = "Variables")]
36struct Query {
37 #[arguments(id: $id)]
38 epoch: Option<Epoch>,
39}
40
41#[derive(cynic::QueryFragment, Clone, Debug)]
42struct Epoch {
43 #[arguments(first: 1)]
44 transaction_blocks: TransactionBlockConnection,
45}
46
47#[derive(cynic::QueryFragment, Clone, Debug)]
48struct TransactionBlockConnection {
49 nodes: Vec<TransactionBlock>,
50}
51
52#[derive(cynic::QueryFragment, Clone, Debug)]
53struct TransactionBlock {
54 bcs: Option<scalars::Base64Bcs<TransactionData>>,
55}
56
57#[cfg(test)]
58#[allow(clippy::unwrap_used)]
59#[test]
60fn init_gql_output() {
61 use cynic::QueryBuilder as _;
62 let operation = Query::build(Variables { id: None });
63 insta::assert_snapshot!(operation.query, @r###"
64 query Query($id: UInt53) {
65 epoch(id: $id) {
66 transactionBlocks(first: 1) {
67 nodes {
68 bcs
69 }
70 }
71 }
72 }
73 "###);
74}