diff --git a/rs/nns/governance/api/src/ic_nns_governance.pb.v1.rs b/rs/nns/governance/api/src/ic_nns_governance.pb.v1.rs index 34efc598a03..e2ab19fa20b 100644 --- a/rs/nns/governance/api/src/ic_nns_governance.pb.v1.rs +++ b/rs/nns/governance/api/src/ic_nns_governance.pb.v1.rs @@ -2158,61 +2158,41 @@ pub struct WaitForQuietState { /// This is a view of the ProposalData returned by API queries and is NOT used /// for storage. The ballots are restricted to those of the caller's neurons and /// additionally it has the computed fields, topic, status, and reward_status. -#[derive(candid::CandidType, candid::Deserialize, serde::Serialize, comparable::Comparable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(candid::CandidType, candid::Deserialize, serde::Serialize, Clone, Debug, PartialEq)] pub struct ProposalInfo { /// The unique id for this proposal. - #[prost(message, optional, tag = "1")] pub id: Option<::ic_nns_common::pb::v1::ProposalId>, /// The ID of the neuron that made this proposal. - #[prost(message, optional, tag = "2")] pub proposer: Option, /// The amount of ICP in E8s to be charged to the proposer if the proposal is /// rejected. - #[prost(uint64, tag = "3")] pub reject_cost_e8s: u64, /// The proposal originally submitted. - #[prost(message, optional, tag = "4")] pub proposal: Option, /// The timestamp, in seconds from the Unix epoch, when this proposal was made. - #[prost(uint64, tag = "5")] pub proposal_timestamp_seconds: u64, /// See \[ProposalData::ballots\]. - #[prost(map = "fixed64, message", tag = "6")] pub ballots: ::std::collections::HashMap, /// See \[ProposalData::latest_tally\]. - #[prost(message, optional, tag = "7")] pub latest_tally: Option, /// See \[ProposalData::decided_timestamp_seconds\]. - #[prost(uint64, tag = "8")] pub decided_timestamp_seconds: u64, /// See \[ProposalData::executed_timestamp_seconds\]. - #[prost(uint64, tag = "12")] pub executed_timestamp_seconds: u64, /// See \[ProposalData::failed_timestamp_seconds\]. - #[prost(uint64, tag = "13")] pub failed_timestamp_seconds: u64, /// See \[ProposalData::failure_reason\]. - #[prost(message, optional, tag = "18")] pub failure_reason: Option, /// See \[ProposalData::reward_event_round\]. - #[prost(uint64, tag = "14")] pub reward_event_round: u64, /// Derived - see \[Topic\] for more information - #[prost(enumeration = "Topic", tag = "15")] pub topic: i32, /// Derived - see \[ProposalStatus\] for more information - #[prost(enumeration = "ProposalStatus", tag = "16")] pub status: i32, /// Derived - see \[ProposalRewardStatus\] for more information - #[prost(enumeration = "ProposalRewardStatus", tag = "17")] pub reward_status: i32, - #[prost(uint64, optional, tag = "19")] pub deadline_timestamp_seconds: Option, - #[prost(message, optional, tag = "20")] pub derived_proposal_information: Option, - #[prost(uint64, optional, tag = "21")] pub total_potential_voting_power: ::core::option::Option, } @@ -3479,11 +3459,8 @@ pub struct ListProposalInfo { #[prost(bool, optional, tag = "7")] pub omit_large_fields: Option, } -#[derive(candid::CandidType, candid::Deserialize, serde::Serialize, comparable::Comparable)] -#[allow(clippy::derive_partial_eq_without_eq)] -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(candid::CandidType, candid::Deserialize, serde::Serialize, Clone, Debug, PartialEq)] pub struct ListProposalInfoResponse { - #[prost(message, repeated, tag = "1")] pub proposal_info: Vec, } /// A request to list neurons. The "requested list", i.e., the list of diff --git a/rs/nns/governance/canbench/canbench_results.yml b/rs/nns/governance/canbench/canbench_results.yml index 3f74bd3c064..872c2780959 100644 --- a/rs/nns/governance/canbench/canbench_results.yml +++ b/rs/nns/governance/canbench/canbench_results.yml @@ -1,67 +1,67 @@ benches: add_neuron_active_maximum: total: - instructions: 42749552 + instructions: 42752796 heap_increase: 1 stable_memory_increase: 0 scopes: {} add_neuron_active_typical: total: - instructions: 2170522 + instructions: 2170658 heap_increase: 0 stable_memory_increase: 0 scopes: {} add_neuron_inactive_maximum: total: - instructions: 112621390 + instructions: 112624375 heap_increase: 1 stable_memory_increase: 0 scopes: {} add_neuron_inactive_typical: total: - instructions: 8497159 + instructions: 8497036 heap_increase: 0 stable_memory_increase: 0 scopes: {} cascading_vote_all_heap: total: - instructions: 35650914 + instructions: 35676146 heap_increase: 0 stable_memory_increase: 128 scopes: {} cascading_vote_heap_neurons_stable_index: total: - instructions: 61785953 + instructions: 61811185 heap_increase: 0 stable_memory_increase: 128 scopes: {} cascading_vote_stable_everything: total: - instructions: 188618691 + instructions: 188611915 heap_increase: 0 stable_memory_increase: 128 scopes: {} cascading_vote_stable_neurons_with_heap_index: total: - instructions: 162350256 + instructions: 162343480 heap_increase: 0 stable_memory_increase: 128 scopes: {} centralized_following_all_stable: total: - instructions: 78266711 + instructions: 78265237 heap_increase: 0 stable_memory_increase: 128 scopes: {} compute_ballots_for_new_proposal_with_stable_neurons: total: - instructions: 2223231 + instructions: 2223431 heap_increase: 0 stable_memory_increase: 0 scopes: {} draw_maturity_from_neurons_fund_heap: total: - instructions: 7643198 + instructions: 7656798 heap_increase: 0 stable_memory_increase: 0 scopes: {} @@ -85,7 +85,7 @@ benches: scopes: {} list_neurons_heap: total: - instructions: 4947095 + instructions: 4988540 heap_increase: 9 stable_memory_increase: 0 scopes: {} @@ -103,13 +103,13 @@ benches: scopes: {} list_neurons_stable: total: - instructions: 113659672 + instructions: 113606723 heap_increase: 5 stable_memory_increase: 0 scopes: {} list_proposals: total: - instructions: 6477035 + instructions: 128658 heap_increase: 0 stable_memory_increase: 0 scopes: {} @@ -127,37 +127,37 @@ benches: scopes: {} neuron_data_validation_heap: total: - instructions: 406842391 + instructions: 406853184 heap_increase: 0 stable_memory_increase: 0 scopes: {} neuron_data_validation_stable: total: - instructions: 362640286 + instructions: 362648372 heap_increase: 0 stable_memory_increase: 0 scopes: {} neuron_metrics_calculation_heap: total: - instructions: 1498269 + instructions: 1498869 heap_increase: 0 stable_memory_increase: 0 scopes: {} neuron_metrics_calculation_stable: total: - instructions: 3026795 + instructions: 3027495 heap_increase: 0 stable_memory_increase: 0 scopes: {} range_neurons_performance: total: - instructions: 56448740 + instructions: 56447340 heap_increase: 0 stable_memory_increase: 0 scopes: {} single_vote_all_stable: total: - instructions: 2805835 + instructions: 2805871 heap_increase: 0 stable_memory_increase: 128 scopes: {} diff --git a/rs/nns/governance/canister/canister.rs b/rs/nns/governance/canister/canister.rs index 0618b07a19b..1c235c46c26 100644 --- a/rs/nns/governance/canister/canister.rs +++ b/rs/nns/governance/canister/canister.rs @@ -774,9 +774,7 @@ fn get_neuron_info_by_id_or_subaccount( #[query] fn get_proposal_info(id: ProposalId) -> Option { debug_log("get_proposal_info"); - governance() - .get_proposal_info(&caller(), id) - .map(ProposalInfo::from) + GOVERNANCE.with_borrow(|governance| governance.get_proposal_info(&caller(), id)) } #[query] @@ -792,17 +790,13 @@ fn get_neurons_fund_audit_info( #[query] fn get_pending_proposals() -> Vec { debug_log("get_pending_proposals"); - governance() - .get_pending_proposals(&caller()) - .into_iter() - .map(ProposalInfo::from) - .collect() + GOVERNANCE.with_borrow(|governance| governance.get_pending_proposals(&caller())) } #[query] fn list_proposals(req: ListProposalInfo) -> ListProposalInfoResponse { debug_log("list_proposals"); - governance().list_proposals(&caller(), &(req.into())).into() + GOVERNANCE.with_borrow(|governance| governance.list_proposals(&caller(), &req.into())) } #[query] diff --git a/rs/nns/governance/proto/ic_nns_governance/pb/v1/governance.proto b/rs/nns/governance/proto/ic_nns_governance/pb/v1/governance.proto index 6d649df4856..4fe709485c6 100644 --- a/rs/nns/governance/proto/ic_nns_governance/pb/v1/governance.proto +++ b/rs/nns/governance/proto/ic_nns_governance/pb/v1/governance.proto @@ -1642,64 +1642,6 @@ message WaitForQuietState { uint64 current_deadline_timestamp_seconds = 1; } -// This is a view of the ProposalData returned by API queries and is NOT used -// for storage. The ballots are restricted to those of the caller's neurons and -// additionally it has the computed fields, topic, status, and reward_status. -message ProposalInfo { - // The unique id for this proposal. - ic_nns_common.pb.v1.ProposalId id = 1; - - // The ID of the neuron that made this proposal. - ic_nns_common.pb.v1.NeuronId proposer = 2; - - // The amount of ICP in E8s to be charged to the proposer if the proposal is - // rejected. - uint64 reject_cost_e8s = 3; - - // The proposal originally submitted. - Proposal proposal = 4; - - // The timestamp, in seconds from the Unix epoch, when this proposal was made. - uint64 proposal_timestamp_seconds = 5; - - // See [ProposalData::ballots]. - map ballots = 6; - - // See [ProposalData::latest_tally]. - Tally latest_tally = 7; - - // See [ProposalData::decided_timestamp_seconds]. - uint64 decided_timestamp_seconds = 8; - - // See [ProposalData::executed_timestamp_seconds]. - uint64 executed_timestamp_seconds = 12; - - // See [ProposalData::failed_timestamp_seconds]. - uint64 failed_timestamp_seconds = 13; - - // See [ProposalData::failure_reason]. - GovernanceError failure_reason = 18; - - // See [ProposalData::reward_event_round]. - uint64 reward_event_round = 14; - - // Derived - see [Topic] for more information - Topic topic = 15; - - // Derived - see [ProposalStatus] for more information - ProposalStatus status = 16; - - // Derived - see [ProposalRewardStatus] for more information - ProposalRewardStatus reward_status = 17; - - optional uint64 deadline_timestamp_seconds = 19; - - DerivedProposalInformation derived_proposal_information = 20; - - // See [ProposalData::total_potential_voting_power]. - optional uint64 total_potential_voting_power = 21; -} - // Network economics contains the parameters for several operations related // to the economy of the network. When submitting a NetworkEconomics proposal // default values (0) are considered unchanged, so a valid proposal only needs @@ -2492,10 +2434,6 @@ message ListProposalInfo { optional bool omit_large_fields = 7; } -message ListProposalInfoResponse { - repeated ProposalInfo proposal_info = 1; -} - // A response to "ListKnownNeurons" message ListKnownNeuronsResponse { // List of known neurons. diff --git a/rs/nns/governance/src/gen/ic_nns_governance.pb.v1.rs b/rs/nns/governance/src/gen/ic_nns_governance.pb.v1.rs index a1ee37e6ce1..12fe8a97d8d 100644 --- a/rs/nns/governance/src/gen/ic_nns_governance.pb.v1.rs +++ b/rs/nns/governance/src/gen/ic_nns_governance.pb.v1.rs @@ -2087,73 +2087,6 @@ pub struct WaitForQuietState { #[prost(uint64, tag = "1")] pub current_deadline_timestamp_seconds: u64, } -/// This is a view of the ProposalData returned by API queries and is NOT used -/// for storage. The ballots are restricted to those of the caller's neurons and -/// additionally it has the computed fields, topic, status, and reward_status. -#[derive( - candid::CandidType, - candid::Deserialize, - serde::Serialize, - comparable::Comparable, - Clone, - PartialEq, - ::prost::Message, -)] -pub struct ProposalInfo { - /// The unique id for this proposal. - #[prost(message, optional, tag = "1")] - pub id: ::core::option::Option<::ic_nns_common::pb::v1::ProposalId>, - /// The ID of the neuron that made this proposal. - #[prost(message, optional, tag = "2")] - pub proposer: ::core::option::Option<::ic_nns_common::pb::v1::NeuronId>, - /// The amount of ICP in E8s to be charged to the proposer if the proposal is - /// rejected. - #[prost(uint64, tag = "3")] - pub reject_cost_e8s: u64, - /// The proposal originally submitted. - #[prost(message, optional, tag = "4")] - pub proposal: ::core::option::Option, - /// The timestamp, in seconds from the Unix epoch, when this proposal was made. - #[prost(uint64, tag = "5")] - pub proposal_timestamp_seconds: u64, - /// See \[ProposalData::ballots\]. - #[prost(map = "fixed64, message", tag = "6")] - pub ballots: ::std::collections::HashMap, - /// See \[ProposalData::latest_tally\]. - #[prost(message, optional, tag = "7")] - pub latest_tally: ::core::option::Option, - /// See \[ProposalData::decided_timestamp_seconds\]. - #[prost(uint64, tag = "8")] - pub decided_timestamp_seconds: u64, - /// See \[ProposalData::executed_timestamp_seconds\]. - #[prost(uint64, tag = "12")] - pub executed_timestamp_seconds: u64, - /// See \[ProposalData::failed_timestamp_seconds\]. - #[prost(uint64, tag = "13")] - pub failed_timestamp_seconds: u64, - /// See \[ProposalData::failure_reason\]. - #[prost(message, optional, tag = "18")] - pub failure_reason: ::core::option::Option, - /// See \[ProposalData::reward_event_round\]. - #[prost(uint64, tag = "14")] - pub reward_event_round: u64, - /// Derived - see \[Topic\] for more information - #[prost(enumeration = "Topic", tag = "15")] - pub topic: i32, - /// Derived - see \[ProposalStatus\] for more information - #[prost(enumeration = "ProposalStatus", tag = "16")] - pub status: i32, - /// Derived - see \[ProposalRewardStatus\] for more information - #[prost(enumeration = "ProposalRewardStatus", tag = "17")] - pub reward_status: i32, - #[prost(uint64, optional, tag = "19")] - pub deadline_timestamp_seconds: ::core::option::Option, - #[prost(message, optional, tag = "20")] - pub derived_proposal_information: ::core::option::Option, - /// See \[ProposalData::total_potential_voting_power\]. - #[prost(uint64, optional, tag = "21")] - pub total_potential_voting_power: ::core::option::Option, -} /// Network economics contains the parameters for several operations related /// to the economy of the network. When submitting a NetworkEconomics proposal /// default values (0) are considered unchanged, so a valid proposal only needs @@ -3589,19 +3522,6 @@ pub struct ListProposalInfo { #[prost(bool, optional, tag = "7")] pub omit_large_fields: ::core::option::Option, } -#[derive( - candid::CandidType, - candid::Deserialize, - serde::Serialize, - comparable::Comparable, - Clone, - PartialEq, - ::prost::Message, -)] -pub struct ListProposalInfoResponse { - #[prost(message, repeated, tag = "1")] - pub proposal_info: ::prost::alloc::vec::Vec, -} /// A response to "ListKnownNeurons" #[derive( candid::CandidType, diff --git a/rs/nns/governance/src/governance.rs b/rs/nns/governance/src/governance.rs index cf5f18b2cd0..5dbefc01241 100644 --- a/rs/nns/governance/src/governance.rs +++ b/rs/nns/governance/src/governance.rs @@ -25,43 +25,47 @@ use crate::{ latest_node_provider_rewards, list_node_provider_rewards, record_node_provider_rewards, DateRangeFilter, }, - pb::v1::{ - add_or_remove_node_provider::Change, - archived_monthly_node_provider_rewards, - create_service_nervous_system::LedgerParameters, - get_neurons_fund_audit_info_response, - governance::{ - governance_cached_metrics::NeuronSubsetMetrics as NeuronSubsetMetricsPb, - neuron_in_flight_command::{Command as InFlightCommand, SyncCommand}, - GovernanceCachedMetrics, NeuronInFlightCommand, - }, - governance_error::ErrorType, - manage_neuron, - manage_neuron::{ - claim_or_refresh::{By, MemoAndController}, - ClaimOrRefresh, Command, NeuronIdOrSubaccount, + pb::{ + proposal_conversions::{convert_proposal, proposal_data_to_info}, + v1::{ + add_or_remove_node_provider::Change, + archived_monthly_node_provider_rewards, + create_service_nervous_system::LedgerParameters, + get_neurons_fund_audit_info_response, + governance::{ + governance_cached_metrics::NeuronSubsetMetrics as NeuronSubsetMetricsPb, + neuron_in_flight_command::{Command as InFlightCommand, SyncCommand}, + GovernanceCachedMetrics, NeuronInFlightCommand, + }, + governance_error::ErrorType, + manage_neuron::{ + self, + claim_or_refresh::{By, MemoAndController}, + ClaimOrRefresh, Command, NeuronIdOrSubaccount, + }, + neuron::Followees, + neurons_fund_snapshot::NeuronsFundNeuronPortion as NeuronsFundNeuronPortionPb, + proposal::Action, + reward_node_provider::{RewardMode, RewardToAccount}, + settle_neurons_fund_participation_request, + settle_neurons_fund_participation_response::{ + self, NeuronsFundNeuron as NeuronsFundNeuronPb, + }, + swap_background_information, ArchivedMonthlyNodeProviderRewards, Ballot, + CreateServiceNervousSystem, ExecuteNnsFunction, GetNeuronsFundAuditInfoRequest, + GetNeuronsFundAuditInfoResponse, Governance as GovernanceProto, GovernanceError, + InstallCode, KnownNeuron, ListKnownNeuronsResponse, ListProposalInfo, ManageNeuron, + MonthlyNodeProviderRewards, Motion, NetworkEconomics, Neuron as NeuronProto, + NeuronState, NeuronsFundAuditInfo, NeuronsFundData, + NeuronsFundEconomics as NeuronsFundNetworkEconomicsPb, + NeuronsFundParticipation as NeuronsFundParticipationPb, + NeuronsFundSnapshot as NeuronsFundSnapshotPb, NnsFunction, NodeProvider, Proposal, + ProposalData, ProposalRewardStatus, ProposalStatus, RestoreAgingSummary, RewardEvent, + RewardNodeProvider, RewardNodeProviders, SettleNeuronsFundParticipationRequest, + SettleNeuronsFundParticipationResponse, StopOrStartCanister, Tally, Topic, + UpdateCanisterSettings, UpdateNodeProvider, Visibility, Vote, VotingPowerEconomics, + WaitForQuietState, XdrConversionRate as XdrConversionRatePb, }, - neuron::Followees, - neurons_fund_snapshot::NeuronsFundNeuronPortion as NeuronsFundNeuronPortionPb, - proposal, - proposal::Action, - reward_node_provider::{RewardMode, RewardToAccount}, - settle_neurons_fund_participation_request, settle_neurons_fund_participation_response, - settle_neurons_fund_participation_response::NeuronsFundNeuron as NeuronsFundNeuronPb, - swap_background_information, ArchivedMonthlyNodeProviderRewards, Ballot, - CreateServiceNervousSystem, ExecuteNnsFunction, GetNeuronsFundAuditInfoRequest, - GetNeuronsFundAuditInfoResponse, Governance as GovernanceProto, GovernanceError, - InstallCode, KnownNeuron, ListKnownNeuronsResponse, ListProposalInfo, - ListProposalInfoResponse, ManageNeuron, MonthlyNodeProviderRewards, Motion, - NetworkEconomics, Neuron as NeuronProto, NeuronState, NeuronsFundAuditInfo, - NeuronsFundData, NeuronsFundEconomics as NeuronsFundNetworkEconomicsPb, - NeuronsFundParticipation as NeuronsFundParticipationPb, - NeuronsFundSnapshot as NeuronsFundSnapshotPb, NnsFunction, NodeProvider, Proposal, - ProposalData, ProposalInfo, ProposalRewardStatus, ProposalStatus, RestoreAgingSummary, - RewardEvent, RewardNodeProvider, RewardNodeProviders, - SettleNeuronsFundParticipationRequest, SettleNeuronsFundParticipationResponse, - StopOrStartCanister, Tally, Topic, UpdateCanisterSettings, UpdateNodeProvider, Visibility, - Vote, VotingPowerEconomics, WaitForQuietState, XdrConversionRate as XdrConversionRatePb, }, proposals::{call_canister::CallCanister, sum_weighted_voting_power}, }; @@ -96,7 +100,8 @@ use ic_nns_governance_api::{ self as api, manage_neuron_response::{self, MergeMaturityResponse, StakeMaturityResponse}, CreateServiceNervousSystem as ApiCreateServiceNervousSystem, ListNeurons, - ListNeuronsResponse, ManageNeuronResponse, NeuronInfo, + ListNeuronsResponse, ListProposalInfoResponse, ManageNeuronResponse, NeuronInfo, + ProposalInfo, }, proposal_validation, subnet_rental::SubnetRentalRequest, @@ -911,13 +916,6 @@ impl Proposal { .as_ref() .is_some_and(|a| a.allowed_when_resources_are_low()) } - - fn omit_large_fields(self) -> Self { - Proposal { - action: self.action.map(|action| action.omit_large_fields()), - ..self - } - } } impl Action { @@ -965,32 +963,6 @@ impl Action { _ => false, } } - - fn omit_large_fields(self) -> Self { - match self { - Action::CreateServiceNervousSystem(create_service_nervous_system) => { - Action::CreateServiceNervousSystem(CreateServiceNervousSystem { - ledger_parameters: create_service_nervous_system.ledger_parameters.map( - |ledger_parameters| LedgerParameters { - token_logo: None, - ..ledger_parameters - }, - ), - logo: None, - ..create_service_nervous_system - }) - } - Action::ExecuteNnsFunction(mut execute_nns_function) => { - if execute_nns_function.payload.len() - > EXECUTE_NNS_FUNCTION_PAYLOAD_LISTING_BYTES_MAX - { - execute_nns_function.payload.clear(); - } - Action::ExecuteNnsFunction(execute_nns_function) - } - action => action, - } - } } impl ProposalData { @@ -1315,15 +1287,6 @@ impl ProposalData { } } -impl ProposalInfo { - fn omit_large_fields(self) -> Self { - ProposalInfo { - proposal: self.proposal.map(|proposal| proposal.omit_large_fields()), - ..self - } - } -} - #[cfg(test)] mod test_wait_for_quiet { use crate::pb::v1::{ProposalData, Tally, WaitForQuietState}; @@ -2303,6 +2266,8 @@ impl Governance { let mut implicitly_requested_neuron_ids = if *include_neurons_readable_by_caller { if include_empty_neurons_readable_by_caller { self.get_neuron_ids_by_principal(&caller) + .into_iter() + .collect() } else { self.neuron_store .get_non_empty_neuron_ids_readable_by_caller(caller) @@ -3765,16 +3730,22 @@ impl Governance { caller: &PrincipalId, pid: impl Into, ) -> Option { - let proposal_data = self.heap_data.proposals.get(&pid.into().id); - match proposal_data { - None => None, - Some(pd) => { - let caller_neurons: BTreeSet = - self.neuron_store.get_neuron_ids_readable_by_caller(*caller); - let now = self.env.now(); - Some(self.proposal_data_to_info(pd, &caller_neurons, now, false)) - } - } + let now_seconds = self.env.now(); + let caller_neurons = self.get_neuron_ids_by_principal(caller); + let voting_period_seconds = self.voting_period_seconds(); + self.heap_data + .proposals + .get(&pid.into().id) + .map(|proposal_data| { + proposal_data_to_info( + proposal_data, + false, + false, + &caller_neurons, + now_seconds, + voting_period_seconds, + ) + }) } /// Tries to get the Neurons' Fund participation data for an SNS Swap created via given proposal. @@ -3855,20 +3826,23 @@ impl Governance { /// retrieve dropped payloads by calling `get_proposal_info` for /// each proposal of interest. pub fn get_pending_proposals(&self, caller: &PrincipalId) -> Vec { - let caller_neurons: BTreeSet = - self.neuron_store.get_neuron_ids_readable_by_caller(*caller); let now = self.env.now(); - self.get_pending_proposals_data() - .map(|data| self.proposal_data_to_info(data, &caller_neurons, now, true)) - .collect() - } - - /// Iterator over proposals info of pending proposals. - pub fn get_pending_proposals_data(&self) -> impl Iterator { + let caller_neurons = self.get_neuron_ids_by_principal(caller); self.heap_data .proposals .values() .filter(|data| data.status() == ProposalStatus::Open) + .map(|data| { + proposal_data_to_info( + data, + true, + false, + &caller_neurons, + now, + self.voting_period_seconds(), + ) + }) + .collect() } // Gets the raw proposal data @@ -3890,76 +3864,6 @@ impl Governance { ) } - fn proposal_data_to_info( - &self, - data: &ProposalData, - caller_neurons: &BTreeSet, - now_seconds: u64, - multi_query: bool, - ) -> ProposalInfo { - // Calculate derived fields - let topic = data.topic(); - let status = data.status(); - let voting_period_seconds = self.voting_period_seconds()(topic); - let reward_status = data.reward_status(now_seconds, voting_period_seconds); - - // For multi-queries, large fields such as WASM blobs need to be omitted. Otherwise the - // message limit will be exceeded. - let proposal = if multi_query { - if let Some( - proposal @ Proposal { - action: Some(proposal::Action::ExecuteNnsFunction(_)), - .. - }, - ) = data.proposal.clone() - { - Some(proposal.omit_large_fields()) - } else { - data.proposal.clone() - } - } else { - data.proposal.clone() - }; - - /// Remove all ballots except the ballots belonging to a neuron present - /// in `except_from`. - fn remove_ballots_not_cast_by( - all_ballots: &HashMap, - except_from: &BTreeSet, - ) -> HashMap { - let mut ballots = HashMap::new(); - for neuron_id in except_from.iter() { - if let Some(v) = all_ballots.get(&neuron_id.id) { - ballots.insert(neuron_id.id, *v); - } - } - ballots - } - - ProposalInfo { - id: data.id, - proposer: data.proposer, - reject_cost_e8s: data.reject_cost_e8s, - proposal, - proposal_timestamp_seconds: data.proposal_timestamp_seconds, - ballots: remove_ballots_not_cast_by(&data.ballots, caller_neurons), - latest_tally: data.latest_tally, - decided_timestamp_seconds: data.decided_timestamp_seconds, - executed_timestamp_seconds: data.executed_timestamp_seconds, - failed_timestamp_seconds: data.failed_timestamp_seconds, - failure_reason: data.failure_reason.clone(), - reward_event_round: data.reward_event_round, - topic: topic as i32, - status: status as i32, - reward_status: reward_status as i32, - deadline_timestamp_seconds: Some( - data.get_deadline_timestamp_seconds(voting_period_seconds), - ), - derived_proposal_information: data.derived_proposal_information.clone(), - total_potential_voting_power: data.total_potential_voting_power, - } - } - /// Return true if the 'info' proposal is visible to some of the neurons in /// 'caller_neurons'. fn proposal_is_visible_to_neurons( @@ -4035,12 +3939,11 @@ impl Governance { caller: &PrincipalId, req: &ListProposalInfo, ) -> ListProposalInfoResponse { - let caller_neurons: BTreeSet = - self.neuron_store.get_neuron_ids_readable_by_caller(*caller); let exclude_topic: HashSet = req.exclude_topic.iter().cloned().collect(); let include_reward_status: HashSet = req.include_reward_status.iter().cloned().collect(); let include_status: HashSet = req.include_status.iter().cloned().collect(); + let caller_neurons = self.get_neuron_ids_by_principal(caller); let now = self.env.now(); let proposal_matches_request = |data: &ProposalData| -> bool { let topic = data.topic(); @@ -4085,23 +3988,21 @@ impl Governance { let proposals = proposals .rev() .filter(|(_, x)| proposal_matches_request(x)) - .take(limit); - - let proposal_info = proposals - .map(|(_, y)| y) - .map(|pd| self.proposal_data_to_info(pd, &caller_neurons, now, true)) - .collect::>(); - - let proposal_info = if req.omit_large_fields() { - proposal_info - .into_iter() - .map(|data| data.omit_large_fields()) - .collect() - } else { - proposal_info - }; - - ListProposalInfoResponse { proposal_info } + .take(limit) + .map(|(_, proposal_data)| { + proposal_data_to_info( + proposal_data, + true, + req.omit_large_fields(), + &caller_neurons, + now, + self.voting_period_seconds(), + ) + }) + .collect(); + ListProposalInfoResponse { + proposal_info: proposals, + } } // This is slow, because it scans all proposals. @@ -5192,9 +5093,9 @@ impl Governance { Err(format!("Topic not specified. proposal: {:#?}", proposal))?; } - proposal_validation::validate_user_submitted_proposal_fields( - &ic_nns_governance_api::pb::v1::Proposal::from(proposal.clone()), - )?; + proposal_validation::validate_user_submitted_proposal_fields(&convert_proposal( + proposal, true, + ))?; if !proposal.allowed_when_resources_are_low() { self.check_heap_can_grow()?; diff --git a/rs/nns/governance/src/governance/benches.rs b/rs/nns/governance/src/governance/benches.rs index f0c5c6902a3..74d64b57aa3 100644 --- a/rs/nns/governance/src/governance/benches.rs +++ b/rs/nns/governance/src/governance/benches.rs @@ -674,8 +674,7 @@ fn list_proposals_benchmark() -> BenchResult { } bench_fn(|| { - let response = governance.list_proposals(&PrincipalId::new_anonymous(), &request); - let _ = ic_nns_governance_api::pb::v1::ListProposalInfoResponse::from(response); + let _ = governance.list_proposals(&PrincipalId::new_anonymous(), &request); }) } diff --git a/rs/nns/governance/src/pb/conversions.rs b/rs/nns/governance/src/pb/conversions.rs index 7431fb88e7c..c84e951c1f9 100644 --- a/rs/nns/governance/src/pb/conversions.rs +++ b/rs/nns/governance/src/pb/conversions.rs @@ -2,6 +2,8 @@ use crate::pb::v1 as pb; use ic_crypto_sha2::Sha256; use ic_nns_governance_api::pb::v1 as pb_api; +use crate::pb::proposal_conversions::convert_proposal; + impl From for pb_api::NodeProvider { fn from(item: pb::NodeProvider) -> Self { Self { @@ -437,16 +439,6 @@ impl From for pb::SetSnsTokenSwapOpenTime } } -impl From for pb_api::Proposal { - fn from(item: pb::Proposal) -> Self { - Self { - title: item.title, - summary: item.summary, - url: item.url, - action: item.action.map(|x| x.into()), - } - } -} impl From for pb::Proposal { fn from(item: pb_api::Proposal) -> Self { Self { @@ -468,56 +460,6 @@ impl From for pb::Proposal { } } -impl From for pb_api::proposal::Action { - fn from(item: pb::proposal::Action) -> Self { - match item { - pb::proposal::Action::ManageNeuron(v) => { - pb_api::proposal::Action::ManageNeuron(Box::new((*v).into())) - } - pb::proposal::Action::ManageNetworkEconomics(v) => { - pb_api::proposal::Action::ManageNetworkEconomics(v.into()) - } - pb::proposal::Action::Motion(v) => pb_api::proposal::Action::Motion(v.into()), - pb::proposal::Action::ExecuteNnsFunction(v) => { - pb_api::proposal::Action::ExecuteNnsFunction(v.into()) - } - pb::proposal::Action::ApproveGenesisKyc(v) => { - pb_api::proposal::Action::ApproveGenesisKyc(v.into()) - } - pb::proposal::Action::AddOrRemoveNodeProvider(v) => { - pb_api::proposal::Action::AddOrRemoveNodeProvider(v.into()) - } - pb::proposal::Action::RewardNodeProvider(v) => { - pb_api::proposal::Action::RewardNodeProvider(v.into()) - } - pb::proposal::Action::SetDefaultFollowees(v) => { - pb_api::proposal::Action::SetDefaultFollowees(v.into()) - } - pb::proposal::Action::RewardNodeProviders(v) => { - pb_api::proposal::Action::RewardNodeProviders(v.into()) - } - pb::proposal::Action::RegisterKnownNeuron(v) => { - pb_api::proposal::Action::RegisterKnownNeuron(v.into()) - } - pb::proposal::Action::SetSnsTokenSwapOpenTimeWindow(v) => { - pb_api::proposal::Action::SetSnsTokenSwapOpenTimeWindow(v.into()) - } - pb::proposal::Action::OpenSnsTokenSwap(v) => { - pb_api::proposal::Action::OpenSnsTokenSwap(v.into()) - } - pb::proposal::Action::CreateServiceNervousSystem(v) => { - pb_api::proposal::Action::CreateServiceNervousSystem(v.into()) - } - pb::proposal::Action::InstallCode(v) => pb_api::proposal::Action::InstallCode(v.into()), - pb::proposal::Action::StopOrStartCanister(v) => { - pb_api::proposal::Action::StopOrStartCanister(v.into()) - } - pb::proposal::Action::UpdateCanisterSettings(v) => { - pb_api::proposal::Action::UpdateCanisterSettings(v.into()) - } - } - } -} impl From for pb::proposal::Action { fn from(item: pb_api::proposal::Action) -> Self { match item { @@ -1164,7 +1106,7 @@ impl From for pb_api::manage_neuron::Command { pb_api::manage_neuron::Command::Follow(v.into()) } pb::manage_neuron::Command::MakeProposal(v) => { - pb_api::manage_neuron::Command::MakeProposal(Box::new((*v).into())) + pb_api::manage_neuron::Command::MakeProposal(Box::new(convert_proposal(&v, false))) } pb::manage_neuron::Command::RegisterVote(v) => { pb_api::manage_neuron::Command::RegisterVote(v.into()) @@ -1460,7 +1402,7 @@ impl From for pb_api::ProposalData { id: item.id, proposer: item.proposer, reject_cost_e8s: item.reject_cost_e8s, - proposal: item.proposal.map(|x| x.into()), + proposal: item.proposal.map(|x| convert_proposal(&x, false)), proposal_timestamp_seconds: item.proposal_timestamp_seconds, ballots: item .ballots @@ -1941,64 +1883,6 @@ impl From for pb::WaitForQuietState { } } -impl From for pb_api::ProposalInfo { - fn from(item: pb::ProposalInfo) -> Self { - Self { - id: item.id, - proposer: item.proposer, - reject_cost_e8s: item.reject_cost_e8s, - proposal: item.proposal.map(|x| x.into()), - proposal_timestamp_seconds: item.proposal_timestamp_seconds, - ballots: item - .ballots - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - latest_tally: item.latest_tally.map(|x| x.into()), - decided_timestamp_seconds: item.decided_timestamp_seconds, - executed_timestamp_seconds: item.executed_timestamp_seconds, - failed_timestamp_seconds: item.failed_timestamp_seconds, - failure_reason: item.failure_reason.map(|x| x.into()), - reward_event_round: item.reward_event_round, - topic: item.topic, - status: item.status, - reward_status: item.reward_status, - deadline_timestamp_seconds: item.deadline_timestamp_seconds, - derived_proposal_information: item.derived_proposal_information.map(|x| x.into()), - total_potential_voting_power: item.total_potential_voting_power, - } - } -} - -impl From for pb::ProposalInfo { - fn from(item: pb_api::ProposalInfo) -> Self { - Self { - id: item.id, - proposer: item.proposer, - reject_cost_e8s: item.reject_cost_e8s, - proposal: item.proposal.map(|x| x.into()), - proposal_timestamp_seconds: item.proposal_timestamp_seconds, - ballots: item - .ballots - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - latest_tally: item.latest_tally.map(|x| x.into()), - decided_timestamp_seconds: item.decided_timestamp_seconds, - executed_timestamp_seconds: item.executed_timestamp_seconds, - failed_timestamp_seconds: item.failed_timestamp_seconds, - failure_reason: item.failure_reason.map(|x| x.into()), - reward_event_round: item.reward_event_round, - topic: item.topic, - status: item.status, - reward_status: item.reward_status, - deadline_timestamp_seconds: item.deadline_timestamp_seconds, - derived_proposal_information: item.derived_proposal_information.map(|x| x.into()), - total_potential_voting_power: item.total_potential_voting_power, - } - } -} - impl From for pb_api::NetworkEconomics { fn from(item: pb::NetworkEconomics) -> Self { Self { @@ -2752,62 +2636,6 @@ impl From } } -impl From for pb_api::Governance { - fn from(item: pb::Governance) -> Self { - Self { - neurons: item - .neurons - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - proposals: item - .proposals - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - to_claim_transfers: item - .to_claim_transfers - .into_iter() - .map(|x| x.into()) - .collect(), - wait_for_quiet_threshold_seconds: item.wait_for_quiet_threshold_seconds, - economics: item.economics.map(|x| x.into()), - latest_reward_event: item.latest_reward_event.map(|x| x.into()), - in_flight_commands: item - .in_flight_commands - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - genesis_timestamp_seconds: item.genesis_timestamp_seconds, - node_providers: item.node_providers.into_iter().map(|x| x.into()).collect(), - default_followees: item - .default_followees - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - short_voting_period_seconds: item.short_voting_period_seconds, - neuron_management_voting_period_seconds: item.neuron_management_voting_period_seconds, - metrics: item.metrics.map(|x| x.into()), - most_recent_monthly_node_provider_rewards: item - .most_recent_monthly_node_provider_rewards - .map(|x| x.into()), - cached_daily_maturity_modulation_basis_points: item - .cached_daily_maturity_modulation_basis_points, - maturity_modulation_last_updated_at_timestamp_seconds: item - .maturity_modulation_last_updated_at_timestamp_seconds, - spawning_neurons: item.spawning_neurons, - making_sns_proposal: item.making_sns_proposal.map(|x| x.into()), - migrations: item.migrations.map(|x| x.into()), - topic_followee_index: item - .topic_followee_index - .into_iter() - .map(|(k, v)| (k, v.into())) - .collect(), - xdr_conversion_rate: item.xdr_conversion_rate.map(|x| x.into()), - restore_aging_summary: item.restore_aging_summary.map(|x| x.into()), - } - } -} impl From for pb::Governance { fn from(item: pb_api::Governance) -> Self { Self { @@ -3154,15 +2982,6 @@ impl From } } -impl From for pb_api::governance::MakingSnsProposal { - fn from(item: pb::governance::MakingSnsProposal) -> Self { - Self { - proposer_id: item.proposer_id, - caller: item.caller, - proposal: item.proposal.map(|x| x.into()), - } - } -} impl From for pb::governance::MakingSnsProposal { fn from(item: pb_api::governance::MakingSnsProposal) -> Self { Self { @@ -3359,21 +3178,6 @@ impl From for pb::ListProposalInfo { } } -impl From for pb_api::ListProposalInfoResponse { - fn from(item: pb::ListProposalInfoResponse) -> Self { - Self { - proposal_info: item.proposal_info.into_iter().map(|x| x.into()).collect(), - } - } -} -impl From for pb::ListProposalInfoResponse { - fn from(item: pb_api::ListProposalInfoResponse) -> Self { - Self { - proposal_info: item.proposal_info.into_iter().map(|x| x.into()).collect(), - } - } -} - impl From for pb_api::ListKnownNeuronsResponse { fn from(item: pb::ListKnownNeuronsResponse) -> Self { Self { diff --git a/rs/nns/governance/src/pb/mod.rs b/rs/nns/governance/src/pb/mod.rs index d371cb96a5e..8aee644076d 100644 --- a/rs/nns/governance/src/pb/mod.rs +++ b/rs/nns/governance/src/pb/mod.rs @@ -9,6 +9,7 @@ pub mod v1; mod conversions; mod convert_struct_to_enum; +pub mod proposal_conversions; impl Storable for ArchivedMonthlyNodeProviderRewards { fn to_bytes(&self) -> Cow<'_, [u8]> { @@ -24,6 +25,3 @@ impl Storable for ArchivedMonthlyNodeProviderRewards { const BOUND: Bound = Bound::Unbounded; } - -#[cfg(test)] -mod tests; diff --git a/rs/nns/governance/src/pb/proposal_conversions.rs b/rs/nns/governance/src/pb/proposal_conversions.rs new file mode 100644 index 00000000000..6985d4be381 --- /dev/null +++ b/rs/nns/governance/src/pb/proposal_conversions.rs @@ -0,0 +1,361 @@ +use crate::{governance::EXECUTE_NNS_FUNCTION_PAYLOAD_LISTING_BYTES_MAX, pb::v1 as pb}; + +use ic_nns_common::pb::v1::NeuronId; +use ic_nns_governance_api::pb::v1 as pb_api; +use std::collections::{BTreeSet, HashMap}; + +fn convert_execute_nns_function( + item: &pb::ExecuteNnsFunction, + omit_large_fields: bool, +) -> pb_api::ExecuteNnsFunction { + let pb::ExecuteNnsFunction { + nns_function, + payload, + } = item; + + let nns_function = *nns_function; + let payload = + if omit_large_fields && payload.len() > EXECUTE_NNS_FUNCTION_PAYLOAD_LISTING_BYTES_MAX { + vec![] + } else { + payload.clone() + }; + + pb_api::ExecuteNnsFunction { + nns_function, + payload, + } +} + +fn convert_install_code(item: &pb::InstallCode) -> pb_api::InstallCode { + let pb::InstallCode { + canister_id, + install_mode, + wasm_module: _, + arg: _, + skip_stopping_before_installing, + wasm_module_hash, + arg_hash, + } = item; + + let canister_id = *canister_id; + let install_mode = *install_mode; + let skip_stopping_before_installing = *skip_stopping_before_installing; + let wasm_module_hash = wasm_module_hash.clone(); + let arg_hash = arg_hash.clone(); + + pb_api::InstallCode { + canister_id, + install_mode, + skip_stopping_before_installing, + wasm_module_hash, + arg_hash, + } +} + +fn convert_ledger_parameters( + item: &pb::create_service_nervous_system::LedgerParameters, + omit_large_fields: bool, +) -> pb_api::create_service_nervous_system::LedgerParameters { + let pb::create_service_nervous_system::LedgerParameters { + transaction_fee, + token_name, + token_symbol, + token_logo, + } = item; + + let transaction_fee = *transaction_fee; + let token_name = token_name.clone(); + let token_symbol = token_symbol.clone(); + + let token_logo = if omit_large_fields { + None + } else { + token_logo.clone() + }; + + pb_api::create_service_nervous_system::LedgerParameters { + transaction_fee, + token_name, + token_symbol, + token_logo, + } +} + +fn convert_create_service_nervous_system( + item: &pb::CreateServiceNervousSystem, + omit_large_fields: bool, +) -> pb_api::CreateServiceNervousSystem { + let pb::CreateServiceNervousSystem { + name, + description, + url, + logo, + fallback_controller_principal_ids, + dapp_canisters, + initial_token_distribution, + swap_parameters, + ledger_parameters, + governance_parameters, + } = item; + + let name = name.clone(); + let description = description.clone(); + let url = url.clone(); + let fallback_controller_principal_ids = fallback_controller_principal_ids.clone(); + let dapp_canisters = dapp_canisters.clone(); + let initial_token_distribution = initial_token_distribution.clone().map(|x| x.into()); + let swap_parameters = swap_parameters.clone().map(|x| x.into()); + let governance_parameters = governance_parameters.map(|x| x.into()); + + let logo = if omit_large_fields { + None + } else { + logo.clone() + }; + let ledger_parameters = ledger_parameters + .as_ref() + .map(|ledger_parameters| convert_ledger_parameters(ledger_parameters, omit_large_fields)); + + pb_api::CreateServiceNervousSystem { + name, + description, + url, + logo, + fallback_controller_principal_ids, + dapp_canisters, + initial_token_distribution, + swap_parameters, + ledger_parameters, + governance_parameters, + } +} + +fn convert_action( + item: &pb::proposal::Action, + omit_large_fields: bool, +) -> pb_api::proposal::Action { + match item { + // Trivial conversions + pb::proposal::Action::ManageNeuron(v) => { + pb_api::proposal::Action::ManageNeuron(Box::new(v.as_ref().clone().into())) + } + pb::proposal::Action::ManageNetworkEconomics(v) => { + pb_api::proposal::Action::ManageNetworkEconomics(v.clone().into()) + } + pb::proposal::Action::Motion(v) => pb_api::proposal::Action::Motion(v.clone().into()), + pb::proposal::Action::ApproveGenesisKyc(v) => { + pb_api::proposal::Action::ApproveGenesisKyc(v.clone().into()) + } + pb::proposal::Action::AddOrRemoveNodeProvider(v) => { + pb_api::proposal::Action::AddOrRemoveNodeProvider(v.clone().into()) + } + pb::proposal::Action::RewardNodeProvider(v) => { + pb_api::proposal::Action::RewardNodeProvider(v.clone().into()) + } + pb::proposal::Action::SetDefaultFollowees(v) => { + pb_api::proposal::Action::SetDefaultFollowees(v.clone().into()) + } + pb::proposal::Action::RewardNodeProviders(v) => { + pb_api::proposal::Action::RewardNodeProviders(v.clone().into()) + } + pb::proposal::Action::RegisterKnownNeuron(v) => { + pb_api::proposal::Action::RegisterKnownNeuron(v.clone().into()) + } + pb::proposal::Action::SetSnsTokenSwapOpenTimeWindow(v) => { + pb_api::proposal::Action::SetSnsTokenSwapOpenTimeWindow(v.clone().into()) + } + pb::proposal::Action::OpenSnsTokenSwap(v) => { + pb_api::proposal::Action::OpenSnsTokenSwap(v.clone().into()) + } + pb::proposal::Action::StopOrStartCanister(v) => { + pb_api::proposal::Action::StopOrStartCanister(v.clone().into()) + } + pb::proposal::Action::UpdateCanisterSettings(v) => { + pb_api::proposal::Action::UpdateCanisterSettings(v.clone().into()) + } + + // The action types with potentially large fields need to be converted in a way that avoids + // cloning the action first. + pb::proposal::Action::InstallCode(v) => { + pb_api::proposal::Action::InstallCode(convert_install_code(v)) + } + pb::proposal::Action::ExecuteNnsFunction(v) => { + pb_api::proposal::Action::ExecuteNnsFunction(convert_execute_nns_function( + v, + omit_large_fields, + )) + } + pb::proposal::Action::CreateServiceNervousSystem(v) => { + pb_api::proposal::Action::CreateServiceNervousSystem( + convert_create_service_nervous_system(v, omit_large_fields), + ) + } + } +} + +pub fn convert_proposal(item: &pb::Proposal, omit_large_fields: bool) -> pb_api::Proposal { + let pb::Proposal { + title, + summary, + url, + action, + } = item; + + // Convert (relatively) small fields + let title = title.clone(); + let summary = summary.clone(); + let url = url.clone(); + + // Convert action which is potentially large. + let action = action + .as_ref() + .map(|x| convert_action(x, omit_large_fields)); + + pb_api::Proposal { + title, + summary, + url, + action, + } +} + +fn convert_ballots( + all_ballots: &HashMap, + caller_neurons: &BTreeSet, +) -> HashMap { + let mut ballots = HashMap::new(); + for neuron_id in caller_neurons.iter() { + if let Some(v) = all_ballots.get(&neuron_id.id) { + ballots.insert(neuron_id.id, (*v).into()); + } + } + ballots +} + +pub fn proposal_data_to_info( + data: &pb::ProposalData, + multi_query: bool, + omit_large_fields_requested: bool, + caller_neurons: &BTreeSet, + now_seconds: u64, + voting_period_seconds: impl Fn(pb::Topic) -> u64, +) -> pb_api::ProposalInfo { + // Calculate derived fields + let topic = data.topic() as i32; + let status = data.status() as i32; + let reward_status = data.reward_status(now_seconds, voting_period_seconds(data.topic())) as i32; + let deadline_timestamp_seconds = + Some(data.get_deadline_timestamp_seconds(voting_period_seconds(data.topic()))); + + // Trivially convert fields + let id = data.id; + let proposer = data.proposer; + let reject_cost_e8s = data.reject_cost_e8s; + let proposal_timestamp_seconds = data.proposal_timestamp_seconds; + let latest_tally = data.latest_tally.map(|x| x.into()); + let decided_timestamp_seconds = data.decided_timestamp_seconds; + let executed_timestamp_seconds = data.executed_timestamp_seconds; + let failed_timestamp_seconds = data.failed_timestamp_seconds; + let failure_reason = data.failure_reason.clone().map(|x| x.into()); + let reward_event_round = data.reward_event_round; + let derived_proposal_information = data.derived_proposal_information.clone().map(|x| x.into()); + let total_potential_voting_power = data.total_potential_voting_power; + + // Convert proposal which is potentially large. + let proposal_action = data + .proposal + .as_ref() + .and_then(|proposal| proposal.action.as_ref()); + let omit_large_fields = match (multi_query, proposal_action) { + // When not doing a multi-query (i.e. querying a single proposal), we never omit large + // fields. + (false, _) => false, + // Proposals which might contain WASM code are always omitted in multi-queries. + (true, Some(pb::proposal::Action::ExecuteNnsFunction(_))) => true, + // Otherwise, we respect the request for omitting large fields. + (true, _) => omit_large_fields_requested, + }; + let proposal = data + .proposal + .as_ref() + .map(|x| convert_proposal(x, omit_large_fields)); + + // Convert ballots which are potentially large. + let ballots = convert_ballots(&data.ballots, caller_neurons); + + pb_api::ProposalInfo { + id, + proposer, + reject_cost_e8s, + proposal, + proposal_timestamp_seconds, + ballots, + latest_tally, + decided_timestamp_seconds, + executed_timestamp_seconds, + failed_timestamp_seconds, + failure_reason, + reward_event_round, + topic, + status, + reward_status, + deadline_timestamp_seconds, + derived_proposal_information, + total_potential_voting_power, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use ic_base_types::PrincipalId; + use ic_crypto_sha2::Sha256; + + #[test] + fn install_code_request_to_internal() { + let test_cases = vec![ + ( + pb_api::InstallCodeRequest { + canister_id: Some(PrincipalId::new_user_test_id(1)), + install_mode: Some(pb::install_code::CanisterInstallMode::Install as i32), + skip_stopping_before_installing: None, + wasm_module: Some(vec![1, 2, 3]), + arg: Some(vec![]), + }, + pb::InstallCode { + canister_id: Some(PrincipalId::new_user_test_id(1)), + install_mode: Some(pb_api::install_code::CanisterInstallMode::Install as i32), + skip_stopping_before_installing: None, + wasm_module: Some(vec![1, 2, 3]), + arg: Some(vec![]), + wasm_module_hash: Some(Sha256::hash(&[1, 2, 3]).to_vec()), + arg_hash: Some(vec![]), + }, + ), + ( + pb_api::InstallCodeRequest { + canister_id: Some(PrincipalId::new_user_test_id(1)), + install_mode: Some(pb::install_code::CanisterInstallMode::Upgrade as i32), + skip_stopping_before_installing: Some(true), + wasm_module: Some(vec![1, 2, 3]), + arg: Some(vec![4, 5, 6]), + }, + pb::InstallCode { + canister_id: Some(PrincipalId::new_user_test_id(1)), + install_mode: Some(pb_api::install_code::CanisterInstallMode::Upgrade as i32), + skip_stopping_before_installing: Some(true), + wasm_module: Some(vec![1, 2, 3]), + arg: Some(vec![4, 5, 6]), + wasm_module_hash: Some(Sha256::hash(&[1, 2, 3]).to_vec()), + arg_hash: Some(Sha256::hash(&[4, 5, 6]).to_vec()), + }, + ), + ]; + + for (request, internal) in test_cases { + assert_eq!(pb::InstallCode::from(request), internal); + } + } +} diff --git a/rs/nns/governance/src/pb/tests.rs b/rs/nns/governance/src/pb/tests.rs deleted file mode 100644 index 25600820f30..00000000000 --- a/rs/nns/governance/src/pb/tests.rs +++ /dev/null @@ -1,50 +0,0 @@ -use crate::pb::v1 as pb; - -use ic_base_types::PrincipalId; -use ic_crypto_sha2::Sha256; -use ic_nns_governance_api::pb::v1 as pb_api; - -#[test] -fn install_code_request_to_internal() { - let test_cases = vec![ - ( - pb_api::InstallCodeRequest { - canister_id: Some(PrincipalId::new_user_test_id(1)), - install_mode: Some(pb::install_code::CanisterInstallMode::Install as i32), - skip_stopping_before_installing: None, - wasm_module: Some(vec![1, 2, 3]), - arg: Some(vec![]), - }, - pb::InstallCode { - canister_id: Some(PrincipalId::new_user_test_id(1)), - install_mode: Some(pb_api::install_code::CanisterInstallMode::Install as i32), - skip_stopping_before_installing: None, - wasm_module: Some(vec![1, 2, 3]), - arg: Some(vec![]), - wasm_module_hash: Some(Sha256::hash(&[1, 2, 3]).to_vec()), - arg_hash: Some(vec![]), - }, - ), - ( - pb_api::InstallCodeRequest { - canister_id: Some(PrincipalId::new_user_test_id(1)), - install_mode: Some(pb::install_code::CanisterInstallMode::Upgrade as i32), - skip_stopping_before_installing: Some(true), - wasm_module: Some(vec![1, 2, 3]), - arg: Some(vec![4, 5, 6]), - }, - pb::InstallCode { - canister_id: Some(PrincipalId::new_user_test_id(1)), - install_mode: Some(pb_api::install_code::CanisterInstallMode::Upgrade as i32), - skip_stopping_before_installing: Some(true), - wasm_module: Some(vec![1, 2, 3]), - arg: Some(vec![4, 5, 6]), - wasm_module_hash: Some(Sha256::hash(&[1, 2, 3]).to_vec()), - arg_hash: Some(Sha256::hash(&[4, 5, 6]).to_vec()), - }, - ), - ]; - for (request, internal) in test_cases { - assert_eq!(pb::InstallCode::from(request), internal); - } -} diff --git a/rs/nns/governance/tests/governance.rs b/rs/nns/governance/tests/governance.rs index 99d0653c406..b431e34ea35 100644 --- a/rs/nns/governance/tests/governance.rs +++ b/rs/nns/governance/tests/governance.rs @@ -83,10 +83,10 @@ use ic_nns_governance::{ AddOrRemoveNodeProvider, Ballot, BallotChange, BallotInfo, BallotInfoChange, CreateServiceNervousSystem, Empty, ExecuteNnsFunction, Governance as GovernanceProto, GovernanceChange, GovernanceError, IdealMatchedParticipationFunction, InstallCode, - KnownNeuron, KnownNeuronData, ListProposalInfo, ListProposalInfoResponse, ManageNeuron, - MonthlyNodeProviderRewards, Motion, NetworkEconomics, Neuron, NeuronChange, NeuronType, - NeuronsFundData, NeuronsFundParticipation, NeuronsFundSnapshot, NnsFunction, NodeProvider, - Proposal, ProposalChange, ProposalData, ProposalDataChange, + KnownNeuron, KnownNeuronData, ListProposalInfo, ManageNeuron, MonthlyNodeProviderRewards, + Motion, NetworkEconomics, Neuron, NeuronChange, NeuronType, NeuronsFundData, + NeuronsFundParticipation, NeuronsFundSnapshot, NnsFunction, NodeProvider, Proposal, + ProposalChange, ProposalData, ProposalDataChange, ProposalRewardStatus::{self, AcceptVotes, ReadyToSettle}, ProposalStatus::{self, Rejected}, RewardEvent, RewardNodeProvider, RewardNodeProviders, @@ -102,8 +102,10 @@ use ic_nns_governance_api::{ pb::v1::{ self as api, manage_neuron_response::{self, Command as CommandResponse, ConfigureResponse}, - CreateServiceNervousSystem as ApiCreateServiceNervousSystem, ListNeurons, - ListNeuronsResponse, ManageNeuronResponse, NeuronState, + proposal::Action as ApiAction, + Ballot as ApiBallot, CreateServiceNervousSystem as ApiCreateServiceNervousSystem, + ListNeurons, ListNeuronsResponse, ListProposalInfoResponse, ManageNeuronResponse, + NeuronState, }, proposal_validation::validate_proposal_title, }; @@ -4473,23 +4475,23 @@ fn test_get_neuron_ids_by_principal() { assert_eq!( gov.get_neuron_ids_by_principal(&principal1), - btreeset![NeuronId { id: 1 }] + btreeset! { NeuronId { id: 1 } } ); assert_eq!( gov.get_neuron_ids_by_principal(&principal2), - btreeset![NeuronId { id: 2 }, NeuronId { id: 3 }, NeuronId { id: 4 }] + btreeset! { NeuronId { id: 2 }, NeuronId { id: 3 }, NeuronId { id: 4 } } ); assert_eq!( gov.get_neuron_ids_by_principal(&principal3), BTreeSet::::new() ); + assert_eq!(gov.get_neuron_ids_by_principal(&principal3), btreeset! {}); assert_eq!( gov.get_neuron_ids_by_principal(&principal4), - btreeset![NeuronId { id: 4 }] + btreeset! { NeuronId { id: 4 } } ); } -/// *Test fixture for general tests* fn empty_fixture() -> GovernanceProto { GovernanceProto { economics: Some(NetworkEconomics::with_default_values()), @@ -4647,7 +4649,7 @@ fn create_mature_neuron(dissolved: bool) -> (fake::FakeDriver, Governance, Neuro ..Default::default() } ); - assert_eq!(gov.get_neuron_ids_by_principal(&from), btreeset![id]); + assert_eq!(gov.get_neuron_ids_by_principal(&from), btreeset! { id }); // Dissolve the neuron if `dissolved` is true if dissolved { @@ -5791,7 +5793,7 @@ fn test_neuron_split() { ); let neuron_ids = governance.get_neuron_ids_by_principal(&from); - let expected_neuron_ids = btreeset![id, child_nid]; + let expected_neuron_ids = btreeset! { id, child_nid }; assert_eq!(neuron_ids, expected_neuron_ids); } @@ -7344,7 +7346,12 @@ fn test_manage_and_reward_node_providers() { let info = gov .get_proposal_info(&PrincipalId::new_anonymous(), pid) .unwrap(); - assert_eq!(info.status(), ProposalStatus::Failed, "info: {:?}", info); + assert_eq!( + info.status, + ProposalStatus::Failed as i32, + "info: {:?}", + info + ); assert_eq!( info.failure_reason.as_ref().unwrap().error_type, ErrorType::NotFound as i32, @@ -7695,7 +7702,12 @@ fn test_manage_and_reward_multiple_node_providers() { let info = gov .get_proposal_info(&PrincipalId::new_anonymous(), pid) .unwrap(); - assert_eq!(info.status(), ProposalStatus::Failed, "info: {:?}", info); + assert_eq!( + info.status, + ProposalStatus::Failed as i32, + "info: {:?}", + info + ); assert_eq!( info.failure_reason.as_ref().unwrap().error_type, ErrorType::NotFound as i32, @@ -8157,7 +8169,7 @@ fn test_get_proposal_info() { let action = result.proposal.unwrap().action.unwrap(); assert_matches!( action, - proposal::Action::ExecuteNnsFunction(eu) if eu.payload == [1, 2, 3] + ApiAction::ExecuteNnsFunction(eu) if eu.payload == [1, 2, 3] ); } @@ -8195,7 +8207,7 @@ fn test_list_proposals_removes_execute_nns_function_payload() { .unwrap(); assert_matches!( action, - proposal::Action::ExecuteNnsFunction(eu) if eu.payload.is_empty() + ApiAction::ExecuteNnsFunction(eu) if eu.payload.is_empty() ); } @@ -8233,7 +8245,7 @@ fn test_list_proposals_retains_execute_nns_function_payload() { .unwrap(); assert_matches!( action, - proposal::Action::ExecuteNnsFunction(eu) + ApiAction::ExecuteNnsFunction(eu) if eu.payload.len() == EXECUTE_NNS_FUNCTION_PAYLOAD_LISTING_BYTES_MAX ); @@ -8268,7 +8280,7 @@ fn test_get_pending_proposals_removes_execute_nns_function_payload() { .unwrap(); assert_matches!( action, - proposal::Action::ExecuteNnsFunction(eu) if eu.payload.is_empty() + ApiAction::ExecuteNnsFunction(eu) if eu.payload.is_empty() ); } @@ -8927,7 +8939,7 @@ fn test_filter_proposal_ballots() { .proposal_info[0] .ballots, hashmap! { - 1 => Ballot { + 1 => ApiBallot { vote: Vote::Yes as i32, voting_power: 1, }, @@ -8939,7 +8951,7 @@ fn test_filter_proposal_ballots() { .proposal_info[0] .ballots, hashmap! { - 2 => Ballot { + 2 => ApiBallot { vote: Vote::Yes as i32, voting_power: 2, }, @@ -8951,7 +8963,7 @@ fn test_filter_proposal_ballots() { .proposal_info[0] .ballots, hashmap! { - 1 => Ballot { + 1 => ApiBallot { vote: Vote::Yes as i32, voting_power: 1, }, @@ -9101,7 +9113,7 @@ fn test_omit_large_fields() { ); fn get_logo(list_proposals_response: ListProposalInfoResponse) -> Option { - let Action::CreateServiceNervousSystem(create_service_nervous_system) = + let ApiAction::CreateServiceNervousSystem(create_service_nervous_system) = list_proposals_response.proposal_info[0] .proposal .clone() @@ -9205,8 +9217,9 @@ async fn test_max_number_of_proposals_with_ballots() { .unwrap(); } assert_eq!( + gov.get_pending_proposals(&PrincipalId::new_anonymous()) + .len(), MAX_NUMBER_OF_PROPOSALS_WITH_BALLOTS, - gov.get_pending_proposals_data().count() ); // Let's try one more. It should be rejected. assert_matches!(gov.make_proposal( @@ -12022,8 +12035,8 @@ async fn test_known_neurons() { assert_eq!( gov.get_proposal_info(&principal(3), failed_proposal_id) .unwrap() - .status(), - ProposalStatus::Failed + .status, + ProposalStatus::Failed as i32 ); // Check that the state is the same as before the last proposal. diff --git a/rs/nns/integration_tests/src/add_canister.rs b/rs/nns/integration_tests/src/add_canister.rs index 465b42c1ca9..f430c8192ec 100644 --- a/rs/nns/integration_tests/src/add_canister.rs +++ b/rs/nns/integration_tests/src/add_canister.rs @@ -58,8 +58,8 @@ fn add_nns_canister_via_governance_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/add_or_remove_data_centers.rs b/rs/nns/integration_tests/src/add_or_remove_data_centers.rs index 47f2a0589ec..33897255fce 100644 --- a/rs/nns/integration_tests/src/add_or_remove_data_centers.rs +++ b/rs/nns/integration_tests/src/add_or_remove_data_centers.rs @@ -76,8 +76,8 @@ fn test_submit_add_or_remove_data_centers_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. @@ -144,8 +144,8 @@ fn test_submit_add_or_remove_data_centers_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/clear_provisional_whitelist.rs b/rs/nns/integration_tests/src/clear_provisional_whitelist.rs index 8310cf4f3c4..63172b2a04f 100644 --- a/rs/nns/integration_tests/src/clear_provisional_whitelist.rs +++ b/rs/nns/integration_tests/src/clear_provisional_whitelist.rs @@ -85,8 +85,8 @@ fn test_submit_and_accept_clear_provisional_whitelist_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/cycles_minting_canister.rs b/rs/nns/integration_tests/src/cycles_minting_canister.rs index 816d5688816..743b7a04c04 100644 --- a/rs/nns/integration_tests/src/cycles_minting_canister.rs +++ b/rs/nns/integration_tests/src/cycles_minting_canister.rs @@ -99,8 +99,8 @@ async fn set_icp_xdr_conversion_rate( assert_eq!( wait_for_final_state(&nns.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); let response: IcpXdrConversionRateCertifiedResponse = nns @@ -1205,8 +1205,8 @@ async fn update_subnet_type(nns: &NnsCanisters<'_>, payload: UpdateSubnetTypeArg assert_eq!( wait_for_final_state(&nns.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); } @@ -1258,8 +1258,8 @@ async fn change_subnet_type_assignment( assert_eq!( wait_for_final_state(&nns.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); } diff --git a/rs/nns/integration_tests/src/known_neurons.rs b/rs/nns/integration_tests/src/known_neurons.rs index f757ac414c7..12f0666153c 100644 --- a/rs/nns/integration_tests/src/known_neurons.rs +++ b/rs/nns/integration_tests/src/known_neurons.rs @@ -135,14 +135,14 @@ fn test_known_neurons() { assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid_1)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid_2)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // Check that neuron 2 has the correct name diff --git a/rs/nns/integration_tests/src/lifeline.rs b/rs/nns/integration_tests/src/lifeline.rs index 4441816176e..5dde460c826 100644 --- a/rs/nns/integration_tests/src/lifeline.rs +++ b/rs/nns/integration_tests/src/lifeline.rs @@ -121,8 +121,8 @@ fn test_submit_and_accept_root_canister_upgrade_proposal() { let proposal_info = nns_governance_get_proposal_info_as_anonymous(&state_machine, proposal_id.id); assert_eq!( - proposal_info.status(), - ProposalStatus::Executed, + proposal_info.status, + ProposalStatus::Executed as i32, "{:#?}", proposal_info ); @@ -222,8 +222,8 @@ fn test_submit_and_accept_forced_root_canister_upgrade_proposal() { let proposal_info = nns_governance_get_proposal_info_as_anonymous(&state_machine, proposal_id.id); assert_eq!( - proposal_info.status(), - ProposalStatus::Executed, + proposal_info.status, + ProposalStatus::Executed as i32, "{:#?}", proposal_info ); diff --git a/rs/nns/integration_tests/src/node_assignment.rs b/rs/nns/integration_tests/src/node_assignment.rs index 2e13e5d9290..7b5969ef096 100644 --- a/rs/nns/integration_tests/src/node_assignment.rs +++ b/rs/nns/integration_tests/src/node_assignment.rs @@ -92,8 +92,8 @@ fn test_add_and_remove_nodes_from_registry() { assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); let proposal_payload = AddNodeOperatorPayload { @@ -167,8 +167,8 @@ fn test_add_and_remove_nodes_from_registry() { assert_eq!( wait_for_final_state(&nns_canisters.governance, prop_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); let node_record = get_value::( diff --git a/rs/nns/integration_tests/src/node_operator_handler.rs b/rs/nns/integration_tests/src/node_operator_handler.rs index 3e5e36a5092..0ee8cf9b843 100644 --- a/rs/nns/integration_tests/src/node_operator_handler.rs +++ b/rs/nns/integration_tests/src/node_operator_handler.rs @@ -96,8 +96,8 @@ fn test_node_operator_records_can_be_added_and_removed() { assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); add_node_operator(&nns_canisters, &TEST_NEURON_1_OWNER_PRINCIPAL).await; @@ -151,8 +151,8 @@ fn test_node_operator_records_can_be_added_and_removed() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // Node Operator 1 is not removed because it has associated node records @@ -214,8 +214,8 @@ async fn add_node_operator(nns_canisters: &NnsCanisters<'_>, node_operator_id: & assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // Assert that the executed proposal had the expected result diff --git a/rs/nns/integration_tests/src/rewards.rs b/rs/nns/integration_tests/src/rewards.rs index db361b251b6..718ad0d83bb 100644 --- a/rs/nns/integration_tests/src/rewards.rs +++ b/rs/nns/integration_tests/src/rewards.rs @@ -93,8 +93,8 @@ fn test_node_provider_rewards() { assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); let to_subaccount = Subaccount({ @@ -157,8 +157,8 @@ fn test_node_provider_rewards() { assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // The balance of the main account should now include the rewards. diff --git a/rs/nns/integration_tests/src/root.rs b/rs/nns/integration_tests/src/root.rs index 806a2f44836..edb3133bb3d 100644 --- a/rs/nns/integration_tests/src/root.rs +++ b/rs/nns/integration_tests/src/root.rs @@ -77,8 +77,8 @@ async fn add_nns_canister(runtime: &Runtime, upgrade_scenario: UpgradeTestingSce assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/subnet_handler.rs b/rs/nns/integration_tests/src/subnet_handler.rs index 2ce724acbac..cdddeeb8d80 100644 --- a/rs/nns/integration_tests/src/subnet_handler.rs +++ b/rs/nns/integration_tests/src/subnet_handler.rs @@ -140,8 +140,8 @@ fn test_submit_and_accept_update_subnet_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/update_node_rewards_table.rs b/rs/nns/integration_tests/src/update_node_rewards_table.rs index 464502cc510..14b598be99f 100644 --- a/rs/nns/integration_tests/src/update_node_rewards_table.rs +++ b/rs/nns/integration_tests/src/update_node_rewards_table.rs @@ -75,8 +75,8 @@ fn test_submit_update_node_rewards_table_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/update_unassigned_nodes_config.rs b/rs/nns/integration_tests/src/update_unassigned_nodes_config.rs index 565190207fa..a76b707b634 100644 --- a/rs/nns/integration_tests/src/update_unassigned_nodes_config.rs +++ b/rs/nns/integration_tests/src/update_unassigned_nodes_config.rs @@ -50,8 +50,8 @@ fn test_submit_update_ssh_readonly_access_for_all_unassigned_nodes() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); let ssh_keys = vec!["key0".to_string(), "key1".to_string()]; @@ -78,8 +78,8 @@ fn test_submit_update_ssh_readonly_access_for_all_unassigned_nodes() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. @@ -114,8 +114,8 @@ fn test_submit_update_ssh_readonly_access_for_all_unassigned_nodes() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Failed + .status, + ProposalStatus::Failed as i32 ); // No proposals should be pending now. @@ -165,8 +165,8 @@ fn test_submit_deploy_guestos_to_all_unassigned_nodes_proposal() { assert_eq!( wait_for_final_state(&nns_canisters.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); // No proposals should be pending now. diff --git a/rs/nns/integration_tests/src/upgrades_handler.rs b/rs/nns/integration_tests/src/upgrades_handler.rs index bdeeb8bbac8..6b186a092da 100644 --- a/rs/nns/integration_tests/src/upgrades_handler.rs +++ b/rs/nns/integration_tests/src/upgrades_handler.rs @@ -41,7 +41,7 @@ async fn submit( async fn assert_failed_with_reason(gov: &Canister<'_>, proposal_id: ProposalId, reason: &str) { let info = wait_for_final_state(gov, proposal_id).await; - assert_eq!(info.status(), ProposalStatus::Failed); + assert_eq!(info.status, ProposalStatus::Failed as i32); assert_matches!( info.failure_reason, Some(error) if error.error_message.contains(reason) @@ -100,8 +100,8 @@ fn test_submit_and_accept_update_elected_replica_versions_proposal() { let proposal_id = submit(gov, NnsFunction::ReviseElectedGuestosVersions, payload).await; let _result: ManageNeuronResponse = cast_votes(proposal_id).await.expect("Vote failed"); assert_eq!( - wait_for_final_state(gov, proposal_id).await.status(), - ProposalStatus::Executed + wait_for_final_state(gov, proposal_id).await.status, + ProposalStatus::Executed as i32 ); } @@ -133,8 +133,8 @@ fn test_submit_and_accept_update_elected_replica_versions_proposal() { .await; let _result: ManageNeuronResponse = cast_votes(proposal_id).await.expect("Vote failed"); assert_eq!( - wait_for_final_state(gov, proposal_id).await.status(), - ProposalStatus::Executed + wait_for_final_state(gov, proposal_id).await.status, + ProposalStatus::Executed as i32 ); let test_cases = vec![ @@ -192,8 +192,8 @@ fn test_submit_and_accept_update_elected_replica_versions_proposal() { assert_failed_with_reason(gov, proposal_id, reason).await; } else { assert_eq!( - wait_for_final_state(gov, proposal_id).await.status(), - ProposalStatus::Executed + wait_for_final_state(gov, proposal_id).await.status, + ProposalStatus::Executed as i32 ); } } diff --git a/rs/nns/test_utils/src/governance.rs b/rs/nns/test_utils/src/governance.rs index 9795afde7bb..f4447dab0af 100644 --- a/rs/nns/test_utils/src/governance.rs +++ b/rs/nns/test_utils/src/governance.rs @@ -156,10 +156,10 @@ pub async fn is_proposal_executed_or_failed( .await .unwrap(); let pi = pi.expect("Proposal with id: {:?} not found."); - println!("Proposal {:?} status: {:?}", id, pi.status()); - pi.status() == ProposalStatus::Executed - || pi.status() == ProposalStatus::Failed - || pi.status() == ProposalStatus::Rejected + println!("Proposal {:?} status: {:?}", id, pi.status); + pi.status == ProposalStatus::Executed as i32 + || pi.status == ProposalStatus::Failed as i32 + || pi.status == ProposalStatus::Rejected as i32 } /// Thin-wrapper around get_closed_proposals to handle @@ -241,8 +241,8 @@ pub async fn add_node_provider(nns_canisters: &NnsCanisters<'_>, np: NodeProvide assert_eq!( wait_for_final_state(&nns_canisters.governance, ProposalId::from(pid)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); } @@ -374,8 +374,8 @@ async fn change_nns_canister_by_proposal( assert_eq!( wait_for_final_state(governance, ProposalId::from(proposal_id)) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); } diff --git a/rs/nns/test_utils/src/itest_helpers.rs b/rs/nns/test_utils/src/itest_helpers.rs index e4e08e82c4c..d2dd9256883 100644 --- a/rs/nns/test_utils/src/itest_helpers.rs +++ b/rs/nns/test_utils/src/itest_helpers.rs @@ -306,8 +306,8 @@ impl NnsCanisters<'_> { assert_eq!( wait_for_final_state(&self.governance, proposal_id) .await - .status(), - ProposalStatus::Executed + .status, + ProposalStatus::Executed as i32 ); } } diff --git a/rs/tests/ckbtc/src/lib.rs b/rs/tests/ckbtc/src/lib.rs index 896e5920f6f..2208f1603d7 100644 --- a/rs/tests/ckbtc/src/lib.rs +++ b/rs/tests/ckbtc/src/lib.rs @@ -284,7 +284,7 @@ async fn execute_update_subnet_proposal( ) .await; let proposal_result = vote_and_execute_proposal(governance, proposal_id).await; - assert_eq!(proposal_result.status(), ProposalStatus::Executed); + assert_eq!(proposal_result.status, ProposalStatus::Executed as i32); } fn empty_subnet_update() -> UpdateSubnetPayload { diff --git a/rs/tests/consensus/tecdsa/utils/src/lib.rs b/rs/tests/consensus/tecdsa/utils/src/lib.rs index 97dae4589cf..6b8071ae0da 100644 --- a/rs/tests/consensus/tecdsa/utils/src/lib.rs +++ b/rs/tests/consensus/tecdsa/utils/src/lib.rs @@ -460,7 +460,7 @@ pub async fn execute_update_subnet_proposal( logger, "Subnet Update proposal result: {:?}", proposal_result ); - assert_eq!(proposal_result.status(), ProposalStatus::Executed); + assert_eq!(proposal_result.status, ProposalStatus::Executed as i32); } pub async fn execute_create_subnet_proposal( @@ -489,7 +489,7 @@ pub async fn execute_create_subnet_proposal( logger, "Subnet Creation proposal result: {:?}", proposal_result ); - assert_eq!(proposal_result.status(), ProposalStatus::Executed); + assert_eq!(proposal_result.status, ProposalStatus::Executed as i32); } pub async fn get_signature_with_logger( diff --git a/rs/tests/cross_chain/ic_xc_ledger_suite_orchestrator_test.rs b/rs/tests/cross_chain/ic_xc_ledger_suite_orchestrator_test.rs index 29031a79058..3f70b6c63bb 100644 --- a/rs/tests/cross_chain/ic_xc_ledger_suite_orchestrator_test.rs +++ b/rs/tests/cross_chain/ic_xc_ledger_suite_orchestrator_test.rs @@ -233,7 +233,7 @@ async fn install_nns_controlled_canister<'a>( .await; let proposal_result = vote_and_execute_proposal(governance_canister, proposal_id).await; - assert_eq!(proposal_result.status(), ProposalStatus::Executed); + assert_eq!(proposal_result.status, ProposalStatus::Executed as i32); info!( logger, "Installed WASM to {} via NNS proposal", @@ -285,7 +285,7 @@ async fn upgrade_ledger_suite_orchestrator_by_nns_proposal( .await; let proposal_result = vote_and_execute_proposal(governance_canister, proposal_id).await; - assert_eq!(proposal_result.status(), ProposalStatus::Executed); + assert_eq!(proposal_result.status, ProposalStatus::Executed as i32); info!( logger, "Upgrade ledger suite orchestrator {:?} via NNS proposal", upgrade_arg diff --git a/rs/tests/driver/src/nns.rs b/rs/tests/driver/src/nns.rs index fe220d34348..1b265a68373 100644 --- a/rs/tests/driver/src/nns.rs +++ b/rs/tests/driver/src/nns.rs @@ -364,8 +364,8 @@ pub async fn vote_execute_proposal_assert_executed( // Wait for the proposal to be accepted and executed. let proposal_info = vote_and_execute_proposal(governance_canister, proposal_id).await; assert_eq!( - proposal_info.status(), - ProposalStatus::Executed, + proposal_info.status, + ProposalStatus::Executed as i32, "proposal {proposal_id} did not execute: {proposal_info:?}" ); } @@ -384,7 +384,7 @@ pub async fn vote_execute_proposal_assert_failed( let expected_message_substring = expected_message_substring.to_string(); // Wait for the proposal to be accepted and executed. let proposal_info = vote_and_execute_proposal(governance_canister, proposal_id).await; - assert_eq!(proposal_info.status(), ProposalStatus::Failed); + assert_eq!(proposal_info.status, ProposalStatus::Failed as i32); let reason = proposal_info.failure_reason.unwrap_or_default(); assert!( reason