Use a reasonable target fee when opening channels
authorMatt Corallo <git@bluematt.me>
Sat, 26 Jun 2021 17:21:33 +0000 (17:21 +0000)
committerMatt Corallo <git@bluematt.me>
Wed, 30 Jun 2021 03:13:50 +0000 (03:13 +0000)
Bitcoin Core defaults to conservative fee estimation, which often
results in significant overtargeting on weekends. We also disable
RBF, here, though, with a comment describing how clients should
handle funding RBF.

src/bitcoind_client.rs

index 90552d915b5702ddc600910aed7506a75082080f..fd21b5974040efc0afc42380fcd94df705c0e92d 100644 (file)
@@ -187,7 +187,19 @@ impl BitcoindClient {
                let mut rpc = self.bitcoind_rpc_client.lock().await;
 
                let raw_tx_json = serde_json::json!(raw_tx.0);
                let mut rpc = self.bitcoind_rpc_client.lock().await;
 
                let raw_tx_json = serde_json::json!(raw_tx.0);
-               rpc.call_method("fundrawtransaction", &[raw_tx_json]).await.unwrap()
+               let options = serde_json::json!({
+                       // LDK gives us feerates in satoshis per KW but Bitcoin Core here expects fees
+                       // denominated in satoshis per vB. First we need to multiply by 4 to convert weight
+                       // units to virtual bytes, then divide by 1000 to convert KvB to vB.
+                       "fee_rate": self.get_est_sat_per_1000_weight(ConfirmationTarget::Normal) as f64 / 250.0,
+                       // While users could "cancel" a channel open by RBF-bumping and paying back to
+                       // themselves, we don't allow it here as its easy to have users accidentally RBF bump
+                       // and pay to the channel funding address, which results in loss of funds. Real
+                       // LDK-based applications should enable RBF bumping and RBF bump either to a local
+                       // change address or to a new channel output negotiated with the same node.
+                       "replaceable": false,
+               });
+               rpc.call_method("fundrawtransaction", &[raw_tx_json, options]).await.unwrap()
        }
 
        pub async fn send_raw_transaction(&self, raw_tx: RawTx) {
        }
 
        pub async fn send_raw_transaction(&self, raw_tx: RawTx) {