]> Untitled Git - bdk/commitdiff
Replace UTXO::is_internal with script_type
authorLLFourn <lloyd.fourn@gmail.com>
Thu, 3 Dec 2020 23:37:58 +0000 (10:37 +1100)
committerLLFourn <lloyd.fourn@gmail.com>
Thu, 3 Dec 2020 23:46:25 +0000 (10:46 +1100)
This means less conversion and logic mapping from bool to ScriptType and
back again.

src/blockchain/compact_filters/mod.rs
src/blockchain/utils.rs
src/database/keyvalue.rs
src/database/memory.rs
src/database/mod.rs
src/types.rs
src/wallet/coin_selection.rs
src/wallet/mod.rs
src/wallet/tx_builder.rs
testutils-macros/src/lib.rs

index 233ea89acb7dd9a20c051523b843b0f26ade631a..a0d45f02c999740ade5617b60ccedd604d709d43 100644 (file)
@@ -193,7 +193,7 @@ impl CompactFiltersBlockchain {
                 updates.set_utxo(&UTXO {
                     outpoint: OutPoint::new(tx.txid(), i as u32),
                     txout: output.clone(),
-                    is_internal: script_type.is_internal(),
+                    script_type,
                 })?;
                 incoming += output.value;
 
index 3d7a3d98cbb9aad501a20fcd980938fcd0c5ad85..06c39b019d8015d2bf297095a8284753a6821f6d 100644 (file)
@@ -358,7 +358,7 @@ fn save_transaction_details_and_utxos<D: BatchDatabase>(
             updates.set_utxo(&UTXO {
                 outpoint: OutPoint::new(tx.txid(), i as u32),
                 txout: output.clone(),
-                is_internal: script_type.is_internal(),
+                script_type,
             })?;
 
             incoming += output.value;
index e61ff06e24f996dbe4c6a9f46bea224cb0314494..1b860a704ed1389945faad309a086f1d702cef19 100644 (file)
@@ -55,7 +55,7 @@ macro_rules! impl_batch_operations {
             let key = MapKey::UTXO(Some(&utxo.outpoint)).as_map_key();
             let value = json!({
                 "t": utxo.txout,
-                "i": utxo.is_internal,
+                "i": utxo.script_type,
             });
             self.insert(key, serde_json::to_vec(&value)?)$($after_insert)*;
 
@@ -130,9 +130,9 @@ macro_rules! impl_batch_operations {
                 Some(b) => {
                     let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                     let txout = serde_json::from_value(val["t"].take())?;
-                    let is_internal = serde_json::from_value(val["i"].take())?;
+                    let script_type = serde_json::from_value(val["i"].take())?;
 
-                    Ok(Some(UTXO { outpoint: outpoint.clone(), txout, is_internal }))
+                    Ok(Some(UTXO { outpoint: outpoint.clone(), txout, script_type }))
                 }
             }
         }
@@ -243,12 +243,12 @@ impl Database for Tree {
 
                 let mut val: serde_json::Value = serde_json::from_slice(&v)?;
                 let txout = serde_json::from_value(val["t"].take())?;
-                let is_internal = serde_json::from_value(val["i"].take())?;
+                let script_type = serde_json::from_value(val["i"].take())?;
 
                 Ok(UTXO {
                     outpoint,
                     txout,
-                    is_internal,
+                    script_type,
                 })
             })
             .collect()
@@ -311,12 +311,12 @@ impl Database for Tree {
             .map(|b| -> Result<_, Error> {
                 let mut val: serde_json::Value = serde_json::from_slice(&b)?;
                 let txout = serde_json::from_value(val["t"].take())?;
-                let is_internal = serde_json::from_value(val["i"].take())?;
+                let script_type = serde_json::from_value(val["i"].take())?;
 
                 Ok(UTXO {
                     outpoint: *outpoint,
                     txout,
-                    is_internal,
+                    script_type,
                 })
             })
             .transpose()
index 707cd951570564e8cb286b4fcb7d3e4ee82600b7..52bef1c2ebf28d87e12c27b524dd960fae6ed835 100644 (file)
@@ -160,7 +160,7 @@ impl BatchOperations for MemoryDatabase {
     fn set_utxo(&mut self, utxo: &UTXO) -> Result<(), Error> {
         let key = MapKey::UTXO(Some(&utxo.outpoint)).as_map_key();
         self.map
-            .insert(key, Box::new((utxo.txout.clone(), utxo.is_internal)));
+            .insert(key, Box::new((utxo.txout.clone(), utxo.script_type)));
 
         Ok(())
     }
@@ -231,11 +231,11 @@ impl BatchOperations for MemoryDatabase {
         match res {
             None => Ok(None),
             Some(b) => {
-                let (txout, is_internal) = b.downcast_ref().cloned().unwrap();
+                let (txout, script_type) = b.downcast_ref().cloned().unwrap();
                 Ok(Some(UTXO {
                     outpoint: *outpoint,
                     txout,
-                    is_internal,
+                    script_type,
                 }))
             }
         }
@@ -322,11 +322,11 @@ impl Database for MemoryDatabase {
             .range::<Vec<u8>, _>((Included(&key), Excluded(&after(&key))))
             .map(|(k, v)| {
                 let outpoint = deserialize(&k[1..]).unwrap();
-                let (txout, is_internal) = v.downcast_ref().cloned().unwrap();
+                let (txout, script_type) = v.downcast_ref().cloned().unwrap();
                 Ok(UTXO {
                     outpoint,
                     txout,
-                    is_internal,
+                    script_type,
                 })
             })
             .collect()
@@ -385,11 +385,11 @@ impl Database for MemoryDatabase {
     fn get_utxo(&self, outpoint: &OutPoint) -> Result<Option<UTXO>, Error> {
         let key = MapKey::UTXO(Some(outpoint)).as_map_key();
         Ok(self.map.get(&key).map(|b| {
-            let (txout, is_internal) = b.downcast_ref().cloned().unwrap();
+            let (txout, script_type) = b.downcast_ref().cloned().unwrap();
             UTXO {
                 outpoint: *outpoint,
                 txout,
-                is_internal,
+                script_type,
             }
         }))
     }
@@ -507,7 +507,7 @@ impl MemoryDatabase {
                     txid,
                     vout: vout as u32,
                 },
-                is_internal: false,
+                script_type: ScriptType::External,
             })
             .unwrap();
         }
index 3e77a07f0a640664bf5336a49e139025a5c54223..3cd8d9a74de7035c3b74b0a5bc8d9e8372c57a65 100644 (file)
@@ -301,7 +301,7 @@ pub mod test {
         let utxo = UTXO {
             txout,
             outpoint,
-            is_internal: false,
+            script_type: ScriptType::External,
         };
 
         tree.set_utxo(&utxo).unwrap();
index e4e33d10a43e2ed1212ef5ecf5d89277bb33dbe9..6c7090cd14d076b46b1ff7a1a4fede287cd37fff 100644 (file)
@@ -43,10 +43,6 @@ impl ScriptType {
             ScriptType::Internal => b'i',
         }
     }
-
-    pub fn is_internal(&self) -> bool {
-        self == &ScriptType::Internal
-    }
 }
 
 impl AsRef<[u8]> for ScriptType {
@@ -96,7 +92,7 @@ impl std::default::Default for FeeRate {
 pub struct UTXO {
     pub outpoint: OutPoint,
     pub txout: TxOut,
-    pub is_internal: bool,
+    pub script_type: ScriptType,
 }
 
 /// A wallet transaction
index 19e252dbe2ada7b9ffea712e6b2061abf45174f8..5063f745db08695455edebc20a4dc54dfd11d75e 100644 (file)
@@ -538,7 +538,7 @@ mod test {
                         value: 100_000,
                         script_pubkey: Script::new(),
                     },
-                    is_internal: false,
+                    script_type: ScriptType::External,
                 },
                 P2WPKH_WITNESS_SIZE,
             ),
@@ -552,7 +552,7 @@ mod test {
                         value: 200_000,
                         script_pubkey: Script::new(),
                     },
-                    is_internal: true,
+                    script_type: ScriptType::Internal,
                 },
                 P2WPKH_WITNESS_SIZE,
             ),
