Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : : // Copyright (c) 2009-2022 The Bitcoin Core developers
3 : : // Distributed under the MIT software license, see the accompanying
4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 : :
6 : : #include <common/messages.h>
7 : :
8 : : #include <common/types.h>
9 : : #include <policy/fees.h>
10 : : #include <node/types.h>
11 : : #include <tinyformat.h>
12 : : #include <util/strencodings.h>
13 : : #include <util/string.h>
14 : : #include <util/translation.h>
15 : :
16 : : #include <cassert>
17 : : #include <map>
18 : : #include <string>
19 : : #include <utility>
20 : : #include <vector>
21 : :
22 : : using node::TransactionError;
23 : : using util::Join;
24 : :
25 : : namespace common {
26 : 3290 : std::string StringForFeeReason(FeeReason reason)
27 : : {
28 : 3290 : static const std::map<FeeReason, std::string> fee_reason_strings = {
29 [ + - ]: 110 : {FeeReason::NONE, "None"},
30 : 110 : {FeeReason::HALF_ESTIMATE, "Half Target 60% Threshold"},
31 : 110 : {FeeReason::FULL_ESTIMATE, "Target 85% Threshold"},
32 : 110 : {FeeReason::DOUBLE_ESTIMATE, "Double Target 95% Threshold"},
33 : 110 : {FeeReason::CONSERVATIVE, "Conservative Double Target longer horizon"},
34 : 110 : {FeeReason::MEMPOOL_MIN, "Mempool Min Fee"},
35 : 110 : {FeeReason::PAYTXFEE, "PayTxFee set"},
36 : 110 : {FeeReason::FALLBACK, "Fallback fee"},
37 : 110 : {FeeReason::REQUIRED, "Minimum Required Fee"},
38 [ + + + - : 5469 : };
+ + - - ]
39 : 3290 : auto reason_string = fee_reason_strings.find(reason);
40 : :
41 [ - + ]: 3290 : if (reason_string == fee_reason_strings.end()) return "Unknown";
42 : :
43 : 3290 : return reason_string->second;
44 [ + - + - : 990 : }
+ - + - +
- + - + -
+ - - + -
- ]
45 : :
46 : 25081 : const std::vector<std::pair<std::string, FeeEstimateMode>>& FeeModeMap()
47 : : {
48 : 25081 : static const std::vector<std::pair<std::string, FeeEstimateMode>> FEE_MODES = {
49 [ + - ]: 1079 : {"unset", FeeEstimateMode::UNSET},
50 : 1079 : {"economical", FeeEstimateMode::ECONOMICAL},
51 : 1079 : {"conservative", FeeEstimateMode::CONSERVATIVE},
52 [ + + + - : 29397 : };
+ + - - ]
53 : 25081 : return FEE_MODES;
54 [ + - + - : 1079 : }
- + - - ]
55 : :
56 : 37479 : std::string FeeModeInfo(const std::pair<std::string, FeeEstimateMode>& mode, std::string& default_info)
57 : : {
58 [ + + + - ]: 37479 : switch (mode.second) {
59 : 12493 : case FeeEstimateMode::UNSET:
60 : 12493 : return strprintf("%s means no mode set (%s). \n", mode.first, default_info);
61 : 12493 : case FeeEstimateMode::ECONOMICAL:
62 : 12493 : return strprintf("%s estimates use a shorter time horizon, making them more\n"
63 : : "responsive to short-term drops in the prevailing fee market. This mode\n"
64 : 12493 : "potentially returns a lower fee rate estimate.\n", mode.first);
65 : 12493 : case FeeEstimateMode::CONSERVATIVE:
66 : 12493 : return strprintf("%s estimates use a longer time horizon, making them\n"
67 : : "less responsive to short-term drops in the prevailing fee market. This mode\n"
68 : 12493 : "potentially returns a higher fee rate estimate.\n", mode.first);
69 : 0 : default:
70 : : // Other modes apart from the ones handled are fee rate units; they should not be clarified.
71 : 0 : assert(false);
72 : : }
73 : : }
74 : :
75 : 12493 : std::string FeeModesDetail(std::string default_info)
76 : : {
77 [ + - ]: 12493 : std::string info;
78 [ + - + + ]: 49972 : for (const auto& fee_mode : FeeModeMap()) {
79 [ + - ]: 74958 : info += FeeModeInfo(fee_mode, default_info);
80 : : }
81 [ + - + - : 24986 : return strprintf("%s \n%s", FeeModes(", "), info);
+ - ]
82 : 12493 : }
83 : :
84 : 12521 : std::string FeeModes(const std::string& delimiter)
85 : : {
86 [ + - ]: 50084 : return Join(FeeModeMap(), delimiter, [&](const std::pair<std::string, FeeEstimateMode>& i) { return i.first; });
87 : : }
88 : :
89 : 28 : std::string InvalidEstimateModeErrorMessage()
90 : : {
91 [ + - + - ]: 56 : return "Invalid estimate_mode parameter, must be one of: \"" + FeeModes("\", \"") + "\"";
92 : : }
93 : :
94 : 67 : bool FeeModeFromString(const std::string& mode_string, FeeEstimateMode& fee_estimate_mode)
95 : : {
96 : 67 : auto searchkey = ToUpper(mode_string);
97 [ + - + + ]: 198 : for (const auto& pair : FeeModeMap()) {
98 [ + - + + ]: 170 : if (ToUpper(pair.first) == searchkey) {
99 : 39 : fee_estimate_mode = pair.second;
100 : 39 : return true;
101 : : }
102 : : }
103 : : return false;
104 : 67 : }
105 : :
106 : 14 : bilingual_str PSBTErrorString(PSBTError err)
107 : : {
108 [ - + - - : 14 : switch (err) {
- - - - ]
109 : 0 : case PSBTError::MISSING_INPUTS:
110 [ # # ]: 0 : return Untranslated("Inputs missing or spent");
111 : 14 : case PSBTError::SIGHASH_MISMATCH:
112 [ + - ]: 28 : return Untranslated("Specified sighash value does not match value stored in PSBT");
113 : 0 : case PSBTError::EXTERNAL_SIGNER_NOT_FOUND:
114 [ # # ]: 0 : return Untranslated("External signer not found");
115 : 0 : case PSBTError::EXTERNAL_SIGNER_FAILED:
116 [ # # ]: 0 : return Untranslated("External signer failed to sign");
117 : 0 : case PSBTError::UNSUPPORTED:
118 [ # # ]: 0 : return Untranslated("Signer does not support PSBT");
119 : 0 : case PSBTError::INCOMPLETE:
120 [ # # ]: 0 : return Untranslated("Input needs additional signatures or other data");
121 : 0 : case PSBTError::OK:
122 [ # # ]: 0 : return Untranslated("No errors");
123 : : // no default case, so the compiler can warn about missing cases
124 : : }
125 : 0 : assert(false);
126 : : }
127 : :
128 : 30 : bilingual_str TransactionErrorString(const TransactionError err)
129 : : {
130 [ - - + - : 30 : switch (err) {
- + + -
- ]
131 : 0 : case TransactionError::OK:
132 [ # # ]: 0 : return Untranslated("No error");
133 : 0 : case TransactionError::MISSING_INPUTS:
134 [ # # ]: 0 : return Untranslated("Inputs missing or spent");
135 : 3 : case TransactionError::ALREADY_IN_UTXO_SET:
136 [ + - ]: 6 : return Untranslated("Transaction outputs already in utxo set");
137 : 0 : case TransactionError::MEMPOOL_REJECTED:
138 [ # # ]: 0 : return Untranslated("Transaction rejected by mempool");
139 : 0 : case TransactionError::MEMPOOL_ERROR:
140 [ # # ]: 0 : return Untranslated("Mempool internal error");
141 : 22 : case TransactionError::MAX_FEE_EXCEEDED:
142 [ + - ]: 44 : return Untranslated("Fee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)");
143 : 5 : case TransactionError::MAX_BURN_EXCEEDED:
144 [ + - ]: 10 : return Untranslated("Unspendable output exceeds maximum configured by user (maxburnamount)");
145 : 0 : case TransactionError::INVALID_PACKAGE:
146 [ # # ]: 0 : return Untranslated("Transaction rejected due to invalid package");
147 : : // no default case, so the compiler can warn about missing cases
148 : : }
149 : 0 : assert(false);
150 : : }
151 : :
152 : 3 : bilingual_str ResolveErrMsg(const std::string& optname, const std::string& strBind)
153 : : {
154 : 3 : return strprintf(_("Cannot resolve -%s address: '%s'"), optname, strBind);
155 : : }
156 : :
157 : 9 : bilingual_str InvalidPortErrMsg(const std::string& optname, const std::string& invalid_value)
158 : : {
159 : 9 : return strprintf(_("Invalid port specified in %s: '%s'"), optname, invalid_value);
160 : : }
161 : :
162 : 6 : bilingual_str AmountHighWarn(const std::string& optname)
163 : : {
164 : 6 : return strprintf(_("%s is set very high!"), optname);
165 : : }
166 : :
167 : 0 : bilingual_str AmountErrMsg(const std::string& optname, const std::string& strValue)
168 : : {
169 : 0 : return strprintf(_("Invalid amount for -%s=<amount>: '%s'"), optname, strValue);
170 : : }
171 : : } // namespace common
|