mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-09-19 20:15:18 +02:00
cnct: cpfp-sweep anchors
For unconfirmed commit tx anchors, supply the sweeper with cpfp info and a confirmation target fee estimate. The sweeper will try to pay for the parent commit tx as long as the current fee estimate exceeds the pre-signed commit tx fee rate.
This commit is contained in:
@@ -89,6 +89,9 @@ func (c *anchorResolver) Resolve() (ContractResolver, error) {
|
||||
// An exclusive group is not necessary anymore, because we know that
|
||||
// this is the only anchor that can be swept.
|
||||
//
|
||||
// We also clear the parent tx information for cpfp, because the
|
||||
// commitment tx is confirmed.
|
||||
//
|
||||
// After a restart or when the remote force closes, the sweeper is not
|
||||
// yet aware of the anchor. In that case, it will be added as new input
|
||||
// to the sweeper.
|
||||
|
@@ -30,6 +30,12 @@ var (
|
||||
"process of being force closed")
|
||||
)
|
||||
|
||||
const (
|
||||
// anchorSweepConfTarget is the conf target used when sweeping
|
||||
// commitment anchors.
|
||||
anchorSweepConfTarget = 6
|
||||
)
|
||||
|
||||
// WitnessSubscription represents an intent to be notified once new witnesses
|
||||
// are discovered by various active contract resolvers. A contract resolver may
|
||||
// use this to be notified of when it can satisfy an incoming contract after we
|
||||
@@ -1060,9 +1066,6 @@ func (c *ChannelArbitrator) sweepAnchors(anchors []*lnwallet.AnchorResolution,
|
||||
// anchors from being batched together.
|
||||
exclusiveGroup := c.cfg.ShortChanID.ToUint64()
|
||||
|
||||
// Retrieve the current minimum fee rate from the sweeper.
|
||||
minFeeRate := c.cfg.Sweeper.RelayFeePerKW()
|
||||
|
||||
for _, anchor := range anchors {
|
||||
log.Debugf("ChannelArbitrator(%v): pre-confirmation sweep of "+
|
||||
"anchor of tx %v", c.cfg.ChanPoint, anchor.CommitAnchor)
|
||||
@@ -1073,19 +1076,25 @@ func (c *ChannelArbitrator) sweepAnchors(anchors []*lnwallet.AnchorResolution,
|
||||
input.CommitmentAnchor,
|
||||
&anchor.AnchorSignDescriptor,
|
||||
heightHint,
|
||||
nil,
|
||||
&input.TxInfo{
|
||||
Fee: anchor.CommitFee,
|
||||
Weight: anchor.CommitWeight,
|
||||
},
|
||||
)
|
||||
|
||||
// Sweep anchor output with the minimum fee rate. This usually
|
||||
// (up to a min relay fee of 3 sat/b) means that the anchor
|
||||
// sweep will be economical. Also signal that this is a force
|
||||
// sweep. If the user decides to bump the fee on the anchor
|
||||
// sweep, it will be swept even if it isn't economical.
|
||||
// Sweep anchor output with a confirmation target fee
|
||||
// preference. Because this is a cpfp-operation, the anchor will
|
||||
// only be attempted to sweep when the current fee estimate for
|
||||
// the confirmation target exceeds the commit fee rate.
|
||||
//
|
||||
// Also signal that this is a force sweep, so that the anchor
|
||||
// will be swept even if it isn't economical purely based on the
|
||||
// anchor value.
|
||||
_, err := c.cfg.Sweeper.SweepInput(
|
||||
&anchorInput,
|
||||
sweep.Params{
|
||||
Fee: sweep.FeePreference{
|
||||
FeeRate: minFeeRate,
|
||||
ConfTarget: anchorSweepConfTarget,
|
||||
},
|
||||
Force: true,
|
||||
ExclusiveGroup: &exclusiveGroup,
|
||||
|
Reference in New Issue
Block a user