Skip to content

Commit f40dc53

Browse files
stefan-mystenDaughterOfMars
authored andcommitted
sui-graphql-client: use bcs from Checkpoint instead of manual conversion (#62)
1 parent 96823e9 commit f40dc53

File tree

2 files changed

+35
-104
lines changed

2 files changed

+35
-104
lines changed

crates/sui-graphql-client/src/lib.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2133,18 +2133,28 @@ mod tests {
21332133
chckp.unwrap_err()
21342134
);
21352135
let chckp_id = chckp.unwrap().unwrap();
2136-
let total_transaction_blocks = client.total_transaction_blocks_by_seq_num(chckp_id).await;
2137-
assert!(total_transaction_blocks.is_ok());
2138-
assert!(total_transaction_blocks.unwrap().is_some_and(|tx| tx > 0));
2139-
2140-
let chckp = client.checkpoint(None, Some(chckp_id)).await;
2141-
assert!(chckp.is_ok());
2142-
let digest = chckp.unwrap().unwrap().content_digest;
21432136
let total_transaction_blocks = client
2137+
.total_transaction_blocks_by_seq_num(chckp_id)
2138+
.await
2139+
.unwrap()
2140+
.unwrap();
2141+
assert!(total_transaction_blocks > 0);
2142+
2143+
let chckp = client
2144+
.checkpoint(None, Some(chckp_id))
2145+
.await
2146+
.unwrap()
2147+
.unwrap();
2148+
2149+
let digest = chckp.digest();
2150+
let total_transaction_blocks_by_digest = client
21442151
.total_transaction_blocks_by_digest(digest.into())
21452152
.await;
2146-
assert!(total_transaction_blocks.is_ok());
2147-
assert!(total_transaction_blocks.unwrap().is_some_and(|tx| tx > 0));
2153+
assert!(total_transaction_blocks_by_digest.is_ok());
2154+
assert_eq!(
2155+
total_transaction_blocks_by_digest.unwrap().unwrap(),
2156+
total_transaction_blocks
2157+
);
21482158
}
21492159

21502160
#[tokio::test]
Lines changed: 16 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
// Copyright (c) Mysten Labs, Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
use chrono::DateTime as ChronoDT;
5-
use sui_types::types::CheckpointContentsDigest;
6-
use sui_types::types::CheckpointDigest;
4+
use base64ct::Encoding;
75
use sui_types::types::CheckpointSummary;
8-
use sui_types::types::GasCostSummary as NativeGasCostSummary;
96

107
use crate::error;
118
use crate::error::Error;
129
use crate::error::Kind;
1310
use crate::query_types::schema;
1411
use crate::query_types::Base64;
15-
use crate::query_types::BigInt;
16-
use crate::query_types::DateTime;
17-
use crate::query_types::Epoch;
1812
use crate::query_types::PageInfo;
1913

