packages feed

ppad-bolt7-0.1.0: lib/Lightning/Protocol/BOLT7.hs

{-# OPTIONS_HADDOCK prune #-}

-- |
-- Module: Lightning.Protocol.BOLT7
-- Copyright: (c) 2025 Jared Tobin
-- License: MIT
-- Maintainer: Jared Tobin <jared@ppad.tech>
--
-- Routing gossip for the Lightning Network, per
-- [BOLT #7](https://github.com/lightning/bolts/blob/master/07-routing-gossip.md):
-- the gossip messages and queries, their signature digests and
-- checksums, signature verification, and stateless validation.
--
-- Fundamental types (chain hashes, points, signatures, short channel
-- ids, amounts, TLV streams) come from ppad-bolt1, and feature vectors
-- from ppad-bolt9.
--
-- Decoders take a message payload, without its 2-byte type, and consume
-- all of it. Every byte is kept, including unassigned flag bits,
-- unknown address descriptors and unknown odd TLV records, so encoding
-- a decoded message reproduces its payload exactly and its signatures
-- still verify.

module Lightning.Protocol.BOLT7 (
  -- * Messages
    Message(..)
  , message_type
  , ChannelAnnouncement(..)
  , NodeAnnouncement(..)
  , ChannelUpdate(..)
  , AnnouncementSignatures(..)
  , QueryShortChannelIds(..)
  , ReplyShortChannelIdsEnd(..)
  , QueryChannelRange(..)
  , ReplyChannelRange(..)
  , GossipTimestampFilter(..)

  -- * Encoding and decoding
  , encode_message
  , decode_message
  , EncodeError(..)
  , DecodeError(..)

  -- ** Payloads
  , encode_channel_announcement
  , decode_channel_announcement
  , encode_node_announcement
  , decode_node_announcement
  , encode_channel_update
  , decode_channel_update
  , encode_announcement_signatures
  , decode_announcement_signatures
  , encode_query_short_channel_ids
  , decode_query_short_channel_ids
  , encode_reply_short_channel_ids_end
  , decode_reply_short_channel_ids_end
  , encode_query_channel_range
  , decode_query_channel_range
  , encode_reply_channel_range
  , decode_reply_channel_range
  , encode_gossip_timestamp_filter
  , decode_gossip_timestamp_filter

  -- * Signatures and checksums
  , channel_announcement_hash
  , node_announcement_hash
  , channel_update_hash
  , verify_channel_announcement
  , verify_node_announcement
  , verify_channel_update
  , channel_update_checksum

  -- * Validation
  , ValidationError(..)
  , validate_channel_announcement
  , validate_node_announcement
  , validate_channel_update
  , validate_query_short_channel_ids
  , validate_query_channel_range
  , validate_reply_channel_range

  -- * channel_update flags
  , MessageFlags(..)
  , Forwarding(..)
  , message_flags
  , message_flags_forwarding
  , has_must_be_one
  , ChannelFlags(..)
  , Direction(..)
  , ChannelStatus(..)
  , channel_flags
  , channel_flags_direction
  , channel_flags_status

  -- * node_announcement fields
  , RgbColor(..)
  , Alias
  , alias
  , un_alias

  -- ** Addresses
  , Address(..)
  , usable_addresses
  , IPv4Addr
  , ipv4_addr
  , un_ipv4_addr
  , IPv6Addr
  , ipv6_addr
  , un_ipv6_addr
  , TorV2Addr
  , tor_v2_addr
  , un_tor_v2_addr
  , TorV3Addr
  , tor_v3_addr
  , un_tor_v3_addr
  , Hostname
  , hostname
  , un_hostname
  , is_ascii_hostname

  -- * Query fields
  , QueryFlags(..)
  , QueryFlag(..)
  , query_flags
  , has_query_flag
  , QueryOption(..)
  , QueryOptionFlag(..)
  , query_option
  , has_query_option
  , ChannelUpdateTimestamps(..)
  , ChannelUpdateChecksums(..)

  -- * Short channel ids
  , format_short_channel_id
  ) where

import Lightning.Protocol.BOLT7.Codec
import Lightning.Protocol.BOLT7.Hash
import Lightning.Protocol.BOLT7.Messages
import Lightning.Protocol.BOLT7.Types
import Lightning.Protocol.BOLT7.Validate