Tech Pod Proposal: Vote Refund

‘VoteWithRefund’ Contract Update

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
    1. 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.
    2. 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.
    3. If the contract does not have enough refund reserves, then no refund is provided. The vote must still succeed.
    4. (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.
2 Likes

This is a first draft. Please come with feedback on how to improve this prop.

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?

1 Like

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.

1 Like

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.

4 Likes

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.

2 Likes

thanks, very helpful, will update the prop to reflect this

1 Like

If we do go this route, there are a few rules that we should impose:

  1. 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.
  2. 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.
  3. 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.

4 Likes

Excellent additions, thanks for thinking this through. Adding to prop.

2 clear goals:

  • The refund cannot be abused
  • The vote is of primary importance, refund secondary. The vote must succeed regardless of the refund
1 Like

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.