ReProposal: Spam Prevention - Convert from system-based rewards to voter based rewards

I don’t interpret anything in @skilesare proposal that differentiates voting rewards between voting manually vs vote following. The only distinction is voting or not voting. If you vote on every proposal, no matter how your vote gets executed, you still maximize voting rewards.

Also for public named neurons, it doesn’t matter if you vote with your main private neuron that is followed by your public neuron or vice versa. Another method is to use hotkeys and cast both votes at the same time. Regardless, the only reason to create a new neuron to use as a public neuron is to prevent someone from linking it publicly to your main private neuron by tracing ledger transactions and stake amounts. This is best accomplished by funding your public neuron through an exchange (or Spinner Cash would work as well).

1 Like

I thought this terminology might imply voting by following vs. voting manually, which is why I asked.

I understand that this is the way it works now, but may not be how things work if this proposal was implemented (depending on the answer to my question)

1 Like

I think this points to a common misconception and I wonder if it’s because people view following a neuron as “passive”.

But it’s really the non-participants who don’t vote manual or follow a neuron on governance proposals that everyone is suggesting should get less rewards because their neuron is not voting at all on those proposals.

Maybe there’s a better term we all can use to define those who are not voting to replace “passive”?


I was about to ask you what terminology caused you to think it was about voting manually vs vote following. Thanks for sharing. I think @skileshare should clarify that language to avoid confusion.

1 Like

As it stands now, I think I would reject this proposal since it is currently scoped to reduce inflation by burning voting rewards. However, I think the proposal has a lot of potential if you give it some important tweaks. Hence, I propose that you modify your proposal in a few ways:

  1. remove language that uses inflation reduction as a driver
  2. add the concept of tracking undistributed maturity so it can be used in the future in ways that benefit governance and decentralization of the internet computer
  3. add that the Governance proposal weight will be immediately reverted back to 20x upon implementation of your proposal
  4. deleted as explained here
  5. add the clarification needed to address concerns expressed by @paulyoung

Of course, this is your proposal and your decision if and how to modify the proposal. I’m just offering my two cents on what I think would most benefit the IC ecosystem and increase the probability of passing. I appreciate you giving consideration to these proposed modifications.


That is 100% not the case. By “passive whale” I meant whales that have not bothered to follow someone other than dfinity for governance. I’ll clarify. I consider delegating one’s vote to someone more qualified the true power behind liquid democracy.


I agree with all of this in principal but I’m not sure if we can/should do all of that at one time *in practice *.

1.An NNS team member should tell us if any of those need to be separate to enact an on chain effect.
2. Adding anything about tracking burned tokens will complicate the code changes and delay the implementation. I think I’d rather use the reduction to light a fire behind the community to find a solution. To me it would seem that the worst that could happen is a reduction in sell pressure while we figure out what to do. But I’m open to other arguments or pull request that simplify the tracking.

1 Like

It might require a further clarification since there is a little more nuance. All neurons were originally configured to follow DFINITY for the All Topics catch all category. No neuron was originally configured to follow anyone for the Governance topic directly. Since the Governance topic was removed from the All Topics catch all, the neurons that receive voting rewards for Governance proposals are neurons that vote manually or have been configured to follow someone else for the Governance topic. Hence, your reference to passive whales really means any neuron that is still following only DFINITY for the All Topics Except Governance catch all category. Any neuron that is following DFINITY for Governance is active and voting.


If we could clarify this, I personally would appreciate it. Right now I am following DFINITY for all except governance because I am not familiar with the higher level knowledge (yet) to be able to determine if the code is malicious. Thus, I appreciated the ability to follow DFINTY for this reason. Now, if the way I have it setup does not make me “passive”, I would prefer to keep it this way, or perhaps I will follow @paulyoung or others with the higher level knowledge so if somehow someone does try to shoot through malicious code My vote will be to block it. Not allow it.

I do want to point out though, I also want to maximize my rewards and would appreciate the overall clarification on what the ramifications would be for any of these implementations.

Or, if you want to be direct you could just tell me the best way to vote and increase decentralization, yet, not blindly vote on code for reasons I mentioned.

Following DFINITY for All Topics Except Governance is an excellent choice.

