Merge bitcoin/bitcoin#34640: wallet: rpc: Improve error message for low feerates.

98fcd7af23 wallet: rpc: Improve error message for low feerates. (David Gumberg)

Pull request description:

  Giving the user a hint about what action to take when they encounter an error related to a feerate that is below the minimum. I encountered this myself not knowing about `-mintxfee` and the manpage was slightly less than clear,

  ```
         -mintxfee=<amt>

                Fee rates (in BTC/kvB) smaller than this are considered zero fee for  transaction  creation
                (default: 0.00001)
  ```

ACKs for top commit:
  achow101:
    ACK 98fcd7af23
  ismaelsadeeq:
    ACK  98fcd7af23
  w0xlt:
    ACK 98fcd7af23

Tree-SHA512: 8471bfd5682ca59137541ab4da670e85947cf7812baa9e07d816e352fccfb5e0e71a06c2baf1a5422d78a7da8c08b9fcbb73d85cc9daba88b7c22e802abe5b2e
This commit is contained in:
Ava Chow
2026-03-31 11:38:44 -07:00
2 changed files with 22 additions and 2 deletions

View File

@@ -1431,7 +1431,16 @@ RPCMethod sendall()
// Do not, ever, assume that it's fine to change the fee rate if the user has explicitly
// provided one
if (coin_control.m_feerate && fee_rate > *coin_control.m_feerate) {
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Fee rate (%s) is lower than the minimum fee rate setting (%s)", coin_control.m_feerate->ToString(FeeRateFormat::SAT_VB), fee_rate.ToString(FeeRateFormat::SAT_VB)));
const auto feerate_format = FeeRateFormat::SAT_VB;
auto msg{strprintf("Fee rate (%s) is lower than the minimum fee rate setting (%s).",
coin_control.m_feerate->ToString(feerate_format),
fee_rate.ToString(feerate_format))};
if (fee_calc_out.reason == FeeReason::REQUIRED) {
msg += strprintf("\nConsider modifying -mintxfee (%s) or -minrelaytxfee (%s).",
pwallet->m_min_fee.ToString(feerate_format),
pwallet->chain().relayMinFee().ToString(feerate_format));
}
throw JSONRPCError(RPC_INVALID_PARAMETER, msg);
}
if (fee_calc_out.reason == FeeReason::FALLBACK && !pwallet->m_allow_fallback_fee) {
// eventually allow a fallback fee

View File

@@ -1159,7 +1159,18 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
// Do not, ever, assume that it's fine to change the fee rate if the user has explicitly
// provided one
if (coin_control.m_feerate && coin_selection_params.m_effective_feerate > *coin_control.m_feerate) {
return util::Error{strprintf(_("Fee rate (%s) is lower than the minimum fee rate setting (%s)"), coin_control.m_feerate->ToString(FeeRateFormat::SAT_VB), coin_selection_params.m_effective_feerate.ToString(FeeRateFormat::SAT_VB))};
const auto feerate_format = FeeRateFormat::SAT_VB;
auto msg{strprintf(_("Fee rate (%s) is lower than the minimum fee rate setting (%s)."),
coin_control.m_feerate->ToString(feerate_format),
coin_selection_params.m_effective_feerate.ToString(feerate_format))};
if (feeCalc.reason == FeeReason::REQUIRED) {
msg += strprintf(_("\nConsider modifying %s (%s) or %s (%s)."),
"-mintxfee",
wallet.m_min_fee.ToString(feerate_format),
"-minrelaytxfee",
wallet.chain().relayMinFee().ToString(feerate_format));
}
return util::Error{msg};
}
if (feeCalc.reason == FeeReason::FALLBACK && !wallet.m_allow_fallback_fee) {
// eventually allow a fallback fee