This proposal suggests an update to the main governance contract that refunds costs associated with voting. The ‘voteWithRefund’ function would perform the action and refund the voter, all in one transaction. The voter is refunded for gas fees in full.
I propose this upgrade is reviewed by the Tech Grants Pod and added to their backlog of work to be prioritized.
Ask: X ETH
Why
Gas fees can be costly and prohibitive (especially for delegatees)
Further democratize, incentivize, and remove barriers of entry for Nouns governance
The Small Grants and Retro fund should not be in the business of refunding gas fees (as per the wish of Noun 22)
Implementation
Contract details to be fleshed out by the Tech Grants Pod, given they take on the task.
Brianj is interested in managing the frontend work
Contract
In short, update the main governance contract with a new function, ‘voteWithRefund’, which performs the vote action and refunds the user in a single transaction
The user will only be refunded if they have at least one vote. This rule avoids any non-nouner depleting our refund reserves at no cost. For context, the castVote function allows users with no votes to call it.
Rather than revert if the gas price is too high (see: FOMO), cap the gas price used in the refund calculation to a reasonable maximum. It’s unlikely that this cap is unintentionally exceeded, but if it is, it’s important that the vote itself succeeds.
If the contract does not have enough refund reserves, then no refund is provided. The vote must still succeed.
(Suggestion) In the unlikely event that a nouner votes from a contract that does not accept ether or otherwise reverts, then the vote should still succeed despite no refund being provided.
Frontend
Update nouns.wtf main governance UI to use the new ‘voteWithRefund’ contract function
Potentially add a small link/notice on nouns.wtf/vote to explain that voting is free/refunded
Funding
Compensation for Tech Grants Pod (contract):
0 ETH
Compensation for Brianj (frontend):
X ETH
TBD; I suspect this can be managed internally by Tech Grants(?) but interested to hear what the community think is fair comp
Total funds requested
X ETH
More / open questions
Napkin calculation: The modified contract would pay out around 0.1 ETH daily at today’s rate. In a future scenario of 1000 active members, gas fees of $10, and a new proposal every 2 days, the modified contract would refund a maximum of $5,000 (or <3 ETH at current price) per day.
I choose to leave Proposal Submission fees out of this proposal as I suspect the associated gas fee is healthy for governance and may act as a deterrent to spam. We can revisit this assumption at a later point.
Tech grants can coordinate to create the refund contract function, but it needs to know who has voted, who put up a proposal. @vapeape@solimander what’s the best way to handle this on-chain?
My total “top of my head” thought on this was we could look at the vote receipts
Basic flow:
have a function refundForProp(propId, address)
looks at the receipt for the given (propId , address) pair and if it’s valid (i.e. it voted) and has not collected a refund yet it refunds address accordingly. I see this function working like settle auction in that it’s callable by anyone but in practice (because it sends funds to address not msg.sender) would probably only be called by the person getting the refund.
Refunding on a per-transaction basis similar to FOMO Nouns would be the easiest, cheapest way to issue an accurate refund. This comes with the added benefit of only requiring a single transaction. Otherwise, the refund transaction itself would require ETH for gas, which would defeat the entire purpose, or require additional capital to refund.
If Nouns end up in the hands of members for whom gas fees are not trivial (via delegation etc), I think its fine if refunds require additional capital — would still be net positive for Nouns governance i imagine.
That said, I’m all for making this both cheap and easy. Given we adopt your idea, how does that meaningfully change the prop? (Im somewhat contract illiterate.)
I think @solimander’s suggestion (which I really like for its simplicity) means there is no user flow where you go check if you’re eligible for refunds. It would support future actions only; we would deploy a new contract that provides functions like “voteWithRefund” that would perform the action for you and refund you, all in one transaction. Then on the UI side, we would change nouns.wtf’s main governance UI to use this new contract.
If we do go this route, there are a few rules that we should impose:
The user will only be refunded if they have at least one vote. This rule avoids any non-nouner depleting our refund reserves at no cost. For context, the castVote function allows users with no votes to call it.
Rather than revert if the gas price is too high (see: FOMO), cap the gas price used in the refund calculation to a reasonable maximum. It’s unlikely that this cap is unintentionally exceeded, but if it is, it’s important that the vote itself succeeds.
If the contract does not have enough refund reserves, then no refund is provided. The vote must still succeed.
One item that’s up for discussion is whether we should check if the refund transfer is successful. Personally, I do not see the value in doing this. In the unlikely event that a nouner votes from a contract that does not accept ether or otherwise reverts, then the vote should still succeed despite no refund being provided.
This may be a dumb question so forgive my ignorance on the tech side. Is there a way to take the voting to a second level chain like Polygon or Optimism? They work with Etherium, but the fees are miniscule in comparison. I’m trying to learn how this works, so any help in my understanding would be great.
Definitely sounds like it’s worth exploring. I’m not sure the main DAO would ever implement it, but a place like FOODNOUNS or other subDAOs could prove to be an awesome place to test it out once it’s built!