Specify amount units in HolderHTLCOutput
[rust-lightning] / lightning / src / chain / package.rs
index 1307ad0eb3f1a23bc7eed7f613eb61900cbbcb64..35d90fb31812434afacffb33e4cb8ca798da319e 100644 (file)
@@ -27,7 +27,6 @@ use crate::ln::msgs::DecodeError;
 use crate::chain::chaininterface::{FeeEstimator, ConfirmationTarget, MIN_RELAY_FEE_SAT_PER_1000_WEIGHT};
 use crate::chain::keysinterface::Sign;
 use crate::chain::onchaintx::OnchainTxHandler;
-use crate::util::byte_utils;
 use crate::util::logger::Logger;
 use crate::util::ser::{Readable, Writer, Writeable};
 
@@ -253,31 +252,31 @@ impl_writeable_tlv_based!(CounterpartyReceivedHTLCOutput, {
 #[derive(Clone, PartialEq, Eq)]
 pub(crate) struct HolderHTLCOutput {
        preimage: Option<PaymentPreimage>,
-       amount: u64,
+       amount_msat: u64,
        /// Defaults to 0 for HTLC-Success transactions, which have no expiry
        cltv_expiry: u32,
 }
 
 impl HolderHTLCOutput {
-       pub(crate) fn build_offered(amount: u64, cltv_expiry: u32) -> Self {
+       pub(crate) fn build_offered(amount_msat: u64, cltv_expiry: u32) -> Self {
                HolderHTLCOutput {
                        preimage: None,
-                       amount,
+                       amount_msat,
                        cltv_expiry,
                }
        }
 
-       pub(crate) fn build_accepted(preimage: PaymentPreimage, amount: u64) -> Self {
+       pub(crate) fn build_accepted(preimage: PaymentPreimage, amount_msat: u64) -> Self {
                HolderHTLCOutput {
                        preimage: Some(preimage),
-                       amount,
+                       amount_msat,
                        cltv_expiry: 0,
                }
        }
 }
 
 impl_writeable_tlv_based!(HolderHTLCOutput, {
-       (0, amount, required),
+       (0, amount_msat, required),
        (2, cltv_expiry, required),
        (4, preimage, option)
 });
@@ -381,57 +380,53 @@ impl PackageSolvingData {
        fn finalize_input<Signer: Sign>(&self, bumped_tx: &mut Transaction, i: usize, onchain_handler: &mut OnchainTxHandler<Signer>) -> bool {
                match self {
                        PackageSolvingData::RevokedOutput(ref outp) => {
-                               if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
-                                       let witness_script = chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, outp.on_counterparty_tx_csv, &chan_keys.broadcaster_delayed_payment_key);
-                                       //TODO: should we panic on signer failure ?
-                                       if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_output(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &onchain_handler.secp_ctx) {
-                                               let mut ser_sig = sig.serialize_der().to_vec();
-                                               ser_sig.push(EcdsaSighashType::All as u8);
-                                               bumped_tx.input[i].witness.push(ser_sig);
-                                               bumped_tx.input[i].witness.push(vec!(1));
-                                               bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
-                                       } else { return false; }
-                               }
+                               let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
+                               let witness_script = chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, outp.on_counterparty_tx_csv, &chan_keys.broadcaster_delayed_payment_key);
+                               //TODO: should we panic on signer failure ?
+                               if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_output(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &onchain_handler.secp_ctx) {
+                                       let mut ser_sig = sig.serialize_der().to_vec();
+                                       ser_sig.push(EcdsaSighashType::All as u8);
+                                       bumped_tx.input[i].witness.push(ser_sig);
+                                       bumped_tx.input[i].witness.push(vec!(1));
+                                       bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
+                               } else { return false; }
                        },
                        PackageSolvingData::RevokedHTLCOutput(ref outp) => {
-                               if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
-                                       let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
-                                       //TODO: should we panic on signer failure ?
-                                       if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_htlc(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &outp.htlc, &onchain_handler.secp_ctx) {
-                                               let mut ser_sig = sig.serialize_der().to_vec();
-                                               ser_sig.push(EcdsaSighashType::All as u8);
-                                               bumped_tx.input[i].witness.push(ser_sig);
-                                               bumped_tx.input[i].witness.push(chan_keys.revocation_key.clone().serialize().to_vec());
-                                               bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
-                                       } else { return false; }
-                               }
+                               let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
+                               let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
+                               //TODO: should we panic on signer failure ?
+                               if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_htlc(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &outp.htlc, &onchain_handler.secp_ctx) {
+                                       let mut ser_sig = sig.serialize_der().to_vec();
+                                       ser_sig.push(EcdsaSighashType::All as u8);
+                                       bumped_tx.input[i].witness.push(ser_sig);
+                                       bumped_tx.input[i].witness.push(chan_keys.revocation_key.clone().serialize().to_vec());
+                                       bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
+                               } else { return false; }
                        },
                        PackageSolvingData::CounterpartyOfferedHTLCOutput(ref outp) => {
-                               if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
-                                       let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
-
-                                       if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
-                                               let mut ser_sig = sig.serialize_der().to_vec();
-                                               ser_sig.push(EcdsaSighashType::All as u8);
-                                               bumped_tx.input[i].witness.push(ser_sig);
-                                               bumped_tx.input[i].witness.push(outp.preimage.0.to_vec());
-                                               bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
-                                       }
+                               let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
+                               let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
+
+                               if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
+                                       let mut ser_sig = sig.serialize_der().to_vec();
+                                       ser_sig.push(EcdsaSighashType::All as u8);
+                                       bumped_tx.input[i].witness.push(ser_sig);
+                                       bumped_tx.input[i].witness.push(outp.preimage.0.to_vec());
+                                       bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
                                }
                        },
                        PackageSolvingData::CounterpartyReceivedHTLCOutput(ref outp) => {
-                               if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
-                                       let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
-
-                                       bumped_tx.lock_time = PackedLockTime(outp.htlc.cltv_expiry); // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
-                                       if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
-                                               let mut ser_sig = sig.serialize_der().to_vec();
-                                               ser_sig.push(EcdsaSighashType::All as u8);
-                                               bumped_tx.input[i].witness.push(ser_sig);
-                                               // Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.
-                                               bumped_tx.input[i].witness.push(vec![]);
-                                               bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
-                                       }
+                               let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
+                               let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
+
+                               bumped_tx.lock_time = PackedLockTime(outp.htlc.cltv_expiry); // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
+                               if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
+                                       let mut ser_sig = sig.serialize_der().to_vec();
+                                       ser_sig.push(EcdsaSighashType::All as u8);
+                                       bumped_tx.input[i].witness.push(ser_sig);
+                                       // Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.
+                                       bumped_tx.input[i].witness.push(vec![]);
+                                       bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
                                }
                        },
                        _ => { panic!("API Error!"); }
@@ -774,7 +769,7 @@ impl PackageTemplate {
 
 impl Writeable for PackageTemplate {
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
-               writer.write_all(&byte_utils::be64_to_array(self.inputs.len() as u64))?;
+               writer.write_all(&(self.inputs.len() as u64).to_be_bytes())?;
                for (ref outpoint, ref rev_outp) in self.inputs.iter() {
                        outpoint.write(writer)?;
                        rev_outp.write(writer)?;