Aave Vaults
Aave Vaults are ERC-4626 compliant yield-bearing vaults that allow users to deposit and withdraw ERC-20 tokens supported by Aave V3. These vaults automatically manage the supply and withdrawal of assets in the Aave Protocol while enabling vault managers to take a fee on the yield earned.
Aave ERC-4626 Vaults
Overview
Aave Vaults follow the ERC-4626 Tokenized Vault Standard, which standardizes the interface for yield-bearing vaults. This standard simplifies integration with various applications and aggregators while improving interoperability across the DeFi ecosystem.
Each vault allows depositors to:
Deposit supported tokens (assets) and receive vault shares in return
Redeem vault shares for the underlying assets plus accrued yield
Automatically earn yield from Aave V3 markets without direct interaction with the protocol
Architecture
Aave Vaults consist of three key components:
ERC-4626 Interface: Standardized methods for deposit, withdrawal, and accounting of assets.
Yield Strategy: Manages deposits into Aave V3 markets and handles yield accrual.
Fee Management: Enables vault managers to collect a percentage of the yield generated.
When a user deposits an asset into a vault:
The vault mints proportional vault shares (ERC-20 tokens) to the user
The vault deposits the underlying assets into the corresponding Aave V3 market
The vault receives aTokens from Aave, which automatically accrue yield
Yield is reflected in the increasing value of vault shares over time
Fee Structure
Vault managers can set a fee percentage on the yield generated by the vault. This fee structure includes:
Performance Fee: A percentage of the yield earned that goes to the vault manager
Max Fee: A maximum limit on the performance fee that can be charged
Fee Recipient: The address that receives the collected fees
Fees are collected when yield is realized through:
User withdrawals or redemptions
Explicit fee collection by the vault manager
The fee is only applied to the yield portion of the assets and not to the principal amount deposited by users.
Interacting with Vaults
Vaults implement the standard ERC-4626 interface with methods such as:
deposit(uint256 assets, address receiver): Deposit assets and receive vault shares
withdraw(uint256 assets, address receiver, address owner): Withdraw assets by burning vault shares
mint(uint256 shares, address receiver): Mint exact amount of shares by depositing assets
redeem(uint256 shares, address receiver, address owner): Redeem shares for underlying assets
Additionally, vaults provide view functions to check:
totalAssets(): Total assets managed by the vault
convertToShares(uint256 assets): Convert asset amount to vault shares
convertToAssets(uint256 shares): Convert vault shares to asset amount
previewDeposit(uint256 assets): Preview shares received for a deposit
previewWithdraw(uint256 assets): Preview shares needed for a withdrawal
Benefits for Users
Simplified Yield: Earn yield from Aave V3 without managing multiple transactions
Gas Efficiency: Lower gas costs compared to direct protocol interactions
Standard Interface: Easier integration with other DeFi protocols and applications
Composability: Vault shares can be used in other DeFi applications
Benefits for Vault Managers
Yield Capture: Earn fees on yield generated by user deposits
Customization: Configure fee parameters to suit different strategies
Standardization: Leverage the ERC-4626 standard for broader integration
API Reference
The Aave Vaults API provides endpoints to query vault information and generate transaction data for interacting with vaults.
VaultInfo
Returns information about one or more vaults, including APY, fee structure, and maximum available supply.
Request Parameters:
pool (optional): The address of the Aave pool
underlyingAsset (optional): The address of the underlying asset
chainId (optional): The chain ID where the vault is deployed
All parameters are optional. If no parameters are provided, information for all configured vaults across all networks will be returned.
Example Query:
query VaultInfo { vaultInfo( request: { pool: "0x794a61358d6845594f94dc1db02a252b5b4814ad" underlyingAsset: "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1" chainId: 42161 } ) { vault underlyingAsset apy chainId fee maxAvailableSupply }}
Example Response:
{ "data": { "vaultInfo": [ { "vault": "0x45562257139d0e6372ca9F2366Ac9D8D8f6764aa", "underlyingAsset": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", "apy": 2.159007050509208, "chainId": 42161, "fee": 0, "maxAvailableSupply": "0" } ] }}
Deposit
Generates transaction data for depositing assets into a vault.
Request Parameters:
amount: The amount of assets to deposit
chainId: The chain ID where the vault is deployed
vault: The address of the vault
receiver: The address that will receive the vault shares
Example Query:
query Deposit { deposit( request: { amount: "100" chainId: 1 vault: "0x45562257139d0e6372ca9f2366ac9d8d8f6764aa" receiver: "0xaDdfe0b2342800ebD67C30d1c2Bd479E4D498BD5" } ) { to data }}
Example Response:
{ "data": { "deposit": { "to": "0x45562257139d0e6372ca9F2366Ac9D8D8f6764aa", "data": "0x6e553f650000000000000000000000000000000000000000000000000000000000000064000000000000000000000000addfe0b2342800ebd67c30d1c2bd479e4d498bd5" } }}
Example Query with Permit:
query DepositWithPermit { deposit( request: { amount: "100" chainId: 1 vault: "0x45562257139d0e6372ca9f2366ac9d8d8f6764aa" receiver: "0xaDdfe0b2342800ebD67C30d1c2Bd479E4D498BD5" signature: { deadline: "1700000000", v: 28, r: "0x...", s: "0x..." } } ) { to data }}
Redeem
Generates transaction data for redeeming vault shares.
Request Parameters:
shares: The amount of shares to redeem
chainId: The chain ID where the vault is deployed
vault: The address of the vault
receiver: The address that will receive the underlying assets
owner: (optional) The address that owns the shares (if different from the caller)
Permit Support: Both deposit and redeem endpoints support permit functionality. If a signature is provided in the request, the API will return transaction data for the permit methods.
Example Query:
query Redeem { redeem( request: { shares: "100" chainId: 1 vault: "0x45562257139d0e6372ca9f2366ac9d8d8f6764aa" receiver: "0xaDdfe0b2342800ebD67C30d1c2Bd479E4D498BD5" } ) { to data }}
Example Response:
{ "data": { "redeem": { "to": "0x45562257139d0e6372ca9F2366Ac9D8D8f6764aa", "data": "0xba087652000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000addfe0b2342800ebd67c30d1c2bd479e4d498bd5" } }}
Example Query with Permit:
query RedeemWithPermit { redeem( request: { shares: "100" chainId: 1 vault: "0x45562257139d0e6372ca9f2366ac9d8d8f6764aa" receiver: "0xaDdfe0b2342800ebD67C30d1c2Bd479E4D498BD5" signature: { deadline: "1700000000", v: 28, r: "0x...", s: "0x..." } } ) { to data }}