Proposed: October 1, 2024
Status: Passed
Link: Snapshot
Note: During the BIP-50 vote, it was noticed that the L2 TokenFacet proposed to be added to the L2 Beanstalk referenced the L1 WETH contract address instead of the Arbitrum WETH contract address. The L2 TokenFacet was redeployed at 0xf8B5Fa117f492608b8f16AAE84C69175ead6A38d using the correct WETH contract address.
BIP-50 stated that PauseFacet was left on the L1 mainnet. It was removed.
BIP-50 listed InternalBalanceChanged as a modified event. It was unchanged.
BIP-50 incorrectly listed UpdatedSeedGaugeSettings as a new event. The correct event name is UpdatedEvaluationParameters.
The text below represents BIP-50 as voted upon, without corrections.
Beanstalk Farms, Ben Weintraub, Brendan Sanderson
Proposer Wallet: 0xf9d183af486a973b7921ceb5fdc9908d12aab440
TokenTransferred
event with data on sender and receiver addresses of Farm balance transfers;Since Replant in August 2022, there have been 5 bugs that could have led to a loss of funds (fixed in EBIPs 1, 4, 5 (only Circulating assets were at risk), 10 and 12). In particular, the bugs that were mitigated in EBIPs 1, 10 and 12 could have led to losses of nearly all value in the Beanstalk contract.
Since the creation of the Immunefi Bug Bounty Program in BIP-26, the DAO has paid 1,530,350 Beans in bounties, 1,322,100 of which was for bug reports concerning funds in the Beanstalk contract that were at risk.
The effectiveness of the LP component of the Seed Gauge System is highly limited due to excessive friction between LP Converts. Currently, in order to Convert LP → LP, the source pool(s) must have negative deltaBs and the destination pool must have a positive deltaB (effectively a Pipeline LP → BEAN → LP Conversion). This is both inefficient from a gas perspective and limiting for Farmers' choices given that the effect from a peg maintenance perspective is neutral.
Currently, Flood is only implemented to take place in a single Well. The effectiveness of Flood is substantially decreased with the introduction of several whitelisted Wells.
Currently, the distribution of Bean mints (allocated to the Silo, Field and Barn) is not sufficiently generalized such that it can be upgraded by changing parameters (i.e., facet changes are required).
Maintaining and optimizing a position in Beanstalk requires manual intervention (Mowing, Planting, Harvesting Pods and Depositing the Beans, etc.). Smaller Farmers do not necessarily have the resources to automate the execution of their Beanstalk transactions.
Existing peer-to-peer transaction marketplaces (such as Seaport) are limited in the scope of the functionality that they support. Existing generalized function call systems (i.e., smart contract accounts, Depot + Pipeline) only support the use of assets from the sender of the transaction.
As a result of Beanstalk using Solidity v0.7.6, many QoL tools are not available to the Beanstalk development community, such as:
Whitehats and auditors are generally more familiar with Solidity v0.8.0 and higher.
Whitelisting a Well requires new code changes to the Beanstalk contracts, which increases the friction associated with whitelisting a Well (via audits, etc.). Ideally, the DAO can whitelist a Well in the Silo without any facet changes.
Currently, the Temperature increases excessively fast in the first few blocks of the Morning. For example, Soil can never be purchased at a Temperature below ~27% of the Maximum Temperature given the current parameters.
Currently, the default Gauge Point function increments or decrements the Gauge Points for each whitelisted LP token by 1 based on whether the current BDV distribution for the LP token is greater than or less than the optimal BDV distribution. Given the maximum and minimum Gauge Point values of 1000 and 0, respectively, it can take up to 20 days ((1000/2) Gauge Points / 24 Seasons ~= 20.833 days) for the Gauge Points to "catch up" such that the Seed rewards reflect the new current vs. optimal distribution.
For example: BEANwstETH and BEANETH currently have 1000 and 0 Gauge Points, respectively. If sufficient amounts of BEANETH Converts to BEANwstETH such that the current distribution of BEANwstETH is higher than optimal, Beanstalk will keep rewarding more Seeds to BEANwstETH than BEANETH for ~20 days even though it is no longer necessary.
Currently, it's possible for Beanstalk to Flood before the Bean to Max LP Ratio has reached its minimum value, i.e., before Beanstalk has created the maximum incentive for Converting downwards.
Some Farmer balances can only be calculated by indexing events since Beanstalk deployment, resulting in either (1) thousands of calls to RPC providers each time the Beanstalk UI loads (which often gets rate limited), or (2) reliance on infrastructure like the subgraphs. Both have historically resulted in downtime for Farmers trying to view their balances.
Beanstalk currently has a number of variables set as constants in order to save gas. This increases the friction of upgrading Beanstalk by needing to redeploy the facets with only constants changed.
The current App Storage structure is difficult to extend and develop with.
Currently, Beanstalk's reentrancy protection system does not support Pipeline and Depot.
Micro Stalk can sometimes be lost during certain Silo interactions due to the current Stalk precision relative to the Seed precision. This introduced a rounding error where users had slightly less Stalk than the amount needed to Withdraw.
Within Beanstalk, Farmers can transfer assets to and from their Circulating and Farm balances. When a Farmer transfers an asset from their Farm Balance to another address' Farm Balance, the emitted events make it difficult to trace the origin of the assets.
Beanstalk is a gaseous protocol. While the costs of interacting with Beanstalk at the time of writing in September 2024 are reasonable, activity on Ethereum L1 is currently low. In the past when Gwei has spiked, interacting with Beanstalk has cost tens or hundreds of US dollars. This prices out smaller Farmers and reduces the efficacy of Beanstalk's peg maintenance mechanism.
Upgrades like Secure Beanstalk, the new view functions, etc. increase the cost of interacting with Beanstalk across the board.
Opportunities for Bean liquidity providers to receive Stalk and Seed rewards are currently limited. A wider variety of options increases utility for Silo Depositors, particularly with the combination of the Seed Gauge System and Generalized Convert.
Hypernative, the Immunefi Bug Bounty Program and the Beanstalk DAO Disclosures can all be updated to reflect the new state of Beanstalk.
We propose the implementation of system-wide invariants that are checked on every write call to Beanstalk. The invariants are indicative of a healthy state of Beanstalk's internal accounting and must always be maintained. These invariants ensure that the Beanstalk contract contains enough assets to cover all of its user obligations, ERC-20s are not being transferred unexpectedly and that the Bean supply is not being manipulated.
The Invariable contract defines several invariant modifiers that are used across the code base.
The invariants fall into three different categories:
The fundsSafu
modifier checks every whitelisted ERC-20 token. If the balance of the token in the Beanstalk contract is lower than the amount of the token that users can claim (through Withdrawals, Harvests, Claims, etc) then the invariant will fail and the call will revert. This ensures there are always enough tokens in the contract for Beanstalk to pay its existing obligations. Excluding diamond management functions, this invariant can be placed on every write function in Beanstalk.
The noNetFlow
, noOutFlow
, and oneOutFlow
invariants track the balance of ERC-20 tokens inside Beanstalk and fail if there is an unexpected movement of assets. This ensures that there are not any withdrawals of unexpected assets in the modified functions, however, it does not set any limits on the amounts withdrawn. noNetFlow
requires that Beanstalk token balances are the same at the end of the call as they were at the beginning, noOutFlow
requires that all Beanstalk token balances are the same or higher at the end of the call and oneOutFlow
allows for only one asset to decrease in amount during the call. These three modifiers cover the vast majority of use cases and one of the three can be put on almost every write function in Beanstalk. Notable exceptions are diamond management, Convert and farm
-like functions.
The noSupplyChange
and noSupplyIncrease
invariants keep track of the total supply of Bean at the beginning and end of the call to ensure that the Bean supply was not unexpectedly modified. noSupplyChange
prevents both minting and burning, whereas noSupplyIncrease
only prevents minting. One of these two modifiers can be placed on every write function in Beanstalk that is not intentionally minting or burning Beans (such as Sowing and gm
). Notable exceptions are diamond management and farm
-like functions.
We also propose to remove various dead code such as the Pod Market V2 pricing functions.
We propose a Generalized Convert implementation with support for LP → LP Converts, a Stalk penalty system to enable Converting against peg and a per-block Convert cap mechanism to protect against flash loan attacks.
The PipelineConvertFacet exposes the new pipelineConvert
function and Stalk penalty logic has been applied to the existing ConvertFacet. The existing ConvertFacet retains support for Unripe Converts, which are not supported by the new PipelineConvertFacet.
The Pipeline Convert function is defined as:
function pipelineConvert(
address inputToken,
int96[] calldata stems,
uint256[] calldata amounts,
address outputToken,
AdvancedPipeCall[] memory advancedPipeCalls
)
external
payable
fundsSafu
nonReentrantFarm
returns (int96 toStem, uint256 fromAmount, uint256 toAmount, uint256 fromBdv, uint256 toBdv);
Usage of the first four parameters is the same as the existing convert
function (specify the input crates using the Deposited Stem and amounts, as well as the input and output tokens to Convert from and to). The advancedPipeCalls
parameter is new.
The pipelineConvert
function withdraws the corresponding whitelisted tokens from Beanstalk and passes them to the Pipeline contract. The supplied Pipeline calls should call other contracts to swap (the total input token amount available to swap can be calculated by summating all the amounts passed in via amounts
).
A typical series of Pipeline calls might follow these steps (using Solidity):
Approve spending the ERC20 token:
bytes memory approveEncoded = abi.encodeWithSelector(
IERC20.approve.selector,
TARGET_ADDRESS,
MAX_UINT256
);
The previous user of the Pipeline contract may not have setup an approval for spending the input token used to Convert, so an approval call verifies the ERC-20 can be sent to the TARGET_ADDRESS
(in some cases, perhaps a Well).
Perform the swap:
bytes memory addLiquidityEncoded = abi.encodeWithSelector(
IWell.addLiquidity.selector,
tokenAmountsIn, // tokenAmountsIn
minAmountOut, // min out (should not be left as zero, or the Convert can be frontrun)
PIPELINE, // recipient
type(uint256).max // deadline
);
This example adds liquidity to a Well (assuming this is a Bean → Well convert). Note that this action is performed from the Pipeline contract itself, and thus, the recipient is the Pipeline contract. The swap call does not have to use Wells—other DEXs (Uniswap, Curve, etc) or aggregators (0x, 1inch, etc) can be used.
The above encoded calls are then wrapped in AdvancedPipeCall
so that the target contract and Clipboard data can be specified. The final array of these calls are inserted into the Convert function. Note these calls may want to check available Convert capacity first if a MEV protection RPC is not used (see Convert Capacity below).
After the final Pipeline call is performed, the pipelineConvert
function calls the ERC-20 balanceOf
function on the Pipeline contract and removes all of the ERC20 token of the outputToken
type. Any other ERC-20's remaining in Pipeline after the Convert must be removed by the user.
Generalized Convert introduces the ability to Convert against peg and a Stalk penalty for doing so. The penalty applies a 100% reduction in Grown Stalk of the Converted Deposit based on the amount that was Converted against peg.
For example, if 20 BDV is Converted, and only 10 of the BDV Converted is against peg, then 50% of the Grown Stalk associated with Deposit will be burned. No penalty is applied if the Convert brings the cumulative deltaB closer to 0.
To prevent flash loan attacks that allow Converting against peg without incurring the Stalk penalty, a Convert capacity mechanism is introduced.
Every Convert updates the amount of BDV Converted per block on a per Well and overall basis. The total capacity available before a penalty applies is based on deltaB for each corresponding Well and the overall deltaB.
View functions are exposed to read the remaining capacity for a block in order to ensure that the Pipeline function can revert if conditions become unfavorable to the user over the course of the block.
Two functions are available to view available Convert capacity for the block, the first being the overall capacity remaining:
function getOverallConvertCapacity() external view returns (uint256);
And the second being the capacity available on a per Well basis:
function getWellConvertCapacity(address well) external view returns (uint256);
If the available Convert capacity of either is less than the BDV of the amount being Converted, then the Stalk penalty will apply.
We propose a Generalized Flood implementation that supports Flooding in the highest deltaB Wells until the cumulative deltaB is 0.
While previously the entire Pod Line became Harvestable upon Flood, we propose that only 0.1% of the Bean supply worth of Pods become Harvestable.
We propose a dynamic system for distributing Bean mints to the different outputs within the system—the Silo, Field and Barn. The system is sufficiently generalized such that it can change between different configurations without requiring contract changes. It can support multiple Fields and is expandable to handle unknown output types that can be implemented in future upgrades.
Each distribution stream for new Bean mints is defined by two different structures: a ShipmentRoute
and a ShipmentPlan
.
Shipment Routes define where a portion of the Bean mints will be sent to and how the associated Plan is retrieved. The Routes are stored in Beanstalk state. They can be modified via owner-restricted write functions. The Route contains an enum indicating which output stream the mints are associated with—the Silo, Field or Barn. Implementation of streams that do not fall into these categories require modification to the Beanstalk contracts.
struct ShipmentRoute {
address planContract;
bytes4 planSelector;
ShipmentRecipient recipient;
bytes data;
}
Shipment Plans specify the ratio and the maximum Beans that a Route can receive for the current mint. This configuration is dynamic, based on current state and arbitrary logic. Shipment Plans are retrieved by calling standardized Plan getter functions. The functions can live internal or external to Beanstalk. Externalizing these functions allows for them to be updated without modifying Beanstalk contracts.
struct ShipmentPlan {
uint256 points;
uint256 cap;
}
Each Plan assigns points to its associated route. The Route receives the ratio of minted Beans equal to the ratio of Route points / all points. In this way, there are not circular dependencies for each Plan to know about the other Plans.
If Beans to a route exceed the maximum Beans that Route can handle the excess Beans will be distributed to the other routes, in proportion to their points. The Silo Route should never have a cap.
Both Shipment Routes and Plans can be updated via the setShipmentRoutes
function, in conjunction with an external contract that contains the associated Shipment Plan getters.
We propose Tractor, a peer-to-peer transaction marketplace that allows third party operators to perform Beanstalk actions on behalf of a Farmer.
Blueprints are off-chain data structures that are EIP-712 signed to verify the intent of the publishing Farmer. Blueprints allow Farmers to define arbitrary sequences of on-chain function calls, which can be executed permissionlessly by other Farmers known as Tractor Operators.
Blueprints contain the Publisher, an Advanced Farm function call containing an arbitrary sequence of internal function calls, a set of copy instructions that define how to interpret Operator calldata, expiry parameters and the EIP-712 signature from the Publisher. Any Tractor Operator can execute any Blueprint with any calldata at anytime through the tractor(...)
function provided that the Blueprint does not revert.
Junctions are contracts that are contain basic operations as external functions that are used by Tractor orders. Junctions allow Farmers to define Blueprints that will fail under a predefined set of conditions, such as balance limits, price thresholds, etc.
Blueprints are off-chain data structures that are EIP-712 signed to verify Publisher intent. Each Blueprint contains an arbitrary sequence of internal and external function calls wrapped into an AdvancedFarm call and to be executed through the TractorFacet. Any properly signed Blueprint can be executed through Tractor given that:
startTime < block.timestamp < endTime
;blueprintNonce[nonce] < maxNonce
; andadvancedFarm
function call does not revert (Publishers can encode logic checks that revert under arbitrary conditions).Blueprints are defined by the following struct:
struct Blueprint {
address publisher;
bytes data;
bytes32[] operatorPasteInstrs;
uint256 maxNonce;
uint256 startTime;
uint256 endTime;
}
Blueprints are wrapped in a Requisition, which contains the Blueprint hash and the Publisher's signature of the hash.
struct Requisition {
Blueprint blueprint;
bytes32 blueprintHash;
bytes signature;
}
Where:
publisher
is the account that published the Blueprint;data
is bytes that decode into (AdvancedFarmCall[])
;operatorPasteInstrs
are a set of instructions that define how operator-defiend data is injected into the AdvancedFarmCalls of the data
;maxNonce
is the maximum # of times a Blueprint can be executed;startTime
is the timestamp at which the Blueprint can start to be executed;endTime
is the timestamp at which the Blueprint can no longer be executed;blueprintHash
is the keccak256 hash of the populated Blueprint struct; andsignature
is the Publisher's EIP-712 signature of the Blueprint Hash.Blueprint Hashes are unique identifiers for Blueprints. Blueprint Hashes are used to track the nonce of a Blueprint and used in the signing process. A Blueprint Hash must be hashed following the EIP-712 standard. Beanstalk provides a public helper function getBlueprintHash(Blueprint blueprint)
.
Requisitions do not need to be written on-chain. They can be provided to operators off-chain and verified via the signature. However, Tractor offers a system to publicly publish any Requisition via the PublishRequisition
function, which emits an event containing the Requisition.
function publishRequisition(LibTractor.Requisition calldata requisition) external;
event PublishRequisition(LibTractor.Requisition requisition);
Blueprints can be canceled at anytime by the Blueprint Publisher by calling cancelBlueprint
. This sets the nonce to uint256.max
, rendering the Blueprint unusable.
function cancelBlueprint(LibTractor.Requisition calldata requisition) external;
event CancelBlueprint(bytes32 blueprintHash);
function tractor(LibTractor.Requisition calldata requisition, bytes memory operatorData) external returns (bytes[] memory results);
event Tractor(address indexed operator, bytes32 blueprintHash);
Tractor executes a Blueprint. Executing a Blueprint:
startTime < block.timestamp < endTime
;blueprintNonce[blueprintHash] < maxNonce
;blueprintNonce[blueprintHash]
;blueprint.data
using the operatorPasteInstrs
and operatorData
;advancedFarm
using data
; andTractor
event.Instead of adding new state variables to AppStorage
, a TractorStorage
library is created where TractorStorage
is loaded at slot keccak256("diamond.storage.tractor")
(stored as a constant).
struct TractorStorage {
mapping(bytes32 => uint256) blueprintNonce;
mapping(address => mapping(bytes32 => uint256)) blueprintCounters;
address activePublisher;
}
Blueprints can utilize arbitrary counters to track and limit use. These are stored in TractorStorage and writes are restricted based on the Publisher's address. Blueprints using counters are expected to generate sufficiently random counter IDs to avoid collisions with a Publisher's other counters.
Tractor performs actions on behalf of the Publisher of a Blueprint that that is executed by Tractor. Rather than using msg.sender
to determine the account to act on, the active Publisher address is used.
We propose to upgrade each contract and facet in Beanstalk from v0.7.6 to v0.8.20.
We propose to upgrade the whitelisting system such that various Implementations can be set and changed for each Well. Implementations can be used to the set a Well's:
In order for a whitelisted Well to be included in the Minting Whitelist, the Gauge System and Converts, the non-Bean token in the Well must have an Oracle Implementation. Whitelisted Wells without a Gauge Point or Liquidity Weight Implementation use the default Gauge Point and Liquidity Weight Implementation defined in GaugePointFacet and LiquidityWeightFacet, respectively.
An Implementation is defined in App Storage as:
struct Implementation {
address target;
bytes4 selector;
bytes1 encodeType;
bytes data;
}
Where:
target
is the the address in which selector
is called at; selector
is the function selector Beanstalk is calling at address
;encodeType
determines the function signature Beanstalk should call at the address
; anddata
is arbitrary data that can be added to a function call.For a given Gauge Point Implementation, the function should match the following signature:
function gaugePointFunction(
uint256 currentGaugePoints,
uint256 optimalPercentDepositedBdv,
uint256 percentOfDepositedBdv,
bytes memory
)
For a given Liquidity Weight Implementation, the function should match the following signature:
function liquidityWeight(bytes)
For a given Oracle Implementation, the function should match the following signature:
function oracle(
uint256 tokenDecimals
uint256 lookback
byte memory data
)
Gauge Point and Liquidity Weight Implementations are set per whitelisted Well. Oracle Implementations are set on a token basis.
Beanstalk has 2 default Oracle Implementations, which are used when the whitelisted Well is whitelisted with an oracle encodeType of 0x01
and 0x02
:
0x01
→ Chainlink Implementation; and0x02
→ Uniswap and Chainlink Implementation. To use the 0x01
default Implementation, the Oracle Implementation address for the non-Bean token in the Well should be set to the Chainlink aggregator that the price should be fetched from. The Oracle Implementation should return the USD price of the non-Bean token.
To use the 0x02
default Implementation:
For example, for a BEAN:WBTC Well, the 0x02
default Oracle Implementation could be used by combining the WBTC:USDC Uniswap V3 pool with the USDC:USD Chainlink aggregator.
Additional support for different function signatures can be accomplished by implementing new code for a given encode type.
We propose to change the control variable in the Morning Auction from 2 to 0.1.
More specifically, change the calculation for the Temperature during blocks 1 to 25 (x) of each Season from (the blue line):
To the following (the red line):
See Desmos link.
Due to the L2 Migration, in practice the Temperature only updates L1_BLOCK_TIME / L2_BLOCK_TIME = 12/0.25 = 48
times. The duration of the Morning is still 5 minutes. Thus, on Arbitrum, the Temperature during the first 1200 blocks of each Season is calculated as:
We propose to update the default Gauge Point function to change the Gauge Points for the whitelisted LP token by ±5/3/1 based on the following thresholds:
For example, if BEANETH's optimal % is 16%, the thresholds are:
We propose to change beanToMaxLpGpPerBdvRatio
to the minimum value upon Rain (i.e., at startRain
).
Beanstalk now stores the list of Deposit IDs and Plot indexes on each account, as well as a mapping from Deposit ID to its associated index to support a O(1) read cost.
struct DepositListData {
uint256[] depositIds;
mapping(uint256 => uint256) idIndex;
}
...
uint256[] plotIndexes;
mapping(uint256 => uint256) piIndex;
The list of Deposit IDs are stored on a per token basis.
Deposit data can be fetched using the following functions:
getDepositsForAccount
;getTokenDepositsForAccount
;getTokenDepositIdsForAccount
; andgetIndexForDepositId
.Plot data can be fetched using the following functions:
getPlotIndexesFromAccount
;getPlotsFromAccount
; andbalanceOfPods
.We propose to migrate various parameters that were previously set to constants to be read from contract state. This is stored in the system storage as EvalutationParameters
like so:
struct EvaluationParameters {
uint256 maxBeanMaxLpGpPerBdvRatio;
uint256 minBeanMaxLpGpPerBdvRatio;
uint256 targetSeasonsToCatchUp;
uint256 podRateLowerBound;
uint256 podRateOptimal;
uint256 podRateUpperBound;
uint256 deltaPodDemandLowerBound;
uint256 deltaPodDemandUpperBound;
uint256 lpToSupplyRatioUpperBound;
uint256 lpToSupplyRatioOptimal;
uint256 lpToSupplyRatioLowerBound;
uint256 excessivePriceThreshold;
uint256 soilCoefficientHigh;
uint256 soilCoefficientLow;
uint256 baseReward;
}
App Storage has been redesigned such that two structs are implemented:
Account
contains state stored on an account level; andSystem
contains state stored on a protocol level.struct AppStorage {
mapping(address => Account) accts;
System sys;
}
Various deprecated state variables are removed between the two structs and state is reordered to improve organization and developer experience. Buffers are placed throughout the state to allow for future upgradability without the need to append new state at the end of the AppStorage
struct.
The current reentrancy system does not support farm
and farm
-like functions (such as advancedFarm
and tractor
), as the farm
function is used within Beanstalk to call multiple functions in one transaction. This allows Farm calls to be called within other Farm calls, which may introduce additional security risks.
We propose a reentrancy redesign that now supports farm
and farm
-like calls. A new modifier nonReentrantFarm
is added that allows for the function to call any other function, other than other functions that have the nonReentrantFarm
modifier.
We propose to increase the precision of Stalk by 1e6 (for a total of 16 decimals) and update various functions that calculate Stalk to account for the new precision.
We propose a new event that is emitted when transferToken
is called that explicitly includes the sender and recipient addresses:
event TokenTransferred(
address indexed token,
address indexed sender,
address indexed recipient,
uint256 amount,
From fromMode,
To toMode
);
We propose to migrate Beanstalk and its state from Ethereum L1 to Arbitrum.
See the Effective section for full process. Note that BEAN:3CRV liquidity is proposed to be migrated to a BEAN:USDC Well on Arbitrum.
As part of the migration process:
Circulating Beans at the time of the Reseed need to be manually migrated by calling migrateL2Beans
on L1, which burns the Beans on L1 and issues them on the L2.
Beanstalk assets (Deposits, Plots, Beanstalk-related Farm balances, and Fertilizer) belonging to smart contract accounts cannot be automatically migrated, given that Beanstalk cannot assume an owner of a smart contract is able to gain ownership of the same address on L2. Smart contract owners will need to perform a 2 step migration process in order to claim their assets:
approveL2Receiver
; andissueDeposits
, issuePlots
, issueInternalBalances
, and issueFertilizer
with the list of assets and a merkle proof verifying the validity of the list. Smart contract owners can migrate their Beanstalk assets to an EOA prior to the deployment of this BIP if they'd like they assets to be automatically migrated.
The following code is updated to support L2 deployments:
The gm
incentive is generalized to support L2 deployments by changing the incentive to be based on the time elapsed from the start of the hour. The incentive starts at 1 Bean and compounds 1.0201% every additional 2 seconds that elapse past the first timestamp in which gm
could have been called, for 300 seconds.
We propose to whitelist the following Wells with Upgradable Well Implementations (owned by Beanstalk) on Arbitrum:
Well | Well Function | Optimal LP BDV Distribution | Initial Gauge Points | Liquidity Weight | Oracle Implementation |
---|---|---|---|---|---|
BEAN:USDC | Stable 2 | 12% | 1000 | 100% | Chainlink (USDC/USD) |
BEAN:USDT | Stable 2 | 12% | 1000 | 100% | Chainlink (USDC/USD) |
BEAN:WBTC | Constant Product 2 | 20% | 1000 | 100% | Chainlink (WBTC/USD) |
BEAN:wstETH | Constant Product 2 | 26% | 0 | 100% | Chainlink (wstETH/ETH * ETH/USD) |
BEAN:WETH | Constant Product 2 | 16% | 1000 | 100% | Chainlink (WETH/USD) |
BEAN:weETH | Constant Product 2 | 14% | 1000 | 100% | Chainlink (weETH/WETH * WETH/USD) |
We propose to setup Hypernative on Arbitrum with the same configuration proposed in BIP-46.
We propose to update the Immunefi Bug Bounty Program to reflect the changes proposed in this BIP, notably adding the Stable 2 Well Function and Tractor Junctions as in scope and adding following Impacts as in scope (the updated program can be read here):
We propose to update the Beanstalk DAO Disclosures to include risks associated with Hypernative, Arbitrum and the new set of whitelisted assets. The updated Beanstalk DAO Disclosures can be read here.
Calling farm
within other farm
-like functions (including advancedFarm
and tractor
) is disabled in the interest of security with minimal to no loss in composability.
Given that packing is no longer necessary for saving gas due to the L2 migration, many variables in the Beanstalk contracts are casted up to int256
or uint256
to prevent unnecessary overflows.
Removing dead code reduces the surface area of potential vulnerabilities in Beanstalk.
Unripe Converts cannot be supported by pipelineConvert
because the underlying tokens are not liquid. For this reason, the existing convert
function that supports Unripe Converts is left in the ConvertFacet.
Pipeline Converts are limited to usage of Pipeline (i.e. pipeCalls
) rather than farm
calls for security reasons (with regard to reentrancy attacks).
In LibWhitelist
, Wells are flagged as Floodable (isSoppable
) based on whether or not Beanstalk should sell Beans in the Well during Flood conditions. This functionality is added in the event that future whitelisted Wells should not be Flooded in.
Within a given Season, if a Shipment gets paid off, the remaining Bean mints are allocated equally to all remaining Shipments until the following Season. In this way, there are not circular dependencies for each Plan to know about other Plans. Doing so with enough Shipments would eventually exceed the gas limit.
Externalizing the Shipment functionality allows the Bean mint distribution to be changed without a diamond cut.
All write functions functions in Beanstalk use LibTractor.getUser
to get either msg.sender
or the Publisher of the executing Blueprint. From a developer experience perspective, this is preferable to having a Tractor-specific version of every write function.
Most DeFi protocols use Solidity v0.8.0 or higher. Upgrading Solidity versions allows the Beanstalk development community to take advantage of tooling that is developed with v0.8.0^ in mind. For example, using Foundry with v0.7.6 requires a number of workarounds in order to properly use it. While there are more recent versions of Solidity, Beanstalk should strike a balance between using a battle tested compiler and the latest version. For reference, Basin is developed in v0.8.20.
Removing friction associated with whitelisting new assets and modifying existing whitelisted assets allows the DAO to upgrade the whitelist more quickly and with fewer security risks.
Using an if-else ladder in LibDibbler
to approximate the Temperature during the Morning is necessary due to the infeasibility of calculating logarithms on-chain.
The if-else ladder is limited to updating the Temperature every 12 seconds due to the contract size limit on Ethereum. For this reason, the Temperature updates every 48 blocks on Arbitrum during the Morning Auction.
Getting user balances requires either (1) thousands of calls to RPC providers each time the Beanstalk UI loads (which often gets rate limited), or (2) reliance on infrastructure like the subgraphs. The migration to a L2 makes it possible to update the storage architecture to support getter functions for user balances.
The difficulty of organizing storage data in Ethereum Diamonds can lead to security risks. From a development perspective, the L2 Migration is a great opportunity to address this issue.
Changing facets comes with additional security risks and migrating constants to state eliminates these risks. The migration to a L2 makes this migration more feasible.
Removing the SiloFacet and waiting for all Deposits to Germinate (assuming there are Germinating Deposits at the time of BIP passage) before executing the migration simplifies the migration of Deposits.
Given that Beanstalk does not have control of Beans outside of the Beanstalk contract, Circulating Beans at the time of the Reseed need to be manually migrated from L1 to L2.
Beanstalk assets in smart contract accounts cannot be automatically migrated given that Beanstalk cannot assume an owner of a smart contract is able to gain ownership of the same address on L2.
The diamond cut initialization scripts that migrate Beanstalk state are generalized to be executed across multiple transactions given that migration process will exceed the gas limit.
The remaining facets on L1 allow the continued support of Farm Balances on L1 Beanstalk. The L1TokenFacet must be updated to disallow transferring Beanstalk-related assets (which are migrated to L2) out of L1 Beanstalk.
Deploying the Wells with an Upgradable Well Implementation (owned by Beanstalk) allows the BCM to fix bugs in the corresponding Wells without requiring a Silo migration from the vulnerable Well to a new one.
Ensuring that certain invariants are not violated as a result of transaction execution substantially increases the security of Beanstalk and has the potential to save the DAO a significant number of Beans from being spent on bug reports.
Supporting LP → LP Converts significantly increases the efficacy of the Seed Gauge System with respect to achieving the optimal distribution of Bean liquidity.
Using the capped reserves in Multi Flow to measure Convert capacity allows Beanstalk to use the least stale data possible while preserving manipulation resistance.
Updating the existing convert
function is necessary to penalize Farmers for Converting in a direction that causes the cumulative deltaB to move away from peg.
Generalizing Flood the occur in multiple Wells at once is an essential peg maintenance tool for Beanstalk.
Capping the number of Pods that become Harvestable upon Flood to 0.1% of the Bean supply is a useful security measure given that it does not seem necessary to make all Pods Harvestable.
Decreasing friction for Farmers to automate the execution of their transactions improves the efficiency of Beanstalk.
Generalizing the whitelisting process substantially reduces the amount of code needed to be written to whitelist new assets, change oracles, change Gauge Point functions, etc.
Decreasing the rate at which the Temperature increases during the Morning Auction should decrease the number of Pods issued by Beanstalk during times of high demand for Soil.
A Gauge Point function that factors in the distance between the current LP BDV distribution and the optimal may be more effective at issuing the proper amount of Grown Stalk to LP Depositors.
Changing the Bean to Max LP Ratio to its minimum value before a Flood reflects that Beanstalk would prefer that Farmers first Convert down to add liquidity first before it mints and sells Beans directly on the market.
Arbitrum is the largest Ethereum L2 by market cap and TVL. Migrating to a L2 substantially decreases the costs of interacting with Beanstalk.
BEAN:3CRV is migrated to BEAN:USDC given that there is no 3CRV on Arbitrum.
A wider variety of options for Bean liquidity providers to receive Stalk and Seed rewards increases utility for Silo Depositors.
Whitelisting BEAN:USDC and BEAN:USDT gives Depositors the opportunity to earn Stalk and Seeds while being exposed to less volatile assets. The relatively low optimal LP BDV distribution of 12% for both BEAN:USDC and BEAN:USDT reflects the centralization risks of the two stablecoins. Using the Stable 2 Well Function in these Wells allows for better execution prices for traders around peg.
Setting the initial Gauge Points to 0 (the minimum value) for BEANwstETH and 1000 (the maximum value) for all other whitelisted assets reflects that nearly all Bean liquidity is already in the BEANwstETH Well due to the Unripe liquidity. Given this, Beanstalk should immediately start incentivizing holding the other whitelisted LP tokens.
Whitelisting BEAN:WBTC gives Depositors the opportunity to earn Stalk and Seeds while holding BTC exposure. The relatively low optimal LP BDV distribution of 20% reflects the centralization risks of WBTC.
weETH has the largest TVL of any liquid staking derivative on Arbitrum. Basin does not have a Well Implementation that tracks rebasing tokens—thus, Basin (and thus, Beanstalk) must use weETH (i.e., the wrapped, non-rebasing version of eETH).
The init
function on the ReseedL2Migration contract is called: 0xE35c0397dBB43EB7E2cb28a182d857a3A42eFaDB
All remaining facets and functions on L1 Beanstalk can be found in the Appendix section.
The following facets are removed from Beanstalk (i.e., not added to L2 Beanstalk):
FundraiserFacet
LegacyClaimWithdrawalFacet
CurveFacet
MigrationFacet
All facets and functions added to L2 Beanstalk can be found in the Appendix section.
During the L2 migration, Beans are minted on Arbitrum corresponding to the amount in L1 Beanstalk (i.e., Beans underlying Bean Deposits, Beans underlying Deposited LP tokens, Ripe Beans, Farm Balances and Beans in Pod Orders).
After the conclusion of the L2 migration, anytime a Farmer migrates L1 Circulating Beans, L2 Beans will be minted. Similarly, any time a smart contract account owner on L1 migrates their assets, L2 Beans may be minted depending on which assets are migrated.
The commit hash of this BIP is faa0ec60a455b0afdd20ad86f28f41cbc52c2e2d.
An audit competition of this upgrade was held via Codehawks using commit hash 4e0ad0b964f74a1b4880114f4dd5b339bc69cd3e. The final report can be read here.
Audit remediations were committed and documented in PRs #970, #1046, #1047, #1054, #1056 and #1076. All changes were reviewed by 2 top Codehawks auditors.
The Upgradable Well Implementation and Stable 2 Well Function were audited by Code4rena—final report here. The final report for the fix review is here.
1e6
in LibGauge.issueGrownStalkPerBdv
;LibPipelineConvert
for Wells that do not have any reserves;LibEvaluate.calcLpToSupplyRatio
that skips the evaluation of liquidity when the reserves are 0;ReseedGlobal
to emit the ShipmentRouteSet
event; anLibWell.calculateTokenBeanPriceFromReserves
to fail gracefully. All of the following are implemented in PR #146:
MultiFlowPump
to fail gracefully when calcRate
fails;IMultiFlowWellFunction
to implement ratioPrecision(uint256 j, bytes data)
, which returns the precision that MultiFlowPump
should use when calculating the capped reserves;MultiFlowPump
to use ratioPrecision
when calculating ratios[j]
in calcReservesAtRatioSwap
;ConstantProduct2
, ConstantProduct
, and Stable2
to implement ratioPrecision
; andIWellFunction
to implement version
, allowing users to verify Well Functions.After either:
The L1 BCM will:
ReseedL2Migration
initialization contract, which:DiamondCutFacet
, DiamondLoupeFacet
, OwnershipFacet
and PauseFacet
; andL1TokenFacet
and L2MigrationFacet
;In addition, a deployer will:
After which the L2 BCM will:
The following facets show all functions remaining on L1 Beanstalk:
Remaining DiamondCutFacet
address: 0xDFeFF7592915bea8D040499E961E332BD453C249
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
diamondCut |
0x1f931c1c |
None | Write |
Remaining DiamondLoupeFacet
address: 0xB51D5C699B749E0382e257244610039dDB272Da0
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
facetAddress |
0xcdffacc6 |
None | Read | |
facetAddresses |
0x52ef6b2c |
None | Read | |
facetFunctionSelectors |
0xadfca15e |
None | Read | |
facets |
0x7a0ed627 |
None | Read | |
supportsInterface |
0x01ffc9a7 |
None | Read |
Remaining OwnershipFacet
address: 0x5D45283Ff53aabDb93693095039b489Af8b18Cf7
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
claimOwnership |
0x4e71e0c8 |
None | Write | |
owner |
0x8da5cb5b |
None | Read | |
ownerCandidate |
0x5f504a82 |
None | Read | |
transferOwnership |
0xf2fde38b |
None | Write |
Remaining PauseFacet
address: 0xeab4398f62194948cB25F45fEE4C46Fae2e91229
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
pause |
0x8456cb59 |
None | Write | |
unpause |
0x3f4ba83a |
None | Write |
Added L1TokenFacet
address: 0x8F66044a9C95FaE9d38B8Bc30665eE04A2456501
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
approveToken |
0xda3e3397 |
Add | Write | ✓ |
decreaseTokenAllowance |
0x0bc33ce4 |
Add | Write | ✓ |
getAllBalance |
0xfdb28811 |
Add | Read | |
getAllBalances |
0xb6fc38f9 |
Add | Read | |
getBalance |
0xd4fac45d |
Add | Read | |
getBalances |
0x6a385ae9 |
Add | Read | |
getExternalBalance |
0x4667fa3d |
Add | Read | |
getExternalBalances |
0xc3714723 |
Add | Read | |
getInternalBalance |
0x8a65d2e0 |
Add | Read | |
getInternalBalances |
0xa98edb17 |
Add | Read | |
increaseTokenAllowance |
0xb39062e6 |
Add | Write | ✓ |
onERC1155BatchReceived |
0xbc197c81 |
Add | Read | |
onERC1155Received |
0xf23a6e61 |
Add | Read | |
permitToken |
0x7c516e94 |
Add | Write | ✓ |
tokenAllowance |
0x8e8758d8 |
Add | Read | |
tokenPermitDomainSeparator |
0x1f351f6a |
Add | Read | |
tokenPermitNonces |
0x4edcab2d |
Add | Read | |
transferInternalTokenFrom |
0xd3f4ec6f |
Add | Write | ✓ |
transferToken |
0x6204aa43 |
Add | Write | ✓ |
unwrapEth |
0xbd32fac3 |
Add | Write | ✓ |
wrapEth |
0x1c059365 |
Add | Write | ✓ |
Added L2MigrationFacet
address: 0xb7EA01231e518cd22E118165b290f5CC3263F5bB
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
migrateL2Beans |
0xfe5b810f |
Add | Write | ✓ |
approveL2Receiver |
0xcb3fcc04 |
Add | Write | ✓ |
The following facets show all functions added to L2 Beanstalk: 0xD1A0060ba708BC4BCD3DA6C37EFa8deDF015FB70
Notes:
Added DiamondCutFacet
address: 0x7B08f0efC94626D373c99fd39353217a371F90c0
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
diamondCut |
0x1f931c1c |
Add | Write |
Added DiamondLoupeFacet
address: 0x82aF8BC912284F916dBe7208074F3B16ea27BB40
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
facetAddress |
0xcdffacc6 |
Add | Read | |
facetAddresses |
0x52ef6b2c |
Add | Read | |
facetFunctionSelectors |
0xadfca15e |
Add | Read | |
facets |
0x7a0ed627 |
Add | Read | |
supportsInterface |
0x01ffc9a7 |
Add | Read |
Added OwnershipFacet
address: 0x2cb2D140c42b79F602535e2447E7Afa980034464
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
claimOwnership |
0x4e71e0c8 |
Add | Write | |
owner |
0x8da5cb5b |
Add | Read | |
ownerCandidate |
0x5f504a82 |
Add | Read | |
transferOwnership |
0xf2fde38b |
Add | Write |
Added WhitelistFacet
address: 0x7f855852a7191635c845c4183a6335ecb0B7aFAb
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
whitelistTokenWithEncodeType |
N/A |
Remove | Write | |
whitelistTokenWithExternalImplementation |
N/A |
Remove | Write | |
getGaugePointImplementationForToken |
0x738cb80b |
Add (New) | Read | ✓ |
getLiquidityWeightImplementationForToken |
0x8104d586 |
Add (New) | Read | ✓ |
getOracleImplementationForToken |
0x56b7b49c |
Add (New) | Read | ✓ |
updateGaugePointImplementationForToken |
0x4fb907a0 |
Add (New) | Write | ✓ |
updateLiquidityWeightImplementationForToken |
0x88db1a6f |
Add (New) | Write | ✓ |
updateOracleImplementationForToken |
0x874b87b9 |
Add (New) | Write | ✓ |
updateSeedGaugeSettings |
0xa160f06a |
Add (New) | Write | ✓ |
dewhitelistToken |
0x86b40a1b |
Add | Write | |
getSiloTokens |
0xe9522c08 |
Add | Read | |
getWhitelistStatus |
0xd9ba32fc |
Add | Read | |
getWhitelistStatuses |
0x170cf084 |
Add | Read | |
getWhitelistedLpTokens |
0x9d1d2877 |
Add | Read | |
getWhitelistedTokens |
0xe26f7900 |
Add | Read | |
getWhitelistedWellLpTokens |
0x76a7bc84 |
Add | Read | |
updateGaugeForToken |
0x19b8f518 |
Add | Write | ✓ |
updateStalkPerBdvPerSeasonForToken |
0xf18d9ed0 |
Add | Write | |
whitelistToken |
0x4bfd2d75 |
Add | Write | ✓ |
Added UnripeFacet
address: 0x87F1FB2CF1CDC19103739F7cdb0068b203184354
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
pick |
N/A |
Remove | Write | |
picked |
N/A |
Remove | Read | |
addMigratedUnderlying |
0x787cee99 |
Add | Write | |
addUnripeToken |
0xfa345569 |
Add | Write | |
balanceOfPenalizedUnderlying |
0x1acc0a47 |
Add | Read | |
balanceOfUnderlying |
0x1be655e8 |
Add | Read | |
chop |
0x9a516cad |
Add | Write | |
getLockedBeans |
0x087d78b4 |
Add | Read | |
getLockedBeansFromTwaReserves |
0x7caa025f |
Add | Read | |
getLockedBeansUnderlyingUnripeBean |
0xbfe2f3be |
Add | Read | |
getLockedBeansUnderlyingUnripeLP |
0x33f37f27 |
Add | Read | |
getPenalizedUnderlying |
0x6de45df2 |
Add | Read | |
getPenalty |
0x014a8a49 |
Add | Read | |
getPercentPenalty |
0xbb7de478 |
Add | Read | |
getRecapFundedPercent |
0x43cc4ee0 |
Add | Read | |
getRecapPaidPercent |
0xab434eb7 |
Add | Read | |
getRecapitalized |
0xe68a543a |
Add | Read | |
getTotalUnderlying |
0xadef4533 |
Add | Read | |
getUnderlying |
0x9f06b3fa |
Add | Read | |
getUnderlyingPerUnripeToken |
0xb8a04d1b |
Add | Read | |
getUnderlyingToken |
0x691bcc88 |
Add | Read | |
isUnripe |
0xfc6a19df |
Add | Read | |
switchUnderlyingToken |
0xa33fa99f |
Add | Write |
Added MetadataFacet
address: 0x5794fDb0cfE2AbFCB3D22103F5d8c6B4C2cCD1d9
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
imageURI |
0xc20b8071 |
Add | Read | |
name |
0x06fdde03 |
Add | Read | |
symbol |
0x95d89b41 |
Add | Read | |
uri |
0x0e89341c |
Add | Read |
Added SeasonFacet
address: 0x40c8688969c91290311314fbB2f10156b43Fbe4B
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getShipmentRoutes |
0xfd497a68 |
Add (New) | Write | ✓ |
setShipmentRoutes |
0xf1e2dfb0 |
Add (New) | Read | ✓ |
gm |
0x64ee4b80 |
Add | Write | |
seasonTime |
0xca7b7d7b |
Add | Read | |
sunrise |
0xfc06d2a6 |
Add | Write |
Added SeasonGettersFacet
address: 0xfe15fe467d06Ce19d20709eAE9E24B3bD8309132
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getBeanEthGaugePointsPerBdv |
N/A |
Remove | Read | |
getSopWell |
N/A |
Remove | Read | |
cumulativeCurrentDeltaB |
0x89a218d2 |
Add (New) | Read | ✓ |
getAbsBeanToMaxLpRatioChangeFromCaseId |
0xe53b479e |
Add (New) | Read | ✓ |
getAbsTemperatureChangeFromCaseId |
0x3cee5dea |
Add (New) | Read | ✓ |
getCaseData |
0x8097f0ca |
Add (New) | Read | ✓ |
getCases |
0x065cb594 |
Add (New) | Read | ✓ |
getChangeFromCaseId |
0x43e0156a |
Add (New) | Read | ✓ |
getDeltaPodDemandLowerBound |
0x57801d87 |
Add (New) | Read | ✓ |
getDeltaPodDemandUpperBound |
0x70fd1b06 |
Add (New) | Read | ✓ |
getEvaluationParameters |
0xda61af62 |
Add (New) | Read | ✓ |
getExcessivePriceThreshold |
0x44fb7cc3 |
Add (New) | Read | ✓ |
getLpToSupplyRatioUpperBound |
0x1eedbfbb |
Add (New) | Read | ✓ |
getLpToSupplyRatioOptimal |
0x1f48a553 |
Add (New) | Read | ✓ |
getLpToSupplyRatioLowerBound |
0x11a8d895 |
Add (New) | Read | ✓ |
getMaxBeanMaxLpGpPerBdvRatio |
0xab843b34 |
Add (New) | Read | ✓ |
getMinBeanMaxLpGpPerBdvRatio |
0xb3c39ce5 |
Add (New) | Read | ✓ |
getPodRateLowerBound |
0xfd6d1483 |
Add (New) | Read | ✓ |
getPodRateOptimal |
0xdd9330d2 |
Add (New) | Read | ✓ |
getPodRateUpperBound |
0x08fa96d3 |
Add (New) | Read | ✓ |
getRelBeanToMaxLpRatioChangeFromCaseId |
0x35870a7a |
Add (New) | Read | ✓ |
getRelTemperatureChangeFromCaseId |
0x4d65f762 |
Add (New) | Read | ✓ |
getSeasonStruct |
0x738ad142 |
Add (New) | Read | ✓ |
getSeasonTimestamp |
0xf07f0760 |
Add (New) | Read | ✓ |
getTargetSeasonsToCatchUp |
0xcb677411 |
Add (New) | Read | ✓ |
getWellsByDeltaB |
0xbf170533 |
Add (New) | Read | ✓ |
poolCurrentDeltaB |
0x8223eac8 |
Add (New) | Read | ✓ |
abovePeg |
0x2a27c499 |
Add | Read | |
getLargestLiqWell |
0xd1943f7f |
Add | Read | |
getTotalUsdLiquidity |
0xbbf459a7 |
Add | Read | |
getTotalWeightedUsdLiquidity |
0xf788b47c |
Add | Read | |
getTwaLiquidityForWell |
0xa13a3742 |
Add | Read | |
getWeightedTwaLiquidityForWell |
0x93c9e531 |
Add | Read | |
paused |
0x5c975abb |
Add | Read | |
plentyPerRoot |
0x3fccd20c |
Add | Read | |
poolDeltaB |
0x471bcdbe |
Add | Read | |
rain |
0x43def26e |
Add | Read | |
season |
0xc50b0fb0 |
Add | Read | |
sunriseBlock |
0x3b2ecb70 |
Add | Read | |
time |
0x16ada547 |
Add | Read | |
totalDeltaB |
0x06c499d8 |
Add | Read | |
weather |
0x686b6159 |
Add | Read | |
wellOracleSnapshot |
0x597490c0 |
Add | Read |
Added GaugeGettersFacet
address: 0x2e804f24134baCF12036757D1dcdcCbBBb3e2f31
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getLargestGpPerBDV |
0x6bbf3305 |
Add (New) | Read | ✓ |
calcGaugePointsWithParams |
0x7046c9a6 |
Add | Read | |
getAverageGrownStalkPerBdv |
0x7ba6cbf8 |
Add | Read | |
getAverageGrownStalkPerBdvPerSeason |
0xeb0e1215 |
Add | Read | |
getBeanGaugePointsPerBdv |
0x69aa7e02 |
Add | Read | |
getBeanToMaxLpGpPerBdvRatio |
0xcc88d4f9 |
Add | Read | |
getBeanToMaxLpGpPerBdvRatioScaled |
0x673c75f0 |
Add | Read | |
getDeltaPodDemand |
0x64b3496b |
Add | Read | |
getGaugePoints |
0x93523425 |
Add | Read | |
getGaugePointsPerBdvForToken |
0x64887852 |
Add | Read | |
getGaugePointsPerBdvForWell |
0xb2b0556d |
Add | Read | |
getGaugePointsWithParams |
0x141933bf |
Add | Read | |
getGrownStalkIssuedPerGp |
0xf98da2de |
Add | Read | |
getGrownStalkIssuedPerSeason |
0x383f170f |
Add | Read | |
getLiquidityToSupplyRatio |
0xcb2d0a3c |
Add | Read | |
getPodRate |
0x11242145 |
Add | Read | |
getSeedGauge |
0x6af8e5a4 |
Add | Read | |
getTotalBdv |
0x50539159 |
Add | Read |
Added PauseFacet
address: 0x926CFCe66aa8A0CC29470dA28095D88CF24ABE16
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
pause |
0x8456cb59 |
Add | Write | |
unpause |
0x3f4ba83a |
Add | Write |
Added MarketplaceFacet
address: 0xcA03AbaBA37566d89B707878495D9EB8Ea48C3c5
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
cancelPodOrderV2 |
N/A |
Remove | Write | |
createPodListingV2 |
N/A |
Remove | Write | |
createPodOrderV2 |
N/A |
Remove | Write | |
fillPodListingV2 |
N/A |
Remove | Write | |
fillPodOrderV2 |
N/A |
Remove | Write | |
getAmountBeansToFillOrderV2 |
N/A |
Remove | Read | |
getAmountPodsFromFillListingV2 |
N/A |
Remove | Read | |
podListing |
N/A |
Remove | Read | |
podOrder |
N/A |
Remove | Read | |
podOrderById |
N/A |
Remove | Read | |
podOrderV2 |
N/A |
Remove | Read | |
getOrderId |
0x631076dd |
Add (New) | Read | ✓ |
getPodListing |
0x98c02432 |
Add (New) | Read | ✓ |
getPodOrder |
0x674a3e67 |
Add (New) | Read | ✓ |
transferPlots |
0x31ed3796 |
Add (New) | Write | ✓ |
allowancePods |
0xb151226a |
Add | Read | |
approvePods |
0x0711f012 |
Add | Write | |
cancelPodListing |
0x8d398973 |
Add | Write | |
cancelPodOrder |
0x9ed2801b |
Add | Write | |
createPodListing |
0x65865af6 |
Add | Write | |
createPodOrder |
0x37b4d2ec |
Add | Write | |
fillPodListing |
0xf7f228a2 |
Add | Write | |
fillPodOrder |
0xed8c792f |
Add | Write | |
transferPlot |
0xceb39673 |
Add | Write |
Added FieldFacet
address: 0xa9085918d5632EA12BA91709F819B800fa8B3726
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
yield |
N/A |
Remove | Read | |
activeField |
0xd1eba544 |
Add (New) | Read | ✓ |
addField |
0xb94e871c |
Add (New) | Write | ✓ |
balanceOfPods |
0x9a337c1d |
Add (New) | Read | ✓ |
fieldCount |
0xbb485bbd |
Add (New) | Read | ✓ |
getPlotIndexesFromAccount |
0x253fcfb5 |
Add (New) | Read | ✓ |
getPlotsFromAccount |
0x91b24284 |
Add (New) | Read | ✓ |
isHarvesting |
0x4bea67c4 |
Add (New) | Read | ✓ |
setActiveField |
0x057c571b |
Add (New) | Write | ✓ |
totalHarvestableForActiveField |
0x237dbac5 |
Add (New) | Read | ✓ |
harvest |
0xe9bbb033 |
Add | Write | ✓ |
harvestableIndex |
0xb511654d |
Add | Read | ✓ |
maxTemperature |
0x7907091f |
Add | Read | |
plot |
0x9ee7ea12 |
Add | Read | |
podIndex |
0xccda40b9 |
Add | Read | ✓ |
remainingPods |
0x56ba3e24 |
Add | Read | |
sow |
0x32ab68ce |
Add | Write | |
sowWithMin |
0x553030d0 |
Add | Write | |
temperature |
0xadccea12 |
Add | Read | |
totalHarvestable |
0x2e76f597 |
Add | Read | ✓ |
totalHarvested |
0x352525a6 |
Add | Read | ✓ |
totalPods |
0xf1e0a211 |
Add | Read | ✓ |
totalSoil |
0x3285008a |
Add | Read | |
totalUnharvestable |
0xf29ffe94 |
Add | Read | ✓ |
Added FertilizerFacet
address: 0x7B2BDA06CE2cD8287e169b241d68d1Bb6568e342
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
leftoverBeans |
0x8bb3aba8 |
Add (New) | Read | ✓ |
rinsableSprouts |
0x5d7db3b6 |
Add (New) | Read | ✓ |
rinsedSprouts |
0x7562d880 |
Add (New) | Read | ✓ |
_getMintFertilizerOut |
0x94daa221 |
Add | Read | |
balanceOfBatchFertilizer |
0x304ec65d |
Add | Read | |
balanceOfFertilized |
0xb6f42085 |
Add | Read | |
balanceOfFertilizer |
0x1799b3b2 |
Add | Read | |
balanceOfUnfertilized |
0x1edb6be1 |
Add | Read | |
beansPerFertilizer |
0x9bb4e35a |
Add | Read | |
beginBarnRaiseMigration |
0xe3d4e44c |
Add | Write | |
claimFertilized |
0x83e08888 |
Add | Write | |
getActiveFertilizer |
0xdc6ba285 |
Add | Read | |
getBarnRaiseToken |
0xf255da60 |
Add | Read | |
getBarnRaiseWell |
0x93a39bea |
Add | Read | |
getCurrentHumidity |
0x39448802 |
Add | Read | |
getEndBpf |
0xc85951a1 |
Add | Read | |
getFertilizer |
0x9c45a1d5 |
Add | Read | |
getFertilizers |
0x34af5416 |
Add | Read | |
getFirst |
0x1e223143 |
Add | Read | |
getHumidity |
0x29130a66 |
Add | Read | |
getLast |
0x4d622831 |
Add | Read | |
getMintFertilizerOut |
0x69744dd0 |
Add | Read | |
getNext |
0xf4a057e2 |
Add | Read | |
getTotalRecapDollarsNeeded |
0x12cb5eab |
Add | Read | |
isFertilizing |
0x6ae1c014 |
Add | Read | |
mintFertilizer |
0x363591d0 |
Add | Write | |
payFertilizer |
0xd47aee59 |
Add | Write | |
remainingRecapitalization |
0x4a16607c |
Add | Read | |
totalFertilizedBeans |
0x4f9a9678 |
Add | Read | |
totalFertilizerBeans |
0xf9c4ebde |
Add | Read | |
totalUnfertilizedBeans |
0xa3ef48c9 |
Add | Read |
Added FarmFacet
address: 0x24103B8141F97D9D8794fE2EE0eD96F577EeC05F
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
advancedFarm |
0x36bfafbd |
Add | Write | |
farm |
0x300dd6cf |
Add | Write |
Added SiloFacet
address: 0x5678345D444918a38ad9dC7CA1b0C208E1927094
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
deposit |
0xf19ed6be |
Add | Write | |
safeBatchTransferFrom |
0x2eb2c2d6 |
Add | Write | |
safeTransferFrom |
0xf242432a |
Add | Write | |
transferDeposit |
0x081d77ba |
Add | Write | |
transferDeposits |
0xc56411f6 |
Add | Write | |
withdrawDeposit |
0xe348f82b |
Add | Write | |
withdrawDeposits |
0x27e047f1 |
Add | Write |
Added SiloGettersFacet
address: 0xb4F9d59f787642F64c73346A747Bf1984A52D4Ea
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getLegacySeedsPerToken |
N/A |
Remove | Read | |
migrationNeeded |
N/A |
Remove | Read | |
seasonToStem |
N/A |
Remove | Read | |
balanceOfGrownStalkMultiple |
0xcb65f1b1 |
Add (New) | Read | ✓ |
balanceOfPlantableSeeds |
0x80c9084b |
Add (New) | Read | ✓ |
bdvs |
0xd31e4d66 |
Add (New) | Read | ✓ |
calculateStemForTokenFromGrownStalk |
0x0b6413b0 |
Add (New) | Read | ✓ |
getAddressAndStem |
0x805a343f |
Add (New) | Read | ✓ |
getBeanIndex |
0xb592d450 |
Add (New) | Read | ✓ |
getBeanstalkTokens |
0x3c22a23c |
Add (New) | Read | ✓ |
getDepositsForAccount (no token parameter) |
0x823ccbe9 |
Add (New) | Read | ✓ |
getDepositsForAccount (accepts tokens[] ) |
0xe73c165b |
Add (New) | Read | ✓ |
getIndexForDepositId |
0x55d0807e |
Add (New) | Read | ✓ |
getMowStatus (accepts tokens[] ) |
0x047c92cf |
Add (New) | Read | ✓ |
getNonBeanTokenAndIndexFromWell |
0xf6225118 |
Add (New) | Read | ✓ |
getStemTips |
0x9cf67d70 |
Add (New) | Read | ✓ |
getTokenDepositIdsForAccount |
0x54369b5b |
Add (New) | Read | ✓ |
getTokenDepositsForAccount |
0xe49b77f5 |
Add (New) | Read | ✓ |
getTotalSiloDeposited |
0xb13d3024 |
Add (New) | Read | ✓ |
getTotalSiloDepositedBdv |
0xbd637860 |
Add (New) | Read | ✓ |
stalkEarnedPerSeason |
0xedd2d167 |
Add (New) | Read | ✓ |
balanceOf |
0x00fdd58e |
Add | Read | |
balanceOfBatch |
0x4e1273f4 |
Add | Read | |
balanceOfDepositedBDV |
0xbc8514cf |
Add | Read | |
balanceOfEarnedBeans |
0x3e465a2e |
Add | Read | |
balanceOfEarnedStalk |
0x341b94d5 |
Add | Read | |
balanceOfFinishedGerminatingStalkAndRoots |
0xc063989e |
Add | Read | |
balanceOfGerminatingStalk |
0x838082b5 |
Add | Read | |
balanceOfGrownStalk |
0x8915ba24 |
Add | Read | |
balanceOfPlenty |
0xb02e7162 |
Add | Read | ✓ |
balanceOfRainRoots |
0x69fbad94 |
Add | Read | |
balanceOfRoots |
0xba39dc02 |
Add | Read | |
balanceOfSop |
0xa7bf680f |
Add | Read | ✓ |
balanceOfStalk |
0x8eeae310 |
Add | Read | |
balanceOfYoungAndMatureGerminatingStalk |
0x0fb01e05 |
Add | Read | |
bdv |
0x8c1e6f22 |
Add | Read | ✓ |
getDeposit |
0x61449212 |
Add | Read | |
getDepositId |
0x98f2b8ad |
Add | Read | |
getEvenGerminating |
0x1ca5f625 |
Add | Read | |
getGerminatingRootsForSeason |
0x96e7f21e |
Add | Read | |
getGerminatingStalkAndRootsForSeason |
0x4118140a |
Add | Read | |
getGerminatingStalkForSeason |
0x9256dccd |
Add | Read | |
getGerminatingStem |
0xa953f06d |
Add | Read | |
getGerminatingStems |
0xe5b17f2a |
Add | Read | |
getGerminatingTotalDeposited |
0xc25a156c |
Add | Read | |
getGerminatingTotalDepositedBdv |
0x9b3ec513 |
Add | Read | |
getLastMowedStem |
0x7fc06e12 |
Add | Read | |
getMowStatus (accepts token ) |
0xdc25a650 |
Add | Read | |
getOddGerminating |
0x85167e51 |
Add | Read | |
getTotalDeposited |
0x0c9c31bd |
Add | Read | |
getTotalDepositedBDV |
0x9d6a924e |
Add | Read | |
getTotalGerminatingAmount |
0xb45ef2eb |
Add | Read | |
getTotalGerminatingBdv |
0x9dcf67f0 |
Add | Read | |
getTotalGerminatingStalk |
0x7d4a51cb |
Add | Read | |
getYoungAndMatureGerminatingTotalStalk |
0x5a8e63e3 |
Add | Read | |
grownStalkForDeposit |
0x3a1b0606 |
Add | Read | |
lastSeasonOfPlenty |
0xbe6547d2 |
Add | Read | |
lastUpdate |
0xcb03fb1e |
Add | Read | |
stemStartSeason |
0xbc771977 |
Add | Read | |
stemTipForToken |
0xabed2d41 |
Add | Read | |
tokenSettings |
0xe923e8d4 |
Add | Read | |
totalEarnedBeans |
0xfd9de166 |
Add | Read | |
totalRainRoots |
0xaea72f96 |
Add | Read | |
totalRoots |
0x46544166 |
Add | Read | |
totalStalk |
0x7b52fadf |
Add | Read |
Added EnrootFacet
address: 0x3AF703FACA14A0201E5aa98D91cA1Dbb10a8f110
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
balanceOfRevitalizedStalk |
0xe43b44ee |
Add (New) | Read | ✓ |
enrootDeposit |
0x0b58f073 |
Add | Write | |
enrootDeposits |
0x88fcd169 |
Add | Write |
Added TokenFacet
address: 0x915D09eC953520AB46c3AC76B7153e354DEa84CD
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
approveToken |
0xda3e3397 |
Add | Write | |
decreaseTokenAllowance |
0x0bc33ce4 |
Add | Write | |
getAllBalance |
0xfdb28811 |
Add | Read | |
getAllBalances |
0xb6fc38f9 |
Add | Read | |
getBalance |
0xd4fac45d |
Add | Read | |
getBalances |
0x6a385ae9 |
Add | Read | |
getExternalBalance |
0x4667fa3d |
Add | Read | |
getExternalBalances |
0xc3714723 |
Add | Read | |
getInternalBalance |
0x8a65d2e0 |
Add | Read | |
getInternalBalances |
0xa98edb17 |
Add | Read | |
increaseTokenAllowance |
0xb39062e6 |
Add | Write | |
onERC1155BatchReceived |
0xbc197c81 |
Add | Read | |
onERC1155Received |
0xf23a6e61 |
Add | Read | |
permitToken |
0x7c516e94 |
Add | Write | |
tokenAllowance |
0x8e8758d8 |
Add | Read | |
tokenPermitDomainSeparator |
0x1f351f6a |
Add | Read | |
tokenPermitNonces |
0x4edcab2d |
Add | Read | |
transferInternalTokenFrom |
0xd3f4ec6f |
Add | Write | |
transferToken |
0x6204aa43 |
Add | Write | |
unwrapEth |
0xbd32fac3 |
Add | Write | |
wrapEth |
0x1c059365 |
Add | Write |
Added DepotFacet
address: 0x107F33211935bb72B721675c7e95a2d4cC0c96cc
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
advancedPipe |
0xb452c7ae |
Add | Write | |
etherPipe |
0x6e47d07b |
Add | Write | |
multiPipe |
0xcabec62b |
Add | Write | |
pipe |
0x08e1a0ab |
Add | Write | |
readPipe |
0xdd756c4f |
Add | Read |
Added TokenSupportFacet
address: 0x17AC9d59f4637a16F47C8a77A1c4EE7c7a159A95
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
batchTransferERC1155 |
0xa9412a59 |
Add | Write | |
permitERC20 |
0xb442b398 |
Add | Write | |
permitERC721 |
0x4935ed43 |
Add | Write | |
transferERC1155 |
0x0a7e880c |
Add | Write | |
transferERC721 |
0x1aca6376 |
Add | Write |
Added ConvertFacet
address: 0x242A339C73d3b373a91C157865B36a1480ec3b09
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
convert |
0xb362a6e8 |
Add | Write | ✓ |
Added ConvertGettersFacet
address: 0x999A04B54a386b1C68A9Be926AF0200F2C49A47A
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
calculateDeltaBFromReserves |
0xd052f0d5 |
Add (New) | Read | ✓ |
calculateStalkPenalty |
0xb325d2ef |
Add (New) | Read | ✓ |
cappedReservesDeltaB |
0x6842f2b3 |
Add (New) | Read | ✓ |
getOverallConvertCapacity |
0xf66d5589 |
Add (New) | Read | ✓ |
getWellConvertCapacity |
0xb905065b |
Add (New) | Read | ✓ |
overallCappedDeltaB |
0x3e8b56f1 |
Add (New) | Read | ✓ |
overallCurrentDeltaB |
0xb267ea07 |
Add (New) | Read | ✓ |
scaledDeltaB |
0x24568abf |
Add (New) | Read | ✓ |
getAmountOut |
0x4aa06652 |
Add | Read | |
getMaxAmountIn |
0x24dd285c |
Add | Read |
Added ApprovalFacet
address: 0x5579358403eD126dB6ed6A213B5129696161Bad6
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
approveDeposit |
0x1302afc2 |
Add | Write | |
decreaseDepositAllowance |
0xd9ee1269 |
Add | Write | |
depositAllowance |
0x2a6a8ef5 |
Add | Read | |
depositPermitDomainSeparator |
0x8966e0ff |
Add | Read | |
depositPermitNonces |
0x843bc425 |
Add | Read | |
increaseDepositAllowance |
0x5793e485 |
Add | Write | |
isApprovedForAll |
0xe985e9c5 |
Add | Read | |
permitDeposit |
0x120b5702 |
Add | Write | |
permitDeposits |
0xd5770dc7 |
Add | Write | |
setApprovalForAll |
0xa22cb465 |
Add | Write |
Added BDVFacet
address: 0x4da6AAed2a2C3605f7c098037014003697Cb0426
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
curveToBDV |
N/A |
Remove | Read | |
beanToBDV |
0x5a049a47 |
Add | Read | |
unripeBeanToBDV |
0xc8cda2a0 |
Add | Read | |
unripeLPToBDV |
0xb0c22bb1 |
Add | Read | |
wellBdv |
0xc84c7727 |
Add | Read |
Added GaugePointFacet
address: 0xbcF3bA03bf792F9f8B5dbd460eAa446529020778
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getExtremelyFarAbove |
0xafa1704e |
Add (New) | Read | ✓ |
getExtremelyFarBelow |
0xc26072fe |
Add (New) | Read | ✓ |
getRelativelyFarAbove |
0x3ad6d656 |
Add (New) | Read | ✓ |
getRelativelyFarBelow |
0x925150c9 |
Add (New) | Read | ✓ |
defaultGaugePointFunction |
0xe4b8d822 |
Add | Read | ✓ |
Added LiquidityWeightFacet
address: 0x19AC2dc9A0BFda04Dde8EA7437945872DB95B13E
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
noWeight |
0x225f8659 |
Add (New) | Read | ✓ |
maxWeight |
0x2c5fa218 |
Add | Read |
Added TractorFacet
address: 0xcb84F1a368f303798DB6d9cE7B4084Aaf316479b
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
cancelBlueprint |
0x563957a8 |
Add (New) | Write | ✓ |
getBlueprintHash |
0x5723cc60 |
Add (New) | Read | ✓ |
getBlueprintNonce |
0x5ebc32e6 |
Add (New) | Read | ✓ |
getCounter |
0x5993514b |
Add (New) | Read | ✓ |
getPublisherCounter |
0x91a45154 |
Add (New) | Read | ✓ |
getTractorVersion |
0x454972dd |
Add (New) | Read | ✓ |
publishRequisition |
0xcc8a429d |
Add (New) | Write | ✓ |
tractor |
0xfe414fc8 |
Add (New) | Write | ✓ |
updatePublisherCounter |
0xdf8d26bb |
Add (New) | Write | ✓ |
updateTractorVersion |
0x04cb49dc |
Add (New) | Write | ✓ |
Added L1ReceiverFacet
address: 0x8F2bB164dF87183af23E72d49572052e27651A57
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
approveReceiver |
0x72138e1a |
Add (New) | Write | ✓ |
getDepositMerkleRoot |
0x922c0257 |
Add (New) | Read | ✓ |
getFertilizerMerkleRoot |
0x2c2eeb72 |
Add (New) | Read | ✓ |
getInternalBalanceMerkleRoot |
0x6f5a42e7 |
Add (New) | Read | ✓ |
getPlotMerkleRoot |
0xc4b35a45 |
Add (New) | Read | ✓ |
getReceiver |
0x73139315 |
Add (New) | Read | ✓ |
issueDeposits |
0x6e80f305 |
Add (New) | Write | ✓ |
issueFertilizer |
0xe080f84d |
Add (New) | Write | ✓ |
issueInternalBalances |
0xaf0dc18a |
Add (New) | Write | ✓ |
issuePlots |
0xba2332df |
Add (New) | Write | ✓ |
receiveL1Beans |
0x057835e7 |
Add (New) | Write | ✓ |
verifyDepositMerkleProof |
0xce2dec6c |
Add (New) | Read | ✓ |
verifyFertilizerMerkleProof |
0xbd1f26a6 |
Add (New) | Read | ✓ |
verifyInternalBalanceMerkleProof |
0xe1d8a20f |
Add (New) | Read | ✓ |
verifyPlotMerkleProof |
0x00892531 |
Add (New) | Read | ✓ |
Added PipelineConvertFacet
address: 0x6B1B5E5cef71f0cC65d32B67D8794F58faD491a3
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
pipelineConvert |
0xbb25c1c2 |
Add (New) | Write | ✓ |
Added ClaimFacet
address: 0x76eF6b03775A4cDE7666C96f3Ca21feb736afeBC
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
claimAllPlenty |
0xfa2e2617 |
Add (New) | Write | ✓ |
claimPlenty |
0x0d509999 |
Add | Write | ✓ |
mow |
0x150d5173 |
Add | Write | |
mowMultiple |
0x7d44f5bb |
Add | Write | |
plant |
0x779b3c5c |
Add | Write |
Added OracleFacet
address: 0x48Fa359664820A12ad6Ae8769ccB4365053da580
Name | Selector | Action | Type | New Functionality |
---|---|---|---|---|
getMillionUsdPrice |
0xd48274a0 |
Add (New) | Read | ✓ |
getRatiosAndBeanIndex |
0x052c3990 |
Add (New) | Read | ✓ |
getTokenUsdPrice |
0x00593bcf |
Add (New) | Read | ✓ |
getTokenUsdPriceFromExternal |
0x054ce3bd |
Add (New) | Read | ✓ |
getTokenUsdTwap |
0xc4c5140f |
Add (New) | Read | ✓ |
getUsdTokenPrice |
0x8b7750c2 |
Add (New) | Read | ✓ |
getUsdTokenPriceFromExternal |
0x399ff0b5 |
Add (New) | Read | ✓ |
getUsdTokenTwap |
0xdd455fbf |
Add (New) | Read | ✓ |
Name | Change |
---|---|
UpdatedSeedGaugeSettings |
New event |
SeedsBalanceChanged |
Removed |
RemoveWithdrawal |
Removed |
RemoveWithdrawals |
Removed |
UpdateGaugeSettings |
Removed |
FarmerGerminatingStalkBalanceChanged |
Changed parameter names |
UpdatedOptimalPercentDepositedBdvForToken |
New event |
UpdatedOracleImplementationForToken |
New event |
UpdatedGaugePointImplementationForToken |
New event |
UpdatedLiquidityWeightImplementationForToken |
New event |
WhitelistToken |
Liquidity Weight and Gauge Point selectors removed |
InternalBalanceChanged |
Updated user parameter to account |
FieldAdded |
New event |
ActiveFieldSet |
New event |
Sow |
Updated with fieldId parameter |
Harvest |
Updated with fieldId parameter |
TemperatureChange |
Updated with fieldId parameter |
PodListingCreated |
Added fieldId and changed other parameter names |
PodListingFilled |
Added fieldId and changed other parameter names |
PodListingCancelled |
Added fieldId and changed other parameter names |
PodOrderCreated |
Added fieldId and changed other parameter names |
PodOrderFilled |
Added fieldId and changed other parameter names |
PodOrderCancelled |
Added fieldId and changed other parameter names |
PlotTransfer |
Updated with fieldId parameter |
PodApproval |
Updated with fieldId parameter |
PublishRequisition |
New event |
CancelBlueprint |
New event |
Tractor |
New event |
ShipmentRoutesSet |
New event |
UpdatedEvaluationParameters |
New event |
Receipt |
New event |
Shipped |
New event |
Receipt |
New event |
Reward |
Removed |
SeasonOfPlenty |
Removed |
SeasonOfPlentyWell |
New event |
SeasonOfPlentyField |
New event |
MigratedAccountStatus |
New event |
MigratedPlot |
New event |
InternalBalanceMigrated |
New event |
MigratedPodListing |
New event |
MigratedPodOrder |
New event |
AddMigratedDeposit |
New event |
FertilizerMigrated |
New event |