From 7ff251ca44680c131f1542aabb13bb9c2ee385dd Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Wed, 29 May 2024 19:57:40 +0200 Subject: [PATCH] lnwallet/chancloser: add new AuxChanCloser interface --- lnwallet/chancloser/aux_closer.go | 104 ++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 lnwallet/chancloser/aux_closer.go diff --git a/lnwallet/chancloser/aux_closer.go b/lnwallet/chancloser/aux_closer.go new file mode 100644 index 000000000..8b1c445ca --- /dev/null +++ b/lnwallet/chancloser/aux_closer.go @@ -0,0 +1,104 @@ +package chancloser + +import ( + "github.com/btcsuite/btcd/btcec/v2" + "github.com/btcsuite/btcd/btcutil" + "github.com/btcsuite/btcd/wire" + "github.com/lightningnetwork/lnd/fn" + "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/tlv" +) + +// 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 { + 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] +} + +// AuxCloseOutputs is used to specify extra outputs that should be used when +// constructing the co-op close transaction. +type AuxCloseOutputs struct { + // ExtraCloseOutputs is a set of extra outputs that should be included + // in the close transaction. + ExtraCloseOutputs []lnwallet.CloseOutput + + // CustomSort is a custom function that can be used to sort the + // transaction outputs. If this isn't set, then the default BIP-69 + // sorting is used. + CustomSort lnwallet.CloseSortFunc +} + +// AuxChanCloser is used to allow an external caller to modify the co-op close +// transaction. +type AuxChanCloser interface { + // ShutdownBlob returns the set of custom records that should be + // included in the shutdown message. + ShutdownBlob(req AuxShutdownReq) (fn.Option[lnwire.CustomRecords], + error) + + // AuxCloseOutputs returns the set of custom outputs that should be used + // to construct the co-op close transaction. + AuxCloseOutputs(desc AuxCloseDesc) (fn.Option[AuxCloseOutputs], error) + + // FinalizeClose is called after the close transaction has been agreed + // upon. + FinalizeClose(desc AuxCloseDesc, closeTx *wire.MsgTx) error +}