splice: Remove experiemental splicing feature
What changed, and why it matters
This commit removes the experimental flag that previously had to be enabled for splicing, making splicing a default feature. It is a feature-promotion and cleanup change, not a security fix. There are no code changes that patch a vulnerability, no mention of a CVE, and no security advisory.
No security action required. Treat as a normal feature-promotion commit. Reviewers may verify that the deprecation window and default feature-bit behavior match release notes, but this is not a security patch.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit deprecates the –experimental-splicing configuration option and enables splicing by default. It removes the separate OPT_EXPERIMENTAL_SPLICE feature bit, keeps OPT_SPLICE (62/63), updates generated RPC schemas and the cln-rpc model to mark experimental-splicing as deprecated, removes CI/test harness plumbing for EXPERIMENTAL_SPLICING, and updates test files to stop passing the option. The only functional runtime change is a deprecation check in opt_set_splicing() that warns the option is now on by default.
Changed components
common/features.ccommon/features.hlightningd/options.clightningd/hsm_control.ccln-rpc/src/model.rsdoc/schemas/*tests/*Inspect captured patch +67 / −94
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 9e610d9..eefdca6 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 7d00306..d2b3192 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 e049d34..d416f14 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<ListconfigsConfigsExperimentalonionmessages>,
#[deprecated]
+ #[serde(rename = "experimental-splicing")]
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub experimental_splicing: Option<ListconfigsConfigsExperimentalsplicing>,
+ #[deprecated]
#[serde(rename = "max-locktime-blocks")]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_locktime_blocks: Option<ListconfigsConfigsMaxlocktimeblocks>,
@@ -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<ListconfigsConfigsExperimentalshutdownwrongfunding>,
- #[serde(rename = "experimental-splicing")]
- #[serde(skip_serializing_if = "Option::is_none")]
- pub experimental_splicing: Option<ListconfigsConfigsExperimentalsplicing>,
#[serde(rename = "fee-base")]
#[serde(skip_serializing_if = "Option::is_none")]
pub fee_base: Option<ListconfigsConfigsFeebase>,
diff --git a/common/features.c b/common/features.c
index 94e0167..0de221d 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 f7c5a68..ddc1eeb 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 6f2e858..dc27448 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 e6b01bf..861afce 100644
--- a/contrib/pyln-testing/pyln/testing/utils.py
+++ b/contrib/pyln-testing/pyln/testing/utils.py
@@ -82,7 +82,6 @@ SLOW_MACHINE = env("SLOW_MACHINE", "0") == "1"
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 @@ class LightningNode(object):
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 fe0351e..33cf5d3 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 d7e4844..d57ee24 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 a3f0811..be44a58 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 2572177..6df1d0f 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 3509dd3..507041b 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 dc1cb57..83ef975 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 43f4f4d..965b5b7 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 636548b..9a78d0d 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 529e1cf..4672a4a 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 df3166d..c222e92 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 8ffc149..883ac80 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 1f0a219..d7acaea 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 88148f3..deacfdf 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 698fc40..2a91672 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 43ebf30..eb3e693 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 c8c838e..688604d 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 8ceef67..963f800 100644
--- a/tests/test_restart.py
+++ b/tests/test_restart.py
@@ -10,7 +10,7 @@ from utils import (
@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 ffa1bb6..00a0f09 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 d91886d..458f432 100644
--- a/tests/test_splicing.py
+++ b/tests/test_splicing.py
@@ -12,7 +12,7 @@ from utils import (
@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 faa3f8f..11830a4 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 29dc33d..c92f53a 100644
--- a/tests/test_splicing_insane.py
+++ b/tests/test_splicing_insane.py
@@ -5,7 +5,7 @@ import unittest
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 9fc902a..8647c16 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -2,7 +2,7 @@ from pyln.testing.utils import TEST_NETWORK, TIMEOUT, VALGRIND, DEPRECATED_APIS
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]
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.