]> Untitled Git - bdk-cli/commitdiff
[wallet] Add a `TxBuilder` struct to simplify `create_tx()`'s interface
authorAlekos Filini <alekos.filini@gmail.com>
Thu, 6 Aug 2020 11:09:39 +0000 (13:09 +0200)
committerAlekos Filini <alekos.filini@gmail.com>
Thu, 6 Aug 2020 12:28:22 +0000 (14:28 +0200)
src/cli.rs

index 788aa69d911eb36d33b3bc90cfe844ff3816b8ac..c946f22e50e0ddc7ce905ab8a14ed82b48e9480c 100644 (file)
@@ -13,7 +13,7 @@ use bitcoin::{Address, OutPoint};
 
 use crate::error::Error;
 use crate::types::ScriptType;
-use crate::Wallet;
+use crate::{TxBuilder, Wallet};
 
 fn parse_addressee(s: &str) -> Result<(Address, u64), String> {
     let parts: Vec<_> = s.split(":").collect();
@@ -326,29 +326,37 @@ where
             .map(|s| parse_addressee(s))
             .collect::<Result<Vec<_>, _>>()
             .map_err(|s| Error::Generic(s))?;
-        let send_all = sub_matches.is_present("send_all");
-        let fee_rate = sub_matches
-            .value_of("fee_rate")
-            .map(|s| f32::from_str(s).unwrap())
-            .unwrap_or(1.0);
-        let utxos = sub_matches
-            .values_of("utxos")
-            .map(|s| s.map(|i| parse_outpoint(i).unwrap()).collect());
-        let unspendable = sub_matches
-            .values_of("unspendable")
-            .map(|s| s.map(|i| parse_outpoint(i).unwrap()).collect());
-        let policy: Option<_> = sub_matches
-            .value_of("policy")
-            .map(|s| serde_json::from_str::<BTreeMap<String, Vec<usize>>>(&s).unwrap());
-
-        let result = wallet.create_tx(
-            addressees,
-            send_all,
-            fee_rate * 1e-5,
-            policy,
-            utxos,
-            unspendable,
-        )?;
+        let mut tx_builder = TxBuilder::from_addressees(addressees);
+
+        if sub_matches.is_present("send_all") {
+            tx_builder.send_all();
+        }
+        if let Some(fee_rate) = sub_matches.value_of("fee_rate") {
+            let fee_rate = f32::from_str(fee_rate).map_err(|s| Error::Generic(s.to_string()))?;
+            tx_builder.fee_rate(fee_rate);
+        }
+        if let Some(utxos) = sub_matches.values_of("utxos") {
+            let utxos = utxos
+                .map(|i| parse_outpoint(i))
+                .collect::<Result<Vec<_>, _>>()
+                .map_err(|s| Error::Generic(s.to_string()))?;
+            tx_builder.utxos(utxos);
+        }
+
+        if let Some(unspendable) = sub_matches.values_of("unspendable") {
+            let unspendable = unspendable
+                .map(|i| parse_outpoint(i))
+                .collect::<Result<Vec<_>, _>>()
+                .map_err(|s| Error::Generic(s.to_string()))?;
+            tx_builder.unspendable(unspendable);
+        }
+        if let Some(policy) = sub_matches.value_of("policy") {
+            let policy = serde_json::from_str::<BTreeMap<String, Vec<usize>>>(&policy)
+                .map_err(|s| Error::Generic(s.to_string()))?;
+            tx_builder.policy_path(policy);
+        }
+
+        let result = wallet.create_tx(&tx_builder)?;
         Ok(Some(format!(
             "{:#?}\nPSBT: {}",
             result.1,