We’d like to propose a change to the behavior of the list_neurons canister method in NNS Governance.
Background: Empty Neurons
Neurons can become empty in one of the 2 ways: (1) merging neurons - the source neuron would become empty (2) disbursing neurons after they are dissolved (neurons spawned from maturity also fall into this category). Such neurons can be “revived” by staking more ICPs, and they still contain some records such as recent ballots, but beyond that they are not very useful. In addition, the NNS Dapp never shows such neurons to the users.
Current Behavior
In the ListNeurons request, there is a boolean flag: include_empty_neurons_readable_by_caller, which lets the caller specify whether they’d like the response to include “empty” neurons (stake/maturity are both 0). This flag only takes effect when include_neurons_readable_by_caller is set to true. When the caller does not specify include_empty_neurons_readable_by_caller (i.e. it is set to null), the NNS Governance canister treats it as if the value is opt true, in order to maintain its behavior prior to the introduction of this flag. In other words, for clients who choose not to set this field (or written before the flag was introduced), empty neurons are still included in the response.
type ListNeurons = record {
include_public_neurons_in_full_neurons : opt bool;
neuron_ids : vec nat64;
include_empty_neurons_readable_by_caller : opt bool;
include_neurons_readable_by_caller : bool;
}
Upcoming API change
In the next release (to be proposed on Jan 24, 2025), we will propose changing the default value of include_empty_neurons_readable_by_caller to false instead (essentially, treating null as opt false). Clients can still opt to retrieve such neurons by setting the flag to opt true explicitly.
Next steps towards a cleaner API
One thing to consider in the future is that the flag can be removed entirely (although there is no such plan yet), while retaining the behavior of opt false. Even after that, clients would still be able to retrieve empty neurons by calling get_neuron_ids and then list_neurons, by supplying neuron_ids in the list_neurons request. Feedback or suggestions on this next step would be much appreciated.