Skip to content

Commit 69476db

Browse files
rustyrussellendothermicdev
authored andcommitted
xpay: a test of a similar scenario to a real failure.
Use larger CLTVs and we see the failure from l3, complaining the CLTV is outside the amount in the payment_constraint field, like: ``` Failing HTLC because of an invalid payload (TLV 10 pos 104): cltv_expiry 609 > payment_constraint 376 ``` Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
1 parent 10f333b commit 69476db

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

tests/test_xpay.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,3 +766,51 @@ def test_fail_after_success(node_factory, bitcoind, executor, slow_mode):
766766
'amount_sent_msat': res['amount_sent_msat'],
767767
'failed_parts': 1,
768768
'successful_parts': 1}
769+
770+
771+
@pytest.mark.xfail(strict=True)
772+
def test_xpay_twohop_bug(node_factory):
773+
"""From https://github.com/ElementsProject/lightning/issues/8119:
774+
Oh, interesting! I tried again and got a two-hop blinded path. xpay returned the same error you saw while pay was successful.
775+
776+
lightning-cli xpay lni1qqgv5nalmz08ukj4av074kyk6pepq93pqvvhnlnvurnfanndnxjtcjnmxrkj92xtsupa6lwjm7hkr8s8zflqk5sz82v9gqzcyypu03lyetn3ayp8p5798mz4der4xexkxxxu8ck0m25gmjaaj3n5scaql5q0uquxfmcztl0gldv8mxy3sm8x5jscdz27u39fy6luxu8zcdn9j73l3upaypvngk89elemj7cvu9v57r28k65e4jtlsr0vd66yzwrw2uzyvjczq0sd8fk6vazvrxvnks7hdqkl3lar4ff4a2ccjpltacz8z6tw6lunvqzrlrvyu3rkyylgd0splzr0xs3cccmzmfllyu7k06gclf9wx5n463z5arlwz2frk9a6lnfrvjdh3znsppxc4v8ahdy7e0y3us5rww0lcdxqj6psx87tgwvm3u260gc25frw9c4t368cecy3f5flll87tgk2uva09mncqqe9qqq0vdm023df0eetknvgcxk5yuupg8j5a5jtdmpj0u5unp8f3g2gskpma8l53sd5vmsfcrlr4rm7y9n2y8qqqqp7sqqqq8espgsqqqqqqqqqqqqqqqqqqqqq73qqqqq2gpr8hefjt2pqdgsfqcr3r5kcckf6sgtmkwuds8wp5uc7j0zcj0d9lsgl47vl95y25q36nzhqxqsqqzczzqce08lxec8xnm8xmxdyh398kv8dy25vhpcrm47a9ha0vx0qwyn7p0cyqt925k662c9kelq545l944k3j9gdvmkfm2ev2pqpnslmx8qvuwx3jqg4u8ful39aq0tlzujjd2yagjndcd2q42r5hvydx0lxe58mdrgs
777+
{
778+
"code": 209,
779+
"message": "Failed after 1 attempts. We got an error from inside the blinded path 0x0x0/1: we assume it means insufficient capacity. Then routing failed: We could not find a usable set of paths. The shortest path is 858132x1647x1->861005x2291x1->0x0x0, but 0x0x0/1 layer xpay-0 says max is 14999msat"
780+
}
781+
lightning-cli pay lni1qqgv5nalmz08ukj4av074kyk6pepq93pqvvhnlnvurnfanndnxjtcjnmxrkj92xtsupa6lwjm7hkr8s8zflqk5sz82v9gqzcyypu03lyetn3ayp8p5798mz4der4xexkxxxu8ck0m25gmjaaj3n5scaql5q0uquxfmcztl0gldv8mxy3sm8x5jscdz27u39fy6luxu8zcdn9j73l3upaypvngk89elemj7cvu9v57r28k65e4jtlsr0vd66yzwrw2uzyvjczq0sd8fk6vazvrxvnks7hdqkl3lar4ff4a2ccjpltacz8z6tw6lunvqzrlrvyu3rkyylgd0splzr0xs3cccmzmfllyu7k06gclf9wx5n463z5arlwz2frk9a6lnfrvjdh3znsppxc4v8ahdy7e0y3us5rww0lcdxqj6psx87tgwvm3u260gc25frw9c4t368cecy3f5flll87tgk2uva09mncqqe9qqq0vdm023df0eetknvgcxk5yuupg8j5a5jtdmpj0u5unp8f3g2gskpma8l53sd5vmsfcrlr4rm7y9n2y8qqqqp7sqqqq8espgsqqqqqqqqqqqqqqqqqqqqq73qqqqq2gpr8hefjt2pqdgsfqcr3r5kcckf6sgtmkwuds8wp5uc7j0zcj0d9lsgl47vl95y25q36nzhqxqsqqzczzqce08lxec8xnm8xmxdyh398kv8dy25vhpcrm47a9ha0vx0qwyn7p0cyqt925k662c9kelq545l944k3j9gdvmkfm2ev2pqpnslmx8qvuwx3jqg4u8ful39aq0tlzujjd2yagjndcd2q42r5hvydx0lxe58mdrgs
782+
{
783+
"destination": "031979fe6ce0e69ece6d99a4bc4a7b30ed22a8cb8703dd7dd2dfaf619e07127e0b",
784+
"payment_hash": "6a209060711d2d8c593a8217bb3b8d81dc1a731e93c5893da5fc11faf99f2d08",
785+
"created_at": 1740526413.632475833,
786+
"parts": 1,
787+
"amount_msat": 16007,
788+
"amount_sent_msat": 16010,
789+
"payment_preimage": "c6c75b93dbbdbc5082350a4396afec0232ff4400ea0c9f053b977f4389f501bf",
790+
"status": "complete"
791+
}
792+
"""
793+
l1, l2, l3, l4 = node_factory.line_graph(4, wait_for_announce=True,
794+
opts=[{'cltv-delta': 50},
795+
{'cltv-delta': 100},
796+
{'cltv-delta': 200},
797+
{'cltv-final': 400}])
798+
799+
offer = l4.rpc.offer('any')
800+
inv = l1.rpc.fetchinvoice(offer['bolt12'], '15000msat')['invoice']
801+
802+
# Inserts a blinded path
803+
path = only_one(l1.rpc.decode(inv)['invoice_paths'])
804+
assert path['first_node_id'] == l3.info['id']
805+
assert len(path['path']) == 2
806+
assert path['payinfo']['cltv_expiry_delta'] == 200 + 400
807+
808+
# This works.
809+
l1.rpc.pay(inv)
810+
# CLTV is blockheight (108) + 1 + 100 + 200 + 400
811+
l1.daemon.wait_for_log(f'Adding HTLC 0 amount=15002msat cltv={108 + 1 + 100 + 200 + 400}')
812+
813+
inv = l1.rpc.fetchinvoice(offer['bolt12'], '15000msat')['invoice']
814+
# This doesn't!
815+
l1.rpc.xpay(inv)
816+
l1.daemon.wait_for_log(f'Adding HTLC 1 amount=15002msat cltv={108 + 1 + 100 + 200 + 400}')

0 commit comments

Comments
 (0)