Live at trackdefi.app — free, no login, no wallet connection.
Paste any wallet address and see all of its liquidity-pool positions on Aerodrome, Velodrome, Uniswap, PancakeSwap and Ramses, across every network in the coverage table — including the gauge-staked (and MasterChef-staked) ones that most trackers miss. Read-only: trackdefi never asks for private keys or seed phrases, and cannot move funds. No token, no presale, no airdrop.
Three things were missing from the trackers we tried:
- Staked positions disappear. Once you stake an LP position in a gauge, the NFT leaves your wallet and most trackers stop seeing it. trackdefi reads the gauge too, so a staked position looks exactly like an unstaked one.
- APR is usually a lie for your position. Pool APR is an average. What a
concentrated position actually earns depends on its range — and a position
sitting out of range earns nothing in fees, no matter what the pool's number
says. trackdefi computes the APR of the position, and shows
0%when that is the truth. - You shouldn't have to connect a wallet to look at public data. LP positions are on-chain and public. Reading them needs an address, not a signature.
When a token has no reliable price, trackdefi shows — instead of guessing.
| Exchange | Networks |
|---|---|
| Aerodrome | Base |
| Velodrome | Optimism, Unichain, Ink, Mode, Soneium, Fraxtal, Lisk, Swell, Metal L2, Superseed, Celo |
| Uniswap v3 | Base, Optimism, Ethereum, Arbitrum, Robinhood Chain, Unichain, BNB Chain |
| Uniswap v4 | Robinhood Chain, BNB Chain |
| PancakeSwap v3 | BNB Chain |
| Ramses | Robinhood Chain, HyperEVM |
Classic (v2-style) and concentrated positions, staked or not, with pending fees
and emissions, plus veAERO / veVELO governance locks. For each position it also
shows what that position itself is earning now — 0% in fees when it is out of
range.
What it doesn't do: no profit and loss or impermanent loss since a position was opened, no alerts, and no transactions of any kind. The roadmap tracks what's next; how it works explains where every number comes from.
- Next.js (App Router) + TypeScript — site + API
- viem — read-only on-chain access (Sugar contracts for the Aerodrome/ Velodrome family; the NonfungiblePositionManager for Uniswap v3; the PositionManager and StateView for Uniswap v4; the same NonfungiblePositionManager plus the MasterChef v3 for PancakeSwap v3; Ramses' own position manager and its gauges, which pay emissions without staking)
- DefiLlama, then DexScreener — USD prices (free, no key); when neither covers a token, its price is read from a pool on the same network. DefiLlama also provides pool yield data
- Languages — English (default, no URL prefix) and Brazilian Portuguese
(
/pt-br); adding one is a dictionary folder plus a line inapp/i18n/config.ts - Vercel — hosting; Vercel Analytics — cookieless usage stats
Protocol-specific code lives behind one interface (core/types.ts →
ProtocolAdapter). Adding a network or exchange means writing an adapter and
registering it in core/adapters/registry.ts — the API, the price layer and the
UI don't change.
Money is handled as BigInt throughout the core; floats appear only at the
display edge.
core/ pure engine, testable without a UI
types.ts LpPosition + ProtocolAdapter interface
chain.ts per-network viem readers (RPC from env or public endpoints)
service.ts adapters + prices -> JSON DTO (USD computed server-side)
guards.ts TTL cache, rate limiter, concurrency semaphore
math/ Q96 concentrated-liquidity math (BigInt)
prices/ price clients (DefiLlama, DexScreener)
yields/ position-level APR ("what is this position earning now")
adapters/ aerodrome/ (Sugar family) · uniswap-v3/ · registry.ts
app/ Next.js site + /api/positions
[lang]/ every page, once per language (w/[address] wallet results,
how-it-works, glossary, roadmap, changelog, feedback)
i18n/ languages, dictionaries (messages/<lang>/) and SEO helpers
ui/ components, number/date formatting
proxy.ts language routing: English has no URL prefix, others do (/pt-br)
tests/ unit tests with frozen real-wallet fixtures
poc/ CLI + validation scripts (see below)
npm install
npm run devDev mode is slow for full scans — use a production build to measure real speed:
npm run build && npm run startScripts:
| Command | What it does |
|---|---|
npm test |
unit tests (Vitest) |
npm run typecheck |
tsc --noEmit |
npm run poc -- 0x… |
print a wallet's positions from the terminal |
npm run check-api |
hit the API handler against the live chain |
npx tsx poc/validate-batch.ts |
full validation battery (run before releases) |
npx tsx poc/validate-live.ts https://trackdefi.app |
validate a deployed site over HTTP |
npx tsx poc/find-wallets.ts |
find active LP wallets from recent events |
npx tsx poc/check-outage.ts |
verify a dead RPC returns a clean 502 |
Copy .env.example. All variables are optional:
NEXT_PUBLIC_SITE_URL— canonical origin used for metadata, canonicals and the sitemap. Defaults tohttps://trackdefi.app.BASE_RPC_URLS— comma-separated RPC URLs (e.g. an Alchemy key) to speed up scans. Server-side only, never exposed to the browser. Falls back to public RPCs. Every network has its own (OPTIMISM_RPC_URLS,BSC_RPC_URLS, …; the full list isrpcEnvincore/chains.ts). The "earning now" fee window needs an RPC that serves historical state, which most public RPCs don't.TRACKDEFI_FIXTURE— dev only; serve a frozen DTO instead of reading the chain. Ignored on Vercel.
See DEPLOY.md for the step-by-step (GitHub + Vercel, free tier).
- Pin TypeScript to 5.x — TS 7 (the native port) breaks Next 16's TS integration.
- Not financial advice. Verify data on-chain before acting. Data can lag the chain by up to a minute.