diff --git a/cmd/kaspawallet/daemon/server/address.go b/cmd/kaspawallet/daemon/server/address.go index 188ba896b..fa49149b2 100644 --- a/cmd/kaspawallet/daemon/server/address.go +++ b/cmd/kaspawallet/daemon/server/address.go @@ -39,10 +39,10 @@ func (s *server) ShowAddresses(_ context.Context, request *pb.ShowAddressesReque defer s.lock.Unlock() if !s.isSynced() { - return nil, errors.New("server is not synced") + return nil, errors.Errorf("wallet daemon is not synced yet, %s", s.formatSyncStateReport()) } - addresses := make([]string, 0) + addresses := make([]string, s.keysFile.LastUsedExternalIndex()) for i := uint32(1); i <= s.keysFile.LastUsedExternalIndex(); i++ { walletAddr := &walletAddress{ index: i, @@ -54,7 +54,7 @@ func (s *server) ShowAddresses(_ context.Context, request *pb.ShowAddressesReque if err != nil { return nil, err } - addresses = append(addresses, address.String()) + addresses[i-1] = address.String() } return &pb.ShowAddressesResponse{Address: addresses}, nil @@ -65,7 +65,7 @@ func (s *server) NewAddress(_ context.Context, request *pb.NewAddressRequest) (* defer s.lock.Unlock() if !s.isSynced() { - return nil, errors.New("server is not synced") + return nil, errors.Errorf("wallet daemon is not synced yet, %s", s.formatSyncStateReport()) } err := s.keysFile.SetLastUsedExternalIndex(s.keysFile.LastUsedExternalIndex() + 1) diff --git a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go index b8eff58f1..265780c4a 100644 --- a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go +++ b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go @@ -30,7 +30,7 @@ func (s *server) CreateUnsignedTransactions(_ context.Context, request *pb.Creat func (s *server) createUnsignedTransactions(address string, amount uint64, fromAddressesString []string) ([][]byte, error) { if !s.isSynced() { - return nil, errors.New("server is not synced") + return nil, errors.Errorf("wallet daemon is not synced yet, %s", s.formatSyncStateReport()) } err := s.refreshUTXOs() diff --git a/cmd/kaspawallet/daemon/server/external_spendable_utxos.go b/cmd/kaspawallet/daemon/server/external_spendable_utxos.go index 2d0fe597a..15d94cd06 100644 --- a/cmd/kaspawallet/daemon/server/external_spendable_utxos.go +++ b/cmd/kaspawallet/daemon/server/external_spendable_utxos.go @@ -31,7 +31,6 @@ func (s *server) GetExternalSpendableUTXOs(_ context.Context, request *pb.GetExt } func (s *server) selectExternalSpendableUTXOs(externalUTXOs *appmessage.GetUTXOsByAddressesResponseMessage, address string) ([]*pb.UtxosByAddressesEntry, error) { - dagInfo, err := s.rpcClient.GetBlockDAGInfo() if err != nil { return nil, err diff --git a/cmd/kaspawallet/daemon/server/sync.go b/cmd/kaspawallet/daemon/server/sync.go index b5a6d062b..e546ecf0b 100644 --- a/cmd/kaspawallet/daemon/server/sync.go +++ b/cmd/kaspawallet/daemon/server/sync.go @@ -1,6 +1,7 @@ package server import ( + "fmt" "sort" "time" @@ -101,10 +102,14 @@ func (s *server) collectFarAddresses() error { return nil } -func (s *server) maxUsedIndex() uint32 { +func (s *server) maxUsedIndexWithLock() uint32 { s.lock.RLock() defer s.lock.RUnlock() + return s.maxUsedIndex() +} + +func (s *server) maxUsedIndex() uint32 { maxUsedIndex := s.keysFile.LastUsedExternalIndex() if s.keysFile.LastUsedInternalIndex() > maxUsedIndex { maxUsedIndex = s.keysFile.LastUsedInternalIndex() @@ -122,10 +127,11 @@ func (s *server) collectRecentAddresses() error { maxUsedIndex := uint32(0) for ; index < maxUsedIndex+numIndexesToQueryForRecentAddresses; index += numIndexesToQueryForRecentAddresses { err := s.collectAddressesWithLock(index, index+numIndexesToQueryForRecentAddresses) + if err != nil { return err } - maxUsedIndex = s.maxUsedIndex() + maxUsedIndex = s.maxUsedIndexWithLock() s.updateSyncingProgressLog(index, maxUsedIndex) } @@ -275,7 +281,18 @@ func (s *server) refreshUTXOs() error { } func (s *server) isSynced() bool { - return s.nextSyncStartIndex > s.keysFile.LastUsedInternalIndex() && s.nextSyncStartIndex > s.keysFile.LastUsedExternalIndex() + return s.nextSyncStartIndex > s.maxUsedIndex() +} + +func (s *server) formatSyncStateReport() string { + maxUsedIndex := s.maxUsedIndex() + + if s.nextSyncStartIndex > maxUsedIndex { + maxUsedIndex = s.nextSyncStartIndex + } + + return fmt.Sprintf("scanned %d out of %d addresses (%.2f%%)", + s.nextSyncStartIndex, maxUsedIndex, float64(s.nextSyncStartIndex)*100.0/float64(maxUsedIndex)) } func (s *server) updateSyncingProgressLog(currProcessedAddresses, currMaxUsedAddresses uint32) {