@@ -17,18 +17,18 @@ use bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
1717use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
1818use bitcoin:: hashes:: Hash ;
1919use bitcoin:: key:: XOnlyPublicKey ;
20- use bitcoin:: psbt:: Psbt ;
20+ use bitcoin:: psbt:: { self , Psbt } ;
2121use bitcoin:: secp256k1:: ecdh:: SharedSecret ;
2222use bitcoin:: secp256k1:: ecdsa:: { RecoverableSignature , Signature } ;
2323use bitcoin:: secp256k1:: { All , PublicKey , Scalar , Secp256k1 , SecretKey } ;
2424use bitcoin:: {
25- Address , Amount , FeeRate , Network , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash ,
25+ Address , Amount , FeeRate , Network , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash , Weight ,
2626 WitnessProgram , WitnessVersion ,
2727} ;
2828use lightning:: chain:: chaininterface:: BroadcasterInterface ;
2929use lightning:: chain:: channelmonitor:: ANTI_REORG_DELAY ;
30- use lightning:: chain:: { BestBlock , Listen } ;
31- use lightning:: events:: bump_transaction:: { Utxo , WalletSource } ;
30+ use lightning:: chain:: { BestBlock , ClaimId , Listen } ;
31+ use lightning:: events:: bump_transaction:: { CoinSelection , Input , Utxo , WalletSource } ;
3232use lightning:: ln:: channelmanager:: PaymentId ;
3333use lightning:: ln:: inbound_payment:: ExpandedKey ;
3434use lightning:: ln:: msgs:: UnsignedGossipMessage ;
@@ -555,6 +555,46 @@ impl Wallet {
555555 Ok ( txid)
556556 }
557557
558+ fn select_confirmed_utxos_inner < ' a > (
559+ & self , claim_id : ClaimId , must_spend : Vec < Input > , must_pay_to : & ' a [ TxOut ] ,
560+ target_feerate_sat_per_1000_weight : u32 ,
561+ ) -> Result < CoinSelection , ( ) > {
562+ let mut tx_builder = self . inner . lock ( ) . unwrap ( ) . build_tx ( ) ;
563+ for input in & must_spend {
564+ let psbt_input =
565+ psbt:: Input { witness_utxo : Some ( input. previous_utxo ) , ..Default :: default ( ) } ;
566+ let weight = Weight :: from_wu ( input. satisfaction_weight ) ;
567+ tx_builder. add_foreign_utxo ( input. outpoint , psbt_input, weight) . map_err ( |_| ( ) ) ?;
568+ }
569+
570+ for output in must_pay_to {
571+ tx_builder. add_recipient ( output. script_pubkey , output. value ) ;
572+ }
573+
574+ let fee_rate = FeeRate :: from_sat_per_kwu ( target_feerate_sat_per_1000_weight as u64 ) ;
575+ tx_builder. fee_rate ( fee_rate) ;
576+ tx_builder. exclude_unconfirmed ( ) ;
577+
578+ let psbt = tx_builder. finish ( ) . map_err ( |_| ( ) ) ?;
579+
580+ let confirmed_utxos = ( psbt. inputs . iter ( ) )
581+ . zip ( psbt. unsigned_tx . input . iter ( ) )
582+ . filter ( |( psbt_input, tx_input) | {
583+ must_spend. iter ( ) . all ( |i| i. outpoint != tx_input. previous_output )
584+ } )
585+ . map ( |( psbt_input, tx_input) | Utxo {
586+ outpoint : tx_input. previous_output ,
587+ output : psbt_input. witness_utxo . clone ( ) . unwrap ( ) ,
588+ satisfaction_weight : 1 /* empty script_sig */ * WITNESS_SCALE_FACTOR as u64 +
589+ 1 /* witness items */ + 1 /* schnorr sig len */ + 64 , /* schnorr sig */
590+ } )
591+ . collect :: < Vec < _ > > ( ) ;
592+ let change_output = None ;
593+
594+ // TODO: match by WitnessVersion
595+ Ok ( CoinSelection { confirmed_utxos, change_output } )
596+ }
597+
558598 fn list_confirmed_utxos_inner ( & self ) -> Result < Vec < Utxo > , ( ) > {
559599 let locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
560600 let mut utxos = Vec :: new ( ) ;
0 commit comments