6 #if defined(HAVE_CONFIG_H) 30 #include <event2/buffer.h> 31 #include <event2/keyvalq_struct.h> 60 argsman.
AddArg(
"-generate",
strprintf(
"Generate blocks immediately, equivalent to RPC generatenewaddress followed by RPC generatetoaddress. Optional positional integer arguments are number of blocks to generate (default: %s) and maximum iterations to try (default: %s), equivalent to RPC generatetoaddress nblocks and maxtries arguments. Example: bitcoin-cli -generate 4 1000",
DEFAULT_NBLOCKS,
DEFAULT_MAX_TRIES),
ArgsManager::ALLOW_ANY,
OptionsCategory::OPTIONS);
61 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);
62 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);
70 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);
73 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);
74 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);
75 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);
82 #ifndef EVENT_LOG_ERR // EVENT_LOG_ERR was added in 2.0.19; but before then _EVENT_LOG_ERR existed. 83 # define EVENT_LOG_ERR _EVENT_LOG_ERR 87 throw std::runtime_error(
strprintf(
"libevent error: %s", msg));
100 std::runtime_error(msg)
114 tfm::format(std::cerr,
"Error parsing command line arguments: %s\n", error);
121 "Usage: bitcoin-cli [options] <command> [params] Send command to " PACKAGE_NAME "\n" 122 "or: bitcoin-cli [options] -named <command> [name=value]... Send command to " PACKAGE_NAME " (with named arguments)\n" 123 "or: bitcoin-cli [options] help List commands\n" 124 "or: bitcoin-cli [options] help <command> Get help for a command\n";
130 tfm::format(std::cerr,
"Error: too few parameters\n");
136 tfm::format(std::cerr,
"Error: Specified data directory \"%s\" does not exist.\n",
gArgs.
GetArg(
"-datadir",
""));
140 tfm::format(std::cerr,
"Error reading configuration file: %s\n", error);
146 }
catch (
const std::exception& e) {
167 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 168 case EVREQ_HTTP_TIMEOUT:
169 return "timeout reached";
171 return "EOF reached";
172 case EVREQ_HTTP_INVALID_HEADER:
173 return "error while reading header, or invalid header";
174 case EVREQ_HTTP_BUFFER_ERROR:
175 return "error encountered while reading or writing";
176 case EVREQ_HTTP_REQUEST_CANCEL:
177 return "request was canceled";
178 case EVREQ_HTTP_DATA_TOO_LONG:
179 return "response body is larger than allowed";
190 if (req ==
nullptr) {
198 reply->
status = evhttp_request_get_response_code(req);
200 struct evbuffer *buf = evhttp_request_get_input_buffer(req);
203 size_t size = evbuffer_get_length(buf);
204 const char *data = (
const char*)evbuffer_pullup(buf, size);
206 reply->
body = std::string(data, size);
207 evbuffer_drain(buf, size);
211 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 212 static void http_error_cb(
enum evhttp_request_error err,
void *
ctx)
226 virtual UniValue PrepareRequest(
const std::string& method,
const std::vector<std::string>& args) = 0;
234 const int ID_NETWORKINFO = 0;
235 const int ID_BLOCKCHAININFO = 1;
236 const int ID_WALLETINFO = 2;
237 const int ID_BALANCES = 3;
243 throw std::runtime_error(
"-getinfo takes no arguments");
260 if (!batch[ID_NETWORKINFO][
"error"].isNull()) {
261 return batch[ID_NETWORKINFO];
263 if (!batch[ID_BLOCKCHAININFO][
"error"].isNull()) {
264 return batch[ID_BLOCKCHAININFO];
266 result.
pushKV(
"version", batch[ID_NETWORKINFO][
"result"][
"version"]);
267 result.
pushKV(
"blocks", batch[ID_BLOCKCHAININFO][
"result"][
"blocks"]);
268 result.
pushKV(
"headers", batch[ID_BLOCKCHAININFO][
"result"][
"headers"]);
269 result.
pushKV(
"verificationprogress", batch[ID_BLOCKCHAININFO][
"result"][
"verificationprogress"]);
270 result.
pushKV(
"timeoffset", batch[ID_NETWORKINFO][
"result"][
"timeoffset"]);
273 connections.
pushKV(
"in", batch[ID_NETWORKINFO][
"result"][
"connections_in"]);
274 connections.
pushKV(
"out", batch[ID_NETWORKINFO][
"result"][
"connections_out"]);
275 connections.
pushKV(
"total", batch[ID_NETWORKINFO][
"result"][
"connections"]);
276 result.
pushKV(
"connections", connections);
278 result.
pushKV(
"proxy", batch[ID_NETWORKINFO][
"result"][
"networks"][0][
"proxy"]);
279 result.
pushKV(
"difficulty", batch[ID_BLOCKCHAININFO][
"result"][
"difficulty"]);
280 result.
pushKV(
"chain",
UniValue(batch[ID_BLOCKCHAININFO][
"result"][
"chain"]));
281 if (!batch[ID_WALLETINFO][
"result"].isNull()) {
282 result.
pushKV(
"keypoolsize", batch[ID_WALLETINFO][
"result"][
"keypoolsize"]);
283 if (!batch[ID_WALLETINFO][
"result"][
"unlocked_until"].isNull()) {
284 result.
pushKV(
"unlocked_until", batch[ID_WALLETINFO][
"result"][
"unlocked_until"]);
286 result.
pushKV(
"paytxfee", batch[ID_WALLETINFO][
"result"][
"paytxfee"]);
288 if (!batch[ID_BALANCES][
"result"].isNull()) {
289 result.
pushKV(
"balance", batch[ID_BALANCES][
"result"][
"mine"][
"trusted"]);
291 result.
pushKV(
"relayfee", batch[ID_NETWORKINFO][
"result"][
"relayfee"]);
292 result.
pushKV(
"warnings", batch[ID_NETWORKINFO][
"result"][
"warnings"]);
301 static constexpr int8_t UNKNOWN_NETWORK{-1};
302 static constexpr uint8_t m_networks_size{3};
303 const std::array<std::string, m_networks_size> m_networks{{
"ipv4",
"ipv6",
"onion"}};
304 std::array<std::array<uint16_t, m_networks_size + 2>, 3> m_counts{{{}}};
307 for (uint8_t i = 0; i < m_networks_size; ++i) {
308 if (str == m_networks.at(i))
return i;
310 return UNKNOWN_NETWORK;
312 uint8_t m_details_level{0};
313 bool m_is_help_requested{
false};
317 bool m_is_asmap_on{
false};
318 size_t m_max_addr_length{0};
319 size_t m_max_age_length{4};
320 size_t m_max_id_length{2};
349 if (seconds < 0)
return "";
350 const double milliseconds{round(1000 * seconds)};
351 return milliseconds > 999999 ?
"-" :
ToString(milliseconds);
356 "-netinfo level|\"help\" \n\n" 357 "Returns a network peer connections dashboard with information from the remote server.\n" 358 "Under the hood, -netinfo fetches the data by calling getpeerinfo and getnetworkinfo.\n" 359 "An optional integer argument from 0 to 4 can be passed for different peers listings.\n" 360 "Pass \"help\" to see this detailed help documentation.\n" 361 "If more than one argument is passed, only the first one is read and parsed.\n" 362 "Suggestion: use with the Linux watch(1) command for a live dashboard; see example below.\n\n" 364 "1. level (integer 0-4, optional) Specify the info level of the peers dashboard (default 0):\n" 365 " 0 - Connection counts and local addresses\n" 366 " 1 - Like 0 but with a peers listing (without address or version columns)\n" 367 " 2 - Like 1 but with an address column\n" 368 " 3 - Like 1 but with a version column\n" 369 " 4 - Like 1 but with both address and version columns\n" 370 "2. help (string \"help\", optional) Print this help documentation instead of the dashboard.\n\n" 372 "* The peers listing in levels 1-4 displays all of the peers sorted by direction and minimum ping time:\n\n" 373 " Column Description\n" 374 " ------ -----------\n" 376 " \"in\" - inbound connections are those initiated by the peer\n" 377 " \"out\" - outbound connections are those initiated by us\n" 378 " type Type of peer connection\n" 379 " \"full\" - full relay, the default\n" 380 " \"block\" - block relay; like full relay but does not relay transactions or addresses\n" 381 " net Network the peer connected through (\"ipv4\", \"ipv6\", \"onion\", \"i2p\", or \"cjdns\")\n" 382 " mping Minimum observed ping time, in milliseconds (ms)\n" 383 " ping Last observed ping time, in milliseconds (ms)\n" 384 " send Time since last message sent to the peer, in seconds\n" 385 " recv Time since last message received from the peer, in seconds\n" 386 " txn Time since last novel transaction received from the peer and accepted into our mempool, in minutes\n" 387 " blk Time since last novel block passing initial validity checks received from the peer, in minutes\n" 388 " age Duration of connection to the peer, in minutes\n" 389 " asmap Mapped AS (Autonomous System) number in the BGP route to the peer, used for diversifying\n" 390 " peer selection (only displayed if the -asmap config option is set)\n" 391 " id Peer index, in increasing order of peer connections since node startup\n" 392 " address IP address and port of the peer\n" 393 " version Peer version and subversion concatenated, e.g. \"70016/Satoshi:21.0.0/\"\n\n" 394 "* The connection counts table displays the number of peers by direction, network, and the totals\n" 395 " for each, as well as a column for block relay peers.\n\n" 396 "* The local addresses table lists each local address broadcast by the node, the port, and the score.\n\n" 398 "Connection counts and local addresses only\n" 399 "> bitcoin-cli -netinfo\n\n" 400 "Compact peers listing\n" 401 "> bitcoin-cli -netinfo 1\n\n" 403 "> bitcoin-cli -netinfo 4\n\n" 404 "Full live dashboard, adjust --interval or --no-title as needed (Linux)\n" 405 "> watch --interval 1 --no-title bitcoin-cli -netinfo 4\n\n" 407 "> bitcoin-cli -netinfo help\n"};
412 static constexpr
int ID_PEERINFO = 0;
413 static constexpr
int ID_NETWORKINFO = 1;
421 }
else if (args.at(0) ==
"help") {
422 m_is_help_requested =
true;
424 throw std::runtime_error(
strprintf(
"invalid -netinfo argument: %s", args.at(0)));
435 if (m_is_help_requested) {
439 if (!batch[ID_PEERINFO][
"error"].isNull())
return batch[ID_PEERINFO];
440 if (!batch[ID_NETWORKINFO][
"error"].isNull())
return batch[ID_NETWORKINFO];
442 const UniValue& networkinfo{batch[ID_NETWORKINFO][
"result"]};
443 if (networkinfo[
"version"].get_int() < 209900) {
444 throw std::runtime_error(
"-netinfo requires bitcoind server to be running v0.21.0 and up");
448 for (
const UniValue& peer : batch[ID_PEERINFO][
"result"].getValues()) {
449 const std::string network{peer[
"network"].get_str()};
450 const int8_t network_id{NetworkStringToId(network)};
451 if (network_id == UNKNOWN_NETWORK)
continue;
452 const bool is_outbound{!peer[
"inbound"].get_bool()};
453 const bool is_block_relay{!peer[
"relaytxes"].get_bool()};
454 ++m_counts.at(is_outbound).at(network_id);
455 ++m_counts.at(is_outbound).at(m_networks_size);
456 ++m_counts.at(2).at(network_id);
457 ++m_counts.at(2).at(m_networks_size);
458 if (is_block_relay) {
459 ++m_counts.at(is_outbound).at(m_networks_size + 1);
460 ++m_counts.at(2).at(m_networks_size + 1);
462 if (DetailsRequested()) {
464 const int peer_id{peer[
"id"].get_int()};
465 const int mapped_as{peer[
"mapped_as"].isNull() ? 0 : peer[
"mapped_as"].get_int()};
466 const int version{peer[
"version"].get_int()};
467 const int64_t conn_time{peer[
"conntime"].get_int64()};
468 const int64_t last_blck{peer[
"last_block"].get_int64()};
469 const int64_t last_recv{peer[
"lastrecv"].get_int64()};
470 const int64_t last_send{peer[
"lastsend"].get_int64()};
471 const int64_t last_trxn{peer[
"last_transaction"].get_int64()};
472 const double min_ping{peer[
"minping"].isNull() ? -1 : peer[
"minping"].get_real()};
473 const double ping{peer[
"pingtime"].isNull() ? -1 : peer[
"pingtime"].get_real()};
474 const std::string addr{peer[
"addr"].get_str()};
475 const std::string age{conn_time == 0 ?
"" :
ToString((m_time_now - conn_time) / 60)};
476 const std::string sub_version{peer[
"subver"].get_str()};
477 m_peers.push_back({addr, sub_version, network, age, min_ping,
ping, last_blck, last_recv, last_send, last_trxn, peer_id, mapped_as, version, is_block_relay, is_outbound});
478 m_max_addr_length = std::max(addr.length() + 1, m_max_addr_length);
479 m_max_age_length = std::max(age.length(), m_max_age_length);
480 m_max_id_length = std::max(
ToString(peer_id).length(), m_max_id_length);
481 m_is_asmap_on |= (mapped_as != 0);
489 if (DetailsRequested() && !m_peers.empty()) {
490 std::sort(m_peers.begin(), m_peers.end());
491 result +=
strprintf(
"<-> relay net mping ping send recv txn blk %*s ", m_max_age_length,
"age");
492 if (m_is_asmap_on) result +=
" asmap ";
493 result +=
strprintf(
"%*s %-*s%s\n", m_max_id_length,
"id", IsAddressSelected() ? m_max_addr_length : 0, IsAddressSelected() ?
"address" :
"", IsVersionSelected() ?
"version" :
"");
494 for (
const Peer& peer : m_peers) {
495 std::string version{
ToString(peer.version) + peer.sub_version};
497 "%3s %5s %5s%7s%7s%5s%5s%5s%5s %*s%*i %*s %-*s%s\n",
498 peer.is_outbound ?
"out" :
"in",
499 peer.is_block_relay ?
"block" :
"full",
501 PingTimeToString(peer.min_ping),
502 PingTimeToString(peer.ping),
503 peer.last_send == 0 ?
"" :
ToString(m_time_now - peer.last_send),
504 peer.last_recv == 0 ?
"" :
ToString(m_time_now - peer.last_recv),
505 peer.last_trxn == 0 ?
"" :
ToString((m_time_now - peer.last_trxn) / 60),
506 peer.last_blck == 0 ?
"" :
ToString((m_time_now - peer.last_blck) / 60),
509 m_is_asmap_on ? 7 : 0,
510 m_is_asmap_on && peer.mapped_as != 0 ?
ToString(peer.mapped_as) :
"",
513 IsAddressSelected() ? m_max_addr_length : 0,
514 IsAddressSelected() ? peer.addr :
"",
515 IsVersionSelected() && version !=
"0" ? version :
"");
517 result +=
strprintf(
" ms ms sec sec min min %*s\n\n", m_max_age_length,
"min");
521 result +=
" ipv4 ipv6 onion total block-relay\n";
522 const std::array<std::string, 3> rows{{
"in",
"out",
"total"}};
523 for (uint8_t i = 0; i < m_networks_size; ++i) {
524 result +=
strprintf(
"%-5s %5i %5i %5i %5i %5i\n", rows.at(i), m_counts.at(i).at(0), m_counts.at(i).at(1), m_counts.at(i).at(2), m_counts.at(i).at(m_networks_size), m_counts.at(i).at(m_networks_size + 1));
528 result +=
"\nLocal addresses";
529 const std::vector<UniValue>& local_addrs{networkinfo[
"localaddresses"].getValues()};
530 if (local_addrs.empty()) {
533 size_t max_addr_size{0};
534 for (
const UniValue& addr : local_addrs) {
535 max_addr_size = std::max(addr[
"address"].get_str().length() + 1, max_addr_size);
537 for (
const UniValue& addr : local_addrs) {
538 result +=
strprintf(
"\n%-*s port %6i score %6i", max_addr_size, addr[
"address"].get_str(), addr[
"port"].get_int(), addr[
"score"].get_int());
552 address_str = args.at(1);
560 result.
pushKV(
"address", address_str);
609 evhttp_connection_set_timeout(evcon.get(), timeout);
614 constexpr
int YEAR_IN_SECONDS = 31556952;
615 evhttp_connection_set_timeout(evcon.get(), 5 * YEAR_IN_SECONDS);
622 throw std::runtime_error(
"create http request failed");
623 #if LIBEVENT_VERSION_NUMBER >= 0x02010300 624 evhttp_request_set_error_cb(req.get(), http_error_cb);
629 bool failedToGetAuthCookie =
false;
633 failedToGetAuthCookie =
true;
639 struct evkeyvalq* output_headers = evhttp_request_get_output_headers(req.get());
641 evhttp_add_header(output_headers,
"Host", host.c_str());
642 evhttp_add_header(output_headers,
"Connection",
"close");
643 evhttp_add_header(output_headers,
"Content-Type",
"application/json");
644 evhttp_add_header(output_headers,
"Authorization", (std::string(
"Basic ") +
EncodeBase64(strRPCUserColonPass)).c_str());
648 struct evbuffer* output_buffer = evhttp_request_get_output_buffer(req.get());
650 evbuffer_add(output_buffer, strRequest.data(), strRequest.size());
653 std::string endpoint =
"/";
655 char* encodedURI = evhttp_uriencode(rpcwallet->data(), rpcwallet->size(),
false);
657 endpoint =
"/wallet/" + std::string(encodedURI);
663 int r = evhttp_make_request(evcon.get(), req.get(), EVHTTP_REQ_POST, endpoint.c_str());
669 event_base_dispatch(base.get());
671 if (response.status == 0) {
672 std::string responseErrorMessage;
673 if (response.error != -1) {
676 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));
678 if (failedToGetAuthCookie) {
680 "Could not locate RPC credentials. No authentication cookie could be found, and RPC password is not set. See -rpcpassword and -stdinrpcpass. Configuration file: (%s)",
683 throw std::runtime_error(
"Authorization failed: Incorrect rpcuser or rpcpassword");
686 throw std::runtime_error(
strprintf(
"server returned HTTP error %d", response.status));
687 else if (response.body.empty())
688 throw std::runtime_error(
"no response from server");
692 if (!valReply.
read(response.body))
693 throw std::runtime_error(
"couldn't parse reply from server");
696 throw std::runtime_error(
"expected reply to have result, error and id properties");
717 response =
CallRPC(rh, strMethod, args, rpcwallet);
739 if (result.
isNull())
return;
750 strPrint =
"error code: " + err_code.
getValStr() +
"\n";
752 if (err_msg.
isStr()) {
753 strPrint += (
"error message:\n" + err_msg.
get_str());
756 strPrint +=
"\nTry adding \"-rpcwallet=<filename>\" option to bitcoin-cli command line.";
759 strPrint =
"error: " + error.
write();
761 nRet = abs(error[
"code"].get_int());
774 if (!
find_value(listwallets,
"error").isNull())
return;
776 if (wallets.
size() <= 1)
return;
780 const std::string wallet_name =
wallet.get_str();
783 balances.
pushKV(wallet_name, balance);
785 result.
pushKV(
"balances", balances);
807 if (args.size() > 2)
throw std::runtime_error(
"too many arguments (maximum 2 for nblocks and maxtries)");
808 if (args.size() == 0) {
810 }
else if (args.at(0) ==
"0") {
811 throw std::runtime_error(
"the first argument (number of blocks to generate, default: " +
DEFAULT_NBLOCKS +
") must be an integer value greater than zero");
813 args.emplace(args.begin() + 1, address);
818 std::string strPrint;
830 fputs(
"RPC password> ", stderr);
833 if (!std::getline(std::cin, rpcPass)) {
834 throw std::runtime_error(
"-stdinrpcpass specified but failed to read from standard input");
841 std::vector<std::string> args = std::vector<std::string>(&argv[1], &argv[argc]);
844 std::string walletPass;
845 if (args.size() < 1 || args[0].substr(0, 16) !=
"walletpassphrase") {
846 throw std::runtime_error(
"-stdinwalletpassphrase is only applicable for walletpassphrase(change)");
849 fputs(
"Wallet passphrase> ", stderr);
852 if (!std::getline(std::cin, walletPass)) {
853 throw std::runtime_error(
"-stdinwalletpassphrase specified but failed to read from standard input");
858 args.insert(args.begin() + 1, walletPass);
863 while (std::getline(std::cin, line)) {
864 args.push_back(line);
870 std::unique_ptr<BaseRequestHandler> rh;
879 if (
error.isNull()) {
887 if (args.size() < 1) {
888 throw std::runtime_error(
"too few parameters (need at least command)");
891 args.erase(args.begin());
911 }
catch (
const std::exception& e) {
912 strPrint = std::string(
"error: ") + e.what();
919 if (strPrint !=
"") {
920 tfm::format(nRet == 0 ? std::cout : std::cerr,
"%s\n", strPrint);
931 __declspec(dllexport)
int main(
int argc,
char* argv[])
933 util::WinCmdLineArgs winArgs;
934 std::tie(argc, argv) = winArgs.get();
936 int main(
int argc,
char* argv[])
941 tfm::format(std::cerr,
"Error: Initializing networking failed\n");
951 catch (
const std::exception& e) {
959 int ret = EXIT_FAILURE;
963 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...
bool IsArgSet(const std::string &strArg) const
Return true if the given argument has been manually set.
static int CommandLineRPC(int argc, char *argv[])
static UniValue ConnectAndCallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const Optional< std::string > &rpcwallet={})
ConnectAndCallRPC wraps CallRPC with -rpcwait and an exception handler.
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
bool read(const char *raw, size_t len)
static std::string strRPCUserColonPass
UniValue ProcessReply(const UniValue &reply) override
static UniValue CallRPC(BaseRequestHandler *rh, const std::string &strMethod, const std::vector< std::string > &args, const Optional< std::string > &rpcwallet={})
int8_t NetworkStringToId(const std::string &str) const
virtual ~BaseRequestHandler()
static const int DEFAULT_HTTP_CLIENT_TIMEOUT
const CBaseChainParams & BaseParams()
Return the currently selected parameters.
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)
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
void ForceSetArg(const std::string &strArg, const std::string &strValue)
const char *const BITCOIN_CONF_FILENAME
int64_t GetSystemTimeInSeconds()
Returns the system time (not mockable)
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)
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 secp256k1_context * ctx
const UniValue NetinfoHelp()
Process netinfo 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...
bool pushKV(const std::string &key, const UniValue &val)
void PrintExceptionContinue(const std::exception *pex, const char *pszThread)
int main(int argc, char *argv[])
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)
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)
Process default single requests.
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.
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
Process getinfo requests.
bool error(const char *fmt, const Args &... args)
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.
std::optional< T > Optional
Substitute for C++17 std::optional DEPRECATED use std::optional in new code.
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
void SplitHostPort(std::string in, int &portOut, std::string &hostOut)