diff --git a/canister/can.did b/canister/can.did index e2faf1c..0fbb50d 100644 --- a/canister/can.did +++ b/canister/can.did @@ -1,3 +1,23 @@ +type CanisterStatusResponse = record { + status : CanisterStatusType; + memory_size : nat; + cycles : nat; + settings : DefiniteCanisterSettings; + query_stats : QueryStats; + idle_cycles_burned_per_day : nat; + module_hash : opt blob; + reserved_cycles : nat; +}; +type CanisterStatusType = variant { stopped; stopping; running }; +type DefiniteCanisterSettings = record { + freezing_threshold : nat; + controllers : vec principal; + reserved_cycles_limit : nat; + log_visibility : LogVisibility; + wasm_memory_limit : nat; + memory_allocation : nat; + compute_allocation : nat; +}; type DeregisterNeuronPairArgs = record { pair_id : nat64 }; type InitArgs = record { wtn_governance_canister_id : opt principal; @@ -5,6 +25,11 @@ type InitArgs = record { wtn_protocol_canister_id : opt principal; }; type InitOrUpgradeArgs = variant { Upgrade : record {}; Init : InitArgs }; +type LogVisibility = variant { + controllers; + public; + allowed_viewers : vec principal; +}; type NeuronPairPublic = record { id : nat64; admin : principal; @@ -12,6 +37,12 @@ type NeuronPairPublic = record { nns_neuron_id : nat64; wtn_neuron_id : blob; }; +type QueryStats = record { + response_payload_bytes_total : nat; + num_instructions_total : nat; + num_calls_total : nat; + request_payload_bytes_total : nat; +}; type RegisterNeuronPairArgs = record { name : text; nns_neuron_id : nat64; @@ -30,4 +61,5 @@ service : (InitOrUpgradeArgs) -> { list_neuron_pairs : () -> (vec NeuronPairPublic) query; logs : () -> (vec text) query; register_neuron_pair : (RegisterNeuronPairArgs) -> (Result); + status : () -> (CanisterStatusResponse); } \ No newline at end of file diff --git a/canister/src/lib.rs b/canister/src/lib.rs index 40f1803..2bfe651 100644 --- a/canister/src/lib.rs +++ b/canister/src/lib.rs @@ -1,4 +1,5 @@ use candid::CandidType; +use ic_cdk::api::management_canister::main::{CanisterIdRecord, CanisterStatusResponse}; use ic_principal::Principal; use serde::{Deserialize, Serialize}; diff --git a/canister/src/updates/mod.rs b/canister/src/updates/mod.rs index 786ed88..49cf688 100644 --- a/canister/src/updates/mod.rs +++ b/canister/src/updates/mod.rs @@ -1,2 +1,3 @@ mod deregister_neuron_pair; mod register_neuron_pair; +mod status; diff --git a/canister/src/updates/status.rs b/canister/src/updates/status.rs new file mode 100644 index 0000000..e538124 --- /dev/null +++ b/canister/src/updates/status.rs @@ -0,0 +1,11 @@ +use crate::{CanisterIdRecord, CanisterStatusResponse}; +use ic_cdk::update; + +#[update] +async fn status() -> CanisterStatusResponse { + let canister_id = ic_cdk::id(); + ic_cdk::api::management_canister::main::canister_status(CanisterIdRecord { canister_id }) + .await + .unwrap() + .0 +}