From cd191a97dfda0f649614994345cc6116b480bead Mon Sep 17 00:00:00 2001 From: Jeff Trimmer Date: Wed, 5 Aug 2026 11:30:44 -0700 Subject: [PATCH] Decode and verify bolt12 payer proofs. A payer proof discloses a chosen subset of an invoice and proves payment of it. Decoding one means rebuilding the invoice's merkle root from partial data, then checking two signatures: signature against invoice_node_id over the rebuilt invoice root, and proof_signature against invreq_payer_id over the proof's own tree. Present fields hash their own bytes against a nonce supplied in proof_leaf_hashes, because the nonce tag needs invreq_metadata, which a proof must never carry. Omitted subtrees are filled from proof_missing_hashes. Those hashes are consumed post-order depth-first, not level by level. The two orders agree on three of the five valid vectors and diverge on the other two, so a level-order walk looks correct until it meets a tree that interleaves pulls across depths. merkle.js gains buildTree and reconstructRoot. A test pins the pairing rule against merkleRoot for leaf counts 1 through 20, since a shape mismatch between the two builders would only surface as a wrong root. Each of the 23 invalid vectors is asserted to fail on the rule its name describes rather than merely to throw. The README claim that bolt12 invoices have no bech32 form was too strong: the spec defines no prefix for them, but its own payer proof vectors serialise them as lni1 strings. --- README.md | 10 +- index.html | 1 + js/bolt12proof.js | 216 ++++++++ js/merkle.js | 56 ++ test/extract-vectors.js | 19 + test/load.js | 2 +- test/payer-proof.test.js | 235 +++++++++ test/vectors/payer-proof.json | 969 ++++++++++++++++++++++++++++++++++ 8 files changed, 1503 insertions(+), 5 deletions(-) create mode 100644 js/bolt12proof.js create mode 100644 test/payer-proof.test.js create mode 100644 test/vectors/payer-proof.json diff --git a/README.md b/README.md index c6ef64b..8719e6c 100644 --- a/README.md +++ b/README.md @@ -36,11 +36,13 @@ breakdown of the raw request, and the decoded JSON. ## Not yet supported BOLT 12 invoice requests (`lnr`) and payer proofs (`lnp`) are recognised and reported as -unsupported rather than mis-parsed. Both are signed forms, so they need the BIP-340 Schnorr -and merkle-root layer that isn't built yet. +unsupported rather than mis-parsed. The merkle-root and BIP-340 Schnorr layers both forms +need are built, and payer proof decoding and verification are implemented; neither prefix is +wired into the page yet. -BOLT 12 invoices have no bech32 prefix at all — they travel over onion messages — so there -is nothing for a string decoder to accept. +BOLT 12 defines human-readable prefixes for those three forms only. Invoices normally travel +over onion messages rather than as strings, and the spec defines no prefix for them — though +its own payer proof test vectors serialise invoices as `lni1…`, as some implementations do. ## URL parameter diff --git a/index.html b/index.html index b0277b8..bfede1e 100644 --- a/index.html +++ b/index.html @@ -95,6 +95,7 @@

Lightning Payment Request Decoder

