bolt3

Lightning transaction and script formats, per BOLT #3 (docs.ppad.tech/bolt3).
git clone git://git.ppad.tech/bolt3.git
Log | Files | Refs | README | LICENSE

commit ae0154f96d5c6f866723e18ce1c71314104dcd4c
parent 523aa8b203c356019e543a4e01bba28450d35020
Author: Jared Tobin <jared@jtobin.io>
Date:   Sat, 10 Oct 2026 13:31:15 +0400

Merge branch 'fix/secret-store'

Fixes the per-commitment secret store and puts the spec's transaction
vectors under test.

- lib (A1): insert_secret now follows BOLT #3's insert_secret. The new
  secret replaces only its own bucket's entry; all other entries are
  kept, in ascending bucket order. Previously it kept only the lower
  (redundant) buckets and dropped the rest, so derive_old_secret lost
  most older secrets and storage vectors #2, #4 and #6 were wrongly
  accepted. Secrets that are not 32 bytes and indices >= 2^48 are now
  rejected. The signature is unchanged.

- test (F1): the suite uses ppad-base16 instead of base16-bytestring,
  and the hex helper is total (fails the test via assertFailure).

- test: vendors the Appendix B, C, D (storage) and F vectors as
  Haskell literals in test/Vectors.hs, and asserts:
  - all 9 Appendix D storage vectors, accepted or rejected at the
    exact step the spec gives; derive_old_secret recovering every
    inserted index after each insert of the correct sequence; and a
    property that any prefix of a correct sequence leaves every
    inserted index derivable;
  - Appendix B funding witness script and funding output;
  - every Appendix C and F commitment and HTLC transaction,
    byte-for-byte against the spec with witnesses stripped (16 + 33
    for C, 9 + 15 for F);
  - the Appendix E per-commitment point from secret.

Stores persisted with the old insert_secret have already lost entries;
this change cannot recover them.

Diffstat:
Mlib/Lightning/Protocol/BOLT3/Keys.hs | 55++++++++++++++++++++++++++++++-------------------------
Mppad-bolt3.cabal | 6+++++-
Mtest/Main.hs | 404+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Atest/Vectors.hs | 1699+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 2049 insertions(+), 115 deletions(-)

