@@ -18,7 +18,7 @@ package fr.acinq.eclair.wire.protocol
1818
1919import com .google .common .base .Charsets
2020import fr .acinq .bitcoin .scalacompat .Crypto .{PrivateKey , PublicKey }
21- import fr .acinq .bitcoin .scalacompat .{Block , BlockHash , ByteVector32 , ByteVector64 , OutPoint , SatoshiLong , Script , ScriptWitness , Transaction , TxId }
21+ import fr .acinq .bitcoin .scalacompat .{Block , BlockHash , ByteVector32 , ByteVector64 , OutPoint , SatoshiLong , Script , ScriptWitness , Transaction , TxHash , TxId }
2222import fr .acinq .eclair .FeatureSupport .Optional
2323import fr .acinq .eclair .Features .DataLossProtect
2424import fr .acinq .eclair .TestUtils .randomTxId
@@ -366,6 +366,34 @@ class LightningMessageCodecsSpec extends AnyFunSuite {
366366 }
367367 }
368368
369+ test(" encode/decode splice messages" ) {
370+ val channelId = ByteVector32 (hex " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " )
371+ val fundingTxId = TxId (TxHash (ByteVector32 (hex " 24e1b2c94c4e734dd5b9c5f3c910fbb6b3b436ced6382c7186056a5a23f14566 " )))
372+ val fundingPubkey = PublicKey (hex " 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " )
373+ val fundingRate = LiquidityAds .FundingRate (100_000 .sat, 100_000 .sat, 400 , 150 , 0 .sat, 0 .sat)
374+ val testCases = Seq (
375+ // @formatter:off
376+ SpliceInit (channelId, 100_000 sat, FeeratePerKw (2500 sat), 100 , fundingPubkey) -> hex " 9088 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 00000000000186a0 000009c4 00000064 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
377+ SpliceInit (channelId, 150_000 sat, 100 , FeeratePerKw (2500 sat), fundingPubkey, 25_000_000 msat, requireConfirmedInputs = false , None ) -> hex " 9088 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 00000000000249f0 000009c4 00000064 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fe4700000704017d7840 " ,
378+ SpliceInit (channelId, 0 sat, FeeratePerKw (500 sat), 0 , fundingPubkey) -> hex " 9088 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0000000000000000 000001f4 00000000 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
379+ SpliceInit (channelId, (- 50_000 ).sat, FeeratePerKw (500 sat), 0 , fundingPubkey) -> hex " 9088 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ffffffffffff3cb0 000001f4 00000000 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
380+ SpliceInit (channelId, 100_000 sat, 100 , FeeratePerKw (2500 sat), fundingPubkey, 0 msat, requireConfirmedInputs = false , Some (LiquidityAds .RequestFunding (100_000 sat, fundingRate, LiquidityAds .PaymentDetails .FromChannelBalance ))) -> hex " 9088 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 00000000000186a0 000009c4 00000064 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fd053b1e00000000000186a0000186a0000186a00190009600000000000000000000 " ,
381+ SpliceAck (channelId, 25_000 sat, fundingPubkey) -> hex " 908a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 00000000000061a8 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
382+ SpliceAck (channelId, 40_000 sat, fundingPubkey, 10_000_000 msat, requireConfirmedInputs = false , None ) -> hex " 908a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0000000000009c40 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fe4700000703989680 " ,
383+ SpliceAck (channelId, 0 sat, fundingPubkey) -> hex " 908a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0000000000000000 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
384+ SpliceAck (channelId, (- 25_000 ).sat, fundingPubkey) -> hex " 908a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ffffffffffff9e58 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 " ,
385+ SpliceAck (channelId, 25_000 sat, fundingPubkey, 0 msat, requireConfirmedInputs = false , Some (LiquidityAds .WillFund (fundingRate, hex " deadbeef " , ByteVector64 .Zeroes ))) -> hex " 908a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 00000000000061a8 0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 fd053b5a000186a0000186a00190009600000000000000000004deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 " ,
386+ SpliceLocked (channelId, fundingTxId) -> hex " 908c aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 24e1b2c94c4e734dd5b9c5f3c910fbb6b3b436ced6382c7186056a5a23f14566 " ,
387+ // @formatter:on
388+ )
389+ testCases.foreach { case (message, bin) =>
390+ val decoded = lightningMessageCodec.decode(bin.bits).require.value
391+ assert(decoded == message)
392+ val encoded = lightningMessageCodec.encode(message).require.bytes
393+ assert(encoded == bin)
394+ }
395+ }
396+
369397 test(" encode/decode closing_signed" ) {
370398 val defaultSig = ByteVector64 (hex " 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 " )
371399 val testCases = Seq (
0 commit comments