Seguros paramétricos on-chain para agentes de IA autónomos y humanos. Las primas queman $LUMINA. Los disparos generan ClaimBonds cupón-cero. Liquidados por oráculos de grado Chainlink.
Lumina Protocol es un sistema de seguros paramétricos on-chain desplegado sobre Base. Paga automáticamente cuando un oráculo confirma un evento medible —una caída de precio, una pérdida de paridad de un stablecoin, un alza sostenida de tasas de préstamo— sin peritos, sin votaciones y sin intervención humana.
El protocolo se construye sobre cuatro primitivas:
createPolicy y el disparo se produce cuando el activo cae el umbral configurado desde ese strike.DEDUCTIBLE_BPS = 2000).0xdead. No existe función de mint.La arquitectura actual está plenamente operativa en Base Sepolia: seis Flash Shields activos, las primas fluyen al motor de quema, el marketplace está abierto (3% de fee burn — 1.5% vendedor + 1.5% comprador — settlement en USDC), el oráculo Chainlink (BTC/USD + ETH/USD) alimenta los shields a través del bridge UUPS FlashShieldAdapter, y un endpoint de onboarding self-service permite a los agentes generar API keys con una sola firma de wallet.
Este whitepaper documenta lo que está desplegado al día de hoy en V5.3. Las afirmaciones prospectivas se confinan a la Sección 14 (Roadmap) y la Sección 15 (Riesgos). Cada cifra, dirección de contrato y firma de función está fundada en el código fuente del protocolo y en el endpoint en vivo /health de la API productiva.
Las finanzas descentralizadas han madurado hacia una economía programable donde los bots y agentes de IA ejecutan ya la mayoría del volumen on-chain. Pueden prestar, tomar prestado, hacer swaps, cubrirse y rebalancear, pero no pueden asegurarse contra los pocos eventos que liquidan estrategias enteras en un solo bloque: desplomes flash, pérdidas de paridad de stablecoins, picos de tasa que fuerzan liquidaciones.
Los seguros cripto existentes —Nexus Mutual, InsurAce, Sherlock— se estructuran sobre siniestros discrecionales: se reporta el evento, un comité vota, el pago se emite (o se deniega) días o semanas después. Eso es fundamentalmente incompatible con agentes autónomos que requieren una respuesta determinística y de menos de un minuto.
Lumina es paramétrico: cada póliza especifica una condición objetiva de disparo (por ejemplo, "BTC cae ≥ 5% en cualquier ventana móvil de 1 hora"). Cuando un oráculo confirma la condición, el pago se dispara automáticamente dentro de la misma transacción. No hay formulario de siniestro, no hay comité, no hay demora, no existe la posibilidad de denegación subjetiva.
Lumina también es agent-first. La API expone un patrón de relayer (POST /api/v1/policies) en el cual el protocolo paga el gas y el agente solo necesita un encabezado x-api-key. Mantener 24 archivos de skill individuales que estandarizan las operaciones más frecuentes permite a un agente integrarse de extremo a extremo con Lumina en menos de una hora.
Doce contratos inteligentes colaboran para conformar el protocolo en vivo. Se agrupan en cinco áreas:
| Área | Contratos | Función |
|---|---|---|
| Token | LuminaTokenV2 · FounderVesting · TreasuryVesting | ERC-20 de suministro fijo, lock del fundador con compuertas AltSeason, drip de tesorería |
| Bonos | BondVault · ClaimBond | Reserva única de 70M; bonos cupón-cero ERC-1155, valor nominal de USD 1, vencimiento a 730 días |
| Núcleo | CoverRouterV2 · PolicyManagerV2 · TWAPBurner · AdaptiveFeeDistributor | Compra / redención / cancelación; matemática de primas; enruta el 100% de las primas a la quema |
| Productos | BaseFlashShield + 6 shields Flash tras FlashShieldAdapter | Un contrato por ventana de disparo BTC/ETH; proxies UUPS; el adapter expone la superficie legacy IShieldV2 al core |
| Marketplace | LuminaBondMarketplace · BuybackEngine | Trading secundario de ClaimBonds; protección anti-MEV por commit-reveal |
| Oráculos y automatización | LuminaOracleV2 · CapacityOracle · SolvencyOracle · ShieldKeeper | Pruebas firmadas EIP-712; TWAP del precio de LUMINA; monitoreo del ratio de solvencia (bandas 200/100/70%); automatización de disparos |
El flujo de extremo a extremo desde la perspectiva del comprador consta de cuatro pasos:
CoverRouterV2.quotePremium(productId, coverageAmount), que devuelve la prima esperada y el pago.CoverRouterV2.purchasePolicy(productId, coverageAmount, asset) (o a purchasePolicyFor(...) a través del relayer).TWAPBurner y luego invoca PolicyManagerV2.recordPolicy(...) para registrar la póliza. Se emite PolicyCreated.Los disparos son permisionless: cualquiera puede enviar una prueba válida del oráculo.
PriceProof(int256 price, bytes32 asset, uint256 verifiedAt) y la firma con la oracleKey de confianza.CoverRouterV2.submitTrigger(productId, policyId, oracleProof).PolicyManagerV2.triggerPayout, que invoca verifyAndCalculate del shield. El shield verifica la firma EIP-712 contra LuminaOracleV2.oracleKey(), valida la ventana temporal de la prueba, el activo, la ventana de cobertura de la póliza y la condición de disparo.BondVault.issueBond(buyer, payoutUSD) emite ClaimBonds ERC-1155 al comprador en el epoch de vencimiento correspondiente.Los bonos vencen exactamente 730 días después de su emisión. Tras el vencimiento:
BondVault.redeemBond(epochId, usdAmount).CapacityOracle).Los bonos son transferibles a través del marketplace secundario antes del vencimiento. Una vez vencidos, ya no pueden listarse (la función list() del marketplace rechaza bonos vencidos).
Lumina V5.3 ofrece seis productos Flash paramétricos: tres ventanas de drawdown de BTC y tres de ETH. Cada shield es un proxy UUPS que hereda de BaseFlashShield e implementa su disparo en _doVerifyAndCalculate. El registro on-chain de productos usa nombres canónicos del estilo FLASHBTC1H-001; el productId que pasa el llamador es keccak256(canonicalName).
El FlashShieldAdapter (UUPS) es un contrato bridge: expone los shields Flash de la línea T-30a a través de la superficie legacy IShieldV2 que PolicyManagerV2 sigue invocando, de modo que los nuevos shields enchufan en el core sin redesplegarlo.
Pagan cuando el spot de BTC cae desde el strike capturado en createPolicy por el umbral configurado dentro de la ventana de la póliza. La prima se publica por cada USD 1.000 de cobertura (payout = USD 800 en $LUMINA por cada USD 1.000 de cobertura, ya restado el deductible del 20%).
| Shield | Disparo | Ventana | Prima / $1k | Nombre canónico |
|---|---|---|---|---|
| Flash BTC 1h | BTC −2,5% desde el strike | 1h | $2,92 | FLASHBTC1H-001 |
| Flash BTC 24h | BTC −6% desde el strike | 24h | $52,60 | FLASHBTC24-001 |
| Flash BTC 48h | BTC −10% desde el strike | 48h | $148,67 | FLASHBTC48-001 |
| Shield | Dirección del adapter (Base Sepolia) |
|---|---|
| Flash BTC 1h | 0x5d50310B9166184e822cD5368F51C1409713054f |
| Flash BTC 24h | 0x475b3F712707F61824122a94fE78b106260F8882 |
| Flash BTC 48h | 0xdc6387E86F7D852D1f99F4009cFd8AdC2d500298 |
| Shield | Disparo | Ventana | Prima / $1k | Nombre canónico |
|---|---|---|---|---|
| Flash ETH 1h | ETH −4% desde el strike | 1h | $1,68 | FLASHETH1H-001 |
| Flash ETH 24h | ETH −8,5% desde el strike | 24h | $45,80 | FLASHETH24-001 |
| Flash ETH 48h | ETH −14% desde el strike | 48h | $123,01 | FLASHETH48-001 |
| Shield | Dirección del adapter (Base Sepolia) |
|---|---|
| Flash ETH 1h | 0x57869AD3E7C56B0c96F357179DD231b407C88338 |
| Flash ETH 24h | 0x4fD09cF98F6814Cc8b33C2E491429f59d0bCf089 |
| Flash ETH 48h | 0x9696CFFD7dE8B1e16F83Dcc798c5CE69a61C884C |
| Parámetro | Valor | Origen |
|---|---|---|
| Cobertura mínima | USD 100 USDC | BaseFlashShield._minCoverage() |
| Deductible | 20% (DEDUCTIBLE_BPS = 2000) | Payout = USD 800 LUMINA por cada USD 1.000 de cobertura |
| Margin | 2,00× (marginBps = 20000) — multiplicador económico efectivo ~1,60× | configureProduct(...) |
| Strike | Spot al momento de createPolicy | BaseFlashShield._strikeAt(...) |
| Vencimiento del bono | 730 días desde el disparo | BondVault.BOND_MATURITY_SECONDS |
| Check de sequencer L2 | activo en BaseFlashShield; address(0) en Base Sepolia → no-op | Chainlink L2 Sequencer Uptime Feed (cableado de mainnet) |
Los builds anteriores V5.1 de testnet exponían también una ventana Flash BTC 4h, un shield de Micro Depeg de USDT y un shield de Rate Shock de Aave USDC. En V5.3 esos productos no son user-facing: la ventana de 4h se retiró, el Micro Depeg se eliminó y el Rate Shock permanece pausado on-chain a la espera del cableado real con Aave.
V5.3 publica una prima fija por cada USD 1.000 de cobertura para cada shield. La superficie expuesta al comprador es:
El protocolo sigue aplicando una carga de riesgo determinística dentro del shield (marginBps = 20000, es decir 2,00×) antes de computar el payout; la cifra publicada de $/$1k ya incluye esa carga. No se expone ningún factor de probabilidad al llamador: solo necesita leer la prima por $1k y el multiplicador.
cobertura × (10000 - DEDUCTIBLE_BPS) / 10000 = 80% de la cobertura (deductible 20%).Si la fórmula da cero (coberturas muy pequeñas), el contrato impone un piso de prima de 1 micro-USDC (USD 0.000001).
Antes de registrar una póliza, PolicyManagerV2 consulta BondVault.availableCapacityUSD(). Si el pago potencial de la póliza llevaría a la bóveda por debajo de su piso de respaldo (comprometido ≤ 50% del valor de reserva, ~200% de respaldo), la compra revierte con InsufficientCapacity.
La capacidad se computa sobre un TWAP de 1 hora del precio de LUMINA, no sobre el precio spot. Esta salvaguarda anti-MEV impide que un atacante manipule el spot, ya sea para denegar cobertura o para empujar al protocolo a reservas escasas.
BondVault aplica un throttle adicional sobre quemas/redenciones: cap de 1,08% por semana, cola FIFO, de modo que un solo bloque no puede vaciar la reserva incluso si un gran cohorte se dispara simultáneamente.
Si el TWAP del precio de LUMINA cae por debajo de USD 0.005, isProtocolAutoPaused() devuelve true y las nuevas compras revierten. El disyuntor usa histéresis: una vez activado, requiere que el precio se recupere por encima de USD 0.008 (el RESET_PRICE_FOR_NEW_POLICIES) para volver a armarse. Esto evita oscilaciones cerca del umbral.
| Shield | Ventana | Caída desde el strike | Prima / $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 |
Versiones anteriores de Lumina usaban cuatro bóvedas separadas (una por clase de activo). La arquitectura actual las unifica en un único BondVault que custodia 70 millones de $LUMINA. La bóveda nunca se financia directamente con depósitos de usuarios; recibe su asignación en LuminaTokenV2.initialize() como parte de la distribución génesis.
La bóveda solo expone dos superficies con efecto de estado:
issueBond(buyer, payoutUSD): invocado por PolicyManagerV2 cuando una póliza se dispara. Emite ClaimBonds ERC-1155 en el epoch de vencimiento correspondiente a now + 730 días.redeemBond(epochId, usdAmount): invocado por los tenedores tras el vencimiento. Quema el balance ERC-1155 del tenedor y transfiere $LUMINA al precio vigente.Los ClaimBonds son tokens ERC-1155 agrupados por epoch mensual de vencimiento. El tokenId es el identificador del epoch, calculado como year × 100 + month (por ejemplo, 202805 = mayo de 2028). Todos los bonos que vencen en el mismo mes calendario comparten el mismo tokenId y son fungibles dentro de ese epoch.
Críticamente, 1 token = USD 1 de valor nominal al vencimiento. Las cantidades son dólares enteros, NO unidades base de USDC con 6 decimales. Una posición con balance 4000 representa USD 4.000 de valor nominal, no USD 0.004.
Los bonos son no transferibles peer-to-peer por diseño. El contrato sobrescribe _update para permitir solo emisiones (from == 0), quemas (to == 0) y transferencias vía operadores autorizados. El LuminaBondMarketplace es el único operador autorizado, lo que asegura que el protocolo capture la comisión por trading secundario.
BOND_MATURITY_SECONDS = 730 días. Un bono emitido hoy por una póliza disparada vence exactamente dos años después. El vencimiento se fija en la emisión y no cambia si el bono se vende en el marketplace: el comprador redime en la misma fecha.
El protocolo lleva la cuenta de totalCommittedUSD (suma de bonos emitidos) y totalReservedUSD (suma de reservas de capacidad de pólizas activas). Su suma nunca puede exceder SAFETY_FACTOR_BPS × reserveValueUSD / 10000. burnFromReserves —ruta administrativa para retirar colateral excedente— está limitada al 5% de las reservas de la bóveda por transacción.
El oráculo de los shields es LuminaOracleV2.sol en 0x9bfa2f7A5098C89b8740D1694d1f716A0Bd871dD (Base Sepolia). Lee directamente los feeds reales de Chainlink BTC/USD y ETH/USD; no se requiere un firmante off-chain EIP-712 para el camino activo. El verificador EIP-712 legacy queda en el contrato por compatibilidad de upgrade y para feeds futuros que carezcan de un agregador Chainlink.
El envelope EIP-712 legacy (mantenido por compatibilidad) es:
Para Flash BTC y Flash ETH el shield invoca el camino latestRoundData() de Chainlink dentro de FlashShieldAdapter; el camino EIP-712 legacy solo se usa cuando el activo no tiene feed nativo de Chainlink.
El shield invoca IOracleV2(oracle).verifyPriceProofEIP712(price, asset, verifiedAt, signature) dentro de _doVerifyAndCalculate. El firmante recuperado debe coincidir con la oracleKey() del oráculo.
El servicio lumina-api expone POST /api/v1/oracle/sign-proof, que:
verifiedAt = now.ORACLE_PRIVATE_KEY almacenada en el secret store de Railway.oracleProof codificado en ABI listo para pasar a submitTrigger.La dirección del firmante es auditable on-chain mediante LuminaOracleV2.oracleKey(). Cualquier agente puede consultarla en GET /api/v1/oracle/signer antes de enviar un disparo.
submitTrigger no tiene control de acceso. El argumento es exclusivamente la prueba criptográfica; una prueba forjada o vencida revierte en la verificación del shield. Esto significa que cualquiera (el comprador de la póliza, un keeper bot, un buscador MEV) puede enviar una prueba válida y disparar el pago. El comprador de la póliza sigue siendo el único beneficiario, sin importar quién haga la llamada.
Dos oráculos adicionales sirven necesidades internas del protocolo:
CapacityOracle.getLuminaPrice(): provee un TWAP de 1 hora del precio spot de LUMINA, usado por las verificaciones de capacidad y solvencia.SolvencyOracle: monitorea el ratio de solvencia del BondVault (bandas 200/100/70%); lo consume burnFromReserves para bloquear quemas que comprometerían la solvencia.$LUMINA es un token ERC-20 + ERC-20Burnable desplegado tras un proxy UUPS. El suministro máximo es 100_000_000 * 1e18, fijado en construcción. No existe función mint. El suministro solo decrece por quema.
El constructor refuerza assert(totalSupply() == MAX_SUPPLY) tras la distribución génesis, y totalBurned() devuelve MAX_SUPPLY - totalSupply().
Se acuña por única vez en initialize() a través de cinco direcciones inmutables como argumentos:
| Asignación | Tokens | % | Receptor | Comportamiento |
|---|---|---|---|---|
| Reserva de Bonos | 70.000.000 | 70% | BondVault | Respalda todos los siniestros; solo sale por redeemBond al vencimiento. |
| Liquidez CEX/DEX | 14.000.000 | 14% | CEX Liquidity Reserve | Asignado para listings en exchanges centralizados y descentralizados. |
| Fundador | 8.000.000 | 8% | FounderVesting | Bloqueado tras compuertas oracle 2-de-3 AltSeason — ver § 8.4. |
| LBP | 5.000.000 | 5% | LBP Deposit | Liquidity Bootstrapping Pool (Fjord Foundry) en TGE. |
| Tesorería | 3.000.000 | 3% | TreasuryVesting | Lock de 180 días, luego drip de 250k/mes — ver § 8.5. |
| Total | 100.000.000 | 100% |
Solo el contrato TWAPBurner ostenta BURNER_ROLE sobre el token. Este rol permite invocar burnFrom sobre cualquier dirección, lo que es necesario porque el burner extrae $LUMINA de los buffers intermedios del protocolo y lo quema. DEFAULT_ADMIN_ROLE administra las asignaciones de roles. Renunciar a DEFAULT_ADMIN_ROLE bloquea de forma permanente la administración de BURNER_ROLE; el desplegador solo debería renunciar tras confirmarse el despliegue final del TWAPBurner.
La asignación del fundador (8M) se desbloquea mediante FounderVesting V2: tres compuertas independientes, gana la primera que se dispare, y luego se liberan tres tramos de ~3,333M cada uno cada 31 días.
FounderVesting V2 está desplegado en 0xfF4Db529bBCd4E3CC091E07b7845241EB4762832 y se cablea contra LuminaOracleV2 para las lecturas en vivo de ETH/USD y ETH/BTC.
Las liberaciones son onlyOwner; una liberación por ventana de 30 días, con tope en el máximo mensual.
El 100% del USDC enrutado al TWAPBurner no siempre se quema directamente. Antes de comprar y quemar $LUMINA, el burner consulta a AdaptiveFeeDistributor para decidir cómo dividir el USDC entrante en cuatro buckets:
0xdead (presión deflacionaria).El split no es estático. Adapta sobre dos ejes: solvencia del protocolo y momentum de mercado de LUMINA. El producto 4×4 de estos dos ejes produce 16 distribuciones posibles, cada una pre-calibrada para un régimen específico. La matriz completa se implementa en AdaptiveFeeDistributor._lookupDistribution(sLevel, mLevel) y está verificada por tests unitarios que cubren los 16 cuadrantes.
Niveles de solvencia: computados por SolvencyOracle como el ratio entre (reserva LUMINA del BondVault × precio spot) y obligaciones totales comprometidas en USD, expresado en basis points:
Buckets de momentum: computados a partir del ratio entre el TWAP de ventana corta (30 minutos) y el TWAP de ventana larga (1 día) del precio spot de LUMINA:
Cada celda muestra los basis points enrutados a quema / buyback / operaciones / mantenimiento, sumando 10000 (100%):
| Solvencia \ 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 |
Celda en negrita = HEALTHY/STABLE = régimen operativo por defecto. Las cuatro constantes FALLBACK_*_BPS en TWAPBurner espejan esta celda como red de seguridad si el distributor revierte.
AdaptiveFeeDistributor.sol y ejercitada por tests unitarios que cubren los 16 cuadrantes en AdaptiveFeeDistributorTest.t.sol. Sin embargo, en Sepolia hoy, el input de momentum se mantiene en neutral (10000 bps) en SolvencyOracle.sol: aún no se desplegó un pool profundo de liquidez LUMINA/USDC en Sepolia, por lo que el oráculo de momentum no tiene TWAPs reales on-chain para leer.
En la práctica, esto significa que la matriz corre solo sobre el eje de solvencia: en runtime colapsa a la columna STABLE. El comportamiento completo de 16 cuadrantes se activa automáticamente una vez que tres piezas se entregan en conjunto:
release/v5.1-pre-mainnet, audit fix H-10) se cherry-pickea a SolvencyOracle.sol.BuybackSpender se despliega y se cablea como consumidor de buybackReserve: la pieza faltante que convierte el USDC acumulado en buybacks de LUMINA en drawdowns de precio.La secuenciación es intencional: desplegar la lógica de momentum antes de que exista un pool de liquidez profundo produciría una señal muerta indistinguible de neutral, sin síntoma off-chain que delate la regresión. Cada pieza aterriza cuando su dependencia está en su lugar.
Cada USDC que entra al protocolo se enruta a través del TWAPBurner:
CoverRouterV2._purchase invoca twapBurner.receivePremium(premium) tras cada compra de póliza. La transferencia es atómica respecto de la compra.LuminaBondMarketplace.executeBuy deduce una comisión del 3% en cada trade secundario, también enrutada vía receivePremium.Los USDC se acumulan dentro del burner hasta que se invoca executeBurn().
| Parámetro | Valor por defecto | Efecto |
|---|---|---|
burnCooldown | 900s (15 min) | Brecha mínima entre quemas. |
minBurnAmount | 1 USDC | Por debajo, la llamada revierte con "Below minimum". |
maxBurnAmount | 10.000 USDC | Tope duro por llamada para limitar slippage en un solo swap. |
adaptiveModeEnabled | true | Enruta al AdaptiveFeeDistributor para split dinámico de 4 buckets. Si el distribuidor reporta unhealthy, hace fallback a bps fijos. |
| Bucket | BPS | % | Constante |
|---|---|---|---|
| Burn (USDC → compra LUMINA → quema) | 8500 | 85% | FALLBACK_BURN_BPS |
| Reserva de Buyback | 800 | 8% | FALLBACK_BUYBACK_BPS |
| Reserva de Mantenimiento | 500 | 5% | FALLBACK_MAINTENANCE_BPS |
| Reserva de Operaciones | 200 | 2% | FALLBACK_OPS_BPS |
El bucket de Burn compra $LUMINA en Uniswap V3 (con Aerodrome como fallback secuencial) y lo envía a 0xdead. Cada quema exitosa emite:
executeBurn es external nonReentrant: no hay onlyAuthorized. Cualquier wallet puede llamarla. El cooldown limita la frecuencia, y los topes mínimo/máximo limitan el slippage por llamada. Cualquiera puede ser el keeper de quema.
Los ClaimBonds vencen a 730 días. Los tenedores que necesitan liquidez antes los venden en el mercado secundario con descuento; los compradores obtienen un yield implícito esperando al vencimiento. El mercado es permisionless y on-chain.
ClaimBond.setApprovalForAll(marketplace, true) (una sola vez por familia de epoch).LuminaBondMarketplace.list(epochId, amount, priceUSDC). El contrato verifica balanceOf(seller, epochId) ≥ amount y que block.timestamp < maturityDate(epochId).safeTransferFrom, almacena la struct Listing y emite Listed(listingId, seller, epochId, amount, priceUSDC).priceUSDC.executeBuy(listingId).TWAPBurner), paga al vendedor y transfiere la cantidad ERC-1155 al comprador.El vendedor puede cancelar cualquiera de sus propios listings vía cancel(listingId). El bono regresa al wallet del vendedor. No hay enforcement on-chain de auto-compra, pero el frontend deshabilita el botón Buy cuando seller == wallet conectado.
Un BuybackEngine separado consume el bucket de buyback del TWAPBurner usando un esquema de commit-reveal para impedir front-running. Las operaciones se baten en lotes y se revelan en una transacción separada; se recomienda enrutamiento por mempool privado del lado de operaciones.
Todos los contratos del núcleo son upgradeables UUPS con _authorizeUpgrade protegido por DEFAULT_ADMIN_ROLE. Los upgrades hoy requieren un único firmante y migrarán a multisig antes de mainnet (ver Roadmap).
Los reportes de auditoría interna son públicos:
docs/SECURITY-AUDIT-V5.md: última auditoría interna que cubre la arquitectura actual.docs/audit/v5.1-uups/: análisis por capítulo: aristas matemáticas, riesgo de claves admin, condiciones de carrera, dependencias temporales, integración del oráculo.docs/audit/PHASE4-AUDIT-REPORT.md: flujo de bonos + marketplace.El protocolo lleva una nota de riesgo aceptado: no hay auditoría de tercero Tier-1 previa al mainnet. La bug bounty del fundador + multisig + clave en cold storage entran en vigor en T+30d posterior al deploy de mainnet.
docs/ACCESS-CONTROL-MATRIX.md documenta cada rol privilegiado, su tenedor actual y la política de rotación. Roles clave:
DEFAULT_ADMIN_ROLE en cada contrato UUPS: wallet del desplegador hoy, multisig en mainnet.BURNER_ROLE en LuminaTokenV2: solo el TWAPBurner.onlyRouter en PolicyManagerV2: solo CoverRouterV2.oracleKey en LuminaOracleV2: la dirección del firmante off-chain (rotable).Documentado en docs/audit/THREAT-MODEL.md. Mayores riesgos residuales:
BaseFlashShield verifica cada round (respuesta positiva, updatedAt fresco, consistencia del round) y revierte ante datos viejos; el L2 sequencer uptime feed también se valida en Base mainnet (address(0) → no-op en Sepolia).Un agente autónomo puede generar su propia API key sin intervención humana. El flujo consta de dos operaciones en línea:
"Lumina onboarding for {wallet} at {timestamp}" con la wallet del agente.POST /api/v1/agent/onboard con {walletAddress, label?, signature, timestamp}.La API verifica la firma, acuña una key lk_<64hex> (hasheada con SHA-256 en reposo) y devuelve el plaintext una sola vez. Límites: máximo 3 keys activas por wallet, 10 intentos de onboard por IP por hora.
La feature distintiva para agentes: POST /api/v1/policies. El wallet relayer de la API firma purchasePolicyFor on-chain en nombre del agente. El agente no necesita ETH para gas; solo USDC para la prima (custodiado por el wallet del agente, extraído por el contrato). Las idempotency keys impiden el doble-gasto en reintentos.
El repo lumina-api ships 24 skill files en docs/skills/: uno por operación frecuente. Cada archivo sigue una estructura fija: un bloque "What this does" en lenguaje llano, un prompt LLM listo para copiar-pegar, variables de entorno, ejemplos en curl + TypeScript + Python, esquemas de request/response y códigos de error. Diseñados para insertarse directamente en la lista de tools o el system prompt de un agente.
| Método | Path | Auth | Propósito |
|---|---|---|---|
| GET | /health | none | Estado en vivo: chain, relayer, direcciones de contratos |
| GET | /products | none | Lista los 6 Flash shields activos + capacidad |
| GET | /products/:id/quote?cover=N | none | Prima y pago para un monto de cobertura |
| POST | /api/v1/agent/onboard | firma EIP-191 | Mint self-service de API key |
| GET | /api/v1/agent/keys | x-api-key | Lista las keys del llamador |
| DELETE | /api/v1/agent/keys/:keyId | x-api-key | Revoca una key propia |
| POST | /api/v1/policies | x-api-key | Compra una póliza vía relayer (el agente no paga gas) |
| GET | /api/v1/policies | x-api-key | Lista las pólizas del llamador |
| GET | /api/v1/bonds/:wallet | x-api-key | Posiciones de bonos del llamador |
| POST | /api/v1/redeem | x-api-key | Indexa una redención (redeem on-chain firmado por el agente) |
| POST | /api/v1/marketplace/list | x-api-key | Indexa un listing |
| POST | /api/v1/marketplace/buy | x-api-key | Indexa una compra |
| POST | /api/v1/oracle/sign-proof | x-api-key | Obtiene un PriceProof EIP-712 fresco para submitTrigger |
| GET | /api/v1/oracle/signer | x-api-key | Lee la dirección actual del firmante del oráculo |
FlashShieldAdapter.El protocolo no está auditado por una firma Tier-1 al momento de redacción. Las auditorías internas son públicas pero no sustituyen una externa. Un bug de reentrancy, colisión de storage o manipulación de oráculo en el BondVault o en la ruta de un shield podría resultar en pérdida total del colateral.
Los disparos dependen de pruebas EIP-712 firmadas por un firmante off-chain. Si su clave se compromete, todas las pólizas activas pueden dispararse falsamente, drenando el BondVault. Las mitigaciones son ítems del roadmap (HSM, firmante multisig).
La redención de bonos paga en $LUMINA al precio TWAP vigente. Si la liquidez secundaria de LUMINA es escasa en el momento de la redención, los tenedores pueden recibir menos USD-equivalente que el valor nominal del bono.
El seguro paramétrico on-chain es novedoso. Puede ser clasificado como valor, derivado o producto de seguro regulado en algunas jurisdicciones. El uso del protocolo es por cuenta y riesgo legal del usuario.
Este whitepaper describe el protocolo tal como está desplegado al 14 de mayo de 2026 en Base Sepolia (V5.3). No constituye una oferta de venta ni una solicitud de compra de ningún token, valor o producto de seguro. Se provee con propósitos técnicos y educativos. Las afirmaciones prospectivas en la Sección 14 son aspiracionales; nada en este documento es garantía de despliegue futuro, fusión de funcionalidades o retorno financiero.
Lumina Protocol es software de código abierto publicado bajo licencia MIT en github.com/org-lumina. Los contratos están desplegados y operados por el equipo fundador durante el testnet; en mainnet, la gobernanza y autoridad sobre parámetros migran a un multisig y, en última instancia, a una gobernanza on-chain.
Los ClaimBonds son instrumentos paramétricos de pago, no contratos de seguro en el sentido regulado. No hay perito, no hay underwriter, no hay acuerdo de tomador de póliza. Un disparo es un evento on-chain determinístico; un pago es una transferencia on-chain determinística.
$LUMINA es un token de utilidad con tres usos programáticos: (i) es el activo pagado por las redenciones de ClaimBond; (ii) el motor de quema del protocolo lo destruye permanentemente a medida que las primas y comisiones de marketplace fluyen; (iii) es la unidad de cuenta para la solvencia del BondVault. No está diseñado ni comercializado como inversión; cualquier trading especulativo queda fuera del propósito del protocolo.
El protocolo no apunta a usuarios de ninguna jurisdicción específica. Operadores, integradores y usuarios finales son responsables de su propio cumplimiento regulatorio.
V5.3 mantiene las direcciones del core V5.2 (sin redeploy de BondVault, PolicyManager, etc.) y agrega seis nuevos adapters de shield. La fuente canónica es siempre https://lumina-api-production-ac85.up.railway.app/health; si alguna dirección difiere de /health, /health manda.
| Contrato | Dirección |
|---|---|
| LuminaTokenV2 | 0x62C0b58bB30CA857674ec593F1e23B3F15266680 |
| BondVault | 0x193acBc1EdC5E565a4aBE96941C7E7AeF637B6EC |
| ClaimBond | 0xaa57Ab52Eb00f296Ad4CFA9E9c201f3737271FB4 |
| CoverRouter | 0xcdB70B40e6a3DEac3189185d947A0e458518F566 |
| PolicyManager (proxy) | 0x546C07e07DeBCdbf7a2A7Ef12C38c8c8fcAFcDd8 |
| PolicyManager (impl Sprint Cleanup) | 0xdE41D414eD191A1090546078DF8e120c196Be22F |
| FounderVesting V2 | 0xfF4Db529bBCd4E3CC091E07b7845241EB4762832 |
| LuminaOracleV2 | 0x9bfa2f7A5098C89b8740D1694d1f716A0Bd871dD |
| TWAPBurner | 0x242d76082856901b4ba1E7c50C022D46a6941bC0 |
| AdaptiveFeeDistributor | 0xeC7841A4a9ecfb8cA58391E233A645B021c59D54 |
| BuybackEngine | 0x56B5a1115B0d9781E7358521204d927d2F80d8B4 |
| LuminaBondMarketplace | 0x0938205f4cBe5F572656533FC930FFce6F5F4345 |
Split del AdaptiveFeeDistributor: 85% Burn / 8% Buyback / 2% Operations / 5% Maintenance.
| Adapter | Dirección |
|---|---|
| Flash BTC 1h | 0x5d50310B9166184e822cD5368F51C1409713054f |
| Flash BTC 24h | 0x475b3F712707F61824122a94fE78b106260F8882 |
| Flash BTC 48h | 0xdc6387E86F7D852D1f99F4009cFd8AdC2d500298 |
| Flash ETH 1h | 0x57869AD3E7C56B0c96F357179DD231b407C88338 |
| Flash ETH 24h | 0x4fD09cF98F6814Cc8b33C2E491429f59d0bCf089 |
| Flash ETH 48h | 0x9696CFFD7dE8B1e16F83Dcc798c5CE69a61C884C |
| Servicio | Endpoint / dirección |
|---|---|
| URL base de la API | https://lumina-api-production-ac85.up.railway.app |
| Block explorer | sepolia.basescan.org |
| RPC | https://sepolia.base.org |
/health antes de integrar.
| BondVault | Contrato único que custodia la reserva de 70M $LUMINA que respalda cada ClaimBond. |
| ClaimBond | Bono cupón-cero ERC-1155, valor nominal de USD 1, vencimiento a 730 días, redimible en $LUMINA. |
| CoverRouterV2 | Punto de entrada para usuarios: quotePremium, purchasePolicy, submitTrigger. |
| EIP-191 | Estándar "personal_sign" usado para la firma de onboarding de agentes. |
| EIP-712 | Estándar de firma con tipos usado para los PriceProofs del oráculo. |
| Epoch | Bucket mensual de vencimiento. Codificado como year × 100 + month. Todos los bonos que vencen en el mismo mes calendario comparten epoch. |
| FlashShield | Uno de los seis productos de caída de precio que cubren BTC y ETH en ventanas de 1h, 24h y 48h (tres por activo). |
| FlashShieldAdapter | Contrato bridge UUPS que expone los Flash shields T-30a a través de la superficie legacy IShieldV2 consumida por PolicyManagerV2. |
| Modelo Kink | Modelo de pricing dependiente de capacidad que ajusta la prima conforme aumenta la utilización. |
| LuminaOracleV2 | Verificador EIP-712 que autoriza los disparos de shields a partir de un firmante off-chain de confianza. |
| oracleKey | Dirección Ethereum cuya clave privada firma cada PriceProof; rotable por el owner del contrato. |
| Paramétrico | Seguro cuyo pago depende exclusivamente de un disparo objetivo y medible, sin ajuste de siniestros. |
| Relayer | Wallet de la API que firma transacciones purchasePolicyFor en nombre del agente, pagando el gas. |
| Skill file | Documento Markdown en lumina-api/docs/skills/ con un prompt LLM listo para copiar-pegar y ejemplos de código. |
| TWAPBurner | Contrato que convierte primas en USDC a $LUMINA vía Uniswap V3 y lo quema. |
| UUPS | Universal Upgradeable Proxy Standard. Permite upgrades de implementación in-place por un admin. |
Toda afirmación técnica de este whitepaper se trazea a alguna de estas fuentes: