The "Goodwill ICP" Distribution Framework

The answer is tied to the comment below:

Keep in mind, the NNS is not deciding anything directly, it’s just enabling a “gifting market”.

Funding is an inherently complex thing, and both morals and politics quickly become involved. Restrictions which may make sense in some situations, won’t make sense in others. These are all reasons why the NNS shouldn’t allocate funds directly. It would be too slow to react to new information, and receivers would not be easy to hold accountable fairly without an increasingly complex system.

While not perfect, the beauty of delegating the task to independent neuron holders is that we are now using market dynamics. Deciding the most efficient allocation of funds is what (well designed) markets do. Sure, a foundation might get away with over-paying some people for 6 months until it’s time to renew their Goodwill ICP receiver status again, but then how are they going to explain where all that ICP went without risk of losing their gifters? A fund could also quickly lose all their gifters if they got caught up in a scandal. A market will always react way quicker then an NNS proposal.

We may even set it up so that a receiver automatically loses their Goodwill ICP recipient status if less than 5,000 Goodwill ICP is gifted to them a month. This means they need to keep the trust they earn from the ecosystem or risk losing it all. I don’t think any more specific accountability measures are needed beyond that, markets root out inefficiency quickly and maintaining positive public opinion is hard.

Basically, built-in accountability measures will always be too complex. The best option is to let natural market dynamics handle that complexity. If they can’t convince enough neurons to gift them Goodwill ICP, then they lose. If they can, and they maintain that trust, then they win. Let the Neuron holders decide.

