FeedProjects
Developers
Settings
🎉 A new chapter begins: Boardroom has joined Agora
Learn more
protocol logo
Explore / Projects
Beanstalk DAO

Proposals

Members

Information

Create Proposal

Beanstalk DAO

ProposalsMembersInformation
Proposal
Back to Proposals
closedEnded 3 years ago · Snapshot (Offchain)

BIP-34: Sunrise Improvements

By 0x47a4...Ad6888

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 sunrise incentive reward to account for current network and Beanstalk conditions; and
  • Make sunrise interoperable with the farm function.

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 SeasondeltaB > 0deltaB < 0
Soil issuedFixedFixed
Maximum number of Pods that can be minted*FixedFixed
TemperatureFixedFixed

*If all Soil is Sown.

Morning Auction

Parameters within a given SeasondeltaB > 0deltaB < 0
Soil issuedDynamicFixed
Maximum number of Pods that can be minted**FixedDynamic
TemperatureDynamicDynamic

**If all Soil is Sown in the Morning.

Specification

  1. Redefine all instances of image as the maximum Temperature image.

  2. Redefine h to:

image

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.

image

  1. 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., image).

  2. 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 Season struct: uint32 sunriseBlock;
  • Add to the Season struct: bool abovePeg;
  • Deprecate startSoil from the Field struct in favor of beanSown;
  • Modify soil in the Field struct from datatype uint256 to uint128 ; and
  • Deprecate yield from the Weather struct in favor of t.

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:

  • deltaGas is equal to the delta of gasleft at the start and end of transaction;
  • GAS_OVERHEAD is the estimated gas overhead not included in deltaGas (21k plus gas cost to pay the caller);
  • MAX_SUNRISE_GAS is the manipulation protection parameter that defines the maximum possible gas cost to call sunrise (likely during a Flood);
  • PRIORITY_FEE_BUFFER is the overestimation of the maximum required priorityFee to call sunrise (it is possible to access the baseGasFee but not the priorityFee in Solidity);
  • ethBeanPrice is the ETH/BEAN price (which is derived from the BEAN:3CRV pool on Curve and the USDC:ETH pool on Uniswap V3);
  • BASE_REWARD is a fixed increase in Bean reward to cover the costs of operating sunrise bots;
  • MAX_REWARD is the max base reward to prevent manipulation;
  • blocksLate is the number of blocks in which a successful sunrise call was executed past the first block in which it could have been executed; and
  • BLOCK_LENGTH_SECONDS is 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:

  • 0x79801f5cb2592dd2173482198385e62870a0eae2

The following FieldFacet is being added to Beanstalk:

  • 0xB57A1c006D827af549F6A31DC10028e5e2782762

FieldFacet Function Changes

NameSelectorActionTypeΔ
sow0x6c8d548eRemoveCall
sowWithMin0x78309c85RemoveCall
harvest0x8fd83ecfReplaceCall
harvestableIndex0xd6be1816ReplaceView
plot0xe1d9d628ReplaceView
podIndex0xcb44a6cfReplaceView
totalHarvestable0x067fcd2eReplaceView
totalHarvested0x23dc1142ReplaceView
totalPods0xc0aa6a90ReplaceView
totalSoil0x3285008aReplaceView✓
totalUnharvestable0x4433366dReplaceView
yield0x28593984ReplaceView✓
maxTemperature0x7907091fAddView✓
remainingPods0x56ba3e24AddView✓
sow0x32ab68ceAddView✓
sowWithMin0x553030d0AddView✓
temperature0xadccea12AddView✓

FieldFacet Event Changes

None.

Fundraiser Facet

The following FundraiserFacet is being removed from Beanstalk:

  • 0x538c76976ef45b8ca5c12662a86034434bfc7a8e

The following FundraiserFacet is being added to Beanstalk:

  • 0xBb5dC125E48A4580721b1E40Ac52984c2Ce54D3A

FundraiserFacet Function Changes

NameSelectorActionTypeΔ
createFundraiser0x4b4e8d9aReplaceCall
fund0x43c5198eReplaceCall✓
fundingToken0xc869c1ebReplaceView
fundraiser0xce133450ReplaceView
numberOfFundraisers0x6299a9afReplaceView
remainingFunding0x0d1a844cReplaceView
totalFunding0x6ee66ddfReplaceView

FundraiserFacet Event Changes

None.

Season Facet

The following SeasonFacet is being removed from Beanstalk:

  • 0x83d6e6b446613c9bfaebc64260962bc4f828a3ac

The following SeasonFacet is being added to Beanstalk:

  • 0x9c9360C85cd020D4eF38775F6ADEdD38931f1731

SeasonFacet Function Changes

Function NameSelectorActionTypeΔ
paused0x5c975abbReplaceView
plentyPerRoot0xe60d7a83ReplaceView
poolDeltaB0x471bcdbeReplaceView
rain0x43def26eReplaceView
season0xc50b0fb0ReplaceView
seasonTime0xca7b7d7bReplaceView
sunrise0xfc06d2a6ReplaceView✓
time0x16ada547ReplaceView
totalDeltaB0x06c499d8ReplaceView
weather0x686b6159ReplaceView
abovePeg0x2a27c499AddView✓
gm0x64ee4b80AddCall✓
sunriseBlock0x3b2ecb70AddView✓

SeasonFacet Event Changes

None.

Initialization Contract

The init function on the following InitBipSunriseImprovements contract is called:

  • 0xA3b3fB1951872346ea45EE601B29637Ca67fe6B4

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.

Continue Reading
Connect Wallet to Add Note
0
Votes 203
VoterCast PowerVote & 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

SHOW MORE
VOTE POWER
0
Connect Wallet
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

DocumentationBrandingContact Us
Home
This Project is Currently Disabled

If you would like to enable it, please checkout below.

Boardroom Subscription

Sign up for an individual subscription (access all projects on the platform)

Subscribe
Enable Project

Enable the entire project for every user

Enable Project
Contact Us