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:
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:
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:
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