diff --git a/wallet/chainntfns.go b/wallet/chainntfns.go index edad9e9..c63aca4 100644 --- a/wallet/chainntfns.go +++ b/wallet/chainntfns.go @@ -245,7 +245,7 @@ func (w *Wallet) disconnectBlock(dbtx walletdb.ReadWriteTx, b wtxmgr.BlockMeta) if err != nil { return err } - b.Hash = *hash + bs.Hash = *hash client := w.ChainClient() header, err := client.GetBlockHeader(hash) diff --git a/wallet/wallet.go b/wallet/wallet.go index 3b3e5c7..913440b 100644 --- a/wallet/wallet.go +++ b/wallet/wallet.go @@ -430,6 +430,23 @@ func (w *Wallet) syncWithChain(birthdayStamp *waddrmgr.BlockStamp) error { // before catching up with the rescan. rollback := false rollbackStamp := w.Manager.SyncedTo() + + // Handle corner cases where the chain has reorged to a lower height + // than the wallet had synced to. This could happen if the chain has + // reorged to a shorter chain with difficulty greater than the current. + // Most of the time, it's only temporary since the chain will grow + // past the previous height anyway. In regtest, however, it burdens + // the testing setup without this check. + bestBlockHash, bestBlockHeight, err := chainClient.GetBestBlock() + if err != nil { + return err + } + if rollbackStamp.Height > bestBlockHeight { + rollbackStamp.Hash = *bestBlockHash + rollbackStamp.Height = bestBlockHeight + rollback = true + } + err = walletdb.Update(w.db, func(tx walletdb.ReadWriteTx) error { addrmgrNs := tx.ReadWriteBucket(waddrmgrNamespaceKey) txmgrNs := tx.ReadWriteBucket(wtxmgrNamespaceKey)