multi-account: update getaddressbyaccount

This commit is contained in:
Roy Lee 2022-08-25 22:27:21 -07:00
parent a02435bbf7
commit 6a610a8cdf
3 changed files with 41 additions and 12 deletions

View file

@ -394,16 +394,25 @@ func dumpPrivKey(icmd interface{}, w *wallet.Wallet) (interface{}, error) {
// getAddressesByAccount handles a getaddressesbyaccount request by returning
// all addresses for an account, or an error if the requested account does
// not exist.
func getAddressesByAccount(icmd interface{}, w *wallet.Wallet) (interface{}, error) {
// not exist. If addresstype is also specified, only those address types are
// returned.
func getAddressesByAccount(icmd interface{}, w *wallet.Wallet) (
interface{}, error) {
cmd := icmd.(*btcjson.GetAddressesByAccountCmd)
account, err := w.AccountNumber(waddrmgr.KeyScopeBIP0044, cmd.Account)
account, err := w.AccountNumber(*cmd.Account)
if err != nil {
return nil, err
}
addrs, err := w.AccountAddresses(account)
// Use specified scope, if provided.
scope, err := lookupKeyScope(cmd.AddressType)
if err != nil {
return nil, err
}
addrs, err := w.AccountAddresses(account, scope)
if err != nil {
return nil, err
}
@ -412,6 +421,7 @@ func getAddressesByAccount(icmd interface{}, w *wallet.Wallet) (interface{}, err
for i, a := range addrs {
addrStrs[i] = a.EncodeAddress()
}
return addrStrs, nil
}

View file

@ -83,7 +83,7 @@ func TestTxToOutputsDryRun(t *testing.T) {
}
change := dryRunTx.Tx.TxOut[dryRunTx.ChangeIndex]
addresses, err := w.AccountAddresses(0)
addresses, err := w.AccountAddresses(0, nil)
if err != nil {
t.Fatalf("unable to get addresses: %v", err)
}
@ -100,7 +100,7 @@ func TestTxToOutputsDryRun(t *testing.T) {
}
change2 := dryRunTx2.Tx.TxOut[dryRunTx2.ChangeIndex]
addresses, err = w.AccountAddresses(0)
addresses, err = w.AccountAddresses(0, nil)
if err != nil {
t.Fatalf("unable to get addresses: %v", err)
}
@ -135,7 +135,7 @@ func TestTxToOutputsDryRun(t *testing.T) {
}
change3 := tx.Tx.TxOut[tx.ChangeIndex]
addresses, err = w.AccountAddresses(0)
addresses, err = w.AccountAddresses(0, nil)
if err != nil {
t.Fatalf("unable to get addresses: %v", err)
}

View file

@ -1407,13 +1407,32 @@ func (w *Wallet) ChangePassphrases(publicOld, publicNew, privateOld,
// AccountAddresses returns the addresses for every created address for an
// account.
func (w *Wallet) AccountAddresses(account uint32) (addrs []btcutil.Address, err error) {
func (w *Wallet) AccountAddresses(account uint32, scope *waddrmgr.KeyScope) (
addrs []btcutil.Address, err error) {
// By default, append all addresses under this account.
fn := func(maddr waddrmgr.ManagedAddress) error {
addrs = append(addrs, maddr.Address())
return nil
}
// If scope is set, append only those have the address type under
// this scope.
if scope != nil {
addrSchema := waddrmgr.ScopeAddrMap[*scope]
fn = func(maddr waddrmgr.ManagedAddress) error {
if maddr.AddrType() == addrSchema.InternalAddrType ||
maddr.AddrType() == addrSchema.ExternalAddrType {
addrs = append(addrs, maddr.Address())
}
return nil
}
}
err = walletdb.View(w.db, func(tx walletdb.ReadTx) error {
addrmgrNs := tx.ReadBucket(waddrmgrNamespaceKey)
return w.Manager.ForEachAccountAddress(addrmgrNs, account, func(maddr waddrmgr.ManagedAddress) error {
addrs = append(addrs, maddr.Address())
return nil
})
return w.Manager.ForEachAccountAddress(addrmgrNs, account, fn)
})
return
}