X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fbitcoind_client.rs;h=ca4a18134423a17f21636fab53cc8d534e749af0;hb=198a8397557b7a0df16504c46f685f0e1a0d69d6;hp=58510ae736bd894cbfece045db24ef4ddd9ded31;hpb=6199433ab8f13e4f78b12e13a683eb33c999114b;p=ldk-sample diff --git a/src/bitcoind_client.rs b/src/bitcoind_client.rs index 58510ae..ca4a181 100644 --- a/src/bitcoind_client.rs +++ b/src/bitcoind_client.rs @@ -67,7 +67,14 @@ impl BitcoindClient { let http_endpoint = HttpEndpoint::for_host(host.clone()).with_port(port); let rpc_credentials = base64::encode(format!("{}:{}", rpc_user.clone(), rpc_password.clone())); - let bitcoind_rpc_client = RpcClient::new(&rpc_credentials, http_endpoint)?; + let mut bitcoind_rpc_client = RpcClient::new(&rpc_credentials, http_endpoint)?; + let _dummy = bitcoind_rpc_client + .call_method::("getblockchaininfo", &vec![]) + .await + .map_err(|_| { + std::io::Error::new(std::io::ErrorKind::PermissionDenied, + "Failed to make initial call to bitcoind - please check your RPC user/password and access settings") + })?; let mut fees: HashMap = HashMap::new(); fees.insert(Target::Background, AtomicU32::new(253)); fees.insert(Target::Normal, AtomicU32::new(2000)); @@ -231,7 +238,20 @@ impl BroadcasterInterface for BitcoindClient { let tx_serialized = serde_json::json!(encode::serialize_hex(tx)); tokio::spawn(async move { let mut rpc = bitcoind_rpc_client.lock().await; - rpc.call_method::("sendrawtransaction", &vec![tx_serialized]).await.unwrap(); + // This may error due to RL calling `broadcast_transaction` with the same transaction + // multiple times, but the error is safe to ignore. + match rpc.call_method::("sendrawtransaction", &vec![tx_serialized]).await { + Ok(_) => {} + Err(e) => { + let err_str = e.get_ref().unwrap().to_string(); + if !err_str.contains("Transaction already in block chain") + && !err_str.contains("Inputs missing or spent") + && !err_str.contains("non-BIP68-final") + { + panic!("{}", e); + } + } + } }); } }