The new `getrpcinfo` shows a list of the active commands and the duration each command has been running. This sounds like a good place to report a completion percentage for any command doing a blockchain rescan, to solve [this problem](https://bitcoin.stackexchange.com/q/83236/90721).
{
protected:
    CWallet* pwallet;
    int64_t nIndex{-1};
    CPubKey vchPubKey;
    bool fInternal{false};
public:
    explicit CReserveKey(CWallet* pwalletIn)
    {
        pwallet = pwalletIn;
    }
    CReserveKey(const CReserveKey&) = delete;
    CReserveKey& operator=(const CReserveKey&) = delete;
    ~CReserveKey()
    {
        ReturnKey();
    }
    void ReturnKey();
    bool GetReservedKey(CPubKey &pubkey, bool internal = false);
    void KeepKey();
};
class WalletRescanReserver
{
private:
    CWallet* m_wallet;
    bool m_could_reserve;
public:
    explicit WalletRescanReserver(CWallet* w) : m_wallet(w), m_could_reserve(false) {}