Watch-only accounts are usually backed by an external hardware signer, some of which require derivation paths to be populated for each relevant input to sign.
88 lines
2.7 KiB
Go
88 lines
2.7 KiB
Go
// Copyright (c) 2020 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package wallet
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/btcsuite/btcd/txscript"
|
|
"github.com/btcsuite/btcd/wire"
|
|
"github.com/btcsuite/btcutil/hdkeychain"
|
|
"github.com/btcsuite/btcwallet/waddrmgr"
|
|
)
|
|
|
|
// TestFetchInputInfo checks that the wallet can gather information about an
|
|
// output based on the address.
|
|
func TestFetchInputInfo(t *testing.T) {
|
|
w, cleanup := testWallet(t)
|
|
defer cleanup()
|
|
|
|
// Create an address we can use to send some coins to.
|
|
addr, err := w.CurrentAddress(0, waddrmgr.KeyScopeBIP0084)
|
|
if err != nil {
|
|
t.Fatalf("unable to get current address: %v", addr)
|
|
}
|
|
p2shAddr, err := txscript.PayToAddrScript(addr)
|
|
if err != nil {
|
|
t.Fatalf("unable to convert wallet address to p2sh: %v", err)
|
|
}
|
|
|
|
// Add an output paying to the wallet's address to the database.
|
|
utxOut := wire.NewTxOut(100000, p2shAddr)
|
|
incomingTx := &wire.MsgTx{
|
|
TxIn: []*wire.TxIn{{}},
|
|
TxOut: []*wire.TxOut{utxOut},
|
|
}
|
|
addUtxo(t, w, incomingTx)
|
|
|
|
// Look up the UTXO for the outpoint now and compare it to our
|
|
// expectations.
|
|
prevOut := &wire.OutPoint{
|
|
Hash: incomingTx.TxHash(),
|
|
Index: 0,
|
|
}
|
|
tx, out, derivationPath, confirmations, err := w.FetchInputInfo(prevOut)
|
|
if err != nil {
|
|
t.Fatalf("error fetching input info: %v", err)
|
|
}
|
|
if !bytes.Equal(out.PkScript, utxOut.PkScript) || out.Value != utxOut.Value {
|
|
t.Fatalf("unexpected TX out, got %v wanted %v", out, utxOut)
|
|
}
|
|
if !bytes.Equal(tx.TxOut[prevOut.Index].PkScript, utxOut.PkScript) {
|
|
t.Fatalf("unexpected TX out, got %v wanted %v",
|
|
tx.TxOut[prevOut.Index].PkScript, utxOut)
|
|
}
|
|
if len(derivationPath.Bip32Path) != 5 {
|
|
t.Fatalf("expected derivation path of length %v, got %v", 3,
|
|
len(derivationPath.Bip32Path))
|
|
}
|
|
if derivationPath.Bip32Path[0] != waddrmgr.KeyScopeBIP0084.Purpose {
|
|
t.Fatalf("expected purpose %v, got %v",
|
|
waddrmgr.KeyScopeBIP0084.Purpose,
|
|
derivationPath.Bip32Path[0])
|
|
}
|
|
if derivationPath.Bip32Path[1] != waddrmgr.KeyScopeBIP0084.Coin {
|
|
t.Fatalf("expected coin type %v, got %v",
|
|
waddrmgr.KeyScopeBIP0084.Coin,
|
|
derivationPath.Bip32Path[1])
|
|
}
|
|
if derivationPath.Bip32Path[2] != hdkeychain.HardenedKeyStart {
|
|
t.Fatalf("expected account %v, got %v",
|
|
hdkeychain.HardenedKeyStart, derivationPath.Bip32Path[2])
|
|
}
|
|
if derivationPath.Bip32Path[3] != 0 {
|
|
t.Fatalf("expected branch %v, got %v", 0,
|
|
derivationPath.Bip32Path[3])
|
|
}
|
|
if derivationPath.Bip32Path[4] != 0 {
|
|
t.Fatalf("expected index %v, got %v", 0,
|
|
derivationPath.Bip32Path[4])
|
|
}
|
|
if confirmations != int64(0-testBlockHeight) {
|
|
t.Fatalf("unexpected number of confirmations, got %d wanted %d",
|
|
confirmations, 0-testBlockHeight)
|
|
}
|
|
}
|