| Copyright | (c) 2025 Jared Tobin |
|---|---|
| License | MIT |
| Maintainer | Jared Tobin <jared@ppad.tech> |
| Safe Haskell | None |
| Language | Haskell2010 |
Lightning.Protocol.BOLT3.Validate
Description
Stateless validation for BOLT #3 transactions.
Provides validation for:
- Commitment transaction structure and outputs
- HTLC transaction structure
- Closing transaction structure
- Output ordering per BIP69+CLTV
- Dust limit compliance
Synopsis
- data ValidationError
- = InvalidVersion !Word32 !Word32
- | InvalidLocktime !Word32
- | InvalidSequence !Word32
- | InvalidOutputOrdering
- | DustLimitViolation !Int !Satoshi !Satoshi
- | MissingAnchorOutput
- | InvalidAnchorValue !Satoshi
- | InvalidFee !Satoshi !Satoshi
- | InvalidHTLCLocktime !Word32 !Word32
- | InvalidHTLCSequence !Word32 !Word32
- | NoOutputs
- | TooManyOutputs !Int
- validate_commitment_tx :: DustLimit -> ChannelFeatures -> CommitmentTx -> Either ValidationError ()
- validate_commitment_locktime :: Locktime -> Either ValidationError ()
- validate_commitment_sequence :: Sequence -> Either ValidationError ()
- validate_htlc_tx :: HTLCTx -> Either ValidationError ()
- validate_htlc_timeout_tx :: ChannelFeatures -> CltvExpiry -> HTLCTx -> Either ValidationError ()
- validate_htlc_success_tx :: ChannelFeatures -> HTLCTx -> Either ValidationError ()
- validate_closing_tx :: ClosingTx -> Either ValidationError ()
- validate_legacy_closing_tx :: ClosingTx -> Either ValidationError ()
- validate_output_ordering :: [TxOutput] -> Either ValidationError ()
- validate_dust_limits :: DustLimit -> [TxOutput] -> Either ValidationError ()
- validate_anchor_outputs :: [TxOutput] -> Either ValidationError ()
- validate_commitment_fee :: FeeratePerKw -> ChannelFeatures -> Word64 -> Satoshi -> Either ValidationError ()
- validate_htlc_fee :: FeeratePerKw -> ChannelFeatures -> HTLCDirection -> Satoshi -> Either ValidationError ()
Validation errors
data ValidationError Source #
Errors that can occur during validation.
Constructors
| InvalidVersion !Word32 !Word32 | Expected version, actual version |
| InvalidLocktime !Word32 | Invalid locktime format |
| InvalidSequence !Word32 | Invalid sequence format |
| InvalidOutputOrdering | Outputs not in BIP69+CLTV order |
| DustLimitViolation !Int !Satoshi !Satoshi | Output index, actual value, dust limit |
| MissingAnchorOutput | Expected anchor output not present |
| InvalidAnchorValue !Satoshi | Anchor value not 330 satoshis |
| InvalidFee !Satoshi !Satoshi | Expected fee, actual fee |
| InvalidHTLCLocktime !Word32 !Word32 | Expected locktime, actual locktime |
| InvalidHTLCSequence !Word32 !Word32 | Expected sequence, actual sequence |
| NoOutputs | Transaction has no outputs |
| TooManyOutputs !Int | More outputs than expected |
Instances
Commitment transaction validation
validate_commitment_tx :: DustLimit -> ChannelFeatures -> CommitmentTx -> Either ValidationError () Source #
Validate a commitment transaction.
Checks:
- Version is 2
- Locktime format (upper 8 bits = 0x20)
- Sequence format (upper 8 bits = 0x80)
- Output ordering per BIP69+CLTV
- Dust limit compliance
- Anchor outputs if option_anchors
validate_commitment_locktime :: Locktime -> Either ValidationError () Source #
Validate commitment transaction locktime format.
Upper 8 bits must be 0x20.
validate_commitment_sequence :: Sequence -> Either ValidationError () Source #
Validate commitment transaction sequence format.
Upper 8 bits must be 0x80.
HTLC transaction validation
validate_htlc_tx :: HTLCTx -> Either ValidationError () Source #
Validate an HTLC transaction (timeout or success).
Checks:
- Version is 2
- Single output
validate_htlc_timeout_tx :: ChannelFeatures -> CltvExpiry -> HTLCTx -> Either ValidationError () Source #
Validate an HTLC-timeout transaction.
Checks:
- Base HTLC validation
- Locktime equals HTLC cltv_expiry
- Sequence is 0 (or 1 with option_anchors)
validate_htlc_success_tx :: ChannelFeatures -> HTLCTx -> Either ValidationError () Source #
Validate an HTLC-success transaction.
Checks:
- Base HTLC validation
- Locktime is 0
- Sequence is 0 (or 1 with option_anchors)
Closing transaction validation
validate_closing_tx :: ClosingTx -> Either ValidationError () Source #
Validate a closing transaction (option_simple_close).
Checks:
- Version is 2
- Sequence is 0xFFFFFFFD
- At least one output
- Output ordering per BIP69
validate_legacy_closing_tx :: ClosingTx -> Either ValidationError () Source #
Validate a legacy closing transaction (closing_signed).
Checks:
- Version is 2
- Locktime is 0
- Sequence is 0xFFFFFFFF
- At least one output
- Output ordering per BIP69
Output validation
validate_output_ordering :: [TxOutput] -> Either ValidationError () Source #
Validate output ordering per BIP69+CLTV.
Outputs must be sorted by: 1. Value (smallest first) 2. ScriptPubKey (lexicographic) 3. CLTV expiry (for HTLC outputs)
validate_dust_limits :: DustLimit -> [TxOutput] -> Either ValidationError () Source #
Validate that no output violates dust limits.
validate_anchor_outputs :: [TxOutput] -> Either ValidationError () Source #
Validate anchor outputs are present and correctly valued.
Fee validation
validate_commitment_fee Source #
Arguments
| :: FeeratePerKw | |
| -> ChannelFeatures | |
| -> Word64 | Number of untrimmed HTLCs |
| -> Satoshi | Actual fee |
| -> Either ValidationError () |
Validate commitment transaction fee.
Checks that the fee matches the expected calculation.
Arguments
| :: FeeratePerKw | |
| -> ChannelFeatures | |
| -> HTLCDirection | |
| -> Satoshi | Actual fee |
| -> Either ValidationError () |
Validate HTLC transaction fee.