Skip to content

Commit 915ec20

Browse files
committed
Enable zero-fee commitments
Prefer zero-fee commitment channels when supported to avoid commitment feerate negotiation. Use package-capable Esplora fixtures so integration tests exercise the expected chain source and verify zero-fee negotiation.
1 parent 393731d commit 915ec20

7 files changed

Lines changed: 102 additions & 7 deletions

File tree

‎.github/workflows/tests.yml‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ jobs:
3434

3535
- uses: Swatinem/rust-cache@v2.7.8
3636

37+
- name: Cache package-enabled Esplora
38+
id: cache-esplora
39+
uses: actions/cache@v4
40+
with:
41+
path: bin/electrs-${{ runner.os }}-${{ runner.arch }}
42+
key: electrs-submit-package-8c06d801-${{ runner.os }}-${{ runner.arch }}
43+
44+
- name: Build package-enabled Esplora
45+
if: steps.cache-esplora.outputs.cache-hit != 'true'
46+
run: |
47+
./scripts/build_package_esplora.sh "bin/electrs-${{ runner.os }}-${{ runner.arch }}"
48+
49+
- name: Configure package-enabled Esplora
50+
run: echo "ELECTRS_EXE=$(pwd)/bin/electrs-${{ runner.os }}-${{ runner.arch }}" >> "$GITHUB_ENV"
51+
3752
- name: Check formatting
3853
run: cargo fmt --check
3954

@@ -62,5 +77,20 @@ jobs:
6277

6378
- uses: Swatinem/rust-cache@v2.7.8
6479

80+
- name: Cache package-enabled Esplora
81+
id: cache-esplora
82+
uses: actions/cache@v4
83+
with:
84+
path: bin/electrs-${{ runner.os }}-${{ runner.arch }}
85+
key: electrs-submit-package-8c06d801-${{ runner.os }}-${{ runner.arch }}
86+
87+
- name: Build package-enabled Esplora
88+
if: steps.cache-esplora.outputs.cache-hit != 'true'
89+
run: |
90+
./scripts/build_package_esplora.sh "bin/electrs-${{ runner.os }}-${{ runner.arch }}"
91+
92+
- name: Configure package-enabled Esplora
93+
run: echo "ELECTRS_EXE=$(pwd)/bin/electrs-${{ runner.os }}-${{ runner.arch }}" >> "$GITHUB_ENV"
94+
6595
- name: Run cashu tests
6696
run: cargo test --features _cashu-tests -- --test-threads=2 --nocapture

‎orange-sdk/Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ async-trait = "0.1"
3838
log = "0.4.28"
3939

4040
corepc-node = { version = "0.10.1", features = ["29_0", "download"], optional = true }
41-
electrsd = { version = "0.36.1", default-features = false, features = ["esplora_a33e97e1", "corepc-node_29_0"], optional = true }
41+
electrsd = { version = "0.36.1", default-features = false, features = ["legacy", "corepc-node_29_0"], optional = true }
4242
cdk-ldk-node = { version = "0.16.0", optional = true }
4343
cdk-sqlite = { version = "0.16.0", optional = true }
4444
cdk-axum = { version = "0.16.0", optional = true }

