NNS Updates 2025-04-11

The NNS Team submitted the following proposals. DFINITY plans to vote on these proposals the following Monday.

Proposals Submitted

Governance

# Upgrade the Governance Canister to Commit 7575e49

__Proposer__: maximilian.summe at dfinity.org

__Source code__: [7575e49a4afa83524c06ad72ce40f588eca93ae2][new-commit]

[new-commit]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2


## Features & Fixes

###  Added

* Governance now gets node provider rewards from the Node Reward Canister in test builds.

###  Changed

* The `_pb` methods now always panic.


## New Commits

```
$ git log --format="%C(auto) %h %s" 910ed6f13390e590b6b9f45ab21ea25182b76553..7575e49a4afa83524c06ad72ce40f588eca93ae2 --  ./rs/nns/governance ./rs/sns/init
 7fb2409c64 feat(nns): Define VotingPowerSnapshot and a collection of snapshots (#4404)
 f045cf0b6a chore(nns): Keep memory ids sorted (#4701)
 40a9c37bd4 feat(nns): Allow Governance to request rewards from Node Reward canister instead of registry (behind flag) (#4693)
 63936e262c feat(nns): Initiate maturity disbursement (#4736)
 cb423a02db feat(nns): Always panic when pb methods are called (#4696)
 3a5a7a1af4 chore(nervous-system): Update changelog for release 2025-04-04 (#4670)
 856b710881 chore(nns): Update changelogs after 3/28 release (#4669)
```


## Current Version

__Current git hash__: 910ed6f13390e590b6b9f45ab21ea25182b76553

__Current wasm hash__: 733adbcbfc5c6218ad30b646dd0ac0075780b1cc0a933249326b8362d749974c


## Verification

See the general instructions on [how to verify] proposals like this. A "quick
start" guide is provided here.

[how to verify]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/rs/nervous_system/docs/proposal_verification.md


### WASM Verification

See ["Building the code"][prereqs] for prerequisites.

[prereqs]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/README.adoc#building-the-code

```
# 1. Get a copy of the code.
git clone git@github.com:dfinity/ic.git
cd ic
# Or, if you already have a copy of the ic repo,
git fetch
git checkout 7575e49a4afa83524c06ad72ce40f588eca93ae2

# 2. Build canisters.
./ci/container/build-ic.sh -c

# 3. Fingerprint the result.
sha256sum ./artifacts/canisters/governance-canister.wasm.gz
```

This should match `wasm_module_hash` field of this proposal.

Node-rewards

# Upgrade the Node-rewards Canister to Commit 7575e49

__Proposer__: maximilian.summe at dfinity.org

__Source code__: [7575e49a4afa83524c06ad72ce40f588eca93ae2][new-commit]

[new-commit]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2


## Features & Fixes

###  Added

* The Node Reward Canister will now perform the calculations that the Registry canister performs for node provider
  rewards.


## New Commits

```
$ git log --format="%C(auto) %h %s" 3a3cf55373bfe5843fac9fff6657127ae11b5dd8..7575e49a4afa83524c06ad72ce40f588eca93ae2 --  ./rs/node_rewards/canister ./rs/node_rewards ./rs/registry/node_provider_rewards
 40a9c37bd4 feat(nns): Allow Governance to request rewards from Node Reward canister instead of registry (behind flag) (#4693)
 3a5a7a1af4 chore(nervous-system): Update changelog for release 2025-04-04 (#4670)
 412c839a0a feat(node_reward): Add the basic calculation to the Node Reward Canister (#4628)
 f6425d47af docs(node-rewards): Add node provider reward calculations documentation (#4604)
 e325bb0616 chore(nns): add support in release scripts for node-rewards canister (#4252)
 2fe8aefafc feat(node-reward): Add registry sync to node reward canister (#4349)
```


## Current Version

__Current git hash__: 3a3cf55373bfe5843fac9fff6657127ae11b5dd8

__Current wasm hash__: 8637e0182ffc1255563e295efee28f2163f9be21bbd27f3e65bfc3c1f470d3ca


## Verification

See the general instructions on [how to verify] proposals like this. A "quick
start" guide is provided here.

[how to verify]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/rs/nervous_system/docs/proposal_verification.md


### WASM Verification

See ["Building the code"][prereqs] for prerequisites.

[prereqs]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/README.adoc#building-the-code

