diff --git a/Cargo.lock b/Cargo.lock index b88350c3951..06dad47c357 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12301,7 +12301,9 @@ dependencies = [ "candid", "clap 4.5.27", "comparable", + "hex", "ic-base-types", + "ic-nervous-system-common", "ic-nervous-system-proto", "ic-nns-common", "ic-protobuf", @@ -12619,6 +12621,7 @@ dependencies = [ "ic-nns-governance", "ic-nns-test-utils", "ic-sns-governance", + "ic-sns-governance-api", "ic-sns-init", "ic-sns-root", "ic-sns-swap", diff --git a/rs/nns/sns-wasm/BUILD.bazel b/rs/nns/sns-wasm/BUILD.bazel index 17145935ad0..8f9dcf67624 100644 --- a/rs/nns/sns-wasm/BUILD.bazel +++ b/rs/nns/sns-wasm/BUILD.bazel @@ -23,6 +23,7 @@ DEPENDENCIES = [ "//rs/nns/handlers/root/interface", "//rs/rust_canisters/http_types", "//rs/sns/governance", + "//rs/sns/governance/api", "//rs/sns/init", "//rs/sns/root", "//rs/types/base_types", diff --git a/rs/nns/sns-wasm/src/sns_wasm.rs b/rs/nns/sns-wasm/src/sns_wasm.rs index f3438ebf690..3300b774731 100644 --- a/rs/nns/sns-wasm/src/sns_wasm.rs +++ b/rs/nns/sns-wasm/src/sns_wasm.rs @@ -32,7 +32,7 @@ use ic_nns_handler_root_interface::{ client::NnsRootCanisterClient, ChangeCanisterControllersRequest, ChangeCanisterControllersResult, }; -use ic_sns_governance::pb::v1::governance::Version; +use ic_sns_governance_api::pb::v1::governance::Version; use ic_sns_init::{pb::v1::SnsInitPayload, SnsCanisterInitPayloads}; use ic_sns_root::GetSnsCanistersSummaryResponse; use ic_types::{Cycles, SubnetId}; diff --git a/rs/nns/test_utils/BUILD.bazel b/rs/nns/test_utils/BUILD.bazel index dc6c115acdc..b18baddfbb3 100644 --- a/rs/nns/test_utils/BUILD.bazel +++ b/rs/nns/test_utils/BUILD.bazel @@ -45,6 +45,7 @@ BASE_DEPENDENCIES = [ "//rs/rust_canisters/dfn_protobuf", "//rs/rust_canisters/on_wire", "//rs/sns/governance", + "//rs/sns/governance/api", "//rs/sns/init", "//rs/sns/swap", "//rs/state_machine_tests", diff --git a/rs/nns/test_utils/src/state_test_helpers.rs b/rs/nns/test_utils/src/state_test_helpers.rs index ba8a7f29f2d..19871b26074 100644 --- a/rs/nns/test_utils/src/state_test_helpers.rs +++ b/rs/nns/test_utils/src/state_test_helpers.rs @@ -56,8 +56,8 @@ use ic_nns_handler_root::init::RootCanisterInitPayload; use ic_registry_transport::pb::v1::{ RegistryGetChangesSinceRequest, RegistryGetChangesSinceResponse, }; -use ic_sns_governance::pb::v1::{ - self as sns_pb, manage_neuron_response::Command as SnsCommandResponse, GetModeResponse, +use ic_sns_governance_api::pb::v1::{ + self as sns_pb_api, manage_neuron_response::Command as SnsCommandResponse, GetModeResponse, }; use ic_sns_swap::pb::v1::{GetAutoFinalizationStatusRequest, GetAutoFinalizationStatusResponse}; use ic_sns_wasm::{ @@ -1795,22 +1795,22 @@ pub fn sns_claim_staked_neuron( sender: PrincipalId, nonce: u64, dissolve_delay: Option, -) -> sns_pb::NeuronId { +) -> sns_pb_api::NeuronId { // Find the neuron staked let to_subaccount = compute_neuron_staking_subaccount(sender, nonce); // Claim the neuron on the governance canister. - let claim_response: sns_pb::ManageNeuronResponse = update_with_sender( + let claim_response: sns_pb_api::ManageNeuronResponse = update_with_sender( machine, governance_canister_id, "manage_neuron", - sns_pb::ManageNeuron { + sns_pb_api::ManageNeuron { subaccount: to_subaccount.to_vec(), - command: Some(sns_pb::manage_neuron::Command::ClaimOrRefresh( - sns_pb::manage_neuron::ClaimOrRefresh { + command: Some(sns_pb_api::manage_neuron::Command::ClaimOrRefresh( + sns_pb_api::manage_neuron::ClaimOrRefresh { by: Some( - sns_pb::manage_neuron::claim_or_refresh::By::MemoAndController( - sns_pb::manage_neuron::claim_or_refresh::MemoAndController { + sns_pb_api::manage_neuron::claim_or_refresh::By::MemoAndController( + sns_pb_api::manage_neuron::claim_or_refresh::MemoAndController { memo: nonce, controller: None, }, @@ -1862,13 +1862,13 @@ pub fn sns_increase_dissolve_delay( subaccount: &[u8], dissolve_delay: u32, ) { - let payload = sns_pb::ManageNeuron { + let payload = sns_pb_api::ManageNeuron { subaccount: subaccount.to_vec(), - command: Some(sns_pb::manage_neuron::Command::Configure( - sns_pb::manage_neuron::Configure { + command: Some(sns_pb_api::manage_neuron::Command::Configure( + sns_pb_api::manage_neuron::Configure { operation: Some( - sns_pb::manage_neuron::configure::Operation::IncreaseDissolveDelay( - sns_pb::manage_neuron::IncreaseDissolveDelay { + sns_pb_api::manage_neuron::configure::Operation::IncreaseDissolveDelay( + sns_pb_api::manage_neuron::IncreaseDissolveDelay { additional_dissolve_delay_seconds: dissolve_delay, }, ), @@ -1876,7 +1876,7 @@ pub fn sns_increase_dissolve_delay( }, )), }; - let increase_response: sns_pb::ManageNeuronResponse = update_with_sender( + let increase_response: sns_pb_api::ManageNeuronResponse = update_with_sender( machine, governance_canister_id, "manage_neuron", @@ -1905,18 +1905,18 @@ pub fn sns_make_proposal( sns_governance_canister_id: CanisterId, sender: PrincipalId, // subaccount: &[u8], - neuron_id: sns_pb::NeuronId, - proposal: sns_pb::Proposal, -) -> Result { + neuron_id: sns_pb_api::NeuronId, + proposal: sns_pb_api::Proposal, +) -> Result { let sub_account = neuron_id.subaccount().unwrap(); - let manage_neuron_response: sns_pb::ManageNeuronResponse = update_with_sender( + let manage_neuron_response: sns_pb_api::ManageNeuronResponse = update_with_sender( machine, sns_governance_canister_id, "manage_neuron", - sns_pb::ManageNeuron { + sns_pb_api::ManageNeuron { subaccount: sub_account.to_vec(), - command: Some(sns_pb::manage_neuron::Command::MakeProposal(proposal)), + command: Some(sns_pb_api::manage_neuron::Command::MakeProposal(proposal)), }, sender, ) @@ -1940,11 +1940,12 @@ pub fn sns_governance_get_mode( state_machine, sns_governance_canister_id, "get_mode", - Encode!(&sns_pb::GetMode {}).unwrap(), + Encode!(&sns_pb_api::GetMode {}).unwrap(), ) .map_err(|e| format!("Error calling get_mode: {}", e))?; - let GetModeResponse { mode } = Decode!(&get_mode_response, sns_pb::GetModeResponse).unwrap(); + let GetModeResponse { mode } = + Decode!(&get_mode_response, sns_pb_api::GetModeResponse).unwrap(); Ok(mode.unwrap()) } @@ -1973,13 +1974,13 @@ pub fn sns_swap_get_auto_finalization_status( pub fn sns_get_proposal( machine: &StateMachine, governance_canister_id: CanisterId, - proposal_id: sns_pb::ProposalId, -) -> Result { + proposal_id: sns_pb_api::ProposalId, +) -> Result { let get_proposal_response = query( machine, governance_canister_id, "get_proposal", - Encode!(&sns_pb::GetProposal { + Encode!(&sns_pb_api::GetProposal { proposal_id: Some(proposal_id), }) .unwrap(), @@ -1987,15 +1988,15 @@ pub fn sns_get_proposal( .map_err(|e| format!("Error calling get_proposal: {}", e))?; let get_proposal_response = - Decode!(&get_proposal_response, sns_pb::GetProposalResponse).unwrap(); + Decode!(&get_proposal_response, sns_pb_api::GetProposalResponse).unwrap(); match get_proposal_response .result .expect("Empty get_proposal_response") { - sns_pb::get_proposal_response::Result::Error(e) => { + sns_pb_api::get_proposal_response::Result::Error(e) => { panic!("get_proposal error: {}", e); } - sns_pb::get_proposal_response::Result::Proposal(proposal) => Ok(proposal), + sns_pb_api::get_proposal_response::Result::Proposal(proposal) => Ok(proposal), } } @@ -2004,7 +2005,7 @@ pub fn sns_get_proposal( pub fn sns_wait_for_proposal_execution( machine: &StateMachine, governance: CanisterId, - proposal_id: sns_pb::ProposalId, + proposal_id: sns_pb_api::ProposalId, ) { // We create some blocks until the proposal has finished executing (machine.tick()) let mut attempt_count = 0; @@ -2032,7 +2033,7 @@ pub fn sns_wait_for_proposal_execution( pub fn sns_wait_for_proposal_executed_or_failed( machine: &StateMachine, governance: CanisterId, - proposal_id: sns_pb::ProposalId, + proposal_id: sns_pb_api::ProposalId, ) { // We create some blocks until the proposal has finished executing (machine.tick()) let mut attempt_count = 0; diff --git a/rs/sns/governance/api/BUILD.bazel b/rs/sns/governance/api/BUILD.bazel index f10d1259541..48dedbdcf77 100644 --- a/rs/sns/governance/api/BUILD.bazel +++ b/rs/sns/governance/api/BUILD.bazel @@ -5,7 +5,10 @@ package(default_visibility = ["//visibility:public"]) # See rs/nervous_system/feature_test.md DEPENDENCIES = [ # Keep sorted. + "//packages/icrc-ledger-types:icrc_ledger_types", + "//rs/ledger_suite/common/ledger_core", "//rs/ledger_suite/icp:icp_ledger", + "//rs/nervous_system/common", "//rs/nervous_system/proto", "//rs/protobuf", "//rs/types/base_types", @@ -15,6 +18,7 @@ DEPENDENCIES = [ "@crate_index//:candid", "@crate_index//:clap", "@crate_index//:comparable", + "@crate_index//:hex", "@crate_index//:itertools", "@crate_index//:prost", "@crate_index//:serde", diff --git a/rs/sns/governance/api/Cargo.toml b/rs/sns/governance/api/Cargo.toml index 9c8649d57cb..f11cc91cc65 100644 --- a/rs/sns/governance/api/Cargo.toml +++ b/rs/sns/governance/api/Cargo.toml @@ -15,7 +15,9 @@ bytes = { workspace = true } candid = { workspace = true } clap = { workspace = true } comparable = { version = "0.5", features = ["derive"] } +hex = { workspace = true } ic-base-types = { path = "../../../types/base_types" } +ic-nervous-system-common = { path = "../../../nervous_system/common" } ic-nervous-system-proto = { path = "../../../nervous_system/proto" } ic-nns-common = { path = "../../../nns/common" } ic-protobuf = { path = "../../../protobuf" } @@ -28,3 +30,5 @@ serde = { workspace = true } serde_bytes = { workspace = true } strum = { workspace = true } strum_macros = { workspace = true } +ledger_core = { path = "../../../ledger_suite/common/ledger_core" } +icrc-ledger-types = { path = "../../../packages/icrc-ledger-types" } diff --git a/rs/sns/governance/api/src/ic_sns_governance.pb.v1.rs b/rs/sns/governance/api/src/ic_sns_governance.pb.v1.rs index 13710a831b9..a5aedb57c39 100644 --- a/rs/sns/governance/api/src/ic_sns_governance.pb.v1.rs +++ b/rs/sns/governance/api/src/ic_sns_governance.pb.v1.rs @@ -340,6 +340,7 @@ pub mod transfer_sns_treasury_funds { Hash, PartialOrd, Ord, + ::prost::Enumeration, )] #[repr(i32)] pub enum TransferFrom { @@ -971,7 +972,7 @@ pub mod valuation { /// on the subnet). /// /// Required invariant: the canister code assumes that all system parameters are always set. -#[derive(Default, candid::CandidType, candid::Deserialize, Debug, Clone, PartialEq)] +#[derive(candid::CandidType, candid::Deserialize, Debug, Clone, PartialEq)] pub struct NervousSystemParameters { /// The number of e8s (10E-8 of a token) that a rejected /// proposal costs the proposer. @@ -2383,6 +2384,7 @@ pub struct Account { #[derive( candid::CandidType, candid::Deserialize, + strum_macros::EnumIter, Debug, clap::ValueEnum, Clone, diff --git a/rs/sns/governance/src/init.rs b/rs/sns/governance/api/src/init.rs similarity index 95% rename from rs/sns/governance/src/init.rs rename to rs/sns/governance/api/src/init.rs index 80823f0d72d..9ec20f4ebc6 100644 --- a/rs/sns/governance/src/init.rs +++ b/rs/sns/governance/api/src/init.rs @@ -14,7 +14,7 @@ impl GovernanceCanisterInitPayloadBuilder { pub fn new() -> Self { Self { proto: Governance { - parameters: Some(NervousSystemParameters::with_default_values()), + parameters: Some(NervousSystemParameters::default()), mode: Mode::PreInitializationSwap as i32, sns_metadata: Some(SnsMetadata { logo: Some("data:image/png;base64,aGVsbG8gZnJvbSBkZmluaXR5IQ==".to_string()), @@ -51,7 +51,7 @@ impl GovernanceCanisterInitPayloadBuilder { } pub fn with_mode(&mut self, mode: Mode) -> &mut Self { - self.proto.set_mode(mode); + self.proto.mode = mode as i32; self } diff --git a/rs/sns/governance/api/src/lib.rs b/rs/sns/governance/api/src/lib.rs index ff6e8691092..b6f6511fc57 100644 --- a/rs/sns/governance/api/src/lib.rs +++ b/rs/sns/governance/api/src/lib.rs @@ -1,3 +1,6 @@ +pub mod init; +pub mod nervous_system_parameters; +pub mod neuron; pub mod pb; mod types; diff --git a/rs/sns/governance/api/src/nervous_system_parameters.rs b/rs/sns/governance/api/src/nervous_system_parameters.rs new file mode 100644 index 00000000000..0f9321511a8 --- /dev/null +++ b/rs/sns/governance/api/src/nervous_system_parameters.rs @@ -0,0 +1,65 @@ +use crate::pb::v1::{ + DefaultFollowees, NervousSystemParameters, NeuronPermissionList, NeuronPermissionType, + VotingRewardsParameters, +}; +use ic_ledger_core::tokens::TOKEN_SUBDIVIDABLE_BY; +use ic_nervous_system_common::{ + DEFAULT_TRANSFER_FEE, ONE_DAY_SECONDS, ONE_MONTH_SECONDS, ONE_YEAR_SECONDS, +}; + +/// The number of e8s per governance token; +const E8S_PER_TOKEN: u64 = TOKEN_SUBDIVIDABLE_BY; + +impl NervousSystemParameters { + /// These are the permissions that must be present in + /// `neuron_claimer_permissions`. + /// Permissions not in this list can be added after the SNS is created via a + /// proposal. + pub const REQUIRED_NEURON_CLAIMER_PERMISSIONS: &'static [NeuronPermissionType] = &[ + // Without this permission, it would be impossible to transfer control + // of a neuron to a new principal. + NeuronPermissionType::ManagePrincipals, + // Without this permission, it would be impossible to vote. + NeuronPermissionType::Vote, + // Without this permission, it would be impossible to submit a proposal. + NeuronPermissionType::SubmitProposal, + ]; + + /// Returns the default for the nervous system parameter neuron_claimer_permissions. + fn default_neuron_claimer_permissions() -> NeuronPermissionList { + NeuronPermissionList { + permissions: Self::REQUIRED_NEURON_CLAIMER_PERMISSIONS + .iter() + .map(|p| *p as i32) + .collect(), + } + } +} + +impl Default for NervousSystemParameters { + fn default() -> Self { + Self { + reject_cost_e8s: Some(E8S_PER_TOKEN), // 1 governance token + neuron_minimum_stake_e8s: Some(E8S_PER_TOKEN), // 1 governance token + transaction_fee_e8s: Some(DEFAULT_TRANSFER_FEE.get_e8s()), + max_proposals_to_keep_per_action: Some(100), + initial_voting_period_seconds: Some(4 * ONE_DAY_SECONDS), // 4d + wait_for_quiet_deadline_increase_seconds: Some(ONE_DAY_SECONDS), // 1d + default_followees: Some(DefaultFollowees::default()), + max_number_of_neurons: Some(200_000), + neuron_minimum_dissolve_delay_to_vote_seconds: Some(6 * ONE_MONTH_SECONDS), // 6m + max_followees_per_function: Some(15), + max_dissolve_delay_seconds: Some(8 * ONE_YEAR_SECONDS), // 8y + max_neuron_age_for_age_bonus: Some(4 * ONE_YEAR_SECONDS), // 4y + max_number_of_proposals_with_ballots: Some(700), + neuron_claimer_permissions: Some(Self::default_neuron_claimer_permissions()), + neuron_grantable_permissions: Some(NeuronPermissionList::default()), + max_number_of_principals_per_neuron: Some(5), + voting_rewards_parameters: Some(VotingRewardsParameters::with_default_values()), + max_dissolve_delay_bonus_percentage: Some(100), + max_age_bonus_percentage: Some(25), + maturity_modulation_disabled: Some(false), + automatically_advance_target_version: Some(false), + } + } +} diff --git a/rs/sns/governance/api/src/neuron.rs b/rs/sns/governance/api/src/neuron.rs new file mode 100644 index 00000000000..28a6899f8eb --- /dev/null +++ b/rs/sns/governance/api/src/neuron.rs @@ -0,0 +1,62 @@ +use crate::pb::v1::{governance_error::ErrorType, neuron::DissolveState, GovernanceError, Neuron}; +use crate::types::Subaccount; + +impl Neuron { + pub fn stake_e8s(&self) -> u64 { + self.cached_neuron_stake_e8s + .saturating_sub(self.neuron_fees_e8s) + } + + pub fn subaccount(&self) -> Result { + if let Some(nid) = &self.id { + nid.subaccount() + } else { + Err(GovernanceError::new_with_message( + ErrorType::NotFound, + "Neuron must have a subaccount", + )) + } + } + + pub fn age_seconds(&self, now_seconds: u64) -> u64 { + now_seconds.saturating_sub(self.aging_since_timestamp_seconds) + } + + pub fn state(&self, now_seconds: u64) -> NeuronState { + match self.dissolve_state { + Some(DissolveState::DissolveDelaySeconds(d)) => { + if d > 0 { + NeuronState::NotDissolving + } else { + NeuronState::Dissolved + } + } + Some(DissolveState::WhenDissolvedTimestampSeconds(ts)) => { + if ts > now_seconds { + NeuronState::Dissolving + } else { + NeuronState::Dissolved + } + } + None => NeuronState::Dissolved, + } + } +} + +/// The state of a neuron +#[derive(Eq, PartialEq, Debug)] +pub enum NeuronState { + /// In this state, the neuron is not dissolving and has a specific + /// `dissolve_delay` that is larger than zero. + NotDissolving, + /// In this state, the neuron's dissolve clock is running down with + /// the passage of time. The neuron has a defined + /// `when_dissolved_timestamp` that specifies at what time (in the + /// future) it will be dissolved. + Dissolving, + /// In this state, the neuron is dissolved and can be disbursed. + /// This captures all the remaining cases. In particular a neuron + /// is dissolved if its `when_dissolved_timestamp` is in the past + /// or when its `dissolve_delay` is zero. + Dissolved, +} diff --git a/rs/sns/governance/api/src/types.rs b/rs/sns/governance/api/src/types.rs index c58bc3b5c9f..e02e58bf4b8 100644 --- a/rs/sns/governance/api/src/types.rs +++ b/rs/sns/governance/api/src/types.rs @@ -1,3 +1,10 @@ +use crate::pb::v1::{ + governance_error::ErrorType, manage_neuron_response, GovernanceError, ManageNeuronResponse, + NeuronId, NeuronPermission, NeuronPermissionType, VotingRewardsParameters, +}; +use ic_base_types::PrincipalId; +use strum::IntoEnumIterator; + use std::fmt; impl fmt::Display for crate::pb::v1::GovernanceError { @@ -7,3 +14,90 @@ impl fmt::Display for crate::pb::v1::GovernanceError { } impl std::error::Error for crate::pb::v1::GovernanceError {} + +impl fmt::Display for NeuronId { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", hex::encode(&self.id)) + } +} + +pub(crate) type Subaccount = [u8; 32]; +impl NeuronId { + pub fn subaccount(&self) -> Result { + match Subaccount::try_from(self.id.as_slice()) { + Ok(subaccount) => Ok(subaccount), + Err(e) => Err(GovernanceError::new_with_message( + ErrorType::InvalidNeuronId, + format!("Could not convert NeuronId to Subaccount {}", e), + )), + } + } +} +impl From for NeuronId { + fn from(subaccount: Subaccount) -> Self { + NeuronId { + id: subaccount.to_vec(), + } + } +} + +impl GovernanceError { + pub fn new_with_message(error_type: ErrorType, message: impl ToString) -> Self { + GovernanceError { + error_type: error_type as i32, + error_message: message.to_string(), + } + } +} + +impl VotingRewardsParameters { + pub fn with_default_values() -> Self { + Self { + round_duration_seconds: Some(ic_nervous_system_common::ONE_DAY_SECONDS), + reward_rate_transition_duration_seconds: Some(0), + initial_reward_rate_basis_points: Some(0), + final_reward_rate_basis_points: Some(0), + } + } +} + +impl NeuronPermissionType { + /// Returns all the different types of neuron permissions as a vector. + pub fn all() -> Vec { + NeuronPermissionType::iter() + .map(|permission| permission as i32) + .collect() + } +} + +impl ManageNeuronResponse { + pub fn expect(self, msg: &str) -> Self { + if let Some(manage_neuron_response::Command::Error(err)) = &self.command { + panic!("{}: {}", msg, err); + } + self + } +} + +impl NeuronPermission { + pub fn new(principal: &PrincipalId, permissions: Vec) -> NeuronPermission { + NeuronPermission { + principal: Some(*principal), + permission_type: permissions, + } + } +} + +impl From for crate::pb::v1::Account { + fn from(account: icrc_ledger_types::icrc1::account::Account) -> Self { + let maybe_subaccount_pb = account + .subaccount + .map(|subaccount| crate::pb::v1::Subaccount { + subaccount: subaccount.into(), + }); + crate::pb::v1::Account { + owner: Some(account.owner.into()), + subaccount: maybe_subaccount_pb, + } + } +} diff --git a/rs/sns/governance/src/lib.rs b/rs/sns/governance/src/lib.rs index 3e80fae168b..7c48e27c8d5 100644 --- a/rs/sns/governance/src/lib.rs +++ b/rs/sns/governance/src/lib.rs @@ -4,7 +4,6 @@ use std::convert::TryInto; mod cached_upgrade_steps; pub mod canister_control; pub mod governance; -pub mod init; pub mod logs; pub mod neuron; pub mod pb; diff --git a/rs/sns/governance/src/neuron.rs b/rs/sns/governance/src/neuron.rs index 537aa1435f0..c5c6fe6fe74 100644 --- a/rs/sns/governance/src/neuron.rs +++ b/rs/sns/governance/src/neuron.rs @@ -560,8 +560,7 @@ impl Neuron { /// that are adopted (then the fees are returned and not owed anymore) or /// by transferring funds to the neuron's account and then refreshing the stake. pub fn stake_e8s(&self) -> u64 { - self.cached_neuron_stake_e8s - .saturating_sub(self.neuron_fees_e8s) + ic_sns_governance_api::pb::v1::Neuron::from(self.clone()).stake_e8s() } /// Returns the current stake of this Neuron as used as an input diff --git a/rs/sns/governance/src/reward.rs b/rs/sns/governance/src/reward.rs index f8f471c4a21..77b24737e4d 100644 --- a/rs/sns/governance/src/reward.rs +++ b/rs/sns/governance/src/reward.rs @@ -303,12 +303,7 @@ impl VotingRewardsParameters { } pub fn with_default_values() -> Self { - Self { - round_duration_seconds: Some(ic_nervous_system_common::ONE_DAY_SECONDS), - reward_rate_transition_duration_seconds: Some(0), - initial_reward_rate_basis_points: Some(0), - final_reward_rate_basis_points: Some(0), - } + Self::from(ic_sns_governance_api::pb::v1::VotingRewardsParameters::with_default_values()) } /// Any empty fields of `self` are overwritten with the corresponding fields of `base`. diff --git a/rs/sns/governance/src/types.rs b/rs/sns/governance/src/types.rs index 6b333fc1523..63fde8587e9 100644 --- a/rs/sns/governance/src/types.rs +++ b/rs/sns/governance/src/types.rs @@ -27,13 +27,13 @@ use crate::{ neuron::Followees, proposal::Action, ChunkedCanisterWasm, ClaimSwapNeuronsError, ClaimSwapNeuronsResponse, - ClaimedSwapNeuronStatus, DefaultFollowees, DeregisterDappCanisters, Empty, + ClaimedSwapNeuronStatus, DeregisterDappCanisters, Empty, ExecuteGenericNervousSystemFunction, GovernanceError, ManageDappCanisterSettings, ManageLedgerParameters, ManageNeuronResponse, ManageSnsMetadata, MintSnsTokens, Motion, NervousSystemFunction, NervousSystemParameters, Neuron, NeuronId, NeuronIds, NeuronPermission, NeuronPermissionList, NeuronPermissionType, ProposalId, RegisterDappCanisters, RewardEvent, SnsVersion, TransferSnsTreasuryFunds, - UpgradeSnsControlledCanister, UpgradeSnsToNextVersion, Vote, VotingRewardsParameters, + UpgradeSnsControlledCanister, UpgradeSnsToNextVersion, Vote, }, }, proposal::ValidGenericNervousSystemFunction, @@ -49,12 +49,12 @@ use ic_management_canister_types_private::{ CanisterIdRecord, CanisterInstallModeError, StoredChunksReply, }; use ic_nervous_system_common::{ - hash_to_hex_string, ledger_validation::MAX_LOGO_LENGTH, NervousSystemError, - DEFAULT_TRANSFER_FEE, ONE_DAY_SECONDS, ONE_MONTH_SECONDS, ONE_YEAR_SECONDS, + hash_to_hex_string, ledger_validation::MAX_LOGO_LENGTH, NervousSystemError, ONE_DAY_SECONDS, }; use ic_nervous_system_common_validation::validate_proposal_url; use ic_nervous_system_proto::pb::v1::{Duration as PbDuration, Percentage}; use ic_sns_governance_api::format_full_hash; +use ic_sns_governance_api::pb::v1::NervousSystemParameters as NervousSystemParametersApi; use ic_sns_governance_proposal_criticality::{ ProposalCriticality, VotingDurationParameters, VotingPowerThresholds, }; @@ -402,20 +402,6 @@ impl NervousSystemParameters { /// to an over-concentration of voting power. The value used by the NNS is 25. pub const MAX_AGE_BONUS_PERCENTAGE_CEILING: u64 = 400; - /// These are the permissions that must be present in - /// `neuron_claimer_permissions`. - /// Permissions not in this list can be added after the SNS is created via a - /// proposal. - pub const REQUIRED_NEURON_CLAIMER_PERMISSIONS: &'static [NeuronPermissionType] = &[ - // Without this permission, it would be impossible to transfer control - // of a neuron to a new principal. - NeuronPermissionType::ManagePrincipals, - // Without this permission, it would be impossible to vote. - NeuronPermissionType::Vote, - // Without this permission, it would be impossible to submit a proposal. - NeuronPermissionType::SubmitProposal, - ]; - /// The proportion of "yes votes" as basis points of the total voting power /// that is required for the proposal to be adopted. For example, if this field /// is 300bp, then the proposal can only be adopted if the number of "yes @@ -439,29 +425,8 @@ impl NervousSystemParameters { Percentage::from_basis_points(6_700); // 67% pub fn with_default_values() -> Self { - Self { - reject_cost_e8s: Some(E8S_PER_TOKEN), // 1 governance token - neuron_minimum_stake_e8s: Some(E8S_PER_TOKEN), // 1 governance token - transaction_fee_e8s: Some(DEFAULT_TRANSFER_FEE.get_e8s()), - max_proposals_to_keep_per_action: Some(100), - initial_voting_period_seconds: Some(4 * ONE_DAY_SECONDS), // 4d - wait_for_quiet_deadline_increase_seconds: Some(ONE_DAY_SECONDS), // 1d - default_followees: Some(DefaultFollowees::default()), - max_number_of_neurons: Some(200_000), - neuron_minimum_dissolve_delay_to_vote_seconds: Some(6 * ONE_MONTH_SECONDS), // 6m - max_followees_per_function: Some(15), - max_dissolve_delay_seconds: Some(8 * ONE_YEAR_SECONDS), // 8y - max_neuron_age_for_age_bonus: Some(4 * ONE_YEAR_SECONDS), // 4y - max_number_of_proposals_with_ballots: Some(700), - neuron_claimer_permissions: Some(Self::default_neuron_claimer_permissions()), - neuron_grantable_permissions: Some(NeuronPermissionList::default()), - max_number_of_principals_per_neuron: Some(5), - voting_rewards_parameters: Some(VotingRewardsParameters::with_default_values()), - max_dissolve_delay_bonus_percentage: Some(100), - max_age_bonus_percentage: Some(25), - maturity_modulation_disabled: Some(false), - automatically_advance_target_version: Some(false), - } + let api = NervousSystemParametersApi::default(); + NervousSystemParameters::from(api) } /// Any empty fields of `self` are overwritten with the corresponding fields of `base`. @@ -806,10 +771,12 @@ impl NervousSystemParameters { let neuron_claimer_permissions = neuron_claimer_permissions.clone().try_into().unwrap(); - let required_claimer_permissions = Self::REQUIRED_NEURON_CLAIMER_PERMISSIONS - .iter() - .cloned() - .collect::>(); + let required_claimer_permissions = + NervousSystemParametersApi::REQUIRED_NEURON_CLAIMER_PERMISSIONS + .iter() + .cloned() + .map(NeuronPermissionType::from) + .collect::>(); let difference = required_claimer_permissions .difference(&neuron_claimer_permissions) @@ -823,16 +790,6 @@ impl NervousSystemParameters { Ok(()) } - /// Returns the default for the nervous system parameter neuron_claimer_permissions. - fn default_neuron_claimer_permissions() -> NeuronPermissionList { - NeuronPermissionList { - permissions: Self::REQUIRED_NEURON_CLAIMER_PERMISSIONS - .iter() - .map(|p| *p as i32) - .collect(), - } - } - /// Validates that the nervous system parameter neuron_grantable_permissions is well-formed. fn validate_neuron_grantable_permissions(&self) -> Result<(), String> { self.neuron_grantable_permissions.as_ref().ok_or_else(|| { diff --git a/rs/sns/governance/src/types/tests.rs b/rs/sns/governance/src/types/tests.rs index 8dc731bae28..5a97d4b8054 100644 --- a/rs/sns/governance/src/types/tests.rs +++ b/rs/sns/governance/src/types/tests.rs @@ -10,6 +10,7 @@ use candid::Nat; use futures::FutureExt; use ic_base_types::PrincipalId; use ic_management_canister_types_private::ChunkHash; +use ic_nervous_system_common::{ONE_DAY_SECONDS, ONE_MONTH_SECONDS}; use ic_nervous_system_common_test_keys::TEST_USER1_PRINCIPAL; use ic_nervous_system_proto::pb::v1::Principals; use lazy_static::lazy_static; @@ -983,13 +984,14 @@ fn test_nervous_system_parameters_wont_validate_without_voting_rewards_parameter #[test] fn test_nervous_system_parameters_wont_validate_without_the_required_claimer_permissions() { - for permission_to_omit in NervousSystemParameters::REQUIRED_NEURON_CLAIMER_PERMISSIONS { + for permission_to_omit in NervousSystemParametersApi::REQUIRED_NEURON_CLAIMER_PERMISSIONS { let mut parameters = NervousSystemParameters::with_default_values(); parameters.neuron_claimer_permissions = Some( - NervousSystemParameters::REQUIRED_NEURON_CLAIMER_PERMISSIONS + NervousSystemParametersApi::REQUIRED_NEURON_CLAIMER_PERMISSIONS .iter() .filter(|p| *p != permission_to_omit) .cloned() + .map(NeuronPermissionType::from) .collect::>() .into(), ); diff --git a/rs/sns/init/BUILD.bazel b/rs/sns/init/BUILD.bazel index 1f086b6e48e..c5246e25807 100644 --- a/rs/sns/init/BUILD.bazel +++ b/rs/sns/init/BUILD.bazel @@ -21,6 +21,7 @@ DEPENDENCIES = [ "//rs/nns/constants", "//rs/nns/governance/api", "//rs/sns/governance", + "//rs/sns/governance/api", "//rs/sns/root", "//rs/sns/swap:swap", "//rs/types/base_types", diff --git a/rs/sns/init/src/distributions.rs b/rs/sns/init/src/distributions.rs index a0c6dc0bb65..4c47c1d7637 100644 --- a/rs/sns/init/src/distributions.rs +++ b/rs/sns/init/src/distributions.rs @@ -15,9 +15,10 @@ use ic_nervous_system_common::{ ONE_MONTH_SECONDS, }; use ic_sns_governance::{ - governance::TREASURY_SUBACCOUNT_NONCE, - neuron::DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER, - pb::v1::{neuron::DissolveState, NervousSystemParameters, Neuron, NeuronId, NeuronPermission}, + governance::TREASURY_SUBACCOUNT_NONCE, neuron::DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER, +}; +use ic_sns_governance_api::pb::v1::{ + neuron::DissolveState, NervousSystemParameters, Neuron, NeuronId, NeuronPermission, }; use ic_sns_swap::swap::{NEURON_BASKET_MEMO_RANGE_START, SALE_NEURON_MEMO_RANGE_END}; use icrc_ledger_types::icrc1::account::Account; @@ -612,9 +613,10 @@ mod test { TEST_NEURON_1_OWNER_PRINCIPAL, TEST_NEURON_2_OWNER_PRINCIPAL, TEST_NEURON_3_OWNER_PRINCIPAL, }; use ic_sns_governance::{ - governance::TREASURY_SUBACCOUNT_NONCE, - neuron::DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER, - pb::v1::{neuron::DissolveState, NervousSystemParameters, NeuronId, NeuronPermission}, + governance::TREASURY_SUBACCOUNT_NONCE, neuron::DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER, + }; + use ic_sns_governance_api::pb::v1::{ + neuron::DissolveState, NervousSystemParameters, NeuronId, NeuronPermission, }; use ic_sns_swap::swap::NEURON_BASKET_MEMO_RANGE_START; use icrc_ledger_types::icrc1::account::Account; @@ -831,7 +833,7 @@ mod test { }), }; - let parameters = NervousSystemParameters::with_default_values(); + let parameters = NervousSystemParameters::default(); let initial_neurons = initial_token_distribution .get_initial_neurons(¶meters) @@ -946,7 +948,7 @@ mod test { }; // A basic valid NervousSystemParameter - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); // Validate that the initial version is valid assert!(initial_token_distribution @@ -1174,7 +1176,7 @@ mod test { }; // A basic valid NervousSystemParameter - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); // Validate that the initial version is valid initial_token_distribution @@ -1224,7 +1226,7 @@ mod test { }; // A basic valid NervousSystemParameter - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); // Validate that the initial version is valid assert!(initial_token_distribution @@ -1283,7 +1285,7 @@ mod test { }; // A basic valid NervousSystemParameter - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); // Validate that the initial version is valid assert!(initial_token_distribution @@ -1435,7 +1437,7 @@ mod test { }; // A basic valid NervousSystemParameter - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); // Validate that the initial version is valid initial_token_distribution diff --git a/rs/sns/init/src/lib.rs b/rs/sns/init/src/lib.rs index 77bcde55220..e1f796a6141 100644 --- a/rs/sns/init/src/lib.rs +++ b/rs/sns/init/src/lib.rs @@ -16,7 +16,7 @@ use ic_nns_constants::{ LEDGER_CANISTER_ID as ICP_LEDGER_CANISTER_ID, LIFELINE_CANISTER_ID, NNS_UI_CANISTER_ID, REGISTRY_CANISTER_ID, ROOT_CANISTER_ID, SNS_WASM_CANISTER_ID, }; -use ic_sns_governance::{ +use ic_sns_governance_api::{ init::GovernanceCanisterInitPayloadBuilder, pb::v1::{ governance::{SnsMetadata, Version}, @@ -382,7 +382,7 @@ impl SnsInitPayload { /// acts like `SnsInitPayload::default()` except that it will provide default "real" values /// for default-able parameters. pub fn with_default_values() -> Self { - let nervous_system_parameters_default = NervousSystemParameters::with_default_values(); + let nervous_system_parameters_default = NervousSystemParameters::default(); let voting_rewards_parameters = nervous_system_parameters_default .voting_rewards_parameters .as_ref() @@ -555,15 +555,15 @@ impl SnsInitPayload { sns_canister_ids: &SnsCanisterIds, deployed_version: Option, ) -> Result { - let mut governance = GovernanceCanisterInitPayloadBuilder::new().build(); + let parameters = self.get_nervous_system_parameters(); + let mut governance = GovernanceCanisterInitPayloadBuilder::new() + .with_parameters(parameters.clone()) + .build(); governance.ledger_canister_id = Some(sns_canister_ids.ledger); governance.root_canister_id = Some(sns_canister_ids.root); governance.swap_canister_id = Some(sns_canister_ids.swap); governance.deployed_version = deployed_version; - let parameters = self.get_nervous_system_parameters(); - governance.parameters = Some(parameters.clone()); - governance.sns_metadata = Some(self.get_sns_metadata()); governance.neurons = self.get_initial_neurons(¶meters)?; @@ -743,7 +743,7 @@ impl SnsInitPayload { /// Returns a complete NervousSystemParameter struct with its corresponding SnsInitPayload /// fields filled out. fn get_nervous_system_parameters(&self) -> NervousSystemParameters { - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); let all_permissions = NeuronPermissionList { permissions: NeuronPermissionType::all(), }; @@ -1075,7 +1075,7 @@ impl SnsInitPayload { fn validate_neuron_minimum_dissolve_delay_to_vote_seconds(&self) -> Result<(), String> { // As this is not currently configurable, pull the default value from - let max_dissolve_delay_seconds = *NervousSystemParameters::with_default_values() + let max_dissolve_delay_seconds = *NervousSystemParameters::default() .max_dissolve_delay_seconds .as_ref() .unwrap(); @@ -1161,18 +1161,18 @@ impl SnsInitPayload { .as_ref() .ok_or_else(|| "Error: logo must be specified".to_string())?; - SnsMetadata::validate_logo(logo) + ic_sns_governance::pb::v1::governance::SnsMetadata::validate_logo(logo) } fn validate_url(&self) -> Result<(), String> { let url = self.url.as_ref().ok_or("Error: url must be specified")?; - SnsMetadata::validate_url(url)?; + ic_sns_governance::pb::v1::governance::SnsMetadata::validate_url(url)?; Ok(()) } fn validate_name(&self) -> Result<(), String> { let name = self.name.as_ref().ok_or("Error: name must be specified")?; - SnsMetadata::validate_name(name)?; + ic_sns_governance::pb::v1::governance::SnsMetadata::validate_name(name)?; Ok(()) } @@ -1181,7 +1181,7 @@ impl SnsInitPayload { .description .as_ref() .ok_or("Error: description must be specified")?; - SnsMetadata::validate_description(description)?; + ic_sns_governance::pb::v1::governance::SnsMetadata::validate_description(description)?; Ok(()) } @@ -1190,11 +1190,11 @@ impl SnsInitPayload { .initial_reward_rate_basis_points .ok_or("Error: initial_reward_rate_basis_points must be specified")?; if initial_reward_rate_basis_points - > VotingRewardsParameters::INITIAL_REWARD_RATE_BASIS_POINTS_CEILING + > ic_sns_governance::pb::v1::VotingRewardsParameters::INITIAL_REWARD_RATE_BASIS_POINTS_CEILING { Err(format!( "Error: initial_reward_rate_basis_points must be less than or equal to {}", - VotingRewardsParameters::INITIAL_REWARD_RATE_BASIS_POINTS_CEILING + ic_sns_governance::pb::v1::VotingRewardsParameters::INITIAL_REWARD_RATE_BASIS_POINTS_CEILING )) } else { Ok(()) @@ -1247,11 +1247,11 @@ impl SnsInitPayload { .ok_or("Error: max_dissolve_delay_bonus_percentage must be specified")?; if max_dissolve_delay_bonus_percentage - > NervousSystemParameters::MAX_DISSOLVE_DELAY_BONUS_PERCENTAGE_CEILING + > ic_sns_governance::pb::v1::NervousSystemParameters::MAX_DISSOLVE_DELAY_BONUS_PERCENTAGE_CEILING { Err(format!( "max_dissolve_delay_bonus_percentage must be less than {}", - NervousSystemParameters::MAX_DISSOLVE_DELAY_BONUS_PERCENTAGE_CEILING + ic_sns_governance::pb::v1::NervousSystemParameters::MAX_DISSOLVE_DELAY_BONUS_PERCENTAGE_CEILING )) } else { Ok(()) @@ -1262,10 +1262,12 @@ impl SnsInitPayload { let max_age_bonus_percentage = self .max_age_bonus_percentage .ok_or("Error: max_age_bonus_percentage must be specified")?; - if max_age_bonus_percentage > NervousSystemParameters::MAX_AGE_BONUS_PERCENTAGE_CEILING { + if max_age_bonus_percentage + > ic_sns_governance::pb::v1::NervousSystemParameters::MAX_AGE_BONUS_PERCENTAGE_CEILING + { Err(format!( "max_age_bonus_percentage must be less than {}", - NervousSystemParameters::MAX_AGE_BONUS_PERCENTAGE_CEILING + ic_sns_governance::pb::v1::NervousSystemParameters::MAX_AGE_BONUS_PERCENTAGE_CEILING )) } else { Ok(()) @@ -1278,18 +1280,18 @@ impl SnsInitPayload { .ok_or("Error: initial_voting_period_seconds must be specified")?; if initial_voting_period_seconds - < NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_FLOOR + < ic_sns_governance::pb::v1::NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_FLOOR { Err(format!( "NervousSystemParameters.initial_voting_period_seconds must be greater than {}", - NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_FLOOR + ic_sns_governance::pb::v1::NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_FLOOR )) } else if initial_voting_period_seconds - > NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_CEILING + > ic_sns_governance::pb::v1::NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_CEILING { Err(format!( "NervousSystemParameters.initial_voting_period_seconds must be less than {}", - NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_CEILING + ic_sns_governance::pb::v1::NervousSystemParameters::INITIAL_VOTING_PERIOD_SECONDS_CEILING )) } else { Ok(()) @@ -1305,18 +1307,18 @@ impl SnsInitPayload { .ok_or("Error: initial_voting_period_seconds must be specified")?; if wait_for_quiet_deadline_increase_seconds - < NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_FLOOR + < ic_sns_governance::pb::v1::NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_FLOOR { Err(format!( "NervousSystemParameters.wait_for_quiet_deadline_increase_seconds must be greater than or equal to {}", - NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_FLOOR + ic_sns_governance::pb::v1::NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_FLOOR )) } else if wait_for_quiet_deadline_increase_seconds - > NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_CEILING + > ic_sns_governance::pb::v1::NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_CEILING { Err(format!( "NervousSystemParameters.wait_for_quiet_deadline_increase_seconds must be less than or equal to {}", - NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_CEILING + ic_sns_governance::pb::v1::NervousSystemParameters::WAIT_FOR_QUIET_DEADLINE_INCREASE_SECONDS_CEILING )) // If `wait_for_quiet_deadline_increase_seconds > initial_voting_period_seconds / 2`, any flip (including an initial `yes` vote) // will always cause the deadline to be increased. That seems like unreasonable behavior, so we prevent that from being @@ -2884,7 +2886,12 @@ initial_token_distribution: !FractionalDeveloperVotingPower }; // Assert that the Governance canister would accept this init payload - assert!(ValidGovernanceProto::try_from(governance.clone()).is_ok()); + assert!( + ValidGovernanceProto::try_from(ic_sns_governance::pb::v1::Governance::from( + governance.clone() + )) + .is_ok() + ); // For each neuron, assert that its account exists on the Ledger for neuron in governance.neurons.values() { diff --git a/rs/sns/integration_tests/BUILD.bazel b/rs/sns/integration_tests/BUILD.bazel index cd37a5ec7b1..ef6f98b383d 100644 --- a/rs/sns/integration_tests/BUILD.bazel +++ b/rs/sns/integration_tests/BUILD.bazel @@ -25,6 +25,7 @@ BASE_DEPENDENCIES = [ "//rs/rust_canisters/dfn_candid", "//rs/rust_canisters/dfn_core", "//rs/sns/governance:governance", + "//rs/sns/governance/api", "//rs/sns/root", "//rs/sns/swap", "//rs/state_machine_tests", diff --git a/rs/sns/integration_tests/src/governance.rs b/rs/sns/integration_tests/src/governance.rs index 7540df003fb..ba9eff38cee 100644 --- a/rs/sns/integration_tests/src/governance.rs +++ b/rs/sns/integration_tests/src/governance.rs @@ -1,5 +1,5 @@ use dfn_candid::candid_one; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ GetSnsInitializationParametersRequest, GetSnsInitializationParametersResponse, }; use ic_sns_init::{pb::v1::SnsInitPayload, SnsCanisterIds}; diff --git a/rs/sns/integration_tests/src/http_request.rs b/rs/sns/integration_tests/src/http_request.rs index a7f6eac9ee1..c662f3061a4 100644 --- a/rs/sns/integration_tests/src/http_request.rs +++ b/rs/sns/integration_tests/src/http_request.rs @@ -1,7 +1,7 @@ use canister_test::Canister; use dfn_candid::candid_one; use ic_canisters_http_types::{HttpRequest, HttpResponse}; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ NervousSystemParameters, NeuronPermissionList, NeuronPermissionType, }; use ic_sns_test_utils::itest_helpers::{ @@ -50,7 +50,7 @@ fn test_http_request_decoding_quota() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/initialization_flow.rs b/rs/sns/integration_tests/src/initialization_flow.rs index 3d984bba774..cba1c28492d 100644 --- a/rs/sns/integration_tests/src/initialization_flow.rs +++ b/rs/sns/integration_tests/src/initialization_flow.rs @@ -31,7 +31,7 @@ use ic_nns_test_utils::{ sns_swap_get_auto_finalization_status, }, }; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ governance::Mode::{Normal, PreInitializationSwap}, ListNeurons, }; diff --git a/rs/sns/integration_tests/src/ledger.rs b/rs/sns/integration_tests/src/ledger.rs index 92bb6db28b2..632f62aac6f 100644 --- a/rs/sns/integration_tests/src/ledger.rs +++ b/rs/sns/integration_tests/src/ledger.rs @@ -6,17 +6,12 @@ use ic_crypto_sha2::Sha256; use ic_ledger_core::{tokens::TOKEN_SUBDIVIDABLE_BY, Tokens}; use ic_nervous_system_common::DEFAULT_TRANSFER_FEE; use ic_nervous_system_common_test_keys::TEST_USER1_KEYPAIR; -use ic_sns_governance::pb::v1::manage_neuron_response::Command as CommandResponse; -use icrc_ledger_types::icrc1::{ - account::Account, - transfer::{Memo, TransferArg}, -}; - -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ manage_neuron::{ claim_or_refresh::{By, MemoAndController}, ClaimOrRefresh, Command, Disburse, }, + manage_neuron_response::Command as CommandResponse, Account as AccountProto, ManageNeuron, ManageNeuronResponse, NervousSystemParameters, NeuronPermissionList, NeuronPermissionType, }; @@ -24,6 +19,10 @@ use ic_sns_test_utils::{ icrc1, itest_helpers::{local_test_on_sns_subnet, SnsCanisters, SnsTestsInitPayloadBuilder}, }; +use icrc_ledger_types::icrc1::{ + account::Account, + transfer::{Memo, TransferArg}, +}; // This tests the whole neuron lifecycle in integration with the ledger. Namely // tests that the neuron can be staked from a ledger account. That the neuron @@ -40,7 +39,7 @@ fn test_stake_and_disburse_neuron_with_notification() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/manage_dapp_canister_settings.rs b/rs/sns/integration_tests/src/manage_dapp_canister_settings.rs index 3a3a3dc0832..419d60094ef 100644 --- a/rs/sns/integration_tests/src/manage_dapp_canister_settings.rs +++ b/rs/sns/integration_tests/src/manage_dapp_canister_settings.rs @@ -9,7 +9,7 @@ use ic_nns_test_utils::state_test_helpers::{ create_canister, sns_claim_staked_neuron, sns_get_proposal, sns_make_proposal, sns_stake_neuron, sns_wait_for_proposal_executed_or_failed, sns_wait_for_proposal_execution, }; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ proposal::Action, LogVisibility, ManageDappCanisterSettings, NervousSystemParameters, NeuronPermissionList, NeuronPermissionType, Proposal, }; @@ -39,7 +39,7 @@ fn test_manage_dapp_canister_settings_successful() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; // Step 1.2: Set up the SNS canisters. @@ -176,7 +176,7 @@ fn test_manage_dapp_canister_settings_failure() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; // Step 1.2: Set up the SNS canisters. diff --git a/rs/sns/integration_tests/src/manage_ledger_parameters.rs b/rs/sns/integration_tests/src/manage_ledger_parameters.rs index 8ad1dafcda7..9cc9833fd04 100644 --- a/rs/sns/integration_tests/src/manage_ledger_parameters.rs +++ b/rs/sns/integration_tests/src/manage_ledger_parameters.rs @@ -11,7 +11,7 @@ use ic_nns_test_utils::{ sns_wait_for_proposal_execution, update, }, }; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ proposal::Action, ManageLedgerParameters, NervousSystemParameters, NeuronId, NeuronPermissionList, NeuronPermissionType, Proposal, }; @@ -238,7 +238,7 @@ fn set_up_sns_for_mlp( neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/nervous_system_functions.rs b/rs/sns/integration_tests/src/nervous_system_functions.rs index 110bd58840a..61dc68ca6b4 100644 --- a/rs/sns/integration_tests/src/nervous_system_functions.rs +++ b/rs/sns/integration_tests/src/nervous_system_functions.rs @@ -3,11 +3,11 @@ use ic_canister_client_sender::Sender; use ic_ledger_core::Tokens; use ic_nervous_system_common::ONE_YEAR_SECONDS; use ic_nervous_system_common_test_keys::TEST_USER1_KEYPAIR; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ nervous_system_function::{FunctionType, GenericNervousSystemFunction}, proposal::Action, ExecuteGenericNervousSystemFunction, NervousSystemFunction, NervousSystemParameters, - NeuronPermissionList, NeuronPermissionType, Proposal, ProposalDecisionStatus, ProposalId, + NeuronPermissionList, NeuronPermissionType, Proposal, ProposalId, }; use ic_sns_test_utils::itest_helpers::{ install_rust_canister_with_memory_allocation, local_test_on_sns_subnet, SnsCanisters, @@ -21,7 +21,6 @@ async fn assert_proposal_executed(sns_canisters: &SnsCanisters<'_>, proposal_id: assert!(proposal_data.executed_timestamp_seconds > 0); assert_eq!(proposal_data.failure_reason, None); assert_eq!(proposal_data.failed_timestamp_seconds, 0); - assert_eq!(proposal_data.status(), ProposalDecisionStatus::Executed); } /// Tests that you can add a NervousSystemFunction, that it can then validate and execute @@ -39,7 +38,7 @@ fn test_add_remove_and_execute_nervous_system_functions() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/nervous_system_parameters.rs b/rs/sns/integration_tests/src/nervous_system_parameters.rs index 09dfc007687..4589e4f05cf 100644 --- a/rs/sns/integration_tests/src/nervous_system_parameters.rs +++ b/rs/sns/integration_tests/src/nervous_system_parameters.rs @@ -6,7 +6,7 @@ use ic_nervous_system_common_test_keys::{ TEST_USER1_KEYPAIR, TEST_USER2_KEYPAIR, TEST_USER3_KEYPAIR, TEST_USER4_KEYPAIR, TEST_USER5_KEYPAIR, }; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ proposal::Action, Motion, NervousSystemParameters, NeuronPermissionList, NeuronPermissionType, Proposal, }; @@ -23,7 +23,7 @@ fn test_init_with_sys_params() { let system_params = NervousSystemParameters { transaction_fee_e8s: Some(100_000), reject_cost_e8s: Some(0), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -75,7 +75,7 @@ fn test_existing_proposals_unaffected_by_sns_parameter_changes() { }), initial_voting_period_seconds: Some(initial_initial_voting_period_seconds), wait_for_quiet_deadline_increase_seconds: Some(ONE_DAY_SECONDS / 8), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -90,7 +90,7 @@ fn test_existing_proposals_unaffected_by_sns_parameter_changes() { let sns_canisters = SnsCanisters::set_up(&runtime, sns_init_payload).await; // slow // Create neurons. - let transaction_fee_e8s = system_params.transaction_fee_e8s(); + let transaction_fee_e8s = system_params.transaction_fee_e8s.unwrap(); let stake_amount = Tokens::from_e8s(user_1_tokens.get_e8s() - transaction_fee_e8s).get_tokens(); let user_1_neuron_id = sns_canisters diff --git a/rs/sns/integration_tests/src/neuron.rs b/rs/sns/integration_tests/src/neuron.rs index 5b03363dfcb..ce0618e8499 100644 --- a/rs/sns/integration_tests/src/neuron.rs +++ b/rs/sns/integration_tests/src/neuron.rs @@ -23,7 +23,10 @@ use ic_nns_test_utils::{ }; use ic_sns_governance::{ governance::Governance, - neuron::{NeuronState, DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER}, + types::{test_helpers::NativeEnvironment, Environment}, +}; +use ic_sns_governance_api::{ + neuron::NeuronState, pb::v1::{ governance::{self, SnsMetadata}, governance_error::ErrorType, @@ -36,13 +39,12 @@ use ic_sns_governance::{ manage_neuron_response::Command as CommandResponse, neuron::DissolveState::{self, DissolveDelaySeconds}, proposal::Action, - Account as AccountProto, Ballot, Empty, Governance as GovernanceProto, GovernanceError, + Account as AccountApi, Ballot, Empty, Governance as GovernanceProto, GovernanceError, ListNeurons, ListNeuronsResponse, ManageNeuron, ManageNeuronResponse, Motion, NervousSystemParameters, Neuron, NeuronId, NeuronPermission, NeuronPermissionList, NeuronPermissionType, Proposal, ProposalData, ProposalId, ProposalRewardStatus, RewardEvent, Vote, VotingRewardsParameters, WaitForQuietState, }, - types::{test_helpers::NativeEnvironment, Environment}, }; use ic_sns_test_utils::{ icrc1, @@ -149,7 +151,7 @@ fn test_list_neurons_of_principal() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let alloc = Tokens::from_tokens(1000).unwrap(); @@ -201,7 +203,7 @@ fn test_claim_neuron_with_default_permissions() { let expected = vec![NeuronPermission::new( &user.get_principal_id(), - NervousSystemParameters::with_default_values() + NervousSystemParameters::default() .neuron_claimer_permissions .unwrap() .permissions, @@ -222,7 +224,7 @@ fn test_canister_can_claim_and_manage_neuron() { let universal_canister = set_up_universal_canister(&runtime).await; let principal_id = universal_canister.canister_id().get(); - let mut params = NervousSystemParameters::with_default_values(); + let mut params = NervousSystemParameters::default(); params.neuron_claimer_permissions = Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }); @@ -335,7 +337,7 @@ fn test_claim_neuron_happy() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -425,7 +427,7 @@ fn test_claim_neuron_happy() { assert_eq!(neuron.cached_neuron_stake_e8s, TOKEN_SUBDIVIDABLE_BY); assert_eq!( neuron.voting_power_percentage_multiplier, - DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER + ic_sns_governance::neuron::DEFAULT_VOTING_POWER_PERCENTAGE_MULTIPLIER ); Ok(()) @@ -445,7 +447,7 @@ fn test_claim_neuron_fails_when_max_number_of_neurons_is_reached() { permissions: NeuronPermissionType::all(), }), max_number_of_neurons: Some(1), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -552,7 +554,7 @@ fn test_refresh_neuron() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -669,7 +671,7 @@ fn test_neuron_action_is_not_authorized() { permissions: NeuronPermissionType::all(), }), voting_rewards_parameters: Some(VOTING_REWARDS_PARAMETERS), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -728,7 +730,7 @@ fn get_sns_canisters_now_seconds() -> i64 { .duration_since(std::time::UNIX_EPOCH) .unwrap() .as_secs() as i64 - + (NervousSystemParameters::with_default_values() + + (NervousSystemParameters::default() .initial_voting_period_seconds .unwrap() as i64) + 1 @@ -781,7 +783,7 @@ fn test_disburse_maturity_succeeds_to_self() { let in_progress = &neuron.disburse_maturity_in_progress[0]; let target_account = in_progress.account_to_disburse_to.as_ref().unwrap().clone(); assert_eq!(in_progress.amount_e8s, earned_maturity_e8s); - assert_eq!(target_account, AccountProto::from(account_identifier)); + assert_eq!(target_account, AccountApi::from(account_identifier)); let now = get_sns_canisters_now_seconds(); let ts = in_progress.timestamp_of_disbursement_seconds as i64; let d_age = now - ts; @@ -826,7 +828,7 @@ fn test_disburse_maturity_succeeds_to_other_account() { subaccount: subaccount.to_vec(), command: Some(Command::DisburseMaturity(DisburseMaturity { percentage_to_disburse: 50, - to_account: Some(AccountProto { + to_account: Some(AccountApi { owner: Some(maturity_receiver.get_principal_id()), subaccount: None, }), @@ -858,7 +860,7 @@ fn test_disburse_maturity_succeeds_to_other_account() { assert_eq!(in_progress.amount_e8s, response.amount_disbursed_e8s); assert_eq!( target_account, - AccountProto::from(Account { + AccountApi::from(Account { owner: maturity_receiver.get_principal_id().0, subaccount: None }) @@ -901,7 +903,7 @@ fn test_disburse_maturity_fails_if_no_maturity() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -977,7 +979,7 @@ async fn create_sns_canisters_with_staked_neuron_and_maturity<'a>( round_duration_seconds: Some(10), ..VOTING_REWARDS_PARAMETERS }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1259,7 +1261,7 @@ async fn zero_total_reward_shares() { swap_canister_id: Some(PrincipalId::new(29, swap_canister_id)), parameters: Some(NervousSystemParameters { voting_rewards_parameters: Some(VOTING_REWARDS_PARAMETERS), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }), mode: governance::Mode::Normal as i32, @@ -1376,7 +1378,7 @@ async fn couple_of_neurons_who_voted_get_rewards() { let nervous_system_parameters = NervousSystemParameters { voting_rewards_parameters: Some(VOTING_REWARDS_PARAMETERS), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let environment = NativeEnvironment::default(); @@ -1653,7 +1655,7 @@ fn test_one_user_cannot_claim_other_users_neuron() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1788,7 +1790,7 @@ fn test_neuron_add_all_permissions_to_self() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1810,7 +1812,7 @@ fn test_neuron_add_all_permissions_to_self() { ); assert_eq!( neuron.permissions[0].permission_type.len(), - NervousSystemParameters::with_default_values() + NervousSystemParameters::default() .neuron_claimer_permissions .unwrap() .permissions @@ -1861,7 +1863,7 @@ fn test_neuron_add_multiple_permissions_and_principals() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1945,7 +1947,7 @@ fn test_neuron_add_non_grantable_permission_fails() { permissions: vec![], }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2017,7 +2019,7 @@ fn test_exceeding_max_principals_for_neuron_fails() { }), max_number_of_principals_per_neuron: Some(5_u64), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2110,7 +2112,7 @@ fn test_add_neuron_permission_missing_principal_id_fails() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2176,7 +2178,7 @@ fn test_neuron_remove_all_permissions_of_self() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2232,7 +2234,7 @@ fn test_neuron_remove_some_permissions() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2301,7 +2303,7 @@ fn test_neuron_remove_permissions_of_wrong_principal() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2374,7 +2376,7 @@ fn test_neuron_remove_permissions_of_different_principal() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2460,7 +2462,7 @@ fn test_remove_neuron_permission_missing_principal_id_fails() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2524,7 +2526,7 @@ fn test_remove_neuron_permission_when_neuron_missing_permission_type_fails() { permissions: NeuronPermissionType::all(), }), // ManagePrincipals and Vote will be granted to the claimer automatically - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2603,7 +2605,7 @@ fn test_disburse_neuron_to_self_succeeds() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2718,7 +2720,7 @@ fn test_disburse_neuron_to_different_account_succeeds() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2819,7 +2821,7 @@ fn test_disburse_neuron_burns_neuron_fees() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -2944,7 +2946,7 @@ fn test_split_neuron_succeeds() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -3031,7 +3033,7 @@ fn test_split_neuron_inheritance() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -3126,7 +3128,7 @@ fn test_split_neuron_child_amount_is_above_min_stake() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -3214,7 +3216,7 @@ fn test_split_neuron_parent_amount_is_above_min_stake() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -3302,7 +3304,7 @@ fn test_neuron_voting_power_multiplier_with_ballots() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let dissolve_delay_seconds = *params diff --git a/rs/sns/integration_tests/src/proposals.rs b/rs/sns/integration_tests/src/proposals.rs index 3ac6b042fdf..55c06181079 100644 --- a/rs/sns/integration_tests/src/proposals.rs +++ b/rs/sns/integration_tests/src/proposals.rs @@ -7,22 +7,22 @@ use ic_nervous_system_common_test_keys::{ TEST_USER1_KEYPAIR, TEST_USER2_KEYPAIR, TEST_USER3_KEYPAIR, TEST_USER4_KEYPAIR, }; use ic_sns_governance::{ - pb::v1::{ - get_proposal_response::Result::{Error, Proposal as ResponseProposal}, - governance_error::ErrorType::{self, PreconditionFailed}, - manage_neuron_response::Command, - proposal::Action, - Ballot, GetProposal, GetProposalResponse, ListProposals, ListProposalsResponse, - ManageNeuronResponse, Motion, NervousSystemParameters, NeuronId, NeuronPermissionList, - NeuronPermissionType, Proposal, ProposalData, ProposalDecisionStatus, ProposalId, - ProposalRewardStatus, RewardEvent, Vote, VotingRewardsParameters, - }, proposal::{ PROPOSAL_MOTION_TEXT_BYTES_MAX, PROPOSAL_SUMMARY_BYTES_MAX, PROPOSAL_TITLE_BYTES_MAX, PROPOSAL_URL_CHAR_MAX, }, reward, }; +use ic_sns_governance_api::pb::v1::{ + get_proposal_response::Result::{Error, Proposal as ResponseProposal}, + governance_error::ErrorType::{self, PreconditionFailed}, + manage_neuron_response::Command, + proposal::Action, + Ballot, GetProposal, GetProposalResponse, ListProposals, ListProposalsResponse, + ManageNeuronResponse, Motion, NervousSystemParameters, NeuronId, NeuronPermissionList, + NeuronPermissionType, Proposal, ProposalData, ProposalDecisionStatus, ProposalId, + ProposalRewardStatus, RewardEvent, Vote, VotingRewardsParameters, +}; use ic_sns_test_utils::{ itest_helpers::{ state_machine_test_on_sns_subnet, SnsCanisters, SnsTestsInitPayloadBuilder, UserInfo, @@ -60,7 +60,7 @@ fn test_motion_proposal_execution() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -146,7 +146,7 @@ fn test_manage_nervous_system_parameters_proposal_execution() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -246,7 +246,7 @@ fn test_voting_with_three_neurons_with_the_same_stake() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -499,7 +499,7 @@ fn test_list_proposals_determinism() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -613,7 +613,7 @@ fn test_proposal_format_validation() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -720,7 +720,7 @@ fn test_neuron_configuration_needed_for_proposals() { neuron_minimum_dissolve_delay_to_vote_seconds: Some( neuron_minimum_dissolve_delay_to_vote_seconds, ), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -832,7 +832,7 @@ fn test_ballots_set_for_multiple_neurons() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let users = vec![ @@ -923,7 +923,7 @@ fn test_vote_on_non_existent_proposal() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -971,7 +971,7 @@ fn test_ineligible_neuron_voting_fails() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1027,7 +1027,7 @@ fn test_repeated_voting_fails() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1129,7 +1129,7 @@ fn test_following_and_voting() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1256,7 +1256,7 @@ fn test_following_and_voting_from_non_proposer() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1348,7 +1348,7 @@ fn test_following_multiple_neurons_reach_majority() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1457,7 +1457,7 @@ fn test_proposal_rejection() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1579,7 +1579,7 @@ fn test_proposal_garbage_collection() { permissions: NeuronPermissionType::all(), }), max_proposals_to_keep_per_action: Some(1), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -1693,7 +1693,7 @@ fn test_change_voting_rewards_round_duration() { }), initial_voting_period_seconds: Some(initial_voting_period_seconds), wait_for_quiet_deadline_increase_seconds: Some(initial_voting_period_seconds / 4), // The default of one day is too short - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let genesis_timestamp_seconds = std::time::SystemTime::now() @@ -1989,7 +1989,7 @@ fn test_intermittent_proposal_submission() { }), initial_voting_period_seconds: Some(initial_voting_period_seconds), wait_for_quiet_deadline_increase_seconds: Some(initial_voting_period_seconds / 4), // The default of one day is too short - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/sns_treasury.rs b/rs/sns/integration_tests/src/sns_treasury.rs index 9d257549020..2d7f93c2563 100644 --- a/rs/sns/integration_tests/src/sns_treasury.rs +++ b/rs/sns/integration_tests/src/sns_treasury.rs @@ -17,16 +17,12 @@ use ic_nns_test_utils::{ sns_wait_for_proposal_execution, }, }; -use ic_sns_governance::{ - governance::TREASURY_SUBACCOUNT_NONCE, - pb::v1::{ - governance_error::ErrorType as SnsErrorType, proposal::Action, - transfer_sns_treasury_funds::TransferFrom, GovernanceError as SnsGovernanceError, - MintSnsTokens, Motion, NervousSystemParameters, NeuronId as SnsNeuronId, - NeuronPermissionList, NeuronPermissionType, Proposal, ProposalData, - TransferSnsTreasuryFunds, Vote, - }, - types::E8S_PER_TOKEN, +use ic_sns_governance::{governance::TREASURY_SUBACCOUNT_NONCE, types::E8S_PER_TOKEN}; +use ic_sns_governance_api::pb::v1::{ + governance_error::ErrorType as SnsErrorType, proposal::Action, + transfer_sns_treasury_funds::TransferFrom, GovernanceError as SnsGovernanceError, + MintSnsTokens, Motion, NervousSystemParameters, NeuronId as SnsNeuronId, NeuronPermissionList, + NeuronPermissionType, Proposal, ProposalData, TransferSnsTreasuryFunds, Vote, }; use ic_sns_swap::pb::v1::{Init as SwapInit, NeuronBasketConstructionParameters}; use ic_sns_test_utils::{ @@ -160,7 +156,7 @@ fn new_treasury_scenario( neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let mut sns_init_payload = SnsTestsInitPayloadBuilder::new() diff --git a/rs/sns/integration_tests/src/timers.rs b/rs/sns/integration_tests/src/timers.rs index f8f5f15592f..6250d3e1e73 100644 --- a/rs/sns/integration_tests/src/timers.rs +++ b/rs/sns/integration_tests/src/timers.rs @@ -4,7 +4,7 @@ use ic_nervous_system_proto::pb::v1::{ GetTimersRequest, GetTimersResponse, ResetTimersRequest, ResetTimersResponse, Timers, }; use ic_nns_test_utils::sns_wasm::{build_governance_sns_wasm, build_root_sns_wasm}; -use ic_sns_governance::{init::GovernanceCanisterInitPayloadBuilder, pb::v1::Governance}; +use ic_sns_governance_api::{init::GovernanceCanisterInitPayloadBuilder, pb::v1::Governance}; use ic_sns_root::pb::v1::SnsRootCanister; use ic_sns_swap::pb::v1::{ GetStateRequest, GetStateResponse, Init, Lifecycle, NeuronBasketConstructionParameters, diff --git a/rs/sns/integration_tests/src/upgrade_canister.rs b/rs/sns/integration_tests/src/upgrade_canister.rs index 2e35c43cd93..1c0a3e95dcc 100644 --- a/rs/sns/integration_tests/src/upgrade_canister.rs +++ b/rs/sns/integration_tests/src/upgrade_canister.rs @@ -18,7 +18,7 @@ use ic_nns_test_utils::state_test_helpers::{ sns_wait_for_proposal_execution, update, }; use ic_protobuf::types::v1::CanisterInstallMode as CanisterInstallModeProto; -use ic_sns_governance::pb::v1::{ +use ic_sns_governance_api::pb::v1::{ governance_error::ErrorType, proposal::Action, NervousSystemParameters, NeuronId, NeuronPermissionList, NeuronPermissionType, Proposal, UpgradeSnsControlledCanister, }; @@ -60,7 +60,7 @@ fn setup_sns( neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -194,7 +194,7 @@ fn test_upgrade_canister_proposal_reinstall() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -342,7 +342,7 @@ fn test_upgrade_canister_proposal_execution_fail() { neuron_claimer_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let mut sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -607,7 +607,7 @@ fn test_upgrade_after_state_shrink() { neuron_grantable_permissions: Some(NeuronPermissionList { permissions: NeuronPermissionType::all(), }), - ..NervousSystemParameters::with_default_values() + ..NervousSystemParameters::default() }; let sns_init_payload = SnsTestsInitPayloadBuilder::new() @@ -699,7 +699,7 @@ fn test_upgrade_after_state_shrink() { fn test_install_canisters_in_any_order() { state_machine_test_on_sns_subnet(|runtime| async move { let mut sns_init_payload = SnsTestsInitPayloadBuilder::new() - .with_nervous_system_parameters(NervousSystemParameters::with_default_values()) + .with_nervous_system_parameters(NervousSystemParameters::default()) .build(); // Initialize the SNS canisters but do not install any canister code diff --git a/rs/sns/integration_tests/test_canisters/sns_governance_mem_test_canister.rs b/rs/sns/integration_tests/test_canisters/sns_governance_mem_test_canister.rs index 26f7306e4a9..ac74be0cf18 100644 --- a/rs/sns/integration_tests/test_canisters/sns_governance_mem_test_canister.rs +++ b/rs/sns/integration_tests/test_canisters/sns_governance_mem_test_canister.rs @@ -306,7 +306,7 @@ fn populate_canister_state() { ); // Generate initial Governance data - let nervous_system_parameters = NervousSystemParameters::with_default_values(); + let nervous_system_parameters = NervousSystemParameters::default(); let mut proto = GovernanceProto { neurons: Default::default(), diff --git a/rs/sns/test_utils/BUILD.bazel b/rs/sns/test_utils/BUILD.bazel index 302d4a13122..8e0ce635bbb 100644 --- a/rs/sns/test_utils/BUILD.bazel +++ b/rs/sns/test_utils/BUILD.bazel @@ -26,6 +26,7 @@ BASE_DEPENDENCIES = [ "//rs/rust_canisters/dfn_protobuf", "//rs/rust_canisters/on_wire", "//rs/sns/governance", + "//rs/sns/governance/api", "//rs/sns/init", "//rs/sns/root", "//rs/sns/swap", diff --git a/rs/sns/test_utils/Cargo.toml b/rs/sns/test_utils/Cargo.toml index e4d6996abc0..344e89dcaa6 100644 --- a/rs/sns/test_utils/Cargo.toml +++ b/rs/sns/test_utils/Cargo.toml @@ -32,6 +32,7 @@ ic-nns-constants = { path = "../../nns/constants" } ic-nns-governance = { path = "../../nns/governance" } ic-nns-test-utils = { path = "../../nns/test_utils/" } ic-sns-governance = { path = "../governance", features = ["test"] } +ic-sns-governance-api = { path = "../governance/api" } ic-sns-init = { path = "../init" } ic-sns-root = { path = "../root" } ic-sns-swap = { path = "../swap" } diff --git a/rs/sns/test_utils/src/itest_helpers.rs b/rs/sns/test_utils/src/itest_helpers.rs index f21aee316ac..e3f4339e0ad 100644 --- a/rs/sns/test_utils/src/itest_helpers.rs +++ b/rs/sns/test_utils/src/itest_helpers.rs @@ -21,11 +21,11 @@ use ic_nns_constants::{ GOVERNANCE_CANISTER_ID as NNS_GOVERNANCE_CANISTER_ID, LEDGER_CANISTER_ID as ICP_LEDGER_CANISTER_ID, }; -use ic_sns_governance::{ - governance::TimeWarp, +use ic_sns_governance::governance::TimeWarp; +use ic_sns_governance_api::{ init::GovernanceCanisterInitPayloadBuilder, pb::v1::{ - self as sns_governance_pb, get_neuron_response, get_proposal_response, + self as sns_governance_pb_api, get_neuron_response, get_proposal_response, manage_neuron::{ claim_or_refresh::{By, MemoAndController}, configure::Operation, @@ -158,9 +158,11 @@ impl SnsTestsInitPayloadBuilder { retrieve_blocks_from_ledger_interval_seconds: None, })); + let params = NervousSystemParameters::default(); let mut governance = GovernanceCanisterInitPayloadBuilder::new(); + governance.with_parameters(params); // Existing tests expect this. - governance.with_mode(sns_governance_pb::governance::Mode::Normal); + governance.with_mode(sns_governance_pb_api::governance::Mode::Normal); SnsTestsInitPayloadBuilder { root: SnsRootCanister::default(), @@ -171,7 +173,10 @@ impl SnsTestsInitPayloadBuilder { } } - pub fn with_governance_mode(&mut self, mode: sns_governance_pb::governance::Mode) -> &mut Self { + pub fn with_governance_mode( + &mut self, + mode: sns_governance_pb_api::governance::Mode, + ) -> &mut Self { self.governance.with_mode(mode); self } diff --git a/rs/sns/test_utils/src/state_test_helpers.rs b/rs/sns/test_utils/src/state_test_helpers.rs index a3d630c5999..93fe16bd0f2 100644 --- a/rs/sns/test_utils/src/state_test_helpers.rs +++ b/rs/sns/test_utils/src/state_test_helpers.rs @@ -19,8 +19,8 @@ use ic_nns_test_utils::{ }, state_test_helpers::set_controllers, }; -use ic_sns_governance::pb::v1::{ - governance::Version, +use ic_sns_governance_api::pb::v1::governance::Version; +use ic_sns_governance_api::pb::v1::{ manage_neuron::{self, RegisterVote}, ListNeurons, ListNeuronsResponse, ManageNeuron, ManageNeuronResponse, NervousSystemParameters, NeuronId, ProposalId, Vote,