2014
// ===========================================================================
@@ -84,99 +78,26 @@ pub struct CheckpointId {
8478
#[derive(cynic::QueryFragment, Debug)]
8579
#[cynic(schema = "rpc", graphql_type = "Checkpoint")]
8680
pub struct Checkpoint {
87-
pub epoch: Option<Epoch>,
88-
pub digest: String,
89-
pub network_total_transactions: Option<u64>,
90-
pub previous_checkpoint_digest: Option<String>,
91-
pub sequence_number: u64,
92-
pub timestamp: DateTime,
93-
pub validator_signatures: Base64,
94-
pub rolling_gas_summary: Option<GasCostSummary>,
95-
}
96-
97-
#[derive(cynic::QueryFragment, Debug)]
98-
#[cynic(schema = "rpc", graphql_type = "GasCostSummary")]
99-
pub struct GasCostSummary {
100-
pub computation_cost: Option<BigInt>,
101-
pub non_refundable_storage_fee: Option<BigInt>,
102-
pub storage_cost: Option<BigInt>,
103-
pub storage_rebate: Option<BigInt>,
81+
pub bcs: Option<Base64>,
10482
}
10583

106-
// TODO need bcs in GraphQL Checkpoint to avoid this conversion
10784
impl TryInto<CheckpointSummary> for Checkpoint {
10885
type Error = error::Error;
10986

110-
fn try_into(self) -> Result<CheckpointSummary, Self::Error> {
111-
let epoch = self
112-
.epoch
113-
.ok_or_else(|| {
114-
Error::from_error(Kind::Other, "Epoch is checkpoint summary is missing")
115-
})?
116-
.epoch_id;
117-
let network_total_transactions = self.network_total_transactions.ok_or_else(|| {
118-
Error::from_error(
119-
Kind::Other,
120-
"Network total transactions in checkpoint summary is missing",
121-
)
122-
})?;
123-
let sequence_number = self.sequence_number;
124-
let timestamp_ms = ChronoDT::parse_from_rfc3339(&self.timestamp.0)?
125-
.timestamp_millis()
126-
.try_into()?;
127-
let content_digest = CheckpointContentsDigest::from_base58(&self.digest)?;
128-
let previous_digest = self
129-
.previous_checkpoint_digest
130-
.map(|d| CheckpointDigest::from_base58(&d))
87+
fn try_into(self) -> Result<CheckpointSummary, Error> {
88+
let checkpoint = self
89+
.bcs
90+
.map(|x| base64ct::Base64::decode_vec(&x.0))
91+
.transpose()?
92+
.map(|bcs| {
93+
bcs::from_bytes::<CheckpointSummary>(&bcs).map_err(|e| {
94+
Error::from_error(
95+
Kind::Other,
96+
format!("Failed to deserialize checkpoint summary: {}", e),
97+
)
98+
})
99+
})
131100
.transpose()?;
132-
let epoch_rolling_gas_cost_summary = self
133-
.rolling_gas_summary
134-
.ok_or_else(|| {
135-
Error::from_error(
136-
Kind::Other,
137-
"Gas cost summary in checkpoint summary is missing",
138-
)
139-
})?
140-
.try_into()?;
141-
Ok(CheckpointSummary {
142-
epoch,
143-
sequence_number,
144-
network_total_transactions,
145-
timestamp_ms,
146-
content_digest,
147-
previous_digest,
148-
epoch_rolling_gas_cost_summary,
149-
checkpoint_commitments: vec![],
150-
end_of_epoch_data: None,
151-
version_specific_data: vec![],
152-
})
153-
}
154-
}
155-
156-
impl TryInto<NativeGasCostSummary> for GasCostSummary {
157-
type Error = error::Error;
158-
fn try_into(self) -> Result<NativeGasCostSummary, Self::Error> {
159-
let computation_cost = self
160-
.computation_cost
161-
.ok_or_else(|| Error::from_error(Kind::Other, "Computation cost is missing"))?
162-
.try_into()?;
163-
let non_refundable_storage_fee = self
164-
.non_refundable_storage_fee
165-
.ok_or_else(|| Error::from_error(Kind::Other, "Non-refundable storage fee is missing"))?
166-
.try_into()?;
167-
let storage_cost = self
168-
.storage_cost
169-
.ok_or_else(|| Error::from_error(Kind::Other, "Storage cost is missing"))?
170-
.try_into()?;
171-
let storage_rebate = self
172-
.storage_rebate
173-
.ok_or_else(|| Error::from_error(Kind::Other, "Storage rebate is missing"))?
174-
.try_into()?;
175-
Ok(NativeGasCostSummary {
176-
computation_cost,
177-
non_refundable_storage_fee,
178-
storage_cost,
179-
storage_rebate,
180-
})
101+
checkpoint.ok_or_else(|| Error::from_error(Kind::Other, "Checkpoint summary is missing"))
181102
}
182103
}

0 commit comments

Comments
 (0)