```
# 1. Get a copy of the code.
git clone git@github.com:dfinity/ic.git
cd ic
# Or, if you already have a copy of the ic repo,
git fetch
git checkout 7575e49a4afa83524c06ad72ce40f588eca93ae2

# 2. Build canisters.
./ci/container/build-ic.sh -c

# 3. Fingerprint the result.
sha256sum ./artifacts/canisters/node-rewards-canister.wasm.gz
```

This should match `wasm_module_hash` field of this proposal.

Registry

# Upgrade the Registry Canister to Commit 7575e49

__Proposer__: maximilian.summe at dfinity.org

__Source code__: [7575e49a4afa83524c06ad72ce40f588eca93ae2][new-commit]

[new-commit]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2


## Features & Fixes

* Maintenance Release.
* Small performance improvement in parallelizing DKG calls.

## New Commits

```
$ git log --format="%C(auto) %h %s" 3afec59ddf883e80a4987fa9129d62ad156548a2..7575e49a4afa83524c06ad72ce40f588eca93ae2 --  ./rs/registry/canister
 2672847307 refactor(registry): Get rid of `pb_encode` function. (#4747)
 5d4a1b4115 feat(NNS): Parallelize dkg calls in recovery CUP creation (#4634)
 856b710881 chore(nns): Update changelogs after 3/28 release (#4669)
 bf169efa41 feat(registry): Migrate `get_certified_changes_since` in `nns_data_provider`... (#4511)
```


## Current Version

__Current git hash__: 3afec59ddf883e80a4987fa9129d62ad156548a2

__Current wasm hash__: 3d44ad8ac30be5861f8b650300383836051a50980e3475dff7fc0953bc9e192c


## Verification

See the general instructions on [how to verify] proposals like this. A "quick
start" guide is provided here.

[how to verify]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/rs/nervous_system/docs/proposal_verification.md


### WASM Verification

See ["Building the code"][prereqs] for prerequisites.

[prereqs]: https://github.com/dfinity/ic/tree/7575e49a4afa83524c06ad72ce40f588eca93ae2/README.adoc#building-the-code

```
# 1. Get a copy of the code.
git clone git@github.com:dfinity/ic.git
cd ic
# Or, if you already have a copy of the ic repo,
git fetch
git checkout 7575e49a4afa83524c06ad72ce40f588eca93ae2

# 2. Build canisters.
./ci/container/build-ic.sh -c

# 3. Fingerprint the result.
sha256sum ./artifacts/canisters/registry-canister.wasm.gz
```

This should match `wasm_module_hash` field of this proposal.
2 Likes

Adopt proposal 136224

Proposal

  • Canister id rrkah-fqaaa-aaaaa-aaaaq-cai is the governance canister.
  • The upgrade args correspond to the empty args.
  • The install mode is indeed upgrade.
  • The wasm hash is reproducible.

image

Review

  • Always panic when pb method are called, next step will be to remove the code.
  • Add code to allow fetching node rewards from get_node_providers_monthly_xdr_rewards_from_node_provider_reward_canister from get_node_providers_monthly_xdr_rewards from the new node rewards canister.
  • Add some test for the disbursing maturity without creating a neuron.
  • Add VotingPowerSnapshot that will help tracking voting power.

Adopt proposal 136225

Proposal

  • Canister id rwlgt-iiaaa-aaaaa-aaaaa-cai is the Registry canister.
  • The upgrade args correspond to the empty args.
  • The install mode is indeed upgrade.
  • The wasm hash is reproducible.

image

Review

  • Remove pb_encode function.
  • Parallelize setup_initial_dkg & self.get_all_initial_i_dkg_dealings_from_ic00.

Adopt proposal 136226

Proposal

  • Canister id sgymv-uiaaa-aaaaa-aaaia-cai is the Node-rewards canister.
  • The upgrade args correspond to the empty args.
  • The install mode is indeed upgrade.
  • The wasm hash is reproducible.

image

Review

  • Add registry sync for the node provider rewards.
  • Add documentation on how the node providers rewards a computed based on multiple factors.
2 Likes

Proposal 136224 – LaCosta | CodeGov

Vote: ADOPT

Governance Canister

image
Reason:
Build successful and hashes match, commits look great and match the description. Found no issues.

[7fb2409c64]: Introduces Voting Power Snapshots in order to prevent a takover of the NNS in case someone get’s illegitimate voting power. A maximum of 7 snapshots of the voting power are kept at a given time and are only valid for a period of 3 months, though since they are added frequently is unlikely. The struct VotingPowerSnapshots is used to keep the collection of snapshots.

