From 87b74e43bbc9ca5e018d6d9a83cab5669e6eb4bc Mon Sep 17 00:00:00 2001 From: Yasir Date: Tue, 27 May 2025 10:05:02 +0300 Subject: [PATCH 1/4] feat: add upgrade info --- src/did/src/build.rs | 2 +- src/did/src/lib.rs | 1 + src/did/src/upgrade_info.rs | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 src/did/src/upgrade_info.rs diff --git a/src/did/src/build.rs b/src/did/src/build.rs index 4b939f66..1eebbe9e 100644 --- a/src/did/src/build.rs +++ b/src/did/src/build.rs @@ -2,7 +2,7 @@ use candid::CandidType; use serde::{Deserialize, Serialize}; /// Contains the build data. -#[derive(Debug, Clone, Serialize, Deserialize, CandidType)] +#[derive(Debug, Clone, Serialize, Deserialize, CandidType, Default)] pub struct BuildData { pub cargo_target_triple: String, pub cargo_features: String, diff --git a/src/did/src/lib.rs b/src/did/src/lib.rs index 40ae49bd..4a7a4da0 100644 --- a/src/did/src/lib.rs +++ b/src/did/src/lib.rs @@ -30,6 +30,7 @@ pub mod http; pub mod rpc; #[cfg(test)] mod test_utils; +pub mod upgrade_info; pub mod utils; pub use block::Block; diff --git a/src/did/src/upgrade_info.rs b/src/did/src/upgrade_info.rs new file mode 100644 index 00000000..71821042 --- /dev/null +++ b/src/did/src/upgrade_info.rs @@ -0,0 +1,30 @@ +use std::borrow::Cow; + +use candid::{CandidType, Decode, Encode}; +use ic_stable_structures::{Bound, Storable}; +use serde::Deserialize; + +use crate::build::BuildData; + +/// Historical information about the canister +#[derive(CandidType, Deserialize, Clone, Default, Debug)] +pub struct UpgradeInfo { + /// The build data of the canister + pub build_data: BuildData, + /// The timestamp of the deployment + pub deploy_ts: u64, + /// The last block number + pub last_block_number: u64, +} + +impl Storable for UpgradeInfo { + const BOUND: Bound = Bound::Unbounded; + + fn to_bytes(&self) -> std::borrow::Cow<[u8]> { + Cow::from(Encode!(&self).expect("Failed to encode UpgradeInfo")) + } + + fn from_bytes(bytes: Cow<[u8]>) -> Self { + Decode!(&bytes, UpgradeInfo).expect("Failed to decode UpgradeInfo") + } +} From 7a1e8c611941763c7dd77c1c5264fb5c11cfa684 Mon Sep 17 00:00:00 2001 From: Yasir Date: Tue, 27 May 2025 10:41:52 +0300 Subject: [PATCH 2/4] feat: add paginated upgrade info retrieval to EVM client --- src/did/src/upgrade_info.rs | 6 ++++++ src/evm-canister-client/src/client.rs | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/did/src/upgrade_info.rs b/src/did/src/upgrade_info.rs index 71821042..f2df3bfe 100644 --- a/src/did/src/upgrade_info.rs +++ b/src/did/src/upgrade_info.rs @@ -28,3 +28,9 @@ impl Storable for UpgradeInfo { Decode!(&bytes, UpgradeInfo).expect("Failed to decode UpgradeInfo") } } + +#[derive(CandidType, Deserialize, Clone, Debug)] +pub struct PaginatedUpgradeInfo { + pub info: Vec, + pub total_count: u64, +} diff --git a/src/evm-canister-client/src/client.rs b/src/evm-canister-client/src/client.rs index 8e9b2eb6..f13c312c 100644 --- a/src/evm-canister-client/src/client.rs +++ b/src/evm-canister-client/src/client.rs @@ -9,6 +9,7 @@ use did::send_raw_transaction::SendRawTransactionRequest; use did::state::BasicAccount; use did::transaction::StorableExecutionResult; use did::unsafe_blocks::ValidateUnsafeBlockArgs; +use did::upgrade_info::PaginatedUpgradeInfo; use did::{ Block, BlockConfirmationData, BlockConfirmationResult, BlockConfirmationStrategy, BlockNumber, BlockchainBlockInfo, BlockchainStorageLimits, Bytes, EstimateGasRequest, EvmStats, FeeHistory, @@ -926,4 +927,15 @@ impl EvmCanisterClient { pub async fn get_blockchain_block_info(&self) -> CanisterClientResult { self.client.query("get_blockchain_block_info", ()).await } + + /// Returns the upgrade info paginated by count and offset + pub async fn get_upgrade_info_paginated( + &self, + count: u64, + offset: usize, + ) -> CanisterClientResult { + self.client + .query("get_upgrade_info_paginated", (count, offset)) + .await + } } From 14bbfab8dbbd9518f0ed09eece88dbba8d39d3b0 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Wed, 4 Jun 2025 11:35:35 +0300 Subject: [PATCH 3/4] refactor: remove Default trait from BuildData and UpgradeInfo structs; update EVM client to use UpgradeInfo directly --- src/did/src/build.rs | 2 +- src/did/src/upgrade_info.rs | 8 +------- src/evm-canister-client/src/client.rs | 12 ++++-------- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/did/src/build.rs b/src/did/src/build.rs index 1eebbe9e..4b939f66 100644 --- a/src/did/src/build.rs +++ b/src/did/src/build.rs @@ -2,7 +2,7 @@ use candid::CandidType; use serde::{Deserialize, Serialize}; /// Contains the build data. -#[derive(Debug, Clone, Serialize, Deserialize, CandidType, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, CandidType)] pub struct BuildData { pub cargo_target_triple: String, pub cargo_features: String, diff --git a/src/did/src/upgrade_info.rs b/src/did/src/upgrade_info.rs index f2df3bfe..5390299d 100644 --- a/src/did/src/upgrade_info.rs +++ b/src/did/src/upgrade_info.rs @@ -7,7 +7,7 @@ use serde::Deserialize; use crate::build::BuildData; /// Historical information about the canister -#[derive(CandidType, Deserialize, Clone, Default, Debug)] +#[derive(CandidType, Deserialize, Clone, Debug)] pub struct UpgradeInfo { /// The build data of the canister pub build_data: BuildData, @@ -28,9 +28,3 @@ impl Storable for UpgradeInfo { Decode!(&bytes, UpgradeInfo).expect("Failed to decode UpgradeInfo") } } - -#[derive(CandidType, Deserialize, Clone, Debug)] -pub struct PaginatedUpgradeInfo { - pub info: Vec, - pub total_count: u64, -} diff --git a/src/evm-canister-client/src/client.rs b/src/evm-canister-client/src/client.rs index f13c312c..7b1ea19e 100644 --- a/src/evm-canister-client/src/client.rs +++ b/src/evm-canister-client/src/client.rs @@ -9,7 +9,7 @@ use did::send_raw_transaction::SendRawTransactionRequest; use did::state::BasicAccount; use did::transaction::StorableExecutionResult; use did::unsafe_blocks::ValidateUnsafeBlockArgs; -use did::upgrade_info::PaginatedUpgradeInfo; +use did::upgrade_info::UpgradeInfo; use did::{ Block, BlockConfirmationData, BlockConfirmationResult, BlockConfirmationStrategy, BlockNumber, BlockchainBlockInfo, BlockchainStorageLimits, Bytes, EstimateGasRequest, EvmStats, FeeHistory, @@ -928,14 +928,10 @@ impl EvmCanisterClient { self.client.query("get_blockchain_block_info", ()).await } - /// Returns the upgrade info paginated by count and offset - pub async fn get_upgrade_info_paginated( - &self, - count: u64, - offset: usize, - ) -> CanisterClientResult { + /// Returns the upgrade info for the canister of the last `count` entries + pub async fn get_upgrade_info(&self, count: u64) -> CanisterClientResult { self.client - .query("get_upgrade_info_paginated", (count, offset)) + .query("get_upgrade_info_paginated", (count,)) .await } } From eaec59c36dbd865caa3bca869a99a79f8549d3e8 Mon Sep 17 00:00:00 2001 From: Yasir Shariff Date: Thu, 5 Jun 2025 15:22:09 +0300 Subject: [PATCH 4/4] refactor: update UpgradeInfo documentation and modify get_upgrade_info method to return last canister upgrade details --- src/did/src/upgrade_info.rs | 8 ++++---- src/evm-canister-client/src/client.rs | 6 ++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/did/src/upgrade_info.rs b/src/did/src/upgrade_info.rs index 5390299d..2630898a 100644 --- a/src/did/src/upgrade_info.rs +++ b/src/did/src/upgrade_info.rs @@ -6,14 +6,14 @@ use serde::Deserialize; use crate::build::BuildData; -/// Historical information about the canister #[derive(CandidType, Deserialize, Clone, Debug)] +/// Information about a canister upgrade, tracking deployment details and blockchain state. pub struct UpgradeInfo { - /// The build data of the canister + /// Compilation and build information for the deployed canister version pub build_data: BuildData, - /// The timestamp of the deployment + /// Unix timestamp (in seconds) when the upgrade was deployed. pub deploy_ts: u64, - /// The last block number + /// The blockchain block number at the time the upgrade was performed. pub last_block_number: u64, } diff --git a/src/evm-canister-client/src/client.rs b/src/evm-canister-client/src/client.rs index 7b1ea19e..5611a89f 100644 --- a/src/evm-canister-client/src/client.rs +++ b/src/evm-canister-client/src/client.rs @@ -928,10 +928,8 @@ impl EvmCanisterClient { self.client.query("get_blockchain_block_info", ()).await } - /// Returns the upgrade info for the canister of the last `count` entries + /// Returns the details of the last `count` canister upgrades. pub async fn get_upgrade_info(&self, count: u64) -> CanisterClientResult { - self.client - .query("get_upgrade_info_paginated", (count,)) - .await + self.client.query("get_upgrade_info", (count,)).await } }