Frontend interface for the Aeternum protocol.
This repository contains the dashboard for managing the Aeternum vault. It connects to an Ethereum contract, displays balances, tracks recovery status, and provides vault actions.
- Connect wallet with RainbowKit
- Register a vault with backup address and inactivity period
- Live recovery countdown timer
- Deposit, send, withdraw, ping, and cancel recovery actions
- Transaction history and balance chart
- Responsive desktop/mobile layout
- ETH/USD price feed from CoinGecko
- Styled with Tailwind CSS and shadcn/ui primitives
- Node.js 20+ recommended
- npm
- A WalletConnect project ID
- A Sepolia RPC provider URL (Alchemy, Infura, or similar)
- A deployed Aeternum contract address on Sepolia
npm installCopy the example environment file and update the values:
cp .env.example .env.localRequired variables:
NEXT_PUBLIC_WALLETCONNECT_PROJECT_IDNEXT_PUBLIC_SEPOLIA_CONTRACT_ADDRESSNEXT_PUBLIC_ALCHEMY_RPC_URLNEXT_PUBLIC_INDEXER_URL
npm run devOpen http://localhost:3000 in your browser.
npm run dev— start the Next.js development servernpm run build— build the app for productionnpm run start— serve the production build locallynpm run lint— run ESLint checks
layout.tsx— application shell, providers and metadataglobals.css— global styling and theme tokensicon.png— app iconproviders.tsx—wagmi,RainbowKit, and React Query providerspage.tsx— root application entryvault/layout.tsx— layout grid for desktop and mobilevault/page.tsx— renders the main vault dashboardvault/activity/page.tsx— vault activity and history viewdocs/— documentation pageslayout.tsx— docs layout with sidebarpage.tsx— docs landing page[...slug]/page.tsx— dynamic doc pages
components/layout/— header, sidebar, mobile drawer, grid layoutcomponents/vault/— vault dashboard cards, actions, countdown, transactions, and modalsVaultDashboard.tsx— root vault page compositionactions/— action buttons and button rowbalance/— balance display and asset rowscards/— dashboard cardscountdown/— recovery timermodals/— vault action modalstransactions/— transaction list and rows
components/chart/— balance chart and range selectorcomponents/common/— shared UI pieces used throughout the appcomponents/ui/— shadcn/ui primitives used by the interfacecomponents/docs/— documentation-specific componentsCallout.tsx— callout boxes for docsDocsBreadcrumb.tsx— breadcrumb navigationDocsHeader.tsx— doc page headersDocsPageFooter.tsx— doc page footer with navigationDocsSidebar.tsx— sidebar navigationFunctionCard.tsx— function reference cardsMdxComponents.tsx— MDX component mappingsStepList.tsx— step-by-step listsdiagrams/— diagram components
hooks/contracts/reads/— read-only contract hookshooks/contracts/writes/— contract write hooks for interactionshooks/useEthPrice.ts— CoinGecko price datahooks/useVaultTransactions.ts— transaction event historyhooks/useBalanceHistory.ts— balance chart datahooks/useCountdown.ts— live countdown timer logichooks/useMounted.ts— client-side hydration guard
graphql/queries.ts— GraphQL query definitions for indexer/API operations
lib/wagmi.ts— chain and connector configurationlib/contracts.ts— contract address mapping and constantslib/abi.ts— typed vault ABI forviemlib/utils.ts— utility helpers and common functionalitylib/formatters.ts— formatting helpers for currency, dates, and addresseslib/constants.ts— application constants and timing valueslib/eventLogs.ts— event log parsing utilitieslib/indexer.ts— indexer integration helperslib/docs.ts— documentation navigation and structure
types/vault.ts— vault contract types, transaction event shapes, countdown typestypes/index.ts— re-exports for convenience
config/chains.ts— chain configuration for wagmiconfig/site.ts— site metadata and external links
content/docs/— documentation content in MDX formatarchitecture/— architecture documentationcontract-reference/— contract API referencefaq.mdx— frequently asked questionshow-it-works/— how the protocol worksintroduction/— introduction to Aeternumroadmap/— project roadmapuser-guide/— user guides
The repository is organized around a Next.js app router, modular vault components, contract hooks, and MDX documentation.
aeternum-app/
│
├── app/
│ ├── api/
│ │ └── sentry-example-api/
│ │ └── route.ts
│ ├── docs/
│ │ ├── [...slug]/
│ │ │ └── page.tsx
│ │ ├── layout.tsx
│ │ └── page.tsx
│ ├── global-error.tsx
│ ├── globals.css
│ ├── icon.png
│ ├── layout.tsx
│ ├── page.tsx
│ ├── providers.tsx
│ └── vault/
│ ├── activity/
│ │ └── page.tsx
│ ├── layout.tsx
│ └── page.tsx
│
├── components/
│ ├── chart/
│ │ ├── BalanceChart.tsx
│ │ ├── ChartLegend.tsx
│ │ ├── ChartPanel.tsx
│ │ └── TimeRangeSelector.tsx
│ ├── common/
│ │ ├── AddressDisplay.tsx
│ │ ├── AeternumLogo.tsx
│ │ ├── ConfirmDialog.tsx
│ │ ├── ETHAmount.tsx
│ │ ├── LoadingSkeleton.tsx
│ │ ├── PriceChange.tsx
│ │ ├── USDAmount.tsx
│ │ └── WalletButton.tsx
│ ├── docs/
│ │ ├── diagrams/
│ │ │ ├── HowItWorksDiagram.tsx
│ │ │ ├── Phase2ArchitectureDiagram.tsx
│ │ │ └── RollingCursorDiagram.tsx
│ │ ├── Callout.tsx
│ │ ├── DocsBreadcrumb.tsx
│ │ ├── DocsHeader.tsx
│ │ ├── DocsPageFooter.tsx
│ │ ├── DocsSidebar.tsx
│ │ ├── FunctionCard.tsx
│ │ ├── MdxComponents.tsx
│ │ └── StepList.tsx
│ ├── layout/
│ │ ├── CommunityLinks.tsx
│ │ ├── DashboardGrid.tsx
│ │ ├── Header.tsx
│ │ ├── MobileDrawer.tsx
│ │ ├── Sidebar.tsx
│ │ ├── SidebarNavGroup.tsx
│ │ └── SidebarNavItem.tsx
│ ├── ui/
│ │ ├── button.tsx
│ │ ├── card.tsx
│ │ ├── dialog.tsx
│ │ ├── input.tsx
│ │ ├── label.tsx
│ │ ├── select.tsx
│ │ ├── separator.tsx
│ │ ├── skeleton.tsx
│ │ ├── sonner.tsx
│ │ └── tooltip.tsx
│ └── vault/
│ ├── actions/
│ │ ├── ActionButtonRow.tsx
│ │ ├── DepositButton.tsx
│ │ ├── PingButton.tsx
│ │ ├── RegisterButton.tsx
│ │ ├── SendButton.tsx
│ │ └── VaultActions.tsx
│ ├── balance/
│ │ ├── AssetRow.tsx
│ │ └── BalanceDisplay.tsx
│ ├── cards/
│ │ ├── BalanceCard.tsx
│ │ ├── TopAssetsCard.tsx
│ │ └── VaultHistoryCard.tsx
│ ├── countdown/
│ │ ├── CountdownBox.tsx
│ │ └── CountdownDisplay.tsx
│ ├── modals/
│ │ ├── CancelRecoveryModal.tsx
│ │ ├── DepositModal.tsx
│ │ ├── RegisterModal.tsx
│ │ ├── SendModal.tsx
│ │ ├── UpdateConfigModal.tsx
│ │ └── WithdrawModal.tsx
│ ├── transactions/
│ │ ├── EmptyTransactionState.tsx
│ │ ├── TransactionList.tsx
│ │ └── TransactionRow.tsx
│ └── VaultDashboard.tsx
│
├── config/
│ ├── chains.ts
│ ├── docs-nav.ts
│ └── site.ts
│
├── content/
│ └── docs/
│ ├── architecture/
│ │ ├── chainlink-integration.mdx
│ │ ├── rolling-cursor.mdx
│ │ ├── security.mdx
│ │ └── smart-contract.mdx
│ ├── contract-reference/
│ │ ├── events.mdx
│ │ ├── immutable-limits.mdx
│ │ ├── read-functions.mdx
│ │ └── user-functions.mdx
│ ├── faq.mdx
│ ├── how-it-works/
│ │ ├── automatic-recovery.mdx
│ │ ├── inactivity-timer.mdx
│ │ ├── key-actors.mdx
│ │ └── the-vault.mdx
│ ├── introduction/
│ │ ├── quick-start.mdx
│ │ └── what-is-aeternum.mdx
│ ├── roadmap/
│ │ ├── phase-2-hybrid-wallet.mdx
│ │ ├── phase-3-multichain.mdx
│ │ └── phase-4-financial-primitive.mdx
│ └── user-guide/
│ ├── connect-wallet.mdx
│ ├── register-vault.mdx
│ ├── testnet-walkthrough.mdx
│ └── vault-actions.mdx
│
├── graphql/
│ └── queries.ts
│
├── hooks/
│ ├── contracts/
│ │ ├── reads/
│ │ │ ├── useIsRegistered.ts
│ │ │ ├── useTimeUntilRecovery.ts
│ │ │ └── useVaultConfig.ts
│ │ └── writes/
│ │ ├── useCancelRecovery.ts
│ │ ├── useDeposit.ts
│ │ ├── usePing.ts
│ │ ├── useRegister.ts
│ │ ├── useSend.ts
│ │ ├── useUpdateBackupAddress.ts
│ │ ├── useUpdateInactivityPeriod.ts
│ │ └── useWithdrawAll.ts
│ ├── useBalanceHistory.ts
│ ├── useCountdown.ts
│ ├── useEthPrice.ts
│ ├── useMounted.ts
│ └── useVaultTransactions.ts
│
├── lib/
│ ├── abi.ts
│ ├── constants.ts
│ ├── contracts.ts
│ ├── docs.ts
│ ├── eventLogs.ts
│ ├── formatters.ts
│ ├── indexer.ts
│ ├── utils.ts
│ └── wagmi.ts
│
├── public/
│ ├── assets/
│ │ └── ethereum.png
│ └── logo.png
│
├── types/
│ ├── index.ts
│ └── vault.ts
│
├── .env.example
├── .gitignore
├── .hintrc
├── components.json
├── eslint.config.mjs
├── instrumentation-client.ts
├── instrumentation.ts
├── next.config.ts
├── package-lock.json
├── package.json
├── postcss.config.mjs
├── README.md
├── sentry.edge.config.ts
├── sentry.server.config.ts
├── tailwind.config.ts
└── tsconfig.json
- Built with Next.js 16, React 19, Tailwind CSS v4,
viem,wagmi, and RainbowKit. - The countdown timer is implemented in
hooks/useCountdown.ts. - Contract interactions are managed using
hooks/contracts/*.
To extend the app, start with the vault UI in components/vault/, the contract hooks in hooks/contracts/, and helper logic in lib/.