TL;DR
A buyer pays a small USDC premium for an active policy. The premium is split byAdaptiveFeeDistributor (85% burn / 8% buyback / 2% ops / 5%
maintenance). If the parametric condition fires inside the cover window, the
shield mints a ClaimBond (ERC-1155, 800 face per $1,000 of cover** (80% payout,
20% deductible). From there the holder has two settlement paths:
- Option A — Hold to maturity. After 730 days, redeem on-chain for LUMINA tokens. The bond’s USD amount is converted to LUMINA at the protocol’s reference LUMINA/USD price, so a cheaper LUMINA at redemption time = more LUMINA per bond unit.
- Option B — Sell now. List the bond on the secondary
marketplace and exit early in USDC. The
marketplace charges a 3% fee (1.5% seller + 1.5% buyer), which is
burned (split via
AdaptiveFeeDistributor). A new holder takes over the same hold-or-sell decision.
End-to-end flow
The 6 steps
Buyer pays a USDC premium
The agent (or human) calls
POST /api/v1/policies with productName,
coverageAmount, and buyer. The relayer signs purchasePolicyFor
on-chain; the buyer’s wallet only spends USDC. CoverRouterV2
forwards the premium to AdaptiveFeeDistributor, which splits
85% burn / 8% buyback / 2% ops / 5% maintenance. The 85% slice is
queued for TWAP burn (LUMINA bought back and burned).Policy recorded
PolicyManagerV2 records (productId, policyId) and snapshots two
prices: the strike (BTC or ETH at purchase, used as the reference
the drop is measured against) and the LUMINA/USD price (used by
BondVault redemption math). The policy is live for durationSeconds.Trigger attempt (or expiry)
During the cover window, anyone can submit an EIP-712 signed price
proof to the shield via
submitTrigger(payload, signature). The
request first lands on the product’s FlashShieldAdapter, which
delegates to BaseFlashShield. The shield verifies the oracle
signature, requires 3 confirmations 60s apart, checks the Base
Sequencer uptime feed, and confirms the drop vs strike. If the window
ends without acceptance, the policy expires — no refund.
See Triggers.ClaimBond minted
On accepted trigger,
BondVault.mint(buyer, faceValueUsd) mints an
ERC-1155 ClaimBond. tokenId == epochId. Face value is 1,000 of cover (80% payout, 20% deductible). One token = $1 face.
Maturity = 730 days from mint.Holder decides — wait or sell
Two paths are available at any moment before maturity:
- Hold until 730d, then call
BondVault.redeem(epochId)and receive LUMINA. Redemption is subject to the per-epoch throttle (108 bps/week) — large epochs may queue FIFO across multiple weeks. - List on the marketplace at a chosen
pricePerUnitin USDC; on fill the seller receives USDC and the buyer takes over the bond.
Settlement
- Redemption (LUMINA).
BondVault.redeem(epochId)converts the bond’s USD amount to LUMINA at the protocol’s reference LUMINA/USD price. If the requested redemption exceeds the weekly throttle, the remainder is FIFO-queued (bonds burned at queue time, LUMINA delivered whenprocessQueue()runs in the target epoch). - Marketplace fill (USDC). Seller receives
pricePerUnit × amount × (1 - 150 bps)(1.5% seller fee) and the buyer pays an extra 1.5% on top; the combined 3% fee (1.5% seller + 1.5% buyer) is burned (split viaAdaptiveFeeDistributor). The new holder inherits the same hold/sell choice.
Option A — Worked example: hold to maturity
A concrete walkthrough with round numbers.| Step | Detail |
|---|---|
| Premium | **1k cover) |
| Cover | $1,000 USDC notional |
| Trigger | BTC drops ≥2.5% from strike inside the 1h window |
| Bond minted | 800 tokens of ClaimBond ($800 face = 80% payout, 20% deductible) |
| Wait | 730 days (maturity) |
| LUMINA/USD at redeem | $0.50 |
| Payout per token | $1 / $0.50 = 2 LUMINA |
| Total redemption | 800 × 2 = 1,600 LUMINA |
Redemption uses
BondVault’s LUMINA/USD reference, with the protocol’s
solvency floor and audit fix C-3 alignment. It is not the spot DEX price
at the millisecond of redeem().Option B — Sell on the marketplace
If the holder doesn’t want 730-day duration risk, they can list:AdaptiveFeeDistributor). Seller exits
in USDC; the new buyer now owns 800 tokens of the bond, which they can
redeem at maturity for LUMINA — same choice the seller had.
Anti-spam floor: pricePerUnit ≥ $1 (audit fix M-3). See
Marketplace for the full surface.
Why this design
ERC-1155 bonds with LUMINA redemption (instead of direct USDC payouts on trigger) buy three properties:- Vault liquidity + anti-run. A flash of simultaneous triggers can’t drain the USDC reserves: bonds queue payouts against a maturity date and the per-epoch throttle, and marketplace listings let bond holders exit in USDC against other buyers’ wallets — not the vault’s. See BondVault throttle.
- Settlement flexibility. Holders pick the asset they want to hold: USDC today via marketplace, or LUMINA at maturity.
- Price alignment with the token. Payouts denominated in LUMINA tie the protocol’s insurance load to its token economics. The purchase-time price snapshot (audit fix H-6) protects buyers from oracle drift between purchase and redemption.
For AI agents
- Decide based on
bond.maturityEpoch - nowand your own duration tolerance. - Use webhooks (
bond_minted,bond_redeemed,listing_purchased) instead of polling. - The SDK exposes
lumina.bonds.list()and the fulllumina.marketplace.*surface; redemption itself is on-chain viaBondVault.redeem(epochId)(see SDK / bonds). - Premium pricing is in USDC; do not quote a user in LUMINA at purchase time. Quote in USDC; explain that redemption is in LUMINA at 730d if the bond is held.
For humans
- The hosted UI at lumina-org.com/app/human walks through purchase, monitoring, and marketplace listing.
- If 730 days is too long, list the bond on the marketplace today and receive USDC.
- Redemption in LUMINA means upside if LUMINA appreciates between trigger and maturity, and downside if it depreciates — but the bond’s on-chain face is denominated in dollars, not in tokens.
FAQ
Why is redemption in LUMINA and not USDC?
Why is redemption in LUMINA and not USDC?
Aligning the protocol’s payout obligations with its native token frees
the BondVault from holding 1:1 USDC reserves against the entire
outstanding face value. USDC reserves still exist (used by the
marketplace), but redemption mints LUMINA. See
“Why ERC-1155 bonds”.
What price of LUMINA is used at redemption?
What price of LUMINA is used at redemption?
The contract uses the protocol’s trusted LUMINA/USD reference at the
moment of
redeem() — sourced from the oracle and bounded by the
snapshot taken at policy purchase (audit fixes C-3 + H-6). It is not
the spot DEX price.Can I sell a partial bond?
Can I sell a partial bond?
Yes. ClaimBond is ERC-1155 — list any
amount ≤ balance and keep the
remainder for redemption.What happens if the bond matures and I don't call redeem?
What happens if the bond matures and I don't call redeem?
Nothing bad. The bond remains valid; you can call
redeem(epochId)
later. There’s no expiry on the right to redeem.Marketplace pays USDC. Why?
Marketplace pays USDC. Why?
Because the marketplace counterparty is another USDC holder, not the
protocol’s reserve. Sellers receive USDC because that’s what the buyer
paid. Only
BondVault.redeem(epochId) interacts with LUMINA.What if my redemption hits the throttle?
What if my redemption hits the throttle?
The bond units beyond
108 bps × epochSupply are FIFO-queued: tokens
are burned at queue time, and LUMINA is delivered when processQueue()
is called in the target epoch. See
BondVault throttle.See also
- Claim Bonds — the ERC-1155 token itself.
- Bond Marketplace — 3% fee (1.5% seller + 1.5% buyer), anti-spam floor, SDK.
- Triggers — how
BaseFlashShielddecides to mint. - Adapters — how
FlashShieldAdapterbridges legacy ABI. - BondVault throttle — anti-run mechanics.