Skip to content

Commit 6722331

Browse files
committed
Add more fields to DATA_CLOSED
We also introduce a dedicated `ClosedData` trait for the `CLOSED` state, which provides a cleaner mapping between state and data.
1 parent f61c0b6 commit 6722331

File tree

13 files changed

+153
-90
lines changed

13 files changed

+153
-90
lines changed

eclair-core/src/main/scala/fr/acinq/eclair/channel/ChannelData.scala

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,8 @@ sealed trait ChannelDataWithCommitments extends PersistentChannelData {
561561
def commitments: Commitments
562562
}
563563

564+
sealed trait ClosedData extends ChannelData
565+
564566
final case class DATA_WAIT_FOR_OPEN_CHANNEL(initFundee: INPUT_INIT_CHANNEL_NON_INITIATOR) extends TransientChannelData {
565567
val channelId: ByteVector32 = initFundee.temporaryChannelId
566568
}
@@ -697,6 +699,11 @@ final case class DATA_CLOSING(commitments: Commitments,
697699

698700
final case class DATA_WAIT_FOR_REMOTE_PUBLISH_FUTURE_COMMITMENT(commitments: Commitments, remoteChannelReestablish: ChannelReestablish) extends ChannelDataWithCommitments
699701

702+
/** We use this class when a channel shouldn't be stored in the DB (e.g. because it never confirmed). */
703+
case object IgnoreClosedData extends ClosedData {
704+
val channelId: ByteVector32 = ByteVector32.Zeroes
705+
}
706+
700707
/**
701708
* This class contains the data we will keep in our DB for every closed channel.
702709
* It shouldn't contain data we may wish to remove in the future, otherwise we'll have backwards-compatibility issues.
@@ -711,14 +718,18 @@ final case class DATA_CLOSED(channelId: ByteVector32,
711718
fundingTxId: TxId,
712719
fundingOutputIndex: Long,
713720
fundingTxIndex: Long,
721+
fundingKeyPath: String,
722+
channelFeatures: String,
714723
isChannelOpener: Boolean,
715724
commitmentFormat: String,
716725
announced: Boolean,
717726
capacity: Satoshi,
718727
closingTxId: TxId,
719728
closingType: String,
720729
closingScript: ByteVector,
721-
closingAmount: Satoshi) extends ChannelData
730+
localBalance: MilliSatoshi,
731+
remoteBalance: MilliSatoshi,
732+
closingAmount: Satoshi) extends ClosedData
722733

723734
object DATA_CLOSED {
724735
def apply(d: DATA_NEGOTIATING_SIMPLE, closingTx: ClosingTx): DATA_CLOSED = DATA_CLOSED(
@@ -727,13 +738,17 @@ object DATA_CLOSED {
727738
fundingTxId = d.commitments.latest.fundingTxId,
728739
fundingOutputIndex = d.commitments.latest.fundingInput.index,
729740
fundingTxIndex = d.commitments.latest.fundingTxIndex,
741+
fundingKeyPath = d.commitments.channelParams.localParams.fundingKeyPath.toString(),
742+
channelFeatures = d.commitments.channelParams.channelFeatures.toString,
730743
isChannelOpener = d.commitments.latest.channelParams.localParams.isChannelOpener,
731744
commitmentFormat = d.commitments.latest.commitmentFormat.toString,
732745
announced = d.commitments.latest.channelParams.announceChannel,
733746
capacity = d.commitments.latest.capacity,
734747
closingTxId = closingTx.tx.txid,
735748
closingType = Helpers.Closing.MutualClose(closingTx).toString,
736749
closingScript = d.localScriptPubKey,
750+
localBalance = d.commitments.latest.localCommit.spec.toLocal,
751+
remoteBalance = d.commitments.latest.localCommit.spec.toRemote,
737752
closingAmount = closingTx.toLocalOutput_opt.map(_.amount).getOrElse(0 sat)
738753
)
739754

@@ -743,6 +758,8 @@ object DATA_CLOSED {
743758
fundingTxId = d.commitments.latest.fundingTxId,
744759
fundingOutputIndex = d.commitments.latest.fundingInput.index,
745760
fundingTxIndex = d.commitments.latest.fundingTxIndex,
761+
fundingKeyPath = d.commitments.channelParams.localParams.fundingKeyPath.toString(),
762+
channelFeatures = d.commitments.channelParams.channelFeatures.toString,
746763
isChannelOpener = d.commitments.latest.channelParams.localParams.isChannelOpener,
747764
commitmentFormat = d.commitments.latest.commitmentFormat.toString,
748765
announced = d.commitments.latest.channelParams.announceChannel,
@@ -757,6 +774,16 @@ object DATA_CLOSED {
757774
},
758775
closingType = closingType.toString,
759776
closingScript = d.finalScriptPubKey,
777+
localBalance = closingType match {
778+
case _: Closing.CurrentRemoteClose => d.commitments.latest.remoteCommit.spec.toRemote
779+
case _: Closing.NextRemoteClose => d.commitments.latest.nextRemoteCommit_opt.getOrElse(d.commitments.latest.remoteCommit).spec.toRemote
780+
case _ => d.commitments.latest.localCommit.spec.toLocal
781+
},
782+
remoteBalance = closingType match {
783+
case _: Closing.CurrentRemoteClose => d.commitments.latest.remoteCommit.spec.toLocal
784+
case _: Closing.NextRemoteClose => d.commitments.latest.nextRemoteCommit_opt.getOrElse(d.commitments.latest.remoteCommit).spec.toLocal
785+
case _ => d.commitments.latest.localCommit.spec.toRemote
786+
},
760787
closingAmount = closingType match {
761788
case Closing.MutualClose(closingTx) => closingTx.toLocalOutput_opt.map(_.amount).getOrElse(0 sat)
762789
case Closing.LocalClose(_, localCommitPublished) => Closing.closingBalance(d.channelParams, d.commitments.latest.commitmentFormat, d.finalScriptPubKey, localCommitPublished)

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/Channel.scala

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ class Channel(val nodeParams: NodeParams, val channelKeys: ChannelKeys, val wall
384384
case closing: DATA_CLOSING if Closing.nothingAtStake(closing) =>
385385
log.info("we have nothing at stake, going straight to CLOSED")
386386
context.system.eventStream.publish(ChannelAborted(self, remoteNodeId, closing.channelId))
387-
goto(CLOSED) using closing
387+
goto(CLOSED) using IgnoreClosedData
388388
case closing: DATA_CLOSING =>
389389
val localPaysClosingFees = closing.commitments.localChannelParams.paysClosingFees
390390
val closingType_opt = Closing.isClosingTypeAlreadyKnown(closing)
@@ -2288,8 +2288,7 @@ class Channel(val nodeParams: NodeParams, val channelKeys: ChannelKeys, val wall
22882288
case Some(closingType) =>
22892289
log.info("channel closed (type={})", EventType.Closed(closingType).label)
22902290
context.system.eventStream.publish(ChannelClosed(self, d.channelId, closingType, d.commitments))
2291-
val closed = DATA_CLOSED(d1, closingType)
2292-
goto(CLOSED) using closed
2291+
goto(CLOSED) using DATA_CLOSED(d1, closingType)
22932292
case None =>
22942293
stay() using d1 storing()
22952294
}
@@ -2369,9 +2368,9 @@ class Channel(val nodeParams: NodeParams, val channelKeys: ChannelKeys, val wall
23692368
case d: DATA_CLOSED =>
23702369
log.info(s"moving channelId=${d.channelId} to the closed channels DB")
23712370
nodeParams.db.channels.removeChannel(d.channelId, Some(d))
2372-
case d: PersistentChannelData =>
2373-
log.info("deleting database record for channelId={}", d.channelId)
2374-
nodeParams.db.channels.removeChannel(d.channelId, None)
2371+
case _: PersistentChannelData | IgnoreClosedData =>
2372+
log.info("deleting database record for channelId={}", stateData.channelId)
2373+
nodeParams.db.channels.removeChannel(stateData.channelId, None)
23752374
case _: TransientChannelData => // nothing was stored in the DB
23762375
}
23772376
log.info("shutting down")
@@ -3074,7 +3073,7 @@ class Channel(val nodeParams: NodeParams, val channelKeys: ChannelKeys, val wall
30743073
case d: ChannelDataWithCommitments => Some(d.commitments)
30753074
case _: ChannelDataWithoutCommitments => None
30763075
case _: TransientChannelData => None
3077-
case _: DATA_CLOSED => None
3076+
case _: ClosedData => None
30783077
}
30793078
context.system.eventStream.publish(ChannelStateChanged(self, nextStateData.channelId, peer, remoteNodeId, state, nextState, commitments_opt))
30803079
}

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenDualFunded.scala

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,11 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
285285

286286
case Event(INPUT_DISCONNECTED, d: DATA_WAIT_FOR_ACCEPT_DUAL_FUNDED_CHANNEL) =>
287287
d.init.replyTo ! OpenChannelResponse.Disconnected
288-
goto(CLOSED)
288+
goto(CLOSED) using IgnoreClosedData
289289

290290
case Event(TickChannelOpenTimeout, d: DATA_WAIT_FOR_ACCEPT_DUAL_FUNDED_CHANNEL) =>
291291
d.init.replyTo ! OpenChannelResponse.TimedOut
292-
goto(CLOSED)
292+
goto(CLOSED) using IgnoreClosedData
293293
})
294294

295295
when(WAIT_FOR_DUAL_FUNDING_CREATED)(handleExceptions {
@@ -302,12 +302,12 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
302302
log.info("our peer aborted the dual funding flow: ascii='{}' bin={}", msg.toAscii, msg.data)
303303
d.txBuilder ! InteractiveTxBuilder.Abort
304304
d.replyTo_opt.foreach(_ ! OpenChannelResponse.RemoteError(msg.toAscii))
305-
goto(CLOSED) sending TxAbort(d.channelId, DualFundingAborted(d.channelId).getMessage)
305+
goto(CLOSED) using IgnoreClosedData sending TxAbort(d.channelId, DualFundingAborted(d.channelId).getMessage)
306306
case _: TxSignatures =>
307307
log.info("received unexpected tx_signatures")
308308
d.txBuilder ! InteractiveTxBuilder.Abort
309309
d.replyTo_opt.foreach(_ ! OpenChannelResponse.Rejected(UnexpectedFundingSignatures(d.channelId).getMessage))
310-
goto(CLOSED) sending TxAbort(d.channelId, UnexpectedFundingSignatures(d.channelId).getMessage)
310+
goto(CLOSED) using IgnoreClosedData sending TxAbort(d.channelId, UnexpectedFundingSignatures(d.channelId).getMessage)
311311
case _: TxInitRbf =>
312312
log.info("ignoring unexpected tx_init_rbf message")
313313
stay() sending Warning(d.channelId, InvalidRbfAttempt(d.channelId).getMessage)
@@ -333,7 +333,7 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
333333
goto(WAIT_FOR_DUAL_FUNDING_SIGNED) using d1 storing() sending commitSig
334334
case f: InteractiveTxBuilder.Failed =>
335335
d.replyTo_opt.foreach(_ ! OpenChannelResponse.Rejected(f.cause.getMessage))
336-
goto(CLOSED) sending TxAbort(d.channelId, f.cause.getMessage)
336+
goto(CLOSED) using IgnoreClosedData sending TxAbort(d.channelId, f.cause.getMessage)
337337
}
338338

339339
case Event(c: CloseCommand, d: DATA_WAIT_FOR_DUAL_FUNDING_CREATED) =>
@@ -349,20 +349,20 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
349349
case Event(INPUT_DISCONNECTED, d: DATA_WAIT_FOR_DUAL_FUNDING_CREATED) =>
350350
d.txBuilder ! InteractiveTxBuilder.Abort
351351
d.replyTo_opt.foreach(_ ! OpenChannelResponse.Disconnected)
352-
goto(CLOSED)
352+
goto(CLOSED) using IgnoreClosedData
353353

354354
case Event(TickChannelOpenTimeout, d: DATA_WAIT_FOR_DUAL_FUNDING_CREATED) =>
355355
d.txBuilder ! InteractiveTxBuilder.Abort
356356
d.replyTo_opt.foreach(_ ! OpenChannelResponse.TimedOut)
357-
goto(CLOSED)
357+
goto(CLOSED) using IgnoreClosedData
358358
})
359359

360360
when(WAIT_FOR_DUAL_FUNDING_SIGNED)(handleExceptions {
361361
case Event(commitSig: CommitSig, d: DATA_WAIT_FOR_DUAL_FUNDING_SIGNED) =>
362362
d.signingSession.receiveCommitSig(d.channelParams, channelKeys, commitSig, nodeParams.currentBlockHeight) match {
363363
case Left(f) =>
364364
rollbackFundingAttempt(d.signingSession.fundingTx.tx, Nil)
365-
goto(CLOSED) sending Error(d.channelId, f.getMessage)
365+
goto(CLOSED) using IgnoreClosedData sending Error(d.channelId, f.getMessage)
366366
case Right(signingSession1) => signingSession1 match {
367367
case signingSession1: InteractiveTxSigningSession.WaitingForSigs =>
368368
// In theory we don't have to store their commit_sig here, as they would re-send it if we disconnect, but
@@ -394,7 +394,7 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
394394
d.signingSession.receiveTxSigs(channelKeys, txSigs, nodeParams.currentBlockHeight) match {
395395
case Left(f) =>
396396
rollbackFundingAttempt(d.signingSession.fundingTx.tx, Nil)
397-
goto(CLOSED) sending Error(d.channelId, f.getMessage)
397+
goto(CLOSED) using IgnoreClosedData sending Error(d.channelId, f.getMessage)
398398
case Right(signingSession) =>
399399
val minDepth_opt = d.channelParams.minDepth(nodeParams.channelConf.minDepth)
400400
watchFundingConfirmed(d.signingSession.fundingTx.txId, minDepth_opt, delay_opt = None)
@@ -412,7 +412,7 @@ trait ChannelOpenDualFunded extends DualFundingHandlers with ErrorHandlers {
412412
case msg: TxAbort =>
413413
log.info("our peer aborted the dual funding flow: ascii='{}' bin={}", msg.toAscii, msg.data)
414414
rollbackFundingAttempt(d.signingSession.fundingTx.tx, Nil)
415-
goto(CLOSED) sending TxAbort(d.channelId, DualFundingAborted(d.channelId).getMessage)
415+
goto(CLOSED) using IgnoreClosedData sending TxAbort(d.channelId, DualFundingAborted(d.channelId).getMessage)
416416
case msg: InteractiveTxConstructionMessage =>
417417
log.info("received unexpected interactive-tx message: {}", msg.getClass.getSimpleName)
418418
stay() sending Warning(d.channelId, UnexpectedInteractiveTxMessage(d.channelId, msg).getMessage)

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ChannelOpenSingleFunded.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ trait ChannelOpenSingleFunded extends SingleFundingHandlers with ErrorHandlers {
163163

164164
case Event(e: Error, d: DATA_WAIT_FOR_OPEN_CHANNEL) => handleRemoteError(e, d)
165165

166-
case Event(INPUT_DISCONNECTED, _) => goto(CLOSED)
166+
case Event(INPUT_DISCONNECTED, _) => goto(CLOSED) using IgnoreClosedData
167167
})
168168

169169
when(WAIT_FOR_ACCEPT_CHANNEL)(handleExceptions {
@@ -203,11 +203,11 @@ trait ChannelOpenSingleFunded extends SingleFundingHandlers with ErrorHandlers {
203203

204204
case Event(INPUT_DISCONNECTED, d: DATA_WAIT_FOR_ACCEPT_CHANNEL) =>
205205
d.initFunder.replyTo ! OpenChannelResponse.Disconnected
206-
goto(CLOSED)
206+
goto(CLOSED) using IgnoreClosedData
207207

208208
case Event(TickChannelOpenTimeout, d: DATA_WAIT_FOR_ACCEPT_CHANNEL) =>
209209
d.initFunder.replyTo ! OpenChannelResponse.TimedOut
210-
goto(CLOSED)
210+
goto(CLOSED) using IgnoreClosedData
211211
})
212212

213213
when(WAIT_FOR_FUNDING_INTERNAL)(handleExceptions {
@@ -264,11 +264,11 @@ trait ChannelOpenSingleFunded extends SingleFundingHandlers with ErrorHandlers {
264264

265265
case Event(INPUT_DISCONNECTED, d: DATA_WAIT_FOR_FUNDING_INTERNAL) =>
266266
d.replyTo ! OpenChannelResponse.Disconnected
267-
goto(CLOSED)
267+
goto(CLOSED) using IgnoreClosedData
268268

269269
case Event(TickChannelOpenTimeout, d: DATA_WAIT_FOR_FUNDING_INTERNAL) =>
270270
d.replyTo ! OpenChannelResponse.TimedOut
271-
goto(CLOSED)
271+
goto(CLOSED) using IgnoreClosedData
272272
})
273273

274274
when(WAIT_FOR_FUNDING_CREATED)(handleExceptions {
@@ -346,7 +346,7 @@ trait ChannelOpenSingleFunded extends SingleFundingHandlers with ErrorHandlers {
346346

347347
case Event(e: Error, d: DATA_WAIT_FOR_FUNDING_CREATED) => handleRemoteError(e, d)
348348

349-
case Event(INPUT_DISCONNECTED, _) => goto(CLOSED)
349+
case Event(INPUT_DISCONNECTED, _) => goto(CLOSED) using IgnoreClosedData
350350
})
351351

352352
when(WAIT_FOR_FUNDING_SIGNED)(handleExceptions {
@@ -414,13 +414,13 @@ trait ChannelOpenSingleFunded extends SingleFundingHandlers with ErrorHandlers {
414414
// we rollback the funding tx, it will never be published
415415
wallet.rollback(d.fundingTx)
416416
d.replyTo ! OpenChannelResponse.Disconnected
417-
goto(CLOSED)
417+
goto(CLOSED) using IgnoreClosedData
418418

419419
case Event(TickChannelOpenTimeout, d: DATA_WAIT_FOR_FUNDING_SIGNED) =>
420420
// we rollback the funding tx, it will never be published
421421
wallet.rollback(d.fundingTx)
422422
d.replyTo ! OpenChannelResponse.TimedOut
423-
goto(CLOSED)
423+
goto(CLOSED) using IgnoreClosedData
424424
})
425425

426426
when(WAIT_FOR_FUNDING_CONFIRMED)(handleExceptions {

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/CommonHandlers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ trait CommonHandlers {
5959
nodeParams.db.channels.addOrUpdateChannel(d)
6060
context.system.eventStream.publish(ChannelPersisted(self, remoteNodeId, d.channelId, d))
6161
state
62-
case _: TransientChannelData | _: DATA_CLOSED =>
62+
case _: TransientChannelData | _: ClosedData =>
6363
log.error(s"can't store data=${state.stateData} in state=${state.stateName}")
6464
state
6565
}

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/DualFundingHandlers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ trait DualFundingHandlers extends CommonFundingHandlers {
110110
if (fundingTxIds.subsetOf(e.fundingTxIds)) {
111111
log.warning("{} funding attempts have been double-spent, forgetting channel", fundingTxIds.size)
112112
d.allFundingTxs.map(_.sharedTx.tx.buildUnsignedTx()).foreach(tx => wallet.rollback(tx))
113-
goto(CLOSED) sending Error(d.channelId, FundingTxDoubleSpent(d.channelId).getMessage)
113+
goto(CLOSED) using IgnoreClosedData sending Error(d.channelId, FundingTxDoubleSpent(d.channelId).getMessage)
114114
} else {
115115
// Not all funding attempts have been double-spent, the channel may still confirm.
116116
// For example, we may have published an RBF attempt while we were checking if funding attempts were double-spent.

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/ErrorHandlers.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ trait ErrorHandlers extends CommonHandlers {
4646
def handleFastClose(c: CloseCommand, channelId: ByteVector32) = {
4747
val replyTo = if (c.replyTo == ActorRef.noSender) sender() else c.replyTo
4848
replyTo ! RES_SUCCESS(c, channelId)
49-
goto(CLOSED)
49+
goto(CLOSED) using IgnoreClosedData
5050
}
5151

5252
def handleMutualClose(closingTx: ClosingTx, d: Either[DATA_NEGOTIATING, DATA_CLOSING]) = {
@@ -100,7 +100,7 @@ trait ErrorHandlers extends CommonHandlers {
100100
cause match {
101101
case _: InvalidFundingTx =>
102102
// invalid funding tx in the single-funding case: we just close the channel
103-
goto(CLOSED)
103+
goto(CLOSED) using IgnoreClosedData
104104
case _: ChannelException =>
105105
// known channel exception: we force close using our current commitment
106106
spendLocalCurrent(dd, maxClosingFeerate_opt) sending error
@@ -125,9 +125,9 @@ trait ErrorHandlers extends CommonHandlers {
125125
}
126126
}
127127
// When there is no commitment yet, we just send an error to our peer and go to CLOSED state.
128-
case _: ChannelDataWithoutCommitments => goto(CLOSED) sending error
129-
case _: TransientChannelData => goto(CLOSED) sending error
130-
case _: DATA_CLOSED => stay()
128+
case _: ChannelDataWithoutCommitments => goto(CLOSED) using IgnoreClosedData sending error
129+
case _: TransientChannelData => goto(CLOSED) using IgnoreClosedData sending error
130+
case _: ClosedData => stay()
131131
}
132132
}
133133

@@ -166,9 +166,9 @@ trait ErrorHandlers extends CommonHandlers {
166166
// When there is no commitment yet, we just go to CLOSED state in case an error occurs.
167167
case waitForDualFundingSigned: DATA_WAIT_FOR_DUAL_FUNDING_SIGNED =>
168168
rollbackFundingAttempt(waitForDualFundingSigned.signingSession.fundingTx.tx, Nil)
169-
goto(CLOSED)
170-
case _: TransientChannelData => goto(CLOSED)
171-
case _: DATA_CLOSED => stay()
169+
goto(CLOSED) using IgnoreClosedData
170+
case _: TransientChannelData => goto(CLOSED) using IgnoreClosedData
171+
case _: ClosedData => stay()
172172
}
173173
}
174174

eclair-core/src/main/scala/fr/acinq/eclair/channel/fsm/SingleFundingHandlers.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,13 @@ trait SingleFundingHandlers extends CommonFundingHandlers {
9797
}
9898

9999
def handleFundingPublishFailed(d: PersistentChannelData) = {
100-
log.error(s"failed to publish funding tx")
100+
log.error("failed to publish funding tx")
101101
val exc = ChannelFundingError(d.channelId)
102102
val error = Error(d.channelId, exc.getMessage)
103103
// NB: we don't use the handleLocalError handler because it would result in the commit tx being published, which we don't want:
104104
// implementation *guarantees* that in case of BITCOIN_FUNDING_PUBLISH_FAILED, the funding tx hasn't and will never be published, so we can close the channel right away
105105
context.system.eventStream.publish(ChannelErrorOccurred(self, stateData.channelId, remoteNodeId, LocalError(exc), isFatal = true))
106-
goto(CLOSED) sending error
106+
goto(CLOSED) using IgnoreClosedData sending error
107107
}
108108

109109
def handleFundingTimeout(d: PersistentChannelData) = {
@@ -116,7 +116,7 @@ trait SingleFundingHandlers extends CommonFundingHandlers {
116116
val exc = FundingTxTimedout(d.channelId)
117117
val error = Error(d.channelId, exc.getMessage)
118118
context.system.eventStream.publish(ChannelErrorOccurred(self, stateData.channelId, remoteNodeId, LocalError(exc), isFatal = true))
119-
goto(CLOSED) sending error
119+
goto(CLOSED) using IgnoreClosedData sending error
120120
}
121121

122122
}

0 commit comments

Comments
 (0)