diff --git a/lib/Lightning/Protocol/BOLT3/Keys.hs b/lib/Lightning/Protocol/BOLT3/Keys.hs @@ -432,39 +432,44 @@ where_to_put_secret idx = go 0 where -- | Insert a secret into the store, validating against existing secrets. -- --- Returns Nothing if the secret doesn't derive correctly from known --- secrets (indicating the secrets weren't generated from the same seed). +-- Implements insert_secret from BOLT #3: the secret is checked against +-- every known secret in a lower bucket, then replaces the entry in its +-- own bucket. Entries in all other buckets are kept, so that every +-- previously-inserted secret remains derivable via 'derive_old_secret'. +-- Entries are kept in ascending bucket order. +-- +-- Returns Nothing if the secret is not 32 bytes, if the index is not +-- below 2^48, or if a known secret doesn't derive correctly from the +-- new one (indicating the secrets weren't generated from the same +-- seed). -- -- >>> insert_secret secret 281474976710655 empty_store -- Just (SecretStore ...) insert_secret :: BS.ByteString -- ^ secret (32 bytes) - -> Word64 -- ^ index + -> Word64 -- ^ index (max 2^48 - 1) -> SecretStore -- ^ current store -> Maybe SecretStore -insert_secret secret idx (SecretStore known) = do - let !bucket = where_to_put_secret idx - -- Validate: for each bucket < this bucket, check we can derive - validated <- validateBuckets bucket known - if validated - then - -- Remove entries at bucket >= this bucket, then insert - let !known' = filter (\e -> se_bucket e < bucket) known - !entry = SecretEntry bucket idx secret - in pure $! SecretStore (known' ++ [entry]) - else Nothing +insert_secret secret idx (SecretStore known) + | BS.length secret /= 32 = Nothing + | idx > 0xFFFFFFFFFFFF = Nothing + | all derives known = Just $! SecretStore (put known) + | otherwise = Nothing where - validateBuckets :: Int -> [SecretEntry] -> Maybe Bool - validateBuckets b entries = go entries where - go [] = Just True - go (SecretEntry entryBucket knownIdx knownSecret : rest) - | entryBucket >= b = go rest -- skip entries at higher buckets - | otherwise = - -- Check if we can derive the known secret from the new one - let !derived = derive_secret secret b knownIdx - in if derived == knownSecret - then go rest - else Nothing + !bucket = where_to_put_secret idx + !entry = SecretEntry bucket idx secret + + -- known secrets in lower buckets must derive from the new one + derives (SecretEntry b knownIdx knownSecret) + | b < bucket = derive_secret secret bucket knownIdx == knownSecret + | otherwise = True + + -- replace this bucket's entry, preserving ascending bucket order + put [] = [entry] + put (e : es) = case compare (se_bucket e) bucket of + LT -> e : put es + EQ -> entry : es + GT -> entry : e : es {-# INLINE insert_secret #-} -- | Derive a previously-received secret from the store. diff --git a/ppad-bolt3.cabal b/ppad-bolt3.cabal @@ -47,16 +47,20 @@ test-suite bolt3-tests default-language: Haskell2010 hs-source-dirs: test main-is: Main.hs + other-modules: + Vectors ghc-options: -rtsopts -Wall -O2 build-depends: base - , base16-bytestring , bytestring + , ppad-base16 , ppad-bolt3 , ppad-secp256k1 >= 0.5.4 && < 0.6 + , ppad-sha256 + , ppad-tx , QuickCheck , tasty , tasty-hunit diff --git a/test/Main.hs b/test/Main.hs @@ -2,9 +2,13 @@ module Main where +import qualified Bitcoin.Prim.Tx as BT +import Control.Monad (foldM) import qualified Crypto.Curve.Secp256k1 as S +import qualified Crypto.Hash.SHA256 as SHA256 import qualified Data.ByteString as BS import qualified Data.ByteString.Base16 as B16 +import qualified Data.List.NonEmpty as NE import Data.Maybe (isJust, isNothing) import Data.Word (Word32, Word64) import Test.Tasty @@ -16,6 +20,7 @@ import Lightning.Protocol.BOLT3.Types , PaymentHash(..), PerCommitmentPoint(..) , PerCommitmentSecret(..) ) +import Vectors -- Module-level wNAF context. Built once; reused across every -- equivalence test below. Mirrors how downstream callers should use @@ -35,6 +40,15 @@ main = defaultMain $ testGroup "ppad-bolt3" [ , testGroup "Secret storage" [ secretStorageTests ] + , testGroup "Funding transaction" [ + fundingTests + ] + , testGroup "Commitment and HTLC transactions" [ + testGroup "BOLT #3 Appendix C" $ + fmap (commitVectorTests False) appendix_c + , testGroup "BOLT #3 Appendix F (anchors)" $ + fmap (commitVectorTests True) appendix_f + ] , testGroup "Fee calculation" [ feeCalculationTests ] @@ -49,48 +63,72 @@ main = defaultMain $ testGroup "ppad-bolt3" [ ] ] --- hex decoding helper -hex :: BS.ByteString -> BS.ByteString +-- | Decode a hex literal, failing the enclosing test on bad input. +hex :: BS.ByteString -> IO BS.ByteString hex h = case B16.decode h of - Right bs -> bs - Left _ -> error "invalid hex" + Just bs -> pure bs + Nothing -> assertFailure ("invalid hex literal: " ++ show h) + +-- | Unwrap a Just, failing the enclosing test on Nothing. +need :: String -> Maybe a -> IO a +need msg = maybe (assertFailure msg) pure -- Key derivation test vectors from Appendix E --------------------------------- keyDerivationTests :: TestTree keyDerivationTests = testGroup "BOLT #3 Appendix E" [ testCase "derive_pubkey" $ do - let basepoint = Point $ hex - "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" - perCommitmentPoint = PerCommitmentPoint $ Point $ hex - "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" - expected = hex - "0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5" + basepoint <- Point <$> hex + "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" + perCommitmentPoint <- PerCommitmentPoint . Point <$> hex + "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" + expected <- hex + "0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5" case derive_pubkey basepoint perCommitmentPoint of Nothing -> assertFailure "derive_pubkey returned Nothing" Just (Pubkey pk) -> pk @?= expected , testCase "derive_pubkey' matches vector" $ do - let basepoint = Point $ hex - "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" - perCommitmentPoint = PerCommitmentPoint $ Point $ hex - "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" - expected = hex - "0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5" + basepoint <- Point <$> hex + "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" + perCommitmentPoint <- PerCommitmentPoint . Point <$> hex + "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" + expected <- hex + "0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5" case derive_pubkey' tex basepoint perCommitmentPoint of Nothing -> assertFailure "derive_pubkey' returned Nothing" Just (Pubkey pk) -> pk @?= expected , testCase "derive_revocationpubkey" $ do - let revocationBasepoint = RevocationBasepoint $ Point $ hex - "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" - perCommitmentPoint = PerCommitmentPoint $ Point $ hex - "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" - expected = hex - "02916e326636d19c33f13e8c0c3a03dd157f332f3e99c317c141dd865eb01f8ff0" + revocationBasepoint <- RevocationBasepoint . Point <$> hex + "036d6caac248af96f6afa7f904f550253a0f3ef3f5aa2fe6838a95b216691468e2" + perCommitmentPoint <- PerCommitmentPoint . Point <$> hex + "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" + expected <- hex + "02916e326636d19c33f13e8c0c3a03dd157f332f3e99c317c141dd865eb01f8ff0" case derive_revocationpubkey revocationBasepoint perCommitmentPoint of Nothing -> assertFailure "derive_revocationpubkey returned Nothing" Just (RevocationPubkey (Pubkey pk)) -> pk @?= expected + + , testCase "derive_per_commitment_point" $ do + secret <- PerCommitmentSecret <$> hex + "1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100" + expected <- hex + "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" + PerCommitmentPoint (Point pcp) <- + need "derive_per_commitment_point returned Nothing" + (derive_per_commitment_point secret) + pcp @?= expected + + , testCase "derive_per_commitment_point' matches vector" $ do + secret <- PerCommitmentSecret <$> hex + "1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100" + expected <- hex + "025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486" + PerCommitmentPoint (Point pcp) <- + need "derive_per_commitment_point' returned Nothing" + (derive_per_commitment_point' tex secret) + pcp @?= expected ] -- Secret generation test vectors from Appendix D ------------------------------ @@ -98,92 +136,254 @@ keyDerivationTests = testGroup "BOLT #3 Appendix E" [ secretGenerationTests :: TestTree secretGenerationTests = testGroup "BOLT #3 Appendix D - Generation" [ testCase "generate_from_seed 0 final node" $ do - let seed = hex - "0000000000000000000000000000000000000000000000000000000000000000" - i = 281474976710655 - expected = hex - "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148" + seed <- hex + "0000000000000000000000000000000000000000000000000000000000000000" + expected <- hex + "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148" + let i = 281474976710655 generate_from_seed seed i @?= expected , testCase "generate_from_seed FF final node" $ do - let seed = hex - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - i = 281474976710655 - expected = hex - "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + seed <- hex + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + expected <- hex + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + let i = 281474976710655 generate_from_seed seed i @?= expected , testCase "generate_from_seed FF alternate bits 1" $ do - let seed = hex - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - i = 0xaaaaaaaaaaa - expected = hex - "56f4008fb007ca9acf0e15b054d5c9fd12ee06cea347914ddbaed70d1c13a528" + seed <- hex + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + expected <- hex + "56f4008fb007ca9acf0e15b054d5c9fd12ee06cea347914ddbaed70d1c13a528" + let i = 0xaaaaaaaaaaa generate_from_seed seed i @?= expected , testCase "generate_from_seed FF alternate bits 2" $ do - let seed = hex - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" - i = 0x555555555555 - expected = hex - "9015daaeb06dba4ccc05b91b2f73bd54405f2be9f217fbacd3c5ac2e62327d31" + seed <- hex + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + expected <- hex + "9015daaeb06dba4ccc05b91b2f73bd54405f2be9f217fbacd3c5ac2e62327d31" + let i = 0x555555555555 generate_from_seed seed i @?= expected , testCase "generate_from_seed 01 last nontrivial node" $ do - let seed = hex - "0101010101010101010101010101010101010101010101010101010101010101" - i = 1 - expected = hex - "915c75942a26bb3a433a8ce2cb0427c29ec6c1775cfc78328b57f6ba7bfeaa9c" + seed <- hex + "0101010101010101010101010101010101010101010101010101010101010101" + expected <- hex + "915c75942a26bb3a433a8ce2cb0427c29ec6c1775cfc78328b57f6ba7bfeaa9c" + let i = 1 generate_from_seed seed i @?= expected ] -- Secret storage test vectors from Appendix D --------------------------------- secretStorageTests :: TestTree -secretStorageTests = testGroup "BOLT #3 Appendix D - Storage" [ - testCase "insert_secret correct sequence" $ do - let secrets = [ - (281474976710655, hex - "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc") - , (281474976710654, hex - "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964") - , (281474976710653, hex - "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8") - , (281474976710652, hex - "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116") - , (281474976710651, hex - "c65716add7aa98ba7acb236352d665cab17345fe45b55fb879ff80e6bd0c41dd") - , (281474976710650, hex - "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2") - , (281474976710649, hex - "a5a64476122ca0925fb344bdc1854c1c0a59fc614298e50a33e331980a220f32") - , (281474976710648, hex - "05cde6323d949933f7f7b78776bcc1ea6d9b31447732e3802e1f7ac44b650e17") - ] - let insertAll store [] = Just store - insertAll store ((idx, secret):rest) = - case insert_secret secret idx store of - Nothing -> Nothing - Just store' -> insertAll store' rest - case insertAll empty_store secrets of - Nothing -> assertFailure "insert_secret failed on correct sequence" - Just _ -> return () - - , testCase "insert_secret #1 incorrect" $ do - -- First secret is from wrong seed, second should fail - let store0 = empty_store - case insert_secret (hex - "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148") - 281474976710655 store0 of - Nothing -> assertFailure "First insert should succeed" - Just store1 -> - case insert_secret (hex - "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964") - 281474976710654 store1 of - Nothing -> return () -- Expected to fail - Just _ -> assertFailure "Second insert should fail" +secretStorageTests = testGroup "BOLT #3 Appendix D - Storage" $ + fmap storageVectorTest appendix_d_storage + ++ [ + testCase "derive_old_secret after each correct insert" $ do + steps <- case filter isCorrect appendix_d_storage of + (v : _) -> pure (sv_steps v) + [] -> assertFailure "missing correct sequence vector" + known <- traverse (\st -> (,) (ss_index st) <$> hex (ss_secret st)) + steps + -- after each insert, every index inserted so far is derivable + let step (store, seen) (i, sec) = do + store' <- case insert_secret sec i store of + Just st -> pure st + Nothing -> assertFailure + ("rejected correct secret at I=" ++ show i) + let seen' = (i, sec) : seen + mapM_ (\(j, s) -> + assertEqual + ("after I=" ++ show i ++ ", derive_old_secret " + ++ show j) + (Just s) (derive_old_secret j store')) + seen' + pure (store', seen') + (store, _) <- foldM step (empty_store, []) known + -- the next index has not been received + assertEqual "derive_old_secret of unreceived index" + Nothing (derive_old_secret 281474976710647 store) + + , testCase "insert_secret rejects 31-byte secret" $ + isNothing (insert_secret (BS.replicate 31 0) maxCommitNum empty_store) + @?= True + , testCase "insert_secret rejects 33-byte secret" $ + isNothing (insert_secret (BS.replicate 33 0) maxCommitNum empty_store) + @?= True + , testCase "insert_secret rejects index 2^48" $ + isNothing + (insert_secret (BS.replicate 32 0) (maxCommitNum + 1) empty_store) + @?= True + , testCase "insert_secret accepts index 2^48-1" $ + isJust (insert_secret (BS.replicate 32 0) maxCommitNum empty_store) + @?= True + ] + where + isCorrect v = sv_name v == "insert_secret correct sequence" + +-- | Run a storage vector, asserting that each insert_secret call is +-- accepted or rejected exactly as the spec says. +storageVectorTest :: StorageVector -> TestTree +storageVectorTest (StorageVector name steps) = + testCase name (go empty_store steps) + where + go _ [] = pure () + go store (StorageStep i ok s : rest) = do + sec <- hex s + case (insert_secret sec i store, ok) of + (Just store', True) -> go store' rest + (Nothing, False) -> go store rest + (Just _, False) -> + assertFailure ("accepted incorrect secret at I=" ++ show i) + (Nothing, True) -> + assertFailure ("rejected correct secret at I=" ++ show i) + +-- Funding transaction test vectors from Appendix B ---------------------------- + +fundingTests :: TestTree +fundingTests = testGroup "BOLT #3 Appendix B" [ + testCase "funding witness script" $ do + (lpk, rpk) <- fundingPubkeys + wscript <- hex b_funding_wscript + unScript (funding_script lpk rpk) @?= wscript + unScript (funding_script rpk lpk) @?= wscript + + , testCase "funding output" $ do + (lpk, rpk) <- fundingPubkeys + tx <- hex b_funding_tx >>= decodeTx + txid <- hex b_funding_txid + BT.txid tx @?= TxId (BS.reverse txid) + case drop (fromIntegral b_funding_output) (NE.toList (BT.tx_outputs tx)) + of + (BT.TxOut value spk : _) -> do + value @?= b_funding_satoshis + spk @?= unScript (to_p2wsh (funding_script lpk rpk)) + [] -> assertFailure "missing funding output" ] + where + fundingPubkeys = do + lpk <- FundingPubkey . Pubkey <$> hex b_local_funding_pubkey + rpk <- FundingPubkey . Pubkey <$> hex b_remote_funding_pubkey + pure (lpk, rpk) + +-- Commitment and HTLC transaction test vectors from Appendices C and F -------- + +-- | Decode a serialized transaction, failing the test on bad input. +decodeTx :: BS.ByteString -> IO BT.Tx +decodeTx = need "undecodable transaction" . BT.from_bytes + +-- | Decode a hex transaction from the spec and strip its witnesses, +-- giving the unsigned serialization that the builders produce. +unsignedTx :: BS.ByteString -> IO BS.ByteString +unsignedTx h = BT.to_bytes_legacy <$> (hex h >>= decodeTx) + +-- | A test HTLC from the Appendix C parameters. +testHtlc :: Int -> IO HTLC +testHtlc i = case drop i c_htlcs of + (TestHtlc offered amt expiry pre : _) -> do + preimage <- hex pre + pure HTLC + { htlc_direction = if offered then HTLCOffered else HTLCReceived + , htlc_amount_msat = MilliSatoshi amt + , htlc_payment_hash = PaymentHash (SHA256.hash preimage) + , htlc_cltv_expiry = CltvExpiry expiry + } + [] -> assertFailure ("no test HTLC #" ++ show i) + +-- | Commitment keys from the Appendix C parameters, which Appendix F +-- shares. +vectorKeys :: IO CommitmentKeys +vectorKeys = do + revocation <- pk c_local_revocation_pubkey + delayed <- pk c_local_delayedpubkey + localHtlc <- pk c_local_htlcpubkey + remoteHtlc <- pk c_remote_htlcpubkey + remotePayment <- pk c_remote_payment_basepoint + localFunding <- pk c_local_funding_pubkey + remoteFunding <- pk c_remote_funding_pubkey + pure CommitmentKeys + { ck_revocation_pubkey = RevocationPubkey revocation + , ck_local_delayed = LocalDelayedPubkey delayed + , ck_local_htlc = LocalHtlcPubkey localHtlc + , ck_remote_htlc = RemoteHtlcPubkey remoteHtlc + -- the vectors use the payment basepoints as htlc basepoints, so + -- localpubkey equals local_htlcpubkey + , ck_local_payment = LocalPubkey localHtlc + -- to_remote pays P2WPKH(remote_payment_basepoint) + , ck_remote_payment = RemotePubkey remotePayment + , ck_local_funding = FundingPubkey localFunding + , ck_remote_funding = FundingPubkey remoteFunding + } + where + pk = fmap Pubkey . hex + +-- | The commitment context for a vector: local's commitment, with local +-- as the opener. +vectorContext :: Bool -> CommitVector -> IO CommitmentContext +vectorContext anchors v = do + keys <- vectorKeys + fundingTxid <- hex c_funding_txid + localBp <- PaymentBasepoint . Point <$> hex c_local_payment_basepoint + remoteBp <- PaymentBasepoint . Point <$> hex c_remote_payment_basepoint + cn <- need "invalid commitment number" + (commitment_number c_commitment_number) + htlcs <- traverse testHtlc (cv_htlcs v) + pure CommitmentContext + { cc_funding_outpoint = + OutPoint (TxId (BS.reverse fundingTxid)) c_funding_output_index + , cc_commitment_number = cn + , cc_local_payment_bp = localBp + , cc_remote_payment_bp = remoteBp + , cc_to_self_delay = ToSelfDelay c_local_delay + , cc_dust_limit = DustLimit (Satoshi (cv_dust_limit_sat v)) + , cc_feerate = FeeratePerKw (cv_feerate_per_kw v) + , cc_features = ChannelFeatures { cf_option_anchors = anchors } + , cc_is_funder = True + , cc_to_local_msat = MilliSatoshi (cv_to_local_msat v) + , cc_to_remote_msat = MilliSatoshi (cv_to_remote_msat v) + , cc_htlcs = htlcs + , cc_keys = keys + } + +-- | Assert that the commitment tx and each HTLC tx of a vector match +-- the spec's, with witnesses stripped. +commitVectorTests :: Bool -> CommitVector -> TestTree +commitVectorTests anchors v = testGroup (cv_name v) $ + testCase "commitment tx" (do + ctx <- vectorContext anchors v + expected <- unsignedTx (cv_commit_tx v) + encode_tx (build_commitment_tx ctx) @?= Just expected) + : fmap htlcTxTest (cv_htlc_txs v) + where + htlcTxTest (HtlcTxVector kind i out raw) = + testCase (kindName kind ++ " for htlc #" ++ show i + ++ " (output " ++ show out ++ ")") $ do + ctx <- vectorContext anchors v + commit <- need "empty commitment tx" + (commitment_to_tx (build_commitment_tx ctx)) + htlc <- testHtlc i + expected <- unsignedTx raw + let keys = cc_keys ctx + hctx = HTLCContext + { hc_commitment_txid = BT.txid commit + , hc_output_index = out + , hc_htlc = htlc + , hc_to_self_delay = cc_to_self_delay ctx + , hc_feerate = cc_feerate ctx + , hc_features = cc_features ctx + , hc_revocation_pubkey = ck_revocation_pubkey keys + , hc_local_delayed = ck_local_delayed keys + } + encode_htlc_tx (build kind hctx) @?= expected + + kindName HtlcSuccess = "htlc-success tx" + kindName HtlcTimeout = "htlc-timeout tx" + + build HtlcSuccess = build_htlc_success_tx + build HtlcTimeout = build_htlc_timeout_tx -- Fee calculation tests ------------------------------------------------------- @@ -401,6 +601,8 @@ propertyTests = testGroup "invariants" [ propTrimPartition , testProperty "commitment_fee increases with HTLCs" propFeeMonotonic + , testProperty "insert_secret keeps every inserted secret derivable" + propSecretStoreDerivable , testProperty "derive_per_commitment_point' ≡ derive_per_commitment_point" propDerivePcpEquiv , testProperty "derive_pubkey' ≡ derive_pubkey" @@ -483,6 +685,30 @@ propDeriveRemoteDelEquiv = in derive_remote_delayedpubkey' tex dbp pcp === derive_remote_delayedpubkey dbp pcp +-- | After inserting a prefix of a correct sequence (descending from +-- 2^48-1, all from one seed), every inserted index is derivable and +-- the store's buckets are strictly ascending. +propSecretStoreDerivable :: Property +propSecretStoreDerivable = + forAll (vectorOf 32 (choose (0, 255 :: Int))) $ \sd -> + forAll (choose (1, 1024)) $ \n -> + let seed = BS.pack (fmap fromIntegral sd) + idxs = take n [maxCommitNum, maxCommitNum - 1 ..] + secret = generate_from_seed seed + insert st i = st >>= insert_secret (secret i) i + in case foldl insert (Just empty_store) idxs of + Nothing -> counterexample "insert_secret rejected" False + Just store -> + let buckets = fmap se_bucket (unSecretStore store) + in conjoin + [ counterexample "buckets not ascending" + (and (zipWith (<) buckets (drop 1 buckets))) + , conjoin + [ counterexample ("index " ++ show i) + (derive_old_secret i store === Just (secret i)) + | i <- idxs ] + ] + -- | commitment_number accepts values in [0, 2^48-1] and -- rejects values >= 2^48. propCommitmentNumberRange :: Property diff --git a/test/Vectors.hs b/test/Vectors.hs @@ -0,0 +1,1699 @@ +{-# LANGUAGE OverloadedStrings #-} + +-- Test vectors from BOLT #3 (etc/03-transactions.md): +-- +-- * Appendix B: funding transaction +-- * Appendix C: commitment and HTLC transactions +-- * Appendix D: per-commitment secret storage +-- * Appendix F: commitment and HTLC transactions (anchors) +-- +-- Hex strings are copied verbatim from the spec. Transactions include +-- their witnesses; txids are in the spec's (big-endian) display order. + +module Vectors where + +import qualified Data.ByteString as BS +import Data.Word (Word16, Word32, Word64) + +-- types ---------------------------------------------------------------------- + +-- | A test HTLC from the Appendix C parameters. +data TestHtlc = TestHtlc + { th_offered :: !Bool -- ^ local->remote + , th_amount_msat :: !Word64 + , th_expiry :: !Word32 + , th_preimage :: !BS.ByteString -- ^ hex + } + +-- | Second-stage HTLC transaction kind. +data HtlcTxKind = HtlcSuccess | HtlcTimeout + deriving (Eq, Show) + +-- | An expected HTLC-success or HTLC-timeout transaction. +data HtlcTxVector = HtlcTxVector + { htv_kind :: !HtlcTxKind + , htv_htlc :: !Int -- ^ index into 'c_htlcs' + , htv_output :: !Word32 -- ^ commitment output index spent + , htv_tx :: !BS.ByteString -- ^ hex + } + +-- | A commitment transaction vector, with its HTLC transactions. +data CommitVector = CommitVector + { cv_name :: String + , cv_to_local_msat :: !Word64 + , cv_to_remote_msat :: !Word64 + , cv_feerate_per_kw :: !Word32 + , cv_dust_limit_sat :: !Word64 + , cv_htlcs :: ![Int] -- ^ indices into 'c_htlcs' + , cv_commit_tx :: !BS.ByteString -- ^ hex + , cv_htlc_txs :: ![HtlcTxVector] + } + +-- | One insert_secret call and whether the spec accepts it. +data StorageStep = StorageStep + { ss_index :: !Word64 + , ss_ok :: !Bool + , ss_secret :: !BS.ByteString -- ^ hex + } + +-- | A secret storage vector. +data StorageVector = StorageVector + { sv_name :: String + , sv_steps :: ![StorageStep] + } + +-- Appendix B ----------------------------------------------------------------- + +b_local_funding_pubkey :: BS.ByteString +b_local_funding_pubkey = + "023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb" + +b_remote_funding_pubkey :: BS.ByteString +b_remote_funding_pubkey = + "030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c1" + +b_funding_wscript :: BS.ByteString +b_funding_wscript = + "5221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb2103\ + \0e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae" + +b_funding_satoshis :: Word64 +b_funding_satoshis = 10000000 + +b_funding_output :: Word32 +b_funding_output = 0 + +b_funding_tx :: BS.ByteString +b_funding_tx = + "0200000001adbb20ea41a8423ea937e76e8151636bf6093b70eaff942930d20576600521fd\ + \000000006b48304502210090587b6201e166ad6af0227d3036a9454223d49a1f11839c1a36\ + \2184340ef0240220577f7cd5cca78719405cbf1de7414ac027f0239ef6e214c90fcaab0454\ + \d84b3b012103535b32d5eb0a6ed0982a0479bbadc9868d9836f6ba94dd5a63be16d8750691\ + \84ffffffff028096980000000000220020c015c4a6be010e21657068fc2e6a9d02b27ebe4d\ + \490a25846f7237f104d1a3cd20256d29010000001600143ca33c2e4446f4a305f23c80df8a\ + \d1afdcf652f900000000" + +b_funding_txid :: BS.ByteString +b_funding_txid = + "8984484a580b825b9972d7adb15050b3ab624ccd731946b3eeddb92f4e7ef6be" + +-- Appendix C ----------------------------------------------------------------- + +c_funding_txid :: BS.ByteString +c_funding_txid = + "8984484a580b825b9972d7adb15050b3ab624ccd731946b3eeddb92f4e7ef6be" + +c_funding_output_index :: Word32 +c_funding_output_index = 0 + +c_funding_amount_sat :: Word64 +c_funding_amount_sat = 10000000 + +c_commitment_number :: Word64 +c_commitment_number = 42 + +c_local_delay :: Word16 +c_local_delay = 144 + +c_local_payment_basepoint :: BS.ByteString +c_local_payment_basepoint = + "034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa" + +c_remote_payment_basepoint :: BS.ByteString +c_remote_payment_basepoint = + "032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991" + +c_local_funding_pubkey :: BS.ByteString +c_local_funding_pubkey = + "023da092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb" + +c_remote_funding_pubkey :: BS.ByteString +c_remote_funding_pubkey = + "030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c1" + +c_local_htlcpubkey :: BS.ByteString +c_local_htlcpubkey = + "030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b140639e7" + +c_remote_htlcpubkey :: BS.ByteString +c_remote_htlcpubkey = + "0394854aa6eab5b2a8122cc726e9dded053a2184d88256816826d6231c068d4a5b" + +c_local_delayedpubkey :: BS.ByteString +c_local_delayedpubkey = + "03fd5960528dc152014952efdb702a88f71e3c1653b2314431701ec77e57fde83c" + +c_local_revocation_pubkey :: BS.ByteString +c_local_revocation_pubkey = + "0212a140cd0c6539d07cd08dfe09984dec3251ea808b892efeac3ede9402bf2b19" + +-- | HTLCs 0 through 6. +c_htlcs :: [TestHtlc] +c_htlcs = [ + TestHtlc False 1000000 500 + "0000000000000000000000000000000000000000000000000000000000000000" + , TestHtlc False 2000000 501 + "0101010101010101010101010101010101010101010101010101010101010101" + , TestHtlc True 2000000 502 + "0202020202020202020202020202020202020202020202020202020202020202" + , TestHtlc True 3000000 503 + "0303030303030303030303030303030303030303030303030303030303030303" + , TestHtlc False 4000000 504 + "0404040404040404040404040404040404040404040404040404040404040404" + , TestHtlc True 5000000 506 + "0505050505050505050505050505050505050505050505050505050505050505" + , TestHtlc True 5000001 505 + "0505050505050505050505050505050505050505050505050505050505050505" + ] + +-- | Appendix C commitment vectors. +appendix_c :: [CommitVector] +appendix_c = [ + CommitVector + { cv_name = + "simple commitment tx with no HTLCs" + , cv_to_local_msat = 7000000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 15000 + , cv_dust_limit_sat = 546 + , cv_htlcs = [] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8002c0c62d0000000000160014cc1b07838e38\ + \7deacd0e5232e1e8b49f4c29e48454a56a00000000002200204adb4e2f00643db3\ + \96dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e040047304402206162\ + \10b2cc4d3afb601013c373bbd8aac54febd9f15400379a8cb65ce7deca60022034\ + \236c010991beb7ff770510561ae8dc885b8d38d1947248c38f2ae0556471420148\ + \3045022100c3127b33dcc741dd6b05b1e63cbd1a9a7d816f37af9b6756fa2376b0\ + \56f032370220408b96279808fe57eb7e463710804cdf4f108388bc5cf722d8c848\ + \d2c7f9f3b001475221023da092f6980e58d2c037173180e9a465476026ee50f966\ + \95963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385\ + \a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with all five HTLCs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 0 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8007e80300000000000022002052bfef0479d7\ + \b293c27e0f1eb294bea154c63a3294ef092c19af51409bce0e2ad0070000000000\ + \00220020403d394747cae42e98ff01734ad5c08f82ba123d3d9a620abda8898965\ + \1e2ab5d007000000000000220020748eba944fedc8827f6b06bc44678f93c0f9e6\ + \078b35c6331ed31e75f8ce0c2db80b000000000000220020c20b5d1f8584fd9044\ + \3e7b7b720136174fa4b9333c261d04dbbd012635c0f419a00f0000000000002200\ + \208c48d15160397c9731df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4\ + \c0c62d0000000000160014cc1b07838e387deacd0e5232e1e8b49f4c29e484e0a0\ + \6a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857\ + \accc862d6b7dd80e040047304402206fc2d1f10ea59951eefac0b4b7c396a3c3d8\ + \7b71ff0b019796ef4535beaf36f902201765b0181e514d04f4c8ad75659d7037be\ + \26cdb3f8bb6f78fe61decef484c3ea01473044022009b048187705a8cbc9ad73ad\ + \be5af148c3d012e1f067961486c822c7af08158c022006d66f3704cfab3eb2dc49\ + \dae24e4aa22a6910fc9b424007583204e3621af2e501475221023da092f6980e58\ + \d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2c\ + \cc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 0 0 + "02000000000101ab84ff284f162cfbfef241f853b47d4368d171f9e2a14451\ + \60cd591c4c7d882b00000000000000000001e8030000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100d9e29616b8f3959f1d3d7f7ce893ffedcdc407717d0de8e3\ + \7d808c91d3a7c50d022078c3033f6d00095c8720a4bc943c1b45727818c082\ + \e4e3ddbc6d3116435b624b014730440220636de5682ef0c5b61f124ec74e8a\ + \a2461a69777521d6998295dcea36bc3338110220165285594b23c50b28b82d\ + \f200234566628a27bcd17f7f14404bd865354eb3ce01200000000000000000\ + \0000000000000000000000000000000000000000000000008a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \14b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f401b175ac686800000000" + , HtlcTxVector HtlcTimeout 2 1 + "02000000000101ab84ff284f162cfbfef241f853b47d4368d171f9e2a14451\ + \60cd591c4c7d882b01000000000000000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220649fe8b20e67e46cbb0d09b4acea87dbec001b39b08dee7bdd\ + \0b1f03922a8640022037c462dff79df501cecfdb12ea7f4de91f99230bb544\ + \726f6e04527b1f89600401483045022100803159dee7935dba4a1d36a61055\ + \ce8fd62caa528573cc221ae288515405a252022029c59e7cffce374fe86010\ + \0a4a63787e105c3cf5156d40b12dd53ff55ac8cf3f01008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac\ + \6868f6010000" + , HtlcTxVector HtlcSuccess 1 2 + "02000000000101ab84ff284f162cfbfef241f853b47d4368d171f9e2a14451\ + \60cd591c4c7d882b02000000000000000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220770fc321e97a19f38985f2e7732dd9fe08d16a2efa4bcbc042\ + \9400a447faf49102204d40b417f3113e1b0944ae0986f517564ab4acd3d190\ + \503faf97a6e420d4335201483045022100a437cc2ce77400ecde441b3398fe\ + \a3c3ad8bdad8132be818227fe3c5b8345989022069d45e7fa0ae551ec37240\ + \845e2c561ceb2567eacf3076a6a43a502d05865faa01200101010101010101\ + \0101010101010101010101010101010101010101010101018a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f501b175ac686800000000" + , HtlcTxVector HtlcTimeout 3 3 + "02000000000101ab84ff284f162cfbfef241f853b47d4368d171f9e2a14451\ + \60cd591c4c7d882b03000000000000000001b80b0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402207bcbf4f60a9829b05d2dbab84ed593e0291836be715dc7db6b\ + \72a64caf646af802201e489a5a84f7c5cc130398b841d138d031a5137ac8f4\ + \c49c770a4959dc3c13630147304402203121d9b9c055f354304b016a36662e\ + \e99e1110d9501cb271b087ddb6f382c2c80220549882f3f3b78d9c492de475\ + \43cb9a697cecc493174726146536c5954dac748701008576a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac68\ + \68f7010000" + , HtlcTxVector HtlcSuccess 4 4 + "02000000000101ab84ff284f162cfbfef241f853b47d4368d171f9e2a14451\ + \60cd591c4c7d882b04000000000000000001a00f0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022076dca5cb81ba7e466e349b7128cdba216d4d01659e29b96025\ + \b9524aaf0d1899022060de85697b88b21c749702b7d2cfa7dfeaa1f472c8f1\ + \d7d9c23f2bf968464b8701483045022100d9080f103cc92bac15ec42464a95\ + \f070c7fb6925014e673ee2ea1374d36a7f7502200c65294d22eb20d4856495\ + \4d5afe04a385551919d8b2ddb4ae2459daaeee1d9501200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with seven outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 647 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8007e80300000000000022002052bfef0479d7\ + \b293c27e0f1eb294bea154c63a3294ef092c19af51409bce0e2ad0070000000000\ + \00220020403d394747cae42e98ff01734ad5c08f82ba123d3d9a620abda8898965\ + \1e2ab5d007000000000000220020748eba944fedc8827f6b06bc44678f93c0f9e6\ + \078b35c6331ed31e75f8ce0c2db80b000000000000220020c20b5d1f8584fd9044\ + \3e7b7b720136174fa4b9333c261d04dbbd012635c0f419a00f0000000000002200\ + \208c48d15160397c9731df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4\ + \c0c62d0000000000160014cc1b07838e387deacd0e5232e1e8b49f4c29e484e09c\ + \6a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857\ + \accc862d6b7dd80e04004830450221009ec15c687898bb4da8b3a833e5ab8bfc51\ + \ec6e9202aaa8e66611edfd4a85ed1102203d7183e45078b9735c93450bc3415d3e\ + \5a8c576141a711ec6ddcb4a893926bb701483045022100a135f9e8a5ed25f72774\ + \46c67956b00ce6f610ead2bdec2c2f686155b7814772022059f1f6e1a8b336a68e\ + \fcc1af3fe4d422d4827332b5b067501b099c47b7b5b5ee01475221023da092f698\ + \0e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b62\ + \3d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e1952\ + \20" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 0 0 + "020000000001012cfb3e4788c206881d38f2996b6cb2109b5935acb527d14b\ + \daa7b908afa9b2fe0000000000000000000122020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004830450221008437627f9ad84ac67052e2a414a4367b8556fd1f94d8b025\ + \90f89f50525cd33502205b9c21ff6e7fc864f2352746ad8ba59182510819ac\ + \b644e25b8a12fc37bbf24f014730440220344b0deb055230d01703e6c7acd4\ + \5853c4af2328b49b5d8af4f88a060733406602202ea64f2a43d5751edfe755\ + \03cbc35a62e3141b5ed032fa03360faf4ca66f670b01200000000000000000\ + \0000000000000000000000000000000000000000000000008a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \14b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f401b175ac686800000000" + , HtlcTxVector HtlcTimeout 2 1 + "020000000001012cfb3e4788c206881d38f2996b6cb2109b5935acb527d14b\ + \daa7b908afa9b2fe0100000000000000000124060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402205a67f92bf6845cf2892b48d874ac1daf88a36495cf8a06f93d\ + \83180d930a6f75022031da1621d95c3f335cc06a3056cf960199dae600b7cf\ + \89088f65fc53cdbef28c014830450221009e5e3822b0185c6799a95288c597\ + \b671d6cc69ab80f43740f00c6c3d0752bdda02206da947a74bd98f3175324d\ + \c56fdba86cc783703a120a6f0297537e60632f4c7f01008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac\ + \6868f6010000" + , HtlcTxVector HtlcSuccess 1 2 + "020000000001012cfb3e4788c206881d38f2996b6cb2109b5935acb527d14b\ + \daa7b908afa9b2fe020000000000000000010a060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220437e21766054a3eef7f65690c5bcfa9920babbc5af92b819f7\ + \72f6ea96df6c7402207173622024bd97328cfb26c6665e25c2f5d67c319443\ + \ccdc60c903217005d8c801483045022100fcfc47e36b712624677626cef3dc\ + \1d67f6583bd46926a6398fe6b00b0c9a37760220525788257b187fc775c637\ + \0d04eadf34d06f3650a63f8df851cee0ecb47a167301200101010101010101\ + \0101010101010101010101010101010101010101010101018a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f501b175ac686800000000" + , HtlcTxVector HtlcTimeout 3 3 + "020000000001012cfb3e4788c206881d38f2996b6cb2109b5935acb527d14b\ + \daa7b908afa9b2fe030000000000000000010c0a0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402207436e10737e4df499fc051686d3e11a5bb2310e4d1f1e691d2\ + \87cef66514791202207cb58e71a6b7a42dd001b7e3ae672ea4f71ea3e1cd41\ + \2b742e9124abb0739c6401483045022100e78211b8409afb7255ffe37337da\ + \87f38646f1faebbdd61bc1920d69e3ead67a02201a626305adfcd16bfb7e93\ + \40928d9b6305464eab4aa4c4a3af6646e9b9f69dee01008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac\ + \6868f7010000" + , HtlcTxVector HtlcSuccess 4 4 + "020000000001012cfb3e4788c206881d38f2996b6cb2109b5935acb527d14b\ + \daa7b908afa9b2fe04000000000000000001da0d0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004830450221009acd6a827a76bfee50806178dfe0495cd4e1d9c58279c194\ + \c7b01520fe68cb8d022024d439047c368883e570997a7d40f0b430cb5a742f\ + \507965e7d3063ae3feccca01473044022048762cf546bbfe474f1536365ea7\ + \c416e3c0389d60558bc9412cb148fb6ab68202207215d7083b75c96ff9d2b0\ + \8c59c34e287b66820f530b486a9aa4cdd9c347d5b901200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with six outputs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 648 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8006d007000000000000220020403d394747ca\ + \e42e98ff01734ad5c08f82ba123d3d9a620abda88989651e2ab5d0070000000000\ + \00220020748eba944fedc8827f6b06bc44678f93c0f9e6078b35c6331ed31e75f8\ + \ce0c2db80b000000000000220020c20b5d1f8584fd90443e7b7b720136174fa4b9\ + \333c261d04dbbd012635c0f419a00f0000000000002200208c48d15160397c9731\ + \df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4c0c62d00000000001600\ + \14cc1b07838e387deacd0e5232e1e8b49f4c29e4844e9d6a00000000002200204a\ + \db4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400\ + \483045022100b15f72908ba3382a34ca5b32519240a22300cc6015b6f9418635fb\ + \41f3d01d8802207adb331b9ed1575383dca0f2355e86c173802feecf8298fbea53\ + \b9d4610583e90147304402203948f900a5506b8de36a4d8502f94f21dd84fd9c23\ + \14ab427d52feaa7a0a19f2022059b6a37a4adaa2c5419dc8aea63c6e2a2ec4c4bd\ + \e46207f6dc1fcd22152fc6e501475221023da092f6980e58d2c037173180e9a465\ + \476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21\ + \ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 2 0 + "020000000001010f44041fdfba175987cf4e6135ba2a154e3b7fb96483dc0e\ + \d5efc0678e5b6bf10000000000000000000123060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100a031202f3be94678f0e998622ee95ebb6ada8da1e9a51102\ + \28b5e04a747351e4022010ca6a21e18314ed53cfaae3b1f51998552a61a468\ + \e596368829a50ce40110e00148304502210097e1873b57267730154595187a\ + \34949d3744f52933070c74757005e61ce2112e02204ecfba2aa42d4f14bdf8\ + \bad4206bb97217b702e6c433e0e1b0ce6587e6d46ec601008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188\ + \ac6868f6010000" + , HtlcTxVector HtlcSuccess 1 1 + "020000000001010f44041fdfba175987cf4e6135ba2a154e3b7fb96483dc0e\ + \d5efc0678e5b6bf10100000000000000000109060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402202361012a634aee7835c5ecdd6413dcffa8f404b7e77364c792\ + \cff984e4ee71e90220715c5e90baa08daa45a7439b1ee4fa4843ed77b19c05\ + \8240b69406606d38412401473044022019de73b00f1d818fb388e83b2c8c31\ + \f6bce35ac624e215bc12f88f9dc33edf48022006ff814bb9f700ee6abc3294\ + \e146fac3efd4f13f0005236b41c0a946ee00c9ae0120010101010101010101\ + \01010101010101010101010101010101010101010101018a76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \4b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f501b175ac686800000000" + , HtlcTxVector HtlcTimeout 3 2 + "020000000001010f44041fdfba175987cf4e6135ba2a154e3b7fb96483dc0e\ + \d5efc0678e5b6bf1020000000000000000010b0a0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402207e8e82cd71ed4febeb593732c260456836e97d81896153ecd2\ + \b3cf320ca6861702202dd4a30f68f98ced7cc56a36369ac1fdd978248c5ff4\ + \ed204fc00cc62553298901483045022100bd0be6100c4fd8f102ec220e1b05\ + \3e4c4e2ecca25615490150007b40d314dc3902201a1e0ea266965b43164d9e\ + \6576f58fa6726d42883dd1c3996d2925c2e226079601008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac\ + \6868f7010000" + , HtlcTxVector HtlcSuccess 4 3 + "020000000001010f44041fdfba175987cf4e6135ba2a154e3b7fb96483dc0e\ + \d5efc0678e5b6bf103000000000000000001d90d0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022024cd52e4198c8ae0e414a86d86b5a65ea7450f2eb4e7830967\ + \36d93395eca5ce022078f0094745b45be4d4b2b04dd5978c9e66ba49109e57\ + \04403e84aaf5f387d6be01483045022100bbfb9d0a946d420807c86e985d63\ + \6cceb16e71c3694ed186316251a00cbd807202207773223f9a337e145f6467\ + \3825be9b30d07ef1542c82188b264bedcf7cda78c601200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with six outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 2069 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8006d007000000000000220020403d394747ca\ + \e42e98ff01734ad5c08f82ba123d3d9a620abda88989651e2ab5d0070000000000\ + \00220020748eba944fedc8827f6b06bc44678f93c0f9e6078b35c6331ed31e75f8\ + \ce0c2db80b000000000000220020c20b5d1f8584fd90443e7b7b720136174fa4b9\ + \333c261d04dbbd012635c0f419a00f0000000000002200208c48d15160397c9731\ + \df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4c0c62d00000000001600\ + \14cc1b07838e387deacd0e5232e1e8b49f4c29e48477956a00000000002200204a\ + \db4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400\ + \483045022100ad9a9bbbb75d506ca3b716b336ee3cf975dd7834fcf129d7dd1881\ + \46eb58a8b4022061a759ee417339f7fe2ea1e8deb83abb6a74db31a09b7648a932\ + \a639cda23e330148304502210090b96a2498ce0c0f2fadbec2aab278fed54c1a78\ + \38df793ec4d2c78d96ec096202204fdd439c50f90d483baa7b68feeef4bd33bc27\ + \7695405447bcd0bfb2ca34d7bc01475221023da092f6980e58d2c037173180e9a4\ + \65476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce\ + \21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 2 0 + "02000000000101adbe717a63fb658add30ada1e6e12ed257637581898abe47\ + \5c11d7bbcd65bd4d0000000000000000000175020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100f33513ee38abf1c582876f921f8fddc06acff48e04515532\ + \a32d3938de938ffd02203aa308a2c1863b7d6fdf53159a1465bf2e115c1315\ + \2546cc5d74483ceaa7f69901483045022100a637902a5d4c9ba9e7c472a225\ + \337d5aac9e2e3f6744f76e237132e7619ba0400220035c60d784a031c0d9f6\ + \df66b7eab8726a5c25397399ee4aa960842059eb3f9d01008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188\ + \ac6868f6010000" + , HtlcTxVector HtlcSuccess 1 1 + "02000000000101adbe717a63fb658add30ada1e6e12ed257637581898abe47\ + \5c11d7bbcd65bd4d0100000000000000000122020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100ce07682cf4b90093c22dc2d9ab2a77ad6803526b655ef857\ + \221cc96af5c9e0bf02200f501cee22e7a268af40b555d15a8237c9f36ad67e\ + \f1841daf9f6a0267b1e6df01483045022100e57e46234f8782d3ff7aa593b4\ + \f7446fb5316c842e693dc63ee324fd49f6a1c302204a2f7b44c48bd26e1554\ + \422afae13153eb94b29d3687b733d18930615fb2db61012001010101010101\ + \010101010101010101010101010101010101010101010101018a76a9141401\ + \1f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2\ + \a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763\ + \a9144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a46\ + \946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67\ + \7502f501b175ac686800000000" + , HtlcTxVector HtlcTimeout 3 2 + "02000000000101adbe717a63fb658add30ada1e6e12ed257637581898abe47\ + \5c11d7bbcd65bd4d020000000000000000015d060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100e3e35492e55f82ec0bc2f317ffd7a486d1f7024330fe9743\ + \c3559fc39f32ef0c02203d1d4db651fc388a91d5ad8ecdd8e83673063bc8ee\ + \fe27cfd8c189090e3a23e001473044022068613fb1b98eb3aec7f44c5b115b\ + \12343c2f066c4277c82b5f873dfe68f37f50022028109b4650f3f528ca4bfe\ + \9a467aff2e3e43893b61b5159157119d5d95cf1c1801008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac\ + \6868f7010000" + , HtlcTxVector HtlcSuccess 4 3 + "02000000000101adbe717a63fb658add30ada1e6e12ed257637581898abe47\ + \5c11d7bbcd65bd4d03000000000000000001f2090000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402207475aeb0212ef9bf5130b60937817ad88c9a87976988ef1f32\ + \3f026148cc4a850220739fea17ad3257dcad72e509c73eebe86bee30b17846\ + \7b9fdab213d631b109df01483045022100d315522e09e7d53d2a659a79cb67\ + \fef56d6c4bddf3f46df6772d0d20a7beb7c8022070bcc17e288607b6a72be0\ + \bd83368bb6d53488db266c1cdb4d72214e4f02ac3301200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with five outputs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 2070 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8005d007000000000000220020403d394747ca\ + \e42e98ff01734ad5c08f82ba123d3d9a620abda88989651e2ab5b80b0000000000\ + \00220020c20b5d1f8584fd90443e7b7b720136174fa4b9333c261d04dbbd012635\ + \c0f419a00f0000000000002200208c48d15160397c9731df9bc3b236656efb6665\ + \fbfe92b4a6878e88a499f741c4c0c62d0000000000160014cc1b07838e387deacd\ + \0e5232e1e8b49f4c29e484da966a00000000002200204adb4e2f00643db396dd12\ + \0d4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400473044022001014419b5\ + \ba00e083ac4e0a85f19afc848aacac2d483b4b525d15e2ae5adbfe022015ebddad\ + \6ee1e72b47cb09f3e78459da5be01ccccd95dceca0e056a00cc773c10147304402\ + \204ca1ba260dee913d318271d86e10ca0f5883026fb5653155cff600fb40895223\ + \022037b145204b7054a40e08bb1fefbd826f827b40838d3e501423bcc57924bcb5\ + \0c01475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8e\ + \fe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6\ + \d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 2 0 + "02000000000101403ad7602b43293497a3a2235a12ecefda4f3a1f1d06e49b\ + \1786d945685de1ff0000000000000000000174020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402205f6b6d12d8d2529fb24f4445630566cf4abbd0f9330ab6c2bd\ + \b94222d6a2a0c502202f556258ae6f05b193749e4c541dfcc13b525a5422f6\ + \291f073f15617ba8579b014730440220150b11069454da70caf2492ded9e00\ + \65c9a57f25ac2a4c52657b1d15b6c6ed85022068a38833b603c88927172063\ + \83611bad210f1cbb4b1f87ea29c6c65b9e1cb3e501008576a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac68\ + \68f6010000" + , HtlcTxVector HtlcTimeout 3 1 + "02000000000101403ad7602b43293497a3a2235a12ecefda4f3a1f1d06e49b\ + \1786d945685de1ff010000000000000000015c060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100f960dfb1c9aee7ce1437efa65b523e399383e8149790e05d\ + \8fed27ff6e42fe0002202fe8613e062ffe0b0c518cc4101fba1c6de70f64a5\ + \bcc7ae663f2efae43b8546014830450221009a6ed18e6873bc3644332a6ee2\ + \1c152a5b102821865350df7a8c74451a51f9f2022050d801fb4895d7d7fbf4\ + \52824c0168347f5c0cbe821cf6a97a63af5b8b2563c601008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88\ + \ac6868f7010000" + , HtlcTxVector HtlcSuccess 4 2 + "02000000000101403ad7602b43293497a3a2235a12ecefda4f3a1f1d06e49b\ + \1786d945685de1ff02000000000000000001f1090000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100ae5fc7717ae684bc1fcf9020854e5dbe9842c9e7472879ac\ + \06ff95ac2bb10e4e022057728ada4c00083a3e65493fb5d50a232165948a1a\ + \0f530ef63185c2c8c56504014730440220408ad3009827a8fccf774cb28558\ + \7686bfb2ed041f89a89453c311ce9c8ee0f902203c7392d9f8306d3a46522a\ + \66bd2723a7eb2628cb2d9b34d4c104f1766bf3750201200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with five outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 2194 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8005d007000000000000220020403d394747ca\ + \e42e98ff01734ad5c08f82ba123d3d9a620abda88989651e2ab5b80b0000000000\ + \00220020c20b5d1f8584fd90443e7b7b720136174fa4b9333c261d04dbbd012635\ + \c0f419a00f0000000000002200208c48d15160397c9731df9bc3b236656efb6665\ + \fbfe92b4a6878e88a499f741c4c0c62d0000000000160014cc1b07838e387deacd\ + \0e5232e1e8b49f4c29e48440966a00000000002200204adb4e2f00643db396dd12\ + \0d4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400473044022072c2e2b1c8\ + \99b2242656a537dde2892fa3801be0d6df0a87836c550137acde8302201654aa19\ + \74d37a829083c3ba15088689f30b56d6a4f6cb14c7bad0ee3116d3980147304402\ + \204bb3d6e279d71d9da414c82de42f1f954267c762b2e2eb8b76bc3be4ea07d4b0\ + \022014febc009c5edc8c3fc5d94015de163200f780046f1c293bfed8568f08b70f\ + \b301475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8e\ + \fe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6\ + \d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 2 0 + "02000000000101153cd825fdb3aa624bfe513e8031d5d08c5e582fb3d1d1fe\ + \8faf27d3eed410cd0000000000000000000122020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100939726680351a7856c1bc386d4a1f422c7d29bd7b56afc13\ + \9570f508474e6c40022023175a799ccf44c017fbaadb924c40b2a12115a5b7\ + \d0dfd3228df803a2de84500148304502210099c98c2edeeee6ec0fb5f3bea8\ + \b79bb016a2717afa9b5072370f34382de281d302206f5e2980a995e045cf90\ + \a547f0752a7ee99d48547bc135258fe7bc07e015430101008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188\ + \ac6868f6010000" + , HtlcTxVector HtlcTimeout 3 1 + "02000000000101153cd825fdb3aa624bfe513e8031d5d08c5e582fb3d1d1fe\ + \8faf27d3eed410cd010000000000000000010a060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022021bb883bf324553d085ba2e821cad80c28ef8b303dbead8f98\ + \e548783c02d1600220638f9ef2a9bba25869afc923f4b5dc38be3bb459f9ef\ + \a5d869392d5f7779a4a001483045022100fd85bd7697b89c08ec12acc8ba89\ + \b23090637d83abd26ca37e01ae93e67c367302202b551fe69386116c47f984\ + \aab9c8dfd25d864dcde5d3389cfbef2447a85c4b7701008576a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac\ + \6868f7010000" + , HtlcTxVector HtlcSuccess 4 2 + "02000000000101153cd825fdb3aa624bfe513e8031d5d08c5e582fb3d1d1fe\ + \8faf27d3eed410cd020000000000000000019a090000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100c9e6f0454aa598b905a35e641a70cc9f67b5f38cc4b00843\ + \a041238c4a9f1c4a0220260a2822a62da97e44583e837245995ca2e3678176\ + \9c52f19e498efbdcca262b014830450221008a9f2ea24cd455c2b64c1472a5\ + \fa83865b0a5f49a62b661801e884cf2849af8302204d44180e50bf6adfcf1c\ + \1e581d75af91aba4e28681ce4a5ee5f3cbf65eca10f3012004040404040404\ + \040404040404040404040404040404040404040404040404048a76a9141401\ + \1f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2\ + \a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763\ + \a91418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a46\ + \946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67\ + \7502f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with four outputs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 2195 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8004b80b000000000000220020c20b5d1f8584\ + \fd90443e7b7b720136174fa4b9333c261d04dbbd012635c0f419a00f0000000000\ + \002200208c48d15160397c9731df9bc3b236656efb6665fbfe92b4a6878e88a499\ + \f741c4c0c62d0000000000160014cc1b07838e387deacd0e5232e1e8b49f4c29e4\ + \84b8976a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a\ + \40d857accc862d6b7dd80e0400473044022044d592025b610c0d678f65032e8703\ + \5cdfe89d1598c522cc32524ae8172417c30220749fef9d5b2ae8cdd91ece442ba8\ + \809bc891efedae2291e578475f97715d17670147304402201a8c1b1f9671cd9e46\ + \c7323a104d7047cc48d3ee80d40d4512e0c72b8dc65666022066d7f9a2ce18c9eb\ + \22d2739ffcce05721c767f9b607622a31b6ea5793ddce40301475221023da092f6\ + \980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b\ + \623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e19\ + \5220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 3 0 + "020000000001018130a10f09b13677ba2885a8bca32860f3a952e5912b829a\ + \473639b5a2c07b900000000000000000000109060000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100e57b845066a06ee7c2cbfc29eabffe52daa9bf6f6de76006\ + \6d04df9f9b250e0002202ffb197f0e6e0a77a75a9aff27014bd3de83b7f748\ + \d7efef986abe655e1dd50e01483045022100ecc8c6529d0b2316d046f0f075\ + \7c1e1c25a636db168ec4f3aa1b9278df685dc0022067ae6b65e936f1337091\ + \f7b18a15935b608c5f2cdddb2f892ed0babfdd376d7601008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88\ + \ac6868f7010000" + , HtlcTxVector HtlcSuccess 4 1 + "020000000001018130a10f09b13677ba2885a8bca32860f3a952e5912b829a\ + \473639b5a2c07b900100000000000000000199090000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100d193b7ecccad8057571620a0b1ffa6c48e9483311723b59c\ + \f536043b20bc51550220546d4bd37b3b101ecda14f6c907af46ec391abce1c\ + \d9c7ce22b1a62b534f2f2a01473044022014d66f11f9cacf923807eba49542\ + \076c5fe5cccf252fb08fe98c78ef3ca6ab5402201b290dbe043cc512d9d78d\ + \e074a5a129b8759bc6a6c546b190d120b690bd6e8201200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with four outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 3702 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8004b80b000000000000220020c20b5d1f8584\ + \fd90443e7b7b720136174fa4b9333c261d04dbbd012635c0f419a00f0000000000\ + \002200208c48d15160397c9731df9bc3b236656efb6665fbfe92b4a6878e88a499\ + \f741c4c0c62d0000000000160014cc1b07838e387deacd0e5232e1e8b49f4c29e4\ + \846f916a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a\ + \40d857accc862d6b7dd80e0400483045022100e5efb73c32d32da2d79702299b63\ + \17de6fb24a60476e3855926d78484dd1b3c802203557cb66a42c944ef06e00bcc4\ + \da35a5bcb2f185aab0f8e403e519e1d66aaf750148304502210092a587aeb777f8\ + \69e7ff0d7898ea619ee26a3dacd1f3672b945eea600be431100220077ee9eae352\ + \8d15251f2a52b607b189820e57a6ccfac8d1af502b132ee4016901475221023da0\ + \92f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e\ + \9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae\ + \3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 3 0 + "020000000001018db483bff65c70ee71d8282aeec5a880e2e2b39e45772bda\ + \5460403095c62e3f0000000000000000000122020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402206fa54c11f98c3bae1e93df43fc7affeb05b476bf8060c03e29\ + \c377c69bc08e8b0220672701cce50d5c379ff45a5d2cfe48ac44973adb066a\ + \c32608e21221d869bb890147304402206e36c683ebf2cb16bcef3d5439cf8b\ + \53cd97280a365ed8acd7abb85a8ba5f21c02206e8621edfc2a5766cbc96eb6\ + \7fd501127ff163eb6b85518a39f7d4974aef126f01008576a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac68\ + \68f7010000" + , HtlcTxVector HtlcSuccess 4 1 + "020000000001018db483bff65c70ee71d8282aeec5a880e2e2b39e45772bda\ + \5460403095c62e3f0100000000000000000176050000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022057649739b0eb74d541ead0dfdb3d4b2c15aa192720031044c3\ + \434c67812e5ca902201e5ede42d960ae551707f4a6b34b09393cf4dee24185\ + \07daa022e3550dbb58170147304402207faad26678c8850e01b4a0696d6084\ + \1f7305e1832b786110ee9075cb92ed14a30220516ef8ee5dfa80824ea28cbc\ + \ec0dd95f8b847146257c16960db98507db15ffdc0120040404040404040404\ + \04040404040404040404040404040404040404040404048a76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \18bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with three outputs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 3703 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8003a00f0000000000002200208c48d1516039\ + \7c9731df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4c0c62d00000000\ + \00160014cc1b07838e387deacd0e5232e1e8b49f4c29e484eb936a000000000022\ + \00204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd8\ + \0e040047304402201b736d1773a124c745586217a75bed5f66c05716fbe8c7db4f\ + \db3c3069741cdd02205083f39c321c1bcadfc8d97e3c791a66273d936abac0c6a2\ + \fde2ed46019508e101483045022100b495d239772a237ff2cf354b1b11be152fd8\ + \52704cb184e7356d13f2fb1e5e430220723db5cdb9cbd6ead7bfd3deb419cf4105\ + \3a932418cbb22a67b581f40bc1f13e01475221023da092f6980e58d2c037173180\ + \e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66\ + \d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 4 0 + "0200000000010120060e4a29579d429f0f27c17ee5f1ee282f20d706d6f90b\ + \63d35946d8f3029a0000000000000000000175050000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100c34c61735f93f2e324cc873c3b248111ccf8f6db15d59695\ + \83757010d4ad2b4602207867bb919b2ddd6387873e425345c9b7fd18d1d66a\ + \ba41f3607bc2896ef3c30a01483045022100988c143e2110067117d2321bdd\ + \4bd16ca1734c98b29290d129384af0962b634e02206c1b02478878c5f54701\ + \8b833986578f90c3e9be669fe5788ad0072a55acbb05012004040404040404\ + \040404040404040404040404040404040404040404040404048a76a9141401\ + \1f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2\ + \a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763\ + \a91418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a46\ + \946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67\ + \7502f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with three outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 4914 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8003a00f0000000000002200208c48d1516039\ + \7c9731df9bc3b236656efb6665fbfe92b4a6878e88a499f741c4c0c62d00000000\ + \00160014cc1b07838e387deacd0e5232e1e8b49f4c29e484ae8f6a000000000022\ + \00204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd8\ + \0e0400483045022100d72638bc6308b88bb6d45861aae83e5b9ff6e10986546e13\ + \bce769c70036e2620220320be7c6d66d22f30b9fcd52af66531505b1310ca3b848\ + \c19285b38d8a1a8c1901483045022100b4b16d5f8cc9fc4c1aff48831e832a0d89\ + \90e133978a66e302c133550954a44d022073573ce127e2200d316f6b612803a5c0\ + \c97b8d20e1e44dbe2ac0dd2fb8c9524401475221023da092f6980e58d2c0371731\ + \80e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d\ + \66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 4 0 + "02000000000101a9172908eace869cc35128c31fc2ab502f72e4dff31aab23\ + \e0244c4b04b11ab00000000000000000000122020000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100f43591c156038ba217756006bb3c55f7d113a325cdd7d930\ + \3c82115372858d68022016355b5aadf222bc8d12e426c75f4a03423917b244\ + \3a103eb2a498a3a2234374014730440220585dee80fafa264beac535c3c0bb\ + \5838ac348b156fdc982f86adc08dfc9bfd250220130abb82f9f295cc9ef423\ + \dcfef772fde2acd85d9df48cc538981d26a10a9c1001200404040404040404\ + \0404040404040404040404040404040404040404040404048a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac686800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with two outputs untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 4915 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8002c0c62d0000000000160014cc1b07838e38\ + \7deacd0e5232e1e8b49f4c29e484fa926a00000000002200204adb4e2f00643db3\ + \96dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e04004830450221008a\ + \953551f4d67cb4df3037207fc082ddaf6be84d417b0bd14c80aab66f1b01a40220\ + \7508796dc75034b2dee876fe01dc05a08b019f3e5d689ac8842ade2f1befccf501\ + \47304402203a286936e74870ca1459c700c71202af0381910a6bfab687ef494ef1\ + \bc3e02c902202506c362d0e3bee15e802aa729bf378e051644648253513f1c085b\ + \264cc2a72001475221023da092f6980e58d2c037173180e9a465476026ee50f966\ + \95963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385\ + \a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with two outputs untrimmed (maximum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 9651180 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b800222020000000000002200204adb4e2f0064\ + \3db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80ec0c62d00000000\ + \00160014cc1b07838e387deacd0e5232e1e8b49f4c29e4840400483045022100e1\ + \1b638c05c650c2f63a421d36ef8756c5ce82f2184278643520311cdf50aa200220\ + \259565fb9c8e4a87ccaf17f27a3b9ca4f20625754a0920d9c6c239d8156a11de01\ + \47304402200a8544eba1d216f5c5e530597665fa9bec56943c0f66d98fc3d028df\ + \52d84f7002201e45fa5c6bc3a506cc2553e7d1c0043a9811313fc39c954692c0d4\ + \7cfce2bbd301475221023da092f6980e58d2c037173180e9a465476026ee50f966\ + \95963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385\ + \a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with one output untrimmed (minimum feerate)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 9651181 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8001c0c62d0000000000160014cc1b07838e38\ + \7deacd0e5232e1e8b49f4c29e484040047304402207e8d51e0c570a5868a78414f\ + \4e0cbfaed1106b171b9581542c30718ee4eb95ba02203af84194c97adf98898c9a\ + \fe2f2ed4a7f8dba05a2dfab28ac9d9c604aa49a3790147304402202ade01420083\ + \09eb376736575ad58d03e5b115499709c6db0b46e36ff394b492022037b63d78d6\ + \6404d6504d4c4ac13be346f3d1802928a6d3ad95a6a944227161a201475221023d\ + \a092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb2103\ + \0e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152\ + \ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with fee greater than funder amount" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 9651936 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8001c0c62d0000000000160014cc1b07838e38\ + \7deacd0e5232e1e8b49f4c29e484040047304402207e8d51e0c570a5868a78414f\ + \4e0cbfaed1106b171b9581542c30718ee4eb95ba02203af84194c97adf98898c9a\ + \fe2f2ed4a7f8dba05a2dfab28ac9d9c604aa49a3790147304402202ade01420083\ + \09eb376736575ad58d03e5b115499709c6db0b46e36ff394b492022037b63d78d6\ + \6404d6504d4c4ac13be346f3d1802928a6d3ad95a6a944227161a201475221023d\ + \a092f6980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb2103\ + \0e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152\ + \ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with 3 htlc outputs, 2 offered having the same \ + \amount and preimage" + , cv_to_local_msat = 6987999999 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 253 + , cv_dust_limit_sat = 546 + , cv_htlcs = [1, 5, 6] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b8005d007000000000000220020748eba944fed\ + \c8827f6b06bc44678f93c0f9e6078b35c6331ed31e75f8ce0c2d88130000000000\ + \00220020305c12e1a0bc21e283c131cea1c66d68857d28b7b2fce0a6fbc40c1648\ + \52121b8813000000000000220020305c12e1a0bc21e283c131cea1c66d68857d28\ + \b7b2fce0a6fbc40c164852121bc0c62d0000000000160014cc1b07838e387deacd\ + \0e5232e1e8b49f4c29e484a69f6a00000000002200204adb4e2f00643db396dd12\ + \0d4e7dc17625f5f2c11a40d857accc862d6b7dd80e040047304402200d10bf5bc5\ + \397fc59d7188ae438d80c77575595a2d488e41bd6363a810cc8d72022012b57e71\ + \4fbbfdf7a28c47d5b370cb8ac37c8545f596216e5b21e9b236ef457c0147304402\ + \207d0870964530f97b62497b11153c551dca0a1e226815ef0a336651158da0f824\ + \02200f5378beee0e77759147b8a0a284decd11bfd2bc55c8fafa41c134fe996d43\ + \c801475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8e\ + \fe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6\ + \d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 1 0 + "020000000001014bdccf28653066a2c554cafeffdfe1e678e64a69b056684d\ + \eb0c4fba909423ec000000000000000000011f070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100b470fe12e5b7fea9eccb8cbff1972cea4f96758041898982\ + \a02bcc7f9d56d50b0220338a75b2afaab4ec00cdd2d9273c68c7581ff5a28b\ + \cbb40c4d138b81f1d45ce501473044022017b90c65207522a907fb6a137f9d\ + \d528b3389465a8ae72308d9e1d564f512cf402204fc917b4f0e88604a3e994\ + \f85bfae7c7c1f9d9e9f78e8cd112e0889720d9405b01200101010101010101\ + \0101010101010101010101010101010101010101010101018a76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f501b175ac686800000000" + , HtlcTxVector HtlcTimeout 6 1 + "020000000001014bdccf28653066a2c554cafeffdfe1e678e64a69b056684d\ + \eb0c4fba909423ec01000000000000000001e1120000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100b575379f6d8743cb0087648f81cfd82d17a97fbf8f67e058\ + \c65ce8b9d25df9500220554a210d65b02d9f36c6adf0f639430ca8293196ba\ + \5089bf67cc3a9813b7b00a01483045022100ee2e16b90930a479b13f8823a7\ + \f14b600198c838161160b9436ed086d3fc57e002202a66fa2324f342a17129\ + \949c640bfe934cbc73a869ba7c06aa25c5a3d0bfb53d01008576a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a9142002cc93ebefbb1b73f0af055dcc27a0b504ad7688\ + \ac6868f9010000" + , HtlcTxVector HtlcTimeout 5 2 + "020000000001014bdccf28653066a2c554cafeffdfe1e678e64a69b056684d\ + \eb0c4fba909423ec02000000000000000001e1120000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220471c9f3ad92e49b13b7b8059f43ecf8f7887b0dccbb9fdb54b\ + \fe23d62a8ae332022024bd22fae0740e86a44228c35330da9526fd7306dffb\ + \2b9dc362d5e78abef7cc0147304402207157f452f2506d73c3151923118938\ + \00cfb3cc235cc1185b1cfcc136b55230db022014be242dbc6c5da141fec403\ + \4e7f387f74d6ff1899453d72ba957467540e1ecb01008576a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9142002cc93ebefbb1b73f0af055dcc27a0b504ad7688ac68\ + \68fa010000" + ] + } + ] + +-- Appendix D ----------------------------------------------------------------- + +-- | Appendix D storage vectors (seed 0xFF..FF; incorrect entries are +-- seeded with 0x00..00). +appendix_d_storage :: [StorageVector] +appendix_d_storage = [ + StorageVector + { sv_name = + "insert_secret correct sequence" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 True + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + , StorageStep 281474976710651 True + "c65716add7aa98ba7acb236352d665cab17345fe45b55fb879ff80e6bd0c41dd" + , StorageStep 281474976710650 True + "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2" + , StorageStep 281474976710649 True + "a5a64476122ca0925fb344bdc1854c1c0a59fc614298e50a33e331980a220f32" + , StorageStep 281474976710648 True + "05cde6323d949933f7f7b78776bcc1ea6d9b31447732e3802e1f7ac44b650e17" + ] + } + , StorageVector + { sv_name = + "insert_secret #1 incorrect" + , sv_steps = [ + StorageStep 281474976710655 True + "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148" + , StorageStep 281474976710654 False + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + ] + } + , StorageVector + { sv_name = + "insert_secret #2 incorrect (#1 derived from incorrect)" + , sv_steps = [ + StorageStep 281474976710655 True + "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148" + , StorageStep 281474976710654 True + "dddc3a8d14fddf2b68fa8c7fbad2748274937479dd0f8930d5ebb4ab6bd866a3" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 False + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + ] + } + , StorageVector + { sv_name = + "insert_secret #3 incorrect" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "c51a18b13e8527e579ec56365482c62f180b7d5760b46e9477dae59e87ed423a" + , StorageStep 281474976710652 False + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + ] + } + , StorageVector + { sv_name = + "insert_secret #4 incorrect (1,2,3 derived from incorrect)" + , sv_steps = [ + StorageStep 281474976710655 True + "02a40c85b6f28da08dfdbe0926c53fab2de6d28c10301f8f7c4073d5e42e3148" + , StorageStep 281474976710654 True + "dddc3a8d14fddf2b68fa8c7fbad2748274937479dd0f8930d5ebb4ab6bd866a3" + , StorageStep 281474976710653 True + "c51a18b13e8527e579ec56365482c62f180b7d5760b46e9477dae59e87ed423a" + , StorageStep 281474976710652 True + "ba65d7b0ef55a3ba300d4e87af29868f394f8f138d78a7011669c79b37b936f4" + , StorageStep 281474976710651 True + "c65716add7aa98ba7acb236352d665cab17345fe45b55fb879ff80e6bd0c41dd" + , StorageStep 281474976710650 True + "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2" + , StorageStep 281474976710649 True + "a5a64476122ca0925fb344bdc1854c1c0a59fc614298e50a33e331980a220f32" + , StorageStep 281474976710648 False + "05cde6323d949933f7f7b78776bcc1ea6d9b31447732e3802e1f7ac44b650e17" + ] + } + , StorageVector + { sv_name = + "insert_secret #5 incorrect" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 True + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + , StorageStep 281474976710651 True + "631373ad5f9ef654bb3dade742d09504c567edd24320d2fcd68e3cc47e2ff6a6" + , StorageStep 281474976710650 False + "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2" + ] + } + , StorageVector + { sv_name = + "insert_secret #6 incorrect (5 derived from incorrect)" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 True + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + , StorageStep 281474976710651 True + "631373ad5f9ef654bb3dade742d09504c567edd24320d2fcd68e3cc47e2ff6a6" + , StorageStep 281474976710650 True + "b7e76a83668bde38b373970155c868a653304308f9896692f904a23731224bb1" + , StorageStep 281474976710649 True + "a5a64476122ca0925fb344bdc1854c1c0a59fc614298e50a33e331980a220f32" + , StorageStep 281474976710648 False + "05cde6323d949933f7f7b78776bcc1ea6d9b31447732e3802e1f7ac44b650e17" + ] + } + , StorageVector + { sv_name = + "insert_secret #7 incorrect" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 True + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + , StorageStep 281474976710651 True + "c65716add7aa98ba7acb236352d665cab17345fe45b55fb879ff80e6bd0c41dd" + , StorageStep 281474976710650 True + "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2" + , StorageStep 281474976710649 True + "e7971de736e01da8ed58b94c2fc216cb1dca9e326f3a96e7194fe8ea8af6c0a3" + , StorageStep 281474976710648 False + "05cde6323d949933f7f7b78776bcc1ea6d9b31447732e3802e1f7ac44b650e17" + ] + } + , StorageVector + { sv_name = + "insert_secret #8 incorrect" + , sv_steps = [ + StorageStep 281474976710655 True + "7cc854b54e3e0dcdb010d7a3fee464a9687be6e8db3be6854c475621e007a5dc" + , StorageStep 281474976710654 True + "c7518c8ae4660ed02894df8976fa1a3659c1a8b4b5bec0c4b872abeba4cb8964" + , StorageStep 281474976710653 True + "2273e227a5b7449b6e70f1fb4652864038b1cbf9cd7c043a7d6456b7fc275ad8" + , StorageStep 281474976710652 True + "27cddaa5624534cb6cb9d7da077cf2b22ab21e9b506fd4998a51d54502e99116" + , StorageStep 281474976710651 True + "c65716add7aa98ba7acb236352d665cab17345fe45b55fb879ff80e6bd0c41dd" + , StorageStep 281474976710650 True + "969660042a28f32d9be17344e09374b379962d03db1574df5a8a5a47e19ce3f2" + , StorageStep 281474976710649 True + "a5a64476122ca0925fb344bdc1854c1c0a59fc614298e50a33e331980a220f32" + , StorageStep 281474976710648 False + "a7efbc61aac46d34f77778bac22c8a20c6a46ca460addc49009bda875ec88fa4" + ] + } + ] + +-- Appendix F ----------------------------------------------------------------- + +-- | Appendix F (anchors) commitment vectors. +appendix_f :: [CommitVector] +appendix_f = [ + CommitVector + { cv_name = + "simple commitment tx with no HTLCs" + , cv_to_local_msat = 7000000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 15000 + , cv_dust_limit_sat = 546 + , cv_htlcs = [] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80044a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994c0c62d0000000000220020f3394e1e619b0eca1f91be2fb5ab4dfc59ba5b\ + \84ebe014ad1d43a564d012994a508b6a00000000002200204adb4e2f00643db396\ + \dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e04004830450221008266\ + \ac6db5ea71aac3c95d97b0e172ff596844851a3216eb88382a8dddfd33d2022050\ + \e240974cfd5d708708b4365574517c18e7ae535ef732a3484d43d0d82be9f70148\ + \3045022100f89034eba16b2be0e5581f750a0a6309192b75cce0f202f0ee2b4ec0\ + \cc394850022076c65dc507fe42276152b7a3d90e961e678adbe966e916ecfe85e6\ + \4d430e75f301475221023da092f6980e58d2c037173180e9a465476026ee50f966\ + \95963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385\ + \a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "simple commitment tx with no HTLCs and single anchor" + , cv_to_local_msat = 10000000000 + , cv_to_remote_msat = 0 + , cv_feerate_per_kw = 15000 + , cv_dust_limit_sat = 546 + , cv_htlcs = [] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80024a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f10529800000000\ + \002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b\ + \7dd80e0400473044022007cf6b405e9c9b4f527b0ecad9d8bb661fabb8b12abf7d\ + \1c0b3ad1855db3ed490220616d5c1eeadccc63bd775a131149455d62d95a42c2a1\ + \b01cc7821fc42dce7778014730440220655bf909fb6fa81d086f1336ac72c97906\ + \dce29d1b166e305c99152d810e26e1022051f577faa46412c46707aaac46b65d50\ + \053550a66334e00a44af2706f27a865801475221023da092f6980e58d2c0371731\ + \80e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d\ + \66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with seven outputs untrimmed" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 644 + , cv_dust_limit_sat = 546 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80094a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994e80300000000000022002010f88bf09e56f14fb4543fd26e47b0db50ea5d\ + \e9cf3fc46434792471082621aed0070000000000002200203e68115ae0b15b8de7\ + \5b6c6bc9af5ac9f01391544e0870dae443a1e8fe7837ead0070000000000002200\ + \20fe0598d74fee2205cc3672e6e6647706b4f3099713b4661b62482c3addd04a5e\ + \b80b000000000000220020f96d0334feb64a4f40eb272031d07afcb038db56aa57\ + \446d60308c9f8ccadef9a00f000000000000220020ce6e751274836ff59622a0d1\ + \e07f8831d80bd6730bd48581398bfadd2bb8da9ac0c62d0000000000220020f339\ + \4e1e619b0eca1f91be2fb5ab4dfc59ba5b84ebe014ad1d43a564d012994a4f996a\ + \00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857ac\ + \cc862d6b7dd80e0400483045022100ef82a405364bfc4007e63a7cc82925a513d7\ + \9065bdbc216d60b6a4223a323f8a02200716730b8561f3c6d362eaf47f202e99fb\ + \30d0557b61b92b5f9134f8e2de368101483045022100e0106830467a558c07544a\ + \3de7715610c1147062e7d091deeebe8b5c661cda9402202ad049c1a6d04834317a\ + \78483f723c205c9f638d17222aafc620800cc1b6ae3501475221023da092f6980e\ + \58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d\ + \2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 0 2 + "02000000000101b8cefef62ea66f5178b9361b2371be0759cbc8c689bcfa7a\ + \8e6746d497ec221a02000000000100000001e8030000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220746dc89a593e1b50915db63359b50c3c404f8324f78075c877\ + \08c866ccefda2502202a11062012dc8607b17e8c46ea4eefdfcc6b89a35440\ + \de99432ba12788d7bb1783473044022036f77f88b49bd03dc16d3a015efcc7\ + \acffc2a93b213324035d77a716f79013ff02203c218eb882a40402a8bb05db\ + \b751a442345a4e56307be76b214b6d4db9ed3c920120000000000000000000\ + \00000000000000000000000000000000000000000000008d76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc688527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f401b175ac6851b2756800000000" + , HtlcTxVector HtlcTimeout 2 3 + "02000000000101b8cefef62ea66f5178b9361b2371be0759cbc8c689bcfa7a\ + \8e6746d497ec221a03000000000100000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100a847bc3b8cf2441013725ae32dc589c419835d069afd6d7f\ + \3d9834d8be7cea6e02204ce9d35ec7f0788da80e4d62e810c4ccd13617e58f\ + \a10832e38fb7ae87bdf33883473044022026739b1adbfa34c485bf0e5a19e0\ + \cf7532f64545bcc5c95b95643ccc2d351e1902201743bb1b34f00e031cc15f\ + \6eff0f8ab764508d2681ff965ba62e76e540bca1e801008876a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188ac\ + \6851b27568f6010000" + , HtlcTxVector HtlcSuccess 1 4 + "02000000000101b8cefef62ea66f5178b9361b2371be0759cbc8c689bcfa7a\ + \8e6746d497ec221a04000000000100000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022035977f2aa6d6ae12f1dae3366440faa17558e9c88c3188bfc8\ + \df7e276c6c65410220659f1f9070c725d9d46e43b99a36fc6d711d36069704\ + \add2d57fc1fa2818cf12834730440220191ba44e57b1601a59d99f85971d48\ + \01b286d428de275487c87ceeb8df1a4811022002215875d92833df0c9615c9\ + \096cf97152f87139ed9f82718bbb5b8b3d3125240120010101010101010101\ + \01010101010101010101010101010101010101010101018d76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \4b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f501b175ac6851b2756800000000" + , HtlcTxVector HtlcTimeout 3 5 + "02000000000101b8cefef62ea66f5178b9361b2371be0759cbc8c689bcfa7a\ + \8e6746d497ec221a05000000000100000001b80b0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022002f3ff9a31270092c214d3d5b8b4f826599404bba64b87f753\ + \6ef6324d41551b022079dc4cb25f7ecd84b49f5cce03eae7e2655b59f39d54\ + \3765daef0d4f11c93fa283483045022100f03047e38bc0aae2d80d53424b8c\ + \1d1b8139120e2bf09ad31a2803978745e6e102205b74c0eef0b472710b98c7\ + \7e619ee9d0cc47a9dd786f4f214a564f44d79f9b9a01008876a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c82012087647552\ + \7c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b\ + \140639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac\ + \6851b27568f7010000" + , HtlcTxVector HtlcSuccess 4 6 + "02000000000101b8cefef62ea66f5178b9361b2371be0759cbc8c689bcfa7a\ + \8e6746d497ec221a06000000000100000001a00f0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220547937564288f64fb3e3c945a1348b912471f0c1c4cc7dc8ce\ + \ca15a4cbd299b6022053c4f8e30832b13dfbe31e4091e313428625e0b5ac61\ + \eecba93f8f11c1e2622583473044022022604660234aef9bd21284598ec50f\ + \070ac82a3a0152e0af5e98a02cd6e8976f022042b0b9112ee00806b856dff6\ + \de52a82c98b036a4fe14bb5fd2926725e2fc81910120040404040404040404\ + \04040404040404040404040404040404040404040404048d76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \18bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f801b175ac6851b2756800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with six outputs untrimmed (minimum dust limit)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 645 + , cv_dust_limit_sat = 1001 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80084a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994d0070000000000002200203e68115ae0b15b8de75b6c6bc9af5ac9f01391\ + \544e0870dae443a1e8fe7837ead007000000000000220020fe0598d74fee2205cc\ + \3672e6e6647706b4f3099713b4661b62482c3addd04a5eb80b0000000000002200\ + \20f96d0334feb64a4f40eb272031d07afcb038db56aa57446d60308c9f8ccadef9\ + \a00f000000000000220020ce6e751274836ff59622a0d1e07f8831d80bd6730bd4\ + \8581398bfadd2bb8da9ac0c62d0000000000220020f3394e1e619b0eca1f91be2f\ + \b5ab4dfc59ba5b84ebe014ad1d43a564d012994abc996a00000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e040048\ + \3045022100d57697c707b6f6d053febf24b98e8989f186eea42e37e9e91663ec2c\ + \70bb8f70022079b0715a472118f262f43016a674f59c015d9cafccec885968e76d\ + \9d9c5d005101473044022025d97466c8049e955a5afce28e322f4b34d2561118e5\ + \2332fb400f9b908cc0a402205dc6fba3a0d67ee142c428c535580cd1f2ff42e2f8\ + \9b47e0c8a01847caffc31201475221023da092f6980e58d2c037173180e9a46547\ + \6026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce\ + \504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 2 2 + "02000000000101104f394af4c4fad78337f95e3e9f802f4c0d86ab231853af\ + \09b285348561320002000000000100000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100e04d160a326432659fe9fb127304c1d348dfeaba840081bd\ + \c57d8efd902a48d8022008a824e7cf5492b97e4d9e03c06a09f822775a44f6\ + \b5b2533a2088904abfc28283483045022100b7c49846466b13b190ff739bbe\ + \3005c105482fc55539e55b1c561f76b6982b6c02200e5c35808619cf543c84\ + \05cff9fedd25f333a4a2f6f6d5e8af8150090c40ef0901008876a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a914b43e1b38138a41b37f7cd9a1d274bc63e3a9b5d188\ + \ac6851b27568f6010000" + , HtlcTxVector HtlcSuccess 1 3 + "02000000000101104f394af4c4fad78337f95e3e9f802f4c0d86ab231853af\ + \09b285348561320003000000000100000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100fbdc3c367ce3bf30796025cc590ee1f2ce0e72ae1ac19f59\ + \86d6d0a4fc76211f02207e45ae9267e8e820d188569604f71d1abd11bd385d\ + \58853dd7dc034cdb3e9a6e83483045022100d29330f24db213b26206870609\ + \9b39c15fa7e070c3fcdf8836c09723fc4d365602203ce57d01e9f28601e461\ + \a0b5c4a50119b270bde8b70148d133a6849c70b115ac012001010101010101\ + \010101010101010101010101010101010101010101010101018d76a9141401\ + \1f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2\ + \a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763\ + \a9144b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a46\ + \946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67\ + \7502f501b175ac6851b2756800000000" + , HtlcTxVector HtlcTimeout 3 4 + "02000000000101104f394af4c4fad78337f95e3e9f802f4c0d86ab231853af\ + \09b285348561320004000000000100000001b80b0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022066c5ef625cee3ddd2bc7b6bfb354b5834cf1cc6d52dd972fb4\ + \1b7b225437ae4a022066cb85647df65c6b87a54e416dcdcca778a776c36a96\ + \43d2b5dc793c9b29f4c18347304402202d4ce515cd9000ec37575972d70b8d\ + \24f73909fb7012e8ebd8c2066ef6fe187902202830b53e64ea565fecd0f398\ + \100691da6bb2a5cf9bb0d1926f1d71d05828a11e01008876a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac68\ + \51b27568f7010000" + , HtlcTxVector HtlcSuccess 4 5 + "02000000000101104f394af4c4fad78337f95e3e9f802f4c0d86ab231853af\ + \09b285348561320005000000000100000001a00f0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022022c7e11595c53ee89a57ca76baf0aed730da035952d6ab3fe6\ + \459f5eff3b337a022075e10cc5f5fd724a35ce4087a5d03cd616698626c698\ + \14032132b50bb97dc61583483045022100b20cd63e0587d1711beaebda4730\ + \775c4ac8b8b2ec78fe18a0c44c3f168c25230220079abb7fc4924e2fca5950\ + \842e5b9e416735585026914570078c4ef62f28622601200404040404040404\ + \0404040404040404040404040404040404040404040404048d76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac6851b2756800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with four outputs untrimmed (minimum dust limit)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 2185 + , cv_dust_limit_sat = 2001 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80064a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994b80b000000000000220020f96d0334feb64a4f40eb272031d07afcb038db\ + \56aa57446d60308c9f8ccadef9a00f000000000000220020ce6e751274836ff596\ + \22a0d1e07f8831d80bd6730bd48581398bfadd2bb8da9ac0c62d00000000002200\ + \20f3394e1e619b0eca1f91be2fb5ab4dfc59ba5b84ebe014ad1d43a564d012994a\ + \c5916a00000000002200204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40\ + \d857accc862d6b7dd80e0400483045022100cd8479cfe1edb1e5a1d487391e0451\ + \a469c7171e51e680183f19eb4321f20e9b02204eab7d5a6384b1b08e03baa6e4d9\ + \748dfd2b5ab2bae7e39604a0d0055bbffdd501473044022040f63a16148cf35c8d\ + \3d41827f5ae7f7c3746885bb64d4d1b895892a83812b3e02202fcf95c2bf02c466\ + \163b3fa3ced6a24926fbb4035095a96842ef516e86ba54c001475221023da092f6\ + \980e58d2c037173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b\ + \623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e19\ + \5220" + , cv_htlc_txs = [ + HtlcTxVector HtlcTimeout 3 2 + "02000000000101ac13a7715f80b8e52dda43c6929cade5521bdced3a405da0\ + \2b443f1ffb1e33cc02000000000100000001b80b0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402206870514a72ad6e723ff7f1e0370d7a33c1cd2a0b9272674143\ + \ebaf6a1d02dee102205bd953c34faf5e7322e9a1c0103581cb090280fda4f1\ + \039ee8552668afa90ebb834730440220669de9ca7910eff65a7773ebd14a9f\ + \c371fe88cde5b8e2a81609d85c87ac939b02201ac29472fa4067322e92d75b\ + \624942d60be5050139b20bb363db75be79eb946f01008876a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9148a486ff2e31d6158bf39e2608864d63fefd09d5b88ac68\ + \51b27568f7010000" + , HtlcTxVector HtlcSuccess 4 3 + "02000000000101ac13a7715f80b8e52dda43c6929cade5521bdced3a405da0\ + \2b443f1ffb1e33cc03000000000100000001a00f0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100949e8dd938da56445b1cdfdebe1b7efea086edd05d89910d\ + \205a1e2e033ce47102202cbd68b5262ab144d9ec12653f87dfb0bb6bd05d1f\ + \58ae1e523f028eaefd727183483045022100e3104ed8b239f8019e5f0a1a73\ + \d7782a94a8c36e7984f476c3a0b3cb0e62e27902207e3d52884600985f8a20\ + \98e53a5c30dd6a5e857733acfaa07ab2162421ed2688012004040404040404\ + \040404040404040404040404040404040404040404040404048d76a9141401\ + \1f7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2\ + \a8122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763\ + \a91418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a46\ + \946384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae67\ + \7502f801b175ac6851b2756800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with three outputs untrimmed (minimum dust limit)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 3687 + , cv_dust_limit_sat = 3001 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80054a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994a00f000000000000220020ce6e751274836ff59622a0d1e07f8831d80bd6\ + \730bd48581398bfadd2bb8da9ac0c62d0000000000220020f3394e1e619b0eca1f\ + \91be2fb5ab4dfc59ba5b84ebe014ad1d43a564d012994aa28b6a00000000002200\ + \204adb4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e\ + \0400483045022100c970799bcb33f43179eb43b3378a0a61991cf2923f69b36ef1\ + \2548c3df0e6d500220413dc27d2e39ee583093adfcb7799be680141738babb31cc\ + \7b0669a777a31f5d01483045022100ad6c71569856b2d7ff42e838b4abe74a7134\ + \26b37f22fa667a195a4c88908c6902202b37272b02a42dc6d9f4f82cab3eaf84ac\ + \882d9ed762859e1e75455c2c22837701475221023da092f6980e58d2c037173180\ + \e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66\ + \d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 4 2 + "02000000000101542562b326c08e3a076d9cfca2be175041366591da334d8d\ + \513ff1686fd95a6002000000000100000001a00f0000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00473044022017b558a3cf5f0cb94269e2e927b29ed22bd2416abb8a7ce6de\ + \4d1256f359b93602202e9ca2b1a23ea3e69f433c704e327739e219804b8c18\ + \8b1d52f74fd5a9de954c83483045022100af7a8b7c7ff2080c68995254cb66\ + \d64d9954edcc5baac3bb4f27ed2d29aaa6120220421c27da7a60574a9263f2\ + \71e0f3bd34594ec6011095190022b3b54596ea03de01200404040404040404\ + \0404040404040404040404040404040404040404040404048d76a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a9\ + \1418bc1a114ccf9c052d3d23e28d3b0a9d1227434288527c21030d417a4694\ + \6384f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae6775\ + \02f801b175ac6851b2756800000000" + ] + } + , CommitVector + { cv_name = + "commitment tx with two outputs untrimmed (minimum dust limit)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 4894 + , cv_dust_limit_sat = 4001 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80044a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994c0c62d0000000000220020f3394e1e619b0eca1f91be2fb5ab4dfc59ba5b\ + \84ebe014ad1d43a564d012994ad0886a00000000002200204adb4e2f00643db396\ + \dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e04004830450221009f16\ + \ac85d232e4eddb3fcd750a68ebf0b58e3356eaada45d3513ede7e817bf4c02207c\ + \2b043b4e5f971261975406cb955219fa56bffe5d834a833694b5abc1ce4cfd0148\ + \3045022100e784a66b1588575801e237d35e510fd92a81ae3a4a2a1b90c031ad80\ + \3d07b3f3022021bc5f16501f167607d63b681442da193eb0a76b4b7fd25c2ed4f8\ + \b28fd35b9501475221023da092f6980e58d2c037173180e9a465476026ee50f966\ + \95963e8efe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385\ + \a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with one output untrimmed (minimum dust limit)" + , cv_to_local_msat = 6988000000 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 6216010 + , cv_dust_limit_sat = 4001 + , cv_htlcs = [0, 1, 2, 3, 4] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80024a01000000000000220020e9e86e4823fa\ + \a62e222ebc858a226636856158f07e69898da3b0d1af0ddb3994c0c62d00000000\ + \00220020f3394e1e619b0eca1f91be2fb5ab4dfc59ba5b84ebe014ad1d43a564d0\ + \12994a04004830450221009ad80792e3038fe6968d12ff23e6888a565c3ddd0650\ + \37f357445f01675d63f3022018384915e5f1f4ae157e15debf4f49b61c8d9d2b07\ + \3c7d6f97c4a68caa3ed4c1014830450221008fd5dbff02e4b59020d4cd23a3c30d\ + \3e287065fda75a0a09b402980adf68ccda022001e0b8b620cd915ddff11f1de32a\ + \ddf23d81d51b90e6841b2cb8dcaf3faa5ecf01475221023da092f6980e58d2c037\ + \173180e9a465476026ee50f96695963e8efe436f54eb21030e9f7b623d2ccc7c9b\ + \d44d66d5ce21ce504c0acf6385a132cec6d3c39fa711c152ae3e195220" + , cv_htlc_txs = [] + } + , CommitVector + { cv_name = + "commitment tx with 3 htlc outputs, 2 offered having the same \ + \amount and preimage" + , cv_to_local_msat = 6987999999 + , cv_to_remote_msat = 3000000000 + , cv_feerate_per_kw = 253 + , cv_dust_limit_sat = 546 + , cv_htlcs = [1, 5, 6] + , cv_commit_tx = + "02000000000101bef67e4e2fb9ddeeb3461973cd4c62abb35050b1add772995b82\ + \0b584a488489000000000038b02b80074a010000000000002200202b1b5854183c\ + \12d3316565972c4668929d314d81c5dcdbb21cb45fe8a9a8114f4a010000000000\ + \00220020e9e86e4823faa62e222ebc858a226636856158f07e69898da3b0d1af0d\ + \db3994d007000000000000220020fe0598d74fee2205cc3672e6e6647706b4f309\ + \9713b4661b62482c3addd04a5e881300000000000022002018e40f9072c44350f1\ + \34bdc887bab4d9bdfc8aa468a25616c80e21757ba5dac788130000000000002200\ + \2018e40f9072c44350f134bdc887bab4d9bdfc8aa468a25616c80e21757ba5dac7\ + \c0c62d0000000000220020f3394e1e619b0eca1f91be2fb5ab4dfc59ba5b84ebe0\ + \14ad1d43a564d012994aad9c6a00000000002200204adb4e2f00643db396dd120d\ + \4e7dc17625f5f2c11a40d857accc862d6b7dd80e0400483045022100b4014970d9\ + \d7962853f3f85196144671d7d5d87426250f0a5fdaf9a55292e92502205360910c\ + \9abb397467e19dbd63d081deb4a3240903114c98cec0a23591b79b760147304402\ + \2027b38dfb654c34032ffb70bb43022981652fce923cbbe3cbe7394e2ade8b3423\ + \0220584195b78da6e25c2e8da6b4308d9db25b65b64975db9266163ef592abb7c7\ + \2501475221023da092f6980e58d2c037173180e9a465476026ee50f96695963e8e\ + \fe436f54eb21030e9f7b623d2ccc7c9bd44d66d5ce21ce504c0acf6385a132cec6\ + \d3c39fa711c152ae3e195220" + , cv_htlc_txs = [ + HtlcTxVector HtlcSuccess 1 2 + "020000000001013d060d0305c9616eaabc21d41fae85bcb5477b5d7f1c92aa\ + \429cf15339bbe1c402000000000100000001d0070000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \004730440220078fe5343dab88c348a3a8a9c1a9293259dbf35507ae971702\ + \cc39dd623ea9af022011ed0c0f35243cd0bb4d9ca3c772379b2b5f4af93140\ + \e9fdc5600dfec1cdb0c28347304402205df665e2908c7690d2d33eb70e6e11\ + \9958c28febe141a94ed0dd9a55ce7c8cfc0220364d02663a5d019af35c5cd5\ + \fda9465d985d85bbd12db207738d61163449a4240120010101010101010101\ + \01010101010101010101010101010101010101010101018d76a91414011f72\ + \54d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a812\ + \2cc726e9dded053a2184d88256816826d6231c068d4a5b7c8201208763a914\ + \4b6b2e5444c2639cc0fb7bcea5afba3f3cdce23988527c21030d417a469463\ + \84f88d5f3337267c5e579765875dc4daca813e21734b140639e752ae677502\ + \f501b175ac6851b2756800000000" + , HtlcTxVector HtlcTimeout 6 3 + "020000000001013d060d0305c9616eaabc21d41fae85bcb5477b5d7f1c92aa\ + \429cf15339bbe1c40300000000010000000188130000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \0047304402202df6bf0f98a42cfd0172a16bded7d1b16c14f5f42ba23f5c54\ + \648c14b647531302200fe1508626817f23925bb56951d5e4b2654c751743ab\ + \6db48a6cce7dda17c01c8347304402203f99ec05cdd89558a23683b471c1dc\ + \ce8f6a92295f1fff3b0b5d21be4d4f97ea022019d29070690fc2c126fe27cc\ + \4ab2f503f289d362721b2efa7418e7fddb939a5b01008876a91414011f7254\ + \d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8122c\ + \c726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475527c\ + \21030d417a46946384f88d5f3337267c5e579765875dc4daca813e21734b14\ + \0639e752ae67a9142002cc93ebefbb1b73f0af055dcc27a0b504ad7688ac68\ + \51b27568f9010000" + , HtlcTxVector HtlcTimeout 5 4 + "020000000001013d060d0305c9616eaabc21d41fae85bcb5477b5d7f1c92aa\ + \429cf15339bbe1c40400000000010000000188130000000000002200204adb\ + \4e2f00643db396dd120d4e7dc17625f5f2c11a40d857accc862d6b7dd80e05\ + \00483045022100bd206b420c495f3aa714d3ea4766cbe95441deacb5d2f737\ + \f1913349aee7c2ae02200249d2c950dd3b15326bf378ae5d2b871d33d6737f\ + \5d70735f3de8383140f2a183483045022100f2cd35e385b9b7e15b92a5d78d\ + \120b6b2c5af4e974bc01e884c5facb3bb5966c0220706e0506477ce809a400\ + \22d6de8e041e9ef13136c45abee9c36f58a01fdb188b01008876a91414011f\ + \7254d96b819c76986c277d115efce6f7b58763ac67210394854aa6eab5b2a8\ + \122cc726e9dded053a2184d88256816826d6231c068d4a5b7c820120876475\ + \527c21030d417a46946384f88d5f3337267c5e579765875dc4daca813e2173\ + \4b140639e752ae67a9142002cc93ebefbb1b73f0af055dcc27a0b504ad7688\ + \ac6851b27568fa010000" + ] + } + ]