[f045cf0b6a]: Sorts memory IDs of memory segments to prevent double usage of IDs by mistake.

[40a9c37bd4]: Allows Governance (in tests) to make requests to the Node Reward canister instead of the Registry depending on the feature flag use_node_provider_reward_canister. Fixed an issue in the Node Reward Canister changing the function get_node_providers_monthly_xdr_rewards from a query call to an update.

[63936e262c]: Implements the DisburseMaturity neuron command. Feature flag IS_DISBURSE_MATURITY_ENABLED is used to enable the command.

[cb423a02db]: Changes the panic probability for deprecated methods manage_neuron_pb and list_neurons_pb to 100%

[856b710881] & [3a5a7a1af4]: Updates the governace, node_rewards and registry’s canisters CHANGELOG.md to include adopted proposals with corresponding changes.

Proposal 136225 – LaCosta | CodeGov

Vote: ADOPT

Registry Canister

image
Reason:
Build successful and hashes match, commits look great and match the description. Found no issues.

Contains duplicate commits from previous proposals

[2672847307]: Remove the pb_encode function. Replace it’s usage with encode_to_vec()

[5d4a1b4115]: Calls setup_initial_dkg and compute_initial_i_dkg_dealings in parallel to speed up subnet recovery.

[bf169efa41]: Updates functions decode_hash_tree and decode_certified_deltas to use HighCapacityRegistryAtomicMutateRequest instead of RegistryAtomicMutateRequest. Introduced the FetchLargeValue trait that handles the process of fetching chuncks.

Proposal 136226 – LaCosta | CodeGov

Vote: ADOPT

Node-Rewards Canister

image
Reason:
Build successful and hashes match, commits look great and match the description. Found no issues.

Contains duplicate commits from previous proposals

[412c839a0a]: Part of the migration of the rewards from the Registry to the Node Reward Canister. Implements the basic structs, API endpoints and functions. Reward calculation is done in function inner_get_node_providers_monthly_xdr_rewards that tries to sync with the Registry to get the latest version and calls calculate_rewards_v0 to compute the rewards.

[f6425d47af]: Node Provider Reward calculation documentation.

[e325bb0616]: Adds node-rewards to the list of canisters to be included in the Bazel build. Assigns the canister ID sgymv-uiaaa-aaaaa-aaaia-cai on both the local and mainnet. Updates ALL_NNS_CANISTER_IDS in order to include this canister along with ledgers archives and PROTOCOL_CANISTER_IDS to be used as ProtocolCanisterManagement proposals.

[2fe8aefafc]: Makes the NodeRewardsCanister capable of syncing data from the IC Registry Canister at regular intervals. Schedules a 1 hour interval REGISTRY_SYNC_INTERVAL_SECONDS to sync the data using StableCanisterRegistryClient . CanisterRegistryClient trait now has two functions get_latest_version and sync_registry_stored to call the Registry implemented on StableCanisterRegistryClient that uses StableMemory to store a copy of the Register data.

About CodeGov

CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The CodeGov NNS known neuron is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.

Learn more about CodeGov and its mission at codegov.org.

proposal - 136224, 136225, 136226 – Cyberowl | CodeGov

Checks

Proposals:
136224
136225
136226

Vote: ADOPT
Hashes Match: MATCH, MATCH, MATCH
Proposer Checks: MATCH, MATCH, MATCH
Target Canisters: MATCH, MATCH, MATCH
Feedback: NONE
Reason:
I successfully built and verified the hash. All the commit descriptions match their code changes.

Commits Summary

Governance

7fb2409c64
Adds a snapshot system to detect and handle voting power spikes that could unfairly influence proposal outcomes. It introduces two new protobuf types—NeuronIdToVotingPowerMap and VotingPowerTotal—and a VotingPowerSnapshots structure that stores up to 7 recent snapshots, using them to revert to a stable prior state if current voting power exceeds 1.5× the recent minimum.

f045cf0b6a
Sort constant variables.

40a9c37bd4
Retrieving node provider rewards from a dedicated Node Rewards Canister, enabled by default in test builds via a feature flag. The system now uses this canister’s response in place of registry-based rewards when enabled, with the canister’s get_node_providers_monthly_xdr_rewards method upgraded to an update call in production for consistency guarantees.

63936e262c
Adds maturity disbursement, allowing neuron owners to convert a portion of their maturity (1–100%) into ICP and send it to a specified account after a 7-day delay. The feature includes thorough validation, such as ensuring a minimum disbursement threshold of 1 ICP after modulation, enforcing a 10-disbursement limit, and locking neurons during the process to maintain state integrity. Gated by a feature flag.

