The aTokens are interest-bearing derivative tokens that are minted and burned upon deposit
(called from LendingPool
) and redeem
(called from the aToken contract). The aTokens' value is pegged to the value of the corresponding deposited asset at a 1:1 ratio, and can be safely stored, transferred or traded. All interest collected by the aTokens reserves are distributed to aTokens holders directly by continuously increasing their wallet balance. Users can decide to redirect their stream of interest payments to any Ethereum public address.
The source code for aTokens can be found here.
If you need development support, join the #developers channel on our Aave community Discord server.
function redeem(uint256 _amount)
Non-standard ERC20 function to redeem an _amount
of aTokens for the underlying asset, burning the aTokens during the process.
NOTE:
redeem()
will fail if the aTokens to be redeemed are being used as collateral. Please refer to the transferAllowed()
function to understand how to check if a specific redeem/transfer action can be performed.
Parameter Name | Type | Description |
| uint256 | Amount of To redeem the entire balance, use a value of |
/// Instantiation of the aToken addressaToken aTokenInstance = AToken("/*aToken_address*/");​/// Input variablesuint256 amount = 1000 * 1e18;​/// redeem method callaTokenInstance.redeem(amount)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// redeem 1000 DAIconst amountInWei = web3.utils.toWei("1000", "ether")await aDaiContract.methods.redeem(amountInWei).send().catch((e) => {throw Error(`Error redeeming aDai: ${e.message}`)})
function transfer(address recipient, uint256 amount) public
Standard ERC20 function to transfer tokens from msg.sender
to a specified recipient
.
NOTE:
transfer()
will fail if the aTokens to be redeemed are being used as collateral. Please refer to the transferAllowed()
function to understand how to check if a specific redeem/transfer action can be performed.
transfer()
will fail if an amount
of 0 is used, which is non-standard ERC20 behaviour.
/// Instantiation of the aToken addressaToken aTokenInstance = aToken("/*aToken_address*/");​/// Input variablesaddress recipient = /*transfer_recipient_address*/;uint256 amount = 1000 * 1e18;​/// transfer method callaTokenInstance.transfer(recipient, amount)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// transfer 1000 DAIconst amountInWei = web3.utils.toWei("1000", "ether")​await aDaiContract.methods.transfer(amountInWei).send().catch((e) => {throw Error(`Error transfering aDai: ${e.message}`)})
function transferFrom(address from, address to, uint256 amount) public
Standard ERC20 function to transfer tokens from an address to another.
NOTE:
transferFrom()
will fail if the aTokens to be redeemed are being used as collateral. Please refer to the transferAllowed()
function to understand how to check if a specific redeem/transfer action can be performed.
transferFrom()
will fail if an amount
of 0 is used, which is non-standard ERC20 behaviour.
/// Instantiation of the AToken addressAToken aTokenInstance = AToken("/*aToken_address*/");​/// Input variablesaddress from = /*transfer_source_address*/address to = /*transfer_recipient_address*/;uint256 amount = 1000 * 1e18;​/// transferFrom method callaTokenInstance.transferFrom(from, to, amount)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// transfer 1000 DAI between two addressesconst amountInWei = web3.utils.toWei("1000", "ether")const from = "FROM_ADDRESS"const to = "TO_ADDRESS"​await aDaiContract.methods.transferFrom(from, to, amountInWei).send().catch((e) => {throw Error(`Error transferFrom for aDai: ${e.message}`)})
function isTransferAllowed(address user, uint256 amount)
Non-standard ERC20 function that checks if a transfer or a redeem will fail. Specifically, a transfer/redeem will fail if the resulting Health Factor of the user performing the action will end up being below 1.
| Type | Description |
transferAllowed | bool | true if the transfer is allowed, otherwise false |
function redirectInterestStream(address _to)
Redirects the interest generated to a target address.
Parameter Name | Type | Description |
| address | Address of the |
/// Instantiation of the aToken addressaToken aTokenInstance = aToken("/*aToken_address*/");​/// Input variablesaddress receiver = /*receiver_public_address*/;​/// transfer method callaTokenInstance.redirectInterestStream(receiver)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// redirect interest stream to a different addressconst to = "TO_ADDRESS"await aDaiContract.methods.redirectInterestStream(to).send().catch((e) => {throw Error(`Error redeeming Dai: ${e.message}`)})
function redirectInterestStreamOf(address _from, address _to)
Allows an allowed third-party to redirect the interest generated by a depositor to a target address. When the interest is redirected, the depositor balance is added to the receiver balance. The caller needs to have allowance on the interest redirection to be able to execute the function.
Parameter Name | Type | Description |
| address | Address of the |
| address | Address of the |
/// Instantiation of the aToken addressaToken aTokenInstance = aToken("/*aToken_address*/");​/// Input variablesaddress depositor = /*depositor_public_address*/;address receiver = /*receiver_public_address*/;​/// transfer method callaTokenInstance.redirectInterestStreamOf(depositor, receiver)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// redirect interest stream between two addressesconst from = "FROM_ADDRESS"const to = "TO_ADDRESS"await aDaiContract.methods.redirectInterestStreamOf(from, to).send().catch((e) => {throw Error(`Error redeeming Dai: ${e.message}`)})
function allowInterestRedirectionTo(address _to)
Gives allowance to an address to execute the interest redirection on behalf of the caller. This method allows third parties to setup interest stream redirections on behalf of the depositors.
Parameter Name | Type | Description |
| address |
|
/// Instantiation of the aToken addressaToken aTokenInstance = aToken("/*aToken_address*/");​/// Input variablesaddress receiver = /*receiver_public_address*/;​/// transfer method callaTokenInstance.allowInterestRedirectionTo(receiver)
// Import the ABIs, see: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesimport ADaiTokenABI from "./ADaiToken.json"import LendingPoolAddressesProviderABI from "./LendingPoolAddressesProvider.json"import LendingPoolABI from "./LendingPool.json"​const lpAddressProviderAddress = '0x24a42fD28C976A61Df5D00D0599C34c4f90748c8' // mainnet address, for other addresses: https://docs.aave.com/developers/developing-on-aave/deployed-contract-instancesconst lpAddressProviderContract = new web3.eth.Contract(LendingPoolAddressesProviderABI, lpAddressProviderAddress)​// Get the latest LendingPoolCore addressconst lpCoreAddress = await lpAddressProviderContract.methods.getLendingPoolCore().call().catch((e) => {throw Error(`Error getting lendingPool address: ${e.message}`)})​const aDaiToken = '0xfC1E690f61EFd961294b3e1Ce3313fBD8aa4f85d'const aDaiContract = new web3.eth.Contract(ADaiTokenABI, aDaiToken)​// allow `to` address to redirect interest streamconst to = "TO_ADDRESS"await aDaiContract.methods.allowInterestRedirectionTo(to).send().catch((e) => {throw Error(`Error redeeming Dai: ${e.message}`)})
aTokens contracts have a set of methods designed to help monitor Aave Protocol activity for third-parties. Methods and their output are described in this section.
function balanceOf(address _user)
Returns the current total aToken balance of _user
all interest collected included.
| Type | Description |
balance | uint256 | aToken balance of the user, in wei units. |
function principalBalanceOf(address _user)
Returns user
current balance deposited to the Aave Protocol reserve contract, with interest collected amount removed.
| Type | Description |
amount | uint256 | user balance, in wei units. |
function getInterestRedirectionAddress(address _user)
Returns user
current interest stream recipient address, if the user
doesn't have set any receiver the method return 0x00...
.
| Type | Description |
receiver | address | receiver public address. |
Each aToken contract produces events that can easily be monitored directly on the Ethereum blockchain. For more information about event monitoring and filters on Ethereum, please refer to the official solidity documentation.​
If you are analysing data about Aave Protocol, see the Analysing Data section.
The aTokens contracts have standard ERC20 behaviour and events. The below section will only detail the aToken specific events.
| type | description |
_from | address | address of the |
_value | uint256 | the amount to be redeemed, in Wei. |
_fromBalanceIncrease | uint256 | the cumulated balance increase since the last |
_fromindex | uint256 | the last index of the |
| type | description |
_from | address | address of the |
_value | uint256 | the amount to be minted, in Wei. |
_fromBalanceIncrease | uint256 | the cumulated balance increase since the last |
_fromindex | uint256 | the last index of the |
| type | description |
_from | address | address of the |
_value | uint256 | the amount to be burned, in Wei. |
_fromBalanceIncrease | uint256 | the cumulated balance increase since the last |
_fromindex | uint256 | the last index of the |
| type | description |
_from | address | address of the |
_to | address | address of the tokens |
_value | uint256 | the amount to be transferred, in Wei. |
_fromBalanceIncrease | uint256 | the cumulated balance since the last |
_toBalanceIncrease | uint256 | the cumulated balance increase since the last |
_fromindex | uint256 | the last index of the |
_toindex | uint256 | the last index of the |
| type | description |
_from | address | address of the |
_to | address | address of the |
_redirectedBalance | uint256 | amount of interest redirected, in Wei. |
_fromBalanceIncrease | uint256 | the cumulated balance increase since the last |
_fromindex | uint256 | the last index of the |
| type | description |
_targetAddress | address | address of the |
_targetBalanceIncrease | uint256 | the cumulated balance increase since the last |
_targetIndex | uint256 | the last index of the |
_redirectedBalanceAdded | uint256 | the redirected balance being added |
_redirectedBalanceRemoved | uint256 | the redirected balance being removed |
| type | description |
_from | address | address of the |
_to | address | address of the |
An event emitted by the LendingPoolCore contract​
| type | description |
reserve | address | address of the |
liquidityRate | uint256 | updated liquidityRate, in Ray. |
stableBorrowRate | uint256 | updated stable rate APY, in Ray units. |
variableBorrowRate | uint256 | updated variable rate APY, in Ray units. |
liquidityIndex | uint256 | updated liquidity index |
variableBorrowIndex | uint256 | updated variable borrow index |