-impl MsgDecodable for Init {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- let global_features = GlobalFeatures::decode(v)?;
- if v.len() < global_features.flags.len() + 4 {
- return Err(DecodeError::ShortRead);
- }
- let local_features = LocalFeatures::decode(&v[global_features.flags.len() + 2..])?;
- Ok(Self {
- global_features: global_features,
- local_features: local_features,
- })
- }
-}
-impl MsgEncodable for Init {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(self.global_features.flags.len() + self.local_features.flags.len());
- res.extend_from_slice(&self.global_features.encode()[..]);
- res.extend_from_slice(&self.local_features.encode()[..]);
- res
- }
-}
-
-impl MsgDecodable for Ping {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 4 {
- return Err(DecodeError::ShortRead);
- }
- let ponglen = byte_utils::slice_to_be16(&v[0..2]);
- let byteslen = byte_utils::slice_to_be16(&v[2..4]);
- if v.len() < 4 + byteslen as usize {
- return Err(DecodeError::ShortRead);
- }
- Ok(Self {
- ponglen,
- byteslen,
- })
- }
-}
-impl MsgEncodable for Ping {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(self.byteslen as usize + 2);
- res.extend_from_slice(&byte_utils::be16_to_array(self.byteslen));
- res.resize(2 + self.byteslen as usize, 0);
- res
- }
-}
-
-impl MsgDecodable for Pong {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 2 {
- return Err(DecodeError::ShortRead);
- }
- let byteslen = byte_utils::slice_to_be16(&v[0..2]);
- if v.len() < 2 + byteslen as usize {
- return Err(DecodeError::ShortRead);
- }
- Ok(Self {
- byteslen
- })
- }
-}
-impl MsgEncodable for Pong {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(self.byteslen as usize + 2);
- res.extend_from_slice(&byte_utils::be16_to_array(self.byteslen));
- res.resize(2 + self.byteslen as usize, 0);
- res
- }
-}
-
-impl MsgDecodable for OpenChannel {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 2*32+6*8+4+2*2+6*33+1 {
- return Err(DecodeError::ShortRead);
- }
- let ctx = Secp256k1::without_caps();
-
- let mut shutdown_scriptpubkey = None;
- if v.len() >= 321 {
- let len = byte_utils::slice_to_be16(&v[319..321]) as usize;
- if v.len() < 321+len {
- return Err(DecodeError::ShortRead);
- }
- shutdown_scriptpubkey = Some(Script::from(v[321..321+len].to_vec()));
- }
- let mut temp_channel_id = [0; 32];
- temp_channel_id[..].copy_from_slice(&v[32..64]);
- Ok(OpenChannel {
- chain_hash: deserialize(&v[0..32]).unwrap(),
- temporary_channel_id: temp_channel_id,
- funding_satoshis: byte_utils::slice_to_be64(&v[64..72]),
- push_msat: byte_utils::slice_to_be64(&v[72..80]),
- dust_limit_satoshis: byte_utils::slice_to_be64(&v[80..88]),
- max_htlc_value_in_flight_msat: byte_utils::slice_to_be64(&v[88..96]),
- channel_reserve_satoshis: byte_utils::slice_to_be64(&v[96..104]),
- htlc_minimum_msat: byte_utils::slice_to_be64(&v[104..112]),
- feerate_per_kw: byte_utils::slice_to_be32(&v[112..116]),
- to_self_delay: byte_utils::slice_to_be16(&v[116..118]),
- max_accepted_htlcs: byte_utils::slice_to_be16(&v[118..120]),
- funding_pubkey: secp_pubkey!(&ctx, &v[120..153]),
- revocation_basepoint: secp_pubkey!(&ctx, &v[153..186]),
- payment_basepoint: secp_pubkey!(&ctx, &v[186..219]),
- delayed_payment_basepoint: secp_pubkey!(&ctx, &v[219..252]),
- htlc_basepoint: secp_pubkey!(&ctx, &v[252..285]),
- first_per_commitment_point: secp_pubkey!(&ctx, &v[285..318]),
- channel_flags: v[318],
- shutdown_scriptpubkey: shutdown_scriptpubkey
- })
- }
-}
-impl MsgEncodable for OpenChannel {
- fn encode(&self) -> Vec<u8> {
- let mut res = match &self.shutdown_scriptpubkey {
- &Some(ref script) => Vec::with_capacity(319 + 2 + script.len()),
- &None => Vec::with_capacity(319),
- };
- res.extend_from_slice(&serialize(&self.chain_hash).unwrap());
- res.extend_from_slice(&serialize(&self.temporary_channel_id).unwrap());
- res.extend_from_slice(&byte_utils::be64_to_array(self.funding_satoshis));
- res.extend_from_slice(&byte_utils::be64_to_array(self.push_msat));
- res.extend_from_slice(&byte_utils::be64_to_array(self.dust_limit_satoshis));
- res.extend_from_slice(&byte_utils::be64_to_array(self.max_htlc_value_in_flight_msat));
- res.extend_from_slice(&byte_utils::be64_to_array(self.channel_reserve_satoshis));
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_minimum_msat));
- res.extend_from_slice(&byte_utils::be32_to_array(self.feerate_per_kw));
- res.extend_from_slice(&byte_utils::be16_to_array(self.to_self_delay));
- res.extend_from_slice(&byte_utils::be16_to_array(self.max_accepted_htlcs));
- res.extend_from_slice(&self.funding_pubkey.serialize());
- res.extend_from_slice(&self.revocation_basepoint.serialize());
- res.extend_from_slice(&self.payment_basepoint.serialize());
- res.extend_from_slice(&self.delayed_payment_basepoint.serialize());
- res.extend_from_slice(&self.htlc_basepoint.serialize());
- res.extend_from_slice(&self.first_per_commitment_point.serialize());
- res.push(self.channel_flags);
- if let &Some(ref script) = &self.shutdown_scriptpubkey {
- res.extend_from_slice(&byte_utils::be16_to_array(script.len() as u16));
- res.extend_from_slice(&script[..]);
- }
- res
- }
-}
-
-impl MsgDecodable for AcceptChannel {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+4*8+4+2*2+6*33 {
- return Err(DecodeError::ShortRead);
- }
- let ctx = Secp256k1::without_caps();
-
- let mut shutdown_scriptpubkey = None;
- if v.len() >= 272 {
- let len = byte_utils::slice_to_be16(&v[270..272]) as usize;
- if v.len() < 272+len {
- return Err(DecodeError::ShortRead);
- }
- shutdown_scriptpubkey = Some(Script::from(v[272..272+len].to_vec()));
- }
-
- let mut temporary_channel_id = [0; 32];
- temporary_channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- temporary_channel_id,
- dust_limit_satoshis: byte_utils::slice_to_be64(&v[32..40]),
- max_htlc_value_in_flight_msat: byte_utils::slice_to_be64(&v[40..48]),
- channel_reserve_satoshis: byte_utils::slice_to_be64(&v[48..56]),
- htlc_minimum_msat: byte_utils::slice_to_be64(&v[56..64]),
- minimum_depth: byte_utils::slice_to_be32(&v[64..68]),
- to_self_delay: byte_utils::slice_to_be16(&v[68..70]),
- max_accepted_htlcs: byte_utils::slice_to_be16(&v[70..72]),
- funding_pubkey: secp_pubkey!(&ctx, &v[72..105]),
- revocation_basepoint: secp_pubkey!(&ctx, &v[105..138]),
- payment_basepoint: secp_pubkey!(&ctx, &v[138..171]),
- delayed_payment_basepoint: secp_pubkey!(&ctx, &v[171..204]),
- htlc_basepoint: secp_pubkey!(&ctx, &v[204..237]),
- first_per_commitment_point: secp_pubkey!(&ctx, &v[237..270]),
- shutdown_scriptpubkey: shutdown_scriptpubkey
- })
- }
-}
-impl MsgEncodable for AcceptChannel {
- fn encode(&self) -> Vec<u8> {
- let mut res = match &self.shutdown_scriptpubkey {
- &Some(ref script) => Vec::with_capacity(270 + 2 + script.len()),
- &None => Vec::with_capacity(270),
- };
- res.extend_from_slice(&self.temporary_channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.dust_limit_satoshis));
- res.extend_from_slice(&byte_utils::be64_to_array(self.max_htlc_value_in_flight_msat));
- res.extend_from_slice(&byte_utils::be64_to_array(self.channel_reserve_satoshis));
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_minimum_msat));
- res.extend_from_slice(&byte_utils::be32_to_array(self.minimum_depth));
- res.extend_from_slice(&byte_utils::be16_to_array(self.to_self_delay));
- res.extend_from_slice(&byte_utils::be16_to_array(self.max_accepted_htlcs));
- res.extend_from_slice(&self.funding_pubkey.serialize());
- res.extend_from_slice(&self.revocation_basepoint.serialize());
- res.extend_from_slice(&self.payment_basepoint.serialize());
- res.extend_from_slice(&self.delayed_payment_basepoint.serialize());
- res.extend_from_slice(&self.htlc_basepoint.serialize());
- res.extend_from_slice(&self.first_per_commitment_point.serialize());
- if let &Some(ref script) = &self.shutdown_scriptpubkey {
- res.extend_from_slice(&byte_utils::be16_to_array(script.len() as u16));
- res.extend_from_slice(&script[..]);
- }
- res
- }
-}
-
-impl MsgDecodable for FundingCreated {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+32+2+64 {
- return Err(DecodeError::ShortRead);
- }
- let ctx = Secp256k1::without_caps();
- let mut temporary_channel_id = [0; 32];
- temporary_channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- temporary_channel_id,
- funding_txid: deserialize(&v[32..64]).unwrap(),
- funding_output_index: byte_utils::slice_to_be16(&v[64..66]),
- signature: secp_signature!(&ctx, &v[66..130]),
- })
- }
-}
-impl MsgEncodable for FundingCreated {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+32+2+64);
- res.extend_from_slice(&self.temporary_channel_id);
- res.extend_from_slice(&serialize(&self.funding_txid).unwrap()[..]);
- res.extend_from_slice(&byte_utils::be16_to_array(self.funding_output_index));
- let secp_ctx = Secp256k1::without_caps();
- res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx));
- res
- }
-}
-
-impl MsgDecodable for FundingSigned {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+64 {
- return Err(DecodeError::ShortRead);
- }
- let ctx = Secp256k1::without_caps();
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- channel_id,
- signature: secp_signature!(&ctx, &v[32..96]),
- })
- }
-}
-impl MsgEncodable for FundingSigned {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+64);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&self.signature.serialize_compact(&Secp256k1::without_caps()));
- res
- }
-}
-
-impl MsgDecodable for FundingLocked {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+33 {
- return Err(DecodeError::ShortRead);
- }
- let ctx = Secp256k1::without_caps();
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- channel_id,
- next_per_commitment_point: secp_pubkey!(&ctx, &v[32..65]),
- })
- }
-}
-impl MsgEncodable for FundingLocked {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+33);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&self.next_per_commitment_point.serialize());
- res
- }
-}
-
-impl MsgDecodable for Shutdown {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32 + 2 {
- return Err(DecodeError::ShortRead);
- }
- let scriptlen = byte_utils::slice_to_be16(&v[32..34]) as usize;
- if v.len() < 32 + 2 + scriptlen {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- channel_id,
- scriptpubkey: Script::from(v[34..34 + scriptlen].to_vec()),
- })
- }
-}
-impl MsgEncodable for Shutdown {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32 + 2 + self.scriptpubkey.len());
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be16_to_array(self.scriptpubkey.len() as u16));
- res.extend_from_slice(&self.scriptpubkey[..]);
- res
- }
-}
-
-impl MsgDecodable for ClosingSigned {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32 + 8 + 64 {
- return Err(DecodeError::ShortRead);
- }
- let secp_ctx = Secp256k1::without_caps();
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- channel_id,
- fee_satoshis: byte_utils::slice_to_be64(&v[32..40]),
- signature: secp_signature!(&secp_ctx, &v[40..104]),
- })
- }
-}
-impl MsgEncodable for ClosingSigned {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+8+64);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.fee_satoshis));
- let secp_ctx = Secp256k1::without_caps();
- res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx));
- res
- }
-}
-
-impl MsgDecodable for UpdateAddHTLC {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+8+8+32+4+1+33+20*65+32 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- let mut payment_hash = [0; 32];
- payment_hash.copy_from_slice(&v[48..80]);
- Ok(Self{
- channel_id,
- htlc_id: byte_utils::slice_to_be64(&v[32..40]),
- amount_msat: byte_utils::slice_to_be64(&v[40..48]),
- payment_hash,
- cltv_expiry: byte_utils::slice_to_be32(&v[80..84]),
- onion_routing_packet: OnionPacket::decode(&v[84..84+1366])?,
- })
- }
-}
-impl MsgEncodable for UpdateAddHTLC {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+8+8+32+4+1366);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id));
- res.extend_from_slice(&byte_utils::be64_to_array(self.amount_msat));
- res.extend_from_slice(&self.payment_hash);
- res.extend_from_slice(&byte_utils::be32_to_array(self.cltv_expiry));
- res.extend_from_slice(&self.onion_routing_packet.encode()[..]);
- res
- }
-}
-
-impl MsgDecodable for UpdateFulfillHTLC {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+8+32 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- let mut payment_preimage = [0; 32];
- payment_preimage.copy_from_slice(&v[40..72]);
- Ok(Self{
- channel_id,
- htlc_id: byte_utils::slice_to_be64(&v[32..40]),
- payment_preimage,
- })
- }
-}
-impl MsgEncodable for UpdateFulfillHTLC {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+8+32);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id));
- res.extend_from_slice(&self.payment_preimage);
- res
- }
-}
-
-impl MsgDecodable for UpdateFailHTLC {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+8 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self{
- channel_id,
- htlc_id: byte_utils::slice_to_be64(&v[32..40]),
- reason: OnionErrorPacket::decode(&v[40..])?,
- })
- }
-}
-impl MsgEncodable for UpdateFailHTLC {
- fn encode(&self) -> Vec<u8> {
- let reason = self.reason.encode();
- let mut res = Vec::with_capacity(32+8+reason.len());
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id));
- res.extend_from_slice(&reason[..]);
- res
- }
-}
-
-impl MsgDecodable for UpdateFailMalformedHTLC {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+8+32+2 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- let mut sha256_of_onion = [0; 32];
- sha256_of_onion.copy_from_slice(&v[40..72]);
- Ok(Self{
- channel_id,
- htlc_id: byte_utils::slice_to_be64(&v[32..40]),
- sha256_of_onion,
- failure_code: byte_utils::slice_to_be16(&v[72..74]),
- })
- }
-}
-impl MsgEncodable for UpdateFailMalformedHTLC {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+8+32+2);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be64_to_array(self.htlc_id));
- res.extend_from_slice(&self.sha256_of_onion);
- res.extend_from_slice(&byte_utils::be16_to_array(self.failure_code));
- res
- }
-}
-
-impl MsgDecodable for CommitmentSigned {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+64+2 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
-
- let htlcs = byte_utils::slice_to_be16(&v[96..98]) as usize;
- if v.len() < 32+64+2+htlcs*64 {
- return Err(DecodeError::ShortRead);
- }
- let mut htlc_signatures = Vec::with_capacity(htlcs);
- let secp_ctx = Secp256k1::without_caps();
- for i in 0..htlcs {
- htlc_signatures.push(secp_signature!(&secp_ctx, &v[98+i*64..98+(i+1)*64]));
- }
- Ok(Self {
- channel_id,
- signature: secp_signature!(&secp_ctx, &v[32..96]),
- htlc_signatures,
- })
- }
-}
-impl MsgEncodable for CommitmentSigned {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+64+2+self.htlc_signatures.len()*64);
- res.extend_from_slice(&self.channel_id);
- let secp_ctx = Secp256k1::without_caps();
- res.extend_from_slice(&self.signature.serialize_compact(&secp_ctx));
- res.extend_from_slice(&byte_utils::be16_to_array(self.htlc_signatures.len() as u16));
- for i in 0..self.htlc_signatures.len() {
- res.extend_from_slice(&self.htlc_signatures[i].serialize_compact(&secp_ctx));
- }
- res
- }
-}
-
-impl MsgDecodable for RevokeAndACK {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+32+33 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- let mut per_commitment_secret = [0; 32];
- per_commitment_secret.copy_from_slice(&v[32..64]);
- let secp_ctx = Secp256k1::without_caps();
- Ok(Self {
- channel_id,
- per_commitment_secret,
- next_per_commitment_point: secp_pubkey!(&secp_ctx, &v[64..97]),
- })
- }
-}
-impl MsgEncodable for RevokeAndACK {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+32+33);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&self.per_commitment_secret);
- res.extend_from_slice(&self.next_per_commitment_point.serialize());
- res
- }
-}
-
-impl MsgDecodable for UpdateFee {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+4 {
- return Err(DecodeError::ShortRead);
- }
- let mut channel_id = [0; 32];
- channel_id[..].copy_from_slice(&v[0..32]);
- Ok(Self {
- channel_id,
- feerate_per_kw: byte_utils::slice_to_be32(&v[32..36]),
- })
- }
-}
-impl MsgEncodable for UpdateFee {
- fn encode(&self) -> Vec<u8> {
- let mut res = Vec::with_capacity(32+4);
- res.extend_from_slice(&self.channel_id);
- res.extend_from_slice(&byte_utils::be32_to_array(self.feerate_per_kw));
- res
- }
-}
-
-impl MsgDecodable for ChannelReestablish {
- fn decode(v: &[u8]) -> Result<Self, DecodeError> {
- if v.len() < 32+2*8 {
- return Err(DecodeError::ShortRead);
- }
-
- let data_loss_protect = if v.len() > 32+2*8 {
- if v.len() < 32+2*8 + 33+32 {
- return Err(DecodeError::ShortRead);
- }
- let mut inner_array = [0; 32];
- inner_array.copy_from_slice(&v[48..48+32]);
- Some(DataLossProtect {
- your_last_per_commitment_secret: inner_array,
- my_current_per_commitment_point: secp_pubkey!(&Secp256k1::without_caps(), &v[48+32..48+32+33]),
- })
- } else { None };
-
- Ok(Self {
- channel_id: deserialize(&v[0..32]).unwrap(),
- next_local_commitment_number: byte_utils::slice_to_be64(&v[32..40]),
- next_remote_commitment_number: byte_utils::slice_to_be64(&v[40..48]),
- data_loss_protect: data_loss_protect,
- })
- }
-}