Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.lumina-org.com/llms.txt

Use this file to discover all available pages before exploring further.

Each shield contract validates params.asset against a hardcoded literal. Sending the wrong asset reverts with InvalidAsset(bytes32) even though the payment token (USDC) is the same for every product. The asset is a what-it-covers tag, not the payment token.

The mapping

The bytes32 hashes below come from the live /products endpoint and match the PRODUCT_ID constants in each Shield*.sol on Base Sepolia.
Product nameExpected assetShield typeDuration
FLASHBTC1H-001BTCFlash crash on BTC1h
FLASHBTC4H-001BTCFlash crash on BTC4h
FLASHBTC24-001BTCFlash crash on BTC24h
FLASHBTC48-001BTCFlash crash on BTC48h
FLASHETH1H-001ETHFlash crash on ETH1h
FLASHETH24-001ETHFlash crash on ETH24h
FLASHETH48-001ETHFlash crash on ETH48h
MICRODEPEG-001USDTStablecoin micro-depeg7d
RATESHOCK-001USDCBorrow-rate spike7d
SDK 0.3.0 auto-resolves both the bytes32 productId hash AND the per-shield asset literal from the canonical name. You don’t need to compute keccak yourself, and you can’t accidentally pair FLASHBTC1H-001 with USDC.
const policy = await lumina.policies.purchase({
  productName: 'FLASHBTC1H-001',     // SDK resolves productId hash + asset='BTC'
  buyer: '0xYourWalletAddress',
  coverageAmount: '50000000',        // $50, paid in USDC
})

REST: pass productName to POST /api/v1/policies

The same shortcut works at the API level. asset is now optional; if you omit it, the API auto-resolves from the registry.
curl -X POST https://lumina-api-production-ac85.up.railway.app/api/v1/policies \
  -H "x-api-key: $LUMINA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "productName":    "FLASHBTC1H-001",
    "coverageAmount": "50000000",
    "buyer":          "0xYourWalletAddress"
  }'

Sandbox: switch shields with productName

POST /sandbox/try now resolves the asset from productId (default FLASHBTC1H-001BTC) or accepts productName for friendlier switching:
curl -X POST https://lumina-api-production-ac85.up.railway.app/sandbox/try \
  -H "Content-Type: application/json" \
  -d '{"productName":"MICRODEPEG-001"}'   # → asset auto-resolves to USDT

Advanced: explicit asset override

If you want to bypass the auto-resolver (e.g. to reproduce a revert in testing), pass the bytes32 explicitly:
import { keccak256, toUtf8Bytes, encodeBytes32String } from 'ethers'

await lumina.policies.purchase({
  productId:    keccak256(toUtf8Bytes('FLASHBTC24-001')),
  buyer:        '0xYourWalletAddress',
  coverageAmount: '50000000',
  asset:        'BTC',                       // MUST match the shield's literal
})
The SDK accepts symbols ('BTC' | 'ETH' | 'USDC' | 'USDT') and encodes them to bytes32. You can also pass a 32-byte hex string directly.

Common errors

ErrorCauseFix
InvalidAsset(bytes32)Sent the wrong asset for that shieldUse productName and let the SDK auto-resolve
unknown_product (400)productName not in the registryCheck the table above; only the 9 listed products are deployed
ProductNotConfiguredproductId hash doesn’t exist on-chainVerify the keccak256 preimage matches a canonical name
InvalidCoverageBelow $100 minimum (MIN_PRICE_FOR_NEW_POLICIES)Increase coverageAmount to ≥ 100000000