IPO Leaderboard API

Queue positions for the token allocation program, ranked from on-chain pool deposits with a time-in-queue multiplier and an optional trading-volume bonus. Read-only except for /rerank and wallet linking.

Leaderboard

Responses carry queue position only. Deposits, multipliers, volume and scores are never served: publishing them would expose every user's balance and trading activity, and a public score reads as an allocation promise.

GET /health

Service health plus latest-snapshot metadata.

{ "ok": true, "latestSnapshotId": 42, "asOf": 1756677600, "users": 1337,
  "canRerank": true, "volumeFetchedAt": 1756677000, "volumeDegraded": false }

GET /leaderboard?limit=50&offset=0

The current queue, paginated.

{ "snapshotId": 42, "asOf": 1756677600, "users": 1337, "limit": 50, "offset": 0,
  "rows": [ { "rank": 1, "user": "0xabc…" }, … ] }

GET /leaderboard/:address

One user's queue position.

{ "snapshotId": 42, "asOf": 1756677600, "users": 1337, "user": "0xabc…", "rank": 17 }

GET /snapshots?limit=20

Ids of retained past rankings, newest first (limit max 100).

{ "snapshotIds": [42, 41, 40, …] }

GET /snapshots/:id?limit=50&offset=0

A past ranking, same shape as /leaderboard.

POST /rerank

Trigger a hot re-rank; responds with the fresh snapshot's metadata.

{ "snapshotId": 43, "asOf": 1756677660, "users": 1337, "volumeFetchedAt": 1756677000 }

Wallet linking

Credits a trading wallet's volume to a depositing account. The wallet (not the account) signs an EIP-712 message; a per-(account, wallet) nonce makes each signature single-use. An account may link at most 20 wallets, and a wallet linked to one account must be unlinked before it can move to another (409 otherwise).

GET /linkedWallets/:address

Wallets currently linked to an account.

{ "account": "0xabc…", "wallets": ["0xdef…"] }

GET /linkNonce/:account/:wallet

The nonce the next link/unlink signature must carry.

{ "account": "0xabc…", "wallet": "0xdef…", "nonce": 3 }

POST /linkWallet

Link a wallet. Body: { account, wallet, nonce, signature }.

// domain
{ "name": "IPO Leaderboard", "version": "1", "chainId": <CHAIN_ID> }
// types
LinkWallet(address account, address wallet, uint256 nonce)
// message: the lowercased account + wallet and the nonce from /linkNonce

POST /unlinkWallet

Unlink a wallet. Same body and signature scheme as /linkWallet.