/root/bitcoin/src/common/messages.cpp
Line | Count | Source (jump to first uncovered line) |
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 | | std::string StringForFeeReason(FeeReason reason) |
27 | 0 | { |
28 | 0 | static const std::map<FeeReason, std::string> fee_reason_strings = { |
29 | 0 | {FeeReason::NONE, "None"}, |
30 | 0 | {FeeReason::HALF_ESTIMATE, "Half Target 60% Threshold"}, |
31 | 0 | {FeeReason::FULL_ESTIMATE, "Target 85% Threshold"}, |
32 | 0 | {FeeReason::DOUBLE_ESTIMATE, "Double Target 95% Threshold"}, |
33 | 0 | {FeeReason::CONSERVATIVE, "Conservative Double Target longer horizon"}, |
34 | 0 | {FeeReason::MEMPOOL_MIN, "Mempool Min Fee"}, |
35 | 0 | {FeeReason::PAYTXFEE, "PayTxFee set"}, |
36 | 0 | {FeeReason::FALLBACK, "Fallback fee"}, |
37 | 0 | {FeeReason::REQUIRED, "Minimum Required Fee"}, |
38 | 0 | }; |
39 | 0 | auto reason_string = fee_reason_strings.find(reason); |
40 | |
|
41 | 0 | if (reason_string == fee_reason_strings.end()) return "Unknown"; |
42 | | |
43 | 0 | return reason_string->second; |
44 | 0 | } |
45 | | |
46 | | const std::vector<std::pair<std::string, FeeEstimateMode>>& FeeModeMap() |
47 | 0 | { |
48 | 0 | static const std::vector<std::pair<std::string, FeeEstimateMode>> FEE_MODES = { |
49 | 0 | {"unset", FeeEstimateMode::UNSET}, |
50 | 0 | {"economical", FeeEstimateMode::ECONOMICAL}, |
51 | 0 | {"conservative", FeeEstimateMode::CONSERVATIVE}, |
52 | 0 | }; |
53 | 0 | return FEE_MODES; |
54 | 0 | } |
55 | | |
56 | | std::string FeeModeInfo(const std::pair<std::string, FeeEstimateMode>& mode, std::string& default_info) |
57 | 0 | { |
58 | 0 | switch (mode.second) { |
59 | 0 | case FeeEstimateMode::UNSET: |
60 | 0 | return strprintf("%s means no mode set (%s). \n", mode.first, default_info); |
61 | 0 | case FeeEstimateMode::ECONOMICAL: |
62 | 0 | return strprintf("%s estimates use a shorter time horizon, making them more\n" |
63 | 0 | "responsive to short-term drops in the prevailing fee market. This mode\n" |
64 | 0 | "potentially returns a lower fee rate estimate.\n", mode.first); |
65 | 0 | case FeeEstimateMode::CONSERVATIVE: |
66 | 0 | return strprintf("%s estimates use a longer time horizon, making them\n" |
67 | 0 | "less responsive to short-term drops in the prevailing fee market. This mode\n" |
68 | 0 | "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 | 0 | } |
73 | 0 | } |
74 | | |
75 | | std::string FeeModesDetail(std::string default_info) |
76 | 0 | { |
77 | 0 | std::string info; |
78 | 0 | for (const auto& fee_mode : FeeModeMap()) { |
79 | 0 | info += FeeModeInfo(fee_mode, default_info); |
80 | 0 | } |
81 | 0 | return strprintf("%s \n%s", FeeModes(", "), info); |
82 | 0 | } |
83 | | |
84 | | std::string FeeModes(const std::string& delimiter) |
85 | 0 | { |
86 | 0 | return Join(FeeModeMap(), delimiter, [&](const std::pair<std::string, FeeEstimateMode>& i) { return i.first; }); |
87 | 0 | } |
88 | | |
89 | | std::string InvalidEstimateModeErrorMessage() |
90 | 0 | { |
91 | 0 | return "Invalid estimate_mode parameter, must be one of: \"" + FeeModes("\", \"") + "\""; |
92 | 0 | } |
93 | | |
94 | | bool FeeModeFromString(const std::string& mode_string, FeeEstimateMode& fee_estimate_mode) |
95 | 0 | { |
96 | 0 | auto searchkey = ToUpper(mode_string); |
97 | 0 | for (const auto& pair : FeeModeMap()) { |
98 | 0 | if (ToUpper(pair.first) == searchkey) { |
99 | 0 | fee_estimate_mode = pair.second; |
100 | 0 | return true; |
101 | 0 | } |
102 | 0 | } |
103 | 0 | return false; |
104 | 0 | } |
105 | | |
106 | | bilingual_str PSBTErrorString(PSBTError err) |
107 | 0 | { |
108 | 0 | switch (err) { |
109 | 0 | case PSBTError::MISSING_INPUTS: |
110 | 0 | return Untranslated("Inputs missing or spent"); |
111 | 0 | case PSBTError::SIGHASH_MISMATCH: |
112 | 0 | 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 | | // no default case, so the compiler can warn about missing cases |
120 | 0 | } |
121 | 0 | assert(false); |
122 | 0 | } |
123 | | |
124 | | bilingual_str TransactionErrorString(const TransactionError err) |
125 | 0 | { |
126 | 0 | switch (err) { |
127 | 0 | case TransactionError::OK: |
128 | 0 | return Untranslated("No error"); |
129 | 0 | case TransactionError::MISSING_INPUTS: |
130 | 0 | return Untranslated("Inputs missing or spent"); |
131 | 0 | case TransactionError::ALREADY_IN_UTXO_SET: |
132 | 0 | return Untranslated("Transaction outputs already in utxo set"); |
133 | 0 | case TransactionError::MEMPOOL_REJECTED: |
134 | 0 | return Untranslated("Transaction rejected by mempool"); |
135 | 0 | case TransactionError::MEMPOOL_ERROR: |
136 | 0 | return Untranslated("Mempool internal error"); |
137 | 0 | case TransactionError::MAX_FEE_EXCEEDED: |
138 | 0 | return Untranslated("Fee exceeds maximum configured by user (e.g. -maxtxfee, maxfeerate)"); |
139 | 0 | case TransactionError::MAX_BURN_EXCEEDED: |
140 | 0 | return Untranslated("Unspendable output exceeds maximum configured by user (maxburnamount)"); |
141 | 0 | case TransactionError::INVALID_PACKAGE: |
142 | 0 | return Untranslated("Transaction rejected due to invalid package"); |
143 | | // no default case, so the compiler can warn about missing cases |
144 | 0 | } |
145 | 0 | assert(false); |
146 | 0 | } |
147 | | |
148 | | bilingual_str ResolveErrMsg(const std::string& optname, const std::string& strBind) |
149 | 0 | { |
150 | 0 | return strprintf(_("Cannot resolve -%s address: '%s'"), optname, strBind); |
151 | 0 | } |
152 | | |
153 | | bilingual_str InvalidPortErrMsg(const std::string& optname, const std::string& invalid_value) |
154 | 0 | { |
155 | 0 | return strprintf(_("Invalid port specified in %s: '%s'"), optname, invalid_value); |
156 | 0 | } |
157 | | |
158 | | bilingual_str AmountHighWarn(const std::string& optname) |
159 | 0 | { |
160 | 0 | return strprintf(_("%s is set very high!"), optname); |
161 | 0 | } |
162 | | |
163 | | bilingual_str AmountErrMsg(const std::string& optname, const std::string& strValue) |
164 | 0 | { |
165 | 0 | return strprintf(_("Invalid amount for -%s=<amount>: '%s'"), optname, strValue); |
166 | 0 | } |
167 | | } // namespace common |