Aave Simple Earn Vault Data
Fetch a single vault, list vaults, and read a user’s vault positions, history, and activity.
Vault Data Structure
Aave Simple Earn Vault data describes ERC-4626 compliant yield-bearing vaults:
- Vault identification (address, owner, share token details)
- Reserve information (underlying asset, yield strategy)
- Fee structure (performance fees, accumulated revenue, fee recipients)
- Vault metrics (total balance, user shares)
Include a user address to also get the user’s vault shares
(user) and their underlying balance (user).
The following TypeScript interfaces illustrate the core Vault type and its related types:
interface Vault {
address: EvmAddress;
owner: EvmAddress;
shareName: string;
shareSymbol: string;
usedReserve: Reserve;
fee: PercentValue;
totalFeeRevenue: TokenAmount;
balance: TokenAmount;
feesBalance: TokenAmount;
chainId: ChainId;
userShares?: UserVaultShares;
recipients?: VaultFeesRecipientsConfiguration;
}
interface VaultFeesRecipientsConfiguration {
address: EvmAddress;
entries: VaultFeesRecipientSplit[];
}
interface VaultFeesRecipientSplit {
address: EvmAddress;
split: PercentValue;
isAaveLabs: boolean;
}
interface UserVaultShares {
shares: TokenAmount;
balance: TokenAmount;
}
interface Reserve {
market: MarketInfo;
underlyingToken: Currency;
aToken: Currency;
vToken: Currency;
acceptsNative?: NativeCurrency;
size: TokenAmount;
usdExchangeRate: BigDecimal;
usdOracleAddress: EvmAddress;
isFrozen: boolean;
isPaused: boolean;
flashLoanEnabled: boolean;
supplyInfo: ReserveSupplyInfo;
borrowInfo?: ReserveBorrowInfo;
isolationModeConfig?: ReserveIsolationModeConfig; // deprecated in Aave V3.7
eModeInfo: EmodeReserveInfo[];
userState?: ReserveUserState;
}
The following GraphQL fragments illustrate the core Vault type and its related types:
fragment Vault on Vault {
__typename
address
owner
shareName
shareSymbol
usedReserve {
...Reserve
}
fee {
...PercentValue
}
totalFeeRevenue {
...TokenAmount
}
balance {
...TokenAmount
}
feesBalance {
...TokenAmount
}
chainId
userShares {
...UserVaultShares
}
recipients {
...VaultFeesRecipientsConfiguration
}
}
fragment UserVaultShares on UserVaultShares {
__typename
shares {
...TokenAmount
}
balance {
...TokenAmount
}
}
fragment VaultFeesRecipientsConfiguration on VaultFeesRecipientsConfiguration {
__typename
address
entries {
...VaultFeesRecipientSplit
}
}
fragment VaultFeesRecipientSplit on VaultFeesRecipientSplit {
__typename
address
split {
...PercentValue
}
isAaveLabs
}
fragment Reserve on Reserve {
__typename
market {
...MarketInfo
}
underlyingToken {
...Currency
}
aToken {
...Currency
}
vToken {
...Currency
}
acceptsNative {
...NativeCurrency
}
size {
...TokenAmount
}
usdExchangeRate
usdOracleAddress
isFrozen
isPaused
flashLoanEnabled
supplyInfo {
...ReserveSupplyInfo
}
borrowInfo {
...ReserveBorrowInfo
}
isolationModeConfig {
...ReserveIsolationModeConfig
}
eModeInfo {
...EmodeReserveInfo
}
userState {
...ReserveUserState
}
}
fragment TokenAmount on TokenAmount {
__typename
usdPerToken
amount {
...DecimalValue
}
usd
}
fragment DecimalValue on DecimalValue {
__typename
raw
decimals
value
}
fragment Currency on Currency {
__typename
address
imageUrl
name
symbol
decimals
chainId
}
fragment PercentValue on PercentValue {
__typename
raw
decimals
value
formatted
}
Fetching a Single Vault
Retrieve detailed information about a specific vault including underlying reserve and user shares.
Use the use hook in React, the vault action in TypeScript, or the vault query in GraphQL to fetch detailed information about a specific vault.
const { data, loading, error } = useVault({
by: VaultRequestBy,
chainId: ChainId,
user: EvmAddress | undefined,
});
const { data } = useVault({
by: VaultRequestBy,
chainId: ChainId,
user: EvmAddress | undefined,
suspense: true,
});
import { evmAddress, chainId } from "@aave/client";
import { vault } from "@aave/client/actions";
import { client } from "./client";
const result = await vault(client, {
by: {
address: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
},
chainId: chainId(1),
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
});
if (result.isErr()) {
console.error(result.error);
} else {
// result.value: Vault | null
console.log(result.value);
}
import { chainId } from "@aave/client";
import { vault } from "@aave/client/actions";
import { client } from "./client";
const result = await vault(client, {
by: {
txHash:
"0xeef2ffc57b99ce887edd8362c6d57e5c7a4d8c8a9b2c3d4e5f6789abc123def4",
},
chainId: chainId(1),
});
if (result.isErr()) {
console.error(result.error);
} else {
// result.value: Vault | null
console.log(result.value);
}
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();
query {
vault(
request: {
by: {
address: "0x1234567890abcdef1234567890abcdef12345678"
# OR
# txHash: "0xeef2ffc57b99ce887edd…"
}
chainId: 1
user: "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"
}
) {
address
owner
shareName
shareSymbol
fee {
raw
decimals
value
formatted
}
totalFeeRevenue {
amount {
value
}
usd
}
balance {
amount {
value
}
usd
}
feesBalance {
amount {
value
}
usd
}
usedReserve {
underlyingToken {
symbol
name
address
}
supplyInfo {
apy {
value
}
}
}
userShares {
shares {
amount {
value
}
usd
}
balance {
amount {
value
}
usd
}
}
}
}
{
"data": {
"vault": {
"address": "0x1234567890abcdef1234567890abcdef12345678",
"owner": "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234",
"shareName": "Aave USDC Vault Shares",
"shareSymbol": "avUSDC",
"fee": {
"raw": "100000000000000000000000000",
"decimals": 27,
"value": "0.1",
"formatted": "10.0"
},
"totalFeeRevenue": {
"amount": {
"value": "150.25"
},
"usd": "150.25"
},
"balance": {
"amount": {
"value": "50000.0"
},
"usd": "50000.0"
},
"feesBalance": {
"amount": {
"value": "100.00"
},
"usd": "100.00"
},
"usedReserve": {
"underlyingToken": {
"symbol": "USDC",
"name": "USD Coin",
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
},
"supplyInfo": {
"apy": {
"value": "0.045"
}
}
},
"userShares": {
"shares": {
"amount": {
"value": "1000.0"
},
"usd": "1025.5"
},
"balance": {
"amount": {
"value": "1025.5"
},
"usd": "1025.5"
}
}
}
}
}
In React, fetch a specific vault by address.
import { useVault, evmAddress, chainId } from "@aave/react";
// …
const { data, loading, error } = useVault({
by: {
address: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
},
chainId: chainId(1),
});
if (loading) {
return <p>Loading vault…</p>;
}
if (error) {
return <p>Error: {error.message}</p>;
}
if (!data) {
return <p>Vault not found</p>;
}
// data: Vault
Include a user address to get user-specific vault data like shares owned.
import { useVault, evmAddress, chainId } from "@aave/react";
// …
const { data, loading, error } = useVault({
by: {
address: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
},
chainId: chainId(1),
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
});
import { evmAddress, chainId } from "@aave/client";
import { vault } from "@aave/client/actions";
import { client } from "./client";
const result = await vault(client, {
by: {
address: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
},
chainId: chainId(1),
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"), // Include user for userShares data
});
Listing Available Vaults
Fetch multiple vaults with filtering and pagination support.
Use the use hook in React, the vaults action in TypeScript, or the vaults query in GraphQL to fetch paginated vaults based on filter criteria.
const { data, error, loading } = useVaults({
criteria: VaultsRequestFilterCriteria,
pageSize: PageSize | undefined,
user: EvmAddress | undefined,
cursor: Cursor | undefined,
});
const { data } = useVaults({
criteria: VaultsRequestFilterCriteria,
pageSize: PageSize | undefined,
user: EvmAddress | undefined,
cursor: Cursor | undefined,
suspense: true,
});
interface VaultsRequestFilterCriteria {
/** Filter by specific vault addresses */
vaults?: VaultInput[];
/** Filter by owner addresses */
ownedBy?: EvmAddress[];
}
interface VaultInput {
/** The address of the vault */
address: EvmAddress;
/** The chain id the vault is on */
chainId: ChainId;
}
import { evmAddress, PageSize } from "@aave/client";
import { vaults } from "@aave/client/actions";
import { client } from "./client";
const result = await vaults(client, {
criteria: {
ownedBy: [evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234")],
},
pageSize: PageSize.Ten,
});
if (result.isErr()) {
console.error(result.error);
} else {
// result.value: PaginatedVaultsResult
console.log(result.value);
}
import { evmAddress, chainId, PageSize } from "@aave/client";
import { vaults } from "@aave/client/actions";
import { client } from "./client";
const result = await vaults(client, {
criteria: {
vaults: [
{
address: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
chainId: chainId(1),
},
],
},
pageSize: PageSize.Ten,
});
if (result.isErr()) {
console.error(result.error);
} else {
// result.value.items: Vault[]
// result.value.pageInfo.next: Cursor | null
// result.value.pageInfo.prev: Cursor | null
console.log(result.value);
}
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();
query {
vaults(
request: {
criteria: {
ownedBy: ["0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"]
# OR
# vaults: [
# {
# address: "0x1234567890abcdef1234567890abcdef12345678",
# chainId: 1,
# },
# ],
}
pageSize: TEN
user: "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"
}
) {
items {
address
owner
shareName
shareSymbol
fee {
raw
decimals
value
formatted
}
totalFeeRevenue {
amount {
value
}
usd
}
balance {
amount {
value
}
usd
}
feesBalance {
amount {
value
}
usd
}
chainId
}
pageInfo {
next
prev
}
}
}
{
"data": {
"vaults": {
"items": [
{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"owner": "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234",
"shareName": "Aave USDC Vault Shares",
"shareSymbol": "avUSDC",
"fee": {
"raw": "100000000000000000000000000",
"decimals": 27,
"value": "0.1",
"formatted": "10.0"
},
"totalFeeRevenue": {
"amount": {
"value": "150.25"
},
"usd": "150.25"
},
"balance": {
"amount": {
"value": "50000.0"
},
"usd": "50000.0"
},
"feesBalance": {
"amount": {
"value": "100.00"
},
"usd": "100.00"
},
"chainId": 1
}
],
"pageInfo": {
"next": null,
"prev": null
}
}
}
}
In React, fetch vaults owned by a specific address.
import { useVaults, evmAddress, PageSize } from "@aave/react";
// …
const { data, error, loading } = useVaults({
criteria: {
ownedBy: [evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234")],
},
pageSize: PageSize.Ten,
});
if (loading) {
return <p>Loading…</p>;
}
if (error) {
return <p>{error.message}</p>;
}
// data.items: Vault[]
// data.pageInfo.next: Cursor | null
// data.pageInfo.prev: Cursor | null
Include a user address to get user-specific vault data like shares owned.
import { useVaults, evmAddress, PageSize } from "@aave/react";
// …
const { data, loading, error } = useVaults({
criteria: {
ownedBy: [evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234")],
},
pageSize: PageSize.Ten,
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
});
import { evmAddress, PageSize } from "@aave/client";
import { vaults } from "@aave/client/actions";
import { client } from "./client";
const result = await vaults(client, {
criteria: {
ownedBy: [evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234")],
},
pageSize: PageSize.Ten,
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"), // Include user for userShares data
});
User Vault Positions
Track user vault positions and shares across Aave Simple Earn Vaults.
Use the use hook in React, the user action in TypeScript, or the user query in GraphQL to fetch paginated vaults that a user has shares in.
const { data, loading, error } = useUserVaults({
user: EvmAddress,
filters: UserVaultsFilter | undefined,
orderBy: UserVaultsOrderBy | undefined,
pageSize: PageSize | undefined,
cursor: Cursor | undefined,
});
const { data } = useUserVaults({
user: EvmAddress,
filters: UserVaultsFilter | undefined,
orderBy: UserVaultsOrderBy | undefined,
pageSize: PageSize | undefined,
cursor: Cursor | undefined,
suspense: true,
});
import { evmAddress, PageSize, OrderDirection } from "@aave/client";
import { userVaults } from "@aave/client/actions";
import { client } from "./client";
const result = await userVaults(client, {
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
orderBy: { shares: OrderDirection.Desc },
pageSize: PageSize.Ten,
});
if (result.isErr()) {
console.error("User vaults error:", result.error);
} else {
// result.value.items: Vault[]
// result.value.pageInfo.next: Cursor | null
// result.value.pageInfo.prev: Cursor | null
console.log(result.value);
}
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();
query {
userVaults(
request: {
user: "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"
orderBy: { shares: DESC }
pageSize: FIFTY
}
) {
items {
address
shareName
shareSymbol
usedReserve {
underlyingToken {
symbol
name
}
}
userShares {
shares {
amount {
value
}
usd
}
balance {
amount {
value
}
usd
}
}
}
pageInfo {
next
prev
}
}
}
{
"data": {
"userVaults": {
"items": [
{
"address": "0x1234567890abcdef1234567890abcdef12345678",
"shareName": "Aave USDC Vault Shares",
"shareSymbol": "avUSDC",
"usedReserve": {
"underlyingToken": {
"symbol": "USDC",
"name": "USD Coin"
}
},
"userShares": {
"shares": {
"amount": {
"value": "1000.0"
},
"usd": "1025.5"
},
"balance": {
"amount": {
"value": "1025.5"
},
"usd": "1025.5"
}
}
}
],
"pageInfo": {
"next": null,
"prev": null
}
}
}
}
In React, fetch user vaults ordered by shares amount.
import {
useUserVaults,
evmAddress,
PageSize,
OrderDirection,
} from "@aave/react";
// …
const { data, error, loading } = useUserVaults({
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
orderBy: { shares: OrderDirection.Desc },
pageSize: PageSize.Fifty,
});
if (error) {
return <p>Error: {error.message}</p>;
}
if (loading) {
return <p>Loading positions…</p>;
}
// data.items: Vault[]
// data.pageInfo.next: Cursor | null
// data.pageInfo.prev: Cursor | null
User Vault Transaction History
Track user vault transaction history.
Use the use hook in React, the vault action in TypeScript, or the vault query in GraphQL to fetch a paginated user’s vault transaction history.
const { data, loading, error } = useVaultUserTransactionHistory({
user: EvmAddress,
vault: EvmAddress,
chainId: ChainId,
filters: VaultUserHistoryAction | undefined,
orderBy: VaultUserTransactionHistoryOrderBy | undefined,
pageSize: PageSize | undefined,
cursor: Cursor | undefined,
});
const { data } = useVaultUserTransactionHistory({
user: EvmAddress,
vault: EvmAddress,
chainId: ChainId,
filters: VaultUserHistoryAction | undefined,
orderBy: VaultUserTransactionHistoryOrderBy | undefined,
pageSize: PageSize | undefined,
cursor: Cursor | undefined,
suspense: true,
});
import { evmAddress, chainId, PageSize, OrderDirection } from "@aave/client";
import { vaultUserTransactionHistory } from "@aave/client/actions";
import { client } from "./client";
const result = await vaultUserTransactionHistory(client, {
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
vault: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
chainId: chainId(1),
orderBy: { date: OrderDirection.Desc },
pageSize: PageSize.Ten,
});
if (result.isErr()) {
console.error("User vault transactions error:", result.error);
} else {
// result.value.items: VaultUserTransactionHistoryItem[]
// result.value.pageInfo.next: Cursor | null
// result.value.pageInfo.prev: Cursor | null
console.log(result.value);
}
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();
query {
vaultUserTransactionHistory(
request: {
user: "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"
vault: "0x1234567890abcdef1234567890abcdef12345678"
chainId: 1
orderBy: { date: DESC }
pageSize: FIFTY
}
) {
items {
... on VaultUserDepositItem {
asset {
usd
usdPerToken
amount {
raw
decimals
value
}
}
shares {
usd
usdPerToken
amount {
raw
decimals
value
}
}
blockExplorerUrl
txHash
timestamp
}
... on VaultUserWithdrawItem {
asset {
usd
usdPerToken
amount {
raw
decimals
value
}
}
shares {
usd
usdPerToken
amount {
raw
decimals
value
}
}
blockExplorerUrl
txHash
timestamp
}
}
pageInfo {
next
prev
}
}
}
{
"data": {
"vaultUserTransactionHistory": {
"items": [
{
"asset": {
"usd": "1000.0",
"usdPerToken": "1.0",
"amount": {
"raw": "1000000000",
"decimals": 6,
"value": "1000.0"
}
},
"shares": {
"usd": "1000.0",
"usdPerToken": "1.0",
"amount": {
"raw": "1000000000",
"decimals": 6,
"value": "1000.0"
}
},
"blockExplorerUrl": "https://etherscan.io/tx/0xeef2ffc57b99ce887edd8362c6d57e5c7a4d8c8a9b2c3d4e5f6789abc123def4",
"txHash": "0xeef2ffc57b99ce887edd8362c6d57e5c7a4d8c8a9b2c3d4e5f6789abc123def4",
"timestamp": "2021-01-01T00:00:00Z"
}
],
"pageInfo": {
"next": null,
"prev": null
}
}
}
}
In React, fetch user vault transaction history ordered by date.
import {
useVaultUserTransactionHistory,
evmAddress,
chainId,
PageSize,
OrderDirection,
} from "@aave/react";
// …
const { data, error, loading } = useVaultUserTransactionHistory({
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
vault: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
chainId: chainId(1),
orderBy: { date: OrderDirection.Desc },
pageSize: PageSize.Fifty,
});
if (error) {
return <p>Error: {error.message}</p>;
}
if (loading) {
return <p>Loading transactions…</p>;
}
// data.items: VaultUserTransactionHistoryItem[]
// data.pageInfo.next: Cursor | null
// data.pageInfo.prev: Cursor | null
Vault User Activity
Return a user’s activity for a vault, including earnings breakdowns over time.
Use the use hook in React, the vault action in TypeScript, or the vault query in GraphQL to fetch the user’s activity for a vault.
const { data, loading, error } = useVaultUserActivity({
user: EvmAddress,
vault: EvmAddress,
chainId: ChainId,
window: VaultUserActivityTimeWindow,
});
const { data } = useVaultUserActivity({
user: EvmAddress,
vault: EvmAddress,
chainId: ChainId,
window: VaultUserActivityTimeWindow,
suspense: true,
});
import { evmAddress, chainId, VaultUserActivityTimeWindow } from "@aave/client";
import { vaultUserActivity } from "@aave/client/actions";
import { client } from "./client";
const result = await vaultUserActivity(client, {
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
vault: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
chainId: chainId(1),
window: VaultUserActivityTimeWindow.LastWeek,
});
if (result.isErr()) {
console.error("User vault activity error:", result.error);
} else {
// result.value: VaultUserActivityResult
}
import { AaveClient } from "@aave/client";
export const client = AaveClient.create();
query {
vaultUserActivity(
request: {
user: "0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"
vault: "0x1234567890abcdef1234567890abcdef12345678"
chainId: 1
window: LAST_WEEK
}
) {
earned {
usd
usdPerToken
amount {
raw
decimals
value
}
}
breakdown {
balance {
usd
usdPerToken
amount {
raw
decimals
value
}
}
earned {
usd
usdPerToken
amount {
raw
decimals
value
}
}
withdrew {
usd
usdPerToken
amount {
raw
decimals
value
}
}
deposited {
usd
usdPerToken
amount {
raw
decimals
value
}
}
date
}
}
}
{
"data": {
"vaultUserActivity": {
"earned": {
"usd": "1000.0",
"usdPerToken": "1.0",
"amount": {
"raw": "1000000000",
"decimals": 6,
"value": "1000.0"
}
},
"breakdown": [
{
"balance": {
"usd": "1000.0",
"usdPerToken": "1.0",
"amount": {
"raw": "1000000000",
"decimals": 6,
"value": "1000.0"
}
},
"earned": {
"usd": "1000.0",
"usdPerToken": "1.0",
"amount": {
"raw": "1000000000",
"decimals": 6,
"value": "1000.0"
}
},
"withdrew": null,
"deposited": null,
"date": "2021-01-01T00:00:00Z"
}
]
}
}
}
In React, fetch the user’s vault activity.
import {
useVaultUserActivity,
evmAddress,
chainId,
VaultUserActivityTimeWindow,
} from "@aave/react";
// …
const { data, error, loading } = useVaultUserActivity({
user: evmAddress("0x742d35cc6e5c4ce3b69a2a8c7c8e5f7e9a0b1234"),
vault: evmAddress("0x1234567890abcdef1234567890abcdef12345678"),
chainId: chainId(1),
window: VaultUserActivityTimeWindow.LastWeek,
});
if (error) {
return <p>Error: {error.message}</p>;
}
if (loading) {
return <p>Loading transactions…</p>;
}
// data: VaultUserActivityResult