Skip to content

Commit 1bd0dec

Browse files
committed
Fix duplicate dust HTLC amounts in Sets
We were incorrectly deduplication dust HTLCs of the same amount because `spec.htlcs` is a `Set`. We fix that and add a test vector for it.
1 parent 527991a commit 1bd0dec

File tree

3 files changed

+51
-2
lines changed

3 files changed

+51
-2
lines changed

eclair-core/src/main/scala/fr/acinq/eclair/transactions/Transactions.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1517,7 +1517,8 @@ object Transactions {
15171517
// remaining dust directly go to on-chain fees.
15181518
val trimmedLocalAmount = if (spec.toLocal < dustLimit) spec.toLocal else 0.msat
15191519
val trimmedRemoteAmount = if (spec.toRemote < dustLimit) spec.toRemote else 0.msat
1520-
val trimmedHtlcs = spec.htlcs.collect { case htlc if htlc.add.amountMsat < dustLimit => htlc.add.amountMsat }.sum
1520+
// Note the toSeq, to ensure that we don't deduplicate HTLCs that have the same amount.
1521+
val trimmedHtlcs = spec.htlcs.toSeq.collect { case htlc if htlc.add.amountMsat < dustLimit => htlc.add.amountMsat }.sum
15211522
val anchorAmount = (trimmedLocalAmount + trimmedRemoteAmount + trimmedHtlcs).truncateToSatoshi.min(ZeroFeeCommitmentFormat.maxAnchorAmount)
15221523
outputs.append(ToSharedAnchor(TxOut(anchorAmount, RedeemInfo.PayToAnchor.pubkeyScript)))
15231524
}

eclair-core/src/test/resources/bolt3-tx-test-vectors-zero-fee-commitment-format.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,55 @@
148148
"03000000000101d8211cfec4c28b189edcf7b12b739bfbc0f77e44cc6fab67e50fa23cc78481c5020000000000000000011027000000000000220020f2d298ffcfd6d899a3abada37bfc6f42ce0b7b66f3e39e903e8419ac97dca75a050047304402203a6ed1dc27298cfb030a5ff0f237b5288e263bd3cfe13ced890f3559e7c25db10220713167cc374f850a2f414dd8988f87cbfe978ba56b8c5cf690aa3c2d357a174c83483045022100c2f636b397f0fd6731b04323a0743aee902f01ac2e8bdac72548ab5380fecd0f02206ee5c57fac4c5255018bc687ae46a97a9781b7d87722d3c73b8bc93d951f713f01008576a914ef8968bbfe34ad740642784d7b1efaebfd5b23ec8763ac672103d8507a026fb30bcd48ee9c765c7346470d0d397661d43dd2eb601f661ab92a0b7c820120876475527c2103c26117339025855b87deda5e138d438b2098881a5e6f81f72a60310faef473c652ae67a91489baf9f76be304292b0314ffa9c61eb794b05dd188ac68684c0a0e00"
149149
]
150150
},
151+
{
152+
"name": "Commitment transaction with similar dust HTLCs below maximum anchor amount",
153+
"dust_limit_satoshis": 546,
154+
"to_local_msat": 7999880000,
155+
"to_remote_msat": 1999940000,
156+
"incoming_htlcs": [
157+
{
158+
"id": 0,
159+
"amount_msat": 30000,
160+
"payment_hash": "ffa4f37b6d7dc03fecaaed8d36ebbea6d199e820e386e4549a69ce733f39f29f",
161+
"cltv_expiry": 920125
162+
},
163+
{
164+
"id": 1,
165+
"amount_msat": 30000,
166+
"payment_hash": "72c9386ba5a9d97b821d855930236d39c48dab5b1c2efe9ada44e2fbadcff983",
167+
"cltv_expiry": 920125
168+
}
169+
],
170+
"outgoing_htlcs": [
171+
{
172+
"id": 0,
173+
"amount_msat": 30000,
174+
"payment_hash": "29a74a69c5941d402838f7e1a95c2b2ec534d79524b2582f48df7bc519ebaecf",
175+
"cltv_expiry": 920125
176+
},
177+
{
178+
"id": 1,
179+
"amount_msat": 30000,
180+
"payment_hash": "1a04764fd402b5557cba89ec3c4d8931b0225d6436923c65c079ce64a55084c4",
181+
"cltv_expiry": 920125
182+
},
183+
{
184+
"id": 2,
185+
"amount_msat": 30000,
186+
"payment_hash": "29a74a69c5941d402838f7e1a95c2b2ec534d79524b2582f48df7bc519ebaecf",
187+
"cltv_expiry": 920125
188+
},
189+
{
190+
"id": 3,
191+
"amount_msat": 30000,
192+
"payment_hash": "29a74a69c5941d402838f7e1a95c2b2ec534d79524b2582f48df7bc519ebaecf",
193+
"cltv_expiry": 920125
194+
}
195+
],
196+
"signed_commit_tx": "03000000000101ae1e3c841378cf9e4c383bfdd033d4b3c6945e0587ff16635a00b347eea2704b0100000000340fef8003b4000000000000000451024e7344841e0000000000160014f2123f1a4b67887f2e5f02eda73e6327010152ea88117a0000000000220020f2d298ffcfd6d899a3abada37bfc6f42ce0b7b66f3e39e903e8419ac97dca75a0400473044022034f22696dd7501d65fc117af3edcfed535eb301317fe35eef08658b571fca4d0022030ff6276cff9e22968f8b08f92a1d4f2c37fe4da29de095df4841d32bdaa501b014830450221009c820c376715329110045b3cf90f59838fd2f86b16774cb5ccccbd6a62830d9602205f2d970bef2589a5e37035937ab7db0461223e429b943b38ecf577e32b7b457201475221027eb9596a68740445fb151ff37d5422e7f65f2c497c90fda63e738eb606c15bd62103bbc16dc8851bece603322f06b3c8da329401b7be7e9fdd3f3090ad19aed0807052aec50fbb20",
197+
"signed_htlc_success_txs": [],
198+
"signed_htlc_timeout_txs": []
199+
},
151200
{
152201
"name": "Commitment transaction with dust HTLCs above maximum anchor amount",
153202
"dust_limit_satoshis": 2500,

eclair-core/src/test/scala/fr/acinq/eclair/transactions/TestVectorsSpec.scala

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,6 @@ class ZeroFeeCommitmentsTestVectorSpec extends AnyFunSuite {
558558
htlcTxs.foreach(tx => Transaction.correctlySpends(tx, Seq(commitTx), ScriptFlags.STANDARD_SCRIPT_VERIFY_FLAGS))
559559
assert(htlcTxs.map(_.toString()).toSet == t.signed_htlc_success_txs.toSet ++ t.signed_htlc_timeout_txs.toSet)
560560
})
561-
562561
}
563562

564563
}

0 commit comments

Comments
 (0)