diff --git a/cmd/kaspawallet/daemon/server/broadcast.go b/cmd/kaspawallet/daemon/server/broadcast.go index 2b93a6d7f..027ff41ac 100644 --- a/cmd/kaspawallet/daemon/server/broadcast.go +++ b/cmd/kaspawallet/daemon/server/broadcast.go @@ -54,11 +54,7 @@ func (s *server) broadcast(transactions [][]byte, isDomain bool) ([]string, erro } } - err = s.refreshUTXOs() - if err != nil { - return nil, err - } - + s.forceSync() return txIDs, nil } diff --git a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go index fe75e2d28..bdf036881 100644 --- a/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go +++ b/cmd/kaspawallet/daemon/server/create_unsigned_transaction.go @@ -43,11 +43,6 @@ func (s *server) createUnsignedTransactions(address string, amount uint64, isSen return nil, err } - err = s.refreshUTXOs() - if err != nil { - return nil, err - } - var fromAddresses []*walletAddress for _, from := range fromAddressesString { fromAddress, exists := s.addressSet[from] diff --git a/cmd/kaspawallet/daemon/server/server.go b/cmd/kaspawallet/daemon/server/server.go index 6afc31183..a5b62ac89 100644 --- a/cmd/kaspawallet/daemon/server/server.go +++ b/cmd/kaspawallet/daemon/server/server.go @@ -36,6 +36,7 @@ type server struct { nextSyncStartIndex uint32 keysFile *keys.File shutdown chan struct{} + forceSyncChan chan struct{} addressSet walletAddressSet txMassCalculator *txmass.Calculator usedOutpoints map[externalapi.DomainOutpoint]time.Time @@ -91,6 +92,7 @@ func Start(params *dagconfig.Params, listen, rpcServer string, keysFilePath stri nextSyncStartIndex: 0, keysFile: keysFile, shutdown: make(chan struct{}), + forceSyncChan: make(chan struct{}), addressSet: make(walletAddressSet), txMassCalculator: txmass.NewCalculator(params.MassPerTxByte, params.MassPerScriptPubKeyByte, params.MassPerSigOp), usedOutpoints: map[externalapi.DomainOutpoint]time.Time{}, @@ -100,8 +102,8 @@ func Start(params *dagconfig.Params, listen, rpcServer string, keysFilePath stri } log.Infof("Read, syncing the wallet...") - spawn("serverInstance.sync", func() { - err := serverInstance.sync() + spawn("serverInstance.syncLoop", func() { + err := serverInstance.syncLoop() if err != nil { printErrorAndExit(errors.Wrap(err, "error syncing the wallet")) } diff --git a/cmd/kaspawallet/daemon/server/sync.go b/cmd/kaspawallet/daemon/server/sync.go index 0bfa62229..fbeb3d18d 100644 --- a/cmd/kaspawallet/daemon/server/sync.go +++ b/cmd/kaspawallet/daemon/server/sync.go @@ -23,7 +23,7 @@ func (was walletAddressSet) strings() []string { return addresses } -func (s *server) sync() error { +func (s *server) syncLoop() error { ticker := time.NewTicker(time.Second) defer ticker.Stop() @@ -37,24 +37,34 @@ func (s *server) sync() error { return err } - for range ticker.C { - err = s.collectFarAddresses() - if err != nil { - return err - } - - err = s.collectRecentAddresses() - if err != nil { - return err - } - - err = s.refreshExistingUTXOsWithLock() - if err != nil { - return err + for { + select { + case <-ticker.C: + err := s.sync() + if err != nil { + return err + } + case <-s.forceSyncChan: + err := s.sync() + if err != nil { + return err + } } } +} - return nil +func (s *server) sync() error { + err := s.collectFarAddresses() + if err != nil { + return err + } + + err = s.collectRecentAddresses() + if err != nil { + return err + } + + return s.refreshExistingUTXOsWithLock() } const ( @@ -280,6 +290,10 @@ func (s *server) refreshUTXOs() error { return s.updateUTXOSet(getUTXOsByAddressesResponse.Entries, mempoolEntriesByAddresses.Entries) } +func (s *server) forceSync() { + s.forceSyncChan <- struct{}{} +} + func (s *server) isSynced() bool { return s.nextSyncStartIndex > s.maxUsedIndex() }