mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-08 21:59:10 +02:00
rpc: Add unloadwallet RPC
This commit is contained in:
@@ -3076,7 +3076,7 @@ static UniValue listwallets(const JSONRPCRequest& request)
|
||||
return obj;
|
||||
}
|
||||
|
||||
UniValue loadwallet(const JSONRPCRequest& request)
|
||||
static UniValue loadwallet(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() != 1)
|
||||
throw std::runtime_error(
|
||||
@@ -3123,7 +3123,7 @@ UniValue loadwallet(const JSONRPCRequest& request)
|
||||
return obj;
|
||||
}
|
||||
|
||||
UniValue createwallet(const JSONRPCRequest& request)
|
||||
static UniValue createwallet(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() != 1) {
|
||||
throw std::runtime_error(
|
||||
@@ -3170,6 +3170,55 @@ UniValue createwallet(const JSONRPCRequest& request)
|
||||
return obj;
|
||||
}
|
||||
|
||||
static UniValue unloadwallet(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() > 1) {
|
||||
throw std::runtime_error(
|
||||
"unloadwallet ( \"wallet_name\" )\n"
|
||||
"Unloads the wallet referenced by the request endpoint otherwise unloads the wallet specified in the argument.\n"
|
||||
"Specifying the wallet name on a wallet endpoint is invalid."
|
||||
"\nArguments:\n"
|
||||
"1. \"wallet_name\" (string, optional) The name of the wallet to unload.\n"
|
||||
"\nExamples:\n"
|
||||
+ HelpExampleCli("unloadwallet", "wallet_name")
|
||||
+ HelpExampleRpc("unloadwallet", "wallet_name")
|
||||
);
|
||||
}
|
||||
|
||||
std::string wallet_name;
|
||||
if (GetWalletNameFromJSONRPCRequest(request, wallet_name)) {
|
||||
if (!request.params[0].isNull()) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Cannot unload the requested wallet");
|
||||
}
|
||||
} else {
|
||||
wallet_name = request.params[0].get_str();
|
||||
}
|
||||
|
||||
std::shared_ptr<CWallet> wallet = GetWallet(wallet_name);
|
||||
if (!wallet) {
|
||||
throw JSONRPCError(RPC_WALLET_NOT_FOUND, "Requested wallet does not exist or is not loaded");
|
||||
}
|
||||
|
||||
// Release the "main" shared pointer and prevent further notifications.
|
||||
// Note that any attempt to load the same wallet would fail until the wallet
|
||||
// is destroyed (see CheckUniqueFileid).
|
||||
if (!RemoveWallet(wallet)) {
|
||||
throw JSONRPCError(RPC_MISC_ERROR, "Requested wallet already unloaded");
|
||||
}
|
||||
UnregisterValidationInterface(wallet.get());
|
||||
|
||||
// The wallet can be in use so it's not possible to explicitly unload here.
|
||||
// Just notify the unload intent so that all shared pointers are released.
|
||||
// The wallet will be destroyed once the last shared pointer is released.
|
||||
wallet->NotifyUnload();
|
||||
|
||||
// There's no point in waiting for the wallet to unload.
|
||||
// At this point this method should never fail. The unloading could only
|
||||
// fail due to an unexpected error which would cause a process termination.
|
||||
|
||||
return NullUniValue;
|
||||
}
|
||||
|
||||
static UniValue resendwallettransactions(const JSONRPCRequest& request)
|
||||
{
|
||||
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
||||
@@ -4405,6 +4454,7 @@ static const CRPCCommand commands[] =
|
||||
{ "wallet", "settxfee", &settxfee, {"amount"} },
|
||||
{ "wallet", "signmessage", &signmessage, {"address","message"} },
|
||||
{ "wallet", "signrawtransactionwithwallet", &signrawtransactionwithwallet, {"hexstring","prevtxs","sighashtype"} },
|
||||
{ "wallet", "unloadwallet", &unloadwallet, {"wallet_name"} },
|
||||
{ "wallet", "walletlock", &walletlock, {} },
|
||||
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, {"oldpassphrase","newpassphrase"} },
|
||||
{ "wallet", "walletpassphrase", &walletpassphrase, {"passphrase","timeout"} },
|
||||
|
||||
Reference in New Issue
Block a user