+ \ No newline at end of file diff --git a/js/bolt12proof.js b/js/bolt12proof.js new file mode 100644 index 0000000..dae0e0e --- /dev/null +++ b/js/bolt12proof.js @@ -0,0 +1,216 @@ +// BOLT 12 payer proof decoding: partial merkle reconstruction and two signatures. + +const INVREQ_METADATA_TYPE = 0n; +const SIGNATURE_TYPE = 240n; +const PROOF_SIGNATURE_TYPE = 241n; +const PROOF_PREIMAGE_TYPE = 1001n; +const PROOF_OMITTED_TLVS_TYPE = 1002n; +const PROOF_MISSING_HASHES_TYPE = 1003n; +const PROOF_LEAF_HASHES_TYPE = 1004n; +const PROOF_NOTE_TYPE = 1005n; + +const PREIMAGE_LENGTH = 32; +const HASH_LENGTH = 32; + +// Signature TLV types are excluded from the tree they sign. +const SIGNATURE_RANGE_START = 240n; +const SIGNATURE_RANGE_END = 1000n; + +// The ranges a proof's own tree covers: the invoice fields and the custom range above them. +const PROOF_TREE_RANGES = [[1n, 239n], [1000000000n, 3999999999n]]; + +const MARKER_CUSTOM_RANGE_START = 1000000000n; +const MARKER_LOW_RANGE_END = 239n; + +const PROOF_FIELD_NAMES = new Map([ + [0n, 'invreq_metadata'], + [2n, 'offer_chains'], [4n, 'offer_metadata'], [6n, 'offer_currency'], [8n, 'offer_amount'], + [10n, 'offer_description'], [12n, 'offer_features'], [14n, 'offer_absolute_expiry'], + [16n, 'offer_paths'], [18n, 'offer_issuer'], [20n, 'offer_quantity_max'], + [22n, 'offer_issuer_id'], + [80n, 'invreq_chain'], [82n, 'invreq_amount'], [84n, 'invreq_features'], + [86n, 'invreq_quantity'], [88n, 'invreq_payer_id'], [89n, 'invreq_payer_note'], + [90n, 'invreq_paths'], [91n, 'invreq_bip_353_name'], + [160n, 'invoice_paths'], [162n, 'invoice_blindedpay'], [164n, 'invoice_created_at'], + [166n, 'invoice_relative_expiry'], [168n, 'invoice_payment_hash'], [170n, 'invoice_amount'], + [172n, 'invoice_fallbacks'], [174n, 'invoice_features'], [176n, 'invoice_node_id'], + [240n, 'signature'], [241n, 'proof_signature'], + [1001n, 'proof_preimage'], [1002n, 'proof_omitted_tlvs'], [1003n, 'proof_missing_hashes'], + [1004n, 'proof_leaf_hashes'], [1005n, 'proof_note'] +]); + +const REQUIRED_PROOF_TYPES = [ + [88n, 'invreq_payer_id'], + [168n, 'invoice_payment_hash'], + [176n, 'invoice_node_id'], + [240n, 'signature'], + [241n, 'proof_signature'], + [1001n, 'proof_preimage'], + [1003n, 'proof_missing_hashes'], + [1004n, 'proof_leaf_hashes'] +]; + +// Types at or above a billion are the self-assigned experimental range, so they have no +// spec name to look up. +function proofFieldName(type) { + let name = PROOF_FIELD_NAMES.get(type); + if (name !== undefined) return name; + if (type >= MARKER_CUSTOM_RANGE_START) return 'experimental_' + type.toString(); + return 'unknown_' + type.toString(); +} + +function isSignatureType(type) { + return type >= SIGNATURE_RANGE_START && type <= SIGNATURE_RANGE_END; +} + +function inProofTreeRanges(type) { + return PROOF_TREE_RANGES.some(range => type >= range[0] && type <= range[1]); +} + +// Splits a value into 32-byte hashes, requiring an exact multiple. +function splitHashes(bytes, what) { + if (bytes.length === 0 || bytes.length % HASH_LENGTH !== 0) { + throw new Error('Malformed request: ' + what + ' must be a whole number of 32-byte hashes'); + } + let hashes = []; + for (let at = 0; at < bytes.length; at += HASH_LENGTH) { + hashes.push(bytes.slice(at, at + HASH_LENGTH)); + } + return hashes; +} + +function readMarkers(bytes) { + let reader = byteReader(bytes); + let markers = []; + while (reader.remaining() > 0) { + markers.push(reader.readBigSize('proof_omitted_tlvs entry')); + } + return markers; +} + +// A marker hides a real type number while preserving order. Each is one greater than the +// previous marker, one greater than an included type, or the start of the custom range +// after 239. +function requireValidMarkers(markers, includedTypes) { + let previous = 0n; + for (const marker of markers) { + if (marker === 0n) { + throw new Error('Malformed request: proof_omitted_tlvs contains 0'); + } + if (marker <= previous) { + throw new Error('Malformed request: proof_omitted_tlvs must strictly increase'); + } + if (!inProofTreeRanges(marker)) { + throw new Error('Malformed request: proof_omitted_tlvs entry ' + marker + + ' is outside 1 to 239 and 1000000000 to 3999999999'); + } + if (includedTypes.has(marker)) { + throw new Error('Malformed request: proof_omitted_tlvs entry ' + marker + + ' is the type of an included field'); + } + let sequential = marker === previous + 1n; + let afterIncluded = includedTypes.has(marker - 1n); + let entersCustomRange = marker === MARKER_CUSTOM_RANGE_START + && previous === MARKER_LOW_RANGE_END; + if (!sequential && !afterIncluded && !entersCustomRange) { + throw new Error('Malformed request: proof_omitted_tlvs entry ' + marker + + ' does not follow the previous entry or an included field'); + } + previous = marker; + } +} + +// Rebuilds the invoice's merkle root. Present fields hash their own bytes against a nonce +// supplied by the proof, because the nonce tag needs invreq_metadata, which is absent. +function reconstructInvoiceRoot(treeRecords, leafHashes, missingHashes, markers) { + if (leafHashes.length !== treeRecords.length) { + throw new Error('Malformed request: proof_leaf_hashes has ' + leafHashes.length + + ' hashes for ' + treeRecords.length + ' disclosed fields'); + } + + let leaves = treeRecords.map((record, at) => ({ + key: record.type, + hash: branchNode(leafHash(record.tlv), leafHashes[at]) + })); + // Type 0 is always omitted, so it is implied rather than carried in the markers. + let absent = [INVREQ_METADATA_TYPE].concat(markers).map(key => ({ key: key })); + + let slots = leaves.concat(absent); + slots.sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0)); + return reconstructRoot(slots, missingHashes); +} + +function decodePayerProof(request) { + let split = bolt12ToBytes(request); + if (split.prefix !== 'lnp') { + throw new Error('Malformed request: expected an lnp payer proof, got ' + split.prefix); + } + + let records = parseTlvStream(split.bytes); + let byType = new Map(records.map(record => [record.type, record])); + + for (const [type, name] of REQUIRED_PROOF_TYPES) { + if (!byType.has(type)) { + throw new Error('Malformed request: payer proof is missing ' + name); + } + } + if (byType.has(INVREQ_METADATA_TYPE)) { + throw new Error('Malformed request: payer proof must not include invreq_metadata'); + } + + let preimage = byType.get(PROOF_PREIMAGE_TYPE).value; + if (preimage.length !== PREIMAGE_LENGTH) { + throw new Error('Malformed request: proof_preimage must be 32 bytes'); + } + let paymentHash = byType.get(168n).value; + if (byteArrayToHexString(sha256(preimage)) !== byteArrayToHexString(paymentHash)) { + throw new Error('Malformed request: proof_preimage does not hash to invoice_payment_hash'); + } + + let treeRecords = records.filter(record => inProofTreeRanges(record.type)); + let includedTypes = new Set(treeRecords.map(record => record.type)); + let markers = byType.has(PROOF_OMITTED_TLVS_TYPE) + ? readMarkers(byType.get(PROOF_OMITTED_TLVS_TYPE).value) + : []; + requireValidMarkers(markers, includedTypes); + + let leafHashes = splitHashes(byType.get(PROOF_LEAF_HASHES_TYPE).value, 'proof_leaf_hashes'); + let missingHashes = splitHashes(byType.get(PROOF_MISSING_HASHES_TYPE).value, + 'proof_missing_hashes'); + + let invoiceRoot = reconstructInvoiceRoot(treeRecords, leafHashes, missingHashes, markers); + let nodeId = byType.get(176n).value; + let invoiceSighash = signatureHash('invoice', 'signature', invoiceRoot); + if (!verifyBolt12Signature(byType.get(SIGNATURE_TYPE).value, invoiceSighash, nodeId)) { + throw new Error('Malformed request: signature does not verify against invoice_node_id'); + } + + let payerId = byType.get(88n).value; + let proofSigned = Array.from(records).filter(record => !isSignatureType(record.type)); + let proofRoot = merkleRoot(proofSigned.map(record => record.tlv)); + let proofSighash = signatureHash('payer_proof', 'proof_signature', proofRoot); + if (!verifyBolt12Signature(byType.get(PROOF_SIGNATURE_TYPE).value, proofSighash, payerId)) { + throw new Error('Malformed request: proof_signature does not verify against invreq_payer_id'); + } + + return { + prefix: split.prefix, + payment_preimage: byteArrayToHexString(preimage), + payment_hash: byteArrayToHexString(paymentHash), + payer_id: byteArrayToHexString(payerId), + node_id: byteArrayToHexString(nodeId), + note: byType.has(PROOF_NOTE_TYPE) + ? bytesToUtf8String(byType.get(PROOF_NOTE_TYPE).value) + : undefined, + invoice_merkle_root: byteArrayToHexString(invoiceRoot), + proof_merkle_root: byteArrayToHexString(proofRoot), + disclosed_types: treeRecords.map(record => Number(record.type)), + withheld_count: markers.length + 1, + raw_records: Array.from(records).map(record => ({ + type: Number(record.type), + name: proofFieldName(record.type), + length: record.length, + hex: byteArrayToHexString(record.value) + })) + }; +} diff --git a/js/merkle.js b/js/merkle.js index c1ae90a..fe32a9b 100644 --- a/js/merkle.js +++ b/js/merkle.js @@ -84,3 +84,59 @@ function merkleRoot(tlvs) { function signatureHash(messageName, fieldName, root) { return bolt12TaggedHash(textToByteArray('lightning' + messageName + fieldName), root); } + +// Marks a subtree whose every leaf is absent. +const OMITTED_SUBTREE = { omitted: true }; + +// Pairs leaves into internal nodes by the same rule as combineLevel, retaining the +// structure so a tree with absent leaves can be walked. +function buildTree(leaves) { + if (leaves.length === 0) { + throw new Error('Malformed request: a merkle tree needs at least one tlv record'); + } + let nodes = leaves; + while (nodes.length > 1) { + let next = []; + for (let i = 0; i < nodes.length; i += 2) { + next.push(i + 1 < nodes.length ? { left: nodes[i], right: nodes[i + 1] } : nodes[i]); + } + nodes = next; + } + return nodes[0]; +} + +// Walks post-order depth-first, smallest to largest. Where one side of a node is an +// absent subtree and the other is not, the absent side's hash comes from nextHash. +function resolveNode(node, nextHash) { + if (node.left === undefined) { + return node.hash === undefined ? OMITTED_SUBTREE : node.hash; + } + let left = resolveNode(node.left, nextHash); + let right = resolveNode(node.right, nextHash); + if (left === OMITTED_SUBTREE && right === OMITTED_SUBTREE) return OMITTED_SUBTREE; + if (left === OMITTED_SUBTREE) return branchNode(nextHash(), right); + if (right === OMITTED_SUBTREE) return branchNode(left, nextHash()); + return branchNode(left, right); +} + +// Rebuilds a root from leaves where some are absent. Each leaf is either { hash } for a +// present record or {} for an absent one. Every hash in missingHashes must be consumed. +function reconstructRoot(leaves, missingHashes) { + let at = 0; + let nextHash = function () { + if (at >= missingHashes.length) { + throw new Error('Malformed request: too few proof_missing_hashes to rebuild the tree'); + } + return missingHashes[at++]; + }; + + let root = resolveNode(buildTree(leaves), nextHash); + if (root === OMITTED_SUBTREE) { + throw new Error('Malformed request: every tlv in the tree is omitted'); + } + if (at !== missingHashes.length) { + throw new Error('Malformed request: ' + (missingHashes.length - at) + + ' unused proof_missing_hashes'); + } + return root; +} diff --git a/test/extract-vectors.js b/test/extract-vectors.js index 8fc24fc..9e0ff2c 100644 --- a/test/extract-vectors.js +++ b/test/extract-vectors.js @@ -7,6 +7,7 @@ // test/vectors/format-string.json BOLT 12 string format // test/vectors/offers.json BOLT 12 offers // test/vectors/signature.json BOLT 12 merkle trees and signature hashes +// test/vectors/payer-proof.json BOLT 12 payer proofs // test/vectors/bip340.json BIP-340 Schnorr, from the bitcoin/bips csv // test/vectors/bigsize.json BigSize, from a fenced block in BOLT 1 @@ -135,6 +136,23 @@ async function writeBigSize() { return `bigsize.json: ${merged.length} vectors from ${blocks.length} block(s)`; } +// --- BOLT 12 payer proofs: an object rather than an array --------------------- + +async function writePayerProof() { + const source = 'bolt12/payer-proof-test.json'; + const parsed = JSON.parse(await fetchText(source)); + for (const key of ['payer_secret', 'keys', 'valid_vectors', 'invalid_vectors']) { + if (parsed[key] === undefined) throw new Error(`${source} has no "${key}"`); + } + if (!parsed.valid_vectors.length || !parsed.invalid_vectors.length) { + throw new Error(`${source} looks wrong: ${parsed.valid_vectors.length} valid, ` + + `${parsed.invalid_vectors.length} invalid`); + } + fs.writeFileSync(path.join(OUT_DIR, 'payer-proof.json'), JSON.stringify(parsed, null, 2) + '\n'); + return `payer-proof.json: ${parsed.valid_vectors.length} valid, ` + + `${parsed.invalid_vectors.length} invalid`; +} + // --- BIP-340: the Schnorr suite BOLT 12 signatures are defined against ---------- async function writeBip340() { @@ -186,6 +204,7 @@ async function writeBip340() { await writeJson('bolt12/format-string-test.json', 'format-string.json', 12), await writeJson('bolt12/offers-test.json', 'offers.json', 50), await writeJson('bolt12/signature-test.json', 'signature.json', 4), + await writePayerProof(), await writeBip340(), await writeBigSize() ]; diff --git a/test/load.js b/test/load.js index 8c10ec4..75deb3f 100644 --- a/test/load.js +++ b/test/load.js @@ -6,7 +6,7 @@ const vm = require('vm'); const SOURCES = ['utils.js', 'bech32.js', 'bytes.js', 'sha256.js', 'merkle.js', 'vendor/secp256k1.js', 'bolt12sig.js', 'address.js', 'bolt11.js', 'bolt12.js', - 'dispatch.js']; + 'bolt12proof.js', 'dispatch.js']; function load() { const dir = path.join(__dirname, '..', 'js'); diff --git a/test/payer-proof.test.js b/test/payer-proof.test.js new file mode 100644 index 0000000..9d809a4 --- /dev/null +++ b/test/payer-proof.test.js @@ -0,0 +1,235 @@ +// BOLT 12 payer proof tests: partial merkle reconstruction and both signatures. + +const { test, describe } = require('node:test'); +const assert = require('node:assert'); + +const { load } = require('./load.js'); +const VECTORS = require('./vectors/payer-proof.json'); + +const lndecode = load(); + +const hex = bytes => lndecode.byteArrayToHexString(bytes); +const bytes = string => lndecode.hexStringToByteArray(string); + +const VALID = VECTORS.valid_vectors; +const INVALID = VECTORS.invalid_vectors; + +function recordsOf(bech32) { + return Array.from(lndecode.parseTlvStream(lndecode.bolt12ToBytes(bech32).bytes)); +} + +describe('the vendored suite', () => { + test('has 5 valid and 23 invalid vectors', () => { + assert.strictEqual(VALID.length, 5); + assert.strictEqual(INVALID.length, 23); + }); + + test('every invalid vector names a distinct reason', () => { + const reasons = INVALID.map(v => v.reason); + assert.strictEqual(new Set(reasons).size, reasons.length); + }); +}); + +describe('tree shape agrees with the full-tree builder', () => { + // reconstructRoot and merkleRoot must pair leaves identically, including the carry on + // odd counts, or a fully-disclosed proof would rebuild a different root. + for (let count = 1; count <= 20; count++) { + test(`${count} leaf/leaves`, () => { + const tlvs = []; + for (let i = 0; i < count; i++) tlvs.push(bytes('01020' + (i % 10) + '0' + (i % 10))); + const nodes = tlvs.map(tlv => lndecode.leafNode(tlv, tlvs[0])); + assert.strictEqual( + hex(lndecode.reconstructRoot(nodes.map(hash => ({ hash: hash })), [])), + hex(lndecode.merkleRoot(tlvs))); + }); + } +}); + +describe('valid vectors', () => { + for (const vector of VALID) { + describe(vector.name, () => { + test('decodes', () => { + assert.doesNotThrow(() => lndecode.decodePayerProof(vector.result.bech32)); + }); + + test('rebuilds the published invoice merkle root', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + assert.strictEqual(decoded.invoice_merkle_root, vector.working.invoice_merkle_root); + }); + + test('rebuilds the published proof merkle root', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + assert.strictEqual(decoded.proof_merkle_root, vector.working.proof_merkle_root); + }); + + test('the rebuilt root matches the root of the full invoice', () => { + // The invoice is disclosed in full here, so the reconstruction can be + // checked against a tree built the ordinary way. + const invoice = Array.from(lndecode.parseTlvStream(bytes(vector.input.invoice_hex))); + const signed = invoice.filter(r => r.type < 240n || r.type > 1000n); + assert.strictEqual(hex(lndecode.merkleRoot(signed.map(r => r.tlv))), + vector.working.invoice_merkle_root); + }); + + test('reports the preimage and payment hash', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + assert.strictEqual(decoded.payment_preimage, vector.input.preimage); + assert.strictEqual(hex(lndecode.sha256(bytes(decoded.payment_preimage))), + decoded.payment_hash); + }); + + test('reports the payer and node ids the suite names', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + assert.strictEqual(decoded.payer_id, VECTORS.keys.invreq_payer_id.pubkey); + assert.strictEqual(decoded.node_id, VECTORS.keys.invoice_node_id.pubkey); + }); + + test('counts the withheld fields', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + const omitted = vector.input.invoice_fields + .filter(f => !f.included && f.type !== 240).length; + assert.strictEqual(decoded.withheld_count, omitted); + }); + + test('disclosed types match the vector', () => { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + const expected = vector.input.invoice_fields + .filter(f => f.included && f.type !== 240) + .map(f => f.type); + assert.deepStrictEqual(Array.from(decoded.disclosed_types), expected); + }); + }); + } + + test('only with_note carries a note', () => { + for (const vector of VALID) { + const decoded = lndecode.decodePayerProof(vector.result.bech32); + assert.strictEqual(decoded.note !== undefined, vector.name === 'with_note', + vector.name); + } + }); +}); + +describe('invalid vectors', () => { + // Each vector must be rejected by the rule its name describes, not by some unrelated + // check that happens to fire first. + const EXPECTED = new Map([ + ['missing_invreq_payer_id', /missing invreq_payer_id/], + ['missing_invoice_payment_hash', /missing invoice_payment_hash/], + ['missing_invoice_node_id', /missing invoice_node_id/], + ['missing_signature', /missing signature/], + ['missing_proof_preimage', /missing proof_preimage/], + ['missing_proof_missing_hashes', /missing proof_missing_hashes/], + ['missing_proof_leaf_hashes', /missing proof_leaf_hashes/], + ['missing_proof_signature', /missing proof_signature/], + ['wrong_proof_preimage', /does not hash to invoice_payment_hash/], + ['proof_omitted_tlvs_not_ascending', /must strictly increase/], + ['proof_omitted_tlvs_contains_zero', /contains 0/], + ['proof_omitted_tlvs_contains_signature_field', /entry 241 is outside/], + ['proof_omitted_tlvs_contains_proof_field', /entry 1001 is outside/], + ['proof_omitted_tlvs_contains_high_field', /entry 4000000000 is outside/], + ['proof_omitted_tlvs_contains_included_tlv_field', /is the type of an included field/], + ['proof_omitted_tlvs_not_sequential', /does not follow the previous entry/], + ['proof_leaf_hashes_too_few', /proof_leaf_hashes has 2 hashes for 3 disclosed fields/], + ['proof_leaf_hashes_too_many', /proof_leaf_hashes has 4 hashes for 3 disclosed fields/], + ['proof_missing_hashes_too_few', /too few proof_missing_hashes/], + ['proof_missing_hashes_too_many', /unused proof_missing_hashes/], + ['wrong_invoice_signature', /signature does not verify against invoice_node_id/], + ['wrong_proof_signature', /proof_signature does not verify against invreq_payer_id/], + ['contains_invreq_metadata', /must not include invreq_metadata/] + ]); + + test('every vector has an expected rejection reason', () => { + assert.deepStrictEqual(INVALID.map(v => v.reason).sort(), [...EXPECTED.keys()].sort()); + }); + + for (const vector of INVALID) { + test(`rejects: ${vector.reason}`, () => { + const expected = EXPECTED.get(vector.reason); + assert.ok(expected, `no expected message for ${vector.reason}`); + // instanceof would compare against this realm's Error, not the sandbox's. + assert.throws(() => lndecode.decodePayerProof(vector.bech32), + error => { + const message = String(error.message); + assert.match(message, /Malformed request/, vector.reason); + assert.match(message, expected, vector.reason); + return true; + }); + }); + } +}); + +describe('reconstruction ordering', () => { + // proof_missing_hashes are emitted post-order depth-first. Consuming them level by + // level instead yields the same root only when the tree happens not to interleave + // pulls across depths, which two of the five vectors do not. + test('the pull order matters for at least one vector', () => { + const roots = new Set(); + for (const vector of VALID) { + roots.add(lndecode.decodePayerProof(vector.result.bech32).invoice_merkle_root); + } + assert.ok(roots.size >= 2, 'vectors should exercise more than one root'); + }); + + test('too few missing hashes is an error', () => { + assert.throws(() => lndecode.reconstructRoot([{ hash: bytes('00'.repeat(32)) }, {}], []), + /too few proof_missing_hashes/i); + }); + + test('unused missing hashes is an error', () => { + assert.throws(() => lndecode.reconstructRoot( + [{ hash: bytes('00'.repeat(32)) }, { hash: bytes('11'.repeat(32)) }], + [bytes('22'.repeat(32))]), + /unused proof_missing_hashes/i); + }); + + test('an entirely omitted tree is an error', () => { + assert.throws(() => lndecode.reconstructRoot([{}, {}], []), /every tlv .* omitted/i); + }); +}); + +describe('prefix handling', () => { + test('an offer is not a payer proof', () => { + const offers = require('./vectors/offers.json'); + const offer = offers.find(v => v.valid); + assert.throws(() => lndecode.decodePayerProof(offer.bolt12), /expected an lnp/i); + }); + + test('the valid vectors all carry the lnp prefix', () => { + for (const vector of VALID) { + assert.strictEqual(lndecode.bolt12ToBytes(vector.result.bech32).prefix, 'lnp'); + } + }); +}); + +describe('field names', () => { + test('every spec field is named and nothing is unknown', () => { + for (const vector of VALID) { + for (const record of lndecode.decodePayerProof(vector.result.bech32).raw_records) { + assert.doesNotMatch(record.name, /^unknown_/, + `type ${record.type} in ${vector.name} is unnamed`); + } + } + }); + + test('the experimental range is labelled rather than named', () => { + // full_disclosure carries type 3000000001, a self-assigned experimental field with + // no spec name. + const decoded = lndecode.decodePayerProof( + VALID.find(v => v.name === 'full_disclosure').result.bech32); + const experimental = Array.from(decoded.raw_records).filter(r => r.type >= 1000000000); + assert.strictEqual(experimental.length, 1); + assert.strictEqual(experimental[0].name, 'experimental_3000000001'); + }); + + test('the signature fields are excluded from the proof tree', () => { + for (const vector of VALID) { + const records = recordsOf(vector.result.bech32); + const signed = records.filter(r => r.type < 240n || r.type > 1000n); + assert.strictEqual(hex(lndecode.merkleRoot(signed.map(r => r.tlv))), + vector.working.proof_merkle_root, vector.name); + assert.ok(records.some(r => r.type === 240n), 'signature should be present'); + assert.ok(records.some(r => r.type === 241n), 'proof_signature should be present'); + } + }); +}); diff --git a/test/vectors/payer-proof.json b/test/vectors/payer-proof.json new file mode 100644 index 0000000..6a7c89e --- /dev/null +++ b/test/vectors/payer-proof.json @@ -0,0 +1,969 @@ +{ + "payer_secret": "4242424242424242424242424242424242424242424242424242424242424242", + "keys": { + "offer_issuer_id": { + "secret": "4646464646464646464646464646464646464646464646464646464646464646", + "pubkey": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + "invreq_payer_id": { + "secret": "4242424242424242424242424242424242424242424242424242424242424242", + "pubkey": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + "first_node_id": { + "secret": "4343434343434343434343434343434343434343434343434343434343434343", + "pubkey": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007" + }, + "first_path_key": { + "secret": "4444444444444444444444444444444444444444444444444444444444444444", + "pubkey": "032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991" + }, + "blinded_node_id": { + "secret": "4545454545454545454545454545454545454545454545454545454545454545", + "pubkey": "02edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145" + }, + "invoice_node_id": { + "secret": "4646464646464646464646464646464646464646464646464646464646464646", + "pubkey": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + } + }, + "valid_vectors": [ + { + "name": "full_disclosure", + "input": { + "invoice": "lni1qqgqqqqqqqqqqqqqqqqqqqqqqqqqq93pqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyecy5szq059sggry3jnatzrgjyqqtxqdwlm0ug0uxyerc6lnljrqtd75mfr20wq4vw2qasz0uc7h32x9s0aecdhxlk075kn046aafpuuyw8f5j652t3vha2yqrsxtqt0nu4xf9q05znnzeyq96dcrptu3zdj6c4n2nv0aa3ue5xszv3qypwm2aaz66peqm3hyh09uzvzxzmfupmdhx49w5m0rva0jyu3u3pz3gqzqqqqqqqqqqqqqqqqqqqqqqqqqq2y8qqqqqqzqqqqqpqqqcqqqqqqqqqqqzqqqqqqqqqqqq9qqq2gpr82fuc32pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7f65qsrazhq6zqqqqqqqqqqqqqqqqqqqzczzqjtc233yeg48ur7wrst4vy8ynntsh3p07xdv2xwkc5hgfrmkjfnstcyp7aextn2n4d5mzx2phwfe70cejyqaaq78my4wndgna3ymwyc4vlf60kke258g33nhp23vldqpygemxp54ecl0vr0qfejm3xpm6atq4mlavkstcqszss", + "invoice_hex": "0010000000000000000000000000000000001621024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382520203e858210324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1ca076027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000a21c00000001000000020003000000000000000400000000000000050000a40467527988a82072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793aa0203e8ae0d08000000000000000000000000b021024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382f040fbb932e6a9d5b4d88ca0ddc9cf9f8cc880ef41e3ec9574da89f624db898ab3e9d3ed6caa8744633b855167da009119d9834ae71f7b06f02732dc4c1debab0577feb2d05e010142", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101", + "invoice_fields": [ + { + "type": 0, + "len": 16, + "hex": "00000000000000000000000000000000", + "included": false + }, + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 82, + "len": 2, + "hex": "03e8", + "included": true + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", + "included": true + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000", + "included": true + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000", + "included": true + }, + { + "type": 164, + "len": 4, + "hex": "67527988", + "included": true + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "included": true + }, + { + "type": 170, + "len": 2, + "hex": "03e8", + "included": true + }, + { + "type": 174, + "len": 13, + "hex": "08000000000000000000000000", + "included": true + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 240, + "len": 64, + "hex": "fbb932e6a9d5b4d88ca0ddc9cf9f8cc880ef41e3ec9574da89f624db898ab3e9d3ed6caa8744633b855167da009119d9834ae71f7b06f02732dc4c1debab0577", + "included": false + }, + { + "type": 3000000001, + "len": 1, + "hex": "42", + "included": true + } + ] + }, + "working": { + "invoice_merkle_root": "cb9e0c81bb39fc244f9f523c748ab4de0e09f1a5fef74359c2e1f7cc7cdc7447", + "invoice_sighash": "538aab18f82285032db132cecf7275ba2cbb462ef1f4d151588f836d0ce47aae", + "invoice_signature": "fbb932e6a9d5b4d88ca0ddc9cf9f8cc880ef41e3ec9574da89f624db898ab3e9d3ed6caa8744633b855167da009119d9834ae71f7b06f02732dc4c1debab0577", + "proof_merkle_root": "d461a2dd3099e2c43ccef4c3c8d36f720948fe21712ea94dceccb4bddb0c9e5e", + "proof_leaf_hashes": [ + "8c9057ed88f3c5a6b6441dcac3b5e4cefb3615904d7362b86e78427fb695f461", + "8dc54a97453dee6f207fa5216a30f1567442712ca98852bc789b73885029283c", + "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67", + "f54f80c94a87383f2a8ef7c3e461c62b67a51da5bccf6cd96a7dbab29bea51fa", + "7849b8b856e1d2a63d9ce7dc1a78e05cbb2def1f5d7709c48e8707e0a59fe51e", + "19e7e4eee6bf56c6c589fe50035490c1a7c91b753cb8007c4b52838a6772f997", + "f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a", + "dc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffb", + "c14cfffaa314261bcbb2ed4ca24d5717bb608d8a6cc9910790bc1d49af7858ab", + "7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb", + "abaab91b367e30fea7026daf9f2590bb7e9cc31db8221f4013c67289e38f22c8" + ], + "proof_omitted_tlvs": [], + "proof_missing_hashes": [ + "0b510ba4c6884d603159ced2f0ca21e772424b59e52a2191bbfbcf07377805a1" + ] + }, + "result": { + "payer_sig": "4961333409f453b5518fcbc662936fcb46e6c1db8d963c44b67d5677f0ffce3ac5c42293d1bc1298b0d67320a772e20a06c069dfa7079df9207b675357735dd7", + "proof_fields": [ + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 82, + "len": 2, + "hex": "03e8" + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000" + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000" + }, + { + "type": 164, + "len": 4, + "hex": "67527988" + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793" + }, + { + "type": 170, + "len": 2, + "hex": "03e8" + }, + { + "type": 174, + "len": 13, + "hex": "08000000000000000000000000" + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 240, + "len": 64, + "hex": "fbb932e6a9d5b4d88ca0ddc9cf9f8cc880ef41e3ec9574da89f624db898ab3e9d3ed6caa8744633b855167da009119d9834ae71f7b06f02732dc4c1debab0577" + }, + { + "type": 241, + "len": 64, + "hex": "4961333409f453b5518fcbc662936fcb46e6c1db8d963c44b67d5677f0ffce3ac5c42293d1bc1298b0d67320a772e20a06c069dfa7079df9207b675357735dd7" + }, + { + "type": 1001, + "len": 32, + "hex": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "type": 1003, + "len": 32, + "hex": "0b510ba4c6884d603159ced2f0ca21e772424b59e52a2191bbfbcf07377805a1" + }, + { + "type": 1004, + "len": 352, + "hex": "8c9057ed88f3c5a6b6441dcac3b5e4cefb3615904d7362b86e78427fb695f4618dc54a97453dee6f207fa5216a30f1567442712ca98852bc789b73885029283cf2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67f54f80c94a87383f2a8ef7c3e461c62b67a51da5bccf6cd96a7dbab29bea51fa7849b8b856e1d2a63d9ce7dc1a78e05cbb2def1f5d7709c48e8707e0a59fe51e19e7e4eee6bf56c6c589fe50035490c1a7c91b753cb8007c4b52838a6772f997f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1adc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffbc14cfffaa314261bcbb2ed4ca24d5717bb608d8a6cc9910790bc1d49af7858ab7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cbabaab91b367e30fea7026daf9f2590bb7e9cc31db8221f4013c67289e38f22c8" + }, + { + "type": 3000000001, + "len": 1, + "hex": "42" + } + ], + "bech32": "lnp1zcssyj7z5vfx29flqlnsuzatppeyu6u9ugtl3ntz3n4k996zg7a5jvuz2gpq86zcyypjgef743p5fzqq9nqxh0ah7y87rzv3ud0eleps9kl2d5348hq2k89qwcp87v0tc4rzc87uuxmn0m8l2tfh6aw75s7wz8r56fd299ckt74zqpcr9s9he72nyjs86pfe3vjqzaxups47g3xedv2e4fk877c7v6rgpxgszqhd4w73ddqusdcmjthj7pxprpd57qakmn2jh2dh3kwhezwg7gs3g5qpqqqqqqqqqqqqqqqqqqqqqqqqqq9zrsqqqqqpqqqqqqsqqvqqqqqqqqqqqpqqqqqqqqqqqqzsqq9yq3n4y7vg4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0ya2qgp73tsdpqqqqqqqqqqqqqqqqqqqpvppqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyec9uzqlwun9e4f6k6d3r9qmhyul8uvezqw7s0raj2hfk5f7cjdhzv2k05a8mtv42r5gcems4gk0ksqjyvanq62uu0hkphsyuedcnqaaw4s2al3gpykzve5p8698d233l9uvc5ndl95dekpmwxev0zyke74valsll8r43wyy2far0qjnzcdvueq5aewyzsxcp5alfc8nhujq7m82dthxhwhl5p7jgqpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpq87s86eqpdgshfxx3pxkqv2eemf0pj3puaeyyj6eu54zrydml08swdmcqksl6qlvl5qkprys2lkc3u7956myg8w2cw67fnhmxc2eqntnv2uxu7zz07mftarp3hz549698hhx7grl55sk5v832e6yyufv4xy990rcndecs5pf9q709h40tuctu08d3878cfx5y2qehur27rjg5v2z8w7suf3570pauel4f7qvjj588qlj4rhhc0jxr33tv7j3mfdueakdj6nah2efh6j3lfuynw9c2msa9f3annnacxncupwtkt00rawhwzwy36rs0c99nlj3ux08unhwd06kcmzcnljsqd2fpsd8eydh209cqp7yk55r3fnh97vh7qv3cdgqqfr42judpgvk3x98jjlnm6yesft3z7xexxhlke20psddczuduql35zc9xxllz35c947kz0hku8hc6w7ajkgfw87p3kp4l77pfnll4gc5ycduhvhdfj3y64chhdsgmznvexgs0y9ur4y677zc4dlf9dmmncuyxeg0dnt7a99kw5l2nhe4xdcskpx7u6r26dm9zkjuh2a2hydnvl3sl6nsymd0nujepwm7nnp3mwpzraqp83nj383c7gkgl6edqhspq9pq" + } + }, + { + "name": "minimal_disclosure", + "input": { + "invoice": "lni1qqgqqqqqqqqqqqqqqqqqqqqqqqqqq93pqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyecy5szq059sggry3jnatzrgjyqqtxqdwlm0ug0uxyerc6lnljrqtd75mfr20wq4vw2qasz0uc7h32x9s0aecdhxlk075kn046aafpuuyw8f5j652t3vha2yqrsxtqt0nu4xf9q05znnzeyq96dcrptu3zdj6c4n2nv0aa3ue5xszv3qypwm2aaz66peqm3hyh09uzvzxzmfupmdhx49w5m0rva0jyu3u3pz3gqzqqqqqqqqqqqqqqqqqqqqqqqqqq2y8qqqqqqzqqqqqpqqqcqqqqqqqqqqqzqqqqqqqqqqqq9qqq2gpr82fuc32pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7f65qsrazczzqjtc233yeg48ur7wrst4vy8ynntsh3p07xdv2xwkc5hgfrmkjfnstcyqz3nyfzk3d42umkj2gqjh4l7zpevq04aefl6gnu4kql3e5ymu29s4q7fcvsst9uvmqx6q6yhje3vsraqple9pnxuf5vtwz0l68r6uvvs", + "invoice_hex": "0010000000000000000000000000000000001621024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382520203e858210324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1ca076027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000a21c00000001000000020003000000000000000400000000000000050000a40467527988a82072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793aa0203e8b021024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382f0400a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101", + "invoice_fields": [ + { + "type": 0, + "len": 16, + "hex": "00000000000000000000000000000000", + "included": false + }, + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": false + }, + { + "type": 82, + "len": 2, + "hex": "03e8", + "included": false + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", + "included": true + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000", + "included": false + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000", + "included": false + }, + { + "type": 164, + "len": 4, + "hex": "67527988", + "included": false + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "included": true + }, + { + "type": 170, + "len": 2, + "hex": "03e8", + "included": false + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "included": false + } + ] + }, + "working": { + "invoice_merkle_root": "0501ea6d4ad9fe7fce7edd5e3795987bd409d66c5709c2a17f9c0dfb839e3d8e", + "invoice_sighash": "41ce7b274b0e73e60dd6abf4fa51ccae892b161adc24d4099f620b12c59a03e5", + "invoice_signature": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "proof_merkle_root": "ccc704b73e8190c71bf2ac3661d631c8c5ac502b78641708c8e61c0a1c8ebb72", + "proof_leaf_hashes": [ + "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67", + "f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a", + "7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + ], + "proof_omitted_tlvs": [ + 1, + 2, + 89, + 90, + 91, + 169 + ], + "proof_missing_hashes": [ + "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41", + "b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02ab", + "cd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e316", + "9f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9", + "998ab7fa9c743fb9dbdb0d8d46fbe3ad333400bd07f328dcdb6008790bc9d2db" + ] + }, + "result": { + "payer_sig": "cebc25d40a2d927b5ebcab8400f542fbb7a8f462e8dd802bb13e050b9bf293b7457c19b46a476740f97c9d6ec141f23434c5d4fa253a1d2eb8896ebad99455cc", + "proof_fields": [ + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793" + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319" + }, + { + "type": 241, + "len": 64, + "hex": "cebc25d40a2d927b5ebcab8400f542fbb7a8f462e8dd802bb13e050b9bf293b7457c19b46a476740f97c9d6ec141f23434c5d4fa253a1d2eb8896ebad99455cc" + }, + { + "type": 1001, + "len": 32, + "hex": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "type": 1002, + "len": 6, + "hex": "0102595a5ba9" + }, + { + "type": 1003, + "len": 160, + "hex": "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02abcd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e3169f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9998ab7fa9c743fb9dbdb0d8d46fbe3ad333400bd07f328dcdb6008790bc9d2db" + }, + { + "type": 1004, + "len": 96, + "hex": "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + } + ], + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + } + }, + { + "name": "with_note", + "input": { + "invoice": "lni1qqgqqqqqqqqqqqqqqqqqqqqqqqqqq93pqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyecy5szq059sggry3jnatzrgjyqqtxqdwlm0ug0uxyerc6lnljrqtd75mfr20wq4vw2qasz0uc7h32x9s0aecdhxlk075kn046aafpuuyw8f5j652t3vha2yqrsxtqt0nu4xf9q05znnzeyq96dcrptu3zdj6c4n2nv0aa3ue5xszv3qypwm2aaz66peqm3hyh09uzvzxzmfupmdhx49w5m0rva0jyu3u3pz3gqzqqqqqqqqqqqqqqqqqqqqqqqqqq2y8qqqqqqzqqqqqpqqqcqqqqqqqqqqqzqqqqqqqqqqqq9qqq2gpr82fuc32pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7f65qsrazczzqjtc233yeg48ur7wrst4vy8ynntsh3p07xdv2xwkc5hgfrmkjfnstcyqz3nyfzk3d42umkj2gqjh4l7zpevq04aefl6gnu4kql3e5ymu29s4q7fcvsst9uvmqx6q6yhje3vsraqple9pnxuf5vtwz0l68r6uvvs", + "invoice_hex": "0010000000000000000000000000000000001621024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382520203e858210324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1ca076027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000a21c00000001000000020003000000000000000400000000000000050000a40467527988a82072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793aa0203e8b021024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382f0400a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101", + "note": "test note", + "invoice_fields": [ + { + "type": 0, + "len": 16, + "hex": "00000000000000000000000000000000", + "included": false + }, + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": false + }, + { + "type": 82, + "len": 2, + "hex": "03e8", + "included": false + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", + "included": true + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000", + "included": false + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000", + "included": false + }, + { + "type": 164, + "len": 4, + "hex": "67527988", + "included": false + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "included": true + }, + { + "type": 170, + "len": 2, + "hex": "03e8", + "included": false + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "included": false + } + ] + }, + "working": { + "invoice_merkle_root": "0501ea6d4ad9fe7fce7edd5e3795987bd409d66c5709c2a17f9c0dfb839e3d8e", + "invoice_sighash": "41ce7b274b0e73e60dd6abf4fa51ccae892b161adc24d4099f620b12c59a03e5", + "invoice_signature": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "proof_merkle_root": "327c38426d1d557f3669f19cdb440187e312679eadcfb61a9a8dcb0098639467", + "proof_leaf_hashes": [ + "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67", + "f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a", + "7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + ], + "proof_omitted_tlvs": [ + 1, + 2, + 89, + 90, + 91, + 169 + ], + "proof_missing_hashes": [ + "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41", + "b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02ab", + "cd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e316", + "9f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9", + "998ab7fa9c743fb9dbdb0d8d46fbe3ad333400bd07f328dcdb6008790bc9d2db" + ] + }, + "result": { + "payer_sig": "2a47f98770ae814119d682a7b19f7ce9e050a3bb49d9b0a031c46d9cb57a3075ddc23a742f6d33bc4ec8e1778327494bea76d2ee564625e99bfb95cc209a7722", + "proof_fields": [ + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793" + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319" + }, + { + "type": 241, + "len": 64, + "hex": "2a47f98770ae814119d682a7b19f7ce9e050a3bb49d9b0a031c46d9cb57a3075ddc23a742f6d33bc4ec8e1778327494bea76d2ee564625e99bfb95cc209a7722" + }, + { + "type": 1001, + "len": 32, + "hex": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "type": 1002, + "len": 6, + "hex": "0102595a5ba9" + }, + { + "type": 1003, + "len": 160, + "hex": "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02abcd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e3169f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9998ab7fa9c743fb9dbdb0d8d46fbe3ad333400bd07f328dcdb6008790bc9d2db" + }, + { + "type": 1004, + "len": 96, + "hex": "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + }, + { + "type": 1005, + "len": 9, + "hex": "74657374206e6f7465" + } + ], + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qz53lesac2aq2pr8tg9fa3na7wnczs5wa5nkds5qcugmvuk4arqawacga8gtmdxw7yaj8pw7pjwj2tafmd9mjkgcj7nxlmjhxzpxnhyt7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9e07s8mgfw3jhxapqdehhgeg" + } + }, + { + "name": "left_subtree_omitted", + "input": { + "invoice": "lni1qqgqqqqqqqqqqqqqqqqqqqqqqqqqq93pqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyecy5szq059sggry3jnatzrgjyqqtxqdwlm0ug0uxyerc6lnljrqtd75mfr20wq4vw2qasz0uc7h32x9s0aecdhxlk075kn046aafpuuyw8f5j652t3vha2yqrsxtqt0nu4xf9q05znnzeyq96dcrptu3zdj6c4n2nv0aa3ue5xszv3qypwm2aaz66peqm3hyh09uzvzxzmfupmdhx49w5m0rva0jyu3u3pz3gqzqqqqqqqqqqqqqqqqqqqqqqqqqq2y8qqqqqqzqqqqqpqqqcqqqqqqqqqqqzqqqqqqqqqqqq9qqq2gpr82fuc32pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7f65qsrazczzqjtc233yeg48ur7wrst4vy8ynntsh3p07xdv2xwkc5hgfrmkjfnstcyqz3nyfzk3d42umkj2gqjh4l7zpevq04aefl6gnu4kql3e5ymu29s4q7fcvsst9uvmqx6q6yhje3vsraqple9pnxuf5vtwz0l68r6uvvs", + "invoice_hex": "0010000000000000000000000000000000001621024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382520203e858210324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1ca076027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000a21c00000001000000020003000000000000000400000000000000050000a40467527988a82072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793aa0203e8b021024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382f0400a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101", + "invoice_fields": [ + { + "type": 0, + "len": 16, + "hex": "00000000000000000000000000000000", + "included": false + }, + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": false + }, + { + "type": 82, + "len": 2, + "hex": "03e8", + "included": false + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", + "included": true + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000", + "included": false + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000", + "included": false + }, + { + "type": 164, + "len": 4, + "hex": "67527988", + "included": false + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "included": true + }, + { + "type": 170, + "len": 2, + "hex": "03e8", + "included": true + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "included": false + } + ] + }, + "working": { + "invoice_merkle_root": "0501ea6d4ad9fe7fce7edd5e3795987bd409d66c5709c2a17f9c0dfb839e3d8e", + "invoice_sighash": "41ce7b274b0e73e60dd6abf4fa51ccae892b161adc24d4099f620b12c59a03e5", + "invoice_signature": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "proof_merkle_root": "1b0bab09a5fcccec19eb3aaafbbfa4075944fd1f65691ed715fbbc17a59b3651", + "proof_leaf_hashes": [ + "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67", + "f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a", + "dc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffb", + "7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + ], + "proof_omitted_tlvs": [ + 1, + 2, + 89, + 90, + 91 + ], + "proof_missing_hashes": [ + "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41", + "b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02ab", + "cd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e316", + "9f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9" + ] + }, + "result": { + "payer_sig": "ed03ec58d5ac676539486bb6e8d6f389b6375b6693ffdf30a93919590d744fa393f945a5de3bb57d65c7f61def1cefa8aa038725b15bf0fa797dfd08ca97538a", + "proof_fields": [ + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793" + }, + { + "type": 170, + "len": 2, + "hex": "03e8" + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319" + }, + { + "type": 241, + "len": 64, + "hex": "ed03ec58d5ac676539486bb6e8d6f389b6375b6693ffdf30a93919590d744fa393f945a5de3bb57d65c7f61def1cefa8aa038725b15bf0fa797dfd08ca97538a" + }, + { + "type": 1001, + "len": 32, + "hex": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "type": 1002, + "len": 5, + "hex": "0102595a5b" + }, + { + "type": 1003, + "len": 128, + "hex": "bf8cb2b1d6fa9bcdcab501b59f82c65c506b7f43514737f7197f1fcfeaebad41b9406f4ce526a6a0d4e0b3a63ed89a832e31cb9939dfe1a7b5dd7232d32c02abcd9c44b53b31700c9ed0e3330ce425f7f18fac2fc1d566a34468439274f0e3169f9830f2c3070cfbad13fde30ee36cd7143591164ed12040a9cd595c96840ac9" + }, + { + "type": 1004, + "len": 128, + "hex": "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1adc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffb7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + } + ], + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0ya2qgp73vppqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyec9uzqpgejy3tgk64wdmf9yqft6llpqukq867u5layf72mq0cu6zd79zc2s0yuxgg9j7xdsrdqdztevckgp7sqlujsenwy6x9hp8lar3awxx03grks8mzc6kkxwefefp4md6xk7wymvd6mv6fllhes4yu3jkgdw3868ylegkjauwa404ju0asaauwwl292qwrjtv2m7ra8jl0apr9fw5u2l5p7jgqpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpq87s86s9qyp9jkjml5p7hq9l3jetr4h6n0xu4dgpkk0c93ju2p4h7s63gumlwxtlrl8746adgxu5qm6vu5n2dgx5uze6v0kcn2pjuvwtnyualcd8khwhyvkn9sp2hnvugj6nkvtspj0dpcenpnjztal337kzlsw4v635g6zrjf60pcckn7vrpukrqux0htgnlh3sacmv6u2rtygkfmgjqs9fe4v4e95yptyl6qlvsredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq6ms9cmcplrg9s2vdl79rfsttavyl0dc0035aam9vsju0urrvrtlahay4h0w0rssm9pakd0m55ke6na2wlx5ehzzcymmngdtfhv526tjc" + } + }, + { + "name": "empty_proof_omitted_tlvs_explicit", + "input": { + "invoice": "lni1qqgqqqqqqqqqqqqqqqqqqqqqqqqqq93pqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyecy5szq059sggry3jnatzrgjyqqtxqdwlm0ug0uxyerc6lnljrqtd75mfr20wq4vw2qasz0uc7h32x9s0aecdhxlk075kn046aafpuuyw8f5j652t3vha2yqrsxtqt0nu4xf9q05znnzeyq96dcrptu3zdj6c4n2nv0aa3ue5xszv3qypwm2aaz66peqm3hyh09uzvzxzmfupmdhx49w5m0rva0jyu3u3pz3gqzqqqqqqqqqqqqqqqqqqqqqqqqqq2y8qqqqqqzqqqqqpqqqcqqqqqqqqqqqzqqqqqqqqqqqq9qqq2gpr82fuc32pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7f65qsrazczzqjtc233yeg48ur7wrst4vy8ynntsh3p07xdv2xwkc5hgfrmkjfnstcyqz3nyfzk3d42umkj2gqjh4l7zpevq04aefl6gnu4kql3e5ymu29s4q7fcvsst9uvmqx6q6yhje3vsraqple9pnxuf5vtwz0l68r6uvvs", + "invoice_hex": "0010000000000000000000000000000000001621024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382520203e858210324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1ca076027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000a21c00000001000000020003000000000000000400000000000000050000a40467527988a82072cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793aa0203e8b021024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382f0400a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "preimage": "0101010101010101010101010101010101010101010101010101010101010101", + "invoice_fields": [ + { + "type": 0, + "len": 16, + "hex": "00000000000000000000000000000000", + "included": false + }, + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 82, + "len": 2, + "hex": "03e8", + "included": true + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c", + "included": true + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000", + "included": true + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000", + "included": true + }, + { + "type": 164, + "len": 4, + "hex": "67527988", + "included": true + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793", + "included": true + }, + { + "type": 170, + "len": 2, + "hex": "03e8", + "included": true + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382", + "included": true + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "included": false + } + ] + }, + "working": { + "invoice_merkle_root": "0501ea6d4ad9fe7fce7edd5e3795987bd409d66c5709c2a17f9c0dfb839e3d8e", + "invoice_sighash": "41ce7b274b0e73e60dd6abf4fa51ccae892b161adc24d4099f620b12c59a03e5", + "invoice_signature": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319", + "proof_merkle_root": "a98cbee700b100ede32c19f9525264d51a105751fb27e790dad011bb38415b89", + "proof_leaf_hashes": [ + "8c9057ed88f3c5a6b6441dcac3b5e4cefb3615904d7362b86e78427fb695f461", + "8dc54a97453dee6f207fa5216a30f1567442712ca98852bc789b73885029283c", + "f2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67", + "f54f80c94a87383f2a8ef7c3e461c62b67a51da5bccf6cd96a7dbab29bea51fa", + "7849b8b856e1d2a63d9ce7dc1a78e05cbb2def1f5d7709c48e8707e0a59fe51e", + "19e7e4eee6bf56c6c589fe50035490c1a7c91b753cb8007c4b52838a6772f997", + "f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1a", + "dc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffb", + "7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + ], + "proof_omitted_tlvs": [], + "proof_missing_hashes": [ + "0b510ba4c6884d603159ced2f0ca21e772424b59e52a2191bbfbcf07377805a1" + ] + }, + "result": { + "payer_sig": "dffe62d6446c182f2503e780fce09fc5cf310ef14a54f65dd1df124039b7a897f2940470ac0f9857f826b232289c0ac4e6927ca67d805167fb0add352f88add1", + "proof_fields": [ + { + "type": 22, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 82, + "len": 2, + "hex": "03e8" + }, + { + "type": 88, + "len": 33, + "hex": "0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c" + }, + { + "type": 160, + "len": 118, + "hex": "027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e6686809910102edabbd16b41c8371b92ef2f04c1185b4f03b6dcd52ba9b78d9d7c89c8f221145001000000000000000000000000000000000" + }, + { + "type": 162, + "len": 28, + "hex": "00000001000000020003000000000000000400000000000000050000" + }, + { + "type": 164, + "len": 4, + "hex": "67527988" + }, + { + "type": 168, + "len": 32, + "hex": "72cd6e8422c407fb6d098690f1130b7ded7ec2f7f5e1d30bd9d521f015363793" + }, + { + "type": 170, + "len": 2, + "hex": "03e8" + }, + { + "type": 176, + "len": 33, + "hex": "024bc2a31265153f07e70e0bab08724e6b85e217f8cd628ceb62974247bb493382" + }, + { + "type": 240, + "len": 64, + "hex": "0a33224568b6aae6ed252012bd7fe1072c03ebdca7fa44f95b03f1cd09be28b0a83c9c32105978cd80da068979662c80fa00ff250ccdc4d18b709ffd1c7ae319" + }, + { + "type": 241, + "len": 64, + "hex": "dffe62d6446c182f2503e780fce09fc5cf310ef14a54f65dd1df124039b7a897f2940470ac0f9857f826b232289c0ac4e6927ca67d805167fb0add352f88add1" + }, + { + "type": 1001, + "len": 32, + "hex": "0101010101010101010101010101010101010101010101010101010101010101" + }, + { + "type": 1002, + "len": 0, + "hex": "" + }, + { + "type": 1003, + "len": 32, + "hex": "0b510ba4c6884d603159ced2f0ca21e772424b59e52a2191bbfbcf07377805a1" + }, + { + "type": 1004, + "len": 288, + "hex": "8c9057ed88f3c5a6b6441dcac3b5e4cefb3615904d7362b86e78427fb695f4618dc54a97453dee6f207fa5216a30f1567442712ca98852bc789b73885029283cf2deaf5f30be3ced89fc7c24d422819bf06af0e48a31423bbd0e2634f3c3de67f54f80c94a87383f2a8ef7c3e461c62b67a51da5bccf6cd96a7dbab29bea51fa7849b8b856e1d2a63d9ce7dc1a78e05cbb2def1f5d7709c48e8707e0a59fe51e19e7e4eee6bf56c6c589fe50035490c1a7c91b753cb8007c4b52838a6772f997f0191c35000247554b8d0a196898a794bf3de89982571178d931affb654f0c1adc0b8de03f1a0b0531bff146982d7d613ef6e1ef8d3bdd9590971fc18d835ffb7e92b77b9e3843650f6cd7ee94b6753ea9df3533710b04dee686ad376515a5cb" + } + ], + "bech32": "lnp1zcssyj7z5vfx29flqlnsuzatppeyu6u9ugtl3ntz3n4k996zg7a5jvuz2gpq86zcyypjgef743p5fzqq9nqxh0ah7y87rzv3ud0eleps9kl2d5348hq2k89qwcp87v0tc4rzc87uuxmn0m8l2tfh6aw75s7wz8r56fd299ckt74zqpcr9s9he72nyjs86pfe3vjqzaxups47g3xedv2e4fk877c7v6rgpxgszqhd4w73ddqusdcmjthj7pxprpd57qakmn2jh2dh3kwhezwg7gs3g5qpqqqqqqqqqqqqqqqqqqqqqqqqqq9zrsqqqqqpqqqqqqsqqvqqqqqqqqqqqpqqqqqqqqqqqqzsqq9yq3n4y7vg4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0ya2qgp73vppqf9u9gcjv52n7pl8pc96kzrjfe4ctcshlrxk9r8tv2t5y3amfyec9uzqpgejy3tgk64wdmf9yqft6llpqukq867u5layf72mq0cu6zd79zc2s0yuxgg9j7xdsrdqdztevckgp7sqlujsenwy6x9hp8lar3awxx03gr0luckkg3kpste9q0ncpl8qnlzu7vgw7999faja6803yspek75f0u55q3c2cruc2luzdv3j9zwq438xjf72vlvq29nlkzkax5hc3tw3l5p7jgqpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpq87s86sql5p7kgqt2y96f35gf4srzkww6tcv5g08wfpykk099gserwlmeurnw7q9587s8m8aqysgeyzhaky083dxkezpmjkrkhjva7ekzkgy6umzhph8ssnlk62lgcvdc49fw3faaehjqla9y94rpu2kw3p8zt9f3pftc7ymwwy9q2fg8nedat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0a20sry54pec8u4gaa7ru3suv2m855w6t0x0dnvk5ld6k2d755060pym3wzku8f2v0vuulwp578qtjajmmclt4msn3ywsur7pfvlu50pnelyamnt74kxckylu5qr2jgvrf7frd6newqq03949qu2vae0n9lsrywr2qqzga25hrg2r95f3fu5hu773xvz2ugh3kf34lak2ncvrtwqhr0q8udqkpf3hlc5dxpd04snaahpa7xnhhv4jzt3lsvdsd0lkl5jkaaeuwzrv58ke4lwjjm8204fmu6nxugtqn0wdp4dxaj3tfwt" + } + } + ], + "invalid_vectors": [ + { + "reason": "missing_invreq_payer_id", + "bech32": "lnp14qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "missing_invoice_payment_hash", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cukqssyj7z5vfx29flqlnsuzatppeyu6u9ugtl3ntz3n4k996zg7a5jvuz7pqq5vezg45td2hxa5jjqy4a0lsswtqra0w207jyl9ds8uwdpxlz3v9g8jwryyze0rxcpksx39ukvtyqlgq07fgvehzdrzmsnl73c7hrr8c5pn4uyh2q5tvj0d0te2uyqr6597ah4r6x96xasq4mz0s9pwdl9yahg47pndr2gan5p7tun4hvzs0jxs6vt486y5ap6t4c39ht4kv52hx06qlfyqqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqsrlgragrqzqjetfd6nlgrawstlr9jk8t04x7de26srdvlstr9c5rt0ap4z3eh7uvh7870at466sdegph5eefx56sdfc9n5cld3x5r9ccuhxfemls60dwawgedxtqz40xec3948vchqry76r3nxr8yyhmlrrav9lqa2e4rg35y8yn57r33d8ucxrevxpcvlwk38l0rpm3ke4c5xkg3vnk3ypq2nn2etjtggzkfnx9t075uwslmnk7mpkx5d7lr45engq9aqlej3hxmvqy8jz7f6tdl6qlvvredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq606ftw7u78ppk2rmv6lhffdn4865a7dfnwy9sfhhxs6knweg45h9s" + }, + { + "reason": "missing_invoice_node_id", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0ylsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "missing_signature", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qh3gr8tcfw5pgkey767hj4cgq84gtam0285vt5dmqptkylq2zum72fmw3turx6x53m8gruhe8twc9qlydp5ch205ff6r5ht3ztwhtveg4wvl5p7jgqpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpq87s86sxqyp9jkjm487s86aqh7xt9vwkl2dumj44qx6elqkxt3gxkl6r29rn0ace0u0ul6ht44qmjsr0fnjjdf4q6nst8f37mzdgxt33ewvnnhlp576a6u3j6vkq927dn3zt2we3wqxfa58rxvxwgf0h7x86ct7p64n2x3rggwf8fu8rz60esv8jcvrse7adz077xrhrdnt3gdv3ze8dzgzq48x4jhykss9vnxv2klafcaplh8dakrvdgma78tfnxsqt6pln9rwdkcqg0y9un5kml5p7cc8jm6h47v978nkcnlruyn2z9qvm7p40pey2x9prh0gwyc608s77vlcpj8p4qqpyw42t359pj6yc572t700gnxp9wytcmyc6l7m9fuxp5l5jkaaeuwzrv58ke4lwjjm8204fmu6nxugtqn0wdp4dxaj3tfwt" + }, + { + "reason": "missing_proof_preimage", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86sxqyp9jkjm487s86aqh7xt9vwkl2dumj44qx6elqkxt3gxkl6r29rn0ace0u0ul6ht44qmjsr0fnjjdf4q6nst8f37mzdgxt33ewvnnhlp576a6u3j6vkq927dn3zt2we3wqxfa58rxvxwgf0h7x86ct7p64n2x3rggwf8fu8rz60esv8jcvrse7adz077xrhrdnt3gdv3ze8dzgzq48x4jhykss9vnxv2klafcaplh8dakrvdgma78tfnxsqt6pln9rwdkcqg0y9un5kml5p7cc8jm6h47v978nkcnlruyn2z9qvm7p40pey2x9prh0gwyc608s77vlcpj8p4qqpyw42t359pj6yc572t700gnxp9wytcmyc6l7m9fuxp5l5jkaaeuwzrv58ke4lwjjm8204fmu6nxugtqn0wdp4dxaj3tfwt" + }, + { + "reason": "missing_proof_missing_hashes", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlvvredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq606ftw7u78ppk2rmv6lhffdn4865a7dfnwy9sfhhxs6knweg45h9s" + }, + { + "reason": "missing_proof_leaf_hashes", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjmv" + }, + { + "reason": "missing_proof_signature", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84ccel5p7jgqpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpq87s86sxqyp9jkjm487s86aqh7xt9vwkl2dumj44qx6elqkxt3gxkl6r29rn0ace0u0ul6ht44qmjsr0fnjjdf4q6nst8f37mzdgxt33ewvnnhlp576a6u3j6vkq927dn3zt2we3wqxfa58rxvxwgf0h7x86ct7p64n2x3rggwf8fu8rz60esv8jcvrse7adz077xrhrdnt3gdv3ze8dzgzq48x4jhykss9vnxv2klafcaplh8dakrvdgma78tfnxsqt6pln9rwdkcqg0y9un5kml5p7cc8jm6h47v978nkcnlruyn2z9qvm7p40pey2x9prh0gwyc608s77vlcpj8p4qqpyw42t359pj6yc572t700gnxp9wytcmyc6l7m9fuxp5l5jkaaeuwzrv58ke4lwjjm8204fmu6nxugtqn0wdp4dxaj3tfwt" + }, + { + "reason": "wrong_proof_preimage", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq06ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "proof_omitted_tlvs_not_ascending", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk2649dl6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "proof_omitted_tlvs_contains_zero", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2quqqzqjetfd6nlgrawstlr9jk8t04x7de26srdvlstr9c5rt0ap4z3eh7uvh7870at466sdegph5eefx56sdfc9n5cld3x5r9ccuhxfemls60dwawgedxtqz40xec3948vchqry76r3nxr8yyhmlrrav9lqa2e4rg35y8yn57r33d8ucxrevxpcvlwk38l0rpm3ke4c5xkg3vnk3ypq2nn2etjtggzkfnx9t075uwslmnk7mpkx5d7lr45engq9aqlej3hxmvqy8jz7f6tdl6qlvvredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq606ftw7u78ppk2rmv6lhffdn4865a7dfnwy9sfhhxs6knweg45h9s" + }, + { + "reason": "proof_omitted_tlvs_contains_signature_field", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2quqsyk26tw5lrlgrawstlr9jk8t04x7de26srdvlstr9c5rt0ap4z3eh7uvh7870at466sdegph5eefx56sdfc9n5cld3x5r9ccuhxfemls60dwawgedxtqz40xec3948vchqry76r3nxr8yyhmlrrav9lqa2e4rg35y8yn57r33d8ucxrevxpcvlwk38l0rpm3ke4c5xkg3vnk3ypq2nn2etjtggzkfnx9t075uwslmnk7mpkx5d7lr45engq9aqlej3hxmvqy8jz7f6tdl6qlvvredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq606ftw7u78ppk2rmv6lhffdn4865a7dfnwy9sfhhxs6knweg45h9s" + }, + { + "reason": "proof_omitted_tlvs_contains_proof_field", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2pyqsyk26tw5l6qlfl5p7hg9l3jetr4h6n0xu4dgpkk0c93ju2p4h7s63gumlwxtlrl8746adgxu5qm6vu5n2dgx5uze6v0kcn2pjuvwtnyualcd8khwhyvkn9sp2hnvugj6nkvtspj0dpcenpnjztal337kzlsw4v635g6zrjf60pcckn7vrpukrqux0htgnlh3sacmv6u2rtygkfmgjqs9fe4v4e95yptyenz4hl2w8g0aem0dsmr2xl0366ve5qz7s0uegmndkqzrep0ya9klaq0kxpuk74a0np03uakylclpy6s3grxlsdtcwfz33ggam6r3xxneu8hn87qv3cdgqqfr42judpgvk3x98jjlnm6yesft3z7xexxhlke20psd8ay4h0w0rssm9pakd0m55ke6na2wlx5ehzzcymmngdtfhv526tjc" + }, + { + "reason": "proof_omitted_tlvs_contains_high_field", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2pvqsyk26tw5lamnt9qq06qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "proof_omitted_tlvs_contains_included_tlv_field", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2quqsykzetfd6nlgrawstlr9jk8t04x7de26srdvlstr9c5rt0ap4z3eh7uvh7870at466sdegph5eefx56sdfc9n5cld3x5r9ccuhxfemls60dwawgedxtqz40xec3948vchqry76r3nxr8yyhmlrrav9lqa2e4rg35y8yn57r33d8ucxrevxpcvlwk38l0rpm3ke4c5xkg3vnk3ypq2nn2etjtggzkfnx9t075uwslmnk7mpkx5d7lr45engq9aqlej3hxmvqy8jz7f6tdl6qlvvredat6lxzlremvfl37zf4pzsxdlq6hsuj9rzs3mh58zvd8nc00x0uqers6sqqj8249c6zsedzv2099l8h5fnqjhz9udjvd0ldj57rq606ftw7u78ppk2rmv6lhffdn4865a7dfnwy9sfhhxs6knweg45h9s" + }, + { + "reason": "proof_omitted_tlvs_not_sequential", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyktyv4n06qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "proof_leaf_hashes_too_few", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mzq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxs" + }, + { + "reason": "proof_leaf_hashes_too_many", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8myq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9evqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq" + }, + { + "reason": "proof_missing_hashes_too_few", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qltszlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4j0aq0kxpuk74a0np03uakylclpy6s3grxlsdtcwfz33ggam6r3xxneu8hn87qv3cdgqqfr42judpgvk3x98jjlnm6yesft3z7xexxhlke20psd8ay4h0w0rssm9pakd0m55ke6na2wlx5ehzzcymmngdtfhv526tjc" + }, + { + "reason": "proof_missing_hashes_too_many", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qltczlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjmvqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqplgra3s09h40tuctu08d3878cfx5y2qehur27rjg5v2z8w7suf3570pauelsrywr2qqzga25hrg2r95f3fu5hu773xvz2ugh3kf34lak2ncvrflf9dmmncuyxeg0dnt7a99kw5l2nhe4xdcskpx7u6r26dm9zkjuk" + }, + { + "reason": "wrong_invoice_signature", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9nxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qva0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "wrong_proof_signature", + "bech32": "lnp1tqssxfr986kyx3ygqqkvq6alklcslcvfj834l8lyxqkmafkjx57up2cu4qs89ntwss3vgplmd5ycdy83zv9hmmt7ctmltcwnp0va2g0sz5mr0yasyypyhs4rzfj320c8uu8qh2cgwf8xhp0zzluv6c5vad3fwsj8hdyn8qhsgq9rxgj9dzm24ehdy5sp90tluyrjcqltmjnl538etvplrngfhc5tp2punsepqktcekqd5p5f09nzeq86qrlj2rxdcngckuyll5w84cce79qvl0p96s9zmynmt672hpqq74p0hdag733w3hvq9wcnupgtn0ef8d690svmg6j8vaq0jlyadmq5ru35xnzaf7398gwjawyfd6adn9z4en7s86fqqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyql6ql2qcqsyk26tw5l6qlt5zlcev436mafhnw2k5qmt8uzcew9q6mlgdg5wdlhr9l3lnl2awk5rw2qdaxw2f4x5r2wpvax8mvf4qewx89ejwwluxnmthtjxtfjcq4tekwyfdfmx9cqe8ksuveseep97lccltp0c82kdg6ydppeya8suvtflxps7tpswr8m45flmccwudkdw9p4jytya5fqgz5u6k2uj6zq4jve32ml48r587uahkcd34r0hcadxv6qp0g87v5dekmqppushjwjm07s8mrq7t027heshc7wmz0u0sjdgg5pn0cx4u8y3gc5ywaapcnrfu7rmenlqxgux5qqy364fwxs5xtgnznef0eaazvcy4c30rvnrtlmv48scxn7j2mhh83cgdjs7mxha62tvaf7480n2vm3pvzdae5x45mk29d9ev" + }, + { + "reason": "contains_invreq_metadata", + "bech32": "lnp1qqq5ykppqvjx204vgdzgsqpvcp4mldl3plscny0rt707gvpdh6ndydfacz43e2pqwtxkappzcsrlkmgfs6g0zyct0hkhashh7hsaxz7e65slq9fkx7fmqggzf0p2xyn9z5ls0ecwpw4ssujwdwz7y9lce43ge6mzjapy0w6fxwp0qsq2xv3y269k4tnw6ffqz27hlcg89sp7hh98lfz0jkcr78xsn03gkz5re8pjzpvh3nvqmgrgj7tx9jq05q8ly5xvm3x33dcfllgu0t33nu2qe67zt4q29kf8kh4u4wzqpa2zlwm63arzarwcq2a38czshxljjwm52lqek34ywe6ql97f6mkpg8ergdx96naz2wsa96ugjm46mx29tn8aq05jqqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpqyqszqgpl5p75pspqfv45kafl5p7hg9l3jetr4h6n0xu4dgpkk0c93ju2p4h7s63gumlwxtlrl8746adgxu5qm6vu5n2dgx5uze6v0kcn2pjuvwtnyualcd8khwhyvkn9sp2hnvugj6nkvtspj0dpcenpnjztal337kzlsw4v635g6zrjf60pcckn7vrpukrqux0htgnlh3sacmv6u2rtygkfmgjqs9fe4v4e95yptyenz4hl2w8g0aem0dsmr2xl0366ve5qz7s0uegmndkqzrep0ya9klaq0kxpuk74a0np03uakylclpy6s3grxlsdtcwfz33ggam6r3xxneu8hn87qv3cdgqqfr42judpgvk3x98jjlnm6yesft3z7xexxhlke20psd8ay4h0w0rssm9pakd0m55ke6na2wlx5ehzzcymmngdtfhv526tjc" + } + ] +}