@@ -572,7 +572,7 @@ mod test {
                         value: rng.gen_range(0, 200000000),
                         script_pubkey: Script::new(),
                     },
-                    is_internal: false,
+                    script_type: ScriptType::External,
                 },
                 P2WPKH_WITNESS_SIZE,
             ));
@@ -591,7 +591,7 @@ mod test {
                     value: utxos_value,
                     script_pubkey: Script::new(),
                 },
-                is_internal: false,
+                script_type: ScriptType::External,
             },
             P2WPKH_WITNESS_SIZE,
         );
index 82696c58b366ba19ea9716492e4dccfa5b737a08..59d2dcf291eaf4df2e9e328551c9e4e7a0e2806e 100644 (file)
@@ -611,18 +611,6 @@ where
         }
 
         let deriv_ctx = descriptor_to_pk_ctx(&self.secp);
-
-        let external_weight = self
-            .get_descriptor_for_script_type(ScriptType::External)
-            .0
-            .max_satisfaction_weight(deriv_ctx)
-            .unwrap();
-        let internal_weight = self
-            .get_descriptor_for_script_type(ScriptType::Internal)
-            .0
-            .max_satisfaction_weight(deriv_ctx)
-            .unwrap();
-
         let original_sequence = tx.input[0].sequence;
 
         // remove the inputs from the tx and process them
@@ -636,26 +624,31 @@ where
                     .get_previous_output(&txin.previous_output)?
                     .ok_or(Error::UnknownUTXO)?;
 
-                let (weight, is_internal) = match self
+                let (weight, script_type) = match self
                     .database
                     .borrow()
                     .get_path_from_script_pubkey(&txout.script_pubkey)?
                 {
-                    Some((ScriptType::Internal, _)) => (internal_weight, true),
-                    Some((ScriptType::External, _)) => (external_weight, false),
+                    Some((script_type, _)) => (
+                        self.get_descriptor_for_script_type(script_type)
+                            .0
+                            .max_satisfaction_weight(deriv_ctx)
+                            .unwrap(),
+                        script_type,
+                    ),
                     None => {
                         // estimate the weight based on the scriptsig/witness size present in the
                         // original transaction
                         let weight =
                             serialize(&txin.script_sig).len() * 4 + serialize(&txin.witness).len();
-                        (weight, false)
+                        (weight, ScriptType::External)
                     }
                 };
 
                 let utxo = UTXO {
                     outpoint: txin.previous_output,
                     txout,
-                    is_internal,
+                    script_type,
                 };
 
                 Ok((utxo, weight))
@@ -1052,30 +1045,20 @@ where
 
     fn get_available_utxos(&self) -> Result<Vec<(UTXO, usize)>, Error> {
         let deriv_ctx = descriptor_to_pk_ctx(&self.secp);
-
-        let external_weight = self
-            .get_descriptor_for_script_type(ScriptType::External)
-            .0
-            .max_satisfaction_weight(deriv_ctx)
-            .unwrap();
-        let internal_weight = self
-            .get_descriptor_for_script_type(ScriptType::Internal)
-            .0
-            .max_satisfaction_weight(deriv_ctx)
-            .unwrap();
-
-        let add_weight = |utxo: UTXO| {
-            let weight = match utxo.is_internal {
-                true => internal_weight,
-                false => external_weight,
-            };
-
-            (utxo, weight)
-        };
-
-        let utxos = self.list_unspent()?.into_iter().map(add_weight).collect();
-
-        Ok(utxos)
+        Ok(self
+            .list_unspent()?
+            .into_iter()
+            .map(|utxo| {
+                let script_type = utxo.script_type;
+                (
+                    utxo,
+                    self.get_descriptor_for_script_type(script_type)
+                        .0
+                        .max_satisfaction_weight(deriv_ctx)
+                        .unwrap(),
+                )
+            })
+            .collect())
     }
 
     /// Given the options returns the list of utxos that must be used to form the
index f278acdf558a92bf0f6037a8ceab3f71c569b722..f0c1cb48510510f3ef5f0b8ea68ed6f150a5dbdd 100644 (file)
@@ -566,8 +566,8 @@ impl ChangeSpendPolicy {
     pub(crate) fn is_satisfied_by(&self, utxo: &UTXO) -> bool {
         match self {
             ChangeSpendPolicy::ChangeAllowed => true,
-            ChangeSpendPolicy::OnlyChange => utxo.is_internal,
-            ChangeSpendPolicy::ChangeForbidden => !utxo.is_internal,
+            ChangeSpendPolicy::OnlyChange => utxo.script_type == ScriptType::Internal,
+            ChangeSpendPolicy::ChangeForbidden => utxo.script_type == ScriptType::External,
         }
     }
 }
@@ -662,7 +662,7 @@ mod test {
                     vout: 0,
                 },
                 txout: Default::default(),
-                is_internal: false,
+                script_type: ScriptType::External,
             },
             UTXO {
                 outpoint: OutPoint {
@@ -670,7 +670,7 @@ mod test {
                     vout: 1,
                 },
                 txout: Default::default(),
-                is_internal: true,
+                script_type: ScriptType::Internal,
             },
         ]
     }
@@ -695,7 +695,7 @@ mod test {
             .collect::<Vec<_>>();
 
         assert_eq!(filtered.len(), 1);
-        assert_eq!(filtered[0].is_internal, false);
+        assert_eq!(filtered[0].script_type, ScriptType::External);
     }
 
     #[test]
@@ -707,7 +707,7 @@ mod test {
             .collect::<Vec<_>>();
 
         assert_eq!(filtered.len(), 1);
-        assert_eq!(filtered[0].is_internal, true);
+        assert_eq!(filtered[0].script_type, ScriptType::Internal);
     }
 
     #[test]
index baabefacf9b3bbdafff0b6918dd94c2adfd59d56..87b586ccb0e861852d66b88809c096ac9f972fa6 100644 (file)
@@ -120,7 +120,7 @@ pub fn bdk_blockchain_tests(attr: TokenStream, item: TokenStream) -> TokenStream
                     wallet.sync(noop_progress(), None).unwrap();
 
                     assert_eq!(wallet.get_balance().unwrap(), 50_000);
-                    assert_eq!(wallet.list_unspent().unwrap()[0].is_internal, false);
+                    assert_eq!(wallet.list_unspent().unwrap()[0].script_type, ScriptType::External);
 
                     let list_tx_item = &wallet.list_transactions(false).unwrap()[0];
                     assert_eq!(list_tx_item.txid, txid);