LIGHTNING-DECODE(7)
π NAME π
okay bestie, welcome to lightning-decode (7) β the low-level command page for decode, aka the "Command for decoding an invoice string (low-level)". think of it as the little decoder ring for your Lightning strings, and yes it's giving main character energy β¨
β SYNOPSIS β
decode string
π DESCRIPTION π
so this command was added in v23.05 β periodt.
the decode RPC command checks and parses bolt11, bolt12, rune or emergency_recover. and lowkey it may decode other formats in future, so stay tuned π
string(string) β the value to be decoded, and here's what it can be:- a
bolt11orbolt12string (optionally prefixed bylightning:orLIGHTNING:) as specified by the BOLT 11 and BOLT 12 specifications. - a
runeas created bylightning-commando-rune(7). - an
emergency_recoverstring generated bylightning-hsmtoollikelightning-hsmtool getemergencyrecover <path/to/emergency.recover>. it holdsemergency.recovercontents and starts withclnemerg1.
- a
π RETURN VALUE π
on success, an object is returned, containing:
type(string) (one of"bolt12 offer","bolt12 invoice","bolt12 invoice_request","bolt11 invoice","rune","emergency recover","bolt12 payer_proof") β what kind of object it decoded to. like, the vibe check of your string π¦valid(boolean) β if this isfalse, you MUST not use the result except for diagnostics!
bestie fr fr, thatvalidwarning is not a drill. if it'sfalse, the result is diagnostics-only, no cap π
πΈ if type is "bolt12 offer", and valid is true πΈ
offer_id(hex) (always 64 characters) β the id we use to identify this offer.offer_chains(array of hashs, optional) β which blockchains this offer is for (missing implies bitcoin mainnet only).:- (hash, optional) β the genesis blockhash.
offer_metadata(hex, optional) β any metadata the creator of the offer includes.offer_currency(string, optional) (always 3 characters) β ISO 4217 code of the currency (missing implies Bitcoin).currency_minor_unit(u32, optional) β the number of decimal places to apply to amount (if currency known).offer_amount(u64, optional) β the amount in theoffer_currencyadjusted bycurrency_minor_unit, if any.offer_amount_msat(msat, optional) β the amount in bitcoin (if specified, and nooffer_currency).offer_description(string, optional) β the description of the purpose of the offer.offer_issuer(string, optional) β the description of the creator of the offer.offer_features(hex, optional) β the feature bits of the offer.offer_absolute_expiry(u64, optional) β UNIX timestamp of when this offer expires.offer_quantity_max(u64, optional) β the maximum quantity (or, if0, means any quantity).offer_paths(array of objects, optional) β paths to the destination.:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path.:blinded_node_id(pubkey) β node_id of the hop.encrypted_recipient_data(hex) β encrypted TLV entry for this hop.
first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path.first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
offer_issuer_id(pubkey, optional) β the pubkey associated with the offer (can be a node id). (added v24.08)offer_recurrence(object, optional) β how often to this offer should be used.:time_unit(u32) β the BOLT12 time unit.period(u32) β how manytime_unitper payment period.compulsory_field(boolean) β true if this is theoffer_recurrence_compulsoryfield (which means readers which don't understand recurrence cannot use it), false if this is theoffer_recurrence_optionalfield. (added v26.06)time_unit_name(string, optional) β the name oftime_unit(if valid).basetime(u64, optional) β period starts at this UNIX timestamp.limit(u32, optional) β maximum period number for recurrence.paywindow(object, optional) β when within a period will payment be accepted. the default is prior and during the period.:seconds_before(u32) β seconds prior to period start.seconds_after(u32) β seconds after to period start.
proportional_amount(boolean, optional) (always true) β amount should be scaled if paid after period start.
unknown_offer_tlvs(array of objects, optional) β any extra fields we didn't know how to parse.:type(u64) β the type.length(u64) β the length.value(hex) β the value.
- the following warnings are possible:
warning_unknown_offer_currencyβ the currency code is unknown (so nocurrency_minor_unit).warning_empty_blinded_pathβ the blinded path has 0 hops. (added v24.08)
π¦ if type is "bolt12 offer", and valid is false π¦
- the following warnings are possible:
warning_missing_offer_issuer_idβoffer_issuer_idis not present and there are nooffer_paths(added v24.08)warning_invalid_offer_descriptionβoffer_descriptionis not valid UTF8.warning_missing_offer_descriptionβoffer_descriptionis not present.warning_invalid_offer_currencyβoffer_currency_codeis not valid UTF8.warning_invalid_offer_issuerβoffer_issueris not valid UTF8.
π§ if type is "bolt12 invoice_request", and valid is true π§
invreq_metadata(hex) β the payer-provided blob to deriveinvreq_payer_id.invreq_payer_id(hex) β the payer-provided key.signature(bip340sig) β BIP-340 signature of theinvreq_payer_idon thisinvoice_request.offer_id(hex, optional) (always 64 characters) β the id we use to identify this offer.offer_chains(array of hexs, optional) β which blockchains this offer is for (missing implies bitcoin mainnet only).:- (hex, optional) (always 64 characters) β the genesis blockhash.
offer_metadata(hex, optional) β any metadata the creator of the offer includes.offer_currency(string, optional) (always 3 characters) β ISO 4217 code of the currency (missing implies Bitcoin).currency_minor_unit(u32, optional) β the number of decimal places to apply to amount (if currency known).offer_amount(u64, optional) β the amount in theoffer_currencyadjusted bycurrency_minor_unit, if any.offer_amount_msat(msat, optional) β the amount in bitcoin (if specified, and nooffer_currency).offer_description(string, optional) β the description of the purpose of the offer.offer_issuer(string, optional) β the description of the creator of the offer.offer_features(hex, optional) β the feature bits of the offer.offer_absolute_expiry(u64, optional) β UNIX timestamp of when this offer expires.offer_quantity_max(u64, optional) β the maximum quantity (or, if0, means any quantity).offer_paths(array of objects, optional) β paths to the destination.:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path.:blinded_node_id(pubkey) β node_id of the hop.encrypted_recipient_data(hex) β encrypted TLV entry for this hop.
first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path.first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
offer_issuer_id(pubkey, optional) β public key of the offering node (can be a node id). (added v24.08)offer_recurrence(object, optional) β how often to this offer should be used.:time_unit(u32) β the BOLT12 time unit.period(u32) β how manytime_unitper payment period.time_unit_name(string, optional) β the name oftime_unit(if valid).basetime(u64, optional) β period starts at this UNIX timestamp.limit(u32, optional) β maximum period number for recurrence.compulsory_field(boolean, optional) β true if this is theoffer_recurrence_compulsoryfield (which means readers which don't understand recurrence cannot use it), false if this is theoffer_recurrence_optionalfield. (added v26.06)paywindow(object, optional) β when within a period will payment be accepted. the default is prior and during the period.:seconds_before(u32) β seconds prior to period start.seconds_after(u32) β seconds after to period start.
proportional_amount(boolean, optional) (always true) β amount should be scaled if paid after period start.
invreq_chain(hex, optional) (always 64 characters) β which blockchain this offer is for (missing implies bitcoin mainnet only).invreq_amount_msat(msat, optional) β the amount the invoice should be for.invreq_features(hex, optional) β the feature bits of theinvoice_request.invreq_quantity(u64, optional) β the number of items to invoice for.invreq_payer_note(string, optional) β a note attached by the payer.invreq_paths(array of objects, optional) β paths to the destination. (added v24.08):first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path. (added v24.08):blinded_node_id(pubkey) β node_id of the hop. (added v24.08)encrypted_recipient_data(hex) β encrypted TLV entry for this hop. (added v24.08)
first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path. (added v24.08)first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v24.08)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v24.08)
invreq_bip_353_name(object, optional) β BIP 353 name which this invoice request is for. (added v25.02):name(string, optional) β the name (part before the @). (added v25.02)domain(string, optional) β the domain (part after the @). (added v25.02)
invreq_recurrence_counter(u32, optional) β which number request this is for the same invoice.invreq_recurrence_start(u32, optional) β when we're requesting to start an invoice at a non-zero period.invreq_recurrence_cancel(boolean, optional) (always true) β present to cancel a recurring invoice (added v26.06)unknown_invoice_request_tlvs(array of objects, optional) β any extra fields we didn't know how to parse.:type(u64) β the type.length(u64) β the length.value(hex) β the value.
- the following warnings are possible:
warning_unknown_offer_currencyβ the currency code is unknown (so nocurrency_minor_unit).
So when type comes back as "bolt12 invoice_request" and valid is false, your girl is basically handing you a lil list of what went wrong π
β these are the warnings you might see:
warning_invalid_offer_descriptionβoffer_descriptionis not valid UTF8 πwarning_missing_offer_descriptionβoffer_descriptionis not presentwarning_invalid_offer_currencyβoffer_currency_codeis not valid UTF8warning_invalid_offer_issuerβoffer_issueris not valid UTF8warning_missing_invreq_metadataβinvreq_metadatais not presentwarning_missing_invreq_payer_idβinvreq_payer_idis not presentwarning_invalid_invreq_payer_noteβinvreq_payer_noteis not valid UTF8warning_invreq_bip_353_name_name_invalidβinvreq_bip_353_namename field contains unusual characters. (added v25.02)warning_invreq_bip_353_name_domain_invalidβinvreq_bip_353_namedomain field contains unusual characters. (added v25.02)warning_invreq_recurrence_cancel_without_counterβinvreq_recurrence_cancelis present, butinvreq_recurrence_counterisn't. (added v26.06)warning_invreq_recurrence_cancel_with_zero_counterβinvreq_recurrence_cancelis present, butinvreq_recurrence_counteris 0. (added v26.06)warning_missing_invoice_request_signatureβ signature is not presentwarning_invalid_invoice_request_signatureβ Incorrect signature
Now, when type is "bolt12 invoice" and valid is true, it's giving full breakdown energy π β here's every field you can get back:
invreq_metadata(hex) β the payer-provided blob you use to deriveinvreq_payer_idinvreq_payer_id(hex) β the payer-provided keyinvoice_paths(array of objects) β paths to pay the destination:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)payinfo(object):fee_base_msat(msat) β basefee for pathfee_proportional_millionths(u32) β proportional fee for pathcltv_expiry_delta(u32) β CLTV delta for pathhtlc_minimum_msat(msat) β minimum amount which can be sent via path. (added v26.04)htlc_maximum_msat(msat) β maximum amount which can be sent via path. (added v26.04)features(hex) β features allowed for path
path(array of objects) β an individual path:blinded_node_id(pubkey) β node_id of the hopencrypted_recipient_data(hex) β encrypted TLV entry for this hopfirst_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the pathfirst_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
invoice_created_at(u64) β the UNIX timestamp of invoice creationinvoice_payment_hash(hex) (always 64 characters) β the hash of thepayment_preimageinvoice_amount_msat(msat) β the amount required to fulfill invoicesignature(bip340sig) β BIP-340 signature of theoffer_issuer_idon this invoiceoffer_id(hex, optional) (always 64 characters) β the id we use to identify this offeroffer_chains(array of hexs, optional) β which blockchains this offer is for (missing implies bitcoin mainnet only):- (hex, optional) (always 64 characters) β the genesis blockhash
offer_metadata(hex, optional) β any metadata the creator of the offer includesoffer_currency(string, optional) (always 3 characters) β ISO 4217 code of the currency (missing implies Bitcoin)currency_minor_unit(u32, optional) β the number of decimal places to apply to amount (if currency known)offer_amount(u64, optional) β the amount in theoffer_currencyadjusted bycurrency_minor_unit, if anyoffer_amount_msat(msat, optional) β the amount in bitcoin (if specified, and nooffer_currency)offer_description(string, optional) β the description of the purpose of the offeroffer_issuer(string, optional) β the description of the creator of the offeroffer_features(hex, optional) β the feature bits of the offeroffer_absolute_expiry(u64, optional) β UNIX timestamp of when this offer expiresoffer_quantity_max(u64, optional) β the maximum quantity (or, if0, means any quantity)offer_paths(array of objects, optional) β paths to the destination:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path:blinded_node_id(pubkey) β node_id of the hopencrypted_recipient_data(hex) β encrypted TLV entry for this hopfirst_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the pathfirst_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
offer_issuer_id(pubkey, optional) β public key of the offering node (can be a node id). (added v24.08)offer_recurrence(object, optional) β how often this offer should be used:time_unit(u32) β the BOLT12 time unitperiod(u32) β how manytime_unitper payment periodtime_unit_name(string, optional) β the name oftime_unit(if valid)basetime(u64, optional) β period starts at this UNIX timestamplimit(u32, optional) β maximum period number for recurrencecompulsory_field(boolean, optional) βTrueif this is theoffer_recurrence_compulsoryfield (which means readers which don't understand recurrence cannot use it),falseif this is theoffer_recurrence_optionalfield. (added v26.06)paywindow(object, optional) β when within a period will payment be accepted. The default is prior and during the period:seconds_before(u32) β seconds prior to period startseconds_after(u32) β seconds after to period startproportional_amount(boolean, optional) (always true) β amount should be scaled if paid after period start
invreq_chain(hex, optional) (always 64 characters) β which blockchain this offer is for (missing implies bitcoin mainnet only)invreq_amount_msat(msat, optional) β the amount the invoice should be forinvreq_features(hex, optional) β the feature bits of theinvoice_requestinvreq_quantity(u64, optional) β the number of items to invoice forinvreq_payer_note(string, optional) β a note attached by the payerinvreq_paths(array of objects, optional) β paths to the destination. (added v24.08):first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path. (added v24.08):blinded_node_id(pubkey) β node_id of the hop. (added v24.08)encrypted_recipient_data(hex) β encrypted TLV entry for this hop. (added v24.08)first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path. (added v24.08)first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v24.08)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v24.08)
invreq_bip_353_name(object, optional) β BIP 353 name which this invoice request is for. (added v25.02):name(string, optional) β the name (part before the@). (added v25.02)domain(string, optional) β the domain (part after the@). (added v25.02)
invreq_recurrence_counter(u32, optional) β which number request this is for the same invoiceinvreq_recurrence_start(u32, optional) β when we're requesting to start an invoice at a non-zero periodinvoice_relative_expiry(u32, optional) β the number of seconds afterinvoice_created_atwhen this expiresinvoice_fallbacks(array of objects, optional) β onchain addresses:version(u8) β segwit address versionhex(hex) β raw encoded segwit addressaddress(string, optional) β bech32 segwit address
invoice_features(hex, optional) β the feature bits of the invoiceinvoice_node_id(pubkey, optional) β the id to pay (usually the same asoffer_issuer_id)invoice_recurrence_basetime(u64, optional) β the UNIX timestamp to base the invoice periods onunknown_invoice_tlvs(array of objects, optional) β any extra fields we didn't know how to parse:type(u64) β the typelength(u64) β the lengthvalue(hex) β the value
- the following warnings are possible:
warning_unknown_offer_currencyβ the currency code is unknown (so nocurrency_minor_unit)
And if type is "bolt12 invoice" but valid is false π β yeah, it didn't pass the vibe check, and these are the warnings that can pop up:
warning_invalid_offer_descriptionβoffer_descriptionis not valid UTF8warning_missing_offer_descriptionβoffer_descriptionis not presentwarning_invalid_offer_currencyβoffer_currency_codeis not valid UTF8warning_invalid_offer_issuerβoffer_issueris not valid UTF8warning_missing_invreq_metadataβinvreq_metadatais not presentwarning_invalid_invreq_payer_noteβinvreq_payer_noteis not valid UTF8warning_missing_invoice_pathsβinvoice_pathsis not presentwarning_missing_invoice_blindedpayβinvoice_blindedpayis not presentwarning_missing_invoice_created_atβinvoice_created_atis not presentwarning_missing_invoice_payment_hashβinvoice_payment_hashis not presentwarning_missing_invoice_amountβinvoice_amountis not presentwarning_missing_invoice_recurrence_basetimeβinvoice_recurrence_basetimeis not presentwarning_missing_invoice_node_idβinvoice_node_idis not presentwarning_missing_invoice_signatureβ signature is not presentwarning_invalid_invoice_signatureβ Incorrect signature
If type is "bolt11 invoice", and valid is true, you get this whole little treasure chest π:
currency(string) β the BIP173 name for the currency, iykyk.created_at(u64) β the UNIX-style timestamp of the invoice.expiry(u64) β how many seconds this is valid aftercreated_at.payee(pubkey) β the public key of the recipient.payment_hash(hash) β the hash of thepayment_preimage.signature(signature) β the payee's signature on this invoice.min_final_cltv_expiry(u32) β the minimum CLTV delay for the final node.amount_msat(msat, optional) β the amount the invoice asked for.description(string, optional) β what the purchase is actually for.description_hash(hash, optional) β the hash of the description, standing in place ofdescription.payment_secret(secret, optional) β the secret to hand to the payee node.features(hex, optional) β the features bitmap for this invoice.payment_metadata(hex, optional) β thepayment_metadatato put in the payment.fallbacks(array of objects, optional) β onchain addresses, bestie:type(string) (one of"P2PKH","P2SH","P2WPKH","P2WSH","P2TR") β the address type (if known).hex(hex) β raw encoded address.addr(string, optional) β the address in the appropriate format fortype.
routes(array of arrays, optional) β route hints to the payee:- (array of objects) β hops in the route:
pubkey(pubkey) β the public key of the node.short_channel_id(short_channel_id) β a channel to the next peer.fee_base_msat(msat) β the base fee for payments.fee_proportional_millionths(u32) β the parts-per-million fee for payments.cltv_expiry_delta(u32) β the CLTV delta across this hop.
- (array of objects) β hops in the route:
extra(array of objects, optional) β any extra fields we didn't know how to parse:tag(string) (always 1 characters) β the bech32 letter which identifies this field.data(string) β the bech32 data for this field.
If type is "bolt12 payer_proof", and valid is true, it's giving proof-of-payment realness β¨:
invreq_payer_id(pubkey) β the payer's key.invoice_payment_hash(hex) (always 64 characters) β the hash of theproof_preimage.invoice_node_id(pubkey) β the id to pay (usually the same asoffer_issuer_id).signature(bip340sig) β BIP-340 signature ofinvoice_node_idover the disclosed invoice fields.proof_preimage(hex) (always 64 characters) β the payment preimage proving payment. (added v26.06)proof_omitted_tlvs(array of u64s) β TLV type markers for fields omitted from the proof. (added v26.06)- (u64, optional)
proof_missing_hashes(array of hashs) β Merkle hashes needed to reconstruct omitted subtrees. (added v26.06)- (hash, optional)
proof_leaf_hashes(array of hashs) β nonce hashes for each disclosed non-signature TLV field. (added v26.06)- (hash, optional)
proof_signature(bip340sig) β BIP-340 signature ofinvreq_payer_idover the proof. (added v26.06)type(string, optional)valid(boolean, optional)offer_chains(array of hashs, optional) β which blockchains this offer is for (missing implies bitcoin mainnet only):- (hash, optional) β the genesis blockhash.
offer_metadata(hex, optional) β any metadata the creator of the offer includes.offer_currency(string, optional) (always 3 characters) β ISO 4217 code of the currency (missing implies Bitcoin).currency_minor_unit(u32, optional) β the number of decimal places to apply toamount(if currency known).offer_amount(u64, optional) β the amount in theoffer_currencyadjusted bycurrency_minor_unit, if any.offer_amount_msat(msat, optional) β the amount in bitcoin (if specified, and nooffer_currency).offer_description(string, optional) β the description of the purpose of the offer.offer_issuer(string, optional) β the description of the creator of the offer.offer_features(hex, optional) β the feature bits of the offer.offer_absolute_expiry(u64, optional) β UNIX timestamp of when this offer expires.offer_quantity_max(u64, optional) β the maximum quantity (or, if0, means any quantity).offer_paths(array of objects, optional) β paths to the destination:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path:blinded_node_id(pubkey) β Node_id of the hop.encrypted_recipient_data(hex) β encrypted TLV entry for this hop.first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path.first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
offer_issuer_id(pubkey, optional) β the pubkey associated with the offer (can be a node id). (added v24.08)invreq_chain(hex, optional) (always 64 characters) β which blockchain this offer is for (missing implies bitcoin mainnet only).invreq_amount_msat(msat, optional) β the amount the invoice should be for.invreq_features(hex, optional) β the feature bits of the invoice_request.invreq_quantity(u64, optional) β the number of items to invoice for.invreq_payer_note(string, optional) β a note attached by the payer.invreq_paths(array of objects, optional) β paths to the destination. (added v24.08)first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)path(array of objects) β an individual path. (added v24.08)blinded_node_id(pubkey) β Node_id of the hop. (added v24.08)encrypted_recipient_data(hex) β encrypted TLV entry for this hop. (added v24.08)first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path. (added v24.08)first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v24.08)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v24.08)
invreq_bip_353_name(object, optional) β BIP 353 name which this invoice request is for. (added v25.02)name(string, optional) β the name (part before the@). (added v25.02)domain(string, optional) β the domain (part after the@). (added v25.02)
invoice_paths(array of objects, optional) β paths to pay the destination:first_path_key(pubkey) β path key to deliver to first hop on this path. (added v24.11)payinfo(object):fee_base_msat(msat) β basefee for path.fee_proportional_millionths(u32) β proportional fee for path.cltv_expiry_delta(u32) β CLTV delta for path.htlc_minimum_msat(msat) β minimum amount which can be sent via path. (added v26.04)htlc_maximum_msat(msat) β maximum amount which can be sent via path. (added v26.04)features(hex) β features allowed for path.
path(array of objects) β an individual path:blinded_node_id(pubkey) β Node_id of the hop.encrypted_recipient_data(hex) β encrypted TLV entry for this hop.first_node_id(pubkey, optional) β the (presumably well-known) public key of the start of the path.first_scid(short_channel_id, optional) β the short channel id of the start of the path (alternative tofirst_node_id) (added v23.05)first_scid_dir(u32, optional) β which end of thefirst_scidis the start of the path (added v23.05)
invoice_created_at(u64, optional) β the UNIX timestamp of invoice creation.invoice_relative_expiry(u32, optional) β the number of seconds afterinvoice_created_atwhen this expires.invoice_amount_msat(msat, optional) β the amount required to fulfill invoice.invoice_fallbacks(array of objects, optional) β onchain addresses:version(u8) β segwit address version.hex(hex) β raw encoded segwit address.address(string, optional) β bech32 segwit address.
invoice_features(hex, optional) β the feature bits of the invoice.proof_note(string, optional) β optional note attached to the proof by the payer. (added v26.06)unknown_payer_proof_tlvs(array of objects, optional) β any extra fields we didn't know how to parse. (added v26.06)type(u64) β the type.length(u64) β the length.value(hex) β the value.
If type is "rune", and valid is true π:
valid(boolean) (always true)string(string) β the string encoding of the rune.restrictions(array of objects) β restrictions built into the rune: all must pass:alternatives(array of strings) β each way restriction can be met: any can pass:- (string, optional) β the alternative of form
fieldname condition fieldname.
- (string, optional) β the alternative of form
summary(string) β human-readable summary of this restriction.unique_id(string, optional) β unique id (always a numeric id on runes we create).version(string, optional) β rune version, not currently set on runes we create.
And if type is "rune", and valid is false π:
valid(boolean) (always false)hex(hex, optional) β the raw rune in hex.- the following warnings are possible:
warning_rune_invalid_utf8β the rune contains invalid UTF-8 strings.
Finally, if type is "emergency recover", and valid is true π¨:
decrypted(hex) β the decrypted value of the provided bech32 ofemergency.recover. (added v23.11)
π AUTHOR π
Rusty Russell rusty@rustcorp.com.au is mainly responsible. king behaviour, honestly π.
π¦ SEE ALSO π¦
lightning-xpay(7)lightning-offer(7)lightning-fetchinvoice(7)lightning-sendinvoice(7)lightning-commando-rune(7)
π RESOURCES π
- BOLT #11
- BOLT #12 (experimental, bolt #798)
- Main web site:
https://github.com/ElementsProject/lightning
go read the bolts bestie, they're literally right there π«Ά
β¨ EXAMPLES β¨
okay bestie, here's where it gets real β two whole worked examples so you can see exactly what goes in and what comes out π
π Example 1
Request:
$ lightning-cli decode "zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA=="
{
"id": "example:decode#1",
"method": "decode",
"params": [
"zFMd1fjhrAYxUeFA54TjloZqOt8JrA_i_nYwIgXkag49MA=="
]
}
Response:
{
"type": "rune",
"unique_id": "0",
"string": "cc531dd5f8e1ac063151e140e784e396866a3adf09ac0fe2fe76302205e46a0e:=0",
"restrictions": [],
"valid": true
}
see how that worked?? π«Ά you handed it a rune, it handed you back the whole vibe β "type" came back as "rune", the "unique_id" is "0", the "string" is "cc531dd5f8e1ac063151e140e784e396866a3adf09ac0fe2fe76302205e46a0e:=0", "restrictions" is an empty list [], and "valid" is true. iconic. no notes. π
π¦ Example 2
Request:
$ lightning-cli decode "lnbcrt100n1pnt2bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000"
{
"id": "example:decode#2",
"method": "decode",
"params": [
"lnbcrt100n1pnt2bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000bolt11invl020200000000"
]
}
Response:
{
"type": "bolt11 invoice",
"currency": "bcrt",
"created_at": 1738000000,
"expiry": 604800,
"payee": "nodeid020202020202020202020202020202020202020202020202020202020202",
"amount_msat": 200000,
"description": "l22 description",
"min_final_cltv_expiry": 5,
"payment_secret": "paymentsecretinvl00220002200022000220002200022000220002200022000",
"features": "02024100",
"routes": [
[
{
"pubkey": "nodeid030303030303030303030303030303030303030303030303030303030303",
"short_channel_id": "111x1x1",
"fee_base_msat": 1,
"fee_proportional_millionths": 10,
"cltv_expiry_delta": 6
}
]
],
"payment_hash": "paymenthashinvl0220022002200220022002200220022002200220022002200",
"signature": "dcde30c4bb50bed221009d010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101",
"valid": true
}
and that's the bolt11 glow-up πΈ like β "type" is "bolt11 invoice", "currency" is "bcrt", "created_at" is 1738000000, "expiry" is 604800, "payee" is "nodeid020202020202020202020202020202020202020202020202020202020202", "amount_msat" is 200000, "description" is "l22 description", "min_final_cltv_expiry" is 5, "payment_secret" is "paymentsecretinvl00220002200022000220002200022000220002200022000", "features" is "02024100". then the "routes" list β and yes it's a list inside a list, nesting is the moment π β holding one hop with "pubkey" "nodeid030303030303030303030303030303030303030303030303030303030303", "short_channel_id" "111x1x1", "fee_base_msat" 1, "fee_proportional_millionths" 10, and "cltv_expiry_delta" 6. then "payment_hash" is "paymenthashinvl0220022002200220022002200220022002200220022002200", "signature" is "dcde30c4bb50bed221009d010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", and "valid" is true. slay. π₯
and that's the whole page, bestie π§ go decode something cute. π
this lil tour came to you straight out of Core Lightning v26.06.9 β the LIGHTNING-DECODE(7) era, no cap β¨π
π¦ where this page comes from
- nixpkgs unstable: clightning 26.06.9
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms