Skip to content

Commit

Permalink
Expose previous UTXO for anchor and HTLC inputs
Browse files Browse the repository at this point in the history
This may be required by some wallets that rely on PSBTs internally to
create/sign transactions.
  • Loading branch information
wpaulino committed Jul 10, 2023
1 parent 422508c commit f17c05a
Showing 1 changed file with 23 additions and 0 deletions.
23 changes: 23 additions & 0 deletions lightning/src/events/bump_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use core::ops::Deref;
use crate::chain::chaininterface::BroadcasterInterface;
use crate::chain::ClaimId;
use crate::io_extras::sink;
use crate::ln::channel::ANCHOR_OUTPUT_VALUE_SATOSHI;
use crate::ln::chan_utils;
use crate::ln::chan_utils::{
ANCHOR_INPUT_WITNESS_WEIGHT, HTLC_SUCCESS_INPUT_ANCHOR_WITNESS_WEIGHT,
Expand Down Expand Up @@ -76,6 +77,15 @@ pub struct AnchorDescriptor {
}

impl AnchorDescriptor {
/// Returns the UTXO to be spent by the anchor input, which can be obtained via
/// [`Self::unsigned_tx_input`].
pub fn previous_utxo(&self) -> TxOut {
TxOut {
script_pubkey: self.witness_script().to_v0_p2wsh(),
value: ANCHOR_OUTPUT_VALUE_SATOSHI,
}
}

/// Returns the unsigned transaction input spending the anchor output in the commitment
/// transaction.
pub fn unsigned_tx_input(&self) -> TxIn {
Expand Down Expand Up @@ -136,6 +146,15 @@ pub struct HTLCDescriptor {
}

impl HTLCDescriptor {
/// Returns the UTXO to be spent by the HTLC input, which can be obtained via
/// [`Self::unsigned_tx_input`].
pub fn previous_utxo<C: secp256k1::Signing + secp256k1::Verification>(&self, secp: &Secp256k1<C>) -> TxOut {
TxOut {
script_pubkey: self.witness_script(secp).to_v0_p2wsh(),
value: self.htlc.amount_msat / 1000,
}
}

/// Returns the unsigned transaction input spending the HTLC output in the commitment
/// transaction.
pub fn unsigned_tx_input(&self) -> TxIn {
Expand Down Expand Up @@ -322,6 +341,8 @@ pub enum BumpTransactionEvent {
pub struct Input {
/// The unique identifier of the input.
pub outpoint: OutPoint,
/// The UTXO being spent by the input.
pub previous_utxo: TxOut,
/// The upper-bound weight consumed by the input's full [`TxIn::script_sig`] and
/// [`TxIn::witness`], each with their lengths included, required to satisfy the output's
/// script.
Expand Down Expand Up @@ -661,6 +682,7 @@ where
) -> Result<Transaction, ()> {
let must_spend = vec![Input {
outpoint: anchor_descriptor.outpoint,
previous_utxo: anchor_descriptor.previous_utxo(),
satisfaction_weight: commitment_tx.weight() as u64 + ANCHOR_INPUT_WITNESS_WEIGHT + EMPTY_SCRIPT_SIG_WEIGHT,
}];
let coin_selection = self.utxo_source.select_confirmed_utxos(
Expand Down Expand Up @@ -727,6 +749,7 @@ where
let htlc_input = htlc_descriptor.unsigned_tx_input();
must_spend.push(Input {
outpoint: htlc_input.previous_output.clone(),
previous_utxo: htlc_descriptor.previous_utxo(&self.secp),
satisfaction_weight: EMPTY_SCRIPT_SIG_WEIGHT + if htlc_descriptor.preimage.is_some() {
HTLC_SUCCESS_INPUT_ANCHOR_WITNESS_WEIGHT
} else {
Expand Down

0 comments on commit f17c05a

Please sign in to comment.