package chancloser import ( "github.com/btcsuite/btcd/btcec/v2/schnorr/musig2" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwire" ) // CoopFeeEstimator is used to estimate the fee of a co-op close transaction. type CoopFeeEstimator interface { // EstimateFee estimates an _absolute_ fee for a co-op close transaction // given the local+remote tx outs (for the co-op close transaction), // channel type, and ideal fee rate. If a passed TxOut is nil, then // that indicates that an output is dust on the co-op close transaction // _before_ fees are accounted for. EstimateFee(chanType channeldb.ChannelType, localTxOut, remoteTxOut *wire.TxOut, idealFeeRate chainfee.SatPerKWeight) btcutil.Amount } // Channel abstracts away from the core channel state machine by exposing an // interface that requires only the methods we need to carry out the channel // closing process. type Channel interface { //nolint:interfacebloat // ChannelPoint returns the channel point of the target channel. ChannelPoint() *wire.OutPoint // MarkCoopBroadcasted persistently marks that the channel close // transaction has been broadcast. MarkCoopBroadcasted(*wire.MsgTx, bool) error // IsInitiator returns true we are the initiator of the channel. IsInitiator() bool // ShortChanID returns the scid of the channel. ShortChanID() lnwire.ShortChannelID // ChanType returns the channel type of the channel. ChanType() channeldb.ChannelType // FundingTxOut returns the funding output of the channel. FundingTxOut() *wire.TxOut // AbsoluteThawHeight returns the absolute thaw height of the channel. // If the channel is pending, or an unconfirmed zero conf channel, then // an error should be returned. AbsoluteThawHeight() (uint32, error) // LocalBalanceDust returns true if when creating a co-op close // transaction, the balance of the local party will be dust after // accounting for any anchor outputs. LocalBalanceDust() bool // RemoteBalanceDust returns true if when creating a co-op close // transaction, the balance of the remote party will be dust after // accounting for any anchor outputs. RemoteBalanceDust() bool // RemoteUpfrontShutdownScript returns the upfront shutdown script of // the remote party. If the remote party didn't specify such a script, // an empty delivery address should be returned. RemoteUpfrontShutdownScript() lnwire.DeliveryAddress // CreateCloseProposal creates a new co-op close proposal in the form // of a valid signature, the chainhash of the final txid, and our final // balance in the created state. CreateCloseProposal(proposedFee btcutil.Amount, localDeliveryScript []byte, remoteDeliveryScript []byte, closeOpt ...lnwallet.ChanCloseOpt, ) ( input.Signature, *chainhash.Hash, btcutil.Amount, error) // CompleteCooperativeClose persistently "completes" the cooperative // close by producing a fully signed co-op close transaction. CompleteCooperativeClose(localSig, remoteSig input.Signature, localDeliveryScript, remoteDeliveryScript []byte, proposedFee btcutil.Amount, closeOpt ...lnwallet.ChanCloseOpt, ) (*wire.MsgTx, btcutil.Amount, error) } // MusigSession is an interface that abstracts away the details of the musig2 // session details. A session is used to generate the necessary closing options // needed to close a channel cooperatively. type MusigSession interface { // ProposalClosingOpts generates the set of closing options needed to // generate a new musig2 proposal signature. ProposalClosingOpts() ([]lnwallet.ChanCloseOpt, error) // CombineClosingOpts returns the options that should be used when // combining the final musig partial signature. The method also maps // the lnwire partial signatures into an input.Signature that can be // used more generally. CombineClosingOpts(localSig, remoteSig lnwire.PartialSig, ) (input.Signature, input.Signature, []lnwallet.ChanCloseOpt, error) // ClosingNonce generates the nonce we'll use to generate the musig2 // partial signatures for the co-op close transaction. ClosingNonce() (*musig2.Nonces, error) // InitRemoteNonce saves the remote nonce the party sent during their // shutdown message so it can be used later to generate and verify // signatures. InitRemoteNonce(nonce *musig2.Nonces) }