This is the most frustrating thing about this…you can already do this! But dfinity won’t add back the functionality into the NNS UI. It is extraordinarily frustrating. You can give a charity, or anyone really, control of your neuron. If this is an 8-year staked neuron, there isn’t anything evil that they can do to you…you maintain control and can kick them off anytime you want. It is called the “manage neuron topic” and dfinity could enable it back with one line of code. If you are a hacker you can get it to work now(see the dedicate a neuron topic on

It sounds like “Good Will ICP” is just one in which you HAVE to take this action or no maturity is earned.

This would also be a ten-line implementation where you can only assign manage neurons from these to non-profit neurons.

Did you know: Each neuron has a non-profit field? I don’t know how to get this bit flipped or I’d do it for ICDevs. But the field is already there…and non-profits are the only neurons that can re-assign their controller.


Why not remove the NNS approval requirement for whitelisting and approving Goodwill neuron and receivers and instead make it permissionless?

A likely vulnerability is a dishonest party could easily create many NNS approved goodwill neurons, and NNS approved ICP receivers. The NNS voting to authorize certain permissioned addresses likely wouldn’t be able to verify or prevent people from doing this.

As a result, many neurons who get NNS approval to distribute goodwill ICP, and also those who get approved by the NNS to receive ICP goodwill are likely to end up being both controlled the same people. ie i can distribute funds to myself.

If that’s inevitably going to happen because the NNS cannot really have tools at it’s disposal to verify otherwise, then why not do away with the NNS approval requirement entirely? What function is the NNS permissioning the creation of goodwill icp neurons and receivers performing? If individuals are making voluntary decisions to donate to a particular “goodwill neuron”, then why does the NNS need to give prior approval on who I can donate my ICP to? Instead, why not allow anyone to create goodwill neurons, and become goodwill icp receivers without creating a gated NNS approval step?

The minimum viable implementation is to add check boxes next to “Participate in upcoming community fund” that instead read “Donate Maturity to XXXXXX” where XXXXX is a whitelisted Named Neuron with non-profit == true. Clicking this takes three actions: Asks the user what percentage of their neuron and then 1. Splits the neuron if necessary. 2. Adds the Named neuron on the manage neuron topic. 3. adds the named neuron as a hotkey.

The target organization can then harvest maturity at their leisure…they could start dissolving or split the neuron but that would just be a headache and/or produce less maturity so there is no reason to do so.

The command to do so is:

dfx canister --network=ic  call rrkah-fqaaa-aaaaa-aaaaq-cai manage_neuron \
"(record \
    id=opt (record {id=14231996777861930328:nat64}); \ //controlling org neruon
    neuron_id_or_subaccount = null; \
    command=opt (\
      variant {MakeProposal=(\
        record {\
          action=opt (variant {\
            ManageNeuron=record {\
              id=opt (record {id =2012199716792119823:nat64}); \ // good will neuron
              neuron_id_or_subaccount = null; \
              command =  opt( variant {\
                Spawn = record{\
                  new_controller= opt(principal \"ufef3-ic2bp-enpmy-5ezyw-z4p5q-mzgsv-w24y3-2v2b6-ktjpk-cjik4-kae\")\ // controlling orgs principal
          url = \"\";\
          title = \"donation\";\
          summary = \"donation\";\

If the user unchecks then the follow and the hotkey is removed. User is free to merge the neuron back into their core stake.

This is a 100% UI-based change.(edit: actually I don’t think there is a place for the org’s principal so that would need to be added somewhere or the receiving org wouldn’t know they had been donated to…this could be removed with a reverse look up query that lets a neuron controller find the neurons it manages on manage neuron topic.).

The only thing we’d need to be changed on the back end is to enable a neuron to identify as non-profit(and potentially a place for the controlling principal).(Or not if we want this open to for-profits as well).


I’m hoping we don’t limit it to just non-profits, but any work that people feel they want to contribute to. I’m thinking of Demergent Labs, my company, which is a for-profit company but is focused on open source developer tools.


I think a minimal version of this is a row containing an input field for address and another for percentage of maturity. Users could add more rows with a button.

The address field would allow people to divert ICP to their own addresses if they wish. Some people need to allocate a percentage of maturity aside for tax purposes, and this is an ongoing and tedious manual process. This could also facilitate that by letting a user enter their own wallet address here.

I think the percentage part is important because otherwise it’s all or nothing, and that won’t work for everyone.

An address book feature would be nice for convenience but if this is just “set and forget” that seems like it could wait. I’d prefer to be able to manage the entries myself and not be limited to who I can send to though.


This sounds great! @diegop who’s working on the NNS website refresh from the DFINITY side?

Ultimately there probably shouldn’t be such a gate…I was just reaching for a quick path to implementation and that tag exists -for-some-reason-. I’d love to know what the reason was…if it has to do with the Foundation nature of DFINITY or something else.

There are real legal rails for non-profits that may or may not make a difference to contributors, but I think ultimately it should be the contributor’s choice.

1 Like

This would be great, but my concern was that it required more backend code and storage for the NNS. This is certainly the most obvious and straightforward representation of what is going on. I’d prefer this if it is implementable quickly, and ultimately prefer it long term if it doesn’t drastically increase complexity.


I think @peterparker is involved.

Not sure what @aiv meant with “website refresh” but when it comes to what you wrote above @paulyoung - “An address book feature would be nice” - this is indeed in the backlog, we are aware that the community would like such a feature.

I think more desirable is the ability to automatically redirect/donate a percentage of ICP from maturity to some addresses.

1 Like

Thanks for the clarification. In that case, not sure such a feature - “redirect/donate a percentage of ICP from maturity to some addresses” - is actually an initiative that I should forward myself - i.e. not sure it is the best channel, because I kind feel it has probably to do with the all NNS, not just the dapp but it might need changes in the governance canister, you know what I mean?

Moving maturity between would also be nice. It is planned for the CF, why not extend the feature and make it general purpose?

You can build an sns dao if it is so frustrating.

Yes, also agreed with this idea to move it to any adress. More general means also more flexible use cases can be build on.

Can you explain it in more detail what you mean with “can create good will at will”, it opens the possibility to misunderstand it.

If i can convert my rewards to good will neuron than everything is fine.

The proposal describes a permissioned system, where NNS needs to whitelist applicants seeking to create a “goodwill neuron” and those seeking to “receive ICP sent from goodwill neurons”. My comment was addressing whether not this is necessary.

Does that clarify your question?

Not sure what you mean by “convert my rewards to goodwill neuron”.

No it doesn’t. Any neuron would be able to get delegated Goodwill ICP to gift out, but only specific neurons would be approve as valid recipients of Goodwill ICP (this would be the entities providing public goods). This is just to prevent making it so that users can gift the Goodwill ICP to themselves. The whole NNS agrees which small set of users are actual valid recipients.

Just updated the topic to clarify it.