commit 00780406fc4c57e5d87bfaa0e9b215f71f629057
parent c8fa2e306fdf1737f9eca5a480b201d2d782da77
Author: Jared Tobin <jared@jtobin.io>
Date: Sun, 25 Jan 2026 10:57:38 +0400
Merge impl/message-adts: Add BOLT2 message ADTs
Implements Wave 2 of IMPL1 plan - all 29 message types:
- Channel establishment v1: OpenChannel, AcceptChannel, FundingCreated,
FundingSigned, ChannelReady
- Channel establishment v2: OpenChannel2, AcceptChannel2, TxAddInput,
TxAddOutput, TxRemoveInput, TxRemoveOutput, TxComplete, TxSignatures,
TxInitRbf, TxAckRbf, TxAbort
- Channel close: Stfu, Shutdown, ClosingSigned, ClosingComplete, ClosingSig
- Normal operation: UpdateAddHtlc, UpdateFulfillHtlc, UpdateFailHtlc,
UpdateFailMalformedHtlc, CommitmentSigned, RevokeAndAck, UpdateFee
- Reestablishment: ChannelReestablish
Also includes MsgType enum and top-level Message sum type.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat:
3 files changed, 606 insertions(+), 0 deletions(-)
diff --git a/lib/Lightning/Protocol/BOLT2.hs b/lib/Lightning/Protocol/BOLT2.hs
@@ -15,6 +15,9 @@ module Lightning.Protocol.BOLT2 (
module Lightning.Protocol.BOLT2.Types
-- * Message types
+ -- | Re-exported from "Lightning.Protocol.BOLT2.Messages".
+ , module Lightning.Protocol.BOLT2.Messages
+
-- $messagetypes
-- ** Channel establishment (v1)
@@ -33,6 +36,7 @@ module Lightning.Protocol.BOLT2 (
-- $reestablish
) where
+import Lightning.Protocol.BOLT2.Messages
import Lightning.Protocol.BOLT2.Types
-- $messagetypes
diff --git a/lib/Lightning/Protocol/BOLT2/Messages.hs b/lib/Lightning/Protocol/BOLT2/Messages.hs
@@ -0,0 +1,601 @@
+{-# OPTIONS_HADDOCK prune #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+
+-- |
+-- Module: Lightning.Protocol.BOLT2.Messages
+-- Copyright: (c) 2025 Jared Tobin
+-- License: MIT
+-- Maintainer: Jared Tobin <jared@ppad.tech>
+--
+-- Message types for BOLT #2 peer protocol.
+--
+-- This module defines per-message record types and a top-level Message
+-- sum type for all BOLT #2 messages.
+
+module Lightning.Protocol.BOLT2.Messages (
+ -- * Message type codes
+ MsgType(..)
+ , msgTypeWord
+
+ -- * Top-level message type
+ , Message(..)
+
+ -- * Channel establishment v1
+ , OpenChannel(..)
+ , AcceptChannel(..)
+ , FundingCreated(..)
+ , FundingSigned(..)
+ , ChannelReady(..)
+
+ -- * Channel establishment v2
+ , OpenChannel2(..)
+ , AcceptChannel2(..)
+ , TxAddInput(..)
+ , TxAddOutput(..)
+ , TxRemoveInput(..)
+ , TxRemoveOutput(..)
+ , TxComplete(..)
+ , TxSignatures(..)
+ , TxInitRbf(..)
+ , TxAckRbf(..)
+ , TxAbort(..)
+
+ -- * Channel close
+ , Stfu(..)
+ , Shutdown(..)
+ , ClosingSigned(..)
+ , ClosingComplete(..)
+ , ClosingSig(..)
+
+ -- * Normal operation
+ , UpdateAddHtlc(..)
+ , UpdateFulfillHtlc(..)
+ , UpdateFailHtlc(..)
+ , UpdateFailMalformedHtlc(..)
+ , CommitmentSigned(..)
+ , RevokeAndAck(..)
+ , UpdateFee(..)
+
+ -- * Reestablishment
+ , ChannelReestablish(..)
+
+ -- * Witness data
+ , Witness(..)
+ ) where
+
+import Control.DeepSeq (NFData)
+import qualified Data.ByteString as BS
+import Data.Word (Word8, Word16, Word32, Word64)
+import GHC.Generics (Generic)
+import Lightning.Protocol.BOLT1 (TlvStream)
+import Lightning.Protocol.BOLT2.Types
+
+-- Message type codes ----------------------------------------------------------
+
+-- | BOLT #2 message type codes.
+data MsgType
+ = MsgStfu -- ^ 2
+ | MsgOpenChannel -- ^ 32
+ | MsgAcceptChannel -- ^ 33
+ | MsgFundingCreated -- ^ 34
+ | MsgFundingSigned -- ^ 35
+ | MsgChannelReady -- ^ 36
+ | MsgShutdown -- ^ 38
+ | MsgClosingSigned -- ^ 39
+ | MsgClosingComplete -- ^ 40
+ | MsgClosingSig -- ^ 41
+ | MsgOpenChannel2 -- ^ 64
+ | MsgAcceptChannel2 -- ^ 65
+ | MsgTxAddInput -- ^ 66
+ | MsgTxAddOutput -- ^ 67
+ | MsgTxRemoveInput -- ^ 68
+ | MsgTxRemoveOutput -- ^ 69
+ | MsgTxComplete -- ^ 70
+ | MsgTxSignatures -- ^ 71
+ | MsgTxInitRbf -- ^ 72
+ | MsgTxAckRbf -- ^ 73
+ | MsgTxAbort -- ^ 74
+ | MsgUpdateAddHtlc -- ^ 128
+ | MsgUpdateFulfillHtlc -- ^ 130
+ | MsgUpdateFailHtlc -- ^ 131
+ | MsgCommitmentSigned -- ^ 132
+ | MsgRevokeAndAck -- ^ 133
+ | MsgUpdateFee -- ^ 134
+ | MsgUpdateFailMalformedHtlc -- ^ 135
+ | MsgChannelReestablish -- ^ 136
+ deriving stock (Eq, Ord, Show, Generic)
+
+instance NFData MsgType
+
+-- | Get the numeric type code for a message type.
+msgTypeWord :: MsgType -> Word16
+msgTypeWord MsgStfu = 2
+msgTypeWord MsgOpenChannel = 32
+msgTypeWord MsgAcceptChannel = 33
+msgTypeWord MsgFundingCreated = 34
+msgTypeWord MsgFundingSigned = 35
+msgTypeWord MsgChannelReady = 36
+msgTypeWord MsgShutdown = 38
+msgTypeWord MsgClosingSigned = 39
+msgTypeWord MsgClosingComplete = 40
+msgTypeWord MsgClosingSig = 41
+msgTypeWord MsgOpenChannel2 = 64
+msgTypeWord MsgAcceptChannel2 = 65
+msgTypeWord MsgTxAddInput = 66
+msgTypeWord MsgTxAddOutput = 67
+msgTypeWord MsgTxRemoveInput = 68
+msgTypeWord MsgTxRemoveOutput = 69
+msgTypeWord MsgTxComplete = 70
+msgTypeWord MsgTxSignatures = 71
+msgTypeWord MsgTxInitRbf = 72
+msgTypeWord MsgTxAckRbf = 73
+msgTypeWord MsgTxAbort = 74
+msgTypeWord MsgUpdateAddHtlc = 128
+msgTypeWord MsgUpdateFulfillHtlc = 130
+msgTypeWord MsgUpdateFailHtlc = 131
+msgTypeWord MsgCommitmentSigned = 132
+msgTypeWord MsgRevokeAndAck = 133
+msgTypeWord MsgUpdateFee = 134
+msgTypeWord MsgUpdateFailMalformedHtlc = 135
+msgTypeWord MsgChannelReestablish = 136
+{-# INLINE msgTypeWord #-}
+
+-- Channel establishment v1 ----------------------------------------------------
+
+-- | The open_channel message (type 32).
+--
+-- Contains information about a node and indicates its desire to set up
+-- a new channel.
+data OpenChannel = OpenChannel
+ { openChannelChainHash :: !ChainHash
+ , openChannelTempChannelId :: !ChannelId
+ , openChannelFundingSatoshis :: {-# UNPACK #-} !Satoshis
+ , openChannelPushMsat :: {-# UNPACK #-} !MilliSatoshis
+ , openChannelDustLimitSatoshis :: {-# UNPACK #-} !Satoshis
+ , openChannelMaxHtlcValueInFlight :: {-# UNPACK #-} !MilliSatoshis
+ , openChannelChannelReserveSat :: {-# UNPACK #-} !Satoshis
+ , openChannelHtlcMinimumMsat :: {-# UNPACK #-} !MilliSatoshis
+ , openChannelFeeratePerKw :: {-# UNPACK #-} !Word32
+ , openChannelToSelfDelay :: {-# UNPACK #-} !Word16
+ , openChannelMaxAcceptedHtlcs :: {-# UNPACK #-} !Word16
+ , openChannelFundingPubkey :: !Point
+ , openChannelRevocationBasepoint :: !Point
+ , openChannelPaymentBasepoint :: !Point
+ , openChannelDelayedPaymentBase :: !Point
+ , openChannelHtlcBasepoint :: !Point
+ , openChannelFirstPerCommitPoint :: !Point
+ , openChannelChannelFlags :: {-# UNPACK #-} !Word8
+ , openChannelTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData OpenChannel
+
+-- | The accept_channel message (type 33).
+--
+-- Contains information about a node and indicates its acceptance of
+-- the new channel.
+data AcceptChannel = AcceptChannel
+ { acceptChannelTempChannelId :: !ChannelId
+ , acceptChannelDustLimitSatoshis :: {-# UNPACK #-} !Satoshis
+ , acceptChannelMaxHtlcValueInFlight :: {-# UNPACK #-} !MilliSatoshis
+ , acceptChannelChannelReserveSat :: {-# UNPACK #-} !Satoshis
+ , acceptChannelHtlcMinimumMsat :: {-# UNPACK #-} !MilliSatoshis
+ , acceptChannelMinimumDepth :: {-# UNPACK #-} !Word32
+ , acceptChannelToSelfDelay :: {-# UNPACK #-} !Word16
+ , acceptChannelMaxAcceptedHtlcs :: {-# UNPACK #-} !Word16
+ , acceptChannelFundingPubkey :: !Point
+ , acceptChannelRevocationBasepoint :: !Point
+ , acceptChannelPaymentBasepoint :: !Point
+ , acceptChannelDelayedPaymentBase :: !Point
+ , acceptChannelHtlcBasepoint :: !Point
+ , acceptChannelFirstPerCommitPoint :: !Point
+ , acceptChannelTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData AcceptChannel
+
+-- | The funding_created message (type 34).
+--
+-- Describes the outpoint which the funder has created for the initial
+-- commitment transactions.
+data FundingCreated = FundingCreated
+ { fundingCreatedTempChannelId :: !ChannelId
+ , fundingCreatedFundingTxid :: !TxId
+ , fundingCreatedFundingOutIdx :: {-# UNPACK #-} !Word16
+ , fundingCreatedSignature :: !Signature
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData FundingCreated
+
+-- | The funding_signed message (type 35).
+--
+-- Gives the funder the signature for the first commitment transaction.
+data FundingSigned = FundingSigned
+ { fundingSignedChannelId :: !ChannelId
+ , fundingSignedSignature :: !Signature
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData FundingSigned
+
+-- | The channel_ready message (type 36).
+--
+-- Indicates that the funding transaction has sufficient confirms for
+-- channel use.
+data ChannelReady = ChannelReady
+ { channelReadyChannelId :: !ChannelId
+ , channelReadySecondPerCommitPoint :: !Point
+ , channelReadyTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData ChannelReady
+
+-- Channel establishment v2 ----------------------------------------------------
+
+-- | The open_channel2 message (type 64).
+--
+-- Initiates the v2 channel establishment workflow.
+data OpenChannel2 = OpenChannel2
+ { openChannel2ChainHash :: !ChainHash
+ , openChannel2TempChannelId :: !ChannelId
+ , openChannel2FundingFeeratePerkw :: {-# UNPACK #-} !Word32
+ , openChannel2CommitFeeratePerkw :: {-# UNPACK #-} !Word32
+ , openChannel2FundingSatoshis :: {-# UNPACK #-} !Satoshis
+ , openChannel2DustLimitSatoshis :: {-# UNPACK #-} !Satoshis
+ , openChannel2MaxHtlcValueInFlight :: {-# UNPACK #-} !MilliSatoshis
+ , openChannel2HtlcMinimumMsat :: {-# UNPACK #-} !MilliSatoshis
+ , openChannel2ToSelfDelay :: {-# UNPACK #-} !Word16
+ , openChannel2MaxAcceptedHtlcs :: {-# UNPACK #-} !Word16
+ , openChannel2Locktime :: {-# UNPACK #-} !Word32
+ , openChannel2FundingPubkey :: !Point
+ , openChannel2RevocationBasepoint :: !Point
+ , openChannel2PaymentBasepoint :: !Point
+ , openChannel2DelayedPaymentBase :: !Point
+ , openChannel2HtlcBasepoint :: !Point
+ , openChannel2FirstPerCommitPoint :: !Point
+ , openChannel2SecondPerCommitPoint :: !Point
+ , openChannel2ChannelFlags :: {-# UNPACK #-} !Word8
+ , openChannel2Tlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData OpenChannel2
+
+-- | The accept_channel2 message (type 65).
+--
+-- Indicates acceptance of the v2 channel.
+data AcceptChannel2 = AcceptChannel2
+ { acceptChannel2TempChannelId :: !ChannelId
+ , acceptChannel2FundingSatoshis :: {-# UNPACK #-} !Satoshis
+ , acceptChannel2DustLimitSatoshis :: {-# UNPACK #-} !Satoshis
+ , acceptChannel2MaxHtlcValueInFlight :: {-# UNPACK #-} !MilliSatoshis
+ , acceptChannel2HtlcMinimumMsat :: {-# UNPACK #-} !MilliSatoshis
+ , acceptChannel2MinimumDepth :: {-# UNPACK #-} !Word32
+ , acceptChannel2ToSelfDelay :: {-# UNPACK #-} !Word16
+ , acceptChannel2MaxAcceptedHtlcs :: {-# UNPACK #-} !Word16
+ , acceptChannel2FundingPubkey :: !Point
+ , acceptChannel2RevocationBasepoint :: !Point
+ , acceptChannel2PaymentBasepoint :: !Point
+ , acceptChannel2DelayedPaymentBase :: !Point
+ , acceptChannel2HtlcBasepoint :: !Point
+ , acceptChannel2FirstPerCommitPoint :: !Point
+ , acceptChannel2SecondPerCommitPoint :: !Point
+ , acceptChannel2Tlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData AcceptChannel2
+
+-- Interactive transaction construction ----------------------------------------
+
+-- | The tx_add_input message (type 66).
+--
+-- Adds a transaction input to the collaborative transaction.
+data TxAddInput = TxAddInput
+ { txAddInputChannelId :: !ChannelId
+ , txAddInputSerialId :: {-# UNPACK #-} !Word64
+ , txAddInputPrevTx :: !BS.ByteString
+ , txAddInputPrevVout :: {-# UNPACK #-} !Word32
+ , txAddInputSequence :: {-# UNPACK #-} !Word32
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxAddInput
+
+-- | The tx_add_output message (type 67).
+--
+-- Adds a transaction output to the collaborative transaction.
+data TxAddOutput = TxAddOutput
+ { txAddOutputChannelId :: !ChannelId
+ , txAddOutputSerialId :: {-# UNPACK #-} !Word64
+ , txAddOutputSats :: {-# UNPACK #-} !Satoshis
+ , txAddOutputScript :: !ScriptPubKey
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxAddOutput
+
+-- | The tx_remove_input message (type 68).
+--
+-- Removes a previously added input from the collaborative transaction.
+data TxRemoveInput = TxRemoveInput
+ { txRemoveInputChannelId :: !ChannelId
+ , txRemoveInputSerialId :: {-# UNPACK #-} !Word64
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxRemoveInput
+
+-- | The tx_remove_output message (type 69).
+--
+-- Removes a previously added output from the collaborative transaction.
+data TxRemoveOutput = TxRemoveOutput
+ { txRemoveOutputChannelId :: !ChannelId
+ , txRemoveOutputSerialId :: {-# UNPACK #-} !Word64
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxRemoveOutput
+
+-- | The tx_complete message (type 70).
+--
+-- Signals the conclusion of a peer's transaction contributions.
+data TxComplete = TxComplete
+ { txCompleteChannelId :: !ChannelId
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxComplete
+
+-- | Witness data for tx_signatures.
+data Witness = Witness
+ { witnessData :: !BS.ByteString
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData Witness
+
+-- | The tx_signatures message (type 71).
+--
+-- Contains signatures for the collaborative transaction.
+data TxSignatures = TxSignatures
+ { txSignaturesChannelId :: !ChannelId
+ , txSignaturesTxid :: !TxId
+ , txSignaturesWitnesses :: ![Witness]
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxSignatures
+
+-- | The tx_init_rbf message (type 72).
+--
+-- Initiates a replacement of the transaction after it's been completed.
+data TxInitRbf = TxInitRbf
+ { txInitRbfChannelId :: !ChannelId
+ , txInitRbfLocktime :: {-# UNPACK #-} !Word32
+ , txInitRbfFeerate :: {-# UNPACK #-} !Word32
+ , txInitRbfTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxInitRbf
+
+-- | The tx_ack_rbf message (type 73).
+--
+-- Acknowledges an RBF attempt.
+data TxAckRbf = TxAckRbf
+ { txAckRbfChannelId :: !ChannelId
+ , txAckRbfTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxAckRbf
+
+-- | The tx_abort message (type 74).
+--
+-- Aborts the collaborative transaction negotiation.
+data TxAbort = TxAbort
+ { txAbortChannelId :: !ChannelId
+ , txAbortData :: !BS.ByteString
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData TxAbort
+
+-- Channel close ---------------------------------------------------------------
+
+-- | The stfu message (type 2).
+--
+-- Indicates "SomeThing Fundamental is Underway" - used for channel
+-- quiescence.
+data Stfu = Stfu
+ { stfuChannelId :: !ChannelId
+ , stfuInitiator :: {-# UNPACK #-} !Word8
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData Stfu
+
+-- | The shutdown message (type 38).
+--
+-- Initiates closing of the channel.
+data Shutdown = Shutdown
+ { shutdownChannelId :: !ChannelId
+ , shutdownScriptPubkey :: !ScriptPubKey
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData Shutdown
+
+-- | The closing_signed message (type 39).
+--
+-- Used in legacy closing negotiation.
+data ClosingSigned = ClosingSigned
+ { closingSignedChannelId :: !ChannelId
+ , closingSignedFeeSatoshis :: {-# UNPACK #-} !Satoshis
+ , closingSignedSignature :: !Signature
+ , closingSignedTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData ClosingSigned
+
+-- | The closing_complete message (type 40).
+--
+-- Proposes a closing transaction in the new closing protocol.
+data ClosingComplete = ClosingComplete
+ { closingCompleteChannelId :: !ChannelId
+ , closingCompleteCloserScript :: !ScriptPubKey
+ , closingCompleteCloseeScript :: !ScriptPubKey
+ , closingCompleteFeeSatoshis :: {-# UNPACK #-} !Satoshis
+ , closingCompleteLocktime :: {-# UNPACK #-} !Word32
+ , closingCompleteTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData ClosingComplete
+
+-- | The closing_sig message (type 41).
+--
+-- Signs a closing transaction in the new closing protocol.
+data ClosingSig = ClosingSig
+ { closingSigChannelId :: !ChannelId
+ , closingSigCloserScript :: !ScriptPubKey
+ , closingSigCloseeScript :: !ScriptPubKey
+ , closingSigFeeSatoshis :: {-# UNPACK #-} !Satoshis
+ , closingSigLocktime :: {-# UNPACK #-} !Word32
+ , closingSigTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData ClosingSig
+
+-- Normal operation ------------------------------------------------------------
+
+-- | The update_add_htlc message (type 128).
+--
+-- Offers an HTLC to the other node, redeemable in return for a payment
+-- preimage.
+data UpdateAddHtlc = UpdateAddHtlc
+ { updateAddHtlcChannelId :: !ChannelId
+ , updateAddHtlcId :: {-# UNPACK #-} !Word64
+ , updateAddHtlcAmountMsat :: {-# UNPACK #-} !MilliSatoshis
+ , updateAddHtlcPaymentHash :: !PaymentHash
+ , updateAddHtlcCltvExpiry :: {-# UNPACK #-} !Word32
+ , updateAddHtlcOnionPacket :: !OnionPacket
+ , updateAddHtlcTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData UpdateAddHtlc
+
+-- | The update_fulfill_htlc message (type 130).
+--
+-- Supplies the preimage to fulfill an HTLC.
+data UpdateFulfillHtlc = UpdateFulfillHtlc
+ { updateFulfillHtlcChannelId :: !ChannelId
+ , updateFulfillHtlcId :: {-# UNPACK #-} !Word64
+ , updateFulfillHtlcPaymentPreimage :: !PaymentPreimage
+ , updateFulfillHtlcTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData UpdateFulfillHtlc
+
+-- | The update_fail_htlc message (type 131).
+--
+-- Indicates an HTLC has failed.
+data UpdateFailHtlc = UpdateFailHtlc
+ { updateFailHtlcChannelId :: !ChannelId
+ , updateFailHtlcId :: {-# UNPACK #-} !Word64
+ , updateFailHtlcReason :: !BS.ByteString
+ , updateFailHtlcTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData UpdateFailHtlc
+
+-- | The update_fail_malformed_htlc message (type 135).
+--
+-- Indicates an HTLC could not be parsed.
+data UpdateFailMalformedHtlc = UpdateFailMalformedHtlc
+ { updateFailMalformedHtlcChannelId :: !ChannelId
+ , updateFailMalformedHtlcId :: {-# UNPACK #-} !Word64
+ , updateFailMalformedHtlcSha256Onion :: !PaymentHash
+ , updateFailMalformedHtlcFailureCode :: {-# UNPACK #-} !Word16
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData UpdateFailMalformedHtlc
+
+-- | The commitment_signed message (type 132).
+--
+-- Applies pending changes and provides signatures for the commitment
+-- transaction.
+data CommitmentSigned = CommitmentSigned
+ { commitmentSignedChannelId :: !ChannelId
+ , commitmentSignedSignature :: !Signature
+ , commitmentSignedHtlcSignatures :: ![Signature]
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData CommitmentSigned
+
+-- | The revoke_and_ack message (type 133).
+--
+-- Revokes the previous commitment transaction and acknowledges receipt
+-- of the commitment_signed.
+data RevokeAndAck = RevokeAndAck
+ { revokeAndAckChannelId :: !ChannelId
+ , revokeAndAckPerCommitmentSecret :: !BS.ByteString
+ , revokeAndAckNextPerCommitPoint :: !Point
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData RevokeAndAck
+
+-- | The update_fee message (type 134).
+--
+-- Updates the fee rate for commitment transactions.
+data UpdateFee = UpdateFee
+ { updateFeeChannelId :: !ChannelId
+ , updateFeeFeeratePerKw :: {-# UNPACK #-} !Word32
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData UpdateFee
+
+-- Reestablishment -------------------------------------------------------------
+
+-- | The channel_reestablish message (type 136).
+--
+-- Used to re-establish a channel after reconnection.
+data ChannelReestablish = ChannelReestablish
+ { channelReestablishChannelId :: !ChannelId
+ , channelReestablishNextCommitNum :: {-# UNPACK #-} !Word64
+ , channelReestablishNextRevocationNum :: {-# UNPACK #-} !Word64
+ , channelReestablishYourLastCommitSecret :: !BS.ByteString
+ , channelReestablishMyCurrentCommitPoint :: !Point
+ , channelReestablishTlvs :: !TlvStream
+ } deriving stock (Eq, Show, Generic)
+
+instance NFData ChannelReestablish
+
+-- Top-level message type ------------------------------------------------------
+
+-- | All BOLT #2 messages.
+data Message
+ -- Channel establishment v1
+ = MsgOpenChannelVal !OpenChannel
+ | MsgAcceptChannelVal !AcceptChannel
+ | MsgFundingCreatedVal !FundingCreated
+ | MsgFundingSignedVal !FundingSigned
+ | MsgChannelReadyVal !ChannelReady
+ -- Channel establishment v2
+ | MsgOpenChannel2Val !OpenChannel2
+ | MsgAcceptChannel2Val !AcceptChannel2
+ | MsgTxAddInputVal !TxAddInput
+ | MsgTxAddOutputVal !TxAddOutput
+ | MsgTxRemoveInputVal !TxRemoveInput
+ | MsgTxRemoveOutputVal !TxRemoveOutput
+ | MsgTxCompleteVal !TxComplete
+ | MsgTxSignaturesVal !TxSignatures
+ | MsgTxInitRbfVal !TxInitRbf
+ | MsgTxAckRbfVal !TxAckRbf
+ | MsgTxAbortVal !TxAbort
+ -- Channel close
+ | MsgStfuVal !Stfu
+ | MsgShutdownVal !Shutdown
+ | MsgClosingSignedVal !ClosingSigned
+ | MsgClosingCompleteVal !ClosingComplete
+ | MsgClosingSigVal !ClosingSig
+ -- Normal operation
+ | MsgUpdateAddHtlcVal !UpdateAddHtlc
+ | MsgUpdateFulfillHtlcVal !UpdateFulfillHtlc
+ | MsgUpdateFailHtlcVal !UpdateFailHtlc
+ | MsgUpdateFailMalformedHtlcVal !UpdateFailMalformedHtlc
+ | MsgCommitmentSignedVal !CommitmentSigned
+ | MsgRevokeAndAckVal !RevokeAndAck
+ | MsgUpdateFeeVal !UpdateFee
+ -- Reestablishment
+ | MsgChannelReestablishVal !ChannelReestablish
+ deriving stock (Eq, Show, Generic)
+
+instance NFData Message
diff --git a/ppad-bolt2.cabal b/ppad-bolt2.cabal
@@ -25,6 +25,7 @@ library
-Wall
exposed-modules:
Lightning.Protocol.BOLT2
+ Lightning.Protocol.BOLT2.Messages
Lightning.Protocol.BOLT2.Types
build-depends:
base >= 4.9 && < 5