GLU BUILD SPEC Ov0.1 · 2026-08-13ON-CHAIN MINT & REDEEM

GLU on Solana — mint & redeem

The first on-chain stage: a Solana program that mints GLU against the real basket and redeems it into the holder's coin of choice — with every thin or missing leg handled honestly instead of pretended away.

Companion to the design spec and methodology · chain selection research 2026-08-13 (Solana vs TON vs Robinhood Chain)

O0 · Chain decision

Why Solana, in one table

The mint's job is to buy the basket. That requires each leg to exist as a token, with liquidity or an issuer mint, plus FX oracles to price what's missing. Only Solana clears more than one leg.

RequirementSolanaTONRobinhood Chain
USD stableUSDC ~$10B nativeUSDT $670MUSDG $353M
EUR stableEURC native (top-2 chain)none~2 tokens of dust
JPY stablenone credible (JPYC not yet deployed)nonenone
GBP stableVGBP (thin, issuer-mintable)nonenone
CHF stableCHFAU ~CHF 50M (Aug 2026)nonenone
Gold / treasuries / TIPSPAXG+XAUt0 · USDY $740M · TIPonXAUt0 ($230k depth)tokens exist, no liquidity
FX oraclesPyth EUR/JPY/GBP/CHF/XAUfeeds exist, assets don'tzero FX feeds
Verdict4 of 5 legs buyable today1 of 51 of 5
O1 · What v1 is

An honest scope: the currency-basket GLU

V1 mints the FX layer of GLU: a token backed by the five-currency basket in index weights, priced by the live index. It does not yet pay the CPI drip — that requires the yield sleeves (USDY / TIPon) of phase 2. The distinction is disclosed on the mint page, not buried.

v1 backing target · per 100 GLU-usd of supply

40 USDC · 30 EURC-usd · 15 synthetic-JPY (held as USDC, valued via Pyth USD/JPY) · 10 VGBP-usd · 5 CHFAU-usd

Each leg carries a mode badge that the program enforces: DEX swapped on Jupiter at mint-time bands · INVENTORY pre-minted from the issuer, replenished in batches · SYNTHETIC no token exists; exposure is oracle-valued, collateral held in USDC and disclosed as unhedged.

LegWeightTokenModeExecution / notes
USD40%USDCDEXstays as deposit currency, no swap needed
EUR30%EURCDEXJupiter route, max 30 bp slippage vs Pyth EUR/USD; Circle Mint as batch backstop
JPY15%— (USDC held)SYNTHETICvalued via Pyth USD/JPY; swapped to real JPYC the day it deploys on Solana — registry slot is ready
GBP10%VGBPINVENTORYprogram vault pre-stocked via VNX primary mint; mints pause the leg to synthetic if inventory runs dry
CHF5%CHFAUDEXINVENTORYDEX while the new pools hold; AllUnity primary mint as fallback
SOL railSOLDEXaccepted for mint deposits and redemption payouts, swapped at the edge via Jupiter — never held as backing (70%/yr real volatility fails the same test as BTC in methodology §M3)
The rule from the methodology page applies verbatim: disclose the lag, don't fake the leg. A synthetic-JPY slice valued by a real oracle is honest; a "JPY token" with $3k of liquidity is not.
O2 · Architecture

One Anchor program, three actors

Program · glu_mint

The vault and the rules

Anchor program owning the GLU mint (Token-2022) and one vault ATA per leg. Enforces NAV bands, fee, caps, staleness and drift checks. Holds no admin power over user funds beyond the published rules.

Oracle poster

The index, signed on-chain

The glu-index server (glu.booga.me) gains a poster keypair and writes W(t) + the 30-day forward drip into a NavState PDA daily. On-chain checks cap NAV movement at 5 bp/day vs the posted path — a stolen poster key cannot rug the NAV.

Keeper

Rebalancing, off the hot path

A cron bot (same Fly box) that tops up VGBP/CHFAU inventory, executes Jupiter rebalances back to target weights when drift > 1pp, and reports vault composition to the dashboard's audit table.

Mint flow (user pays USDC)

Quote

Client fetches NavState → price = NAV × (1 + fee). Fee 25 bp to the buffer. NAV staleness > 48h ⇒ mints halt (redeems never halt). Deposits in SOL are swapped to USDC via Jupiter in the same transaction before the deposit lands.

Deposit & mint

User transfers USDC; program mints GLU immediately at quoted NAV. No swaps in the user's transaction — deposits land in the USDC vault. Cheap, atomic, no slippage attribution problems.

Rebalance (async)

Keeper sweeps USDC into EURC/CHFAU via Jupiter within its band, pulls VGBP from inventory, leaves the JPY slice in USDC. Vault drift vs target weights is public state.

Redeem flow (user chooses the payout coin)

Burn

User burns GLU; payout value = NAV × (1 − fee).

Pay in kind

If the chosen coin (USDC / EURC / VGBP / CHFAU) sits in the vault in size: direct transfer at Pyth cross-rate. Always available: USDC. Payout in SOL is also offered — vault USDC is swapped to SOL via Jupiter at redemption time, within the same slippage band.

Backstop

If the chosen leg's vault balance is short, the payout falls back to USDC automatically — and the quote says so before the user signs. Redemption is never gated, only re-denominated.

// account sketch Config { admin, poster, fee_bp: 25, supply_cap, per_tx_cap, paused_mints } NavState { nav_usd_e9, drip_bp_day_e2, posted_at, forward_path_hash } Leg[5] { mint, weight_bp, mode: Dex|Inventory|Synthetic, pyth_feed, band_bp } Vault { ata_usdc, ata_eurc, ata_vgbp, ata_chfau } // + buffer ATA // instructions init · post_nav · mint_glu · redeem_glu · rebalance(keeper) · set_leg(admin, timelocked) · pause_mints(admin) — no pause_redeems exists
O3 · Guardrails

What can go wrong, and what the program does about it

RiskGuardrail
Poster key stolen → fake NAVOn-chain drift cap: NAV may move ≤ 5 bp/day from the previously posted path; larger moves need the timelocked admin path
Oracle stalenessNAV > 48h old: mints halt, redeems continue at last NAV − a widening haircut band
Thin-leg liquidity crunch (VGBP/CHFAU)Legs flip to synthetic mode automatically; composition change is an on-chain event the dashboard surfaces
Depeg of a component stablePyth cross-checks each leg vs its FX rate; a leg trading > 150 bp off peg freezes that leg's payouts (USDC fallback) and stops keeper buys
Program bug drains vaultv1 caps: $50k supply, $2k per tx, upgrade authority behind a 48h timelock, then burned at phase 3
LegalThis is the regulated object the spec's §7 describes. v1 ships devnet-first, then a capped mainnet pilot with a geo-notice; no yield is paid in v1 (currency basket only), which keeps it maximally distant from a security while still proving the machine
O4 · Build order

Three milestones, each shippable

StageShipProves
O-1Devnet program + mint page. Anchor program with mock legs (devnet SPL stand-ins), NAV posted from the real glu-index server, mint/redeem UI added to glu.booga.me behind a devnet bannerThe full loop: index → posted NAV → mint → burn → payout choice
O-2Mainnet pilot, $50k cap. Real USDC/EURC/CHFAU legs, VGBP inventory, synthetic JPY, keeper live, vault composition in the dashboard audit tableReal-asset execution inside the slippage bands; the honest-legs design under real liquidity
O-3Phase 2 alignment. USDY/TIPon yield sleeves fund the CPI drip → v1 "currency GLU" upgrades toward true index GLU; JPYC leg activates when it lands on SolanaThe purchasing-power guarantee, not just the FX basket