bolt2

Lightning peer protocol, per BOLT #2.
git clone git://git.ppad.tech/bolt2.git
Log | Files | Refs | README | LICENSE

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:
Mlib/Lightning/Protocol/BOLT2.hs | 4++++
Alib/Lightning/Protocol/BOLT2/Messages.hs | 601+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mppad-bolt2.cabal | 1+
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