Interest Bearing Logic

Interest Bearing Logic

Yield

yield is represented as cumulative per-second rate in 27 decimal format. The rate is calculated as follows:

yield=1+annualRate1315360001027yield = 1 + annualRate^{\frac{1}{31536000}} * 10^{27}

cumulativeYield represents the aggregate interest accrued over time. It is calculated with a 1-second precision based on the block timestamp. cumulativeYield is updated whenever the _refreshCumulativeYield() internal function is called, to update the cumulativeYield to the current time

cumulativeYield is calculated as follows: Cumulative Rate is calculated as:

newCumulativeYield=oldCumulativeYield(1+yield)elapsedTimenewCumulativeYield = oldCumulativeYield * (1 + yield)^{elapsedTime}

Setting yield to RAY (1e27) - which is also its initial value at deployment - sets yield to zero. A positive yield will increase the cumulativeYield over time.

Here timeElapsed refers to the time elapsed between the last _cumulativeYield refresh and the current timestamp.

previousEpochCumulativeYield also represents the aggregate interest accrued over time with a 1-second precision but is based on the cumulativeYield calculated at the previousEpochTimestamp. previousEpochCumulativeYield is also updated whenever the _refreshCumulativeYield() internal function is called.

previousEpochCumulativeYield is calculated as follows:

newPreviousEpochCumulativeYield=oldPreviousEpochCumulativeYield(1+yield)timeElapsedToEpochnewPreviousEpochCumulativeYield = oldPreviousEpochCumulativeYield * (1 + yield)^{timeElapsedToEpoch}

Here timeElapsedToEpoch refers to the time elapsed between the last cumulativeYield refresh and the previousEpochTimestamp.

Setting yield to RAY (1e27) - which is also its initial value at deployment - sets yield to zero. A positive yield will increase the cumulativeYield over time.

Epoch

Although interest accrues each second, balances only increase each epoch. This is done to :

  • Provide keepers with enough time to expire a bond (see Keepers)

  • Avoid leftover residual dust amounts when transferring all of a user's balance, since most frontend wallets do not refresh a user's balance on a per second basis.

  • Enable adapting epochs to bond term lengths if the DAO votes to do so. For example a 1 year T-Bill might have a 4 hour rebase while a 30 year bond could have a daily or weekly rebase.

Thus balanceOf and totalSupply both rely on the internal function _calculatePreviousEpochCumulativeYield(). The _calculatePreviousEpochCumulativeYield() is called in _refreshCumulativeYield to update the _previousEpochCumulativeYield state.

Even though only _previousEpochCumulativeYield is used to return external KIBT balances , the more accurate cumulativeYield state is required to track the yield earned between epochs.

Epochs add a layer of flexibility that enables KIBTokens to adapt to investment strategies with different time horizons.

Last updated