Maximizing voting rewards today means you also have to be following a neuron you trust to always vote on Governance topics. There are now many options. DFINITY is a good choice because they vote on almost all Governance proposals. The same is true for other names neurons. Just make sure you set up your neuron with a Followee for the Governance topic.

This is excellent feedback for where I am. Sorry if I diverted the topic.

I was mainly focusing on this proposal though. If it was implemented would my current situation “follow DFINTY for all topics except governance” consider me “passive”? I do want to reserve the right to vote for governance proposals as they arise. However, as mentioned I want to still say “yes” on healthy updates, and “no” on anything that may ever be malicious. Does that make more sense?

This looks like a well thought out fix to the current situation. I agree with @wpb regarding the additions. Esp. the 20x Governance proposal weight. Creating a treasury for the outlined reasons is also a good idea. I was never a fan of “burning” and rather think putting resources to a use via ecosystem funding etc. is a way bigger value driver.

1 Like

Regarding the follow-up questions

  1. Tracking of un-allocated voting rewards: I agree that this would a sensible addition to the proposal and I will check with the dashboard team next week on their thoughts & potential effort. Aligned with @skilesare’s point, I think this could also be implemented slightly later, i.e., I do not see a hard dependency.
  2. Governance weights to 20: This also makes sense to me. I think this could be part of the motion proposal but the implementation could come slightly later. (The effort is not be big but requires as usual some sanity checks & testing).
  3. Rejection fee back to 1 ICP: I assume that this is obsolete given the latest developments discussed here.
1 Like

I agree with @bjoernek here

My point number 4 above should be deleted since this proposal does not eliminate the potential for spam for the purpose of advertisement.

Also, I see this proposal as a framework for a path forward, not the final solution that will be implemented as written. Hence, I would rather see some of these key elements incorporated into the proposal now even if implementation comes in stages. I don’t see a need for a rushed implementation of this proposal, especially when an increased proposal reject fee is a quicker and easier temporary solution to any increased risk of weekend spam when exchange rate proposals are removed from the NNS.

To me, this proposal is a very good way to build an NNS treasury that can fund a lot of efforts that drive governance participation and decentralization. I think this proposal and periodic confirmation of followees are two solutions to the spam problem (for financial gain) that each have a higher value use case beyond spam prevention. Hence, it’s not critical to sell this proposal as a spam prevention mechanism.

1 Like

I’m in line with all of this…I’ll put together some
More formal text on Monday and post it here for discussion.

As far as non-incentive based spam spam, I still think that Proposal to restrict rewards qualification to a threshold - #2 by wpb is the fastest path forward.


Gotcha I am sorry for everyone I diverted the topic from! I’m now understand the differences in proposals. I’m sorry about the confusion!

Thanks for being kind

1 Like

This is an elegant proposal which I heartily support. An independent, NNS controlled treasury is a great idea, for the reason @skilesare has mentioned and also as a possible source of funding for experts voting through the community neurons proposed by @lastmjs .

Updated Proposal Text - Please let me know if you think there should be any more changes:

Proposal: Convert from a system-based rewards model to a voter-based reward model.

The current system determines a reward rate, total supply, and then determines the total reward to give each day by multiplying the (reward rate * the total_supply)/day. The total rewards are then handed out based on each neuron’s share of the total voting weight for the day.

The new system will determine the reward rate and multiply the rate by the weighted vote-completion percentage and bonus rate of each voting neuron.

This will also allow us to move the governance weight back to 20 without incetivising spame. We propose this occur as part of this proposal.

A result of this proposal will be a reduction in total minted ICP due to the fact that some voters do not vote on all proposals or follow a voter for all proposals. In a follow-on proposal, the NNS can determine what to do with that “abandoned” ICP. We suggest an NNS treasury but will leave it to a future proposal to finalize that. The following illustration shows the handing out of rewards in the old vs new system.

NOTE: “Passive” here means someone who has not elected to follow anyone on the governance proposal topic and who does not manually vote. We do not consider people that pro-actively follow experts to be passive and appreciate the time and effort they take to find qualified voters.

