Links

APY and APR

You can query latest APY and APR on chain and subgraph
All rates queried on chain or subgraph, are expressed in RAY units i.e. 10^27. All emissions are expressed in WAD units i.e. 10^18.
APY: Compounding interest accrued by deposit or borrow on LendingPool
APR: Non Compounding rewards earned as part of LiquidityMining
The deposit and borrow APY displayed on the Aave front-end is compounded per second.

Fetch Data

Subgraph

Use subgraph to query reserve data.
{
reserves {
name
underlyingAsset
liquidityRate
stableBorrowRate
variableBorrowRate
aEmissionPerSecond
vEmissionPerSecond
sEmissionPerSecond
totalATokenSupply
totalCurrentVariableDebt
}
}

On-Chain

APR: getAssetData to fetch liquidity mining incentives for a/s/vToken.
APY: getReserveDatato fetch deposit and borrow rates of asset.
[, liquidityIndex, variableBorrowIndex,
currentLiquidityRate, currentVariableBorrowRate,
currentStableBorrowRate, ,
aTokenAddress, stableDebtTokenAddress,
variableDebtTokenAddress, , ] = LendingPool.getReserveData(asset.address)
// asset is the ERC20 supplied or borrowed, eg. DAI, WETH
//For stable borrows, the rate is specific to a user and can be queried through the ProtocolDataProvider contract
userStableBorrowRate = ProtocolDataProvider.getUserReserveData(asset.address, userAddress)
[,aEmissionPerSecond,] = IncentivesController.getAssetData(aTokenAddress)
[,vEmissionPerSecond,] = IncentivesController.getAssetData(variableDebtTokenAddress)
[,sEmissionPerSecond,] = IncentivesController.getAssetData(stableDebtTokenAddress)
// If the current UNIX timestamp > distributionEnd then the incentives are no longer active
distributionEnd = IncentivesController.DISTRIBUTION_END();

Compute Data

Calculate rates as👇🏻with js, python or whatever you like 😉
RAY = 10**27 // 10 to the power 27
SECONDS_PER_YEAR = 31536000
// Deposit and Borrow calculations
// APY and APR are returned here as decimals, multiply by 100 to get the percents
depositAPR = liquidityRate/RAY
variableBorrowAPR = variableBorrowRate/RAY
stableBorrowAPR = variableBorrowRate/RAY
depositAPY = ((1 + (depositAPR / SECONDS_PER_YEAR)) ^ SECONDS_PER_YEAR) - 1
variableBorrowAPY = ((1 + (variableBorrowAPR / SECONDS_PER_YEAR)) ^ SECONDS_PER_YEAR) - 1
stableBorrowAPY = ((1 + (stableBorrowAPR / SECONDS_PER_YEAR)) ^ SECONDS_PER_YEAR) - 1
// Incentives calculation
aEmissionPerYear = aEmissionPerSecond * SECONDS_PER_YEAR
vEmissionPerYear = vEmissionPerSecond * SECONDS_PER_YEAR
WEI_DECIMALS = 10**18 // All emissions are in wei units, 18 decimal places
// UNDERLYING_TOKEN_DECIMALS will be the decimals of token underlying the aToken or debtToken
// For Example, UNDERLYING_TOKEN_DECIMALS for aUSDC will be 10**6 because USDC has 6 decimals
incentiveDepositAPRPercent = 100 * (aEmissionPerYear * REWARD_PRICE_ETH * WEI_DECIMALS)/
(totalATokenSupply * TOKEN_PRICE_ETH * UNDERLYING_TOKEN_DECIMALS)
incentiveBorrowAPRPercent = 100 * (vEmissionPerYear * REWARD_PRICE_ETH * WEI_DECIMALS)/
(totalCurrentVariableDebt * TOKEN_PRICE_ETH * UNDERLYING_TOKEN_DECIMALS)

Conversions

Both of these conversions take the input and ouput in decimal form. Multiply the output by 100 to get the percentage.

APR -> APY

To convert the APR to APY compounded per second the formula is:
APY=(1+(APR/secondsPerYear))secondsPerYear1APY = (1 + (APR / secondsPerYear))^{secondsPerYear} - 1

APY -> APR

To convert APY compounded per second to APR the formula is:
APR=((1+APY)(1/secondsPerYear)1)secondsPerYearAPR = ((1 + APY)^{(1/secondsPerYear)} - 1) * secondsPerYear