BIP-34: Sunrise Improvements
Proposer
Beanstalk Farms, Chaikitty
Proposer Wallet: 0xf9d183af486a973b7921ceb5fdc9908d12aab440
Summary
- Implement a Dutch (Morning) auction that adjusts the Temperature that Beanstalk issues Pods at during the first 25 blocks after the
sunrise; - Refine the base
sunriseincentive reward to account for current network and Beanstalk conditions; and - Make
sunriseinteroperable with thefarmfunction.
Links
- BIP-34 GitHub PR
- Safe Transaction
- GitHub Commit Hash: 538b7a2a89760f6e7aab0fa3146551c030f388d1
Problem
During times of short-term excess demand for Soil, Beanstalk is paying significantly more in Pods than is necessary to attract creditors. In addition, Pod minting is concentrated towards Farmers who are able to execute transactions on-chain first when the demand for Soil is excessively high.
Beanstalk frequently overpays for the sunrise, as most of the reward is used to pay for high gas prices that are due to the competitiveness of calling sunrise.
The sunrise function is not interoperable with the farm function, as the function does not currently return any data.
Proposed Solution
Morning Auction
We propose a Dutch auction for Temperature in the Field during the first $b$ blocks after the sunrise (Morning) of each Season. Each Morning, the Temperature ramps from 1% to 100% of the maximum Temperature.
With this change, the Temperature offered by Beanstalk is dynamic within a Season. In practice, when deltaB > 0, the amount of Soil issued in a Season is dynamic, while the maximum number Pods that can be issued if all Soil is Sown in the Morning is fixed. When deltaB < 0, the amount of Soil issued in a Season is fixed, while the maximum number of Pods that can be issued if all Soil is Sown in the Morning is dynamic.
Before Morning Auction
| Parameters within a given Season | deltaB > 0 | deltaB < 0 |
|---|---|---|
| Soil issued | Fixed | Fixed |
| Maximum number of Pods that can be minted* | Fixed | Fixed |
| Temperature | Fixed | Fixed |
*If all Soil is Sown.
Morning Auction
| Parameters within a given Season | deltaB > 0 | deltaB < 0 |
|---|---|---|
| Soil issued | Dynamic | Fixed |
| Maximum number of Pods that can be minted** | Fixed | Dynamic |
| Temperature | Dynamic | Dynamic |
**If all Soil is Sown in the Morning.
Specification
-
Redefine all instances of
as the maximum Temperature
.
-
Redefine h to:
Where a is the control variable, b is the number of blocks needed to elapse to reach the maximum Temperature, and c is the number of blocks that have elapsed since the sunrise call.
-
Adjust the time in which Beanstalk considers demand for Soil increasing in instances where all but at most one Soil is Sown from 5 minutes to 10 minutes since
sunrise(i.e.,).
-
When
deltaB > 0, fix the maximum Pods that can be issued during a Season based on the number of Pods that became Harvestable at the start of that Season.
Due to function changes in LibDibbler.sol, the Fundraiser Facet must also be updated.
Storage
The following changes are made to Beanstalk’s storage:
- Add to the
Seasonstruct:uint32 sunriseBlock; - Add to the
Seasonstruct:bool abovePeg; - Deprecate
startSoilfrom theFieldstruct in favor ofbeanSown; - Modify
soilin theFieldstruct from datatypeuint256touint128; and - Deprecate
yieldfrom theWeatherstruct in favor oft.
Sunrise Incentive Adjustment
We propose changing the base sunrise incentive reward to account for current network and Beanstalk conditions.
The following logic is used to calculate the incentive reward:
gasUsed = min(deltaGas + GAS_OVERHEAD, MAX_SUNRISE_GAS)
gasFee = block.basefee + PRIORITY_FEE_BUFFER
gasCostBean = gasFee * gasUsed * ethBeanPrice
sunriseReward = min(BASE_REWARD + gasCostBean, MAX_REWARD)
exponentiatedReward = sunriseReward * 1.01^(blocksLate * BLOCK_LENGTH_SECONDS)
Where:
deltaGasis equal to the delta ofgasleftat the start and end of transaction;GAS_OVERHEADis the estimated gas overhead not included indeltaGas(21k plus gas cost to pay the caller);MAX_SUNRISE_GASis the manipulation protection parameter that defines the maximum possible gas cost to callsunrise(likely during a Flood);PRIORITY_FEE_BUFFERis the overestimation of the maximum requiredpriorityFeeto callsunrise(it is possible to access thebaseGasFeebut not thepriorityFeein Solidity);ethBeanPriceis the ETH/BEAN price (which is derived from the BEAN:3CRV pool on Curve and the USDC:ETH pool on Uniswap V3);BASE_REWARDis a fixed increase in Bean reward to cover the costs of operatingsunrisebots;MAX_REWARDis the max base reward to prevent manipulation;blocksLateis the number of blocks in which a successfulsunrisecall was executed past the first block in which it could have been executed; andBLOCK_LENGTH_SECONDSis number of seconds per block in Ethereum (post-Merge this is fixed at 12).
gm function
We propose adding a gm function that (1) implements the sunrise function, (2) can send the incentive reward to the caller’s Farm or Circulating balance and (3) returns the number of Beans paid for the incentive reward.
Technical Rationale
The cost to execute sunrise in Beans is:
gasUsed * (baseGasFee + priorityFee) * beanEthPrice
This solution computes an on-chain estimation of the above formula while adding sufficiently tunable parameters to properly account for estimation error and potential manipulation.
Adding the ability to send sunrise incentive rewards to the caller’s Farm balance increases the composability of Beanstalk. Adding a return value for the new gm function makes it much easier for other smart contracts calling Beanstalk to track sunrise incentive rewards.
Economic Rationale
Reducing unnecessary Pod issuance should improve Beanstalk’s creditworthiness as a borrower. Maximizing Beans borrowed for a given Pod issuance should improve Beanstalk’s efficiency.
Reducing unnecessary Bean issuance in the sunrise incentive reward can reduce sell pressure on Beans.
The cost of paying the sunrise caller differs based on the selected ToMode and whether the caller already has Beans in their Circulating and/or Farm balance. GAS_OVERHEAD is set such that the incentive amount is high enough for Farmers that don’t have Beans in their balances already. For Farmers that already have Beans (outside the Silo), this also has the affect of compensating for one failed transaction per success, such that a caller with 50/50 success rate will retain slight profit.
Improving the composability of Beanstalk should improve the user experience and utility of Beanstalk and Beans.
Contract Changes
The Δ symbol indicates that there is a proposed change in functionality.
Field Facet
The following FieldFacet is being removed from Beanstalk:
The following FieldFacet is being added to Beanstalk:
FieldFacet Function Changes
| Name | Selector | Action | Type | Δ |
|---|---|---|---|---|
sow | 0x6c8d548e | Remove | Call | |
sowWithMin | 0x78309c85 | Remove | Call | |
harvest | 0x8fd83ecf | Replace | Call | |
harvestableIndex | 0xd6be1816 | Replace | View | |
plot | 0xe1d9d628 | Replace | View | |
podIndex | 0xcb44a6cf | Replace | View | |
totalHarvestable | 0x067fcd2e | Replace | View | |
totalHarvested | 0x23dc1142 | Replace | View | |
totalPods | 0xc0aa6a90 | Replace | View | |
totalSoil | 0x3285008a | Replace | View | ✓ |
totalUnharvestable | 0x4433366d | Replace | View | |
yield | 0x28593984 | Replace | View | ✓ |
maxTemperature | 0x7907091f | Add | View | ✓ |
remainingPods | 0x56ba3e24 | Add | View | ✓ |
sow | 0x32ab68ce | Add | View | ✓ |
sowWithMin | 0x553030d0 | Add | View | ✓ |
temperature | 0xadccea12 | Add | View | ✓ |
FieldFacet Event Changes
None.
Fundraiser Facet
The following FundraiserFacet is being removed from Beanstalk:
The following FundraiserFacet is being added to Beanstalk:
FundraiserFacet Function Changes
| Name | Selector | Action | Type | Δ |
|---|---|---|---|---|
createFundraiser | 0x4b4e8d9a | Replace | Call | |
fund | 0x43c5198e | Replace | Call | ✓ |
fundingToken | 0xc869c1eb | Replace | View | |
fundraiser | 0xce133450 | Replace | View | |
numberOfFundraisers | 0x6299a9af | Replace | View | |
remainingFunding | 0x0d1a844c | Replace | View | |
totalFunding | 0x6ee66ddf | Replace | View |
FundraiserFacet Event Changes
None.
Season Facet
The following SeasonFacet is being removed from Beanstalk:
The following SeasonFacet is being added to Beanstalk:
SeasonFacet Function Changes
| Function Name | Selector | Action | Type | Δ |
|---|---|---|---|---|
paused | 0x5c975abb | Replace | View | |
plentyPerRoot | 0xe60d7a83 | Replace | View | |
poolDeltaB | 0x471bcdbe | Replace | View | |
rain | 0x43def26e | Replace | View | |
season | 0xc50b0fb0 | Replace | View | |
seasonTime | 0xca7b7d7b | Replace | View | |
sunrise | 0xfc06d2a6 | Replace | View | ✓ |
time | 0x16ada547 | Replace | View | |
totalDeltaB | 0x06c499d8 | Replace | View | |
weather | 0x686b6159 | Replace | View | |
abovePeg | 0x2a27c499 | Add | View | ✓ |
gm | 0x64ee4b80 | Add | Call | ✓ |
sunriseBlock | 0x3b2ecb70 | Add | View | ✓ |
SeasonFacet Event Changes
None.
Initialization Contract
The init function on the following InitBipSunriseImprovements contract is called:
Beans Minted
None.
Audit
The commit hash of this BIP is 538b7a2a89760f6e7aab0fa3146551c030f388d1.
Halborn has performed an audit of this BIP up to commit hash f37cb42809fb8dfc9a0f2891db1ad96a1b848a4c. You can view the Halborn audit report here. All changes made between the two commits were either tests, documentation or minor fixes found during code review.
Effective
Immediately upon commit.
| Voter | Cast Power | Vote & Rationale |
|---|---|---|
0x10bf...DCC0e4 | 3.235M | For |
0x15F5...1499E3 | 2.718M | For |
0x3743...e2494B | 2.486M | For |
0xC385...1eB20E | 1.759M | For |
0x87C9...6ac29e | 1.715M | For |
VOTE POWER
Proposal Status
- Wed April 26 2023, 11:00 pmVoting Period Starts
- Wed May 03 2023, 11:00 pmEnd Voting Period
Current Results
1-For
51.39M
