On-chain Quorum & Initialization POAP

Hello pDAO!

Given that the on-chain voting system is likely to see its first use fairly soon, this seems like a good opportunity to address its last major inconsistency with Snapshot signaling: the quorum.

Context

Context

In short, the inconsistency stems from the fact that not all vote-eligible RPL automatically receives voting power in the on-chain pDAO system. Nodes that were created before the Houston update need to actively initialize their voting power lest it be zero. RPIP-4 defines the quorum as 15% of total vote power, but as long as some nodes remain uninitialized, there remains a discrepancy in total vote power between these two systems.

pDAO initially agreed on 50% being a safe minimum to activate the voting system. There was a slow and steady climb, supported by some calls to actions on Discord and other social media by community members. This activation then saw a delay from the Houston Hotfix. Based on the achieved vote initialization rate of 50% at the time, it was agreed to set the on-chain quorum (proposal.quorum) to 30% in order to match the absolute amount of vote power needed with Snapshot’s 15%.

Since then, there have been two major changes. Firstly, Smart Node added an auto vote initialization feature, which submits a transaction to initialize a node’s vote power in the background if the gas price is below 5 gwei (configurable default). Secondly, the Houston Hotfix included contract changes that initialize the node’s vote power when it creates a new minipool or stakes more RPL. The combination of these two things has brought the total share of initialized vote power up to 80%. This in turn means that the on-chain parameter now corresponds to 24% of total vote power instead of 15%. We should fix this.

Suggested Solution

Setting the on-chain parameter to around 18% would solve the problem for now, but would also create the need for at least one more parameter change once the initialization has progressed even further. Fortunately, the Houston Hotfix contracts also include a function to permissionlessly initialize any node (rocketNetworkVoting.initialiseVotingFor). Now, the idea is to pay to initialize the largest remaining nodes to get us close enough to 100% that we can set the on-chain parameter to 15% and, for all intents and purposes, eliminate this inconsistency. This will be funded by the community via an initialization POAP.

I think 90% is a reasonable threshold, mapping to an initial equivalent of 13.5% Snapshot quorum and trending closer to 15% as more initializations come in organically after this initiative. Currently, we need 158 nodes to achieve this.

Each initialization is around 275k gas, totaling 43.45M gas to get to 90%. At a reasonable gas price of 5 gwei, this amounts to a total of roughly 0.22 ETH.

POAP

Each POAP is 0.006 ETH, the equivalent of initializing 4 nodes and can be minted at https://checkout.poap.xyz/183395. With a maximum of 50 POAPs, this gives us enough funding to get to 90% with a small buffer to balance out POAP taking a 10% cut of the sales and the potential of more expensive gas and not all POAPs being sold. The ETH will go to my address (haloooloolo.eth) and I’ll use my Safe to create bundles of 50 initializations at a time to make it as efficient as possible. Thanks to @ShfRyn for the POAP art!

Veto Quorum

A secondary point that I would like to bring up is the veto quorum, a concept that does not exist in Snapshot. In addition to voting against a proposal, the on-chain voting system has the option to vote against with veto. For this, it defines a separate veto quorum (proposal.veto.quorum). If the veto quorum is reached by the end of the vote, the proposal is rejected and the proposer’s bond is burned, regardless of other vote tallies. This parameter is currently still set to 51%, which effectively renders it useless. My suggestion would be to match the normal quorum at 15%. I am also interested in other opinions here as I think arguments for it being higher or lower than the normal quorum can both make sense. Note that a change to less than 15% is slightly more involved as the current contract guardrails restrict it to ≥ 15%.

7 Likes

This looks good.

My gut feeling on veto quorum for RP is that you want something higher than quorum, but not high. Like, it should take a concerted effort to overturn something, but we don’t need to worry about small factions taking over. Guess… 20-25%?

1 Like

An important consideration for this is that unlike the normal quorum, which takes into account all votes, only veto votes are counted against the veto quorum. Especially at 25%, you’d not only be relying on exceptionally high but also near-unanimous participation.

1 Like

Okay, yeah, that won’t work, then. Even 15% is a challenge, lol, but probably not worth changing to be able to < 15% until we see if matters.

1 Like

If I understand the dynamics correctly:

30% vote turnout does not seem impossible to me, particularly with higher delegation numbers. Thus at 15% veto it’s possible to be both “yes” winning and veto’d.
I think the veto should be used rarely, so likely when an overwhelming majority of the dao disapprove AND want to actively punish.
20%, or maybe 25%, seems reasonable. 51% not reasonable.

