@@ -44,9 +44,7 @@ use crate::{
4444 RewardNodeProvider , RewardNodeProviders , SettleNeuronsFundParticipationRequest ,
4545 SettleNeuronsFundParticipationResponse , StopOrStartCanister , Tally , Topic ,
4646 UpdateCanisterSettings , UpdateNodeProvider , Vote , VotingPowerEconomics ,
47- WaitForQuietState ,
48- add_or_remove_node_provider:: Change ,
49- archived_monthly_node_provider_rewards,
47+ WaitForQuietState , archived_monthly_node_provider_rewards,
5048 create_service_nervous_system:: LedgerParameters ,
5149 get_neurons_fund_audit_info_response,
5250 governance:: {
@@ -168,7 +166,6 @@ pub mod tla_macros;
168166#[ cfg( feature = "tla" ) ]
169167pub mod tla;
170168
171- use crate :: pb:: v1:: AddOrRemoveNodeProvider ;
172169use crate :: reward:: distribution:: RewardsDistribution ;
173170use crate :: storage:: with_voting_state_machines_mut;
174171#[ cfg( feature = "tla" ) ]
@@ -4128,80 +4125,9 @@ impl Governance {
41284125 let result = self . approve_genesis_kyc ( & proposal. principals ) ;
41294126 self . set_proposal_execution_status ( pid, result) ;
41304127 }
4131- ValidProposalAction :: AddOrRemoveNodeProvider ( ref proposal) => {
4132- if let Some ( change) = & proposal. change {
4133- match change {
4134- Change :: ToAdd ( node_provider) => {
4135- if node_provider. id . is_none ( ) {
4136- self . set_proposal_execution_status (
4137- pid,
4138- Err ( GovernanceError :: new_with_message (
4139- ErrorType :: PreconditionFailed ,
4140- "Node providers must have a principal id." ,
4141- ) ) ,
4142- ) ;
4143- return ;
4144- }
4145-
4146- // Check if the node provider already exists
4147- if self
4148- . heap_data
4149- . node_providers
4150- . iter ( )
4151- . any ( |np| np. id == node_provider. id )
4152- {
4153- self . set_proposal_execution_status (
4154- pid,
4155- Err ( GovernanceError :: new_with_message (
4156- ErrorType :: PreconditionFailed ,
4157- "A node provider with the same principal already exists." ,
4158- ) ) ,
4159- ) ;
4160- return ;
4161- }
4162- self . heap_data . node_providers . push ( node_provider. clone ( ) ) ;
4163- self . set_proposal_execution_status ( pid, Ok ( ( ) ) ) ;
4164- }
4165- Change :: ToRemove ( node_provider) => {
4166- if node_provider. id . is_none ( ) {
4167- self . set_proposal_execution_status (
4168- pid,
4169- Err ( GovernanceError :: new_with_message (
4170- ErrorType :: PreconditionFailed ,
4171- "Node providers must have a principal id." ,
4172- ) ) ,
4173- ) ;
4174- return ;
4175- }
4176-
4177- if let Some ( pos) = self
4178- . heap_data
4179- . node_providers
4180- . iter ( )
4181- . position ( |np| np. id == node_provider. id )
4182- {
4183- self . heap_data . node_providers . remove ( pos) ;
4184- self . set_proposal_execution_status ( pid, Ok ( ( ) ) ) ;
4185- } else {
4186- self . set_proposal_execution_status (
4187- pid,
4188- Err ( GovernanceError :: new_with_message (
4189- ErrorType :: NotFound ,
4190- "Can't find a NodeProvider with the same principal id." ,
4191- ) ) ,
4192- ) ;
4193- }
4194- }
4195- }
4196- } else {
4197- self . set_proposal_execution_status (
4198- pid,
4199- Err ( GovernanceError :: new_with_message (
4200- ErrorType :: PreconditionFailed ,
4201- "The proposal didn't contain a change." ,
4202- ) ) ,
4203- ) ;
4204- }
4128+ ValidProposalAction :: AddOrRemoveNodeProvider ( proposal) => {
4129+ let result = proposal. execute ( & mut self . heap_data . node_providers ) ;
4130+ self . set_proposal_execution_status ( pid, result) ;
42054131 }
42064132 ValidProposalAction :: RewardNodeProvider ( ref reward) => {
42074133 self . reward_node_provider ( pid, reward) . await ;
@@ -4805,7 +4731,7 @@ impl Governance {
48054731 }
48064732
48074733 ValidProposalAction :: AddOrRemoveNodeProvider ( add_or_remove_node_provider) => {
4808- self . validate_add_or_remove_node_provider ( add_or_remove_node_provider )
4734+ add_or_remove_node_provider . validate ( & self . heap_data . node_providers )
48094735 }
48104736 ValidProposalAction :: ApproveGenesisKyc ( _)
48114737 | ValidProposalAction :: RewardNodeProvider ( _)
@@ -4916,79 +4842,6 @@ impl Governance {
49164842 Ok ( ( ) )
49174843 }
49184844
4919- fn validate_add_or_remove_node_provider (
4920- & self ,
4921- add_or_remove_node_provider : & AddOrRemoveNodeProvider ,
4922- ) -> Result < ( ) , GovernanceError > {
4923- match & add_or_remove_node_provider. change {
4924- None => Err ( GovernanceError :: new_with_message (
4925- ErrorType :: InvalidProposal ,
4926- "AddOrRemoveNodeProvider proposal must have a change field" ,
4927- ) ) ,
4928- Some ( Change :: ToAdd ( node_provider) ) => {
4929- let Some ( np_id) = node_provider. id else {
4930- return Err ( GovernanceError :: new_with_message (
4931- ErrorType :: InvalidProposal ,
4932- "AddOrRemoveNodeProvider proposal must have a node provider id" ,
4933- ) ) ;
4934- } ;
4935- // Validate that np does not exist
4936- if self
4937- . heap_data
4938- . node_providers
4939- . iter ( )
4940- . any ( |np| np. id . as_ref ( ) == Some ( & np_id) )
4941- {
4942- return Err ( GovernanceError :: new_with_message (
4943- ErrorType :: InvalidProposal ,
4944- format ! (
4945- "AddOrRemoveNodeProvider cannot add already existing Node Provider: {np_id}"
4946- ) ,
4947- ) ) ;
4948- }
4949-
4950- if let Some ( ref account_identifier) = node_provider. reward_account {
4951- validate_account_identifier ( account_identifier) . map_err ( |e| {
4952- GovernanceError :: new_with_message (
4953- ErrorType :: InvalidProposal ,
4954- format ! ( "The account_identifier field is invalid: {e}" ) ,
4955- )
4956- } ) ?;
4957- }
4958-
4959- // Validate that np does not exist
4960- // validate the account_identifier
4961- Ok ( ( ) )
4962- }
4963- Some ( Change :: ToRemove ( node_provider) ) => {
4964- let Some ( np_id) = node_provider. id else {
4965- return Err ( GovernanceError :: new_with_message (
4966- ErrorType :: InvalidProposal ,
4967- "AddOrRemoveNodeProvider proposal must have a node provider id" ,
4968- ) ) ;
4969- } ;
4970-
4971- // Validate that np exists
4972- if !self
4973- . heap_data
4974- . node_providers
4975- . iter ( )
4976- . any ( |np| np. id . as_ref ( ) == Some ( & np_id) )
4977- {
4978- return Err ( GovernanceError :: new_with_message (
4979- ErrorType :: InvalidProposal ,
4980- format ! (
4981- "AddOrRemoveNodeProvider ToRemove must target an existing Node Provider \
4982- but targeted {np_id}"
4983- ) ,
4984- ) ) ;
4985- }
4986-
4987- Ok ( ( ) )
4988- }
4989- }
4990- }
4991-
49924845 fn validate_add_or_remove_data_centers_payload ( payload : & [ u8 ] ) -> Result < ( ) , String > {
49934846 let decoded_payload = match Decode ! ( [ decoder_config( ) ] ; payload, AddOrRemoveDataCentersProposalPayload )
49944847 {
0 commit comments