{ "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": [ "type", "valid" ], "properties": { "type": { "type": "string", "enum": [ "bolt12 offer", "bolt12 invoice", "bolt12 invoice_request", "bolt11 invoice" ], "description": "what kind of object it decoded to" }, "valid": { "type": "boolean", "description": "if this is false, you *MUST* not use the result except for diagnostics!" } }, "allOf": [ { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 offer" ] }, "valid": { "type": "boolean", "enum": [ true ] } } }, "then": { "required": [ "offer_id", "node_id", "description" ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { "type": "hex", "description": "the id of this offer (merkle hash of non-signature fields)", "maxLength": 64, "minLength": 64 }, "node_id": { "type": "point32", "description": "x-only public key of the offering node" }, "signature": { "type": "bip340sig", "description": "BIP-340 signature of the *node_id* on this offer" }, "chains": { "type": "array", "description": "which blockchains this offer is for (missing implies bitcoin mainnet only)", "items": { "type": "hex", "description": "the genesis blockhash", "maxLength": 64, "minLength": 64 } }, "currency": { "type": "string", "description": "ISO 4217 code of the currency (missing implies Bitcoin)", "maxLength": 3, "minLength": 3 }, "minor_unit": { "type": "u32", "description": "the number of decimal places to apply to amount (if currency known)" }, "warning_offer_unknown_currency": { "type": "string", "description": "The currency code is unknown (so no **minor_unit**)" }, "amount": { "type": "u64", "description": "the amount in the *currency* adjusted by *minor_unit*, if any" }, "amount_msat": { "type": "msat", "description": "the amount in bitcoin (if specified, and no *currency*)" }, "send_invoice": { "type": "boolean", "description": "present if this is a send_invoice offer", "enum" : [ true ] }, "refund_for": { "type": "hex", "description": "the *payment_preimage* of invoice this is a refund for", "maxLength": 64, "minLength": 64 }, "description": { "type": "string", "description": "the description of the purpose of the offer" }, "vendor": { "type": "string", "description": "the name of the vendor for this offer" }, "features": { "type": "hex", "description": "the array of feature bits for this offer" }, "absolute_expiry": { "type": "u64", "description": "UNIX timestamp of when this offer expires" }, "paths": { "type": "array", "description": "Paths to the destination", "items": { "type": "object", "required": [ "blinding", "path" ], "additionalProperties": false, "properties": { "blinding": { "type": "pubkey", "description": "blinding factor for this path" }, "path": { "type": "array", "description": "an individual path", "items": { "type": "object", "required": [ "node_id", "enctlv" ], "additionalProperties": false, "properties": { "node_id": { "type": "pubkey", "description": "node_id of the hop" }, "enctlv": { "type": "hex", "description": "encrypted TLV entry for this hop" } } } } } } }, "quantity_min": { "type": "u64", "description": "the minimum quantity" }, "quantity_max": { "type": "u64", "description": "the maximum quantity" }, "recurrence": { "type": "object", "description": "how often to this offer should be used", "required": [ "period", "time_unit" ], "additionalProperties": false, "properties": { "time_unit": { "type": "u32", "description": "the BOLT12 time unit" }, "time_unit_name": { "type": "string", "description": "the name of *time_unit* (if valid)" }, "period": { "type": "u32", "description": "how many *time_unit* per payment period" }, "basetime": { "type": "u64", "description": "period starts at this UNIX timestamp" }, "start_any_period": { "type": "u64", "description": "you can start at any period (only if **basetime** present)" }, "limit": { "type": "u32", "description": "maximum period number for recurrence" }, "paywindow": { "type": "object", "description": "when within a period will payment be accepted (default is prior and during the period)", "required": [ "seconds_before", "seconds_after" ], "additionalProperties": false, "properties": { "seconds_before": { "type": "u32", "description": "seconds prior to period start" }, "seconds_after": { "type": "u32", "description": "seconds after to period start" }, "proportional_amount": { "type": "boolean", "enum": [ true ], "description": "amount should be scaled if payed after period start" } } } } } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 offer" ] }, "valid": { "type": "boolean", "enum": [false ] } } }, "then": { "required": [ ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { }, "node_id": { }, "signature": { }, "chains": { }, "currency": { }, "minor_unit": { }, "warning_offer_unknown_currency": { }, "amount": { }, "amount_msat": { }, "send_invoice": { }, "refund_for": { }, "description": { }, "vendor": { }, "features": { }, "absolute_expiry": { }, "paths": { }, "quantity_min": { }, "quantity_max": { }, "recurrence": { }, "warning_offer_missing_description": { "type": "string", "description": "No **description**" } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 invoice" ] }, "valid": { "type": "boolean", "enum": [ true ] } } }, "then": { "required": [ "node_id", "signature", "amount_msat", "description", "created_at", "payment_hash", "relative_expiry", "min_final_cltv_expiry" ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { "type": "hex", "description": "the id of this offer (merkle hash of non-signature fields)", "maxLength": 64, "minLength": 64 }, "node_id": { "type": "point32", "description": "x-only public key of the offering node" }, "signature": { "type": "bip340sig", "description": "BIP-340 signature of the *node_id* on this offer" }, "chain": { "type": "hex", "description": "which blockchain this invoice is for (missing implies bitcoin mainnet only)", "maxLength": 64, "minLength": 64 }, "amount_msat": { "type": "msat", "description": "the amount in bitcoin" }, "send_invoice": { "type": "boolean", "description": "present if this offer was a send_invoice offer", "enum" : [ true ] }, "refund_for": { "type": "hex", "description": "the *payment_preimage* of invoice this is a refund for", "maxLength": 64, "minLength": 64 }, "description": { "type": "string", "description": "the description of the purpose of the offer" }, "vendor": { "type": "string", "description": "the name of the vendor for this offer" }, "features": { "type": "hex", "description": "the array of feature bits for this offer" }, "paths": { "type": "array", "description": "Paths to the destination", "items": { "type": "object", "required": [ "blinding", "path" ], "additionalProperties": false, "properties": { "blinding": { "type": "pubkey", "description": "blinding factor for this path" }, "path": { "type": "array", "description": "an individual path", "items": { "type": "object", "required": [ "node_id", "enctlv" ], "additionalProperties": false, "properties": { "node_id": { "type": "pubkey", "description": "node_id of the hop" }, "enctlv": { "type": "hex", "description": "encrypted TLV entry for this hop" } } } } } } }, "quantity": { "type": "u64", "description": "the quantity ordered" }, "recurrence_counter": { "type": "u32", "description": "the 0-based counter for a recurring payment" }, "recurrence_start": { "type": "u32", "description": "the optional start period for a recurring payment" }, "recurrence_basetime": { "type": "u32", "description": "the UNIX timestamp of the first recurrence period start" }, "payer_key": { "type": "point32", "description": "the transient key which identifies the payer" }, "payer_info": { "type": "hex", "description": "the payer-provided blob to derive payer_key" }, "timestamp": { "deprecated": true }, "created_at": { "type": "u64", "description": "the UNIX timestamp of invoice creation" }, "payment_hash": { "type": "hex", "description": "the hash of the *payment_preimage*", "maxLength": 64, "minLength": 64 }, "relative_expiry": { "type": "u32", "description": "the number of seconds after *created_at* when this expires" }, "min_final_cltv_expiry": { "type": "u32", "description": "the number of blocks required by destination" }, "fallbacks": { "type": "array", "description": "onchain addresses", "items": { "type": "object", "required": ["version", "hex"], "additionalProperties": false, "properties": { "version": { "type": "u8", "description": "Segwit address version" }, "hex": { "type": "hex", "description": "Raw encoded segwit address" }, "address": { "type": "string", "description": "bech32 segwit address" } } } }, "refund_signature": { "type": "bip340sig", "description": "the payer key signature to get a refund" } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 invoice" ] }, "valid": { "type": "boolean", "enum": [ false ] } } }, "then": { "required": [ ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { }, "node_id": { }, "signature": { }, "chain": { }, "amount_msat": { }, "send_invoice": { }, "refund_for": { }, "description": { }, "vendor": { }, "features": { }, "paths": { }, "quantity": { }, "recurrence_counter": { }, "recurrence_start": { }, "recurrence_basetime": { }, "payer_key": { }, "payer_info": { }, "timestamp": { }, "created_at": { }, "payment_hash": { }, "relative_expiry": { }, "min_final_cltv_expiry": { }, "fallbacks": { }, "refund_signature": { }, "warning_invoice_missing_amount": { "type": "string", "description": "**amount_msat* missing" }, "warning_invoice_missing_description": { "type": "string", "description": "No **description**" }, "warning_invoice_missing_blinded_payinfo": { "type": "string", "description": "Has **paths** without payinfo" }, "warning_invoice_invalid_blinded_payinfo": { "type": "string", "description": "Does not have exactly one payinfo for each of **paths**" }, "warning_invoice_missing_recurrence_basetime": { "type": "string", "description": "Has **recurrence_counter** without **recurrence_basetime**" }, "warning_invoice_missing_created_at": { "type": "string", "description": "Missing **created_at**" }, "warning_invoice_missing_payment_hash": { "type": "string", "description": "Missing **payment_hash**" }, "warning_invoice_refund_signature_missing_payer_key": { "type": "string", "description": "Missing **payer_key** for refund_signature" }, "warning_invoice_refund_signature_invalid": { "type": "string", "description": "**refund_signature** incorrect" }, "warning_invoice_refund_missing_signature": { "type": "string", "description": "No **refund_signature**" }, "fallbacks": { "type": "array", "items": { "type": "object", "required": ["version", "hex"], "properties": { "version": { }, "hex": { }, "address": { }, "warning_invoice_fallbacks_version_invalid": { "type": "string", "description": "**version** is > 16" } } } } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 invoice_request" ] }, "valid": { "type": "boolean", "enum": [ true ] } } }, "then": { "required": [ "offer_id", "payer_key" ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { "type": "hex", "description": "the id of the offer this is requesting (merkle hash of non-signature fields)", "maxLength": 64, "minLength": 64 }, "chain": { "type": "hex", "description": "which blockchain this invoice_request is for (missing implies bitcoin mainnet only)", "maxLength": 64, "minLength": 64 }, "amount_msat": { "type": "msat", "description": "the amount in bitcoin" }, "features": { "type": "hex", "description": "the array of feature bits for this offer" }, "quantity": { "type": "u64", "description": "the quantity ordered" }, "recurrence_counter": { "type": "u32", "description": "the 0-based counter for a recurring payment" }, "recurrence_start": { "type": "u32", "description": "the optional start period for a recurring payment" }, "payer_key": { "type": "point32", "description": "the transient key which identifies the payer" }, "payer_info": { "type": "hex", "description": "the payer-provided blob to derive payer_key" }, "recurrence_signature": { "type": "bip340sig", "description": "the payer key signature" } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt12 invoice_request" ] }, "valid": { "type": "boolean", "enum": [ false ] } } }, "then": { "required": [ ], "additionalProperties": false, "properties": { "type": { }, "valid": { }, "offer_id": { }, "chain": { }, "amount_msat": { }, "features": { }, "quantity": { }, "recurrence_counter": { }, "recurrence_start": { }, "payer_key": { }, "payer_info": { }, "recurrence_signature": { }, "warning_invoice_request_missing_offer_id": { "type": "string", "description": "No **offer_id**" }, "warning_invoice_request_missing_payer_key": { "type": "string", "description": "No **payer_key**" }, "warning_invoice_request_missing_recurrence_signature": { "type": "string", "description": "No **recurrence_signature**" }, "warning_invoice_request_invalid_recurrence_signature": { "type": "string", "description": "**recurrence_signature** incorrect" } } } }, { "if": { "properties": { "type": { "type": "string", "enum": [ "bolt11 invoice" ] }, "valid": { "type": "boolean", "enum": [ true ] } } }, "then": { "required": [ "currency", "created_at", "expiry", "payee", "min_final_cltv_expiry", "payment_hash", "signature" ], "additionalProperties": false, "properties": { "currency": { "type": "string", "description": "the BIP173 name for the currency" }, "created_at": { "type": "u64", "description": "the UNIX-style timestamp of the invoice" }, "expiry": { "type": "u64", "description": "the number of seconds this is valid after *timestamp*" }, "payee": { "type": "pubkey", "description": "the public key of the recipient" }, "msatoshi": { "type": "u64", "deprecated": true }, "amount_msat": { "type": "msat", "description": "Amount the invoice asked for" }, "payment_hash": { "type": "hex", "description": "the hash of the *payment_preimage*", "maxLength": 64, "minLength": 64 }, "signature": { "type": "signature", "description": "signature of the *payee* on this invoice" }, "description": { "type": "string", "description": "the description of the purpose of the purchase" }, "description_hash": { "type": "hex", "description": "the hash of the description, in place of *description*", "maxLength": 64, "minLength": 64 }, "min_final_cltv_expiry": { "type": "u32", "description": "the minimum CLTV delay for the final node" }, "payment_secret": { "type": "hex", "description": "the secret to hand to the payee node", "maxLength": 64, "minLength": 64 }, "features": { "type": "hex", "description": "the features bitmap for this invoice" }, "fallbacks": { "type": "array", "description": "onchain addresses", "items": { "type": "object", "required": ["type", "hex"], "additionalProperties": false, "properties": { "type": { "type": "string", "description": "the address type (if known)", "enum": [ "P2PKH", "P2SH", "P2WPKH", "P2WSH" ] }, "addr": { "type": "string", "description": "the address in appropriate format for *type*" }, "hex": { "type": "hex", "description": "Raw encoded address" } } } }, "routes": { "type": "array", "description": "Route hints to the *payee*", "items": { "type": "array", "description": "hops in the route", "items": { "type": "object", "required": [ "pubkey", "short_channel_id", "fee_base_msat", "fee_proportional_millionths", "cltv_expiry_delta" ], "additionalProperties": false, "properties": { "pubkey": { "type": "pubkey", "description": "the public key of the node" }, "short_channel_id": { "type": "short_channel_id", "description": "a channel to the next peer" }, "fee_base_msat": { "type": "u32", "description": "the base fee for payments" }, "fee_proportional_millionths": { "type": "u32", "description": "the parts-per-million fee for payments" }, "cltv_expiry_delta": { "type": "u32", "description": "the CLTV delta across this hop" } } } } }, "extra": { "type": "array", "description": "Any extra fields we didn't know how to parse", "items": { "type": "object", "required": [ "tag", "data" ], "additionalProperties": false, "properties": { "tag": { "type": "string", "description": "The bech32 letter which identifies this field", "maxLength": 1, "minLength": 1 }, "data": { "type": "string", "description": "The bech32 data for this field" } } } } } } } ] }