mirror of
https://github.com/lightningnetwork/lnd.git
synced 2024-11-19 09:53:54 +01:00
itest: calcStaticFee based on commit type
This commit is contained in:
parent
7dbb936791
commit
e269e3f91b
@ -60,6 +60,7 @@ const (
|
||||
channelOpenTimeout = lntest.ChannelOpenTimeout
|
||||
channelCloseTimeout = lntest.ChannelCloseTimeout
|
||||
itestLndBinary = "../../lnd-itest"
|
||||
anchorSize = 330
|
||||
)
|
||||
|
||||
// harnessTest wraps a regular testing.T providing enhanced error detection
|
||||
@ -601,22 +602,6 @@ func shutdownAndAssert(net *lntest.NetworkHarness, t *harnessTest,
|
||||
}
|
||||
}
|
||||
|
||||
// calcStaticFee calculates appropriate fees for commitment transactions. This
|
||||
// function provides a simple way to allow test balance assertions to take fee
|
||||
// calculations into account.
|
||||
//
|
||||
// TODO(bvu): Refactor when dynamic fee estimation is added.
|
||||
// TODO(conner) remove code duplication
|
||||
func calcStaticFee(numHTLCs int) btcutil.Amount {
|
||||
const htlcWeight = input.HTLCWeight
|
||||
var (
|
||||
feePerKw = chainfee.SatPerKVByte(50000).FeePerKWeight()
|
||||
commitWeight = input.CommitWeight
|
||||
)
|
||||
|
||||
return feePerKw.FeeForWeight(int64(commitWeight + htlcWeight*numHTLCs))
|
||||
}
|
||||
|
||||
// completePaymentRequests sends payments from a lightning node to complete all
|
||||
// payment requests. If the awaitResponse parameter is true, this function
|
||||
// does not return until all payments successfully complete without errors.
|
||||
@ -999,6 +984,66 @@ func (c commitType) Args() []string {
|
||||
return nil
|
||||
}
|
||||
|
||||
// calcStaticFee calculates appropriate fees for commitment transactions. This
|
||||
// function provides a simple way to allow test balance assertions to take fee
|
||||
// calculations into account.
|
||||
func (c commitType) calcStaticFee(numHTLCs int) btcutil.Amount {
|
||||
const htlcWeight = input.HTLCWeight
|
||||
var (
|
||||
feePerKw = chainfee.SatPerKVByte(50000).FeePerKWeight()
|
||||
commitWeight = input.CommitWeight
|
||||
anchors = btcutil.Amount(0)
|
||||
)
|
||||
|
||||
// The anchor commitment type is slightly heavier, and we must also add
|
||||
// the value of the two anchors to the resulting fee the initiator
|
||||
// pays.
|
||||
if c == commitTypeAnchors {
|
||||
commitWeight = input.AnchorCommitWeight
|
||||
anchors = 2 * anchorSize
|
||||
}
|
||||
|
||||
return feePerKw.FeeForWeight(int64(commitWeight+htlcWeight*numHTLCs)) +
|
||||
anchors
|
||||
}
|
||||
|
||||
// channelCommitType retrieves the active channel commitment type for the given
|
||||
// chan point.
|
||||
func channelCommitType(node *lntest.HarnessNode,
|
||||
chanPoint *lnrpc.ChannelPoint) (commitType, error) {
|
||||
|
||||
ctxb := context.Background()
|
||||
ctxt, _ := context.WithTimeout(ctxb, defaultTimeout)
|
||||
|
||||
req := &lnrpc.ListChannelsRequest{}
|
||||
channels, err := node.ListChannels(ctxt, req)
|
||||
if err != nil {
|
||||
return 0, fmt.Errorf("listchannels failed: %v", err)
|
||||
}
|
||||
|
||||
for _, c := range channels.Channels {
|
||||
if c.ChannelPoint == txStr(chanPoint) {
|
||||
switch c.CommitmentType {
|
||||
|
||||
// If the anchor output size is non-zero, we are
|
||||
// dealing with the anchor type.
|
||||
case lnrpc.CommitmentType_ANCHORS:
|
||||
return commitTypeAnchors, nil
|
||||
|
||||
// StaticRemoteKey means it is tweakless,
|
||||
case lnrpc.CommitmentType_STATIC_REMOTE_KEY:
|
||||
return commitTypeTweakless, nil
|
||||
|
||||
// Otherwise legacy.
|
||||
default:
|
||||
return commitTypeLegacy, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0, fmt.Errorf("channel point %v not found", chanPoint)
|
||||
}
|
||||
|
||||
// basicChannelFundingTest is a sub-test of the main testBasicChannelFunding
|
||||
// test. Given two nodes: Alice and Bob, it'll assert proper channel creation,
|
||||
// then return a function closure that should be called to assert proper
|
||||
@ -1039,6 +1084,12 @@ func basicChannelFundingTest(t *harnessTest, net *lntest.NetworkHarness,
|
||||
"channel: %v", err)
|
||||
}
|
||||
|
||||
cType, err := channelCommitType(alice, chanPoint)
|
||||
if err != nil {
|
||||
return nil, nil, nil, fmt.Errorf("unable to get channel "+
|
||||
"type: %v", err)
|
||||
}
|
||||
|
||||
// With the channel open, ensure that the amount specified above has
|
||||
// properly been pushed to Bob.
|
||||
balReq := &lnrpc.ChannelBalanceRequest{}
|
||||
@ -1055,7 +1106,7 @@ func basicChannelFundingTest(t *harnessTest, net *lntest.NetworkHarness,
|
||||
"balance: %v", err)
|
||||
}
|
||||
|
||||
expBalanceAlice := chanAmt - pushAmt - calcStaticFee(0)
|
||||
expBalanceAlice := chanAmt - pushAmt - cType.calcStaticFee(0)
|
||||
aliceBalance := btcutil.Amount(aliceBal.Balance)
|
||||
if aliceBalance != expBalanceAlice {
|
||||
return nil, nil, nil, fmt.Errorf("alice's balance is "+
|
||||
@ -1276,6 +1327,11 @@ func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) {
|
||||
t.Fatalf("error while waiting for channel open: %v", err)
|
||||
}
|
||||
|
||||
cType, err := channelCommitType(net.Alice, chanPoint)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get channel type: %v", err)
|
||||
}
|
||||
|
||||
// With the channel open, we'll check the balances on each side of the
|
||||
// channel as a sanity check to ensure things worked out as intended.
|
||||
balReq := &lnrpc.ChannelBalanceRequest{}
|
||||
@ -1289,9 +1345,9 @@ func testUnconfirmedChannelFunding(net *lntest.NetworkHarness, t *harnessTest) {
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get alice's balance: %v", err)
|
||||
}
|
||||
if carolBal.Balance != int64(chanAmt-pushAmt-calcStaticFee(0)) {
|
||||
if carolBal.Balance != int64(chanAmt-pushAmt-cType.calcStaticFee(0)) {
|
||||
t.Fatalf("carol's balance is incorrect: expected %v got %v",
|
||||
chanAmt-pushAmt-calcStaticFee(0), carolBal)
|
||||
chanAmt-pushAmt-cType.calcStaticFee(0), carolBal)
|
||||
}
|
||||
if aliceBal.Balance != int64(pushAmt) {
|
||||
t.Fatalf("alice's balance is incorrect: expected %v got %v",
|
||||
@ -2709,9 +2765,14 @@ func testChannelBalance(net *lntest.NetworkHarness, t *harnessTest) {
|
||||
"timeout: %v", err)
|
||||
}
|
||||
|
||||
cType, err := channelCommitType(net.Alice, chanPoint)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get channel type: %v", err)
|
||||
}
|
||||
|
||||
// As this is a single funder channel, Alice's balance should be
|
||||
// exactly 0.5 BTC since now state transitions have taken place yet.
|
||||
checkChannelBalance(net.Alice, amount-calcStaticFee(0))
|
||||
checkChannelBalance(net.Alice, amount-cType.calcStaticFee(0))
|
||||
|
||||
// Ensure Bob currently has no available balance within the channel.
|
||||
checkChannelBalance(net.Bob, 0)
|
||||
@ -9173,7 +9234,12 @@ func testHtlcErrorPropagation(net *lntest.NetworkHarness, t *harnessTest) {
|
||||
t.Fatalf("channel not seen by alice before timeout: %v", err)
|
||||
}
|
||||
|
||||
commitFee := calcStaticFee(0)
|
||||
cType, err := channelCommitType(net.Alice, chanPointAlice)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to get channel type: %v", err)
|
||||
}
|
||||
|
||||
commitFee := cType.calcStaticFee(0)
|
||||
assertBaseBalance := func() {
|
||||
balReq := &lnrpc.ChannelBalanceRequest{}
|
||||
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
|
||||
|
Loading…
Reference in New Issue
Block a user