0xae4705dc…5fedsent to0xada31add…8617·#25,066,393·view on Etherscan
upgrade(address,address)# Route No-Bid Nouns to the Treasury **NounsAuctionHouseV3 upgrade**
posting due to popular demand from tempetechie.eth
## TL;DR
Two-line behavior change in \`NounsAuctionHouseV3.\_settleAuction()\`: when a Noun's auction ends with zero bids, transfer it to the DAO treasury instead of burning it. Storage layout, events, public ABI, and constructor are unchanged, a byte-compatible proxy upgrade.
## Background
Today, if a daily auction ends with no bids, the Auction House calls \`nouns.burn(nounId)\` and the Noun is destroyed forever. This is the original 2021 behavior and has not been revisited. Burning permanently shrinks supply, losing the DAO's option to ever re-auction, grant, or otherwise put that Noun to use.
The bid path already routes ETH proceeds to \`owner()\` (the DAO Executor). The no-bid path should route the Noun itself to the same address, for the same reason.
## The change
```
if (_auction.bidder == address(0)) {
- nouns.burn(_auction.nounId);
+ nouns.transferFrom(address(this), owner(), _auction.nounId);
} else {
nouns.transferFrom(address(this), _auction.bidder, _auction.nounId);
}
That's the entire behavioral diff. After execution, no-bid Nouns become a Treasury asset and can be re-auctioned, granted, held in reserve, or burned retroactively via a follow-up proposal. Burning day 1 preserves none of those options.
Why transferFrom and not safeTransferFrom:
The DAO Executor (0xb1a32FC9F9D8b2cf86C068Cae13108809547ef71, NounsDAOExecutorV2) is a contract and does not implement onERC721Received. Plain transferFrom lands the token without invoking the receiver hook,t he same call shape used in the winning-bidder branch directly below. No new reentrancy surface: transferFrom does not call into the receiver, and _settleAuction() is invoked from nonReentrant external functions.
Technical details:
Auction House proxy 0x830BD73E4184ceF73443C15111a1DF14e495C706
Proxy admin (owned by Executor) 0xC1C119932d78aB9080862C5fcb964029f086401e
New logic contract 0x5d9093E9Ac99f288475ADaE2Ed8e96ae9952EBFd (verified)
Storage layout unchanged
Constructor args unchanged: nouns=0x9C8fF314…03, weth=0xC02a…cC2, duration=86400
AuctionSettled event unchanged signature; no-bid still emits (nounId, address(0), 0)
Proposal action (single call)
target: 0xC1C119932d78aB9080862C5fcb964029f086401e
value: 0
signature: upgrade(address,address)
calldata: 0x000000000000000000000000830bd73e4184cef73443c15111a1df14e495c706
0000000000000000000000005d9093e9ac99f288475adae2ed8e96ae9952ebfd
Test coverage
test_settleAuction_noBid_transfersNounToTreasury — asserts the Noun lands at owner() after a no-bid settlement.
test_settleAuction_noBid_emitsAuctionSettledWithZeroWinner — asserts event shape preserved.
test_settleAuction_noBid_worksWhenOwnerIsNonERC721Receiver — proves transferFrom (not safeTransferFrom) is the deliberate primitive.
test_noBidSettlement_postUpgrade_transfersToTreasury — mainnet-fork upgrade test that warps a zero-bid auction past endTime, settles, and asserts the noun lands at the Executor.
```
- Past Nouns are unaffected.
- Already-burned Nouns stay burned.
- This proposal does not revoke the Auction House's ability to call NounsToken.burn() it only stops it from doing so on the no-bid path.
- A future proposal could remove burn authority entirely if desired.
- 100% vibe coded, no audit
Out of scope:
This proposal does not pre-allocate what becomes of no-bid Nouns once they reach the treasury. Future governance decides on a case-by-case basis.
## Voting:
FOR = the DAO should keep optionality over its own assets, and align the no-bid settlement path with the principle that nothing produced by the auction mechanism is destroyed unilaterally.
AGAINST = permanent supply destruction on a no-bid day is a feature you want to preserve.route-no-bid-nouns-to-the-treasury-**nounsauctionhousev3-upgrade**