Parametric on-chain insurance for autonomous AI agents and humans. Premiums burn $LUMINA. Triggers mint zero-coupon ClaimBonds. Settled by Chainlink-grade oracles.
Lumina Protocol is a parametric on-chain insurance system deployed on Base. It pays out automatically when an oracle confirms a measurable event — a price drop, a stablecoin depeg, a sustained borrow-rate spike — without claims adjusters, voting, or human intervention.
The protocol is built around four primitives:
createPolicy and triggers fire when the asset drops by the configured threshold from that strike.DEDUCTIBLE_BPS = 2000).0xdead. There is no mint function.The current architecture is fully operational on Base Sepolia: six Flash Shields are live, premiums flow into the burner, the marketplace is open (3% fee burn — 1.5% seller + 1.5% buyer — USDC settlement), the Chainlink-backed oracle (BTC/USD + ETH/USD) feeds shields via the FlashShieldAdapter UUPS bridge, and a self-service onboarding endpoint lets agents mint API keys with a single wallet signature.
This whitepaper documents what is deployed today on V5.3. Forward-looking statements are confined to Section 14 (Roadmap) and Section 15 (Risks). Every numeric claim, contract address, and function signature is grounded in the protocol source code and the live /health endpoint of the production API.
Decentralized finance has matured into a programmable economy where bots and AI agents now execute the majority of on-chain volume. They can borrow, lend, swap, hedge, and rebalance — but they cannot insure themselves against the few events that wipe entire strategies in a single block: flash crashes, stablecoin depegs, rate spikes that force forced liquidations.
Existing crypto insurance — Nexus Mutual, InsurAce, Sherlock — is built around discretionary claims: an event is reported, a committee votes, a payout is issued (or denied) days or weeks later. That is fundamentally incompatible with autonomous agents that need a deterministic, sub-minute response.
Lumina is parametric: every policy specifies an objective trigger condition (e.g., “BTC drops ≥ 5% in any rolling 1-hour window”). When an oracle confirms the condition, the payout fires automatically inside the same transaction. There is no claim form, no committee, no delay, no possibility of subjective denial.
Lumina is also agent-first. The API exposes a relayer pattern (POST /api/v1/policies) where the protocol pays the gas and an agent only needs an x-api-key header. Maintaining 24 individual skill files to streamline the most common operations means an agent can integrate Lumina end-to-end in under one hour.
Twelve smart contracts collaborate to form the live protocol. They split across five concerns:
| Concern | Contracts | Role |
|---|---|---|
| Token | LuminaTokenV2 · FounderVesting · TreasuryVesting | Fixed-supply ERC-20, founder lock with AltSeason gates, treasury drip |
| Bonds | BondVault · ClaimBond | Single 70M reserve; ERC-1155 zero-coupon bonds, $1 face, 730d maturity |
| Core | CoverRouterV2 · PolicyManagerV2 · TWAPBurner · AdaptiveFeeDistributor | Buy / redeem / cancel; premium math; routes 100% of premiums to burn |
| Products | BaseFlashShield + 6 Flash shield implementations behind FlashShieldAdapter | One contract per BTC/ETH trigger window; UUPS proxies; adapter bridges to the legacy IShieldV2 surface |
| Marketplace | LuminaBondMarketplace · BuybackEngine | Secondary trading of ClaimBonds; commit-reveal MEV protection |
| Oracles & automation | LuminaOracleV2 · CapacityOracle · SolvencyOracle · ShieldKeeper | EIP-712 signed proofs; LUMINA TWAP price; solvency-ratio monitoring (200/100/70% bands); trigger automation |
The end-to-end flow from a buyer's perspective is four steps:
CoverRouterV2.quotePremium(productId, coverageAmount) — returns expected premium and payout.CoverRouterV2.purchasePolicy(productId, coverageAmount, asset) (or purchasePolicyFor(...) via the relayer).TWAPBurner, then calls PolicyManagerV2.recordPolicy(...) to register the policy. PolicyCreated is emitted.Triggers are permissionless: anyone can submit a valid oracle proof.
PriceProof(int256 price, bytes32 asset, uint256 verifiedAt) and signs it with the trusted oracleKey.CoverRouterV2.submitTrigger(productId, policyId, oracleProof).PolicyManagerV2.triggerPayout, which calls the shield's verifyAndCalculate. The shield checks the EIP-712 signature against LuminaOracleV2.oracleKey(), validates the proof timestamp window, the asset, the policy's coverage window, and the trigger condition.BondVault.issueBond(buyer, payoutUSD) mints ERC-1155 ClaimBonds for the buyer in the corresponding maturity epoch.Bonds mature exactly 730 days after issuance. After maturity:
BondVault.redeemBond(epochId, usdAmount).CapacityOracle).Bonds remain transferable through the secondary marketplace before maturity. Once they mature, they can no longer be listed (the marketplace's list() rejects matured bonds).
Lumina V5.3 ships six parametric Flash products: three BTC drawdown windows and three ETH drawdown windows. Each shield is a UUPS proxy inheriting from BaseFlashShield; each verifies its own trigger condition inside _doVerifyAndCalculate. The on-chain product registry uses canonical names of the form FLASHBTC1H-001 — the productId a caller passes is keccak256(canonicalName).
The FlashShieldAdapter (UUPS) is a bridge contract: it exposes the slim T-30a Flash shields through the legacy IShieldV2 surface that PolicyManagerV2 still calls, so the new shields plug into the existing core without redeploying it.
Pay out when BTC's spot price drops from the strike snapshot taken at createPolicy by the configured threshold inside the policy window. Premium is quoted per $1,000 of cover (payout = $800 LUMINA per $1,000 cover after the 20% deductible).
| Shield | Trigger | Window | Premium / $1k | Canonical name |
|---|---|---|---|---|
| Flash BTC 1h | BTC −2.5% from strike | 1h | $2.92 | FLASHBTC1H-001 |
| Flash BTC 24h | BTC −6% from strike | 24h | $52.60 | FLASHBTC24-001 |
| Flash BTC 48h | BTC −10% from strike | 48h | $148.67 | FLASHBTC48-001 |
| Shield | Adapter address (Base Sepolia) |
|---|---|
| Flash BTC 1h | 0x5d50310B9166184e822cD5368F51C1409713054f |
| Flash BTC 24h | 0x475b3F712707F61824122a94fE78b106260F8882 |
| Flash BTC 48h | 0xdc6387E86F7D852D1f99F4009cFd8AdC2d500298 |
| Shield | Trigger | Window | Premium / $1k | Canonical name |
|---|---|---|---|---|
| Flash ETH 1h | ETH −4% from strike | 1h | $1.68 | FLASHETH1H-001 |
| Flash ETH 24h | ETH −8.5% from strike | 24h | $45.80 | FLASHETH24-001 |
| Flash ETH 48h | ETH −14% from strike | 48h | $123.01 | FLASHETH48-001 |
| Shield | Adapter address (Base Sepolia) |
|---|---|
| Flash ETH 1h | 0x57869AD3E7C56B0c96F357179DD231b407C88338 |
| Flash ETH 24h | 0x4fD09cF98F6814Cc8b33C2E491429f59d0bCf089 |
| Flash ETH 48h | 0x9696CFFD7dE8B1e16F83Dcc798c5CE69a61C884C |
| Parameter | Value | Source |
|---|---|---|
| Minimum cover | $100 USDC | BaseFlashShield._minCoverage() |
| Deductible | 20% (DEDUCTIBLE_BPS = 2000) | Payout = $800 LUMINA per $1,000 cover |
| Margin | 2.00× (marginBps = 20000) — effective multiplier ~1.60× | configureProduct(...) |
| Strike snapshot | Spot at createPolicy | BaseFlashShield._strikeAt(...) |
| Bond maturity | 730 days from trigger | BondVault.BOND_MATURITY_SECONDS |
| L2 sequencer check | active in BaseFlashShield; address(0) on Base Sepolia → no-op | Chainlink L2 Sequencer Uptime Feed (mainnet wiring) |
Earlier V5.1 testnet builds also exposed a Flash BTC 4h window, a USDT Micro Depeg shield, and an Aave USDC Rate Shock shield. In V5.3 those products are not user-facing: the 4h BTC window was retired, the Micro Depeg product was dropped, and Rate Shock remains paused on-chain pending real-Aave wiring.
V5.3 publishes a flat premium per $1,000 of cover for each shield. The buyer-facing surface is:
The protocol still applies a deterministic risk-loading inside the shield (marginBps = 20000, i.e. 2.00×) before the payout is computed; the published $/$1k figure already incorporates that loading. There is no probability factor exposed to callers — the buyer only ever needs to read the premium per $1k and the multiplier.
cover × (10000 - DEDUCTIBLE_BPS) / 10000 = 80% of cover (deductible 20%).If the formula evaluates to zero (very small covers), the contract floors the premium at 1 micro-USDC ($0.000001).
Before recording a policy, PolicyManagerV2 queries BondVault.availableCapacityUSD(). If the policy's potential payout would push the vault below its backing floor (committed ≤ 50% of reserve value, i.e. ~200% backing), the purchase reverts with InsufficientCapacity.
Capacity is computed on a 1-hour TWAP of LUMINA price, not the spot price. This anti-MEV safeguard prevents an attacker from manipulating spot to either deny coverage or force the protocol into thin reserves.
BondVault enforces an additional throttle on burns/redemptions: cap 1.08% per week, FIFO queue, so a single block cannot drain the reserve even if a large cohort triggers simultaneously.
If the LUMINA TWAP price falls below 0.005 USD, isProtocolAutoPaused() returns true and new purchases revert. The breaker uses hysteresis: once tripped, it requires the price to recover above 0.008 USD (the RESET_PRICE_FOR_NEW_POLICIES) before re-arming. This avoids flapping near the threshold.
| Shield | Window | Drop from strike | Premium / $1k | marginBps |
|---|---|---|---|---|
| Flash BTC 1h | 3600s | 2.5% | $2.92 | 20000 |
| Flash BTC 24h | 86400s | 6% | $52.60 | 20000 |
| Flash BTC 48h | 172800s | 10% | $148.67 | 20000 |
| Flash ETH 1h | 3600s | 4% | $1.68 | 20000 |
| Flash ETH 24h | 86400s | 8.5% | $45.80 | 20000 |
| Flash ETH 48h | 172800s | 14% | $123.01 | 20000 |
Earlier versions of Lumina used four separate vaults (one per asset class). The current architecture collapses them into a single BondVault holding 70 million $LUMINA. The vault is never funded directly by users; it receives its allocation at LuminaTokenV2.initialize() as part of the genesis distribution.
The vault has only two state-changing surfaces:
issueBond(buyer, payoutUSD) — called by PolicyManagerV2 when a policy triggers. Mints ERC-1155 ClaimBonds in the maturity epoch corresponding to now + 730 days.redeemBond(epochId, usdAmount) — called by holders post-maturity. Burns the holder's ERC-1155 balance, transfers $LUMINA at the current price.ClaimBonds are ERC-1155 tokens grouped by monthly maturity epoch. The tokenId is the epoch identifier, computed as year × 100 + month (e.g., 202805 = May 2028). All bonds maturing in the same calendar month share the same tokenId and are fungible within that epoch.
Critically, 1 token = $1 USD face value at maturity. Quantities are integer dollars, NOT 6-decimal USDC base units. A bond row with balance 4000 represents $4,000 of face value, not $0.004.
Bonds are non-transferable peer-to-peer by design. The contract overrides _update to allow only mints (from == 0), burns (to == 0), and transfers via authorized operators. The LuminaBondMarketplace is the only authorized operator, ensuring the protocol captures the secondary-trade fee.
BOND_MATURITY_SECONDS = 730 days. A bond minted today by a triggered policy matures exactly two years from now. Maturity is fixed at issuance and does not change if the bond is sold on the marketplace — the buyer redeems at the same date.
The protocol tracks totalCommittedUSD (sum of issued bonds) and totalReservedUSD (sum of capacity reservations from active policies). Their sum may never exceed SAFETY_FACTOR_BPS × reserveValueUSD / 10000. burnFromReserves — an admin path used to retire excess collateral — is capped at 5% of vault reserves per transaction.
The shield oracle is LuminaOracleV2.sol at 0x9bfa2f7A5098C89b8740D1694d1f716A0Bd871dD (Base Sepolia). It reads live Chainlink BTC/USD and ETH/USD feeds directly — no off-chain EIP-712 signer is required on the path; the legacy EIP-712 verifier remains in the contract for backwards compatibility and for future feeds that lack a Chainlink aggregator.
The legacy EIP-712 envelope (kept for upgrade compatibility) is:
For Flash BTC and Flash ETH the shield calls Chainlink's latestRoundData() path inside FlashShieldAdapter; the legacy EIP-712 path is only invoked when the asset has no native Chainlink feed.
The shield calls IOracleV2(oracle).verifyPriceProofEIP712(price, asset, verifiedAt, signature) inside _doVerifyAndCalculate. The returned signer must equal the oracle's oracleKey().
The lumina-api service exposes POST /api/v1/oracle/sign-proof, which:
verifiedAt = now.ORACLE_PRIVATE_KEY held in Railway's secret store.oracleProof ready to pass into submitTrigger.The signer's address is auditable on-chain via LuminaOracleV2.oracleKey(). Any agent can fetch it via GET /api/v1/oracle/signer before submitting a trigger.
submitTrigger has no access control. The argument is solely the cryptographic proof — a forged or stale proof reverts in the shield's verification path. This means anyone (the policy buyer, a keeper bot, an MEV searcher) can submit a valid proof and trigger a payout. The policy buyer is the sole beneficiary regardless of who calls.
Two additional oracles serve internal protocol needs:
CapacityOracle.getLuminaPrice() — provides a 1-hour TWAP of LUMINA's spot price, used by capacity and solvency checks.SolvencyOracle — monitors the BondVault's solvency ratio (200/100/70% bands); consumed by burnFromReserves to block burns that would compromise solvency.$LUMINA is an ERC-20 + ERC-20Burnable token deployed behind a UUPS proxy. Maximum supply is 100_000_000 * 1e18, fixed at construction. There is no mint function. Supply only decreases via burn.
The constructor enforces assert(totalSupply() == MAX_SUPPLY) after the genesis distribution, and totalBurned() returns MAX_SUPPLY - totalSupply().
Minted exactly once in initialize() across five immutable address arguments:
| Allocation | Tokens | % | Recipient | Behaviour |
|---|---|---|---|---|
| Bond Reserve | 70,000,000 | 70% | BondVault | Backs all claims; only leaves via redeemBond at maturity. |
| CEX/DEX Liquidity | 14,000,000 | 14% | CEX Liquidity Reserve | Earmarked for centralized + decentralized exchange listings. |
| Founder | 8,000,000 | 8% | FounderVesting | Locked behind 2-of-3 AltSeason oracle gates — see § 8.4. |
| LBP | 5,000,000 | 5% | LBP Deposit | Liquidity Bootstrapping Pool (Fjord Foundry) at TGE. |
| Treasury | 3,000,000 | 3% | TreasuryVesting | 180-day lock, then 250k/month drip — see § 8.5. |
| Total | 100,000,000 | 100% |
Only the TWAPBurner contract holds BURNER_ROLE on the token. This role allows burnFrom to be called on any address — necessary because the burner pulls $LUMINA from the protocol's intermediate buffers and burns it. DEFAULT_ADMIN_ROLE manages role assignments. Renouncing DEFAULT_ADMIN_ROLE permanently locks BURNER_ROLE management; the deployer should only renounce after the final TWAPBurner deployment is confirmed.
The 8M founder allocation unlocks via FounderVesting V2: three independent gates, first-to-trigger wins, then three tranches of ~3.333M each release every 31 days.
FounderVesting V2 is deployed at 0xfF4Db529bBCd4E3CC091E07b7845241EB4762832 and is wired to LuminaOracleV2 for the live ETH/USD and ETH/BTC reads.
Releases are onlyOwner; one release per 30-day window, capped at the monthly maximum.
The 100% of USDC routed to the TWAPBurner is not always burned outright. Before any LUMINA is bought and burned, the burner consults AdaptiveFeeDistributor to decide how the incoming USDC should split across four buckets:
0xdead (deflationary pressure).The split is not static. It adapts on two axes: protocol solvency and LUMINA market momentum. The 4×4 product of these two axes yields 16 possible distributions, each pre-tuned to one regime. The full matrix is implemented in AdaptiveFeeDistributor._lookupDistribution(sLevel, mLevel) and verified by 16-of-16 quadrant unit tests.
Solvency tiers — computed by SolvencyOracle as the ratio of (BondVault LUMINA reserve × spot price) to total committed obligations in USD, expressed in basis points:
Momentum buckets — computed from the ratio between the short-window TWAP (30 minutes) and the long-window TWAP (1 day) of LUMINA's spot price:
Each cell shows the basis points routed to burn / buyback / ops / maintenance, summing to 10000 (100%):
| Solvency \ Momentum | RALLY | STABLE | DECLINE | CRASH |
|---|---|---|---|---|
| ULTRA | 9500/0/0/500 | 9000/500/0/500 | 8500/1000/0/500 | 7500/2000/0/500 |
| HEALTHY | 9000/500/0/500 | 8500/800/200/500 | 7000/2100/200/700 | 5500/3500/200/800 |
| STRESSED | 7500/1800/200/500 | 5500/3500/200/800 | 3800/5500/200/500 | 1800/7500/200/500 |
| CRISIS | 4800/4500/200/500 | 2800/6500/200/500 | 800/8500/200/500 | 0/9600/200/200 |
Bold cell = HEALTHY/STABLE = the default operating regime. The four FALLBACK_*_BPS constants in TWAPBurner mirror this cell as the safety net if the distributor reverts.
AdaptiveFeeDistributor.sol and exercised by 16-of-16 quadrant unit tests in AdaptiveFeeDistributorTest.t.sol. However, on Sepolia today, the momentum input is held at neutral (10000 bps) in SolvencyOracle.sol: a deep LUMINA/USDC liquidity pool has not yet been deployed on Sepolia, so the momentum oracle has no real on-chain TWAPs to read.
In practice, this means the matrix runs on its solvency axis only: at runtime it collapses to the STABLE column. The full 16-quadrant behavior activates automatically once three pieces ship together:
release/v5.1-pre-mainnet, audit fix H-10) is cherry-picked into SolvencyOracle.sol.BuybackSpender contract is deployed and wired as the consumer of buybackReserve — the missing piece that converts accumulated USDC back into LUMINA buybacks on price drawdowns.The sequencing is intentional: deploying momentum logic before a deep liquidity pool exists would produce a dead signal indistinguishable from neutral, with no off-chain symptom to flag the regression. Each piece lands when its dependency is in place.
Every USDC entering the protocol routes through TWAPBurner:
CoverRouterV2._purchase calls twapBurner.receivePremium(premium) after each policy purchase. The transfer is atomic with the purchase.LuminaBondMarketplace.executeBuy deducts a 3% fee on every secondary trade, also routed via receivePremium.USDC accumulates inside the burner until executeBurn() is called.
| Parameter | Default | Effect |
|---|---|---|
burnCooldown | 900s (15 min) | Minimum gap between burns. |
minBurnAmount | 1 USDC | Below this, the call reverts with "Below minimum". |
maxBurnAmount | 10,000 USDC | Hard cap per call to limit slippage in a single swap. |
adaptiveModeEnabled | true | Routes to AdaptiveFeeDistributor for dynamic 4-bucket split. Falls back to fixed bps if the distributor reports unhealthy. |
| Bucket | BPS | % | Constant |
|---|---|---|---|
| Burn (USDC → buy LUMINA → burn) | 8500 | 85% | FALLBACK_BURN_BPS |
| Buyback Reserve | 800 | 8% | FALLBACK_BUYBACK_BPS |
| Maintenance Reserve | 500 | 5% | FALLBACK_MAINTENANCE_BPS |
| Ops Reserve | 200 | 2% | FALLBACK_OPS_BPS |
The Burn bucket buys $LUMINA via Uniswap V3 (with Aerodrome as a sequential fallback) and sends to 0xdead. Each successful burn emits:
executeBurn is external nonReentrant — no onlyAuthorized. Any wallet can call it. The cooldown gates how often, and the min/max amounts gate per-call slippage. Anyone can be the burn keeper.
ClaimBonds mature in 730 days. Holders who want liquidity sooner sell on the secondary market at a discount; buyers earn an implied yield by waiting for maturity. The market is permissionless and on-chain.
ClaimBond.setApprovalForAll(marketplace, true) (one-time per epoch family).LuminaBondMarketplace.list(epochId, amount, priceUSDC). The contract verifies balanceOf(seller, epochId) ≥ amount and that block.timestamp < maturityDate(epochId).safeTransferFrom, stores a Listing struct, and emits Listed(listingId, seller, epochId, amount, priceUSDC).priceUSDC.executeBuy(listingId).TWAPBurner), pays the seller, and transfers the ERC-1155 amount to the buyer.The seller can cancel any of their own listings via cancel(listingId). The bond returns to the seller's wallet. There is no on-chain self-buy enforcement, but the frontend disables the Buy button when seller == connected wallet.
A separate BuybackEngine consumes the buyback bucket from TWAPBurner using a commit-reveal scheme to prevent front-running. Operations are batched and revealed in a separate transaction; private mempool routing is recommended on the ops side.
All core contracts are UUPS upgradeable with _authorizeUpgrade gated by DEFAULT_ADMIN_ROLE. Upgrades require a single signer today and will move to a multisig before mainnet (see Roadmap).
Internal audit reports are public:
docs/SECURITY-AUDIT-V5.md — latest internal audit covering the current architecture.docs/audit/v5.1-uups/ — per-chapter analysis: math edge cases, admin key risk, race conditions, time-based dependencies, oracle integration.docs/audit/PHASE4-AUDIT-REPORT.md — bond + marketplace flow.The protocol carries an accepted risk note: no Tier-1 third-party audit pre-mainnet. The founder's bug bounty + multisig + cold-storage key go live at T+30d post-mainnet deploy.
docs/ACCESS-CONTROL-MATRIX.md documents every privileged role, its current holder, and rotation policy. Key roles:
DEFAULT_ADMIN_ROLE on every UUPS contract — deployer wallet today, multisig at mainnet.BURNER_ROLE on LuminaTokenV2 — only the TWAPBurner.onlyRouter on PolicyManagerV2 — only CoverRouterV2.oracleKey on LuminaOracleV2 — the off-chain signer's address (rotatable).Documented in docs/audit/THREAT-MODEL.md. Highest residual risks:
BaseFlashShield sanity-checks each round (positive answer, fresh updatedAt, round consistency) and reverts on stale data; the L2 sequencer uptime feed is also checked on Base mainnet (address(0) → no-op on Sepolia).An autonomous agent can mint its own API key without human intervention. The flow is two on-line operations:
"Lumina onboarding for {wallet} at {timestamp}" with the agent's wallet.POST /api/v1/agent/onboard with {walletAddress, label?, signature, timestamp}.The API verifies the signature, mints a lk_<64hex> key (SHA-256 hashed at rest), and returns the plaintext exactly once. Limits: max 3 active keys per wallet, 10 onboard attempts per IP per hour.
The signature feature for agents: POST /api/v1/policies. The API's relayer wallet signs purchasePolicyFor on-chain on the agent's behalf. The agent does not need ETH for gas; only USDC for the premium (held by the agent's wallet, pulled by the contract). Idempotency keys prevent double-spend on retry.
The lumina-api repo ships 24 skill files at docs/skills/ — one per common operation. Each file follows a fixed structure: a "What this does" plain-English block, a copy-pasteable LLM prompt, env vars, curl + TypeScript + Python examples, request/response schemas, and error codes. Designed to be dropped straight into an agent's tool list or system prompt.
| Method | Path | Auth | Purpose |
|---|---|---|---|
| GET | /health | none | Live state — chain, relayer, contract addresses |
| GET | /products | none | List 6 active Flash shields + capacity |
| GET | /products/:id/quote?cover=N | none | Premium & payout for a coverage amount |
| POST | /api/v1/agent/onboard | EIP-191 sig | Self-service mint API key |
| GET | /api/v1/agent/keys | x-api-key | List caller's keys |
| DELETE | /api/v1/agent/keys/:keyId | x-api-key | Revoke caller's own key |
| POST | /api/v1/policies | x-api-key | Buy policy via relayer (agent pays no gas) |
| GET | /api/v1/policies | x-api-key | List caller's policies |
| GET | /api/v1/bonds/:wallet | x-api-key | Caller's bond positions |
| POST | /api/v1/redeem | x-api-key | Index a redemption (on-chain redeem signed by agent) |
| POST | /api/v1/marketplace/list | x-api-key | Index a listing |
| POST | /api/v1/marketplace/buy | x-api-key | Index a buy |
| POST | /api/v1/oracle/sign-proof | x-api-key | Get a fresh EIP-712 PriceProof for submitTrigger |
| GET | /api/v1/oracle/signer | x-api-key | Read the current oracle signer address |
FlashShieldAdapter.The protocol is unaudited by a Tier-1 firm at the time of writing. Internal audits are public but not a substitute. A reentrancy, storage-collision, or oracle-manipulation bug in the BondVault or shield path could result in loss of all collateral.
Triggers depend on signed EIP-712 proofs from an off-chain signer. If the signer's key is compromised, every active policy can be falsely triggered, draining the BondVault. Mitigations are roadmap items (HSM, multisig signer).
Bond redemption pays out in $LUMINA at the current TWAP price. If LUMINA's secondary market liquidity is thin at the moment of redemption, holders may receive less USD-equivalent than the bond's nominal face value.
Parametric on-chain insurance is novel. It may be classified as a security, a derivative, or a regulated insurance product in some jurisdictions. The protocol's use is at the user's own legal risk.
This whitepaper describes the protocol as deployed on 2026-05-14 to Base Sepolia (V5.3). It is not an offer to sell or a solicitation to buy any token, security, or insurance product. It is provided for technical and educational purposes. Forward-looking statements in Section 14 are aspirational; nothing in this document is a guarantee of future deployment, merger of features, or financial return.
Lumina Protocol is open-source software published under the MIT license at github.com/org-lumina. The contracts are deployed and operated by the founder team during testnet; on mainnet, governance and parameter authority migrate to a multisig and ultimately to on-chain governance.
ClaimBonds are parametric payout instruments, not insurance contracts in the regulated sense. There is no claims adjuster, no underwriter, no policyholder agreement. A trigger is a deterministic on-chain event; a payout is a deterministic on-chain transfer.
$LUMINA is a utility token with three programmatic uses: (i) it is the asset paid out by ClaimBond redemptions; (ii) the protocol's burn engine permanently destroys it as premiums and marketplace fees flow through; (iii) it is the unit of account for the BondVault's solvency. It is not designed or marketed as an investment; any speculative trading is outside the protocol's intent.
The protocol does not target users in any specific jurisdiction. Operators, integrators, and end users are responsible for their own regulatory compliance.
V5.3 keeps the V5.2 core addresses (no redeploy of BondVault, PolicyManager, etc.) and adds six new shield adapters. The canonical source is always https://lumina-api-production-ac85.up.railway.app/health; if any address in this document drifts from /health, treat /health as authoritative.
| Contract | Address |
|---|---|
| LuminaTokenV2 | 0x62C0b58bB30CA857674ec593F1e23B3F15266680 |
| BondVault | 0x193acBc1EdC5E565a4aBE96941C7E7AeF637B6EC |
| ClaimBond | 0xaa57Ab52Eb00f296Ad4CFA9E9c201f3737271FB4 |
| CoverRouter | 0xcdB70B40e6a3DEac3189185d947A0e458518F566 |
| PolicyManager (proxy) | 0x546C07e07DeBCdbf7a2A7Ef12C38c8c8fcAFcDd8 |
| PolicyManager (Sprint Cleanup impl) | 0xdE41D414eD191A1090546078DF8e120c196Be22F |
| FounderVesting V2 | 0xfF4Db529bBCd4E3CC091E07b7845241EB4762832 |
| LuminaOracleV2 | 0x9bfa2f7A5098C89b8740D1694d1f716A0Bd871dD |
| TWAPBurner | 0x242d76082856901b4ba1E7c50C022D46a6941bC0 |
| AdaptiveFeeDistributor | 0xeC7841A4a9ecfb8cA58391E233A645B021c59D54 |
| BuybackEngine | 0x56B5a1115B0d9781E7358521204d927d2F80d8B4 |
| LuminaBondMarketplace | 0x0938205f4cBe5F572656533FC930FFce6F5F4345 |
AdaptiveFeeDistributor split: 85% Burn / 8% Buyback / 2% Operations / 5% Maintenance.
| Adapter | Address |
|---|---|
| Flash BTC 1h | 0x5d50310B9166184e822cD5368F51C1409713054f |
| Flash BTC 24h | 0x475b3F712707F61824122a94fE78b106260F8882 |
| Flash BTC 48h | 0xdc6387E86F7D852D1f99F4009cFd8AdC2d500298 |
| Flash ETH 1h | 0x57869AD3E7C56B0c96F357179DD231b407C88338 |
| Flash ETH 24h | 0x4fD09cF98F6814Cc8b33C2E491429f59d0bCf089 |
| Flash ETH 48h | 0x9696CFFD7dE8B1e16F83Dcc798c5CE69a61C884C |
| Service | Endpoint / address |
|---|---|
| API base URL | https://lumina-api-production-ac85.up.railway.app |
| Block explorer | sepolia.basescan.org |
| RPC | https://sepolia.base.org |
/health before integrating.
| BondVault | The single contract holding the 70M $LUMINA reserve that backs every ClaimBond. |
| ClaimBond | An ERC-1155 zero-coupon bond, $1 face value, 730-day maturity, redeemable in $LUMINA. |
| CoverRouterV2 | The user-facing entry point: quotePremium, purchasePolicy, submitTrigger. |
| EIP-191 | The "personal_sign" standard used for the agent onboarding signature. |
| EIP-712 | The typed-data signing standard used for oracle PriceProofs. |
| Epoch | A monthly maturity bucket. Encoded as year × 100 + month. All bonds maturing in the same calendar month share an epoch. |
| FlashShield | One of the six price-drop products covering BTC and ETH across 1h, 24h, and 48h windows (three per asset). |
| FlashShieldAdapter | UUPS bridge contract that exposes the slim T-30a Flash shields through the legacy IShieldV2 surface consumed by PolicyManagerV2. |
| Kink Model | The capacity-driven pricing model that tightens premium as utilization rises. |
| LuminaOracleV2 | The EIP-712 verifier that authorizes shield triggers from a trusted off-chain signer. |
| oracleKey | The Ethereum address whose private key signs every PriceProof; rotatable by the contract owner. |
| Parametric | Insurance whose payout depends solely on a measurable, objective trigger — no claims adjustment. |
| Relayer | The API wallet that signs purchasePolicyFor transactions on the agent's behalf, paying gas. |
| Skill file | A Markdown document at lumina-api/docs/skills/ with a copy-pasteable LLM prompt + code examples. |
| TWAPBurner | The contract that converts USDC premiums into $LUMINA via Uniswap V3 and burns it. |
| UUPS | Universal Upgradeable Proxy Standard. Allows in-place implementation upgrades by an admin. |
All technical claims in this whitepaper trace to one of these sources: