From abff93cb9799a3af85cbea8e226041f596213751 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 31 Jan 2025 17:41:27 +0000 Subject: [PATCH 1/3] Add query stats to canister status --- .../clients/src/canister_status.rs | 109 +++++++++++++++--- .../src/management_canister_client/tests.rs | 7 ++ rs/nns/handlers/root/impl/canister/root.did | 8 ++ rs/nns/handlers/root/interface/src/client.rs | 7 ++ rs/sns/governance/canister/governance.did | 8 ++ .../governance/canister/governance_test.did | 8 ++ rs/sns/root/canister/root.did | 9 ++ rs/sns/swap/canister/swap.did | 8 ++ rs/sns/swap/canister/tests.rs | 14 ++- 9 files changed, 164 insertions(+), 14 deletions(-) diff --git a/rs/nervous_system/clients/src/canister_status.rs b/rs/nervous_system/clients/src/canister_status.rs index 5338deaa37b..bf787c42ffe 100644 --- a/rs/nervous_system/clients/src/canister_status.rs +++ b/rs/nervous_system/clients/src/canister_status.rs @@ -54,11 +54,11 @@ pub enum LogVisibility { AllowedViewers(Vec), } -/// Partial copy-paste of ic-types::ic_00::DefiniteCanisterSettings. +/// Partial copy-paste of `ic_management_canister_types::DefiniteCanisterSettings`, and it's used +/// for the response type in the NNS/SNS Root `canister_status` method. /// -/// Only the fields that we need are copied. -/// Candid deserialization is supposed to be tolerant to having data for unknown -/// fields (which is simply discarded). +/// Only the fields that we need are copied. Candid deserialization is supposed to be tolerant to +/// having data for unknown fields (which is simply discarded). #[derive(Clone, Eq, PartialEq, Debug, CandidType, Deserialize)] pub struct DefiniteCanisterSettings { pub controllers: Vec, @@ -71,11 +71,11 @@ pub struct DefiniteCanisterSettings { pub wasm_memory_threshold: Option, } -/// Partial copy-paste of ic-types::ic_00::CanisterStatusResult. +/// Partial copy-paste of `ic_management_canister_types::CanisterStatusResultV2`, and it's used for +/// the response type in the NNS/SNS Root `canister_status` method. /// -/// Only the fields that we need are copied. -/// Candid deserialization is supposed to be tolerant to having data for unknown -/// fields (which are simply discarded). +/// Only the fields that we need are copied. Candid deserialization is supposed to be tolerant to +/// having data for unknown fields (which is simply discarded). #[derive(Clone, Eq, PartialEq, Debug, CandidType, Deserialize)] pub struct CanisterStatusResult { pub status: CanisterStatusType, @@ -86,9 +86,24 @@ pub struct CanisterStatusResult { pub cycles: candid::Nat, pub idle_cycles_burned_per_day: Option, pub reserved_cycles: Option, + pub query_stats: Option, } -/// Copy-paste of `ic_management_canister_types::CanisterStatusResultV2`. +/// Partial copy-paste of `ic_management_canister_types::QueryStats`, and it's used for the response +/// type in the NNS/SNS Root `canister_status` method. +/// +/// Only the fields that we need are copied. Candid deserialization is supposed to be tolerant to +/// having data for unknown fields (which is simply discarded). +#[derive(Clone, Eq, PartialEq, Debug, CandidType, Deserialize)] +pub struct QueryStats { + pub num_calls_total: Option, + pub num_instructions_total: Option, + pub request_payload_bytes_total: Option, + pub response_payload_bytes_total: Option, +} + +/// Copy-paste of `ic_management_canister_types::CanisterStatusResultV2`, and it's used for the +/// `canister_status`` method on the management canister. #[derive(Clone, Eq, PartialEq, Debug, Default, CandidType, Deserialize)] pub struct CanisterStatusResultFromManagementCanister { pub status: CanisterStatusType, @@ -98,13 +113,14 @@ pub struct CanisterStatusResultFromManagementCanister { pub cycles: candid::Nat, pub idle_cycles_burned_per_day: candid::Nat, pub reserved_cycles: candid::Nat, + pub query_stats: QueryStatsFromManagementCanister, } -/// Partial copy-paste of `ic_management_canister_types::DefiniteCanisterSettingsArgs`. +/// Partial copy-paste of `ic_management_canister_types::DefiniteCanisterSettingsArgs`, and it's +/// used for the response type in the management canister `canister_status` method. /// -/// Only the fields that we need are copied. -/// Candid deserialization is supposed to be tolerant to having data for unknown -/// fields (which is simply discarded). +/// Only the fields that we need are copied. Candid deserialization is supposed to be tolerant to +/// having data for unknown fields (which is simply discarded). #[derive(Clone, Eq, PartialEq, Debug, Default, CandidType, Deserialize)] pub struct DefiniteCanisterSettingsFromManagementCanister { pub controllers: Vec, @@ -117,6 +133,16 @@ pub struct DefiniteCanisterSettingsFromManagementCanister { pub wasm_memory_threshold: candid::Nat, } +/// Partial copy-paste of `ic_management_canister_types::QueryStats`, and it's used for the response +/// type in the management canister `canister_status` method. +#[derive(Clone, Eq, PartialEq, Debug, Default, CandidType, Deserialize)] +pub struct QueryStatsFromManagementCanister { + pub num_calls_total: candid::Nat, + pub num_instructions_total: candid::Nat, + pub request_payload_bytes_total: candid::Nat, + pub response_payload_bytes_total: candid::Nat, +} + impl From for CanisterStatusResult { fn from(value: CanisterStatusResultFromManagementCanister) -> Self { let CanisterStatusResultFromManagementCanister { @@ -127,9 +153,11 @@ impl From for CanisterStatusResult { cycles, idle_cycles_burned_per_day, reserved_cycles, + query_stats, } = value; let settings = DefiniteCanisterSettings::from(settings); + let query_stats = Some(QueryStats::from(query_stats)); let idle_cycles_burned_per_day = Some(idle_cycles_burned_per_day); let reserved_cycles = Some(reserved_cycles); @@ -142,6 +170,7 @@ impl From for CanisterStatusResult { cycles, idle_cycles_burned_per_day, reserved_cycles, + query_stats, } } } @@ -180,6 +209,29 @@ impl From for DefiniteCanisterSe } } +impl From for QueryStats { + fn from(value: QueryStatsFromManagementCanister) -> Self { + let QueryStatsFromManagementCanister { + num_calls_total, + num_instructions_total, + request_payload_bytes_total, + response_payload_bytes_total, + } = value; + + let num_calls_total = Some(num_calls_total); + let num_instructions_total = Some(num_instructions_total); + let request_payload_bytes_total = Some(request_payload_bytes_total); + let response_payload_bytes_total = Some(response_payload_bytes_total); + + QueryStats { + num_calls_total, + num_instructions_total, + request_payload_bytes_total, + response_payload_bytes_total, + } + } +} + impl CanisterStatusResultFromManagementCanister { pub fn controllers(&self) -> &[PrincipalId] { self.settings.controllers.as_slice() @@ -202,6 +254,12 @@ impl CanisterStatusResultFromManagementCanister { log_visibility: LogVisibility::Controllers, wasm_memory_threshold: candid::Nat::from(49_u32), }, + query_stats: QueryStatsFromManagementCanister { + num_calls_total: candid::Nat::from(50_u32), + num_instructions_total: candid::Nat::from(51_u32), + request_payload_bytes_total: candid::Nat::from(52_u32), + response_payload_bytes_total: candid::Nat::from(53_u32), + }, cycles: candid::Nat::from(47_u32), idle_cycles_burned_per_day: candid::Nat::from(48_u32), reserved_cycles: candid::Nat::from(49_u32), @@ -230,6 +288,7 @@ pub struct CanisterStatusResultV2 { pub cycles: candid::Nat, // this is for compat with Spec 0.12/0.13 pub idle_cycles_burned_per_day: candid::Nat, + pub query_stats: Option, } impl CanisterStatusResultV2 { @@ -263,6 +322,12 @@ impl CanisterStatusResultV2 { Some(wasm_memory_threshold), ), idle_cycles_burned_per_day: candid::Nat::from(idle_cycles_burned_per_day), + query_stats: Some(QueryStats { + num_calls_total: Some(candid::Nat::from(0_u64)), + num_instructions_total: Some(candid::Nat::from(0_u64)), + request_payload_bytes_total: Some(candid::Nat::from(0_u64)), + response_payload_bytes_total: Some(candid::Nat::from(0_u64)), + }), } } @@ -403,6 +468,12 @@ impl From for CanisterStatusResultV2 memory_size: value.memory_size, cycles: value.cycles, idle_cycles_burned_per_day: value.idle_cycles_burned_per_day, + query_stats: Some(QueryStats { + num_calls_total: Some(value.query_stats.num_calls_total), + num_instructions_total: Some(value.query_stats.num_instructions_total), + request_payload_bytes_total: Some(value.query_stats.request_payload_bytes_total), + response_payload_bytes_total: Some(value.query_stats.response_payload_bytes_total), + }), } } } @@ -438,6 +509,12 @@ mod tests { cycles: candid::Nat::from(999_u32), idle_cycles_burned_per_day: candid::Nat::from(998_u32), reserved_cycles: candid::Nat::from(997_u32), + query_stats: QueryStatsFromManagementCanister { + num_calls_total: candid::Nat::from(93_u32), + num_instructions_total: candid::Nat::from(92_u32), + request_payload_bytes_total: candid::Nat::from(91_u32), + response_payload_bytes_total: candid::Nat::from(90_u32), + }, }; let expected_canister_status_result = CanisterStatusResult { @@ -457,6 +534,12 @@ mod tests { cycles: candid::Nat::from(999_u32), idle_cycles_burned_per_day: Some(candid::Nat::from(998_u32)), reserved_cycles: Some(candid::Nat::from(997_u32)), + query_stats: Some(QueryStats { + num_calls_total: Some(candid::Nat::from(93_u32)), + num_instructions_total: Some(candid::Nat::from(92_u32)), + request_payload_bytes_total: Some(candid::Nat::from(91_u32)), + response_payload_bytes_total: Some(candid::Nat::from(90_u32)), + }), }; let actual_canister_status_result = CanisterStatusResult::from(m); diff --git a/rs/nervous_system/clients/src/management_canister_client/tests.rs b/rs/nervous_system/clients/src/management_canister_client/tests.rs index fe6cd4ca7c1..3f8f5871e50 100644 --- a/rs/nervous_system/clients/src/management_canister_client/tests.rs +++ b/rs/nervous_system/clients/src/management_canister_client/tests.rs @@ -1,6 +1,7 @@ use super::*; use crate::canister_status::{ CanisterStatusType, DefiniteCanisterSettingsFromManagementCanister, LogVisibility, + QueryStatsFromManagementCanister, }; use candid::Nat; use ic_base_types::{CanisterId, PrincipalId}; @@ -119,6 +120,12 @@ async fn test_limit_outstanding_calls() { }, status: CanisterStatusType::Running, reserved_cycles: zero.clone(), + query_stats: QueryStatsFromManagementCanister { + num_calls_total: zero.clone(), + num_instructions_total: zero.clone(), + request_payload_bytes_total: zero.clone(), + response_payload_bytes_total: zero.clone(), + }, }; // Step 2: Call code under test. diff --git a/rs/nns/handlers/root/impl/canister/root.did b/rs/nns/handlers/root/impl/canister/root.did index 4fb1189f628..009d0917cf4 100644 --- a/rs/nns/handlers/root/impl/canister/root.did +++ b/rs/nns/handlers/root/impl/canister/root.did @@ -41,6 +41,7 @@ type CanisterStatusResult = record { idle_cycles_burned_per_day : opt nat; module_hash : opt blob; reserved_cycles : opt nat; + query_stats : opt QueryStats; }; type CanisterStatusType = variant { @@ -107,6 +108,13 @@ type CanisterStatusLogVisibility = variant { allowed_viewers : vec principal; }; +type QueryStats = record { + num_calls_total : opt nat; + num_instructions_total : opt nat; + request_payload_bytes_total : opt nat; + response_payload_bytes_total : opt nat; +}; + type StopOrStartCanisterRequest = record { action : CanisterAction; canister_id : principal; diff --git a/rs/nns/handlers/root/interface/src/client.rs b/rs/nns/handlers/root/interface/src/client.rs index 50707e62002..796c2b7fd18 100644 --- a/rs/nns/handlers/root/interface/src/client.rs +++ b/rs/nns/handlers/root/interface/src/client.rs @@ -9,6 +9,7 @@ use ic_nervous_system_clients::{ canister_id_record::CanisterIdRecord, canister_status::{ CanisterStatusResult, CanisterStatusType, DefiniteCanisterSettings, LogVisibility, + QueryStats, }, }; use ic_nns_constants::ROOT_CANISTER_ID; @@ -226,6 +227,12 @@ impl SpyNnsRootCanisterClientReply { cycles: candid::Nat::from(42_u32), idle_cycles_burned_per_day: Some(candid::Nat::from(43_u32)), reserved_cycles: Some(candid::Nat::from(44_u32)), + query_stats: Some(QueryStats { + num_calls_total: Some(candid::Nat::from(45_u32)), + num_instructions_total: Some(candid::Nat::from(46_u32)), + request_payload_bytes_total: Some(candid::Nat::from(47_u32)), + response_payload_bytes_total: Some(candid::Nat::from(48_u32)), + }), })) } diff --git a/rs/sns/governance/canister/governance.did b/rs/sns/governance/canister/governance.did index 265c627ce8e..d3ec7e3b06c 100644 --- a/rs/sns/governance/canister/governance.did +++ b/rs/sns/governance/canister/governance.did @@ -55,6 +55,7 @@ type CanisterStatusResultV2 = record { settings : DefiniteCanisterSettingsArgs; idle_cycles_burned_per_day : nat; module_hash : opt blob; + query_stats : opt QueryStats; }; type CanisterStatusType = variant { @@ -610,6 +611,13 @@ type ProposalId = record { id : nat64; }; +type QueryStats = record { + num_calls_total : opt nat; + num_instructions_total : opt nat; + request_payload_bytes_total : opt nat; + response_payload_bytes_total : opt nat; +}; + type RegisterDappCanisters = record { canister_ids : vec principal; }; diff --git a/rs/sns/governance/canister/governance_test.did b/rs/sns/governance/canister/governance_test.did index 5175adcc646..a693330b310 100644 --- a/rs/sns/governance/canister/governance_test.did +++ b/rs/sns/governance/canister/governance_test.did @@ -64,6 +64,7 @@ type CanisterStatusResultV2 = record { settings : DefiniteCanisterSettingsArgs; idle_cycles_burned_per_day : nat; module_hash : opt blob; + query_stats : opt QueryStats; }; type CanisterStatusType = variant { @@ -624,6 +625,13 @@ type ProposalId = record { id : nat64; }; +type QueryStats = record { + num_calls_total : opt nat; + num_instructions_total : opt nat; + request_payload_bytes_total : opt nat; + response_payload_bytes_total : opt nat; +}; + type RegisterDappCanisters = record { canister_ids : vec principal; }; diff --git a/rs/sns/root/canister/root.did b/rs/sns/root/canister/root.did index b0c57420db2..1e4d8154929 100644 --- a/rs/sns/root/canister/root.did +++ b/rs/sns/root/canister/root.did @@ -21,6 +21,7 @@ type CanisterStatusResult = record { idle_cycles_burned_per_day : opt nat; module_hash : opt blob; reserved_cycles : opt nat; + query_stats : opt QueryStats; }; type CanisterStatusResultV2 = record { @@ -30,6 +31,7 @@ type CanisterStatusResultV2 = record { settings : DefiniteCanisterSettingsArgs; idle_cycles_burned_per_day : nat; module_hash : opt blob; + query_stats : opt QueryStats; }; type CanisterStatusType = variant { @@ -80,6 +82,13 @@ type DefiniteCanisterSettingsArgs = record { wasm_memory_threshold : opt nat; }; +type QueryStats = record { + num_calls_total : opt nat; + num_instructions_total : opt nat; + request_payload_bytes_total : opt nat; + response_payload_bytes_total : opt nat; +}; + type FailedUpdate = record { err : opt CanisterCallError; dapp_canister_id : opt principal; diff --git a/rs/sns/swap/canister/swap.did b/rs/sns/swap/canister/swap.did index 2f1ab199496..ca4ff642ebe 100644 --- a/rs/sns/swap/canister/swap.did +++ b/rs/sns/swap/canister/swap.did @@ -8,6 +8,13 @@ type CanisterCallError = record { description : text; }; +type QueryStats = record { + num_calls_total : opt nat; + num_instructions_total : opt nat; + request_payload_bytes_total : opt nat; + response_payload_bytes_total : opt nat; +}; + type CanisterStatusResultV2 = record { status : CanisterStatusType; memory_size : nat; @@ -15,6 +22,7 @@ type CanisterStatusResultV2 = record { settings : DefiniteCanisterSettingsArgs; idle_cycles_burned_per_day : nat; module_hash : opt blob; + query_stats : opt QueryStats; }; type CanisterStatusType = variant { diff --git a/rs/sns/swap/canister/tests.rs b/rs/sns/swap/canister/tests.rs index a968c631482..a2861f1e0ae 100644 --- a/rs/sns/swap/canister/tests.rs +++ b/rs/sns/swap/canister/tests.rs @@ -4,7 +4,7 @@ use ic_nervous_system_clients::{ canister_status::{ CanisterStatusResultFromManagementCanister, CanisterStatusResultV2, CanisterStatusType, DefiniteCanisterSettingsArgs, DefiniteCanisterSettingsFromManagementCanister, - LogVisibility, + LogVisibility, QueryStats, QueryStatsFromManagementCanister, }, management_canister_client::{MockManagementCanisterClient, MockManagementCanisterClientReply}, }; @@ -59,6 +59,12 @@ async fn test_get_canister_status() { memory_size: candid::Nat::from(0_u32), cycles: candid::Nat::from(0_u32), idle_cycles_burned_per_day: candid::Nat::from(0_u32), + query_stats: Some(QueryStats { + num_calls_total: Some(candid::Nat::from(0_u32)), + num_instructions_total: Some(candid::Nat::from(0_u32)), + request_payload_bytes_total: Some(candid::Nat::from(0_u32)), + response_payload_bytes_total: Some(candid::Nat::from(0_u32)), + }), }; let management_canister_client = @@ -80,6 +86,12 @@ async fn test_get_canister_status() { cycles: candid::Nat::from(0_u32), idle_cycles_burned_per_day: candid::Nat::from(0_u32), reserved_cycles: candid::Nat::from(0_u32), + query_stats: QueryStatsFromManagementCanister { + num_calls_total: candid::Nat::from(0_u32), + num_instructions_total: candid::Nat::from(0_u32), + request_payload_bytes_total: candid::Nat::from(0_u32), + response_payload_bytes_total: candid::Nat::from(0_u32), + }, }), )]); From 19ce35d5a0f53445cfbd9787cfc0b19f779a4870 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 31 Jan 2025 19:28:50 +0000 Subject: [PATCH 2/3] Add changelog entries --- rs/nns/handlers/root/unreleased_changelog.md | 4 +++- rs/sns/governance/unreleased_changelog.md | 1 + rs/sns/root/unreleased_changelog.md | 4 +++- rs/sns/swap/unreleased_changelog.md | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/rs/nns/handlers/root/unreleased_changelog.md b/rs/nns/handlers/root/unreleased_changelog.md index 37be2d66b62..b0fede41be9 100644 --- a/rs/nns/handlers/root/unreleased_changelog.md +++ b/rs/nns/handlers/root/unreleased_changelog.md @@ -9,9 +9,11 @@ on the process that this file is part of, see ## Added +* Added the `query_status` field for the `canister_status` method. + ## Changed -- The `LogVisibility` returned from `canister_status` has one more variant `allowed_viewers`, +* The `LogVisibility` returned from `canister_status` has one more variant `allowed_viewers`, consistent with the corresponding management canister API. Calling `canister_status` for a canister with such a log visibility setting will no longer panic. diff --git a/rs/sns/governance/unreleased_changelog.md b/rs/sns/governance/unreleased_changelog.md index b5ff3f4f201..7b293d18a39 100644 --- a/rs/sns/governance/unreleased_changelog.md +++ b/rs/sns/governance/unreleased_changelog.md @@ -37,6 +37,7 @@ proposal, e.g.: ``` * Do not redact chunked Wasm data in `ProposalInfo` served from `SnsGov.list_proposals`. +* Added the `query_status` field for `canister_status`/`get_sns_canisters_summary` methods. ## Changed diff --git a/rs/sns/root/unreleased_changelog.md b/rs/sns/root/unreleased_changelog.md index 37be2d66b62..ad945e01777 100644 --- a/rs/sns/root/unreleased_changelog.md +++ b/rs/sns/root/unreleased_changelog.md @@ -9,9 +9,11 @@ on the process that this file is part of, see ## Added +* Added the `query_status` field for `canister_status`/`get_sns_canisters_summary` methods. + ## Changed -- The `LogVisibility` returned from `canister_status` has one more variant `allowed_viewers`, +* The `LogVisibility` returned from `canister_status` has one more variant `allowed_viewers`, consistent with the corresponding management canister API. Calling `canister_status` for a canister with such a log visibility setting will no longer panic. diff --git a/rs/sns/swap/unreleased_changelog.md b/rs/sns/swap/unreleased_changelog.md index 94126a0ff42..e0116905592 100644 --- a/rs/sns/swap/unreleased_changelog.md +++ b/rs/sns/swap/unreleased_changelog.md @@ -9,6 +9,8 @@ on the process that this file is part of, see ## Added +* Added the `query_status` field for the `get_canister_status` method. + ## Changed ## Deprecated From 38b4eca1e1513e00bde0ed00234d595f8b9d3205 Mon Sep 17 00:00:00 2001 From: Jason Zhu Date: Fri, 31 Jan 2025 21:53:57 +0000 Subject: [PATCH 3/3] Bump wasm size limit --- rs/nns/handlers/root/unreleased_changelog.md | 2 +- rs/sns/governance/unreleased_changelog.md | 2 +- rs/sns/root/unreleased_changelog.md | 2 +- rs/sns/sns.bzl | 2 +- rs/sns/swap/unreleased_changelog.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rs/nns/handlers/root/unreleased_changelog.md b/rs/nns/handlers/root/unreleased_changelog.md index b0fede41be9..ebb40d65efd 100644 --- a/rs/nns/handlers/root/unreleased_changelog.md +++ b/rs/nns/handlers/root/unreleased_changelog.md @@ -9,7 +9,7 @@ on the process that this file is part of, see ## Added -* Added the `query_status` field for the `canister_status` method. +* Added the `query_stats` field for the `canister_status` method. ## Changed diff --git a/rs/sns/governance/unreleased_changelog.md b/rs/sns/governance/unreleased_changelog.md index 7b293d18a39..775513d903e 100644 --- a/rs/sns/governance/unreleased_changelog.md +++ b/rs/sns/governance/unreleased_changelog.md @@ -37,7 +37,7 @@ proposal, e.g.: ``` * Do not redact chunked Wasm data in `ProposalInfo` served from `SnsGov.list_proposals`. -* Added the `query_status` field for `canister_status`/`get_sns_canisters_summary` methods. +* Added the `query_stats` field for `canister_status`/`get_sns_canisters_summary` methods. ## Changed diff --git a/rs/sns/root/unreleased_changelog.md b/rs/sns/root/unreleased_changelog.md index ad945e01777..2dde54ef615 100644 --- a/rs/sns/root/unreleased_changelog.md +++ b/rs/sns/root/unreleased_changelog.md @@ -9,7 +9,7 @@ on the process that this file is part of, see ## Added -* Added the `query_status` field for `canister_status`/`get_sns_canisters_summary` methods. +* Added the `query_stats` field for `canister_status`/`get_sns_canisters_summary` methods. ## Changed diff --git a/rs/sns/sns.bzl b/rs/sns/sns.bzl index 264328502ff..03612334b0e 100644 --- a/rs/sns/sns.bzl +++ b/rs/sns/sns.bzl @@ -16,6 +16,6 @@ but other things could be added here later. CANISTER_NAME_TO_MAX_COMPRESSED_WASM_SIZE_E5_BYTES = { "sns-governance-canister.wasm.gz": "13", "sns-governance-canister_test.wasm.gz": "13", - "sns-root-canister.wasm.gz": "4", + "sns-root-canister.wasm.gz": "5", "sns-swap-canister.wasm.gz": "7", } diff --git a/rs/sns/swap/unreleased_changelog.md b/rs/sns/swap/unreleased_changelog.md index e0116905592..afd3dea7a3e 100644 --- a/rs/sns/swap/unreleased_changelog.md +++ b/rs/sns/swap/unreleased_changelog.md @@ -9,7 +9,7 @@ on the process that this file is part of, see ## Added -* Added the `query_status` field for the `get_canister_status` method. +* Added the `query_stats` field for the `get_canister_status` method. ## Changed