Spam is neutralized because additional proposals will not affect the ability of a neuron to gain rewards. Any neuron’s maximum reward for the day is generated by Reward Rate *(Actual Vote Weight/Possible Vote Weight) * Age Bonus. Adding extra, superfluous heavy weighted votes only increases the Possible Vote denominator and thus does not increase the number of rewards handed out in a day.

Weights can remain in the calculations to encourage participation due to the fact that each voter is only competing against themselves to achieve 100% voting for the day.

This scheme can be easily implemented in the existing code by manipulating the distribute_rewards function to iterate over all considered_proposals, finding the weight of each proposal and creating a target sum. Instead of creating a map of voters_to_used_voting_rights, the map will also need to keep track of each vote’s absolute weight. The reward function on ic/ at 73983e05ebbab239ce39492a05fb39a83ce5dce5 · dfinity/ic · GitHub will need to be adjusted to be used_voting_rights * (total absolute vote weight/target vote weight). The used_voting_rights has the age and lock bonuses built in. (Note - The reward function is mapping twice as much data, so performance may be an issue here).

A worked example:

4 proposals are eligible for rewards on a day. The reward rate is 15%.

Proposal 1 - XDR Exchange Rate - Weight 0.01

Proposal 2 - Subnet management - Weight 1

Proposal 3 - Node Rewards - Weight 1

Proposal 4 - Governance Proposal - Weight 20

Total Possible Vote weight: 22.01.

Voter 1 - Passive whale votes with 10,000 voting reward on proposals 1-3. Total executed weight is 2.01. Thus the reward is 10,000 * (.15/365) *(2.01/22.01 = 0.3752 ICP(~1.3%)

Voter 2 - Active holder votes with 100 voting reward on proposals 1-4. Total executed weight is 22.01. Thus the reward is 100 * (.15/365) *(22.01/22.01 = 0.041 ICP (~15%)

Why Now?

The new exchange rate mechanism(New Exchange Rate Mechanism - #28 by THLO ) will make spam much more attractive. We need a quick fix and this is the quickest route to implementation.

A few more notes from the discussion with the community/foundation(h/t to @bjoernek for compiling):

  • Proposal: The reward mechanism assumes that everybody votes on all proposals. If you vote on all proposals you get rewards corresponding to your share of voting power compared to the total voting power. You get reduced rewards if you miss votes, but those lost rewards don’t go to active voters.
  • Impact on total rewards/inflation: This proposal reduces the rewards which are allocated on a daily basis, depending on how many participants miss votes. This reduces inflation. In a second stage (out of scope of this proposal) we could consider allocating these un-distributed rewards to an NNS treasury.
  • Impact on financial incentives: This proposal removes the direct financial incentive to submit spam proposals, i.e., active votes will not gain additional rewards in case of spam proposals. However there is still an indirect financial incentive as the new mechanism reduces the inflation; this creates a benefit for ICP holders (staked/unstaked)
  • Impact on reward weights: As this proposal removes the direct financial incentive for spam we could consider to reset the reward weight for governance proposals back to 20.
  • Implementation effort: This proposal requires only an update of a few lines of code within the function distribute_rewards in Thus this can be implemented relatively quickly.
  • Why bring up this proposal now again?
    • In connection with the new exchange rate mechanism we require a quick solution.
    • Earlier concerns on the ability to influence the inflation rate (and thus also reduce the predictability of total supply) are much less of an issue now, given that maturity modulation included anyway further uncertainty on this.
  • Connection to periodic confirmation of following: We already have an approved motion proposal for spam prevention namely periodic confirmation of followees. However, this still requires some enhancements wrt to the handling of time-sensitive proposals (for which a few ideas are under discussion). Periodic confirmation of followees could still be valuable, even if this proposal is implemented because it strengthens active voting participation.

Vote Accept to:

  1. Convert from system-based rewards to voter-based rewards
  2. Change the weight of governance proposals back to 20.
  3. Keep track of “abandoned” ICP as a governance-tracked variable.

I know it’s technically not a part of this proposal but there should also be a note on implementing a system to track lost rewards from days with no proposals, I’m fine with not getting an higher APY especially if those tokens go in some kind of treasury, but getting a lower APY than the one displayed on the dashboard cause there are days without proposals kinda suck.