cb423a02db
Updates the panic_with_probability function to always panic probability = 1.0 when deprecated Protobuf methods manage_neuron_pb and list_neurons_pb are called, enforcing their deprecation. Previously, these methods had a 10% chance of not panicking, allowing outdated clients to continue using them intermittently. Now, these interfaces are guaranteed to fail.

3a5a7a1af4
Matches description Update changelog for release 2025-04-04 .

856b710881
Matches description Update changelogs after 3/28 release.

Registry

2672847307
Replaces the custom pb_encode helper function with the standard encode_to_vec method provided by the prost::Message trait for serializing RegistryAtomicMutateRequest.

5d4a1b4115
Optimizes the do_recover_subnet method by executing the setup_initial_dkg and get_all_initial_i_dkg_dealings_from_ic00 calls in parallel using futures::join!. Previously executed sequentially.

856b710881
The benchmark updates show significant performance improvements in WASM compilation for arithmetic-heavy modules and stable memory reads, while introducing regressions in minimal module instrumentation, stable writes, and data-copying system API calls.

bf169efa41
Chunked value support in the ic-registry-nns-data-provider crate, enabling the Registry to handle large values by fetching and validating SHA-256–verified chunks via the new FetchLargeValue trait.

Node Rewards

40a9c37bd4
Enable the governance canister to fetch node provider rewards from the new Node Rewards Canister in test builds, while still using the Registry in production. The Node Rewards Canister’s API was updated to use an update call instead of a query.

3a5a7a1af4
Matches description Update changelog for release 2025-04-04

412c839a0a
The Node Rewards Canister now supports a new query endpoint, get_node_providers_monthly_xdr_rewards, which allows retrieval of node provider rewards based on a specified or latest registry version.

f6425d47af
Document outlines how the IC calculates and distributes rewards to Node Providers based on node types, regions, and data center configurations, including a decay factor for type-3 nodes and region-specific rate tables. It also details administrative procedures like updating wallet addresses via HSM, implementation interfaces, and comprehensive testing coverage to ensure system reliability.

e325bb0616
Integrate NodeRewardsCanister, enabling its use in test setups, governance proposals, deployments, and reward calculations. Shifts node provider reward calculations from the Registry canister to the new NodeRewardsCanister. The test suite and utility tooling were updated to support its initialization, deployment, and validation.

2fe8aefafc
This change enables the NodeRewardsCanister to sync registry data from the Registry canister at regular intervals, storing it locally using stable memory. It replaces the older registry data provider with a new, simplified client library that supports asynchronous operations.

If you like the review please follow:

About CodeGov…(click to expand)

CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The CodeGov NNS known neuron is configured to follow our reviewers on these topics and Synapse on most other topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron and KongSwap with a known neuron and credible Followees.

Learn more about CodeGov and it’s mission at codegov.org.

Proposal #136224 for Governance — Zack | CodeGov

Vote: Adopted

Reason: The build is reproducible and the wasm hash is a match.
The canister id rrkah-fqaaa-aaaaa-aaaaq-cai is correct and the install mode is upgrade.

Proposal #136225 for Registry — Zack | CodeGov

Vote: Adopted

Reason: The build is reproducible and the wasm hash is a match.
The canister id rwlgt-iiaaa-aaaaa-aaaaa-cai is correct and the install mode is upgrade.

Proposal #136226 for Node-rewards-canister — Zack | CodeGov

Vote: Adopted

Reason: The build is reproducible and the wasm hash is a match.
The canister id sgymv-uiaaa-aaaaa-aaaia-cai is correct and the install mode is upgrade.

About CodeGov

CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The CodeGov NNS known neuron is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.

Learn more about CodeGov and its mission at codegov.org.

Proposal 136224 - Zane | CodeGov

Vote: ADOPT
Reason: Build completes successfully, both hashes and reviewed commits match their descriptions.

136224

7fb2409c64 Setup data structures and logic to persist in stable memory snapshots of total voting power, both deciding and potential, and per neuron voting power. Both are encapsulated by VotingPowerSnapshots which holds two stable maps indexed by the timestamp the snapshot was taken at. The number of snapshots is limited to MAX_VOTING_POWER_SNAPSHOTS, i.e 7 at the moment, with the oldest one being removed once the limit is reached. By calling previous_ballots_if_voting_power_spike_detected method it is possible to determine whether a VP spike has occurred. If non stale, i.e less than 3 months old, snapshots are present and the current VP is greater than the lowest recorded value for total potential voting power multiplied by a VP spike threshold, then the snapshot is returned in a tuple alongside its timestamp, otherwise None is returned.

