diff --git a/fundingmanager_test.go b/fundingmanager_test.go index b3446663..ce9db388 100644 --- a/fundingmanager_test.go +++ b/fundingmanager_test.go @@ -299,8 +299,8 @@ func createTestFundingManager(t *testing.T, privKey *btcec.PrivateKey, publTxChan := make(chan *wire.MsgTx, 1) shutdownChan := make(chan struct{}) - wc := &mockWalletController{ - rootKey: alicePrivKey, + wc := &mock.WalletController{ + RootKey: alicePrivKey, } signer := &mock.SingleSigner{ Privkey: alicePrivKey, @@ -326,8 +326,8 @@ func createTestFundingManager(t *testing.T, privKey *btcec.PrivateKey, return nil, err } - keyRing := &mockSecretKeyRing{ - rootKey: alicePrivKey, + keyRing := &mock.SecretKeyRing{ + RootKey: alicePrivKey, } lnw, err := createTestWallet( @@ -3014,7 +3014,7 @@ func TestFundingManagerFundAll(t *testing.T) { Value: btcutil.Amount( 0.05 * btcutil.SatoshiPerBitcoin, ), - PkScript: coinPkScript, + PkScript: mock.CoinPkScript, OutPoint: wire.OutPoint{ Hash: chainhash.Hash{}, Index: 0, @@ -3025,7 +3025,7 @@ func TestFundingManagerFundAll(t *testing.T) { Value: btcutil.Amount( 0.06 * btcutil.SatoshiPerBitcoin, ), - PkScript: coinPkScript, + PkScript: mock.CoinPkScript, OutPoint: wire.OutPoint{ Hash: chainhash.Hash{}, Index: 1, @@ -3059,7 +3059,7 @@ func TestFundingManagerFundAll(t *testing.T) { alice, bob := setupFundingManagers(t) defer tearDownFundingManagers(t, alice, bob) - alice.fundingMgr.cfg.Wallet.WalletController.(*mockWalletController).utxos = allCoins + alice.fundingMgr.cfg.Wallet.WalletController.(*mock.WalletController).Utxos = allCoins // We will consume the channel updates as we go, so no // buffering is needed. diff --git a/lntest/mock/secretkeyring.go b/lntest/mock/secretkeyring.go new file mode 100644 index 00000000..1c2da65f --- /dev/null +++ b/lntest/mock/secretkeyring.go @@ -0,0 +1,56 @@ +package mock + +import ( + "github.com/btcsuite/btcd/btcec" + + "github.com/lightningnetwork/lnd/keychain" +) + +// SecretKeyRing is a mock implementation of the SecretKeyRing interface. +type SecretKeyRing struct { + RootKey *btcec.PrivateKey +} + +// DeriveNextKey currently returns dummy values. +func (s *SecretKeyRing) DeriveNextKey(keyFam keychain.KeyFamily) ( + keychain.KeyDescriptor, error) { + + return keychain.KeyDescriptor{ + PubKey: s.RootKey.PubKey(), + }, nil +} + +// DeriveKey currently returns dummy values. +func (s *SecretKeyRing) DeriveKey(keyLoc keychain.KeyLocator) (keychain.KeyDescriptor, + error) { + return keychain.KeyDescriptor{ + PubKey: s.RootKey.PubKey(), + }, nil +} + +// DerivePrivKey currently returns dummy values. +func (s *SecretKeyRing) DerivePrivKey(keyDesc keychain.KeyDescriptor) (*btcec.PrivateKey, + error) { + return s.RootKey, nil +} + +// ECDH currently returns dummy values. +func (s *SecretKeyRing) ECDH(_ keychain.KeyDescriptor, pubKey *btcec.PublicKey) ([32]byte, + error) { + + return [32]byte{}, nil +} + +// SignDigest signs the passed digest and ignores the KeyDescriptor. +func (s *SecretKeyRing) SignDigest(_ keychain.KeyDescriptor, + digest [32]byte) (*btcec.Signature, error) { + + return s.RootKey.Sign(digest[:]) +} + +// SignDigestCompact signs the passed digest. +func (s *SecretKeyRing) SignDigestCompact(_ keychain.KeyDescriptor, + digest [32]byte) ([]byte, error) { + + return btcec.SignCompact(btcec.S256(), s.RootKey, digest[:], true) +} diff --git a/lntest/mock/walletcontroller.go b/lntest/mock/walletcontroller.go new file mode 100644 index 00000000..5aea2135 --- /dev/null +++ b/lntest/mock/walletcontroller.go @@ -0,0 +1,182 @@ +package mock + +import ( + "encoding/hex" + "sync/atomic" + "time" + + "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/chaincfg" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btcutil" + "github.com/btcsuite/btcwallet/wallet/txauthor" + "github.com/btcsuite/btcwallet/wtxmgr" + + "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwallet/chainfee" +) + +var ( + CoinPkScript, _ = hex.DecodeString("001431df1bde03c074d0cf21ea2529427e1499b8f1de") +) + +// WalletController is a mock implementation of the WalletController +// interface. It let's us mock the interaction with the bitcoin network. +type WalletController struct { + RootKey *btcec.PrivateKey + PublishedTransactions chan *wire.MsgTx + index uint32 + Utxos []*lnwallet.Utxo +} + +// BackEnd returns "mock" to signify a mock wallet controller. +func (w *WalletController) BackEnd() string { + return "mock" +} + +// FetchInputInfo will be called to get info about the inputs to the funding +// transaction. +func (w *WalletController) FetchInputInfo( + 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 +} + +// ConfirmedBalance currently returns dummy values. +func (w *WalletController) ConfirmedBalance(confs int32) (btcutil.Amount, error) { + return 0, nil +} + +// NewAddress is called to get new addresses for delivery, change etc. +func (w *WalletController) NewAddress(addrType lnwallet.AddressType, + change bool) (btcutil.Address, error) { + + addr, _ := btcutil.NewAddressPubKey( + w.RootKey.PubKey().SerializeCompressed(), &chaincfg.MainNetParams, + ) + return addr, nil +} + +// LastUnusedAddress currently returns dummy values. +func (w *WalletController) LastUnusedAddress(addrType lnwallet.AddressType) ( + btcutil.Address, error) { + return nil, nil +} + +// IsOurAddress currently returns a dummy value. +func (w *WalletController) IsOurAddress(a btcutil.Address) bool { + return false +} + +// SendOutputs currently returns dummy values. +func (w *WalletController) SendOutputs(outputs []*wire.TxOut, + _ chainfee.SatPerKWeight, _ string) (*wire.MsgTx, error) { + + return nil, nil +} + +// CreateSimpleTx currently returns dummy values. +func (w *WalletController) CreateSimpleTx(outputs []*wire.TxOut, + _ chainfee.SatPerKWeight, _ bool) (*txauthor.AuthoredTx, error) { + + return nil, nil +} + +// ListUnspentWitness is called by the wallet when doing coin selection. We just +// need one unspent for the funding transaction. +func (w *WalletController) ListUnspentWitness(minconfirms, + maxconfirms int32) ([]*lnwallet.Utxo, error) { + + // If the mock already has a list of utxos, return it. + if w.Utxos != nil { + return w.Utxos, nil + } + + // Otherwise create one to return. + utxo := &lnwallet.Utxo{ + AddressType: lnwallet.WitnessPubKey, + Value: btcutil.Amount(10 * btcutil.SatoshiPerBitcoin), + PkScript: CoinPkScript, + OutPoint: wire.OutPoint{ + Hash: chainhash.Hash{}, + Index: w.index, + }, + } + atomic.AddUint32(&w.index, 1) + var ret []*lnwallet.Utxo + ret = append(ret, utxo) + return ret, nil +} + +// ListTransactionDetails currently returns dummy values. +func (w *WalletController) ListTransactionDetails(_, + _ int32) ([]*lnwallet.TransactionDetail, error) { + + return nil, nil +} + +// LockOutpoint currently does nothing. +func (w *WalletController) LockOutpoint(o wire.OutPoint) {} + +// UnlockOutpoint currently does nothing. +func (w *WalletController) UnlockOutpoint(o wire.OutPoint) {} + +// LeaseOutput returns the current time and a nil error. +func (w *WalletController) LeaseOutput(wtxmgr.LockID, wire.OutPoint) (time.Time, + error) { + + return time.Now(), nil +} + +// ReleaseOutput currently does nothing. +func (w *WalletController) ReleaseOutput(wtxmgr.LockID, wire.OutPoint) error { + return nil +} + +// PublishTransaction sends a transaction to the PublishedTransactions chan. +func (w *WalletController) PublishTransaction(tx *wire.MsgTx, _ string) error { + w.PublishedTransactions <- tx + return nil +} + +// LabelTransaction currently does nothing. +func (w *WalletController) LabelTransaction(_ chainhash.Hash, _ string, + _ bool) error { + + return nil +} + +// SubscribeTransactions currently does nothing. +func (w *WalletController) SubscribeTransactions() (lnwallet.TransactionSubscription, + error) { + + return nil, nil +} + +// IsSynced currently returns dummy values. +func (w *WalletController) IsSynced() (bool, int64, error) { + return true, int64(0), nil +} + +// GetRecoveryInfo currently returns dummy values. +func (w *WalletController) GetRecoveryInfo() (bool, float64, error) { + return true, float64(1), nil +} + +// Start currently does nothing. +func (w *WalletController) Start() error { + return nil +} + +// Stop currently does nothing. +func (w *WalletController) Stop() error { + return nil +} diff --git a/mock.go b/mock.go index 15bb8eac..db9b569a 100644 --- a/mock.go +++ b/mock.go @@ -1,27 +1,14 @@ package lnd import ( - "encoding/hex" "sync" - "sync/atomic" - "time" - "github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" - "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcwallet/wallet/txauthor" - "github.com/btcsuite/btcwallet/wtxmgr" "github.com/lightningnetwork/lnd/chainntnfs" - "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnwallet" - "github.com/lightningnetwork/lnd/lnwallet/chainfee" -) - -var ( - coinPkScript, _ = hex.DecodeString("001431df1bde03c074d0cf21ea2529427e1499b8f1de") ) // The block height returned by the mock BlockChainIO's GetBestBlock. @@ -169,167 +156,3 @@ func (*mockChainIO) GetBlockHash(blockHeight int64) (*chainhash.Hash, error) { func (*mockChainIO) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) { return nil, nil } - -// mockWalletController is used by the LightningWallet, and let us mock the -// interaction with the bitcoin network. -type mockWalletController struct { - rootKey *btcec.PrivateKey - publishedTransactions chan *wire.MsgTx - index uint32 - utxos []*lnwallet.Utxo -} - -// BackEnd returns "mock" to signify a mock wallet controller. -func (*mockWalletController) BackEnd() string { - return "mock" -} - -// FetchInputInfo will be called to get info about the inputs to the funding -// transaction. -func (*mockWalletController) FetchInputInfo( - 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 -} -func (*mockWalletController) ConfirmedBalance(confs int32) (btcutil.Amount, error) { - return 0, nil -} - -// NewAddress is called to get new addresses for delivery, change etc. -func (m *mockWalletController) NewAddress(addrType lnwallet.AddressType, - change bool) (btcutil.Address, error) { - addr, _ := btcutil.NewAddressPubKey( - m.rootKey.PubKey().SerializeCompressed(), &chaincfg.MainNetParams) - return addr, nil -} -func (*mockWalletController) LastUnusedAddress(addrType lnwallet.AddressType) ( - btcutil.Address, error) { - return nil, nil -} - -func (*mockWalletController) IsOurAddress(a btcutil.Address) bool { - return false -} - -func (*mockWalletController) SendOutputs(outputs []*wire.TxOut, - _ chainfee.SatPerKWeight, _ string) (*wire.MsgTx, error) { - - return nil, nil -} - -func (*mockWalletController) CreateSimpleTx(outputs []*wire.TxOut, - _ chainfee.SatPerKWeight, _ bool) (*txauthor.AuthoredTx, error) { - - return nil, nil -} - -// ListUnspentWitness is called by the wallet when doing coin selection. We just -// need one unspent for the funding transaction. -func (m *mockWalletController) ListUnspentWitness(minconfirms, - maxconfirms int32) ([]*lnwallet.Utxo, error) { - - // If the mock already has a list of utxos, return it. - if m.utxos != nil { - return m.utxos, nil - } - - // Otherwise create one to return. - utxo := &lnwallet.Utxo{ - AddressType: lnwallet.WitnessPubKey, - Value: btcutil.Amount(10 * btcutil.SatoshiPerBitcoin), - PkScript: coinPkScript, - OutPoint: wire.OutPoint{ - Hash: chainhash.Hash{}, - Index: m.index, - }, - } - atomic.AddUint32(&m.index, 1) - var ret []*lnwallet.Utxo - ret = append(ret, utxo) - return ret, nil -} -func (*mockWalletController) ListTransactionDetails(_, _ int32) ([]*lnwallet.TransactionDetail, error) { - return nil, nil -} -func (*mockWalletController) LockOutpoint(o wire.OutPoint) {} -func (*mockWalletController) UnlockOutpoint(o wire.OutPoint) {} - -func (*mockWalletController) LeaseOutput(wtxmgr.LockID, wire.OutPoint) (time.Time, error) { - return time.Now(), nil -} -func (*mockWalletController) ReleaseOutput(wtxmgr.LockID, wire.OutPoint) error { - return nil -} - -func (m *mockWalletController) PublishTransaction(tx *wire.MsgTx, _ string) error { - m.publishedTransactions <- tx - return nil -} - -func (m *mockWalletController) LabelTransaction(_ chainhash.Hash, _ string, - _ bool) error { - - return nil -} - -func (*mockWalletController) SubscribeTransactions() (lnwallet.TransactionSubscription, error) { - return nil, nil -} -func (*mockWalletController) IsSynced() (bool, int64, error) { - return true, int64(0), nil -} -func (*mockWalletController) GetRecoveryInfo() (bool, float64, error) { - return true, float64(1), nil -} -func (*mockWalletController) Start() error { - return nil -} -func (*mockWalletController) Stop() error { - return nil -} - -type mockSecretKeyRing struct { - rootKey *btcec.PrivateKey -} - -func (m *mockSecretKeyRing) DeriveNextKey(keyFam keychain.KeyFamily) (keychain.KeyDescriptor, error) { - return keychain.KeyDescriptor{ - PubKey: m.rootKey.PubKey(), - }, nil -} - -func (m *mockSecretKeyRing) DeriveKey(keyLoc keychain.KeyLocator) (keychain.KeyDescriptor, error) { - return keychain.KeyDescriptor{ - PubKey: m.rootKey.PubKey(), - }, nil -} - -func (m *mockSecretKeyRing) DerivePrivKey(keyDesc keychain.KeyDescriptor) (*btcec.PrivateKey, error) { - return m.rootKey, nil -} - -func (m *mockSecretKeyRing) ECDH(_ keychain.KeyDescriptor, - pubKey *btcec.PublicKey) ([32]byte, error) { - - return [32]byte{}, nil -} - -func (m *mockSecretKeyRing) SignDigest(_ keychain.KeyDescriptor, - digest [32]byte) (*btcec.Signature, error) { - - return m.rootKey.Sign(digest[:]) -} - -func (m *mockSecretKeyRing) SignDigestCompact(_ keychain.KeyDescriptor, - digest [32]byte) ([]byte, error) { - - return btcec.SignCompact(btcec.S256(), m.rootKey, digest[:], true) -} - -var _ keychain.SecretKeyRing = (*mockSecretKeyRing)(nil) diff --git a/peer/test_utils.go b/peer/test_utils.go index ba3f354f..2c4289c4 100644 --- a/peer/test_utils.go +++ b/peer/test_utils.go @@ -12,12 +12,9 @@ import ( "time" "github.com/btcsuite/btcd/btcec" - "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcutil" - "github.com/btcsuite/btcwallet/wallet/txauthor" - "github.com/btcsuite/btcwallet/wtxmgr" "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/htlcswitch" @@ -125,120 +122,6 @@ func (*mockChainIO) GetBlock(blockHash *chainhash.Hash) (*wire.MsgBlock, error) var _ lnwallet.BlockChainIO = (*mockChainIO)(nil) -type mockWalletController struct { - rootKey *btcec.PrivateKey - publishedTxns chan *wire.MsgTx -} - -func (*mockWalletController) FetchInputInfo(prevOut *wire.OutPoint) ( - *lnwallet.Utxo, error) { - - return nil, nil -} - -func (*mockWalletController) ConfirmedBalance(confs int32) (btcutil.Amount, - error) { - - return 0, nil -} - -func (m *mockWalletController) NewAddress(addrType lnwallet.AddressType, - change bool) (btcutil.Address, error) { - - addr, _ := btcutil.NewAddressPubKey( - m.rootKey.PubKey().SerializeCompressed(), &chaincfg.MainNetParams, - ) - return addr, nil -} - -func (*mockWalletController) LastUnusedAddress(addrType lnwallet.AddressType) ( - btcutil.Address, error) { - - return nil, nil -} - -func (*mockWalletController) IsOurAddress(a btcutil.Address) bool { - return false -} - -func (*mockWalletController) SendOutputs(outputs []*wire.TxOut, - feeRate chainfee.SatPerKWeight, label string) (*wire.MsgTx, error) { - - return nil, nil -} - -func (*mockWalletController) CreateSimpleTx(outputs []*wire.TxOut, - feeRate chainfee.SatPerKWeight, dryRun bool) (*txauthor.AuthoredTx, error) { - - return nil, nil -} - -func (*mockWalletController) ListUnspentWitness(minconfirms, - maxconfirms int32) ([]*lnwallet.Utxo, error) { - - return nil, nil -} - -func (*mockWalletController) ListTransactionDetails(startHeight, - endHeight int32) ([]*lnwallet.TransactionDetail, error) { - - return nil, nil -} - -func (*mockWalletController) LockOutpoint(o wire.OutPoint) {} - -func (*mockWalletController) UnlockOutpoint(o wire.OutPoint) {} - -func (m *mockWalletController) PublishTransaction(tx *wire.MsgTx, - label string) error { - m.publishedTxns <- tx - return nil -} - -func (*mockWalletController) LabelTransaction(hash chainhash.Hash, - label string, overwrite bool) error { - - return nil -} - -func (*mockWalletController) SubscribeTransactions() ( - lnwallet.TransactionSubscription, error) { - - return nil, nil -} - -func (*mockWalletController) IsSynced() (bool, int64, error) { - return false, 0, nil -} - -func (*mockWalletController) Start() error { - return nil -} - -func (*mockWalletController) Stop() error { - return nil -} - -func (*mockWalletController) BackEnd() string { - return "" -} - -func (*mockWalletController) LeaseOutput(wtxmgr.LockID, - wire.OutPoint) (time.Time, error) { - - return time.Now(), nil -} - -func (*mockWalletController) ReleaseOutput(wtxmgr.LockID, wire.OutPoint) error { - return nil -} - -func (*mockWalletController) GetRecoveryInfo() (bool, float64, error) { - return false, 0, nil -} - -var _ lnwallet.WalletController = (*mockWalletController)(nil) - type mockNotifier struct { confChannel chan *chainntnfs.TxConfirmation } @@ -535,9 +418,9 @@ func createTestPeer(notifier chainntnfs.ChainNotifier, bestHeight: broadcastHeight, } wallet := &lnwallet.LightningWallet{ - WalletController: &mockWalletController{ - rootKey: aliceKeyPriv, - publishedTxns: publTx, + WalletController: &mock.WalletController{ + RootKey: aliceKeyPriv, + PublishedTransactions: publTx, }, }