memoscan
← all memos

Memo 0xec00b35d…ce7e2c on Ethereum

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**