Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions contractcourt/chain_arbitrator.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,10 @@ type ChainArbitratorConfig struct {
// AuxResolver is an optional interface that can be used to modify the
// way contracts are resolved.
AuxResolver fn.Option[lnwallet.AuxContractResolver]

// AuxCloser is an optional interface that can be used to finalize
// cooperative channel closes.
AuxCloser fn.Option[AuxChanCloser]
}

// ChainArbitrator is a sub-system that oversees the on-chain resolution of all
Expand Down Expand Up @@ -1138,6 +1142,7 @@ func (c *ChainArbitrator) WatchNewChannel(newChan *channeldb.OpenChannel) error
extractStateNumHint: lnwallet.GetStateNumHint,
auxLeafStore: c.cfg.AuxLeafStore,
auxResolver: c.cfg.AuxResolver,
auxCloser: c.cfg.AuxCloser,
},
)
if err != nil {
Expand Down Expand Up @@ -1315,6 +1320,7 @@ func (c *ChainArbitrator) loadOpenChannels() error {
extractStateNumHint: lnwallet.GetStateNumHint,
auxLeafStore: c.cfg.AuxLeafStore,
auxResolver: c.cfg.AuxResolver,
auxCloser: c.cfg.AuxCloser,
},
)
if err != nil {
Expand Down
75 changes: 75 additions & 0 deletions contractcourt/chain_watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/lightningnetwork/lnd/lnutils"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/tlv"
)

const (
Expand All @@ -37,6 +38,77 @@ const (
maxCommitPointPollTimeout = 10 * time.Minute
)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider refactoring these types into a shared package. e.g: lnwallet/chantypes

This would avoid the duplication and the circular dependency. 🦅 🦅 🪨💨

// CloseOutput represents an output that should be included in the close
// transaction.
type CloseOutput struct {
// Amt is the amount of the output.
Amt btcutil.Amount

// DustLimit is the dust limit for the local node.
DustLimit btcutil.Amount

// PkScript is the script that should be used to pay to the output.
PkScript []byte

// ShutdownRecords is the set of custom records that may result in
// extra close outputs being added.
ShutdownRecords lnwire.CustomRecords
}

// AuxShutdownReq is used to request a set of extra custom records to include
// in the shutdown message.
type AuxShutdownReq struct {
// ChanPoint is the channel point of the channel that is being shut
// down.
ChanPoint wire.OutPoint

// ShortChanID is the short channel ID of the channel that is being
// closed.
ShortChanID lnwire.ShortChannelID

// Initiator is true if the local node is the initiator of the channel.
Initiator bool

// InternalKey is the internal key for the shutdown addr. This will
// only be set for taproot shutdown addrs.
InternalKey fn.Option[btcec.PublicKey]

// CommitBlob is the blob that was included in the last commitment.
CommitBlob fn.Option[tlv.Blob]

// FundingBlob is the blob that was included in the funding state.
FundingBlob fn.Option[tlv.Blob]
}

// AuxCloseDesc is used to describe the channel close that is being performed.
type AuxCloseDesc struct {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These types are duplicated from lnwallet/chancloser/aux_closer.go. Why do they need to be moved here?

AuxShutdownReq

// CloseFee is the closing fee to be paid for this state.
CloseFee btcutil.Amount

// CommitFee is the fee that was paid for the last commitment.
CommitFee btcutil.Amount

// LocalCloseOutput is the output that the local node should be paid
// to. This is None if the local party will not have an output on the
// co-op close transaction.
LocalCloseOutput fn.Option[CloseOutput]

// RemoteCloseOutput is the output that the remote node should be paid
// to. This will be None if the remote party will not have an output on
// the co-op close transaction.
RemoteCloseOutput fn.Option[CloseOutput]
}

// AuxChanCloser is used to allow an external caller to finalize a cooperative
// channel close.
type AuxChanCloser interface {
// FinalizeClose is called after the close transaction has been agreed
// upon and confirmed.
FinalizeClose(desc AuxCloseDesc, closeTx *wire.MsgTx) error
}

// LocalUnilateralCloseInfo encapsulates all the information we need to act on
// a local force close that gets confirmed.
type LocalUnilateralCloseInfo struct {
Expand Down Expand Up @@ -229,6 +301,9 @@ type chainWatcherConfig struct {

// auxResolver is used to supplement contract resolution.
auxResolver fn.Option[lnwallet.AuxContractResolver]

// auxCloser is used to finalize cooperative closes.
auxCloser fn.Option[AuxChanCloser]
}

// chainWatcher is a system that's assigned to every active channel. The duty
Expand Down