🔥 The Burn: audit funding
We are planning to propose an upgrade that implements The Burn. The goals for the burn are described in the blog post above by wilson.
What's in this proposal text?
- High level design details
- Audit plan and budget request ($36K)
The burn code is in an advanced state, and if this proposal succeeds we hope to start the audit soon after.
Technical spec
We plan to deploy a new contract, with a single function that lets burn excess ETH from the timelock.
How much will be burned?
Excess ETH is defined as the difference between the treasury value denominated in ETH, and: adjusted_total_supply * trailing_N_day_mean_auction_price.
adjusted_total_supply is the number of minted nouns, excluding nouns held by the treasury or in the escrow contract.
In order to calculate the treasury value in ETH, the contract will consider only ETH, stETH, rETH & WETH. All other assets are ignored.
The number of auctions looked at when calculating the mean price is a configurable parameter; we suggest starting with 90.
Example based on numbers close to actuals:
Treasury has 2857 ETH, 10830 stETH, 228 rETH. Adjusted total supply: 394. Mean price of last 90 auctions: 30 ETH. Treasury value in ETH: 2857 + 10830 + 247 (228 worth of rETH) = 13,934 ETH. Excess ETH: 13,934 - 30 * 394 = 2114 ETH.
What is burned?
Only ETH is burned. If the Nouns runs out of ETH, it will need to swap other assets (e.g. stETH) into ETH to allow for more burn.
When can it be called?
The goal is for the burn to happen at predictable times. One parameter will define what will be the first noun id at which the first burn can happen. Another parameter will define how many noun ids need to be minted before the next burn can happen.
Example:
Suppose the first noun id is set to 1000, and the number of nouns between burns is set to 100. The first burn will be possible once a noun with id 1000 is minted. The next burn would be possible once a noun with id 1100 is minted.
Even if the first burn actually occurs when noun 1002 is auctioned, the next burn will still be possible starting id 1100.
Timelock upgrade
The timelock will be upgraded to a new version which will allow the burner contract to call it an burn ETH.
The timelock will only allow the burner contract to call it.
The address of the burner contract is a configurable param. Setting it to the zero address is effectively turning off the burn mechanism.
Audit costs
Our plan is to undergo a deep code review with solimander, and an audit with Sherlock. In a bit more detail:
- Soli review (+ verbs fix things)
- Sherlock audit
- Verbs fix things + soli reviews fixes
- Sherlock mitigation review
We are asking for 36K USDC to be sent to the Tech Grants Pod multisig to pay for the audit. 30K USDC will go to auditors and 6K USDC will go to Sherlock.
Next steps
Funding the audit will let us know the DAO wants the burn to be deployed. Once funded we will finalize the code, undergo the audit, and follow up with a proposal to upgrade the auction house contract and the treasury contract.
The upgrade will leave the burn disabled, since it seems best to separate the deployment of the mechanism from reaching consensus on its parameters. We will of course support any voters who will want to follow up with a proposal to set the burn parameters.
It's also worthwhile for voters to consider converting stETH into ETH ahead of the burn, since as mentioned above this simple design only burns native ETH.
Appendix: pseudocode
ExcessETHBurner:
// configurable params:
uint numPastAuctions;
uint nextBurnNounId;
uint mintsBetweenBurns;
function burnExcessETH() {
if (auction().nounId < nextBurnNounId) revert('Not yet');
allowedTreasuryInETH = adjustTotalSupply() * meanAuctionPrice();
excessETH = treasuryValueInETH() - allowedTreasuryInETH;
amountToBurn = min(excessETH, timelock.balance);
nextBurnNounId += mintsBetweenBurns;
timelock.burnETH(amountToBurn);
}
function treasuryValueInETH() {
return timelock.balance + stETH.balanceOf(timelock) +
wETH.balanceOf(timelock) + rETH.getEthValue(rETH.balanceOf(timelock));
}
function meanAuctionPrice() {
return mean(auctionHouse.prices(numPastAuctions));
}
Appendix: current asset breakdown
At the time of writing this text, according to Etherscan:
- Total treasury value is roughly $23.15M.
- Its two main assets are:
- ETH at $4.391M (2631.493 ETH).
- stETH at $18.061M (10830.768 stETH).
- These two assets alone make up over 96.7% of the total treasury value.
- USDC is roughly 1.1% of the treasury, and we’re comfortable ignoring it for the sake of code simplicity.
- wstETH is roughly 0.11% and is ignored as well.