f045cf0b6a Sorted memory ids to avoid accidental reuse and added comment as remainder.

40a9c37bd4 Added USE_NODE_PROVIDER_REWARD_CANISTER feature flag to governance canister alongside two helper methods to toggle it during testing and use it to determine whether node provider rewards should be fetched from the registry or the node reward canister in get_node_providers_monthly_xdr_rewards. The flag is currently only set to true when building with test mode. Updated get_node_providers_monthly_xdr_rewards node rewards canister’s endpoint to be an updated instead of query.

63936e262c Implemented logic for DisburseMaturity command to deduct maturity from a neuron and initiate the disbursement request provided some conditions are met, namely: disburse percentage being between 1 and 100%, a proper account identifier being used as destination, the maturity disbursed being higher than the minimum amount required after applying worst case modulation, the neuron not being in spawning state, caller being the neuron’s controller and the number of in progress disbursement for the neuron in question being lower than 10. IS_DISBURSE_MATURITY_ENABLED flag has been added to toggle this feature, when using the DisburseMaturity command, disburse_maturity method gets called and if the flag is enabled the disburse will be initialized, otherwise a GovernanceError will be returned.

cb423a02db manage_neuron_pb and list_neurons_pb failure probability has been increased to 100%.

3a5a7a1af4, 856b710881 Updated changelog files.

Proposal 136225 - Zane | CodeGov

Vote: ADOPT
Reason: Build completes successfully, both hashes and reviewed commits match their descriptions.

136225

2672847307 Deleted pb_encode helper method and replaced it with prost::Message::encode_to_vec.

5d4a1b4115 In do_recover_subnet perform setup_initial_dkg and compute_initial_i_dkg_dealings calls in parallel by using futures::join!.

bf169efa41 Changed type of mapped values in the delta field of CertifiedPayload to HighCapacityRegistryAtomicMutateRequest and modified decode_hash_tree so that for each HighCapacityRegistryMutation entry it can perform chunked requests to the registry canister for LargeValueChunkKeys type content.

Proposal 136226 - Zane | CodeGov

Vote: ADOPT
Reason: Build completes successfully, both hashes and reviewed commits match their descriptions.

136226

412c839a0a Exposed get_node_providers_monthly_xdr_rewards query endpoint in the node reward canister, the logic used is similar to the one existing in the registry with the exception that node provider and data center record are fetched from the registry first and are then decoded from protobuf.

f6425d47af Added documentation for node provider reward calculations.

e325bb0616 Specified node rewards canister as one of NNS candidates in run_determine_targets release scripts, added local and mainnet id for node rewards canister to the nns canister ids. New constants have been defined in rs/nns/constants/src/lib.rs for the canister id and index of both reward canister and the third ICP ledger archive, furthermore ALL_NNS_CANISTER_IDS array now specifies ids for all icp ledger archives, ledger index, subnet rental and node rewards canisters.
create_canister_id_at_position has been refactored into ensure_canister_id_exists_at_position method, the new implementation first checks whether the specified id already exists before proceeding to create it. Added setup_nns_node_rewards_with_correct_canister_id to allocate the expected id specified in the NNS constants and install the relative wasm.

2fe8aefafc Defined Registry trait and implemented it for both RegistryCanister and FakeRegistry structs, making it possible for other canister to more easily interact with the registry or a mocked client for testing purposes. Also defined a trait named CanisterRegistryClient which defines an interface to sync to and read from a local cache of the registry and implemented it for StableCanisterRegistryClient which is used to persist the cache in stable memory. The syncing process is scheduled with a timer and happens every hour.

About CodeGov

CodeGov has a team of developers who review and vote independently on the following proposal topics: IC-OS Version Election, Protocol Canister Management, Subnet Management, Node Admin, and Participant Management. The CodeGov NNS known neuron is configured to follow our reviewers on these technical topics. We also have a group of Followees who vote independently on the Governance and the SNS & Neuron’s Fund topics. We strive to be a credible and reliable Followee option that votes on every proposal and every proposal topic in the NNS. We also support decentralization of SNS projects such as WaterNeuron, KongSwap, and Alice with a known neuron and credible Followees.

Learn more about CodeGov and its mission at codegov.org.