Daily rebalancing live on Solana

Index funds for
Solana memecoins

Pick a basket, set a weighting rule, deposit SOL. Pump Index sizes every buy, then rebalances back to target every day — trimming winners, topping up the rest.

Dry-run mode is on by default. Your keys never touch the browser.

Pump Blue Chips · market cap · cap 30%

10.482 SOL

Unrealised P&L

+0.482 SOL · +4.82%

PUMP30.00%3.000 SOL+7.4%
FARTCOIN18.00%1.800 SOL+2.1%
PNUT14.00%1.400 SOL-1.8%
BILLY12.00%1.200 SOL+11.9%

Curated baskets

Four indexes ship with the app

Or build your own from any Solana token — up to 50 per index, with the same weighting engine and daily rebalancing.

Four building blocks

Every decision is a rule, not a judgement call

The index

A named list of token mints. Four curated baskets, or build your own from any Solana token — up to 50.

Blue Chips · AI Agents · Zoo · Degen Small Caps

The weighting rule

Market cap, √ market cap, equal weight, or custom percentages you type yourself.

40 / 20 / 20 / 10 / 5 / 5

The max-weight cap

Stops one token swallowing the index. PUMP would be ~65% of Blue Chips; the cap clips it to 30% and spreads the excess.

Default 30% · ignored for custom weights

The drift threshold

Decides when a difference is worth trading, so tiny price wiggles don't burn more in swap fees than they correct.

Default 2%

The cycle

From price feed to signed swap

01

Fetch live prices

All pools per token from DexScreener, batched 30 mints per request.

02

Keep only trusted quotes

SOL, USDC and USDT-quoted pools only. Exotic quote pools derive price through another token — that chain breaks.

03

Take the median

Across ~23 trusted PUMP pools all near $0.00181, one 5,000× outlier can't move the answer.

04

Size the orders

Weights are capped, normalised to 100%, converted to SOL, and dust below 0.02 SOL is re-spread.

05

Rebalance daily

A minute loop watches for UTC day rollover. Overweight sells first — the sells fund the buys.

06

Book the P&L

Cost basis is retired pro-rata per token, so realised profit stays correct after a full exit.

The rebalance queue

Sells before buys, because the sells fund the buys

A doubled PNUT position went from 20% to 29% of the basket. The excess is sold once, and the proceeds fund three buys that total exactly the same amount. Anything inside the 2% drift threshold is left alone.

  • Plans are marked consumed before the first swap goes out — a crash can't replay the queue.
  • One execution per index at a time; concurrent attempts are rejected.
  • Every order's outcome is recorded before anything else can throw.
Order queue · Pump ZooNETS TO 0.0000 SOL
SELL

PNUT

overweight 8.9%

0.4244 SOL
BUY

FARTCOIN

underweight 4.0%

0.1918 SOL
BUY

BILLY

underweight 3.0%

0.1414 SOL
BUY

MICHI

underweight 1.9%

0.0912 SOL
4 orders · min trade 0.02 SOLOpen all in Jupiter

Manual mode

No wallet key configured.

Every order becomes a prefilled Jupiter link. Copy the amount, sign in your own wallet, tick it off, press Apply. Your key never leaves your wallet and nothing the app runs can move funds.

Automated mode

Dedicated wallet key on your server.

The server quotes Jupiter, signs, sends, and polls the signature until Solana confirms. Sells run first and sequentially, slippage capped at 1%.

Dry run

On by default, stays on.

Real Jupiter quotes for every order, logged in full, signed and sent for none of them. Watch several complete daily cycles before you turn it off.

Self-hosted · no accounts

Run it on your own machine, with your own keys

React and Vite on the front, a small Express server that owns all state and does all the maths. The order queue is built server-side — the client can only flip a filled flag.

23

tests covering weighting, orders and cost basis

1

JSON state file, written atomically

60s

scheduler loop watching for UTC rollover

Questions

Before you deposit

How is P&L calculated?+

Per token, not per portfolio. Sell a quarter of a 10 SOL position for 3 SOL and a quarter of the book cost — 2.5 SOL — is retired, leaving 7.5 SOL of basis and banking +0.5 SOL realised. Realised P&L stays on screen after a full exit, which is exactly when it matters.

Can two indexes claim the same tokens?+

No. Curated baskets deliberately overlap — BILLY and MICHI sit in two, ZEREBRO and PIPPIN in two others. One wallet backs all of them, so a shared balance is split proportionally across every index claiming it instead of being double-counted.

What if a token can't be priced?+

It's retried against its full pool list. If it still has no SOL, USDC or USDT-quoted pool, it is dropped rather than priced on unverifiable data, and the UI tells you it was excluded.

How do I build my own index?+

One search box handles a name or ticker (fuzzy search), a single contract address (exact match), or many addresses pasted at once. Every result shows the truncated mint and its DEX, because copycats with inflated stats rank above the real token.

How is the API secured?+

It binds to localhost by default and refuses to start when exposed without a 16+ character access key. Every route needs a bearer token compared in constant time, only allow-listed origins may call it, and the wallet key lives in a .env file that never reaches the browser.

What does it deliberately not do?+

It doesn't pick tokens for you, doesn't model slippage or fees in its estimates, and doesn't protect you from the asset class. It's a calculator and an execution queue — not advice.