Try   HackMD

DAO Split MVP Spec

Pesudo code

Before a certain proposal reached the Defeated / Executed states, any Noun owner can call:

dao.signalSplit(proposalId, tokenIds[])
    - reverts if msg.sender doesn't own all tokenIds
    - reverts if proposal state isn't valid for signalSplit
    - a new escrow clone is created for this Noun owner and this proposalId (or an existing one is reused if it's the same owner and proposalId)
    - all tokenIDs are transferred to the escrow
    - voting power is delegated back to the Noun owner, so they can continue to vote until the split is executed or cancelled
    - stores the account and its tokenIds in the list of splitting accounts for later (to be used to give people their tokens)
        - including the escrow address

--

After a proposal reached the above states, and before expiration, anyone can call:

dao.executeSplit(proposalId)
    - reverts if proposal state isn't Defeated / Successful / Queued
    - reverts if the split threshold hasn't been reached (uses the totalSupply from proposal creation time)
    - calls deploySplitDAO() (see below)
    - sends fair share of split assets to new DAO treasury
        - ETH
        - whitelisted ERC20s 
    - optionally: calls mintSplitTokens(), see below. might not be possible due to gas costs, TBD

if gas limits don't permit minting of NFTs upon executeSplit, there will be another function anyone can call that mints tokens:

dao.mintSplitTokens(proposalId, account, tokenIds)
    - reverts if account + tokenIds aren't part of the split accounts from above
    - reverts if they were already minted
    - escrow.sendToOriginalDAO(tokenIDs)
        - gets the escrow for this account and proposalId from the signaling step state
    - newToken.mint(account, tokenId, seed)
        - copies the seed data from the original DAO's token

--

if the split conditions were not meant, anyone can call

dao.returnTokens(proposalId, account, tokenIds)
    - reverts if the split was actually allowed/already happened
    - escrow.sendBackToOwner(account, tokenIds)
    

--

deploySplitDAO()
    - desc = new Descriptor(art: originalNounsArt)
    - token = new NounsToken(descriptor: desc)
    - auction = new AuctionHouse(paused: true)
    - dao = new DAO(splitThreshold: 1 token, vetoer: address(0))
    - treasury = new Executor()

Conditions

  • Must signal split on a proposal
    • Only token owners can do this; delegated cannot signal to split
    • We don't check how you voted
    • Signal split up until voting period ends, and during queue time for a successful proposal
  • Must meet the split threshold, e.g. 20% of total supply

Execution time

  • Successful proposals: executing the proposal first executes the split; alternatively anyone can execute the split first, then execute the proposal. The split can be executed at any time after the queuing period, up until the proposal expires.
  • Defeated proposals: anyone can execute the split at any time after the proposal's defeat, and until defeat time + proposal expiration time (currently 14 days).

Outcome: Where Nouns Go

What happens with Nouns that signal a DAO split?

  1. Upong signaling these Nouns are transfered from the owner's account to an escrow contract.
  2. The escrow contract delegates the escrowed voting power to an account the owner chooses, so they can continue voting until the split is settled.
  3. Once the proposal the split was signaled on reaches an end state, Nouns are taken out of the proxy:
    1. Successful split: Nouns are sent to the Nouns DAO treasury.
    2. No split: owners can withdraw their Nouns.

Outcome: a New DAO

  • New DAO members are minted tokens with the same art and IDs as the tokens they left behind
  • Same token, auction and DAO contracts as the original DAO, with some configuration differences

Starting configuration:

  • Token: each DAO split account is minted the same number of tokens they split with, with the same IDs and art.
    • Art: new token reuses the existing Nouns on-chain art, and the new DAO can vote to use different art.
    • Founder reward: new token has no founder rewards; it is an upgradable contract so that new DAO members can adjust it to their needs; new token also supports locking furthur upgrades.
  • Auction House: a new auction house is deployed paused; new DAO members can vote to configure and start it.
  • DAO:
    • a new copy of the latest Nouns DAO logic + timelock (treasury) contracts is deployed for new DAO; all logic and configurations are the same unless stated otherwise, e.g. it has the same logic for proposals, voting, DAO split, etc.
    • the DAO split threshold is set to a single token, to minimize the risk of a majority attack in the new DAO.
    • Vetoer: The new DAO doesn't have a set Vetoer; DAO members can vote to set a new Vetoer.
  • UI: new DAO should be able to launch their own UI, or reuse an existing DAO UI without any coding skills.
    • Specific design TBD; it can be a better-packaged version of nouns.wtf, and it can also be Nouns Builder UI automatically supporting auctions and governance for any split-created DAO.

Outcome: Asset Split

  • ETH: fair share
  • ERC20 tokens: fair share of whitelisted tokens
    • The DAO can configure a list of tokens to be sent upon a split event; helps mitigate risks like tokens that might fail to send and thus fail split execution
  • NFTs: stay in the original DAO (at least in this version)