Indexing onchain data
In order to execute the calculations outlined above, accessing onchain data is essential. Our method of obtaining a vault's share price depends on the type of vault, as specified below.
ERC-4626 vaults
In the case of ERC-4626 vaults, we can call the totalSupply
and totalAssets
smart contract functions to calculate share price.
totalSupply
= total shares
totalAssets
= total shares value
Non ERC-4626 vaults
If a vault is not ERC-4626 compliant, proxies for the above functions can usually be found in the following functions:
mint
deposit
burn
redeem
You can see an example of this in the code snippets below.
function deposit(uint256 _amount, address _receiver)
external
nonReentrant
isNotPastMaturity
whenNotPaused
approvedLender(_receiver)
returns (uint256 _sharesReceived)
{
_addInterest();
VaultAccount memory _totalAsset = totalAsset;
_sharesReceived = _totalAsset.toShares(_amount, false);
_deposit(_totalAsset, _amount.toUint128(), _sharesReceived, _receiver);
}
function toShares(
VaultAccount memory total,
uint256 amount,
bool roundUp
) internal pure returns (uint256 shares) {
if (total.amount == 0) {
shares = amount;
} else {
shares = (amount * total.shares) / total.amount;
if (roundUp && (shares * total.amount) / total.shares < amount) {
shares = shares + 1;
}
}
}
Liquid Staking Tokens (LSTs and LRTs)
To calculate APY for LSTs (e.g., Lido) and other vaults that periodically update their earnings (e.g., Yearn vaults), we use the totalSupply
and getEthValue(totalSupply)
functions.
totalSupply
= total shares
getEthValue(totalSupply)
= total shares value
One challenge we face is accounting for the irregular intervals at which some vaults update their earnings — leading to sudden and significant fluctuations in APY. Understanding this nuance is essential for accurately interpreting discrepancies on vaults.fyi.
Rebasing supply vaults
Vaults that gradually increase the user's LP token balance, such as those on Aave, are known as rebasing supply vaults. We calculate the share price for rebasing supply vaults with the totalSupply
and scaledTotalSupply
functions.
scaledTotalSupply
= total shares
totalSupply
= total shares value
Staking mechanism vaults
Vaults that do not compound automatically (e.g., StakeWise) are known as staking mechanism vaults. These vaults do not compound interest automatically, instead making users periodically harvest and redeposit it to maximize yield. Calculating returns in such scenarios can be complex, as the total shares:value ratio does not reflect share price accurately.
Instead, we can ascertain the actual share price with the following formulas:
These formulas result in a simulated calculation of totalSupply
. It is not directly fetched from the blockchain.
Real World Assets (RWAs)
RWAs on vaults.fyi are ERC-20 tokens that reflect investments in offchain financial assets. To assess the yield of RWAs we use:
The
totalSupply
function to calculate total shares.The
RWAOracle.price
function to fetch share price.The
StablecoinOracle.price
function to fetch the underlying asset's (i.e, a stablecoin) price.
These functions are used in the following formulas to calculate yield:
Last updated