[RPC, Wallet] Move RPC dispatch table registration to wallet/ code
Allow extending the rpc dispatch table by appending commands when server is not running.
This commit is contained in:
parent
e1060c56cc
commit
dd2dc400ee
8 changed files with 106 additions and 93 deletions
|
@ -164,6 +164,7 @@ BITCOIN_CORE_H = \
|
||||||
version.h \
|
version.h \
|
||||||
wallet/crypter.h \
|
wallet/crypter.h \
|
||||||
wallet/db.h \
|
wallet/db.h \
|
||||||
|
wallet/rpcwallet.h \
|
||||||
wallet/wallet.h \
|
wallet/wallet.h \
|
||||||
wallet/wallet_ismine.h \
|
wallet/wallet_ismine.h \
|
||||||
wallet/walletdb.h \
|
wallet/walletdb.h \
|
||||||
|
|
|
@ -926,6 +926,8 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
bool fDisableWallet = GetBoolArg("-disablewallet", false);
|
bool fDisableWallet = GetBoolArg("-disablewallet", false);
|
||||||
|
if (!fDisableWallet)
|
||||||
|
walletRegisterRPCCommands();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
nConnectTimeout = GetArg("-timeout", DEFAULT_CONNECT_TIMEOUT);
|
nConnectTimeout = GetArg("-timeout", DEFAULT_CONNECT_TIMEOUT);
|
||||||
|
|
|
@ -309,9 +309,6 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "rawtransactions", "getrawtransaction", &getrawtransaction, true },
|
{ "rawtransactions", "getrawtransaction", &getrawtransaction, true },
|
||||||
{ "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
|
{ "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
|
||||||
{ "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
|
{ "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
|
||||||
#ifdef ENABLE_WALLET
|
|
||||||
{ "rawtransactions", "fundrawtransaction", &fundrawtransaction, false },
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Utility functions */
|
/* Utility functions */
|
||||||
{ "util", "createmultisig", &createmultisig, true },
|
{ "util", "createmultisig", &createmultisig, true },
|
||||||
|
@ -326,54 +323,6 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "hidden", "invalidateblock", &invalidateblock, true },
|
{ "hidden", "invalidateblock", &invalidateblock, true },
|
||||||
{ "hidden", "reconsiderblock", &reconsiderblock, true },
|
{ "hidden", "reconsiderblock", &reconsiderblock, true },
|
||||||
{ "hidden", "setmocktime", &setmocktime, true },
|
{ "hidden", "setmocktime", &setmocktime, true },
|
||||||
#ifdef ENABLE_WALLET
|
|
||||||
{ "hidden", "resendwallettransactions", &resendwallettransactions, true},
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
|
||||||
/* Wallet */
|
|
||||||
{ "wallet", "addmultisigaddress", &addmultisigaddress, true },
|
|
||||||
{ "wallet", "backupwallet", &backupwallet, true },
|
|
||||||
{ "wallet", "dumpprivkey", &dumpprivkey, true },
|
|
||||||
{ "wallet", "dumpwallet", &dumpwallet, true },
|
|
||||||
{ "wallet", "encryptwallet", &encryptwallet, true },
|
|
||||||
{ "wallet", "getaccountaddress", &getaccountaddress, true },
|
|
||||||
{ "wallet", "getaccount", &getaccount, true },
|
|
||||||
{ "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
|
|
||||||
{ "wallet", "getbalance", &getbalance, false },
|
|
||||||
{ "wallet", "getnewaddress", &getnewaddress, true },
|
|
||||||
{ "wallet", "getrawchangeaddress", &getrawchangeaddress, true },
|
|
||||||
{ "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false },
|
|
||||||
{ "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false },
|
|
||||||
{ "wallet", "gettransaction", &gettransaction, false },
|
|
||||||
{ "wallet", "abandontransaction", &abandontransaction, false },
|
|
||||||
{ "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false },
|
|
||||||
{ "wallet", "getwalletinfo", &getwalletinfo, false },
|
|
||||||
{ "wallet", "importprivkey", &importprivkey, true },
|
|
||||||
{ "wallet", "importwallet", &importwallet, true },
|
|
||||||
{ "wallet", "importaddress", &importaddress, true },
|
|
||||||
{ "wallet", "importpubkey", &importpubkey, true },
|
|
||||||
{ "wallet", "keypoolrefill", &keypoolrefill, true },
|
|
||||||
{ "wallet", "listaccounts", &listaccounts, false },
|
|
||||||
{ "wallet", "listaddressgroupings", &listaddressgroupings, false },
|
|
||||||
{ "wallet", "listlockunspent", &listlockunspent, false },
|
|
||||||
{ "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false },
|
|
||||||
{ "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false },
|
|
||||||
{ "wallet", "listsinceblock", &listsinceblock, false },
|
|
||||||
{ "wallet", "listtransactions", &listtransactions, false },
|
|
||||||
{ "wallet", "listunspent", &listunspent, false },
|
|
||||||
{ "wallet", "lockunspent", &lockunspent, true },
|
|
||||||
{ "wallet", "move", &movecmd, false },
|
|
||||||
{ "wallet", "sendfrom", &sendfrom, false },
|
|
||||||
{ "wallet", "sendmany", &sendmany, false },
|
|
||||||
{ "wallet", "sendtoaddress", &sendtoaddress, false },
|
|
||||||
{ "wallet", "setaccount", &setaccount, true },
|
|
||||||
{ "wallet", "settxfee", &settxfee, true },
|
|
||||||
{ "wallet", "signmessage", &signmessage, true },
|
|
||||||
{ "wallet", "walletlock", &walletlock, true },
|
|
||||||
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, true },
|
|
||||||
{ "wallet", "walletpassphrase", &walletpassphrase, true },
|
|
||||||
#endif // ENABLE_WALLET
|
|
||||||
};
|
};
|
||||||
|
|
||||||
CRPCTable::CRPCTable()
|
CRPCTable::CRPCTable()
|
||||||
|
@ -396,6 +345,20 @@ const CRPCCommand *CRPCTable::operator[](const std::string &name) const
|
||||||
return (*it).second;
|
return (*it).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CRPCTable::appendCommand(const std::string& name, const CRPCCommand* pcmd)
|
||||||
|
{
|
||||||
|
if (IsRPCRunning())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// don't allow overwriting for now
|
||||||
|
map<string, const CRPCCommand*>::const_iterator it = mapCommands.find(name);
|
||||||
|
if (it != mapCommands.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
mapCommands[name] = pcmd;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool StartRPC()
|
bool StartRPC()
|
||||||
{
|
{
|
||||||
LogPrint("rpc", "Starting RPC\n");
|
LogPrint("rpc", "Starting RPC\n");
|
||||||
|
@ -573,4 +536,4 @@ void RPCRunLater(const std::string& name, boost::function<void(void)> func, int6
|
||||||
deadlineTimers.insert(std::make_pair(name, boost::shared_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000))));
|
deadlineTimers.insert(std::make_pair(name, boost::shared_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000))));
|
||||||
}
|
}
|
||||||
|
|
||||||
const CRPCTable tableRPC;
|
CRPCTable tableRPC;
|
||||||
|
|
|
@ -144,9 +144,17 @@ public:
|
||||||
* @throws an exception (UniValue) when an error happens.
|
* @throws an exception (UniValue) when an error happens.
|
||||||
*/
|
*/
|
||||||
UniValue execute(const std::string &method, const UniValue ¶ms) const;
|
UniValue execute(const std::string &method, const UniValue ¶ms) const;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Appends a CRPCCommand to the dispatch table.
|
||||||
|
* Returns false if RPC server is already running (dump concurrency protection).
|
||||||
|
* Commands cannot be overwritten (returns false).
|
||||||
|
*/
|
||||||
|
bool appendCommand(const std::string& name, const CRPCCommand* pcmd);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const CRPCTable tableRPC;
|
extern CRPCTable tableRPC;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utilities: convert hex-encoded Values
|
* Utilities: convert hex-encoded Values
|
||||||
|
@ -178,13 +186,6 @@ extern UniValue setban(const UniValue& params, bool fHelp);
|
||||||
extern UniValue listbanned(const UniValue& params, bool fHelp);
|
extern UniValue listbanned(const UniValue& params, bool fHelp);
|
||||||
extern UniValue clearbanned(const UniValue& params, bool fHelp);
|
extern UniValue clearbanned(const UniValue& params, bool fHelp);
|
||||||
|
|
||||||
extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
|
|
||||||
extern UniValue importprivkey(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue importaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue importpubkey(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue dumpwallet(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue importwallet(const UniValue& params, bool fHelp);
|
|
||||||
|
|
||||||
extern UniValue getgenerate(const UniValue& params, bool fHelp); // in rpcmining.cpp
|
extern UniValue getgenerate(const UniValue& params, bool fHelp); // in rpcmining.cpp
|
||||||
extern UniValue setgenerate(const UniValue& params, bool fHelp);
|
extern UniValue setgenerate(const UniValue& params, bool fHelp);
|
||||||
extern UniValue generate(const UniValue& params, bool fHelp);
|
extern UniValue generate(const UniValue& params, bool fHelp);
|
||||||
|
@ -198,45 +199,13 @@ extern UniValue estimatepriority(const UniValue& params, bool fHelp);
|
||||||
extern UniValue estimatesmartfee(const UniValue& params, bool fHelp);
|
extern UniValue estimatesmartfee(const UniValue& params, bool fHelp);
|
||||||
extern UniValue estimatesmartpriority(const UniValue& params, bool fHelp);
|
extern UniValue estimatesmartpriority(const UniValue& params, bool fHelp);
|
||||||
|
|
||||||
extern UniValue getnewaddress(const UniValue& params, bool fHelp); // in rpcwallet.cpp
|
|
||||||
extern UniValue getaccountaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getrawchangeaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue setaccount(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getaccount(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getaddressesbyaccount(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue sendtoaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue signmessage(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue verifymessage(const UniValue& params, bool fHelp);
|
extern UniValue verifymessage(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getreceivedbyaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getreceivedbyaccount(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getbalance(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue movecmd(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue sendfrom(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue sendmany(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue addmultisigaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue createmultisig(const UniValue& params, bool fHelp);
|
extern UniValue createmultisig(const UniValue& params, bool fHelp);
|
||||||
extern UniValue listreceivedbyaddress(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue listreceivedbyaccount(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue listtransactions(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue listaddressgroupings(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue listaccounts(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue listsinceblock(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue gettransaction(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue abandontransaction(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue backupwallet(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue keypoolrefill(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue walletpassphrase(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue walletpassphrasechange(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue walletlock(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue encryptwallet(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue validateaddress(const UniValue& params, bool fHelp);
|
extern UniValue validateaddress(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getinfo(const UniValue& params, bool fHelp);
|
extern UniValue getinfo(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getwalletinfo(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue getblockchaininfo(const UniValue& params, bool fHelp);
|
extern UniValue getblockchaininfo(const UniValue& params, bool fHelp);
|
||||||
extern UniValue getnetworkinfo(const UniValue& params, bool fHelp);
|
extern UniValue getnetworkinfo(const UniValue& params, bool fHelp);
|
||||||
extern UniValue setmocktime(const UniValue& params, bool fHelp);
|
extern UniValue setmocktime(const UniValue& params, bool fHelp);
|
||||||
extern UniValue resendwallettransactions(const UniValue& params, bool fHelp);
|
|
||||||
|
|
||||||
extern UniValue getrawtransaction(const UniValue& params, bool fHelp); // in rcprawtransaction.cpp
|
extern UniValue getrawtransaction(const UniValue& params, bool fHelp); // in rcprawtransaction.cpp
|
||||||
extern UniValue listunspent(const UniValue& params, bool fHelp);
|
extern UniValue listunspent(const UniValue& params, bool fHelp);
|
||||||
|
@ -245,7 +214,6 @@ extern UniValue listlockunspent(const UniValue& params, bool fHelp);
|
||||||
extern UniValue createrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue createrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue decoderawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue decoderawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue decodescript(const UniValue& params, bool fHelp);
|
extern UniValue decodescript(const UniValue& params, bool fHelp);
|
||||||
extern UniValue fundrawtransaction(const UniValue& params, bool fHelp);
|
|
||||||
extern UniValue signrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue signrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue sendrawtransaction(const UniValue& params, bool fHelp);
|
extern UniValue sendrawtransaction(const UniValue& params, bool fHelp);
|
||||||
extern UniValue gettxoutproof(const UniValue& params, bool fHelp);
|
extern UniValue gettxoutproof(const UniValue& params, bool fHelp);
|
||||||
|
|
|
@ -54,6 +54,7 @@ TestingSetup::TestingSetup(const std::string& chainName) : BasicTestingSetup(cha
|
||||||
const CChainParams& chainparams = Params();
|
const CChainParams& chainparams = Params();
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
bitdb.MakeMock();
|
bitdb.MakeMock();
|
||||||
|
walletRegisterRPCCommands();
|
||||||
#endif
|
#endif
|
||||||
ClearDatadirCache();
|
ClearDatadirCache();
|
||||||
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000)));
|
pathTemp = GetTempPath() / strprintf("test_bitcoin_%lu_%i", (unsigned long)GetTime(), (int)(GetRand(100000)));
|
||||||
|
|
|
@ -2475,3 +2475,70 @@ UniValue fundrawtransaction(const UniValue& params, bool fHelp)
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
|
||||||
|
extern UniValue importprivkey(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue importaddress(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue importpubkey(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue dumpwallet(const UniValue& params, bool fHelp);
|
||||||
|
extern UniValue importwallet(const UniValue& params, bool fHelp);
|
||||||
|
|
||||||
|
const CRPCCommand vWalletRPCCommands[] =
|
||||||
|
{ // category name actor (function) okSafeMode
|
||||||
|
// --------------------- ------------------------ ----------------------- ----------
|
||||||
|
{ "rawtransactions", "fundrawtransaction", &fundrawtransaction, false },
|
||||||
|
{ "hidden", "resendwallettransactions", &resendwallettransactions, true },
|
||||||
|
{ "wallet", "abandontransaction", &abandontransaction, false },
|
||||||
|
{ "wallet", "addmultisigaddress", &addmultisigaddress, true },
|
||||||
|
{ "wallet", "backupwallet", &backupwallet, true },
|
||||||
|
{ "wallet", "dumpprivkey", &dumpprivkey, true },
|
||||||
|
{ "wallet", "dumpwallet", &dumpwallet, true },
|
||||||
|
{ "wallet", "encryptwallet", &encryptwallet, true },
|
||||||
|
{ "wallet", "getaccountaddress", &getaccountaddress, true },
|
||||||
|
{ "wallet", "getaccount", &getaccount, true },
|
||||||
|
{ "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
|
||||||
|
{ "wallet", "getbalance", &getbalance, false },
|
||||||
|
{ "wallet", "getnewaddress", &getnewaddress, true },
|
||||||
|
{ "wallet", "getrawchangeaddress", &getrawchangeaddress, true },
|
||||||
|
{ "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false },
|
||||||
|
{ "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false },
|
||||||
|
{ "wallet", "gettransaction", &gettransaction, false },
|
||||||
|
{ "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false },
|
||||||
|
{ "wallet", "getwalletinfo", &getwalletinfo, false },
|
||||||
|
{ "wallet", "importprivkey", &importprivkey, true },
|
||||||
|
{ "wallet", "importwallet", &importwallet, true },
|
||||||
|
{ "wallet", "importaddress", &importaddress, true },
|
||||||
|
{ "wallet", "importpubkey", &importpubkey, true },
|
||||||
|
{ "wallet", "keypoolrefill", &keypoolrefill, true },
|
||||||
|
{ "wallet", "listaccounts", &listaccounts, false },
|
||||||
|
{ "wallet", "listaddressgroupings", &listaddressgroupings, false },
|
||||||
|
{ "wallet", "listlockunspent", &listlockunspent, false },
|
||||||
|
{ "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false },
|
||||||
|
{ "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false },
|
||||||
|
{ "wallet", "listsinceblock", &listsinceblock, false },
|
||||||
|
{ "wallet", "listtransactions", &listtransactions, false },
|
||||||
|
{ "wallet", "listunspent", &listunspent, false },
|
||||||
|
{ "wallet", "lockunspent", &lockunspent, true },
|
||||||
|
{ "wallet", "move", &movecmd, false },
|
||||||
|
{ "wallet", "sendfrom", &sendfrom, false },
|
||||||
|
{ "wallet", "sendmany", &sendmany, false },
|
||||||
|
{ "wallet", "sendtoaddress", &sendtoaddress, false },
|
||||||
|
{ "wallet", "setaccount", &setaccount, true },
|
||||||
|
{ "wallet", "settxfee", &settxfee, true },
|
||||||
|
{ "wallet", "signmessage", &signmessage, true },
|
||||||
|
{ "wallet", "walletlock", &walletlock, true },
|
||||||
|
{ "wallet", "walletpassphrasechange", &walletpassphrasechange, true },
|
||||||
|
{ "wallet", "walletpassphrase", &walletpassphrase, true },
|
||||||
|
};
|
||||||
|
|
||||||
|
void walletRegisterRPCCommands()
|
||||||
|
{
|
||||||
|
unsigned int vcidx;
|
||||||
|
for (vcidx = 0; vcidx < ARRAYLEN(vWalletRPCCommands); vcidx++)
|
||||||
|
{
|
||||||
|
const CRPCCommand *pcmd;
|
||||||
|
|
||||||
|
pcmd = &vWalletRPCCommands[vcidx];
|
||||||
|
tableRPC.appendCommand(pcmd->name, pcmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
10
src/wallet/rpcwallet.h
Normal file
10
src/wallet/rpcwallet.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// Copyright (c) 2016 The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#ifndef BITCOIN_WALLET_RPCWALLET_H
|
||||||
|
#define BITCOIN_WALLET_RPCWALLET_H
|
||||||
|
|
||||||
|
void walletRegisterRPCCommands();
|
||||||
|
|
||||||
|
#endif //BITCOIN_WALLET_RPCWALLET_H
|
|
@ -15,6 +15,7 @@
|
||||||
#include "wallet/crypter.h"
|
#include "wallet/crypter.h"
|
||||||
#include "wallet/wallet_ismine.h"
|
#include "wallet/wallet_ismine.h"
|
||||||
#include "wallet/walletdb.h"
|
#include "wallet/walletdb.h"
|
||||||
|
#include "wallet/rpcwallet.h"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
Loading…
Reference in a new issue