From 8cf809b3b9e41844c333ba4bf8d4a2a359bcba7d Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Wed, 1 Apr 2026 21:46:31 -0400 Subject: [PATCH 1/4] splice script: Fix rare memleak in plugin Fix leaking of the `abort_pkg` if our peer does not support splicing. --- plugins/spender/splice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/spender/splice.c b/plugins/spender/splice.c index 986380dd6bea..a0ca725d6e1a 100644 --- a/plugins/spender/splice.c +++ b/plugins/spender/splice.c @@ -187,7 +187,7 @@ static struct command_result *do_fail(struct command *cmd, "splice_error(psbt:%p, splice_cmd:%p, str: %s)", splice_cmd->psbt, splice_cmd, str ?: ""); - abort_pkg = tal(cmd->plugin, struct abort_pkg); + abort_pkg = tal(cmd, struct abort_pkg); abort_pkg->splice_cmd = tal_steal(abort_pkg, splice_cmd); abort_pkg->str = tal_strdup(abort_pkg, str); abort_pkg->code = code; From 128203cfa95a45015998704b40b59fc45bce96bd Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Wed, 1 Apr 2026 21:56:48 -0400 Subject: [PATCH 2/4] splice: Enable the splice in default settings Turn splicing on by default for channel feature sets! Changelog-Deprecated Splicing is now enabled by default! --- lightningd/lightningd.c | 1 + tests/test_misc.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 3a669e1b3102..03ebdd1e7f18 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -907,6 +907,7 @@ static struct feature_set *default_features(const tal_t *ctx) OPTIONAL_FEATURE(OPT_PROVIDE_STORAGE), /* Removed later for elements */ OPTIONAL_FEATURE(OPT_ANCHORS_ZERO_FEE_HTLC_TX), + OPTIONAL_FEATURE(OPT_SPLICE), }; for (size_t i = 0; i < ARRAY_SIZE(features); i++) { diff --git a/tests/test_misc.py b/tests/test_misc.py index e53b283ca116..bbfbd80c384f 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -2501,7 +2501,8 @@ def test_list_features_only(node_factory): 'option_provide_storage/odd', 'option_channel_type/even', 'option_scid_alias/odd', - 'option_zeroconf/odd'] + 'option_zeroconf/odd', + 'option_splice/odd'] expected += ['supports_open_accept_channel_type'] assert features == expected From a6b1d0000f734f21cbaaefe5be0020ee502a597d Mon Sep 17 00:00:00 2001 From: daywalker90 <8257956+daywalker90@users.noreply.github.com> Date: Tue, 7 Apr 2026 20:21:15 +0200 Subject: [PATCH 3/4] splice: Remove experiemental splicing feature --- .github/workflows/ci.yaml | 9 ------- .msggen.json | 2 +- cln-rpc/src/model.rs | 19 ++++++++------- common/features.c | 4 ---- common/features.h | 9 +++---- contrib/msggen/msggen/schema.json | 10 ++++---- contrib/pyln-testing/pyln/testing/utils.py | 3 --- contrib/startup_regtest.sh | 1 - doc/contribute-to-core-lightning/testing.md | 1 - doc/developers-guide/deprecated-features.md | 1 + doc/lightningd-config.5.md | 2 ++ doc/schemas/dev-splice.json | 1 - doc/schemas/listconfigs.json | 4 ++++ doc/schemas/splice_init.json | 1 - doc/schemas/splice_signed.json | 1 - doc/schemas/splice_update.json | 1 - doc/schemas/splicein.json | 1 - doc/schemas/spliceout.json | 1 - lightningd/hsm_control.c | 2 +- lightningd/options.c | 8 +++++++ tests/autogenerate-rpc-examples.py | 1 - tests/test_askrene.py | 3 +-- tests/test_gossip.py | 2 +- tests/test_restart.py | 2 +- tests/test_splice.py | 26 ++++++++------------- tests/test_splicing.py | 26 ++++++++++----------- tests/test_splicing_disconnect.py | 8 +++---- tests/test_splicing_insane.py | 2 +- tests/utils.py | 10 +++----- 29 files changed, 67 insertions(+), 94 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9e610d9161cf..eefdca61522f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -500,7 +500,6 @@ jobs: env: COMPILER: ${{ matrix.COMPILER }} EXPERIMENTAL_DUAL_FUND: ${{ matrix.EXPERIMENTAL_DUAL_FUND }} - EXPERIMENTAL_SPLICING: ${{ matrix.EXPERIMENTAL_SPLICING }} COMPAT: 1 SLOW_MACHINE: 1 TEST_DEBUG: 1 @@ -553,13 +552,6 @@ jobs: COMPILER: gcc TEST_NETWORK: regtest EXPERIMENTAL_DUAL_FUND: 1 - # And splicing! - - NAME: splicing - CFG: compile-gcc-O3 - TEST_DB_PROVIDER: sqlite3 - COMPILER: gcc - TEST_NETWORK: regtest - EXPERIMENTAL_SPLICING: 1 steps: - name: Checkout uses: actions/checkout@v4 @@ -606,7 +598,6 @@ jobs: env: COMPILER: ${{ matrix.COMPILER }} EXPERIMENTAL_DUAL_FUND: ${{ matrix.EXPERIMENTAL_DUAL_FUND }} - EXPERIMENTAL_SPLICING: ${{ matrix.EXPERIMENTAL_SPLICING }} COMPAT: 1 SLOW_MACHINE: 1 TEST_DEBUG: 1 diff --git a/.msggen.json b/.msggen.json index 7d003069652f..d2b31922835e 100644 --- a/.msggen.json +++ b/.msggen.json @@ -9785,7 +9785,7 @@ }, "ListConfigs.configs.experimental-splicing": { "added": "v23.08", - "deprecated": null + "deprecated": "v26.04" }, "ListConfigs.configs.experimental-splicing.set": { "added": "pre-v0.10.1", diff --git a/cln-rpc/src/model.rs b/cln-rpc/src/model.rs index e049d34b6f65..d416f1435d47 100644 --- a/cln-rpc/src/model.rs +++ b/cln-rpc/src/model.rs @@ -10367,6 +10367,12 @@ pub mod responses { pub source: String, } + #[derive(Clone, Debug, Deserialize, Serialize)] + pub struct ListconfigsConfigsExperimentalsplicing { + pub set: bool, + pub source: String, + } + #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ListconfigsConfigsMaxlocktimeblocks { pub source: String, @@ -10564,12 +10570,6 @@ pub mod responses { pub source: String, } - #[derive(Clone, Debug, Deserialize, Serialize)] - pub struct ListconfigsConfigsExperimentalsplicing { - pub set: bool, - pub source: String, - } - #[derive(Clone, Debug, Deserialize, Serialize)] pub struct ListconfigsConfigsFeebase { pub source: String, @@ -10870,6 +10870,10 @@ pub mod responses { #[serde(skip_serializing_if = "Option::is_none")] pub experimental_onion_messages: Option, #[deprecated] + #[serde(rename = "experimental-splicing")] + #[serde(skip_serializing_if = "Option::is_none")] + pub experimental_splicing: Option, + #[deprecated] #[serde(rename = "max-locktime-blocks")] #[serde(skip_serializing_if = "Option::is_none")] pub max_locktime_blocks: Option, @@ -10948,9 +10952,6 @@ pub mod responses { #[serde(rename = "experimental-shutdown-wrong-funding")] #[serde(skip_serializing_if = "Option::is_none")] pub experimental_shutdown_wrong_funding: Option, - #[serde(rename = "experimental-splicing")] - #[serde(skip_serializing_if = "Option::is_none")] - pub experimental_splicing: Option, #[serde(rename = "fee-base")] #[serde(skip_serializing_if = "Option::is_none")] pub fee_base: Option, diff --git a/common/features.c b/common/features.c index 94e0167b5362..0de221dad443 100644 --- a/common/features.c +++ b/common/features.c @@ -140,10 +140,6 @@ static const struct feature_style feature_styles[] = { .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT, [CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT} }, - { OPT_EXPERIMENTAL_SPLICE, - .copy_style = { [INIT_FEATURE] = FEATURE_REPRESENT, - [NODE_ANNOUNCE_FEATURE] = FEATURE_REPRESENT, - [CHANNEL_FEATURE] = FEATURE_DONT_REPRESENT} }, }; struct dependency { diff --git a/common/features.h b/common/features.h index f7c5a684f0a3..ddc1eeb27ea4 100644 --- a/common/features.h +++ b/common/features.h @@ -122,6 +122,8 @@ struct feature_set *feature_set_dup(const tal_t *ctx, * | 46/47 | `option_scid_alias` | ... IN ... * | 48/49 | `option_payment_metadata` |... 9 ... * | 50/51 | `option_zeroconf` | ... IN ... + * | 60/61 | `option_simple_close` |... IN ... + * | 62/63 | `option_splice` |... IN ... */ #define OPT_DATA_LOSS_PROTECT 0 #define OPT_UPFRONT_SHUTDOWN_SCRIPT 4 @@ -144,17 +146,12 @@ struct feature_set *feature_set_dup(const tal_t *ctx, #define OPT_SCID_ALIAS 46 #define OPT_PAYMENT_METADATA 48 #define OPT_ZEROCONF 50 +#define OPT_SPLICE 62 /* The old pre-zero-fee-anchors were deprecated, and we never supported them * outside experimental options */ #define OPT_ANCHOR_OUTPUTS_DEPRECATED 20 -/* BOLT-splice #9: - * | 62/63 | `option_splice` | ... IN ... - */ -#define OPT_SPLICE 62 -#define OPT_EXPERIMENTAL_SPLICE 162 - #define OPT_SHUTDOWN_WRONG_FUNDING 104 #endif /* LIGHTNING_COMMON_FEATURES_H */ diff --git a/contrib/msggen/msggen/schema.json b/contrib/msggen/msggen/schema.json index 6f2e85860411..dc2744813c27 100644 --- a/contrib/msggen/msggen/schema.json +++ b/contrib/msggen/msggen/schema.json @@ -11409,7 +11409,6 @@ "added": "v24.11", "rpc": "dev-splice", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice` is the command to move funds into or out of a channel. Multiple actions can be combined together resulting in a single onchain transaction. Funds may be moved out of a channel and into another in a single batch enabling cross-channel movement." ], @@ -19300,6 +19299,10 @@ }, "experimental-splicing": { "added": "v23.08", + "deprecated": [ + "v26.04", + "v27.04" + ], "type": "object", "additionalProperties": false, "required": [ @@ -33954,7 +33957,6 @@ "added": "v23.08", "rpc": "splice_init", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_init` is a low level RPC command which initiates a channel splice for a given channel specified by `channel_id`." ], @@ -34097,7 +34099,6 @@ "added": "v23.08", "rpc": "splice_signed", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_signed` is a low level RPC command which finishes the active channel splice associated with `channel_id`.", "", @@ -34265,7 +34266,6 @@ "added": "v23.08", "rpc": "splice_update", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_update` is a low level RPC command which updates the active channel splice associated with `channel_id`.", "", @@ -34432,7 +34432,6 @@ "added": "v26.04", "rpc": "splicein", "title": "Command to splice funds into a channel", - "warning": "experimental-splicing only", "description": [ "`splicein` is the command to move funds into a channel." ], @@ -34499,7 +34498,6 @@ "added": "v26.04", "rpc": "spliceout", "title": "Command to splice funds out of a channel", - "warning": "experimental-splicing only", "description": [ "`spliceout` is the command to move funds into a channel." ], diff --git a/contrib/pyln-testing/pyln/testing/utils.py b/contrib/pyln-testing/pyln/testing/utils.py index e6b01bf89133..861afcea2c76 100644 --- a/contrib/pyln-testing/pyln/testing/utils.py +++ b/contrib/pyln-testing/pyln/testing/utils.py @@ -82,7 +82,6 @@ def env(name, default=None): DEPRECATED_APIS = env("DEPRECATED_APIS", "0") == "1" TIMEOUT = int(env("TIMEOUT", 180 if SLOW_MACHINE else 60)) EXPERIMENTAL_DUAL_FUND = env("EXPERIMENTAL_DUAL_FUND", "0") == "1" -EXPERIMENTAL_SPLICING = env("EXPERIMENTAL_SPLICING", "0") == "1" GENERATE_EXAMPLES = env("GENERATE_EXAMPLES", "0") == "1" RUST = env("RUST", "0") == "1" @@ -963,8 +962,6 @@ def __init__(self, node_id, lightning_dir, bitcoind, executor, may_fail=False, self.daemon.opts["dev-no-reconnect"] = None if EXPERIMENTAL_DUAL_FUND: self.daemon.opts["experimental-dual-fund"] = None - if EXPERIMENTAL_SPLICING: - self.daemon.opts["experimental-splicing"] = None # Avoid test flakes cause by this option unless explicitly set. if self.cln_version >= "v24.11": self.daemon.opts.update({"autoconnect-seeker-peers": 0}) diff --git a/contrib/startup_regtest.sh b/contrib/startup_regtest.sh index fe0351ef3f67..33cf5d36ba8c 100755 --- a/contrib/startup_regtest.sh +++ b/contrib/startup_regtest.sh @@ -199,7 +199,6 @@ start_nodes() { dev-fast-gossip dev-bitcoind-poll=5 experimental-dual-fund - experimental-splicing funder-policy=match funder-policy-mod=100 funder-min-their-funding=10000 diff --git a/doc/contribute-to-core-lightning/testing.md b/doc/contribute-to-core-lightning/testing.md index d7e48443e188..d57ee243a9e7 100644 --- a/doc/contribute-to-core-lightning/testing.md +++ b/doc/contribute-to-core-lightning/testing.md @@ -63,7 +63,6 @@ Our Github Actions instance (see `.github/workflows/*.yml`) runs all these for e ```text EXPERIMENTAL_DUAL_FUND=[0|1] - Enable dual-funding tests. -EXPERIMENTAL_SPLICING=[0|1] - Enable splicing tests. TEST_CHECK_DBSTMTS=[0|1] - When running blackbox tests, this will load a plugin that logs all compiled and expanded database statements. diff --git a/doc/developers-guide/deprecated-features.md b/doc/developers-guide/deprecated-features.md index a3f0811ebe4e..be44a5837157 100644 --- a/doc/developers-guide/deprecated-features.md +++ b/doc/developers-guide/deprecated-features.md @@ -23,6 +23,7 @@ privacy: | newaddr.addresstype.defaultbech32 | Parameter | v25.12 | v26.12 | Use `p2tr` in the response (present since v23.08 if `addresstype` is `p2tr`, and always present since v24.12). | | channel_state_changed.null_message | Notification Field | v25.12 | v26.12 | In channel_state_changed notification, `message` will be missing instead of `null` | | hsmtool.getcodexsecret | Command | v25.12.1 | v26.12 | Doesn't work on nodes using mnemonic secrets (v25.12 or later). Use `getsecret` instead. | +| experimental_splicing | Config | v26.04 | v27.04 | Splicing is now enabled by default | Inevitably there are features which need to change: either to be generalized, or removed when they can no longer be supported. Types of deprecation: diff --git a/doc/lightningd-config.5.md b/doc/lightningd-config.5.md index 25721771dfa1..6df1d0f86943 100644 --- a/doc/lightningd-config.5.md +++ b/doc/lightningd-config.5.md @@ -862,6 +862,8 @@ The operations will be bundled into a single transaction. The channel will remai active while awaiting splice confirmation, however you can only spend the smaller of the prior channel balance and the new one. + (deprecated in v26.04) + * **experimental-lsps-client** Specifying this enables client side support for the lsps protocol diff --git a/doc/schemas/dev-splice.json b/doc/schemas/dev-splice.json index 3509dd3a3da0..507041b85d7f 100644 --- a/doc/schemas/dev-splice.json +++ b/doc/schemas/dev-splice.json @@ -5,7 +5,6 @@ "added": "v24.11", "rpc": "dev-splice", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice` is the command to move funds into or out of a channel. Multiple actions can be combined together resulting in a single onchain transaction. Funds may be moved out of a channel and into another in a single batch enabling cross-channel movement." ], diff --git a/doc/schemas/listconfigs.json b/doc/schemas/listconfigs.json index dc1cb570461e..83ef975a938b 100644 --- a/doc/schemas/listconfigs.json +++ b/doc/schemas/listconfigs.json @@ -530,6 +530,10 @@ }, "experimental-splicing": { "added": "v23.08", + "deprecated": [ + "v26.04", + "v27.04" + ], "type": "object", "additionalProperties": false, "required": [ diff --git a/doc/schemas/splice_init.json b/doc/schemas/splice_init.json index 43f4f4d1d67c..965b5b720ae4 100644 --- a/doc/schemas/splice_init.json +++ b/doc/schemas/splice_init.json @@ -4,7 +4,6 @@ "added": "v23.08", "rpc": "splice_init", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_init` is a low level RPC command which initiates a channel splice for a given channel specified by `channel_id`." ], diff --git a/doc/schemas/splice_signed.json b/doc/schemas/splice_signed.json index 636548beef97..9a78d0dbf101 100644 --- a/doc/schemas/splice_signed.json +++ b/doc/schemas/splice_signed.json @@ -4,7 +4,6 @@ "added": "v23.08", "rpc": "splice_signed", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_signed` is a low level RPC command which finishes the active channel splice associated with `channel_id`.", "", diff --git a/doc/schemas/splice_update.json b/doc/schemas/splice_update.json index 529e1cf04238..4672a4af2530 100644 --- a/doc/schemas/splice_update.json +++ b/doc/schemas/splice_update.json @@ -4,7 +4,6 @@ "added": "v23.08", "rpc": "splice_update", "title": "Command to initiate a channel to a peer", - "warning": "experimental-splicing only", "description": [ "`splice_update` is a low level RPC command which updates the active channel splice associated with `channel_id`.", "", diff --git a/doc/schemas/splicein.json b/doc/schemas/splicein.json index df3166d0f5f6..c222e92f7bba 100644 --- a/doc/schemas/splicein.json +++ b/doc/schemas/splicein.json @@ -5,7 +5,6 @@ "added": "v26.04", "rpc": "splicein", "title": "Command to splice funds into a channel", - "warning": "experimental-splicing only", "description": [ "`splicein` is the command to move funds into a channel." ], diff --git a/doc/schemas/spliceout.json b/doc/schemas/spliceout.json index 8ffc1498220a..883ac803a30f 100644 --- a/doc/schemas/spliceout.json +++ b/doc/schemas/spliceout.json @@ -5,7 +5,6 @@ "added": "v26.04", "rpc": "spliceout", "title": "Command to splice funds out of a channel", - "warning": "experimental-splicing only", "description": [ "`spliceout` is the command to move funds into a channel." ], diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index 1f0a2192fe64..d7acaeafdc35 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -186,7 +186,7 @@ struct ext_key *hsm_init(struct lightningd *ld) if (feature_offered(ld->our_features->bits[INIT_FEATURE], OPT_SPLICE) && !hsm_capable(ld, WIRE_HSMD_SIGN_SPLICE_TX)) { - fatal("--experimental-splicing needs HSM capable of signing splices!"); + fatal("splicing needs HSM capable of signing splices!"); } /* Check if we have a mnemonic-based HSM secret from TLV */ diff --git a/lightningd/options.c b/lightningd/options.c index 88148f3e6d12..deacfdfdee04 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -1252,6 +1252,12 @@ static char *opt_set_dual_fund(struct lightningd *ld) static char *opt_set_splicing(struct lightningd *ld) { + /* Show deprecation warning */ + if (!opt_deprecated_ok(ld, "experimental_splicing", NULL, + "v26.04", "v27.04")) + return "--experimental-splicing is now enabled by default" + " enabled by default"; + feature_set_or(ld->our_features, take(feature_set_for_feature(NULL, OPTIONAL_FEATURE(OPT_SPLICE)))); @@ -1486,11 +1492,13 @@ static void register_opts(struct lightningd *ld) " and allow peers to establish channels" " via v2 channel open protocol."); + /* Deprecated: splicing is on by default now */ opt_register_early_noarg("--experimental-splicing", opt_set_splicing, ld, "experimental: Enables the ability to resize" " channels using splicing"); + /* This affects our features, so set early. */ opt_register_early_noarg("--experimental-shutdown-wrong-funding", opt_set_shutdown_wrong_funding, ld, diff --git a/tests/autogenerate-rpc-examples.py b/tests/autogenerate-rpc-examples.py index 698fc4005095..2a916722df4d 100644 --- a/tests/autogenerate-rpc-examples.py +++ b/tests/autogenerate-rpc-examples.py @@ -1318,7 +1318,6 @@ def generate_splice_examples(node_factory, bitcoind): # Basic setup for l7->l8 options = [ { - 'experimental-splicing': None, 'allow-deprecated-apis': True, 'allow_bad_gossip': True, 'broken_log': '.*', diff --git a/tests/test_askrene.py b/tests/test_askrene.py index 43ebf3088a4d..eb3e69360354 100644 --- a/tests/test_askrene.py +++ b/tests/test_askrene.py @@ -2035,8 +2035,7 @@ def test_splice_dying_channel(node_factory, bitcoind): """We should NOT try to use the pre-splice channel here""" l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, - fundamount=200000, - opts={'experimental-splicing': None}) + fundamount=200000) chan_id = l1.get_channel_id(l2) funds_result = l1.rpc.addpsbtoutput(100000) diff --git a/tests/test_gossip.py b/tests/test_gossip.py index c8c838e40d81..688604da7774 100644 --- a/tests/test_gossip.py +++ b/tests/test_gossip.py @@ -1700,7 +1700,7 @@ def test_gossip_store_compact_while_extending(node_factory, bitcoind, executor): f.write(b'') fut.result(TIMEOUT) - # Exact gossip size varies with EXPERIMENTAL_SPLICING. + # Exact gossip size varies with SPLICING. l1.daemon.wait_for_logs(['gossipd: compaction done', 'connectd: Reopened gossip_store, reduced to offset 224[59]']) diff --git a/tests/test_restart.py b/tests/test_restart.py index 8ceef671cacf..963f800bacdf 100644 --- a/tests/test_restart.py +++ b/tests/test_restart.py @@ -10,7 +10,7 @@ @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_agressive_restart(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) diff --git a/tests/test_splice.py b/tests/test_splice.py index ffa1bb63a4af..00a0f097af08 100644 --- a/tests/test_splice.py +++ b/tests/test_splice.py @@ -18,8 +18,7 @@ def test_script_splice_out(node_factory, bitcoind, chainparams): coin_mvt_plugin = Path(__file__).parent / "plugins" / "coin_movements.py" l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None, - 'plugin': coin_mvt_plugin}) + opts={'plugin': coin_mvt_plugin}) initial_wallet_balance = Millisatoshi(bkpr_account_balance(l1, 'wallet')) initial_channel_balance = Millisatoshi(bkpr_account_balance(l1, first_channel_id(l1, l2))) @@ -110,8 +109,7 @@ def test_script_splice_in(node_factory, bitcoind, chainparams): coin_mvt_plugin = Path(__file__).parent / "plugins" / "coin_movements.py" l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None, - 'plugin': coin_mvt_plugin}) + opts={'plugin': coin_mvt_plugin}) initial_wallet_balance = Millisatoshi(bkpr_account_balance(l1, 'wallet')) initial_channel_balance = Millisatoshi(bkpr_account_balance(l1, first_channel_id(l1, l2))) @@ -202,7 +200,7 @@ def test_script_splice_in(node_factory, bitcoind, chainparams): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_script_two_chan_splice_in(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True) chan_id1 = l2.get_channel_id(l1) chan_id2 = l2.get_channel_id(l3) @@ -237,7 +235,7 @@ def test_script_two_chan_splice_in(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_script_two_chan_splice_out(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True) # We need to get funds into l1 -> l2 channel so we can splice it out inv = l2.rpc.invoice(100000000, '1', 'no_1') @@ -275,7 +273,7 @@ def test_script_two_chan_splice_out(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_script_two_chan_splice_inout(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True) chan_id1 = l2.get_channel_id(l1) chan_id2 = l2.get_channel_id(l3) @@ -316,8 +314,7 @@ def test_easy_splice_in(node_factory, bitcoind, chainparams): coin_mvt_plugin = Path(__file__).parent / "plugins" / "coin_movements.py" l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None, - 'plugin': coin_mvt_plugin}) + opts={'plugin': coin_mvt_plugin}) # Splice in 100k sats into first channel spliceamt = 100000 @@ -353,7 +350,7 @@ def test_easy_splice_in(node_factory, bitcoind, chainparams): # # The channels for the second node are returned in chanids def make_chans(node_factory, qty=2, fundamount=1000000, balanced=True): - nodes = node_factory.line_graph(qty + 1, fundamount=fundamount, opts={'experimental-splicing': None, 'allow_bad_gossip': True}) + nodes = node_factory.line_graph(qty + 1, fundamount=fundamount, opts={'allow_bad_gossip': True}) chanids = [] for i in range(len(nodes) - 1): @@ -629,8 +626,7 @@ def test_easy_splice_out(node_factory, bitcoind, chainparams): coin_mvt_plugin = Path(__file__).parent / "plugins" / "coin_movements.py" l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None, - 'plugin': coin_mvt_plugin}) + opts={'plugin': coin_mvt_plugin}) initial_wallet_balance = Millisatoshi(bkpr_account_balance(l1, 'wallet')) @@ -660,8 +656,7 @@ def test_easy_splice_out(node_factory, bitcoind, chainparams): def test_easy_splice_out_address(node_factory, bitcoind, chainparams): fundamt = 1000000 - l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=fundamt, wait_for_announce=True) initial_wallet_balance = Millisatoshi(bkpr_account_balance(l1, 'wallet')) @@ -692,8 +687,7 @@ def test_easy_splice_out_address(node_factory, bitcoind, chainparams): def test_easy_splice_out_into_channel(node_factory, bitcoind, chainparams): fundamt = 1000000 - l1, l2, l3 = node_factory.line_graph(3, fundamount=fundamt, wait_for_announce=True, - opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=fundamt, wait_for_announce=True) chan1 = first_channel_id(l1, l2) chan2 = first_channel_id(l2, l3) diff --git a/tests/test_splicing.py b/tests/test_splicing.py index d91886d2efb0..458f432f8630 100644 --- a/tests/test_splicing.py +++ b/tests/test_splicing.py @@ -12,7 +12,7 @@ @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) @@ -51,7 +51,7 @@ def test_splice(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_two_chan_splice_in(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True) # l2 will splice funds into the channels with l1 and l3 at the same time @@ -124,7 +124,7 @@ def test_two_chan_splice_in(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_rbf(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) @@ -184,7 +184,7 @@ def test_splice_rbf(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_nosign(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) @@ -208,7 +208,7 @@ def test_splice_nosign(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_gossip(node_factory, bitcoind): - l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) pre_splice_scid = first_scid(l1, l2) @@ -272,7 +272,7 @@ def test_splice_gossip(node_factory, bitcoind): @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_listnodes(node_factory, bitcoind): # Here we do a splice but underfund it purposefully - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) @@ -308,7 +308,7 @@ def test_splice_listnodes(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_out(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True) chan_id = l1.get_channel_id(l2) @@ -347,8 +347,7 @@ def test_splice_out(node_factory, bitcoind): @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_invalid_splice(node_factory, bitcoind): # Here we do a splice but underfund it purposefully - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None, - 'may_reconnect': True, + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'may_reconnect': True, 'allow_warning': True}) chan_id = l1.get_channel_id(l2) @@ -405,8 +404,7 @@ def test_invalid_splice(node_factory, bitcoind): @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_commit_crash_splice(node_factory, bitcoind): # Here we do a normal splice out but force a restart after commiting. - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None, - 'may_reconnect': True}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'may_reconnect': True}) chan_id = l1.get_channel_id(l2) @@ -456,7 +454,7 @@ def test_commit_crash_splice(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_stuck_htlc(node_factory, bitcoind, executor): - l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True, opts={'experimental-splicing': None}) + l1, l2, l3 = node_factory.line_graph(3, wait_for_announce=True) l3.rpc.dev_ignore_htlcs(id=l2.info['id'], ignore=True) @@ -501,7 +499,7 @@ def test_splice_stuck_htlc(node_factory, bitcoind, executor): @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_route_by_old_scid(node_factory, bitcoind): - opts = {'experimental-splicing': None, 'may_reconnect': True} + opts = {'may_reconnect': True} # l1 sometimes talks about pre-splice channels. l2 (being part of the splice) immediately forgets # the old scid and uses the new one, then complains when l1 talks about it. Which is fine, but # breaks CI. @@ -563,7 +561,7 @@ def test_route_by_old_scid(node_factory, bitcoind): @pytest.mark.openchannel('v1') @pytest.mark.openchannel('v2') def test_splice_unannounced(node_factory, bitcoind): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=False, opts={'experimental-splicing': None}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=False) chan_id = l1.get_channel_id(l2) diff --git a/tests/test_splicing_disconnect.py b/tests/test_splicing_disconnect.py index faa3f8f4bf5f..11830a4064ba 100644 --- a/tests/test_splicing_disconnect.py +++ b/tests/test_splicing_disconnect.py @@ -18,9 +18,9 @@ def test_splice_disconnect_sig(node_factory, bitcoind): disconnect = ['=WIRE_TX_SIGNATURES'] + disconnect l1 = node_factory.get_node(disconnect=disconnect, - options={'experimental-splicing': None, 'dev-no-reconnect': None}, + options={'dev-no-reconnect': None}, may_reconnect=True) - l2 = node_factory.get_node(options={'experimental-splicing': None}, may_reconnect=True) + l2 = node_factory.get_node(may_reconnect=True) l1.openchannel(l2, 1000000) chan_id = l1.get_channel_id(l2) @@ -70,7 +70,7 @@ def test_splice_disconnect_sig(node_factory, bitcoind): @pytest.mark.openchannel('v2') @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') def test_splice_disconnect_commit(node_factory, bitcoind, executor): - l1 = node_factory.get_node(options={'experimental-splicing': None, 'dev-no-reconnect': None}, + l1 = node_factory.get_node(options={'dev-no-reconnect': None}, may_reconnect=True) # Note: for dual-fund, there's a COMMITMENT_SIGNED for the initial tx, before splicing! if EXPERIMENTAL_DUAL_FUND: @@ -78,7 +78,7 @@ def test_splice_disconnect_commit(node_factory, bitcoind, executor): else: disconnects = ['+WIRE_COMMITMENT_SIGNED'] l2 = node_factory.get_node(disconnect=disconnects, - options={'experimental-splicing': None, 'dev-no-reconnect': None}, + options={'dev-no-reconnect': None}, may_reconnect=True) l1.openchannel(l2, 1000000) diff --git a/tests/test_splicing_insane.py b/tests/test_splicing_insane.py index 29dc33d19db4..c92f53a821da 100644 --- a/tests/test_splicing_insane.py +++ b/tests/test_splicing_insane.py @@ -5,7 +5,7 @@ def make_pending_splice(node_factory): - l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'experimental-splicing': None, 'may_reconnect': True}) + l1, l2 = node_factory.line_graph(2, fundamount=1000000, wait_for_announce=True, opts={'may_reconnect': True}) chan_id = l1.get_channel_id(l2) diff --git a/tests/utils.py b/tests/utils.py index 9fc902aac23b..8647c16e6436 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,7 +2,7 @@ from pyln.testing.utils import env, only_one, wait_for, write_config, TailableProc, sync_blockheight, wait_channel_quiescent, get_tx_p2wsh_outnum, mine_funding_to_announce, scid_to_int # noqa: F401 import bitstring from pyln.client import Millisatoshi -from pyln.testing.utils import EXPERIMENTAL_DUAL_FUND, EXPERIMENTAL_SPLICING +from pyln.testing.utils import EXPERIMENTAL_DUAL_FUND from pyln.proto.onion import TlvPayload import struct import subprocess @@ -41,12 +41,10 @@ def hex_bits(features): def expected_peer_features(extra=[]): """Return the expected peer features hexstring for this configuration""" - features = [0, 5, 7, 8, 11, 12, 14, 17, 19, 25, 27, 35, 39, 43, 44, 47, 51] + features = [0, 5, 7, 8, 11, 12, 14, 17, 19, 25, 27, 35, 39, 43, 44, 47, 51, 63] if EXPERIMENTAL_DUAL_FUND: # option_dual_fund features += [29] - if EXPERIMENTAL_SPLICING: - features += [63] # option_splice if TEST_NETWORK != 'liquid-regtest': # Anchors, except for elements features += [23] @@ -57,12 +55,10 @@ def expected_peer_features(extra=[]): # features for the 'node' and the 'peer' feature sets def expected_node_features(extra=[]): """Return the expected node features hexstring for this configuration""" - features = [0, 5, 7, 8, 11, 12, 14, 17, 19, 25, 27, 35, 39, 43, 44, 47, 51, 55] + features = [0, 5, 7, 8, 11, 12, 14, 17, 19, 25, 27, 35, 39, 43, 44, 47, 51, 55, 63] if EXPERIMENTAL_DUAL_FUND: # option_dual_fund features += [29] - if EXPERIMENTAL_SPLICING: - features += [63] # option_splice if TEST_NETWORK != 'liquid-regtest': # Anchors, except for elements features += [23] From 4712f3364498568a9781d7d5d24b3678f37dfd46 Mon Sep 17 00:00:00 2001 From: Dusty Daemon Date: Thu, 2 Apr 2026 10:26:56 -0400 Subject: [PATCH 4/4] CI: Turn on diff outputs on failed doc gen When the doc generator fails, make the CI output the diff of how it failed. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index fb9bd9110205..0e8fcfdf21e9 100644 --- a/Makefile +++ b/Makefile @@ -674,7 +674,7 @@ gen: $(CHECK_GEN_ALL) check-gen-updated: $(CHECK_GEN_ALL) @echo "Checking for generated files being changed by make" - git diff --exit-code HEAD + git diff --text --exit-code HEAD coverage/coverage.info: check pytest mkdir coverage || true