|
|
@ -3076,7 +3076,7 @@ static UniValue listwallets(const JSONRPCRequest& request)
|
|
|
|
return obj;
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UniValue loadwallet(const JSONRPCRequest& request)
|
|
|
|
static UniValue loadwallet(const JSONRPCRequest& request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (request.fHelp || request.params.size() != 1)
|
|
|
|
if (request.fHelp || request.params.size() != 1)
|
|
|
|
throw std::runtime_error(
|
|
|
|
throw std::runtime_error(
|
|
|
@ -3123,7 +3123,7 @@ UniValue loadwallet(const JSONRPCRequest& request)
|
|
|
|
return obj;
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UniValue createwallet(const JSONRPCRequest& request)
|
|
|
|
static UniValue createwallet(const JSONRPCRequest& request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (request.fHelp || request.params.size() != 1) {
|
|
|
|
if (request.fHelp || request.params.size() != 1) {
|
|
|
|
throw std::runtime_error(
|
|
|
|
throw std::runtime_error(
|
|
|
@ -3170,6 +3170,55 @@ UniValue createwallet(const JSONRPCRequest& request)
|
|
|
|
return obj;
|
|
|
|
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)
|
|
|
|
static UniValue resendwallettransactions(const JSONRPCRequest& request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
|
|
|
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
|
|
@ -4405,6 +4454,7 @@ static const CRPCCommand commands[] =
|
|
|
|
{ "wallet", "settxfee", &settxfee, {"amount"} },
|
|
|
|
{ "wallet", "settxfee", &settxfee, {"amount"} },
|
|
|
|
{ "wallet", "signmessage", &signmessage, {"address","message"} },
|
|
|
|
{ "wallet", "signmessage", &signmessage, {"address","message"} },
|
|
|
|
{ "wallet", "signrawtransactionwithwallet", &signrawtransactionwithwallet, {"hexstring","prevtxs","sighashtype"} },
|
|
|
|
{ "wallet", "signrawtransactionwithwallet", &signrawtransactionwithwallet, {"hexstring","prevtxs","sighashtype"} },
|
|
|
|
|
|
|
|
{ "wallet", "unloadwallet", &unloadwallet, {"wallet_name"} },
|
|
|
|
{ "wallet", "walletlock", &walletlock, {} },
|
|
|
|
{ "wallet", "walletlock", &walletlock, {} },
|
|
|
|
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, {"oldpassphrase","newpassphrase"} },
|
|
|
|
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, {"oldpassphrase","newpassphrase"} },
|
|
|
|
{ "wallet", "walletpassphrase", &walletpassphrase, {"passphrase","timeout"} },
|
|
|
|
{ "wallet", "walletpassphrase", &walletpassphrase, {"passphrase","timeout"} },
|
|
|
|