snapshot-labs / boost

A protocol for token distribution
MIT License
13 stars 5 forks source link

Milestone 1 #1

Open bonustrack opened 2 years ago

bonustrack commented 2 years ago

See https://github.com/snapshot-labs/snapshot/issues/2110 for context.

For the first milestone here is what I propose:

Focus on a single use case where anyone can rewards voters on a proposal with an ERC20 and a fixed amount per voter. Here is the requirements:

I imagine a contract with these functions:

create(id, amtPerAccount, token, expires, guard) To create a new "boost" with fixed amount per voter, the id is a proposal id in our case but we can imagine the contract being used for others scenario.

start(boostId, merkleRoot) To send a merkle root so users can start claim

deposit(boostId, amt) To add more ERC20 into a boost

withdraw(boostId, account, amt) To withdraw funds that you or someone else deposited

claim(boostId, account, merkleProof) To claim your or someone else ERC20

mktcode commented 2 years ago

About amount per account:

This would certainly attract users but how do you ensure they all get their reward? There needs to be some limit. Maybe "First X voters get Y tokens." But that would just incentivize uninformed decisions. Rewards must not be based on time. How about "X random voters get Y tokens"? That would also indirectly favor smaller voters, as it at least does not favor anyone at all. https://github.com/snapshot-labs/snapshot/issues/2110

mktcode commented 2 years ago

Suggestion:

You can claim for someone else You can claim for multiple accounts

claim(boostId, accounts[], merkleProofs[])

mktcode commented 2 years ago

For this first milestone, we agreed that we don't require merkle trees. Individual messages for each vote will be signed and signatures published via IPFS (as a single file) to allow claiming. That means no start method is required to store a tree root.

start(boostId, merkleRoot)

Therefore the claim method takes a signature instead:

claim(boostId, account, signature)

And here a more detailed todo/checklist for hub and UI:

The frontend/plugin:

The hub:

A thought on allowing multiple deposits from different accounts: I could imagine that this isn't really that much demanded and just the DAO itself deposits in most cases. I'm a bit concerned that this makes withdrawals of remaining funds (after expire date) more complicated. Do we really want to support this? Maybe it's easier to allow just top-ups from the account that created the boost.