Ro5s / Awesome-Governance

Contracts, links and other stuff that makes Governance Awesome
GNU General Public License v3.0
12 stars 2 forks source link

dao merkle drop #2

Open Ro5s opened 3 years ago

Ro5s commented 3 years ago

can we deploy a dao and make a massive airdrop of interactive stakes? (votes, loot, whatever).

context: https://twitter.com/r_ross_campbell/status/1404568349753987087?s=20

great idea from @shegenerates: https://twitter.com/shegenerates/status/1404569849678946306?s=20 on implementation.

To start, maybe we build merkle drop into the COMP-style factory (so instead of initial supply of token going to admin account...... the distribution is stored in token or a distro contract that can be claimed by accounts that prove receipt through merkle root?)

COMP-style factory: https://github.com/Ro5s/Awesome-Governance/blob/main/COMP/GovernanceFactory.sol

shegenerates commented 3 years ago

by default tokens can go to admin. maybe additional percentAirdrop field in creator? then admin gets total - (total*percent airdrop). and the rest get sent to the merkle drop contract that just got deployed.

Ro5s commented 3 years ago

that's efficient 👍 👍 let's go with that flexible approach (rather than have a merkle dropper as separate factory).

would airdropped tokens then need a fourth contract as distributor? or do we simply add a claim function in governor alpha or timelock contract that is deployed?

while we could have tokens claimed from token contract itself, this feels like an anti-pattern.... many tokens are now incorporating format to reject transfers into itself.

shegenerates commented 3 years ago

I think another contract, the distributer, is still necessary to have the system designed well. the distributor has a bit more than just a claim function, since its doing quite a bit of math with the merkleproof things it imports.

I'm not sure if that requires a whole new factory though.

the distributer constructor is simple enough, you should already have all the data on hand to fill it in.

constructor(address token_, bytes32 merkleRoot_) public {        token = token_;        merkleRoot = merkleRoot_;    }
shegenerates commented 3 years ago

Okay I'm almost done with this, one thing... The distributer needs the address of the gov token, so that needs to be launched first. How do I get that for the distributer factory?

edit: oh its address(token) in the deploy function.