Skip to content

Commit f1c9cfd

Browse files
committed
WIP Switch to CoinSelectionSource
1 parent 5c09a31 commit f1c9cfd

File tree

1 file changed

+44
-4
lines changed

1 file changed

+44
-4
lines changed

src/wallet/mod.rs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ use bitcoin::blockdata::constants::WITNESS_SCALE_FACTOR;
1717
use bitcoin::blockdata::locktime::absolute::LockTime;
1818
use bitcoin::hashes::Hash;
1919
use bitcoin::key::XOnlyPublicKey;
20-
use bitcoin::psbt::Psbt;
20+
use bitcoin::psbt::{self, Psbt};
2121
use bitcoin::secp256k1::ecdh::SharedSecret;
2222
use bitcoin::secp256k1::ecdsa::{RecoverableSignature, Signature};
2323
use bitcoin::secp256k1::{All, PublicKey, Scalar, Secp256k1, SecretKey};
2424
use 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
};
2828
use lightning::chain::chaininterface::BroadcasterInterface;
2929
use 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};
3232
use lightning::ln::channelmanager::PaymentId;
3333
use lightning::ln::inbound_payment::ExpandedKey;
3434
use 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

Comments
 (0)