Skip to content

Repository files navigation

Aave Dashboard

RPC-based dashboard for exploring Aave protocol data across chains and pools.

Aave dashboard UI by BGD

Deploy with Vercel

Running locally

cp .env.example .env    # configure environment
pnpm install
pnpm dev                # dev server at localhost:3000
pnpm build              # production build
pnpm start              # serve production build

Works best with an Alchemy API key — it provides RPC access to all supported chains through a single key. The key is server-side only and never exposed to the client. See .env.example.

Adding a new chain

Chain and pool configuration lives in src/constants.ts. RPC client setup is in src/server/api/fallbacks/utils/chains.ts.

  1. Import the chain from viem/chains and add it to allChains
  2. Add block time to BlockPeriod record
  3. Add pool addresses to marketHelper for each pool on that chain:
[newChain.id]: {
  [PoolsWithVersions.AAVEV3]: {
    POOL: markets.AaveV3NewChain.POOL,
    UI_POOL_DATA_PROVIDER: '0x...', // deployed UiPoolDataProviderV3
    POOL_ADDRESSES_PROVIDER: markets.AaveV3NewChain.POOL_ADDRESSES_PROVIDER,
    AAVE_PROTOCOL_DATA_PROVIDER_ADDRESS: markets.AaveV3NewChain.AAVE_PROTOCOL_DATA_PROVIDER,
  },
}
  1. Add event pool mappings — add entries to poolsWithChainId and the PoolsWithEvents type
  2. Ensure RPC access — if the chain is on Alchemy, add its subdomain to alchemySubdomains in chains.ts. Otherwise, set a RPC_CHAINNAME env var or rely on the chain's public RPC.
  3. Update event store in src/store/reservesModalSlice.ts

Data fetching (getAllReservesDataRPC, getEmodesDataRPC) already iterates all chains in marketHelper — no changes needed there for a new chain with existing pool types.

Addresses come from @aave-dao/aave-address-book.

Adding a new pool

  1. Add enum values in src/constants.ts:
    • ReservePool — pool name
    • PoolsWithVersions — pool + version combo (e.g. NEWPOOLV3)
  2. Add addresses to marketHelper for each chain
  3. Add fetch calls in getAllReservesDataRPC.ts and getEmodesDataRPC.ts
  4. Update pool detection in src/helpers/getPoolByName.ts if the pool has a non-standard name

Adding new data fields

  1. Update types:
  2. Format the field in src/server/api/fallbacks/utils/formatReserveData.ts
  3. Add table column in src/helpers/tableHelpers.tsx:
    • Add key to ColumnKeys enum
    • Add column definition to columns array
    • Add render function to renderFunctions
  4. Add CSV export in src/helpers/csvExport.ts
  5. Check sorting — add custom sort logic in src/helpers/sorting.ts if needed

UiPoolDataProviderV3 helper contract

The dashboard reads reserve data on-chain via UiPoolDataProviderV3 — a view-only contract that aggregates all pool state in a single RPC call. The contract source and deployment scripts live in contracts/, following the standard Foundry project layout:

contracts/
  src/contracts/data-fetching/   # contract sources
  scripts/                       # deployment scripts (.s.sol)
  foundry.toml
  .env.example

Setup

cd contracts
cp .env.example .env   # fill in RPC endpoints and etherscan API keys
forge install bgd-labs/aave-v3-origin foundry-rs/forge-std

RPC endpoints are required for deployment and on-chain verification. See contracts/.env.example for the full list and public defaults.

Deploying to a new chain

The contract needs two Chainlink price oracle addresses:

  • networkBaseTokenPriceInUsdProxyAggregator — base token (e.g. ETH/USD)
  • marketReferenceCurrencyPriceInUsdProxyAggregator — market reference currency

See contracts/scripts/DeployUiPoolDataProvider.s.sol for per-chain oracle addresses.

Deploy with Foundry:

cd contracts
make deploy-ledger contract=scripts/DeployUiPoolDataProvider.s.sol:ChainName chain=chainname

License

This project is licensed under the MIT License.

Copyright 2026 Aave DAO

About

Explore Aave reserves across different chains

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages