@@ -26,6 +26,7 @@ use bdk_wallet::bitcoin::Transaction as BdkTransaction;
2626use bdk_wallet:: bitcoin:: TxIn as BdkTxIn ;
2727use bdk_wallet:: bitcoin:: TxOut as BdkTxOut ;
2828use bdk_wallet:: bitcoin:: Txid as BitcoinTxid ;
29+ use bdk_wallet:: bitcoin:: Weight ;
2930use bdk_wallet:: bitcoin:: Wtxid as BitcoinWtxid ;
3031use bdk_wallet:: miniscript:: psbt:: PsbtExt ;
3132use bdk_wallet:: serde_json;
@@ -156,6 +157,30 @@ impl FeeRate {
156157 pub fn to_sat_per_kwu ( & self ) -> u64 {
157158 self . 0 . to_sat_per_kwu ( )
158159 }
160+
161+ /// Calculates fee in satoshis by multiplying this fee rate by weight, in virtual bytes, returning `None` if overflow occurred.
162+ ///
163+ /// This is equivalent to converting vb to weight using Weight::from_vb and then calling Self::fee_wu(weight).
164+ pub fn fee_vb ( & self , vb : u64 ) -> Option < Arc < Amount > > {
165+ let rust_amount: BdkAmount = self . 0 . fee_vb ( vb) ?;
166+ let amount: Amount = rust_amount. into ( ) ;
167+ Some ( Arc :: new ( amount) )
168+
169+ // The whole code above should be replaceable by the following line:
170+ // self.0.fee_vb(vb).map(Arc::new(Amount::from))
171+ // But in practice you get uniffi compilation errors on it. Not sure what is going on with it,
172+ // but the code we use works just as well.
173+ }
174+
175+ /// Calculates fee by multiplying this fee rate by weight, in weight units, returning `None` if overflow occurred.
176+ //
177+ // This is equivalent to Self::checked_mul_by_weight().
178+ pub fn fee_wu ( & self , wu : u64 ) -> Option < Arc < Amount > > {
179+ let weight: Weight = Weight :: from_wu ( wu) ;
180+ let rust_amount: BdkAmount = self . 0 . fee_wu ( weight) ?;
181+ let amount: Amount = rust_amount. into ( ) ;
182+ Some ( Arc :: new ( amount) )
183+ }
159184}
160185
161186impl Display for FeeRate {
0 commit comments