lnwallet: add previous_outpoints to ListTransactionDetails

This commit is contained in:
priyanshiiit 2022-06-27 15:45:49 +05:30
parent a00964febb
commit 61493a5f29
3 changed files with 196 additions and 15 deletions

View file

@ -18,6 +18,7 @@ import (
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcwallet/chain"
"github.com/btcsuite/btcwallet/waddrmgr"
"github.com/btcsuite/btcwallet/wallet"
base "github.com/btcsuite/btcwallet/wallet"
"github.com/btcsuite/btcwallet/wallet/txauthor"
"github.com/btcsuite/btcwallet/wallet/txrules"
@ -1104,6 +1105,32 @@ func extractBalanceDelta(
return balanceDelta, nil
}
// getPreviousOutpoints is a helper function which gets the previous
// outpoints of a transaction.
func getPreviousOutpoints(wireTx *wire.MsgTx,
myInputs []wallet.TransactionSummaryInput) []lnwallet.PreviousOutPoint {
// isOurOutput is a map containing the output indices
// controlled by the wallet.
// Note: We make use of the information in `myInputs` provided
// by the `wallet.TransactionSummary` structure that holds
// information only if the input/previous_output is controlled by the wallet.
isOurOutput := make(map[uint32]bool, len(myInputs))
for _, myInput := range myInputs {
isOurOutput[myInput.Index] = true
}
previousOutpoints := make([]lnwallet.PreviousOutPoint, len(wireTx.TxIn))
for idx, txIn := range wireTx.TxIn {
previousOutpoints[idx] = lnwallet.PreviousOutPoint{
OutPoint: txIn.PreviousOutPoint.String(),
IsOurOutput: isOurOutput[uint32(idx)],
}
}
return previousOutpoints
}
// minedTransactionsToDetails is a helper function which converts a summary
// information about mined transactions to a TransactionDetail.
func minedTransactionsToDetails(
@ -1152,6 +1179,8 @@ func minedTransactionsToDetails(
})
}
previousOutpoints := getPreviousOutpoints(wireTx, tx.MyInputs)
txDetail := &lnwallet.TransactionDetail{
Hash: *tx.Hash,
NumConfirmations: currentHeight - block.Height + 1,
@ -1162,6 +1191,7 @@ func minedTransactionsToDetails(
OutputDetails: outputDetails,
RawTx: tx.Transaction,
Label: tx.Label,
PreviousOutpoints: previousOutpoints,
}
balanceDelta, err := extractBalanceDelta(tx, wireTx)
@ -1221,6 +1251,8 @@ func unminedTransactionsToDetail(
})
}
previousOutpoints := getPreviousOutpoints(wireTx, summary.MyInputs)
txDetail := &lnwallet.TransactionDetail{
Hash: *summary.Hash,
TotalFees: int64(summary.Fee),
@ -1228,6 +1260,7 @@ func unminedTransactionsToDetail(
OutputDetails: outputDetails,
RawTx: summary.Transaction,
Label: summary.Label,
PreviousOutpoints: previousOutpoints,
}
balanceDelta, err := extractBalanceDelta(summary, wireTx)

View file

@ -0,0 +1,134 @@
package btcwallet
import (
"testing"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcwallet/wallet"
"github.com/lightningnetwork/lnd/lnwallet"
"github.com/stretchr/testify/require"
)
type previousOutpointsTest struct {
name string
tx *wire.MsgTx
myInputs []wallet.TransactionSummaryInput
expRes []lnwallet.PreviousOutPoint
}
var previousOutpointsTests = []previousOutpointsTest{{
name: "both outpoints are wallet controlled",
tx: &wire.MsgTx{
TxIn: []*wire.TxIn{{
PreviousOutPoint: wire.OutPoint{Index: 0},
}, {
PreviousOutPoint: wire.OutPoint{Index: 1},
}},
},
myInputs: []wallet.TransactionSummaryInput{{
Index: 0,
}, {
Index: 1,
}},
expRes: []lnwallet.PreviousOutPoint{{
OutPoint: wire.OutPoint{Index: 0}.String(),
IsOurOutput: true,
}, {
OutPoint: wire.OutPoint{Index: 1}.String(),
IsOurOutput: true,
}},
}, {
name: "only one outpoint is wallet controlled",
tx: &wire.MsgTx{
TxIn: []*wire.TxIn{{
PreviousOutPoint: wire.OutPoint{Index: 0},
}, {
PreviousOutPoint: wire.OutPoint{Index: 1},
}},
},
myInputs: []wallet.TransactionSummaryInput{{
Index: 0,
}, {
Index: 2,
}},
expRes: []lnwallet.PreviousOutPoint{{
OutPoint: wire.OutPoint{Index: 0}.String(),
IsOurOutput: true,
}, {
OutPoint: wire.OutPoint{Index: 1}.String(),
IsOurOutput: false,
}},
}, {
name: "no outpoint is wallet controlled",
tx: &wire.MsgTx{
TxIn: []*wire.TxIn{{
PreviousOutPoint: wire.OutPoint{Index: 0},
}, {
PreviousOutPoint: wire.OutPoint{Index: 1},
}},
},
myInputs: []wallet.TransactionSummaryInput{{
Index: 2,
}, {
Index: 3,
}},
expRes: []lnwallet.PreviousOutPoint{{
OutPoint: wire.OutPoint{Index: 0}.String(),
IsOurOutput: false,
}, {
OutPoint: wire.OutPoint{Index: 1}.String(),
IsOurOutput: false,
}},
}, {
name: "tx is empty",
tx: &wire.MsgTx{
TxIn: []*wire.TxIn{},
},
myInputs: []wallet.TransactionSummaryInput{{
Index: 2,
}, {
Index: 3,
}},
expRes: []lnwallet.PreviousOutPoint{},
}, {
name: "wallet controlled input set is empty",
tx: &wire.MsgTx{
TxIn: []*wire.TxIn{{
PreviousOutPoint: wire.OutPoint{Index: 0},
}, {
PreviousOutPoint: wire.OutPoint{Index: 1},
}},
},
myInputs: []wallet.TransactionSummaryInput{},
expRes: []lnwallet.PreviousOutPoint{{
OutPoint: wire.OutPoint{Index: 0}.String(),
IsOurOutput: false,
}, {
OutPoint: wire.OutPoint{Index: 1}.String(),
IsOurOutput: false,
}},
}}
// TestPreviousOutpoints tests if we are able to get the previous
// outpoints correctly.
func TestPreviousOutpoints(t *testing.T) {
for _, test := range previousOutpointsTests {
t.Run(test.name, func(t *testing.T) {
respOutpoints := getPreviousOutpoints(
test.tx, test.myInputs,
)
for idx, respOutpoint := range respOutpoints {
expRes := test.expRes[idx]
require.Equal(
t, expRes.OutPoint,
respOutpoint.OutPoint,
)
require.Equal(
t, expRes.IsOurOutput,
respOutpoint.IsOurOutput,
)
}
})
}
}

View file

@ -98,6 +98,17 @@ type OutputDetail struct {
IsOurAddress bool
}
// PreviousOutPoint contains information about the previous outpoint.
type PreviousOutPoint struct {
// OutPoint is the transaction out point in the format txid:n.
OutPoint string
// IsOurOutput denotes if the previous output is controlled by the
// internal wallet. The flag will only detect p2wkh, np2wkh and p2tr
// inputs as its own.
IsOurOutput bool
}
// TransactionDetail describes a transaction with either inputs which belong to
// the wallet, or has outputs that pay to the wallet.
type TransactionDetail struct {
@ -141,6 +152,9 @@ type TransactionDetail struct {
// Label is an optional transaction label.
Label string
// PreviousOutpoints are the inputs for a transaction.
PreviousOutpoints []PreviousOutPoint
}
// TransactionSubscription is an interface which describes an object capable of