‎orange-sdk/src/lightning_wallet.rs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl LightningWallet {
6565
log_info!(logger, "Creating LDK node...");
6666
let anchor_channels_config = ldk_node::config::AnchorChannelsConfig {
6767
trusted_peers_no_reserve: vec![config.lsp.1],
68+
enable_zero_fee_commitments: true,
6869
..Default::default()
6970
};
7071
let ldk_node_config =

‎orange-sdk/src/trusted_wallet/dummy.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ impl DummyTrustedWallet {
5252
uuid: Uuid, lsp: Arc<Node>, bitcoind: Arc<Bitcoind>, tx_metadata: TxMetadataStore,
5353
event_queue: Arc<EventQueue>, rt: Arc<Runtime>,
5454
) -> Self {
55-
let mut builder = ldk_node::Builder::new();
55+
let mut config = ldk_node::config::Config::default();
56+
config.anchor_channels_config.enable_zero_fee_commitments = true;
57+
let mut builder = ldk_node::Builder::from_config(config);
5658
builder.set_network(Network::Regtest);
5759
let mut seed: [u8; 64] = [0; 64];
5860
rand::thread_rng().fill_bytes(&mut seed);

‎orange-sdk/tests/integration_tests.rs‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,11 @@ async fn test_receive_to_ln() {
739739
let third_party = Arc::clone(&params.third_party);
740740

741741
let recv_amt = open_channel_from_lsp(&wallet, Arc::clone(&third_party)).await;
742+
let channel = wallet.channels().into_iter().next().expect("expected a JIT channel");
743+
assert_eq!(
744+
channel.feerate_sat_per_1000_weight, 0,
745+
"JIT channel should use zero-fee commitments"
746+
);
742747

743748
let txs = wallet.list_transactions().await.unwrap();
744749
assert_eq!(txs.len(), 1);

‎orange-sdk/tests/test_utils.rs‎

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use std::env::temp_dir;
2626
use std::future::Future;
2727
#[cfg(feature = "_cashu-tests")]
2828
use std::net::SocketAddr;
29+
use std::path::PathBuf;
2930
#[cfg(feature = "_cashu-tests")]
3031
use std::str::FromStr;
3132
use std::sync::Arc;
@@ -91,9 +92,8 @@ async fn create_bitcoind(uuid: Uuid) -> (Arc<Bitcoind>, Arc<ElectrsD>) {
9192
let mut electrsd_conf = electrsd::Conf::default();
9293
electrsd_conf.http_enabled = true;
9394
electrsd_conf.network = "regtest";
94-
let electrsd =
95-
ElectrsD::with_conf(electrsd::downloaded_exe_path().unwrap(), &bitcoind, &electrsd_conf)
96-
.unwrap_or_else(|_| panic!("Failed to start electrsd for test {uuid}"));
95+
let electrsd = ElectrsD::with_conf(package_esplora_exe_path(), &bitcoind, &electrsd_conf)
96+
.unwrap_or_else(|_| panic!("Failed to start electrsd for test {uuid}"));
9797

9898
// mine 101 blocks to get some spendable funds
9999
let address = bitcoind.client.new_address().unwrap();
@@ -104,6 +104,21 @@ async fn create_bitcoind(uuid: Uuid) -> (Arc<Bitcoind>, Arc<ElectrsD>) {
104104
(Arc::new(bitcoind), Arc::new(electrsd))
105105
}
106106

107+
fn package_esplora_exe_path() -> String {
108+
let path = std::env::var_os("ELECTRS_EXE").map(PathBuf::from).unwrap_or_else(|| {
109+
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../target/package-esplora/electrs")
110+
});
111+
112+
if !path.is_file() {
113+
panic!(
114+
"Package-enabled Esplora not found at {}. Run ./scripts/build_package_esplora.sh or set ELECTRS_EXE.",
115+
path.display()
116+
);
117+
}
118+
119+
path.into_os_string().into_string().expect("Esplora executable path must be valid UTF-8")
120+
}
121+
107122
fn wait_for_bitcoind_ready(bitcoind: &Bitcoind) {
108123
let max_attempts = 30;
109124
let delay = Duration::from_millis(500);
@@ -140,7 +155,9 @@ pub async fn generate_blocks(bitcoind: &Bitcoind, electrs: &ElectrsD, num: usize
140155
}
141156

142157
fn create_lsp(uuid: Uuid, bitcoind: &Bitcoind) -> Arc<Node> {
143-
let mut builder = ldk_node::Builder::new();
158+
let mut config = ldk_node::config::Config::default();
159+
config.anchor_channels_config.enable_zero_fee_commitments = true;
160+
let mut builder = ldk_node::Builder::from_config(config);
144161
builder.set_network(Network::Regtest);
145162
let mut seed: [u8; 64] = [0; 64];
146163
rand::thread_rng().fill_bytes(&mut seed);
@@ -199,7 +216,9 @@ fn create_lsp(uuid: Uuid, bitcoind: &Bitcoind) -> Arc<Node> {
199216
}
200217

201218
fn create_third_party(uuid: Uuid, bitcoind: &Bitcoind) -> Arc<Node> {
202-
let mut builder = ldk_node::Builder::new();
219+
let mut config = ldk_node::config::Config::default();
220+
config.anchor_channels_config.enable_zero_fee_commitments = true;
221+
let mut builder = ldk_node::Builder::from_config(config);
203222
builder.set_network(Network::Regtest);
204223
let mut seed: [u8; 64] = [0; 64];
205224
rand::thread_rng().fill_bytes(&mut seed);

‎scripts/build_package_esplora.sh‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Zero-fee commitment tests require Esplora's package broadcast endpoint.
5+
# electrsd's downloadable Esplora revision does not implement it, so build the
6+
# package-enabled revision used by ldk-node's zero-fee integration tests.
7+
esplora_repo="https://github.com/tankyleo/blockstream-electrs.git"
8+
esplora_tag="2026-05-26-electrum-submit-package"
9+
esplora_rev="8c06d8010e43f793b1a65f83695ea846e5cd83ed"
10+
11+
host_platform="$(rustc --version --verbose | awk '/^host:/ { print $2 }')"
12+
case "$host_platform" in
13+
*linux*|*darwin*) ;;
14+
*)
15+
echo "Unsupported platform: $host_platform" >&2
16+
exit 1
17+
;;
18+
esac
19+
20+
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
21+
output_path="${1:-$repo_root/target/package-esplora/electrs}"
22+
build_root="$repo_root/target/package-esplora-build"
23+
mkdir -p "$build_root"
24+
build_dir="$(mktemp -d "$build_root/build.XXXXXXXX")"
25+
trap 'rm -rf -- "$build_dir"' EXIT
26+
27+
git clone --branch "$esplora_tag" --depth 1 "$esplora_repo" "$build_dir/blockstream-electrs"
28+
29+
actual_rev="$(git -C "$build_dir/blockstream-electrs" rev-parse HEAD)"
30+
if [[ "$actual_rev" != "$esplora_rev" ]]; then
31+
echo "Esplora revision mismatch: expected $esplora_rev, got $actual_rev" >&2
32+
exit 1
33+
fi
34+
35+
RUSTFLAGS="" cargo build --release --manifest-path "$build_dir/blockstream-electrs/Cargo.toml"
36+
mkdir -p "$(dirname "$output_path")"
37+
install -m 755 "$build_dir/blockstream-electrs/target/release/electrs" "$output_path"
38+
echo "Built package-enabled Esplora at $output_path"

0 commit comments

Comments
 (0)