Browse Source
Extend the fee estimator to take into account parent transactions with their weights and fees. Do not try to cpfp parent transactions that have a higher fee rate than the sweep tx fee rate.master
Joost Jager
4 years ago
13 changed files with 334 additions and 30 deletions
@ -0,0 +1,79 @@
|
||||
package sweep |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/btcsuite/btcd/wire" |
||||
"github.com/lightningnetwork/lnd/input" |
||||
"github.com/lightningnetwork/lnd/lnwallet/chainfee" |
||||
"github.com/stretchr/testify/require" |
||||
) |
||||
|
||||
// TestWeightEstimator tests weight estimation for inputs with and without
|
||||
// unconfirmed parents.
|
||||
func TestWeightEstimator(t *testing.T) { |
||||
testFeeRate := chainfee.SatPerKWeight(20000) |
||||
|
||||
w := newWeightEstimator(testFeeRate) |
||||
|
||||
// Add an input without unconfirmed parent tx.
|
||||
input1 := input.MakeBaseInput( |
||||
&wire.OutPoint{}, input.CommitmentAnchor, |
||||
&input.SignDescriptor{}, 0, nil, |
||||
) |
||||
|
||||
require.NoError(t, w.add(&input1)) |
||||
|
||||
// The expectations is that this input is added.
|
||||
const expectedWeight1 = 322 |
||||
require.Equal(t, expectedWeight1, w.weight()) |
||||
require.Equal(t, testFeeRate.FeeForWeight(expectedWeight1), w.fee()) |
||||
|
||||
// Define a parent transaction that pays a fee of 30000 sat/kw.
|
||||
parentTxHighFee := &input.TxInfo{ |
||||
Weight: 100, |
||||
Fee: 3000, |
||||
} |
||||
|
||||
// Add an output of the parent tx above.
|
||||
input2 := input.MakeBaseInput( |
||||
&wire.OutPoint{}, input.CommitmentAnchor, |
||||
&input.SignDescriptor{}, 0, |
||||
parentTxHighFee, |
||||
) |
||||
|
||||
require.NoError(t, w.add(&input2)) |
||||
|
||||
// Pay for parent isn't possible because the parent pays a higher fee
|
||||
// rate than the child. We expect no additional fee on the child.
|
||||
const expectedWeight2 = expectedWeight1 + 280 |
||||
require.Equal(t, expectedWeight2, w.weight()) |
||||
require.Equal(t, testFeeRate.FeeForWeight(expectedWeight2), w.fee()) |
||||
|
||||
// Define a parent transaction that pays a fee of 10000 sat/kw.
|
||||
parentTxLowFee := &input.TxInfo{ |
||||
Weight: 100, |
||||
Fee: 1000, |
||||
} |
||||
|
||||
// Add an output of the low-fee parent tx above.
|
||||
input3 := input.MakeBaseInput( |
||||
&wire.OutPoint{}, input.CommitmentAnchor, |
||||
&input.SignDescriptor{}, 0, |
||||
parentTxLowFee, |
||||
) |
||||
require.NoError(t, w.add(&input3)) |
||||
|
||||
// Expect the weight to increase because of the third input.
|
||||
const expectedWeight3 = expectedWeight2 + 280 |
||||
require.Equal(t, expectedWeight3, w.weight()) |
||||
|
||||
// Expect the fee to cover the child and the parent transaction at 20
|
||||
// sat/kw after subtraction of the fee that was already paid by the
|
||||
// parent.
|
||||
expectedFee := testFeeRate.FeeForWeight( |
||||
expectedWeight3+parentTxLowFee.Weight, |
||||
) - parentTxLowFee.Fee |
||||
|
||||
require.Equal(t, expectedFee, w.fee()) |
||||
} |
Loading…
Reference in new issue