Actual no_std support
[rust-lightning] / lightning / src / chain / keysinterface.rs
index d6fea17d430583b977fd724559e7b1d32857b095..7356dad8e40d64c353a80efa77b89e01c2fed7b8 100644 (file)
@@ -37,9 +37,9 @@ use ln::chan_utils;
 use ln::chan_utils::{HTLCOutputInCommitment, make_funding_redeemscript, ChannelPublicKeys, HolderCommitmentTransaction, ChannelTransactionParameters, CommitmentTransaction};
 use ln::msgs::UnsignedChannelAnnouncement;
 
-use std::collections::HashSet;
+use prelude::*;
 use core::sync::atomic::{AtomicUsize, Ordering};
-use std::io::Error;
+use io::{self, Error};
 use ln::msgs::{DecodeError, MAX_VALUE_MSAT};
 
 /// Information about a spendable output to a P2WSH script. See
@@ -72,6 +72,16 @@ impl DelayedPaymentOutputDescriptor {
        pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 1 + chan_utils::REVOKEABLE_REDEEMSCRIPT_MAX_LENGTH + 1;
 }
 
+impl_writeable_tlv_based!(DelayedPaymentOutputDescriptor, {
+       (0, outpoint, required),
+       (2, per_commitment_point, required),
+       (4, to_self_delay, required),
+       (6, output, required),
+       (8, revocation_pubkey, required),
+       (10, channel_keys_id, required),
+       (12, channel_value_satoshis, required),
+});
+
 /// Information about a spendable output to our "payment key". See
 /// SpendableOutputDescriptor::StaticPaymentOutput for more details on how to spend this.
 #[derive(Clone, Debug, PartialEq)]
@@ -93,6 +103,12 @@ impl StaticPaymentOutputDescriptor {
        // redeemscript push length.
        pub const MAX_WITNESS_LENGTH: usize = 1 + 73 + 34;
 }
+impl_writeable_tlv_based!(StaticPaymentOutputDescriptor, {
+       (0, outpoint, required),
+       (2, output, required),
+       (4, channel_keys_id, required),
+       (6, channel_value_satoshis, required),
+});
 
 /// When on-chain outputs are created by rust-lightning (which our counterparty is not able to
 /// claim at any point in the future) an event is generated which you must track and be able to
@@ -151,62 +167,15 @@ pub enum SpendableOutputDescriptor {
        StaticPaymentOutput(StaticPaymentOutputDescriptor),
 }
 
-impl Writeable for SpendableOutputDescriptor {
-       fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
-               match self {
-                       &SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output } => {
-                               0u8.write(writer)?;
-                               outpoint.write(writer)?;
-                               output.write(writer)?;
-                       },
-                       &SpendableOutputDescriptor::DelayedPaymentOutput(ref descriptor) => {
-                               1u8.write(writer)?;
-                               descriptor.outpoint.write(writer)?;
-                               descriptor.per_commitment_point.write(writer)?;
-                               descriptor.to_self_delay.write(writer)?;
-                               descriptor.output.write(writer)?;
-                               descriptor.revocation_pubkey.write(writer)?;
-                               descriptor.channel_keys_id.write(writer)?;
-                               descriptor.channel_value_satoshis.write(writer)?;
-                       },
-                       &SpendableOutputDescriptor::StaticPaymentOutput(ref descriptor) => {
-                               2u8.write(writer)?;
-                               descriptor.outpoint.write(writer)?;
-                               descriptor.output.write(writer)?;
-                               descriptor.channel_keys_id.write(writer)?;
-                               descriptor.channel_value_satoshis.write(writer)?;
-                       },
-               }
-               Ok(())
-       }
-}
-
-impl Readable for SpendableOutputDescriptor {
-       fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
-               match Readable::read(reader)? {
-                       0u8 => Ok(SpendableOutputDescriptor::StaticOutput {
-                               outpoint: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                       }),
-                       1u8 => Ok(SpendableOutputDescriptor::DelayedPaymentOutput(DelayedPaymentOutputDescriptor {
-                               outpoint: Readable::read(reader)?,
-                               per_commitment_point: Readable::read(reader)?,
-                               to_self_delay: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                               revocation_pubkey: Readable::read(reader)?,
-                               channel_keys_id: Readable::read(reader)?,
-                               channel_value_satoshis: Readable::read(reader)?,
-                       })),
-                       2u8 => Ok(SpendableOutputDescriptor::StaticPaymentOutput(StaticPaymentOutputDescriptor {
-                               outpoint: Readable::read(reader)?,
-                               output: Readable::read(reader)?,
-                               channel_keys_id: Readable::read(reader)?,
-                               channel_value_satoshis: Readable::read(reader)?,
-                       })),
-                       _ => Err(DecodeError::InvalidValue),
-               }
-       }
-}
+impl_writeable_tlv_based_enum!(SpendableOutputDescriptor,
+       (0, StaticOutput) => {
+               (0, outpoint, required),
+               (2, output, required),
+       },
+;
+       (1, DelayedPaymentOutput),
+       (2, StaticPaymentOutput),
+);
 
 /// A trait to sign lightning channel transactions as described in BOLT 3.
 ///
@@ -723,14 +692,14 @@ impl Writeable for InMemorySigner {
                self.channel_value_satoshis.write(writer)?;
                self.channel_keys_id.write(writer)?;
 
-               write_tlv_fields!(writer, {}, {});
+               write_tlv_fields!(writer, {});
 
                Ok(())
        }
 }
 
 impl Readable for InMemorySigner {
-       fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
+       fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
                let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
 
                let funding_key = Readable::read(reader)?;
@@ -748,7 +717,7 @@ impl Readable for InMemorySigner {
                                                             &htlc_base_key);
                let keys_id = Readable::read(reader)?;
 
-               read_tlv_fields!(reader, {}, {});
+               read_tlv_fields!(reader, {});
 
                Ok(InMemorySigner {
                        funding_key,
@@ -1070,7 +1039,7 @@ impl KeysInterface for KeysManager {
        }
 
        fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError> {
-               InMemorySigner::read(&mut std::io::Cursor::new(reader))
+               InMemorySigner::read(&mut io::Cursor::new(reader))
        }
 
        fn sign_invoice(&self, invoice_preimage: Vec<u8>) -> Result<RecoverableSignature, ()> {