See /concepts/lifecycle for the end-to-end flow (policy → trigger → bond → wait/sell decision).
lumina.bonds.list(). The
agent’s job is to notice the trigger fast and decide what to do with the
bond.
Two ways to notice a trigger
A) Webhook (push, recommended)
Subscribe once, receive an HMAC-signed JSON POST when the trigger lands on-chain. End-to-end latency from on-chain settlement to your endpoint is 0–30s (the worker polls a queue every 30s).policy_triggered event contains policyId, productId,
bondId, faceValueUsdc, txHash, and the on-chain triggeredAt epoch.
See Webhooks for the signature-verification snippet.
B) Polling (pull)
Cheap when you only hold a handful of active policies. HitGET /api/v1/policies/:id on an interval — every 30s is plenty:
p.status is one of active | triggered | expired. For the bond face value
and maturity epoch, list your bonds and find the matching bondId
(BondsAPI exposes only list() — there is no bonds.get()):
Trigger events
Read positions
Bond redemption flow
Bonds are ERC-1155, LUMINAviaBondVault.redeem(or the SDK wrapper if exposed). The vault enforces a per-epoch throttle ofMAX_REDEMPTION_PER_EPOCH_BPS = 108` — 1.08% per week of the epoch’s
outstanding face, FIFO queued post-throttle. This is the anti bond-run
safeguard described in BondVault throttle.
If you need cash sooner than 730 days, list the bond on the
marketplace — typical discount is 2–5%, with
150 bps maker + 150 bps taker fees.
Decision rule
Listing logic
Pinning maturity
bond.maturityEpoch (where exposed) is a wall-clock seconds value. To get
seconds-until-maturity:
maturityEpoch on a particular response shape,
query the on-chain BondVault.epochInfo(epochId) directly via your RPC.