From 9801ee036b09d3a4688adc245317f01578ac742a Mon Sep 17 00:00:00 2001 From: yyforyongyu Date: Thu, 8 Aug 2024 15:01:53 +0800 Subject: [PATCH] lnwallet+lntest: add `FetchOutpointInfo` and `FetchDerivationInfo` --- lntest/mock/walletcontroller.go | 23 +++++++++++++++++ lnwallet/btcwallet/signer.go | 44 +++++++++++++++++++++++++++++++++ lnwallet/interface.go | 16 +++++++++--- lnwallet/mock.go | 24 ++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/lntest/mock/walletcontroller.go b/lntest/mock/walletcontroller.go index 7af22e038..e8d65570b 100644 --- a/lntest/mock/walletcontroller.go +++ b/lntest/mock/walletcontroller.go @@ -58,6 +58,21 @@ func (w *WalletController) FetchInputInfo( return utxo, nil } +// FetchOutpointInfo will be called to get info about the inputs to the funding +// transaction. +func (w *WalletController) FetchOutpointInfo( + prevOut *wire.OutPoint) (*lnwallet.Utxo, error) { + + utxo := &lnwallet.Utxo{ + AddressType: lnwallet.WitnessPubKey, + Value: 10 * btcutil.SatoshiPerBitcoin, + PkScript: []byte("dummy"), + Confirmations: 1, + OutPoint: *prevOut, + } + return utxo, nil +} + // ScriptForOutput returns the address, witness program and redeem script for a // given UTXO. An error is returned if the UTXO does not belong to our wallet or // it is not a managed pubKey address. @@ -292,3 +307,11 @@ func (w *WalletController) RemoveDescendants(*wire.MsgTx) error { func (w *WalletController) CheckMempoolAcceptance(tx *wire.MsgTx) error { return nil } + +// FetchDerivationInfo queries for the wallet's knowledge of the passed +// pkScript and constructs the derivation info and returns it. +func (w *WalletController) FetchDerivationInfo( + pkScript []byte) (*psbt.Bip32Derivation, error) { + + return nil, nil +} diff --git a/lnwallet/btcwallet/signer.go b/lnwallet/btcwallet/signer.go index 986416476..e6021f12a 100644 --- a/lnwallet/btcwallet/signer.go +++ b/lnwallet/btcwallet/signer.go @@ -8,6 +8,7 @@ import ( "github.com/btcsuite/btcd/btcec/v2/schnorr" "github.com/btcsuite/btcd/btcutil" "github.com/btcsuite/btcd/btcutil/hdkeychain" + "github.com/btcsuite/btcd/btcutil/psbt" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" @@ -56,6 +57,49 @@ func (b *BtcWallet) FetchInputInfo(prevOut *wire.OutPoint) (*lnwallet.Utxo, }, nil } +// FetchOutpointInfo queries for the WalletController's knowledge of the passed +// outpoint. If the base wallet determines this output is under its control, +// then the original txout should be returned. Otherwise, a non-nil error value +// of ErrNotMine should be returned instead. +// +// This is a part of the WalletController interface. +func (b *BtcWallet) FetchOutpointInfo(prevOut *wire.OutPoint) (*lnwallet.Utxo, + error) { + + prevTx, txOut, confirmations, err := b.wallet.FetchOutpointInfo(prevOut) + if err != nil { + return nil, err + } + + // Then, we'll populate all of the information required by the struct. + addressType := lnwallet.UnknownAddressType + switch { + case txscript.IsPayToWitnessPubKeyHash(txOut.PkScript): + addressType = lnwallet.WitnessPubKey + case txscript.IsPayToScriptHash(txOut.PkScript): + addressType = lnwallet.NestedWitnessPubKey + case txscript.IsPayToTaproot(txOut.PkScript): + addressType = lnwallet.TaprootPubkey + } + + return &lnwallet.Utxo{ + AddressType: addressType, + Value: btcutil.Amount(txOut.Value), + PkScript: txOut.PkScript, + Confirmations: confirmations, + OutPoint: *prevOut, + PrevTx: prevTx, + }, nil +} + +// FetchDerivationInfo queries for the wallet's knowledge of the passed +// pkScript and constructs the derivation info and returns it. +func (b *BtcWallet) FetchDerivationInfo( + pkScript []byte) (*psbt.Bip32Derivation, error) { + + return b.wallet.FetchDerivationInfo(pkScript) +} + // ScriptForOutput returns the address, witness program and redeem script for a // given UTXO. An error is returned if the UTXO does not belong to our wallet or // it is not a managed pubKey address. diff --git a/lnwallet/interface.go b/lnwallet/interface.go index af5955d8e..37568cfa6 100644 --- a/lnwallet/interface.go +++ b/lnwallet/interface.go @@ -228,11 +228,21 @@ type TransactionSubscription interface { // across all concrete implementations. type WalletController interface { // FetchInputInfo queries for the WalletController's knowledge of the - // passed outpoint. If the base wallet determines this output is under - // its control, then the original txout should be returned. Otherwise, - // a non-nil error value of ErrNotMine should be returned instead. + // passed outpoint. It returns the same info as `FetchOutpointInfo` + // plus the Bip32Derivation info. FetchInputInfo(prevOut *wire.OutPoint) (*Utxo, error) + // FetchOutpointInfo queries for the WalletController's knowledge of + // the passed outpoint. If the base wallet determines this output is + // under its control, then the original txout should be returned. + // Otherwise, a non-nil error value of ErrNotMine should be returned + // instead. + FetchOutpointInfo(prevOut *wire.OutPoint) (*Utxo, error) + + // FetchDerivationInfo queries for the wallet's knowledge of the passed + // pkScript and constructs the derivation info and returns it. + FetchDerivationInfo(pkScript []byte) (*psbt.Bip32Derivation, error) + // ScriptForOutput returns the address, witness program and redeem // script for a given UTXO. An error is returned if the UTXO does not // belong to our wallet or it is not a managed pubKey address. diff --git a/lnwallet/mock.go b/lnwallet/mock.go index e6bd0b2e4..62efd6145 100644 --- a/lnwallet/mock.go +++ b/lnwallet/mock.go @@ -61,6 +61,22 @@ func (w *mockWalletController) FetchInputInfo( return utxo, nil } +// FetchOutpointInfo will be called to get info about the inputs to the funding +// transaction. +func (w *mockWalletController) FetchOutpointInfo( + prevOut *wire.OutPoint) (*Utxo, error) { + + utxo := &Utxo{ + AddressType: WitnessPubKey, + Value: 10 * btcutil.SatoshiPerBitcoin, + PkScript: []byte("dummy"), + Confirmations: 1, + OutPoint: *prevOut, + } + + return utxo, nil +} + // ScriptForOutput returns the address, witness program and redeem script for a // given UTXO. An error is returned if the UTXO does not belong to our wallet or // it is not a managed pubKey address. @@ -300,6 +316,14 @@ func (w *mockWalletController) RemoveDescendants(*wire.MsgTx) error { return nil } +// FetchDerivationInfo queries for the wallet's knowledge of the passed +// pkScript and constructs the derivation info and returns it. +func (w *mockWalletController) FetchDerivationInfo( + pkScript []byte) (*psbt.Bip32Derivation, error) { + + return nil, nil +} + func (w *mockWalletController) CheckMempoolAcceptance(tx *wire.MsgTx) error { return nil }