From dc7eff152cdacc41fec26463fbbca50aa4ad2867 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Wed, 20 May 2026 18:12:41 +0200 Subject: [PATCH] testing: Remove obsolete test_lsp_jit_fee test The test exercised the legacy LSPS2 htlc_accepted hook in gl-plugin (lsp.rs) which was removed in 2cff324a. With the hook gone, the test times out waiting for log lines that are no longer emitted. The underlying functionality is now handled natively by CLN's --experimental-lsps-client daemon. --- libs/gl-testing/tests/test_node.py | 167 ----------------------------- 1 file changed, 167 deletions(-) diff --git a/libs/gl-testing/tests/test_node.py b/libs/gl-testing/tests/test_node.py index 229819828..a9a27919b 100644 --- a/libs/gl-testing/tests/test_node.py +++ b/libs/gl-testing/tests/test_node.py @@ -221,173 +221,6 @@ def test_node_listpays_preimage(clients, node_factory, bitcoind): assert pay.pays[0].preimage.hex() == preimage -def test_lsp_jit_fee(clients, node_factory, bitcoind): - """Test that the LSP (our peer) is allowed to alter the amount to - deduct its fee. - - The scenario is simple: l1 -> gl1, with l1 being the LSP, - forwarding less than it is supposed to according to the onion - packet. We explicitly opt-in to this deduction by having a - matching invoice stashed with the node. Upon receiving the - incoming HTLC the plugin fetches the invoice, checks that indeed - the expected `total_msat` is lower than the sender thought, and - then we modify the onion payload in order to get `lightningd` to - accept it and settle the invoice with it. - - We test multiple parts and overpay slightly to verify that even - that works out ok. - - We also check that we can handle unorthodox onion payloads that - don't carry fields that we expect. - - """ - c = clients.new() - c.register(configure=True) - s = c.signer().run_in_thread() - gl1 = c.node() - l1 = node_factory.get_node() - gl1.connect_peer(l1.info["id"], f"127.0.0.1:{l1.daemon.port}") - l1.fundwallet(10**6) - wait_for(lambda: len(l1.rpc.listfunds()["outputs"]) > 0) - l1.rpc.fundchannel(c.node_id.hex(), "all") - bitcoind.generate_block(6, wait_for_mempool=1) - wait_for( - lambda: l1.rpc.listpeerchannels()["channels"][0]["state"] == "CHANNELD_NORMAL" - ) - - # Create an invoice for 10k - preimage = "00" * 32 - payment_hash = "66687aadf862bd776c8fc18b8e9f8e20089714856ee233b3902a591d0d5f2925" - parts = 2 - p1, p2 = 300000, 700000 # The two parts we're going to use - fee = 100000 # Fee leverage on each part - inv = gl1.invoice( - label="lbl", - amount_msat=clnpb.AmountOrAny(amount=clnpb.Amount(msat=p1 + p2 - parts * fee)), - description="desc", - preimage=bytes.fromhex(preimage), - ).bolt11 - - decoded = l1.rpc.decodepay(inv) - - # So we have an invoice for 100k, now send it in two parts: - o1 = l1.rpc.createonion( - hops=[ - { - "pubkey": c.node_id.hex(), - "payload": ( - "30" - + "0203" - + "0493e0" # amt_to_forward: 30k - + "04016e" # 110 blocks CLTV - + "0823" - + decoded["payment_secret"] - + "0f4240" # Payment_secret + total_msat - + "FB0142" # Typ 251 payload 0x42 (testing we don't lose TLVs) - ), - } - ], - assocdata=payment_hash, - ) - - o2 = l1.rpc.createonion( - hops=[ - { - "pubkey": c.node_id.hex(), - "payload": ( - "30" - + "0203" - + "0aae60" # amt_to_forward: 70k - + "04016e" # 110 blocks CLTV - + "0823" - + decoded["payment_secret"] - + "0f4240" # Payment_secret + total_msat - + "FB0142" # Typ 251 payload 0x42 (testing we don't lose TLVs) - ), - } - ], - assocdata=payment_hash, - ) - - l1.rpc.call( - "sendonion", - { - "onion": o1["onion"], - "first_hop": { - "id": c.node_id.hex(), - "amount_msat": f"{p1 - fee}msat", - "delay": 21, - }, - "payment_hash": payment_hash, - "partid": 1, - "groupid": 1, - "shared_secrets": o1["shared_secrets"], - }, - ) - l1.rpc.call( - "sendonion", - { - "onion": o2["onion"], - "first_hop": { - "id": c.node_id.hex(), - "amount_msat": f"{p2 - fee}msat", - "delay": 21, - }, - "payment_hash": payment_hash, - "partid": 2, - "groupid": 1, - "shared_secrets": o1["shared_secrets"], - }, - ) - - # Check that custom payloads are preserved. See the type=251 field - # at the end of the onion-construction above. - c.find_node().process.wait_for_log(r"Serialized payload: .*fb0142") - - l1.rpc.waitsendpay(payment_hash=payment_hash, partid=1, timeout=10) - l1.rpc.waitsendpay(payment_hash=payment_hash, partid=2, timeout=10) - - # Check that custom payloads that we do not understand are skipped. The - # following onion payload does not contain `amt_to_forward`, see Bolt4. - o3 = l1.rpc.createonion( - hops=[ - { - "pubkey": c.node_id.hex(), - "payload": ( - "26" - + "04016e" # 110 blocks CLTV - + "0821" - + "0000000000000000000000000000000000000000000000000000000000000000" - + "00" # payment_data with dummy values - ), - } - ], - assocdata="0000000000000000000000000000000000000000000000000000000000000000", - ) - - l1.rpc.call( - "sendonion", - { - "onion": o3["onion"], - "first_hop": { - "id": c.node_id.hex(), - "amount_msat": "1msat", - "delay": 21, - }, - "payment_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "partid": 0, - "groupid": 1, - "shared_secrets": o3["shared_secrets"], - }, - ) - - # The htlc should be passed on to the next consumer. - c.find_node().process.wait_for_log( - r"Lsp-plugin continue, reason: payload=.* is missing forward_msat", - timeout=10, - ) - - @pytest.mark.skip(reason="Log-line can't be found anymore") def test_custommsg(clients, node_factory, bitcoind, executor): """Connect a GL node and a CLN node and have them talk."""