# Nouns Auction House V3 Upgrade: Escrowed Streams

## Summary

This proposal upgrades the Auction House contract to V3 and introduces stream-based minority protection. Upon auction settlement, 20% of proceeds go directly to the DAO treasury, while 80% are placed in a non-custodial escrow contract that streams funds to the DAO over 973 days (approximately 2.7 years). Noun owners can cancel their stream at any time by returning their Noun to the DAO and receiving their unstreamed funds back.

## Context

As part of Nouns DAO's incorporation as a Wyoming Decentralized Autonomous Unincorporated Non-profit Association (DUNA), we are replacing the fork-based minority protection with cancellable streams to comply with DUNA requirements regarding member distributions. This redesign allows Noun holders to exit by returning their Noun to the DAO and receiving their unstreamed funds back.

For more information regarding the DUNA incorporation, please read [the Noun Foundation's blog post](https://foundation.nouns.wtf/2024/09/06/duna/) and [the recent proposal that funded the transition](https://www.nouns.camp/proposals/662).

## Audit

- Number of high severity issues found: 0 
- Number of medium severity issues found: 0 
- [See the preliminary report here](https://github.com/nounsDAO/nouns-monorepo/blob/verbs-stream-escrow-nouner-can-create-stream/packages/nouns-contracts/audits/2024-12-12_nouns-dao-auction-streams-preliminary-audit-report-1734007690.pdf) 

## Changes in Detail

### Example Flow

- Alice wins a Noun auction for 10 ETH 
- Upon settlement:
  - 2 ETH (20%) goes directly to the DAO treasury 
  - 8 ETH goes to the StreamEscrow contract 
  - A new stream is created that sends \~0.0082 ETH per day to the DAO over 973 days  
- If Alice cancels after 243 days (\~25% of stream duration):
  - Her Noun returns to the DAO treasury 
  - She receives her remaining \~6 ETH back 
  - The DAO keeps the \~2 ETH already streamed  

### Auction House Changes

- Splits auction proceeds between immediate treasury payment and StreamEscrow 
- Creates a new stream for each auctioned Noun 
- Advances all streams' clocks upon each auction settlement 

### StreamEscrow Contract

- Non-custodial, non-upgradeable contract 
- Manages all streams in a single contract for gas efficiency 
- Streams advance with each auction settlement (minimum 24 hours between advances) 
- Stream owners can:
  - Cancel their stream and receive unstreamed funds 
  - Fast-forward their stream to send funds to the DAO faster  
- Stream rights transfer with Noun ownership 

### Past Nouns and Nounder Nouns

- Nouns auctioned before this upgrade will not have streams 
- Nounder Nouns will not have streams as they were not purchased 

### Voting rights

This stream design does not change how voting rights work. A Noun continues to represent one vote.

### Rationale for stream length and initial payment values

#### Initial payment

- Reasons for setting a higher value
  - The initial payment helps us deter abusive bidding behavior. If there was no initial payment bidders could win an auction and immediately cancel their stream and get a full refund, and would therefore stunt the growth of our community 
  - It should be high enough to deter abuse of client incentives; specifically the reward on auctions is 5% of the winning bid. If this initial payment parameter is set lower than 5%, clients have an incentive to buy Nouns and cancel to gain the difference 
  - Client incentives total rewards are at 10% of auctions; setting the initial payment above the total rewards rate seems like a good anchor, to avoid paying for incentives more than the DAO keeps in the case of cancelled streams  
- Reasons to lower the value
  - More funds still in escrow increase minority protection (a hostile majority can’t use those funds)  

#### Stream length

- Reasons for setting a higher value
  - Funds vest to the DAO at a slower rate, so the DAO’s treasury accumulates less excess funds, therefore the “honeypot” for potential attackers is minimized  
- Reasons to lower the value
  - The DAO might want more funds available sooner to fund certain proposals  

We recommend targeting a Noun’s exit value at roughly 50% of its auction price after one year. There is no specific logic to this part, it’s mostly an idea to get started with. This anchor helps us think about these two parameters together. Here’s a chart of how these parameters interact to achieve our target exit value:

![](https://i.imgur.com/lpv6YNb.jpeg)

The two options we highlighted are:

- Option 1:
  - Initial payment: 10% 
  - Stream length: 821 days (2.2 years)  
- Option 2:
  - Initial payment: 20% 
  - Stream length: 973 days (2.7 years)  

We are recommending option 2, because we think it’s valuable to have a meaningful margin between the initial payment value and the client incentives rate (currently at 10%).

## Configuration Parameters

### Auction House (Upgradeable)

- StreamEscrow address (modifiable via proposal) 
- Initial treasury payment: 20% (modifiable via proposal) 
- Stream length: 973 ticks ≈ 2.7 years (modifiable via proposal, only affects new streams) 

### StreamEscrow (Not Upgradeable)

- Minimum tick duration: 24 hours (immutable) 
- DAO executor address, the address that can modify all other parameters (modifiable by the executor address via proposal) 
- ETH recipient address (modifiable via proposal) 
- Nouns recipient address (modifiable via proposal) 
- Allowed stream creators list (modifiable via proposal) 

## Post-Upgrade Changes

Noun owners will have access to new functionality through Nouns client applications that choose to support these features:

- View their active streams and remaining funds 
- Cancel streams to exit and receive remaining funds 
- Fast-forward streams to fund the DAO faster 

This change is fully backwards-compatible. Auction clients do not need to change anything.

## Transactions

1. auctionHouseProxyAdmin.upgrade(auctionHouseProxyAddress, newAuctionHouseLogicAddress) 
2. auctionHouseProxy.setStreamEscrowParams(immediateTreasuryBPs, streamLengthInTicks, streamEscrowContractAddress)
   - immediateTreasuryBPs = 2000 (20% of each auction's winning bid goes straight to the treasury) 
   - streamLengthInTicks = 973 (roughly 2.7 years)

Outcome: DEFEATED