Skip to content
Back to skills

Bolt12

ASecurity

BOLT12 offers: reusable invoices, blinded paths, recurring payments, multi-asset (Taproot Assets layered). Replaces BOLT11 for many use cases. USE WHEN: implementing/integrating offers, designing recurring payments, evaluating BOLT11 vs BOLT12 trade-offs.

  • 31 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentsnode

Works with

  • cli

Security analysis

A100/100

Scanned September 22, 2026

npx -y skills add claude-dev-suite/claude-dev-suite --skill bolt12 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Bolt12?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Bolt12
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/claude-dev-suite-bolt12/badge)](https://www.skillsdirectory.com/skills/claude-dev-suite-bolt12)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: lightning-bolt12
description: |
  BOLT12 offers: reusable invoices, blinded paths, recurring payments,
  multi-asset (Taproot Assets layered). Replaces BOLT11 for many use
  cases.
  USE WHEN: implementing/integrating offers, designing recurring
  payments, evaluating BOLT11 vs BOLT12 trade-offs.
allowed-tools: Read, Grep, Glob
---

# BOLT12 Offers

BOLT12 is a flexible payment protocol that addresses BOLT11's
limitations:
- BOLT11 invoices are **single-use** and **expire**.
- BOLT11 reveals destination pubkey.
- BOLT11 has no built-in support for recurring payments or refunds.

BOLT12 offers a static, reusable identifier (the "offer") that lets
payers fetch a fresh invoice each payment via Lightning's onion
message system.

## Three message types

1. **Offer** (`lno1...`) — long-lived, signed by recipient. Encodes:
   - Description, amount (or "any"), expiry (or none).
   - Issuer pubkey (potentially blinded).
   - Allowed currencies / quantities.
2. **Invoice request** (`lnr1...`) — payer sends via onion message,
   asks for an invoice for this offer.
3. **Invoice** (`lni1...`) — receiver responds with one-time invoice.
   Standard payment proceeds.

## Bech32 encoding

All three types use the BOLT11-style bech32 encoding with `lno1`,
`lnr1`, `lni1` prefixes (no chain prefix; chain encoded in TLV).

## TLV-only

Unlike BOLT11's tag/data tuples, BOLT12 uses pure TLV everywhere.
Future-proof; new fields don't break old parsers.

## Blinded paths

Offers can include **blinded paths** — partial routes that hide the
recipient's node id. The offer is signed by an "introduction node" +
blinded route data; recipient is anonymous to the payer.

## Recurring payments

Offers can specify recurrence:
```
quantity_min: 1, quantity_max: 100
recurrence: monthly for 12 months
```

Same offer used for subscription: payer fetches a fresh invoice each
month.

## Multi-asset (Taproot Assets layered)

BOLT12 + Taproot Assets together enable invoices priced in non-BTC
assets routed over LN. Recipient gets BTC amounts; payer pays in
asset terms; intermediate hops handle conversion.

## Handing out an offer: BIP 353 and bLIP-42

An `lno1...` string is too long to read aloud or type. Two specs
turn it into a human-readable identity; a third identifies the
payer instead:

- **BIP 353 "DNS Payment Instructions"** — status `Complete` in the
  BIPs repo as of September 2026. Publishes a BIP 21 URI, usually
  just `bitcoin:?lno=<offer>`, in a DNSSEC-signed TXT record at
  `<user>.user._bitcoin-payment.<domain>`, displayed as
  `₿user@domain`. No HTTP endpoint in the path, unlike LNURL-pay
  / LUD-16; see the `lightning-address` skill.
- **bLIP-32 "Onion Message DNS Resolution"** — status `Active` in
  `lightning/blips` as of September 2026. Lets a client that cannot
  validate DNSSEC itself ask a node over onion messages:
  `dnssec_query` (type 65536) → `dnssec_proof` (65538), or
  `dnssec_error` (65550).
- **bLIP-42 "Bolt 12 Contacts"** (Bastien Teinturier, created
  2024-07-19) — status `Active` in `lightning/blips` as of September
  2026. Adds optional `invoice_request` TLVs that let a payment
  identify its payer: `invreq_contact_secret` (2000001729), plus
  either `invreq_payer_offer` (2000001731) or
  `invreq_payer_bip_353_name` (2000001733) with
  `invreq_payer_bip_353_signature` (2000001735) proving control of
  the offer behind that name. The recipient can then add the payer
  as a contact and pay them back with no extra round trip.

## Use cases vs BOLT11

| Use case | BOLT11 | BOLT12 |
|----------|--------|--------|
| One-time payment with known amount | yes | yes |
| Static "donate to me" QR code | hacky (LNURL-pay) | native |
| Recurring subscription | manual | native |
| Refund flow | no | yes |
| Hidden destination | no | yes (blinded paths) |
| Multi-asset | no (need TAP/RGB) | yes |

## Implementation status (late 2025)

| Implementation | Send | Receive | Recurring |
|----------------|------|---------|-----------|
| CLN | yes | yes | yes |
| LDK | yes | yes | partial |
| LND | partial | partial | no |
| Eclair | yes | yes | partial |
| phoenixd | yes (receive especially) | yes | partial |

## Common bugs

- Treating `lno1...` as a single-use invoice → it's not, can be
  reused.
- Failing to fetch invoice via onion message → expecting BOLT11
  flow.
- Caching invoice from offer → invoices are one-shot; fetch fresh
  each payment.
- Missing onion-message support (`option_onion_messages` feature
  bit) → can't fetch invoice request response.
- Under bLIP-42, accepting `invreq_payer_offer` /
  `invreq_payer_bip_353_name` from a payer you already hold a
  `contact_secret` for → the spec says ignore them for known
  contacts, so a leaked secret can't redirect your future payments
  to an impostor's offer.

## See also

- [bolts/SKILL.md](../bolts/SKILL.md)
- [onion/SKILL.md](../onion/SKILL.md)
- [lnurl/SKILL.md](../lnurl/SKILL.md)
- [lightning-address/SKILL.md](../lightning-address/SKILL.md)
- [../../l2/taproot-assets/SKILL.md](../../l2/taproot-assets/SKILL.md)

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.