From 35c6e75dec371a14a7c5a1e2e732ce23ee9346e3 Mon Sep 17 00:00:00 2001 From: ismaelsadeeq Date: Thu, 25 Jul 2024 14:30:40 +0100 Subject: [PATCH] [rpc, fees]: add more detail on the fee estimation modes - Add description that indicates the fee estimation modes behaviour. - This description will be returned in the RPC's help texts. --- src/common/messages.cpp | 33 +++++++++++++++++++++++++++++++++ src/common/messages.h | 2 ++ src/rpc/fees.cpp | 9 ++------- src/wallet/rpc/spend.cpp | 14 +++++++------- 4 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/common/messages.cpp b/src/common/messages.cpp index 9e88ca8b0f9625..e44d6c1abb606c 100644 --- a/src/common/messages.cpp +++ b/src/common/messages.cpp @@ -53,6 +53,39 @@ const std::vector>& FeeModeMap() return FEE_MODES; } +std::string FeeModeInfo(const std::pair& mode) +{ + const char* info; + switch (mode.second) { + case FeeEstimateMode::UNSET: + info = "no mode set\n"; + break; + case FeeEstimateMode::ECONOMICAL: + info = "Economical estimates use a shorter time horizon, making them more\n" + "responsive to short-term drops in the prevailing fee market. This mode\n" + "potentially returns a lower fee rate estimate.\n"; + break; + case FeeEstimateMode::CONSERVATIVE: + info = "Conservative estimates use a longer time horizon, making them\n" + "less responsive to short-term drops in the prevailing fee market. This mode\n" + "potentially returns a higher fee rate estimate.\n"; + break; + default: + // no default case, so the compiler can warn about missing cases + assert(false); + } + return strprintf("\"%s\" \n%s", mode.first, info); +} + +std::string FeeModesDetail() +{ + std::string info; + for (const auto& fee_mode : FeeModeMap()) { + info += FeeModeInfo(fee_mode); + } + return info; +} + std::string FeeModes(const std::string& delimiter) { return Join(FeeModeMap(), delimiter, [&](const std::pair& i) { return i.first; }); diff --git a/src/common/messages.h b/src/common/messages.h index 68e7bb216966de..24a1ad40c3949b 100644 --- a/src/common/messages.h +++ b/src/common/messages.h @@ -26,6 +26,8 @@ enum class PSBTError; bool FeeModeFromString(const std::string& mode_string, FeeEstimateMode& fee_estimate_mode); std::string StringForFeeReason(FeeReason reason); std::string FeeModes(const std::string& delimiter); +std::string FeeModeInfo(std::pair& mode); +std::string FeeModesDetail(); std::string InvalidEstimateModeErrorMessage(); bilingual_str PSBTErrorString(PSBTError error); bilingual_str TransactionErrorString(const node::TransactionError error); diff --git a/src/rpc/fees.cpp b/src/rpc/fees.cpp index 662d24ef811f63..cb9d3fe76619fd 100644 --- a/src/rpc/fees.cpp +++ b/src/rpc/fees.cpp @@ -23,7 +23,7 @@ #include using common::FeeModeFromString; -using common::FeeModes; +using common::FeeModesDetail; using common::InvalidEstimateModeErrorMessage; using node::NodeContext; @@ -37,12 +37,7 @@ static RPCHelpMan estimatesmartfee() { {"conf_target", RPCArg::Type::NUM, RPCArg::Optional::NO, "Confirmation target in blocks (1 - 1008)"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"economical"}, "The fee estimate mode.\n" - "Whether to return a more conservative estimate which also satisfies\n" - "a longer history. A conservative estimate potentially returns a\n" - "higher feerate and is more likely to be sufficient for the desired\n" - "target, but is not as responsive to short term drops in the\n" - "prevailing fee market. Must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, }, RPCResult{ RPCResult::Type::OBJ, "", "", diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp index 8ea51e65c7897b..c7f1fb75dcf4b7 100644 --- a/src/wallet/rpc/spend.cpp +++ b/src/wallet/rpc/spend.cpp @@ -24,7 +24,7 @@ #include using common::FeeModeFromString; -using common::FeeModes; +using common::FeeModesDetail; using common::InvalidEstimateModeErrorMessage; using common::StringForFeeReason; using common::TransactionErrorString; @@ -245,7 +245,7 @@ RPCHelpMan sendtoaddress() {"replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Signal that this transaction can be replaced by a transaction (BIP 125)"}, {"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, {"avoid_reuse", RPCArg::Type::BOOL, RPCArg::Default{true}, "(only available if avoid_reuse wallet flag is set) Avoid spending from dirty addresses; addresses are considered\n" "dirty if they have previously been used in a transaction. If true, this also activates avoidpartialspends, grouping outputs by their addresses."}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, @@ -349,7 +349,7 @@ RPCHelpMan sendmany() {"replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Signal that this transaction can be replaced by a transaction (BIP 125)"}, {"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, {"verbose", RPCArg::Type::BOOL, RPCArg::Default{false}, "If true, return extra information about the transaction."}, }, @@ -463,7 +463,7 @@ static std::vector FundTxDoc(bool solving_data = true) std::vector args = { {"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks", RPCArgOptions{.also_positional = true}}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\"", RPCArgOptions{.also_positional = true}}, + + FeeModesDetail(), RPCArgOptions{.also_positional = true}}, { "replaceable", RPCArg::Type::BOOL, RPCArg::DefaultHint{"wallet default"}, "Marks this transaction as BIP125-replaceable.\n" "Allows this transaction to be replaced by a transaction with higher fees" @@ -1018,7 +1018,7 @@ static RPCHelpMan bumpfee_helper(std::string method_name) "still be replaceable in practice, for example if it has unconfirmed ancestors which\n" "are replaceable).\n"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, {"outputs", RPCArg::Type::ARR, RPCArg::Default{UniValue::VARR}, "The outputs specified as key-value pairs.\n" "Each key may only appear once, i.e. there can only be one 'data' output, and no address may be duplicated.\n" "At least one output of either type must be specified.\n" @@ -1205,7 +1205,7 @@ RPCHelpMan send() RPCArgOptions{.skip_type_check = true}}, {"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, {"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "", Cat>( @@ -1331,7 +1331,7 @@ RPCHelpMan sendall() }, {"conf_target", RPCArg::Type::NUM, RPCArg::DefaultHint{"wallet -txconfirmtarget"}, "Confirmation target in blocks"}, {"estimate_mode", RPCArg::Type::STR, RPCArg::Default{"unset"}, "The fee estimate mode, must be one of (case insensitive):\n" - "\"" + FeeModes("\"\n\"") + "\""}, + + FeeModesDetail()}, {"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."}, { "options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",