RPC-based dashboard for exploring Aave protocol data across chains and pools.
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.
Chain and pool configuration lives in src/constants.ts. RPC client setup is in src/server/api/fallbacks/utils/chains.ts.
- Import the chain from
viem/chainsand add it toallChains - Add block time to
BlockPeriodrecord - Add pool addresses to
marketHelperfor 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,
},
}- Add event pool mappings — add entries to
poolsWithChainIdand thePoolsWithEventstype - Ensure RPC access — if the chain is on Alchemy, add its subdomain to
alchemySubdomainsinchains.ts. Otherwise, set aRPC_CHAINNAMEenv var or rely on the chain's public RPC. - 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 @bgd-labs/aave-address-book.
- Add enum values in
src/constants.ts:ReservePool— pool namePoolsWithVersions— pool + version combo (e.g.NEWPOOLV3)
- Add addresses to
marketHelperfor each chain - Add fetch calls in
getAllReservesDataRPC.tsandgetEmodesDataRPC.ts - Update pool detection in
src/helpers/getPoolByName.tsif the pool has a non-standard name
- Update types:
src/server/types.ts—ReserveItemInitial(raw RPC response)src/types.ts—ReserveItem(formatted for UI)
- Format the field in
src/server/api/fallbacks/utils/formatReserveData.ts - Add table column in
src/helpers/tableHelpers.tsx:- Add key to
ColumnKeysenum - Add column definition to
columnsarray - Add render function to
renderFunctions
- Add key to
- Add CSV export in
src/helpers/csvExport.ts - Check sorting — add custom sort logic in
src/helpers/sorting.tsif needed
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
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.
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
This project is licensed under the MIT License.
Copyright 2026 Aave DAO