Understand Silo vAPY

The Beanstalk UI displays vAPY (variable APY) statistics for each asset on the Deposit Whitelist. APYs are called variable because they are not enforced by Beanstalk in any way. Rather, the APY uses historical data about Beans earned by Stalkholders to estimate future returns for Depositing in the Silo.

The APY calculation has two parts:

  1. Estimating the number of Beans that will be minted per Season using recent historical data.

  2. Estimating the number of Beans and Stalk that a Farmer will receive over time for Depositing their whitelisted assets in the Silo. This takes into account the Stalk supply and Seed supply and makes some assumptions about Stalkholder behavior.

Bean vAPY vs Stalk vAPY

Stalkholders earn Bean seignorage when deltaB is greater than 0 over the previous Season. Estimated annual Beans earned by a Stalkholder is called the Bean vAPY.

Seeds grow Stalk each Season, regardless of deltaB. Estimated annual Stalk growth for a Stalkholder is called the Stalk vAPY.

Estimating Earned Beans per Season

The Beanstalk UI and Subgraph use a 30-day exponential moving average (EMA) of Beans earned by Stalkholders to estimate future Beans earned by Stalkholders. The formula uses a weighted average in which recent Seasons are weighted more heavily.

The current EMA value can be located on the Silo page by hovering over the Bean vAPY values for any whitelisted asset.

Estimating vAPY for Silo Deposits

The vAPY for Depositing a whitelisted asset in the Silo is determined by the value of 1 newly Deposited BDV in 8760 Seasons (1 year).

The vAPY calculations make the following assumptions:

  • No new assets are Deposited into or Withdrawn from the Silo;

  • No liquidity is added or removed from liquidity pools that Beans trade in;

  • There are nˉe\bar{n}^e Beans earned by Stalkholders each Season; and

  • Every Stalkholder Mows their Grown Stalk each Season.

Calculations

Exponential Moving Average (EMA)

The window of the EMA (uu), i.e., the number of Seasons in 30 days:

u=2430=720u = 24 * 30 = 720

The weighting multiplier (β\beta); a constant between 0 and 1 that determines how much weight is given to the most recent data point:

β=2(u+1)\beta=\frac{2}{(u+1)}

The 30-day exponential moving average at Season tt (nˉte\bar{n}^e_t):

nˉte=βi=tu+1it(1β)tinie\bar{n}^e_t = \beta \sum_{i=t-u+1}^{i \leq t}(1-\beta)^{t-i} n^e_{i}

Silo vAPY

The formulas for the Silo vAPYs (vAPYBeanx\text{vAPY}^{x}_{\text{Bean}}​ and vAPYStalkx\text{vAPY}^{x}_{\text{Stalk}}​) take the following variables as inputs:

  • nˉte\bar{n}^e_t, the 30-day EMA of Beans earned by Stalkholders at Season tt​;

  • CiC_i, the total number of Seeds at Season ii​;

  • KiK_i, the total number of Stalk at Season ii; and​

  • xx, the number of Seeds per BDV granted for Depositing this asset:

    • x=3x = 3 for Deposited BEAN;

    • x=3.25x= 3.25 for Deposited BEAN3CRV; and

    • x=4.5x= 4.5 for Deposited BEANETH.

The formulas for the Silo vAPYs make estimations of the following variables:

  • Ci^\hat{C_i}, the estimated total number of Seeds at Season ii;​

  • Ki^\hat{K_i}, the estimated total number of Stalk at Season ii;

  • bi^\hat{b_i}, the estimated number of a Farmer's Deposited Beans at Season ii​; and

  • ki^\hat{k_i}​, the estimated number of a Farmer's Stalk at Season ii.​

vAPYBeanx\text{vAPY}^{x}_{\text{Bean}} is calculated using the estimated number of Beans owned by the Farmer a year from now (b^t+8760\hat{b}_{t+8760}) by using a sequence from the current Season (tt​) to Season t+8760t+8760​.

First, initialize the sequence with:

C^t= CtK^t= Ktb^t= x3k^t= 1\begin{aligned} \hat{C}_{t} =& \ C_t \\ \hat{K}_{t} =& \ K_t \\ \hat{b}_{t} =& \ \frac{x}{3} \\ \hat{k}_{t} =& \ 1 \end{aligned}

Then iterate through the following sequence for i{uuN,t<ut+8760}i \in\{{u | u \in \mathbb{N}, t < u \leq t+8760}\}​:

Ci^= C^i1+3nˉteK^i= K^i1+nˉte+110000C^i1bi^= b^i1+nˉtek^i1K^i1k^i= k^i1+nˉtek^i1K^i1+310000b^i1\begin{aligned} \hat{C_{i}} =& \ \hat{C}_{i-1} + 3\bar{n}^e_t \\ \hat{K}_{i} =& \ \hat{K}_{i-1} + \bar{n}^e_t + \frac{1}{10000}\hat{C}_{i-1} \\ \hat{b_{i}} =& \ \hat{b}_{i-1} + \bar{n}^e_t\frac{\hat{k}_{i-1}}{\hat{K}_{i-1}} \\ \hat{k}_{i} =& \ \hat{k}_{i-1} + \bar{n}^e_t\frac{\hat{k}_{i-1}}{\hat{K}_{i-1}} + \frac{3}{10000} \hat{b}_{i-1} \end{aligned}

We define vAPYBeanx\text{vAPY}^{x}_{\text{Bean}}​ for a given xx​ as:

vAPYBeanx=(b^t+8760bt^)×100\text{vAPY}^{x}_{\text{Bean}}=(\hat{b}_{t+8760}-\hat{b_t}) \times 100

We define vAPYStalkx\text{vAPY}^{x}_{\text{Stalk}}​ for a given xx​ as:

vAPYStalkx=(k^t+8760kt^)×100\text{vAPY}^{x}_{\text{Stalk}}=(\hat{k}_{t+8760}-\hat{k_t}) \times 100

Last updated