Dashboard for monitoring the Aave Delivery Infrastructure — browse envelopes, messages, and payloads with links to Governance V3 proposals. Includes Slack alerts for events requiring immediate attention.
This application performs scans on configured chains every two minutes, capturing new events emitted by CrossChainController contracts and storing them in a database. In the event of an RPC query range failure, the application will automatically retry during the next retry cycle, which occurs every 5 minutes. The app's status page provides an overview of the scan progress and details of the specific ranges.
Delivery of an envelope is confirmed upon reaching consensus and logging a successful EnvelopeDeliveryAttempted event. Envelopes not delivered within 60 minutes are marked as delivery failures, triggering a notification on Slack.
The application uses PostgreSQL with Drizzle ORM for data storage, and tRPC for type-safe data operations. The front-end is built with Next.js and styled with Tailwind CSS. Scheduled scans run via Vercel Cron Jobs and notifications are sent through the Slack API.
- Node.js >= 18
- pnpm
- PostgreSQL database
Clone the repository:
git clone git@github.com:bgd-labs/adi-dashboard.git
cd adi-dashboardCreate a PostgreSQL database and push the schema:
npx drizzle-kit pushCopy .env.example to .env and fill in the values:
cp .env.example .envThe key variable is DATABASE_URL — a PostgreSQL connection string (e.g. postgresql://user:password@host:5432/dbname).
pnpm install
pnpm devThe app is designed for Vercel. Set these environment variables in your Vercel project:
DATABASE_URL— PostgreSQL connection stringCRON_SECRET— protects cron API endpointsSLACK_BOT_TOKEN/SLACK_CHANNEL_ID— Slack notificationsICON_GENERATOR_KEY— protects the icon generator endpointENVIRONMENT_STAGE—PRODorPREPRODCOINGECKO_API_KEY— for token price dataALCHEMY_API_KEY— for transaction tracing
Cron schedules are configured in vercel.json.
To monitor a new chain, the chain must be supported by the viem/chains package.
Insert a new row into the CrossChainControllers table:
INSERT INTO "CrossChainControllers" (
chain_id, address, created_block, rpc_urls, rpc_block_limit,
chain_name_alias, native_token_name, native_token_symbol
) VALUES (
42161,
'0x...CrossChainController address...',
12345678,
ARRAY['https://arb1.arbitrum.io/rpc'],
500,
'Arbitrum',
'Ethereum',
'ETH'
);Required fields: chain_id, address, created_block, rpc_urls
Optional fields: rpc_block_limit (default 500), chain_name_alias, analytics_rpc_url, native_token_name, native_token_symbol
To enable low-balance alerts for the new chain, add thresholds in src/app/api/cron/notify/balances/route.ts.
Scanning starts automatically on the next cron cycle (every 2 minutes).
MIT © 2026 Aave DAO
Created by BGD Labs.