The veto would take precedence but you’re correct that it is possible for a vote to end up with 16% of total vote power being for the proposal and 15% being against with veto, meaning it would end up successful or vetoed depending on what the veto quorum is set to.

I also need to slightly correct my explanation of how the veto works. The vote does not end immediately once the veto quorum is hit, the contract looks at the vote tally after phase 2, just like it does for other outcomes.

Would there be a reason to veto instead of vote no or abstain?
If there is a veto option, wouldn’t every ‘no’ vote end up being a veto vote?
Or is that a too simplistic view from me.

Yeah I think that’s my concern. If someone malicious captures 10%, then the dao can respond by increasing the number voting. If the veto is set at 10%, then that malicious actor can veto everything coming through the pipeline and the dao doesn’t have the ability to change things.

You could in theory always veto if you’re voting against a proposal to increase its chances of being rejected. The reason you wouldn’t want to, is that in contrast to a normal rejection, a veto will burn the proposer’s bond. So unless the proposal is genuinely malicious, I would consider a veto abuse of the vote system and if, for example, a delegate engages in that, I would expect them to be called out for it and lose delegations as a result.

2 Likes

Oh, I didn’t consider the burn. Of course, makes sense. Thanks!

Great initiative. I purchased a couple of POAPs to support this (had to gift it to other addresses because of the limit of 1 POAP per address)

2 Likes

Batch #1

0xdbe96766104c3169bed33de49ebdaa35ee82ce8224e4fa08438bb46a05147288
Gas Price: 3 gwei
Transaction Fee: 0.04066 ETH
Total Initialized Vote Power: 73,647 (85.21%)

0.138 ETH collected from 24 POAPs
0.041 ETH spent to initialize 50 nodes

1 Like

20% also seems reasonable to me. A signaling vote with multiple options probably makes the most sense. Alongside the yes/no vote to set the normal quorum to 15%. Do we need an RPIP for pure parameter changes?

Batch #2

0xa9c6418fdf791c975df8d12d9a8215dfb82dd3364229d6388fed0df691621c09
Gas Price: 3 gwei
Transaction Fee: 0.0413 ETH
Total Initialized Vote Power: 75,846 (87.88%)

0.180 ETH collected from 33 POAPs
0.082 ETH spent to initialize 100 nodes

Batch #3

0x42cb94d282136f863235d1f32371cf11acb0828f4fb6cc8e51b5d227dce08187
Gas Price: 2.7 gwei
Transaction Fee: 0.0372 ETH
Total Initialized Vote Power: 77,540 (89.88%)

0.198 ETH collected from 36 POAPs
0.119 ETH spent to initialize 150 nodes

Batch #4

0x83a032ef108dbf112a96e90317921464d5265cd8205c9fed948bc7afa4fb979b
Gas Price: 2.4 gwei
Transaction Fee: 0.0333 ETH
Total Initialized Vote Power: 78,961 (91.53%)

0.198 ETH collected from 36 POAPs
0.152 ETH spent to initialize 200 nodes

Batch #5

0x2885977883d7ec4240e3b8a35305f8fd7b928fea13439f5b3470bdc85aee6eb5
Gas Price: 2.4 gwei
Transaction Fee: 0.0334 ETH
Total Initialized Vote Power: 80,199 (92.97%)

0.198 ETH collected from 36 POAPs
0.186 ETH spent to initialize 250 nodes

Batch #6

0xb5999235da4ffea6f9b071889fbaabf6519d45add4d152b04505e62c1b438c5f
Gas Price: 2.4 gwei
Transaction Fee: 0.0332 ETH
Total Initialized Vote Power: 81,302 (94.25%)

0.198 ETH collected from 36 POAPs
0.219 ETH spent to initialize 300 nodes

Batch #7

0x34514eb18258a589512b7041c2acd8ecb8466591325adde0897d2674f36e8fae
Gas Price: 2.48 gwei
Transaction Fee: 0.0344 ETH
Total Initialized Vote Power: 82,297 (95.40%)

0.198 ETH collected from 36 POAPs
0.254 ETH spent to initialize 350 nodes

There will be one more batch if all POAPs are sold, but the initialization rate is now easily high enough to start thinking about the quorum parameters. As mentioned earlier, I’d suggest two separate signaling votes: A standard For/Against/Abstain vote to set proposal.quorum to 0.15 (1500000000000000000) and a 0.25/0.20/0.15/Against/Abstain vote to set proposal.veto.quorum.

I don’t think we really have a precedent for parameter changes, so a question would be whether we want an RPIP for this or a sentiment poll suffices by itself. It’s also somewhat different than future parameter changes will be in that these are meta changes, meaning we probably shouldn’t use an on-chain vote to set them. At least not for initial values.