lnwallet: refactor common logic between NewAddress and LastUnusedAddress

This commit is contained in:
Wilmer Paulino 2021-05-25 15:59:59 -07:00
parent 785d3c9b4f
commit 798113a024
No known key found for this signature in database
GPG Key ID: 6DF57B9F9514972F

@ -70,6 +70,10 @@ var (
// requested for the default imported account within the wallet. // requested for the default imported account within the wallet.
errNoImportedAddrGen = errors.New("addresses cannot be generated for " + errNoImportedAddrGen = errors.New("addresses cannot be generated for " +
"the default imported account") "the default imported account")
// errIncompatibleAccountAddr
errIncompatibleAccountAddr = errors.New("incompatible address type " +
"for account")
) )
// BtcWallet is an implementation of the lnwallet.WalletController interface // BtcWallet is an implementation of the lnwallet.WalletController interface
@ -365,6 +369,38 @@ func (b *BtcWallet) ConfirmedBalance(confs int32,
return balance, nil return balance, nil
} }
// keyScopeForAccountAddr determines the appropriate key scope of an account
// based on its name/address type.
func (b *BtcWallet) keyScopeForAccountAddr(accountName string,
addrType lnwallet.AddressType) (waddrmgr.KeyScope, uint32, error) {
// Map the requested address type to its key scope.
var addrKeyScope waddrmgr.KeyScope
switch addrType {
case lnwallet.WitnessPubKey:
addrKeyScope = waddrmgr.KeyScopeBIP0084
case lnwallet.NestedWitnessPubKey:
addrKeyScope = waddrmgr.KeyScopeBIP0049Plus
default:
return waddrmgr.KeyScope{}, 0,
fmt.Errorf("unknown address type")
}
// The default account spans across multiple key scopes, so the
// requested address type should already be valid for this account.
if accountName == lnwallet.DefaultAccountName {
return addrKeyScope, defaultAccount, nil
}
// Otherwise, look up the account's key scope.
keyScope, account, err := b.wallet.LookupAccount(accountName)
if err != nil {
return waddrmgr.KeyScope{}, 0, err
}
return keyScope, account, nil
}
// NewAddress returns the next external or internal address for the wallet // NewAddress returns the next external or internal address for the wallet
// dictated by the value of the `change` parameter. If change is true, then an // dictated by the value of the `change` parameter. If change is true, then an
// internal address will be returned, otherwise an external address should be // internal address will be returned, otherwise an external address should be
@ -375,32 +411,15 @@ func (b *BtcWallet) ConfirmedBalance(confs int32,
func (b *BtcWallet) NewAddress(t lnwallet.AddressType, change bool, func (b *BtcWallet) NewAddress(t lnwallet.AddressType, change bool,
accountName string) (btcutil.Address, error) { accountName string) (btcutil.Address, error) {
var ( // Addresses cannot be derived from the catch-all imported accounts.
keyScope waddrmgr.KeyScope if accountName == waddrmgr.ImportedAddrAccountName {
account uint32
)
switch accountName {
case waddrmgr.ImportedAddrAccountName:
return nil, errNoImportedAddrGen return nil, errNoImportedAddrGen
case lnwallet.DefaultAccountName:
switch t {
case lnwallet.WitnessPubKey:
keyScope = waddrmgr.KeyScopeBIP0084
case lnwallet.NestedWitnessPubKey:
keyScope = waddrmgr.KeyScopeBIP0049Plus
default:
return nil, fmt.Errorf("unknown address type")
} }
account = defaultAccount
default: keyScope, account, err := b.keyScopeForAccountAddr(accountName, t)
var err error
keyScope, account, err = b.wallet.LookupAccount(accountName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
}
if change { if change {
return b.wallet.NewChangeAddress(account, keyScope) return b.wallet.NewChangeAddress(account, keyScope)
@ -418,32 +437,15 @@ func (b *BtcWallet) NewAddress(t lnwallet.AddressType, change bool,
func (b *BtcWallet) LastUnusedAddress(addrType lnwallet.AddressType, func (b *BtcWallet) LastUnusedAddress(addrType lnwallet.AddressType,
accountName string) (btcutil.Address, error) { accountName string) (btcutil.Address, error) {
var ( // Addresses cannot be derived from the catch-all imported accounts.
keyScope waddrmgr.KeyScope if accountName == waddrmgr.ImportedAddrAccountName {
account uint32
)
switch accountName {
case waddrmgr.ImportedAddrAccountName:
return nil, errNoImportedAddrGen return nil, errNoImportedAddrGen
case lnwallet.DefaultAccountName:
switch addrType {
case lnwallet.WitnessPubKey:
keyScope = waddrmgr.KeyScopeBIP0084
case lnwallet.NestedWitnessPubKey:
keyScope = waddrmgr.KeyScopeBIP0049Plus
default:
return nil, fmt.Errorf("unknown address type")
} }
account = defaultAccount
default: keyScope, account, err := b.keyScopeForAccountAddr(accountName, addrType)
var err error
keyScope, account, err = b.wallet.LookupAccount(accountName)
if err != nil { if err != nil {
return nil, err return nil, err
} }
}
return b.wallet.CurrentAddress(account, keyScope) return b.wallet.CurrentAddress(account, keyScope)
} }