Add calls to CWallet::BlockUntilSyncedToCurrentChain() in RPCs
This prevents the wallet-RPCs-return-stale-info issue from being re-introduced when new-block callbacks no longer happen in the block-connection cs_main lock
This commit is contained in:
parent
5ee3172636
commit
5d67a7868d
1 changed files with 100 additions and 0 deletions
|
@ -455,6 +455,11 @@ UniValue sendtoaddress(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
CTxDestination dest = DecodeDestination(request.params[0].get_str());
|
||||
|
@ -533,6 +538,11 @@ UniValue listaddressgroupings(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
UniValue jsonGroupings(UniValue::VARR);
|
||||
|
@ -645,6 +655,11 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
// Bitcoin address
|
||||
|
@ -707,6 +722,11 @@ UniValue getreceivedbyaccount(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
// Minimum confirmations
|
||||
|
@ -780,6 +800,11 @@ UniValue getbalance(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
const UniValue& account_value = request.params[0];
|
||||
|
@ -825,6 +850,11 @@ UniValue getunconfirmedbalance(const JSONRPCRequest &request)
|
|||
"Returns the server's total unconfirmed balance\n");
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
return ValueFromAmount(pwallet->GetUnconfirmedBalance());
|
||||
|
@ -919,6 +949,11 @@ UniValue sendfrom(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
std::string strAccount = AccountFromValue(request.params[0]);
|
||||
|
@ -1004,6 +1039,11 @@ UniValue sendmany(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
if (pwallet->GetBroadcastTransactions() && !g_connman) {
|
||||
|
@ -1455,6 +1495,11 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
return ListReceived(pwallet, request.params, false);
|
||||
|
@ -1495,6 +1540,11 @@ UniValue listreceivedbyaccount(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
return ListReceived(pwallet, request.params, true);
|
||||
|
@ -1683,6 +1733,11 @@ UniValue listtransactions(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
std::string strAccount = "*";
|
||||
|
@ -1777,6 +1832,11 @@ UniValue listaccounts(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
int nMinDepth = 1;
|
||||
|
@ -1886,6 +1946,11 @@ UniValue listsinceblock(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
const CBlockIndex* pindex = nullptr; // Block index of the specified block or the common ancestor, if the block provided was in a deactivated chain.
|
||||
|
@ -2018,6 +2083,11 @@ UniValue gettransaction(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
uint256 hash;
|
||||
|
@ -2080,6 +2150,11 @@ UniValue abandontransaction(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
uint256 hash;
|
||||
|
@ -2114,6 +2189,10 @@ UniValue backupwallet(const JSONRPCRequest& request)
|
|||
+ HelpExampleRpc("backupwallet", "\"backup.dat\"")
|
||||
);
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
std::string strDest = request.params[0].get_str();
|
||||
|
@ -2433,6 +2512,10 @@ UniValue lockunspent(const JSONRPCRequest& request)
|
|||
+ HelpExampleRpc("lockunspent", "false, \"[{\\\"txid\\\":\\\"a08e6907dbbd3d809776dbfc5d82e371b764ed838b5655e72f463568df1aadf0\\\",\\\"vout\\\":1}]\"")
|
||||
);
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
RPCTypeCheckArgument(request.params[0], UniValue::VBOOL);
|
||||
|
@ -2592,6 +2675,11 @@ UniValue getwalletinfo(const JSONRPCRequest& request)
|
|||
);
|
||||
|
||||
ObserveSafeMode();
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
UniValue obj(UniValue::VOBJ);
|
||||
|
@ -2801,6 +2889,10 @@ UniValue listunspent(const JSONRPCRequest& request)
|
|||
nMaximumCount = options["maximumCount"].get_int64();
|
||||
}
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
UniValue results(UniValue::VARR);
|
||||
std::vector<COutput> vecOutputs;
|
||||
assert(pwallet != nullptr);
|
||||
|
@ -2911,6 +3003,10 @@ UniValue fundrawtransaction(const JSONRPCRequest& request)
|
|||
ObserveSafeMode();
|
||||
RPCTypeCheck(request.params, {UniValue::VSTR});
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
CCoinControl coinControl;
|
||||
int changePosition = -1;
|
||||
bool lockUnspents = false;
|
||||
|
@ -3121,6 +3217,10 @@ UniValue bumpfee(const JSONRPCRequest& request)
|
|||
}
|
||||
}
|
||||
|
||||
// Make sure the results are valid at least up to the most recent block
|
||||
// the user could have gotten from another RPC command prior to now
|
||||
pwallet->BlockUntilSyncedToCurrentChain();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
EnsureWalletIsUnlocked(pwallet);
|
||||
|
||||
|
|
Loading…
Reference in a new issue