diff --git a/cmd/cmd.go b/cmd/cmd.go index df97c2a9c..fd04d506b 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -433,7 +433,7 @@ func StartNode(workingDir string, passwordFetcher func(*wallet.Wallet) (string, } } else { for i := 0; i < len(valAddrsInfo); i++ { - valAddrPath, _ := addresspath.NewPathFromString(valAddrsInfo[i].Path) + valAddrPath, _ := addresspath.FromString(valAddrsInfo[i].Path) accAddrPath := addresspath.NewPath( valAddrPath.Purpose(), valAddrPath.CoinType(), diff --git a/cmd/gtk/dialog_transaction_bond.go b/cmd/gtk/dialog_transaction_bond.go index 64ad94c43..ef8986600 100644 --- a/cmd/gtk/dialog_transaction_bond.go +++ b/cmd/gtk/dialog_transaction_bond.go @@ -31,8 +31,7 @@ func broadcastTransactionBond(wlt *wallet.Wallet) { getButtonObj(builder, "id_button_cancel").SetImage(CancelIcon()) getButtonObj(builder, "id_button_send").SetImage(SendIcon()) - // TODO: we need something like: wlt.AllAccountAddresses() - for _, ai := range wlt.AddressInfos() { + for _, ai := range wlt.AllAccountAddresses() { senderEntry.Append(ai.Address, ai.Address) } diff --git a/cmd/gtk/dialog_transaction_transfer.go b/cmd/gtk/dialog_transaction_transfer.go index 5a0f187f3..c37b3c12c 100644 --- a/cmd/gtk/dialog_transaction_transfer.go +++ b/cmd/gtk/dialog_transaction_transfer.go @@ -30,8 +30,7 @@ func broadcastTransactionTransfer(wlt *wallet.Wallet) { getButtonObj(builder, "id_button_cancel").SetImage(CancelIcon()) getButtonObj(builder, "id_button_send").SetImage(SendIcon()) - // TODO: we need something like: wlt.AllAccountAddresses() - for _, i := range wlt.AddressInfos() { + for _, i := range wlt.AllAccountAddresses() { senderEntry.Append(i.Address, i.Address) } senderEntry.SetActive(0) diff --git a/wallet/addresspath/path.go b/wallet/addresspath/path.go index 69078ff8a..ba95e9666 100644 --- a/wallet/addresspath/path.go +++ b/wallet/addresspath/path.go @@ -18,7 +18,7 @@ func NewPath(indexes ...uint32) Path { } // TODO: check the path should exactly 4 levels. -func NewPathFromString(str string) (Path, error) { +func FromString(str string) (Path, error) { sub := strings.Split(str, "/") if sub[0] != "m" { return nil, ErrInvalidPath diff --git a/wallet/addresspath/path_test.go b/wallet/addresspath/path_test.go index bc453e7a8..637451659 100644 --- a/wallet/addresspath/path_test.go +++ b/wallet/addresspath/path_test.go @@ -45,7 +45,7 @@ func TestStringToPath(t *testing.T) { {"m/abc'", nil, strconv.ErrSyntax}, } for i, test := range tests { - path, err := NewPathFromString(test.str) + path, err := FromString(test.str) assert.Equal(t, path, test.wantPath, "case %d failed", i) assert.ErrorIsf(t, err, test.wantErr, "case %d failed", i) } diff --git a/wallet/vault/vault.go b/wallet/vault/vault.go index 48dc8bb1b..182bf7e0c 100644 --- a/wallet/vault/vault.go +++ b/wallet/vault/vault.go @@ -220,7 +220,7 @@ func (v *Vault) AddressInfos() []AddressInfo { func (v *Vault) AllValidatorAddresses() []AddressInfo { addrs := make([]AddressInfo, 0, v.AddressCount()/2) for _, addrInfo := range v.Addresses { - addrPath, _ := addresspath.NewPathFromString(addrInfo.Path) + addrPath, _ := addresspath.FromString(addrInfo.Path) if addrPath.AddressType() == H(crypto.AddressTypeValidator) { addrs = append(addrs, addrInfo) } @@ -232,10 +232,25 @@ func (v *Vault) AllValidatorAddresses() []AddressInfo { return addrs } +func (v *Vault) AllAccountAddresses() []AddressInfo { + addrs := make([]AddressInfo, 0, v.AddressCount()/2) + for _, addrInfo := range v.Addresses { + addrPath, _ := addresspath.FromString(addrInfo.Path) + if addrPath.AddressType() != H(crypto.AddressTypeValidator) { + addrs = append(addrs, addrInfo) + } + } + + v.SortAddressesByAddressIndex(addrs...) + v.SortAddressesByPurpose(addrs...) + + return addrs +} + func (v *Vault) AllImportedPrivateKeysAddresses() []AddressInfo { addrs := make([]AddressInfo, 0, v.AddressCount()/2) for _, addrInfo := range v.Addresses { - addrPath, _ := addresspath.NewPathFromString(addrInfo.Path) + addrPath, _ := addresspath.FromString(addrInfo.Path) if addrPath.Purpose() == H(PurposeImportPrivateKey) { addrs = append(addrs, addrInfo) } @@ -249,8 +264,8 @@ func (v *Vault) AllImportedPrivateKeysAddresses() []AddressInfo { func (v *Vault) SortAddressesByPurpose(addrs ...AddressInfo) { slices.SortStableFunc(addrs, func(a, b AddressInfo) int { - pathA, _ := addresspath.NewPathFromString(a.Path) - pathB, _ := addresspath.NewPathFromString(b.Path) + pathA, _ := addresspath.FromString(a.Path) + pathB, _ := addresspath.FromString(b.Path) return cmp.Compare(pathA.Purpose(), pathB.Purpose()) }) @@ -258,8 +273,8 @@ func (v *Vault) SortAddressesByPurpose(addrs ...AddressInfo) { func (v *Vault) SortAddressesByAddressType(addrs ...AddressInfo) { slices.SortStableFunc(addrs, func(a, b AddressInfo) int { - pathA, _ := addresspath.NewPathFromString(a.Path) - pathB, _ := addresspath.NewPathFromString(b.Path) + pathA, _ := addresspath.FromString(a.Path) + pathB, _ := addresspath.FromString(b.Path) return cmp.Compare(pathA.AddressType(), pathB.AddressType()) }) @@ -267,8 +282,8 @@ func (v *Vault) SortAddressesByAddressType(addrs ...AddressInfo) { func (v *Vault) SortAddressesByAddressIndex(addrs ...AddressInfo) { slices.SortStableFunc(addrs, func(a, b AddressInfo) int { - pathA, _ := addresspath.NewPathFromString(a.Path) - pathB, _ := addresspath.NewPathFromString(b.Path) + pathA, _ := addresspath.FromString(a.Path) + pathB, _ := addresspath.FromString(b.Path) return cmp.Compare(pathA.AddressIndex(), pathB.AddressIndex()) }) @@ -370,7 +385,7 @@ func (v *Vault) PrivateKeys(password string, addrs []string) ([]crypto.PrivateKe return nil, NewErrAddressNotFound(addr) } - path, err := addresspath.NewPathFromString(info.Path) + path, err := addresspath.FromString(info.Path) if err != nil { return nil, err } @@ -484,7 +499,7 @@ func (v *Vault) AddressInfo(addr string) *AddressInfo { return nil } - path, err := addresspath.NewPathFromString(info.Path) + path, err := addresspath.FromString(info.Path) if err != nil { return nil } @@ -513,7 +528,7 @@ func (v *Vault) AddressInfo(addr string) *AddressInfo { return nil } - p, err := addresspath.NewPathFromString(info.Path) + p, err := addresspath.FromString(info.Path) if err != nil { return nil } diff --git a/wallet/vault/vault_test.go b/wallet/vault/vault_test.go index 622a9568e..52b3260ea 100644 --- a/wallet/vault/vault_test.go +++ b/wallet/vault/vault_test.go @@ -82,7 +82,7 @@ func TestAddressInfo(t *testing.T) { // assert.Equal(t, i.Address, info.PublicKey) addr, _ := crypto.AddressFromString(info.Address) - path, _ := addresspath.NewPathFromString(info.Path) + path, _ := addresspath.FromString(info.Path) switch path.Purpose() { case H(PurposeBLS12381): @@ -123,6 +123,20 @@ func TestSortAddressInfo(t *testing.T) { assert.Equal(t, "m/65535'/21888'/2'/0'", infos[len(infos)-1].Path) } +func TestAllAccountAddresses(t *testing.T) { + td := setup(t) + + assert.Equal(t, td.vault.AddressCount(), 6) + + accountAddrs := td.vault.AllAccountAddresses() + for _, i := range accountAddrs { + path, err := addresspath.FromString(i.Path) + assert.NoError(t, err) + + assert.NotEqual(t, H(crypto.AddressTypeValidator), path.AddressType()) + } +} + func TestAllValidatorAddresses(t *testing.T) { td := setup(t) @@ -133,7 +147,7 @@ func TestAllValidatorAddresses(t *testing.T) { info := td.vault.AddressInfo(i.Address) assert.Equal(t, i.Address, info.Address) - path, _ := addresspath.NewPathFromString(info.Path) + path, _ := addresspath.FromString(info.Path) switch path.Purpose() { case H(PurposeBLS12381): @@ -191,7 +205,7 @@ func TestAllImportedPrivateKeysAddresses(t *testing.T) { assert.Equal(t, i.Address, info.Address) addr, _ := crypto.AddressFromString(info.Address) - path, _ := addresspath.NewPathFromString(info.Path) + path, _ := addresspath.FromString(info.Path) if addr.IsValidatorAddress() { assert.Equal(t, info.Path, fmt.Sprintf("m/%d'/%d'/1'/%d'", diff --git a/wallet/wallet.go b/wallet/wallet.go index 7196fdbd2..ac03347f6 100644 --- a/wallet/wallet.go +++ b/wallet/wallet.go @@ -401,6 +401,10 @@ func (w *Wallet) AllValidatorAddresses() []vault.AddressInfo { return w.store.Vault.AllValidatorAddresses() } +func (w *Wallet) AllAccountAddresses() []vault.AddressInfo { + return w.store.Vault.AllAccountAddresses() +} + func (w *Wallet) AddressFromPath(p string) *vault.AddressInfo { return w.store.Vault.AddressFromPath(p) }