6 #if defined(HAVE_CONFIG_H) 31 #include <event2/buffer.h> 32 #include <event2/keyvalq_struct.h> 65 argsman.
AddArg(
"-getinfo",
"Get general information from the remote server. Note that unlike server-side RPC calls, the results of -getinfo is the result of multiple non-atomic requests. Some entries in the result may represent results from different states (e.g. wallet balance may be as of a different block from the chain state reported)",
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
66 argsman.
AddArg(
"-netinfo",
"Get network peer connection information from the remote server. An optional integer argument from 0 to 4 can be passed for different peers listings (default: 0). Pass \"help\" for detailed help documentation.",
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
74 argsman.
AddArg(
"-rpcport=<port>",
strprintf(
"Connect to JSON-RPC on <port> (default: %u, testnet: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()),
ArgsManager::ALLOW_ANY |
ArgsManager::NETWORK_ONLY,
OptionsCategory::OPTIONS);
78 argsman.
AddArg(
"-rpcwallet=<walletname>",
"Send RPC for non-default wallet on RPC server (needs to exactly match corresponding -wallet option passed to bitcoind). This changes the RPC endpoint used, e.g. http://127.0.0.1:8332/wallet/<walletname>",
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
79 argsman.
AddArg(
"-stdin",
"Read extra arguments from standard input, one per line until EOF/Ctrl-D (recommended for sensitive information such as passphrases). When combined with -stdinrpcpass, the first line from standard input is used for the RPC password.",
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
80 argsman.
AddArg(
"-stdinrpcpass",
"Read RPC password from standard input as a single line. When combined with -stdin, the first line from standard input is used for the RPC password. When combined with -stdinwalletpassphrase, -stdinrpcpass consumes the first line, and -stdinwalletpassphrase consumes the second.",
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
87 #ifndef EVENT_LOG_ERR // EVENT_LOG_ERR was added in 2.0.19; but before then _EVENT_LOG_ERR existed. 88 # define EVENT_LOG_ERR _EVENT_LOG_ERR 92 throw std::runtime_error(
strprintf(
"libevent error: %s", msg));
105 std::runtime_error(msg)
119 tfm::format(std::cerr,
"Error parsing command line arguments: %s\n",
error);
126 "Usage: bitcoin-cli [options] <command> [params] Send command to " PACKAGE_NAME "\n" 127 "or: bitcoin-cli [options] -named <command> [name=value]... Send command to " PACKAGE_NAME " (with named arguments)\n" 128 "or: bitcoin-cli [options] help List commands\n" 129 "or: bitcoin-cli [options] help <command> Get help for a command\n";
135 tfm::format(std::cerr,
"Error: too few parameters\n");
141 tfm::format(std::cerr,
"Error: Specified data directory \"%s\" does not exist.\n",
gArgs.
GetArg(
"-datadir",
""));
151 }
catch (
const std::exception& e) {
172 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 173 case EVREQ_HTTP_TIMEOUT:
174 return "timeout reached";
176 return "EOF reached";
177 case EVREQ_HTTP_INVALID_HEADER:
178 return "error while reading header, or invalid header";
179 case EVREQ_HTTP_BUFFER_ERROR:
180 return "error encountered while reading or writing";
181 case EVREQ_HTTP_REQUEST_CANCEL:
182 return "request was canceled";
183 case EVREQ_HTTP_DATA_TOO_LONG:
184 return "response body is larger than allowed";
195 if (req ==
nullptr) {
203 reply->
status = evhttp_request_get_response_code(req);
205 struct evbuffer *buf = evhttp_request_get_input_buffer(req);
208 size_t size = evbuffer_get_length(buf);
209 const char *data = (
const char*)evbuffer_pullup(buf, size);
211 reply->
body = std::string(data, size);
212 evbuffer_drain(buf, size);
216 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 217 static void http_error_cb(
enum evhttp_request_error err,
void *
ctx)
239 static constexpr std::array
m_networks{
"ipv4",
"ipv6",
"torv2",
"torv3",
"i2p"};
242 for (
size_t i = 0; i <
m_networks.size(); ++i) {
252 throw std::runtime_error(
"-addrinfo takes no arguments");
260 if (!reply[
"error"].isNull())
return reply;
261 const std::vector<UniValue>& nodes{reply[
"result"].
getValues()};
262 if (!nodes.empty() && nodes.at(0)[
"network"].isNull()) {
263 throw std::runtime_error(
"-addrinfo requires bitcoind server to be running v22.0 and up");
266 std::array<uint64_t,
m_networks.size()> counts{{}};
268 std::string network_name{
node[
"network"].get_str()};
269 if (network_name ==
"onion") {
270 network_name =
node[
"address"].get_str().size() > 22 ?
"torv3" :
"torv2";
274 ++counts.at(network_id);
279 for (
size_t i = 0; i <
m_networks.size(); ++i) {
280 addresses.pushKV(
m_networks.at(i), counts.at(i));
281 total += counts.at(i);
283 addresses.pushKV(
"total", total);
284 result.pushKV(
"addresses_known", addresses);
302 throw std::runtime_error(
"-getinfo takes no arguments");
335 result.
pushKV(
"connections", connections);
342 if (!batch[
ID_WALLETINFO][
"result"][
"unlocked_until"].isNull()) {
361 static constexpr std::array
m_networks{
"ipv4",
"ipv6",
"onion",
"i2p"};
367 for (
size_t i = 0; i <
m_networks.size(); ++i) {
411 if (seconds < 0)
return "";
412 const double milliseconds{round(1000 * seconds)};
413 return milliseconds > 999999 ?
"-" :
ToString(milliseconds);
417 if (conn_type ==
"outbound-full-relay")
return "full";
418 if (conn_type ==
"block-relay-only")
return "block";
419 if (conn_type ==
"manual" || conn_type ==
"feeler")
return conn_type;
420 if (conn_type ==
"addr-fetch")
return "addr";
436 throw std::runtime_error(
strprintf(
"invalid -netinfo argument: %s\nFor more information, run: bitcoin-cli -netinfo help", args.at(0)));
452 if (networkinfo[
"version"].get_int() < 209900) {
453 throw std::runtime_error(
"-netinfo requires bitcoind server to be running v0.21.0 and up");
458 const std::string network{peer[
"network"].get_str()};
461 const bool is_outbound{!peer[
"inbound"].get_bool()};
462 const bool is_block_relay{!peer[
"relaytxes"].get_bool()};
463 const std::string conn_type{peer[
"connection_type"].get_str()};
464 ++
m_counts.at(is_outbound).at(network_id);
472 const int peer_id{peer[
"id"].get_int()};
473 const int mapped_as{peer[
"mapped_as"].isNull() ? 0 : peer[
"mapped_as"].get_int()};
474 const int version{peer[
"version"].get_int()};
475 const int64_t conn_time{peer[
"conntime"].get_int64()};
476 const int64_t last_blck{peer[
"last_block"].get_int64()};
477 const int64_t last_recv{peer[
"lastrecv"].get_int64()};
478 const int64_t last_send{peer[
"lastsend"].get_int64()};
479 const int64_t last_trxn{peer[
"last_transaction"].get_int64()};
480 const double min_ping{peer[
"minping"].isNull() ? -1 : peer[
"minping"].get_real()};
481 const double ping{peer[
"pingtime"].isNull() ? -1 : peer[
"pingtime"].get_real()};
482 const std::string addr{peer[
"addr"].get_str()};
484 const std::string sub_version{peer[
"subver"].get_str()};
485 const bool is_bip152_hb_from{peer[
"bip152_hb_from"].get_bool()};
486 const bool is_bip152_hb_to{peer[
"bip152_hb_to"].get_bool()};
487 m_peers.push_back({addr, sub_version, conn_type, network, age, min_ping,
ping, last_blck, last_recv, last_send, last_trxn, peer_id, mapped_as, version, is_bip152_hb_from, is_bip152_hb_to, is_block_relay, is_outbound});
505 std::string version{
ToString(peer.version) + peer.sub_version};
507 "%3s %6s %5s%7s%7s%5s%5s%5s%5s %2s %*s%*i %*s %-*s%s\n",
508 peer.is_outbound ?
"out" :
"in",
517 strprintf(
"%s%s", peer.is_bip152_hb_to ?
"." :
" ", peer.is_bip152_hb_from ?
"*" :
" "),
532 result +=
" ipv4 ipv6 onion";
533 const bool any_i2p_peers =
m_counts.at(2).at(3);
534 if (any_i2p_peers) result +=
" i2p";
535 result +=
" total block";
537 const std::array rows{
"in",
"out",
"total"};
538 for (uint8_t i = 0; i < 3; ++i) {
549 result +=
"\n\nLocal addresses";
550 const std::vector<UniValue>& local_addrs{networkinfo[
"localaddresses"].getValues()};
551 if (local_addrs.empty()) {
554 size_t max_addr_size{0};
555 for (
const UniValue& addr : local_addrs) {
556 max_addr_size = std::max(addr[
"address"].get_str().length() + 1, max_addr_size);
558 for (
const UniValue& addr : local_addrs) {
559 result +=
strprintf(
"\n%-*s port %6i score %6i", max_addr_size, addr[
"address"].get_str(), addr[
"port"].get_int(), addr[
"score"].get_int());
567 "-netinfo level|\"help\" \n\n" 568 "Returns a network peer connections dashboard with information from the remote server.\n" 569 "This human-readable interface will change regularly and is not intended to be a stable API.\n" 570 "Under the hood, -netinfo fetches the data by calling getpeerinfo and getnetworkinfo.\n" 572 "Pass \"help\" to see this detailed help documentation.\n" 573 "If more than one argument is passed, only the first one is read and parsed.\n" 574 "Suggestion: use with the Linux watch(1) command for a live dashboard; see example below.\n\n" 576 +
strprintf(
"1. level (integer 0-%d, optional) Specify the info level of the peers dashboard (default 0):\n",
MAX_DETAIL_LEVEL) +
577 " 0 - Connection counts and local addresses\n" 578 " 1 - Like 0 but with a peers listing (without address or version columns)\n" 579 " 2 - Like 1 but with an address column\n" 580 " 3 - Like 1 but with a version column\n" 581 " 4 - Like 1 but with both address and version columns\n" 582 "2. help (string \"help\", optional) Print this help documentation instead of the dashboard.\n\n" 584 +
strprintf(
"* The peers listing in levels 1-%d displays all of the peers sorted by direction and minimum ping time:\n\n",
MAX_DETAIL_LEVEL) +
585 " Column Description\n" 586 " ------ -----------\n" 588 " \"in\" - inbound connections are those initiated by the peer\n" 589 " \"out\" - outbound connections are those initiated by us\n" 590 " type Type of peer connection\n" 591 " \"full\" - full relay, the default\n" 592 " \"block\" - block relay; like full relay but does not relay transactions or addresses\n" 593 " \"manual\" - peer we manually added using RPC addnode or the -addnode/-connect config options\n" 594 " \"feeler\" - short-lived connection for testing addresses\n" 595 " \"addr\" - address fetch; short-lived connection for requesting addresses\n" 596 " net Network the peer connected through (\"ipv4\", \"ipv6\", \"onion\", \"i2p\", or \"cjdns\")\n" 597 " mping Minimum observed ping time, in milliseconds (ms)\n" 598 " ping Last observed ping time, in milliseconds (ms)\n" 599 " send Time since last message sent to the peer, in seconds\n" 600 " recv Time since last message received from the peer, in seconds\n" 601 " txn Time since last novel transaction received from the peer and accepted into our mempool, in minutes\n" 602 " blk Time since last novel block passing initial validity checks received from the peer, in minutes\n" 603 " hb High-bandwidth BIP152 compact block relay\n" 604 " \".\" (to) - we selected the peer as a high-bandwidth peer\n" 605 " \"*\" (from) - the peer selected us as a high-bandwidth peer\n" 606 " age Duration of connection to the peer, in minutes\n" 607 " asmap Mapped AS (Autonomous System) number in the BGP route to the peer, used for diversifying\n" 608 " peer selection (only displayed if the -asmap config option is set)\n" 609 " id Peer index, in increasing order of peer connections since node startup\n" 610 " address IP address and port of the peer\n" 611 " version Peer version and subversion concatenated, e.g. \"70016/Satoshi:21.0.0/\"\n\n" 612 "* The connection counts table displays the number of peers by direction, network, and the totals\n" 613 " for each, as well as two special outbound columns for block relay peers and manual peers.\n\n" 614 "* The local addresses table lists each local address broadcast by the node, the port, and the score.\n\n" 616 "Connection counts and local addresses only\n" 617 "> bitcoin-cli -netinfo\n\n" 618 "Compact peers listing\n" 619 "> bitcoin-cli -netinfo 1\n\n" 622 "Full live dashboard, adjust --interval or --no-title as needed (Linux)\n" 625 "> bitcoin-cli -netinfo help\n"};
679 port =
static_cast<uint16_t
>(
gArgs.
GetArg(
"-rpcport", port));
691 evhttp_connection_set_timeout(evcon.get(), timeout);
696 constexpr
int YEAR_IN_SECONDS = 31556952;
697 evhttp_connection_set_timeout(evcon.get(), 5 * YEAR_IN_SECONDS);
704 throw std::runtime_error(
"create http request failed");
705 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 706 evhttp_request_set_error_cb(req.get(), http_error_cb);
711 bool failedToGetAuthCookie =
false;
715 failedToGetAuthCookie =
true;
721 struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req.get());
723 evhttp_add_header(output_headers,
"Host", host.c_str());
724 evhttp_add_header(output_headers,
"Connection",
"close");
725 evhttp_add_header(output_headers,
"Content-Type",
"application/json");
730 struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req.get());
732 evbuffer_add(output_buffer, strRequest.data(), strRequest.size());
735 std::string endpoint =
"/";
737 char* encodedURI = evhttp_uriencode(rpcwallet->data(), rpcwallet->size(),
false);
739 endpoint =
"/wallet/" + std::string(encodedURI);
745 int r = evhttp_make_request(evcon.get(), req.get(), EVHTTP_REQ_POST, endpoint.c_str());
751 event_base_dispatch(base.get());
753 if (response.
status == 0) {
754 std::string responseErrorMessage;
755 if (response.
error != -1) {
758 throw CConnectionFailed(
strprintf(
"Could not connect to the server %s:%d%s\n\nMake sure the bitcoind server is running and that you are connecting to the correct RPC port.", host, port, responseErrorMessage));
760 if (failedToGetAuthCookie) {
762 "Could not locate RPC credentials. No authentication cookie could be found, and RPC password is not set. See -rpcpassword and -stdinrpcpass. Configuration file: (%s)",
765 throw std::runtime_error(
"Authorization failed: Incorrect rpcuser or rpcpassword");
768 throw std::runtime_error(
strprintf(
"Server response: %s", response.
body));
770 throw std::runtime_error(
strprintf(
"server returned HTTP error %d", response.
status));
771 else if (response.
body.empty())
772 throw std::runtime_error(
"no response from server");
776 if (!valReply.read(response.
body))
777 throw std::runtime_error(
"couldn't parse reply from server");
780 throw std::runtime_error(
"expected reply to have result, error and id properties");
800 const auto deadline{GetTime<std::chrono::microseconds>() + 1s * timeout};
804 response =
CallRPC(rh, strMethod, args, rpcwallet);
813 const auto now{GetTime<std::chrono::microseconds>()};
814 if (fWait && (timeout <= 0 || now < deadline)) {
827 if (result.
isNull())
return;
834 if (
error.isObject()) {
838 strPrint =
"error code: " + err_code.
getValStr() +
"\n";
840 if (err_msg.
isStr()) {
841 strPrint += (
"error message:\n" + err_msg.
get_str());
844 strPrint +=
"\nTry adding \"-rpcwallet=<filename>\" option to bitcoin-cli command line.";
847 strPrint =
"error: " +
error.write();
849 nRet = abs(
error[
"code"].get_int());
864 if (wallets.
size() <= 1)
return;
868 const std::string wallet_name =
wallet.get_str();
873 result.
pushKV(
"balances", balances);
882 std::optional<std::string> wallet_name{};
895 if (args.size() > 2)
throw std::runtime_error(
"too many arguments (maximum 2 for nblocks and maxtries)");
896 if (args.size() == 0) {
898 }
else if (args.at(0) ==
"0") {
899 throw std::runtime_error(
"the first argument (number of blocks to generate, default: " +
DEFAULT_NBLOCKS +
") must be an integer value greater than zero");
901 args.emplace(args.begin() + 1, address);
906 std::string strPrint;
918 fputs(
"RPC password> ", stderr);
921 if (!std::getline(std::cin, rpcPass)) {
922 throw std::runtime_error(
"-stdinrpcpass specified but failed to read from standard input");
929 std::vector<std::string> args = std::vector<std::string>(&argv[1], &argv[argc]);
932 std::string walletPass;
933 if (args.size() < 1 || args[0].substr(0, 16) !=
"walletpassphrase") {
934 throw std::runtime_error(
"-stdinwalletpassphrase is only applicable for walletpassphrase(change)");
937 fputs(
"Wallet passphrase> ", stderr);
940 if (!std::getline(std::cin, walletPass)) {
941 throw std::runtime_error(
"-stdinwalletpassphrase specified but failed to read from standard input");
946 args.insert(args.begin() + 1, walletPass);
951 while (std::getline(std::cin, line)) {
952 args.push_back(line);
958 std::unique_ptr<BaseRequestHandler> rh;
963 if (!args.empty() && args.at(0) ==
"help") {
971 if (
error.isNull()) {
981 if (args.size() < 1) {
982 throw std::runtime_error(
"too few parameters (need at least command)");
985 args.erase(args.begin());
989 std::optional<std::string> wallet_name{};
996 if (
error.isNull()) {
1005 }
catch (
const std::exception& e) {
1006 strPrint = std::string(
"error: ") + e.what();
1007 nRet = EXIT_FAILURE;
1013 if (strPrint !=
"") {
1014 tfm::format(nRet == 0 ? std::cout : std::cerr,
"%s\n", strPrint);
1025 __declspec(dllexport)
int main(
int argc,
char* argv[])
1027 util::WinCmdLineArgs winArgs;
1028 std::tie(argc, argv) = winArgs.get();
1035 tfm::format(std::cerr,
"Error: Initializing networking failed\n");
1036 return EXIT_FAILURE;
1045 catch (
const std::exception& e) {
1047 return EXIT_FAILURE;
1050 return EXIT_FAILURE;
1053 int ret = EXIT_FAILURE;
1057 catch (
const std::exception& e) {
bool ReadConfigFiles(std::string &error, bool ignore_invalid_keys=false)
No wallet specified (error when there are multiple wallets loaded)
std::string ChainToString() const
static const std::string DEFAULT_NBLOCKS
Default number of blocks to generate for RPC generatetoaddress.
bool DetailsRequested() const
std::unique_ptr< CBaseChainParams > CreateBaseChainParams(const std::string &chain)
Port numbers for incoming Tor connections (8334, 18334, 38334, 18445) have been chosen arbitrarily to...
uint8_t m_block_relay_peers_count
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
static int CommandLineRPC(int argc, char *argv[])
raii_event_base obtain_event_base()
void SetupChainParamsBaseOptions(ArgsManager &argsman)
Set the arguments for chainparams.
const std::vector< UniValue > & getValues() const
UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args) override
static int AppInitRPC(int argc, char *argv[])
static void libevent_log_cb(int severity, const char *msg)
libevent event log callback
static const std::string REGTEST
static std::string strRPCUserColonPass
int64_t GetTimeSeconds()
Returns the system time (not mockable)
static constexpr int ID_NETWORKINFO
UniValue ProcessReply(const UniValue &reply) override
static constexpr uint8_t MAX_DETAIL_LEVEL
int8_t NetworkStringToId(const std::string &str) const
virtual ~BaseRequestHandler()
static const int DEFAULT_HTTP_CLIENT_TIMEOUT
static constexpr int ID_PEERINFO
const CBaseChainParams & BaseParams()
Return the currently selected parameters.
int8_t NetworkStringToId(const std::string &str) const
const std::string & get_str() const
static RPCHelpMan listwallets()
raii_evhttp_request obtain_evhttp_request(void(*cb)(struct evhttp_request *, void *), void *arg)
bool ParseParameters(int argc, const char *const argv[], std::string &error)
std::vector< Peer > m_peers
static std::string http_errorstring(int code)
uint8_t m_details_level
Optional user-supplied arg to set dashboard details level.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
const int ID_BLOCKCHAININFO
void ForceSetArg(const std::string &strArg, const std::string &strValue)
static constexpr int8_t UNKNOWN_NETWORK
const char *const BITCOIN_CONF_FILENAME
const std::string & getValStr() const
bool operator<(const Peer &rhs) const
virtual UniValue ProcessReply(const UniValue &batch_in)=0
UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args) override
Create a simulated getinfo request.
const UniValue & find_value(const UniValue &obj, const std::string &name)
std::string GetHelpMessage() const
Get the help string.
static const std::string MAIN
Chain name strings.
UniValue RPCConvertValues(const std::string &strMethod, const std::vector< std::string > &strParams)
Convert positional arguments to command-specific RPC representation.
bool CheckDataDirOption()
std::vector< UniValue > JSONRPCProcessBatchReply(const UniValue &in)
Parse JSON-RPC batch reply into a vector.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
std::string EncodeBase64(Span< const unsigned char > input)
static const char DEFAULT_RPCCONNECT[]
bool push_back(const UniValue &val)
UniValue ProcessReply(const UniValue &reply) override
std::array< std::array< uint16_t, m_networks.size()+1 >, 3 > m_counts
Peer counts by (in/out/total, networks/total)
static UniValue CallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const std::optional< std::string > &rpcwallet={})
static void ParseError(const UniValue &error, std::string &strPrint, int &nRet)
Parse UniValue error to update the message to print to std::cerr and the code to return.
static constexpr int DEFAULT_WAIT_CLIENT_TIMEOUT
static secp256k1_context * ctx
Process netinfo requests.
Process addrinfo requests.
static RPCHelpMan getbalances()
void AddArg(const std::string &name, const std::string &help, unsigned int flags, const OptionsCategory &cat)
Add argument.
bool HelpRequested(const ArgsManager &args)
static const uint64_t DEFAULT_MAX_TRIES
Default max iterations to try in RPC generatetodescriptor, generatetoaddress, and generateblock...
static const int CONTINUE_EXECUTION
virtual UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args)=0
raii_evhttp_connection obtain_evhttp_connection_base(struct event_base *base, std::string host, uint16_t port)
std::string write(unsigned int prettyIndent=0, unsigned int indentLevel=0) const
static void GetWalletBalances(UniValue &result)
GetWalletBalances calls listwallets; if more than one wallet is loaded, it then fetches mine...
std::string ConnectionTypeForNetinfo(const std::string &conn_type) const
bool pushKV(const std::string &key, const UniValue &val)
void PrintExceptionContinue(const std::exception *pex, const char *pszThread)
int main(int argc, char *argv[])
static constexpr std::array m_networks
UniValue ProcessReply(const UniValue &batch_in) override
Collect values from the batch and form a simulated getinfo reply.
Class that handles the conversion from a command-line to a JSON-RPC request, as well as converting ba...
std::string FormatFullVersion()
static void SetupCliArgs(ArgsManager &argsman)
bool IsVersionSelected() const
static void ParseResult(const UniValue &result, std::string &strPrint)
Parse UniValue result to update the message to print to std::cout.
CConnectionFailed(const std::string &msg)
void UninterruptibleSleep(const std::chrono::microseconds &n)
fs::path GetConfigFile(const std::string &confPath)
uint8_t m_manual_peers_count
const UniValue & get_obj() const
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Process RPC generatetoaddress request.
UniValue JSONRPCReplyObj(const UniValue &result, const UniValue &error, const UniValue &id)
const std::string m_help_doc
Process default single requests.
UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args) override
const std::function< std::string(const char *)> G_TRANSLATION_FUN
Translate string to current locale using Qt.
UniValue JSONRPCRequestObj(const std::string &strMethod, const UniValue ¶ms, const UniValue &id)
JSON-RPC protocol.
void SetupHelpOptions(ArgsManager &args)
Add help options to the args manager.
static RPCHelpMan getnewaddress()
const UniValue NullUniValue
UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args) override
UrlDecodeFn *const URL_DECODE
UniValue RPCConvertNamedValues(const std::string &strMethod, const std::vector< std::string > &strParams)
Convert named arguments to command-specific RPC representation.
static const std::string TESTNET
static const bool DEFAULT_NAMED
std::string GetChainName() const
Returns the appropriate chain name from the program arguments.
static UniValue GetNewAddress()
Call RPC getnewaddress.
static UniValue ConnectAndCallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const std::optional< std::string > &rpcwallet={})
ConnectAndCallRPC wraps CallRPC with -rpcwait and an exception handler.
bool IsSwitchChar(char c)
UniValue PrepareRequest(const std::string &method, const std::vector< std::string > &args) override
bool ParseUInt8(const std::string &str, uint8_t *out)
Convert decimal string to unsigned 8-bit integer with strict parse error feedback.
UniValue ProcessReply(const UniValue &batch_in) override
void SelectBaseParams(const std::string &chain)
Sets the params returned by Params() to those for the given network.
bool IsAddressSelected() const
std::string PingTimeToString(double seconds) const
static constexpr std::array m_networks
Process getinfo requests.
bool error(const char *fmt, const Args &... args)
void SplitHostPort(std::string in, uint16_t &portOut, std::string &hostOut)
bool GetAuthCookie(std::string *cookie_out)
Read the RPC authentication cookie from disk.
static const std::string SIGNET
static void SetGenerateToAddressArgs(const std::string &address, std::vector< std::string > &args)
Check bounds and set up args for RPC generatetoaddress params: nblocks, address, maxtries.
static void http_request_done(struct evhttp_request *req, void *ctx)
Reply structure for request_done to fill in.
UniValue ProcessReply(const UniValue &reply) override
std::string(const std::string &url_encoded) UrlDecodeFn