From 90eda67bb8f9c3b82a3eccc787446269c83b2558 Mon Sep 17 00:00:00 2001 From: Pol Espinasa Date: Tue, 5 May 2026 16:47:02 +0200 Subject: [PATCH] Remove opt-in RBF Remove the option to signal or not signal for BIP 125 (Opt-in Full Replace-By-Fee). By removing the option in the GUI it will fallback to the wallet configuration which by default is true unless the user changed it using CLI. --- src/qt/forms/sendcoinsdialog.ui | 10 ---------- src/qt/sendcoinsdialog.cpp | 24 ++++-------------------- src/qt/test/wallettests.cpp | 12 ++++-------- src/qt/walletmodel.cpp | 1 - 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui index 1ca92440c8a..db59fccbcea 100644 --- a/src/qt/forms/sendcoinsdialog.ui +++ b/src/qt/forms/sendcoinsdialog.ui @@ -1049,16 +1049,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos - - - - Enable Replace-By-Fee - - - With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk. - - - diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 74b9341779b..7c8c04366f7 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -179,13 +179,6 @@ void SendCoinsDialog::setModel(WalletModel *_model) connect(ui->groupFee, &QButtonGroup::idClicked, this, &SendCoinsDialog::coinControlUpdateLabels); connect(ui->customFee, &BitcoinAmountField::valueChanged, this, &SendCoinsDialog::coinControlUpdateLabels); -#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)) - connect(ui->optInRBF, &QCheckBox::checkStateChanged, this, &SendCoinsDialog::updateSmartFeeLabel); - connect(ui->optInRBF, &QCheckBox::checkStateChanged, this, &SendCoinsDialog::coinControlUpdateLabels); -#else - connect(ui->optInRBF, &QCheckBox::stateChanged, this, &SendCoinsDialog::updateSmartFeeLabel); - connect(ui->optInRBF, &QCheckBox::stateChanged, this, &SendCoinsDialog::coinControlUpdateLabels); -#endif CAmount requiredFee = model->wallet().getRequiredFee(1000); ui->customFee->SetMinValue(requiredFee); if (ui->customFee->value() < requiredFee) { @@ -195,9 +188,6 @@ void SendCoinsDialog::setModel(WalletModel *_model) updateFeeSectionControls(); updateSmartFeeLabel(); - // set default rbf checkbox state - ui->optInRBF->setCheckState(Qt::Checked); - if (model->wallet().hasExternalSigner()) { //: "device" usually means a hardware wallet. ui->sendButton->setText(tr("Sign on device")); @@ -360,17 +350,12 @@ bool SendCoinsDialog::PrepareSendText(QString& question_string, QString& informa question_string.append(""); question_string.append(BitcoinUnits::formatHtmlWithUnit(model->getOptionsModel()->getDisplayUnit(), txFee)); question_string.append("
"); - - // append RBF message according to transaction's signalling - question_string.append(""); - if (ui->optInRBF->isChecked()) { - question_string.append(tr("You can increase the fee later (signals Replace-By-Fee, BIP-125).")); - } else { - question_string.append(tr("Not signalling Replace-By-Fee, BIP-125.")); - } - question_string.append(""); } + // append RBF message + question_string.append(""); + question_string.append(tr("You can increase the fee later.")); + // add total amount in all subdivision units question_string.append("
"); CAmount totalAmount = m_current_transaction->getTotalTransactionAmount() + txFee; @@ -834,7 +819,6 @@ void SendCoinsDialog::updateCoinControlState() // Avoid using global defaults when sending money from the GUI // Either custom fee will be used or if not selected, the confirmation target from dropdown box m_coin_control->m_confirm_target = getConfTargetForIndex(ui->confTargetSelector->currentIndex()); - m_coin_control->m_signal_bip125_rbf = ui->optInRBF->isChecked(); } void SendCoinsDialog::updateNumberOfBlocks(int count, const QDateTime& blockDate, double nVerificationProgress, SyncType synctype, SynchronizationState sync_state) { diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp index bb9e061851b..556a6cb65ff 100644 --- a/src/qt/test/wallettests.cpp +++ b/src/qt/test/wallettests.cpp @@ -75,17 +75,13 @@ void ConfirmSend(QString* text = nullptr, QMessageBox::StandardButton confirm_ty } //! Send coins to address and return txid. -Txid SendCoins(CWallet& wallet, SendCoinsDialog& sendCoinsDialog, const CTxDestination& address, CAmount amount, bool rbf, +Txid SendCoins(CWallet& wallet, SendCoinsDialog& sendCoinsDialog, const CTxDestination& address, CAmount amount, QMessageBox::StandardButton confirm_type = QMessageBox::Yes) { QVBoxLayout* entries = sendCoinsDialog.findChild("entries"); SendCoinsEntry* entry = qobject_cast(entries->itemAt(0)->widget()); entry->findChild("payTo")->setText(QString::fromStdString(EncodeDestination(address))); entry->findChild("payAmount")->setValue(amount); - sendCoinsDialog.findChild("frameFee") - ->findChild("frameFeeSelection") - ->findChild("optInRBF") - ->setCheckState(rbf ? Qt::Checked : Qt::Unchecked); Txid txid; btcsignals::scoped_connection c(wallet.NotifyTransactionChanged.connect([&txid](const Txid& hash, ChangeType status) { if (status == CT_NEW) txid = hash; @@ -283,8 +279,8 @@ void TestGUI(interfaces::Node& node, const std::shared_ptr& wallet) // Send two transactions, and verify they are added to transaction list. TransactionTableModel* transactionTableModel = walletModel.getTransactionTableModel(); QCOMPARE(transactionTableModel->rowCount({}), 105); - Txid txid1 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, /*rbf=*/false); - Txid txid2 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 10 * COIN, /*rbf=*/true); + Txid txid1 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN); + Txid txid2 = SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 10 * COIN); // Transaction table model updates on a QueuedConnection, so process events to ensure it's updated. qApp->processEvents(); QCOMPARE(transactionTableModel->rowCount({}), 107); @@ -424,7 +420,7 @@ void TestGUIWatchOnly(interfaces::Node& node, TestChain100Setup& test) timer.start(500); // Send tx and verify PSBT copied to the clipboard. - SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, /*rbf=*/false, QMessageBox::Save); + SendCoins(*wallet.get(), sendCoinsDialog, PKHash(), 5 * COIN, QMessageBox::Save); const std::string& psbt_string = QApplication::clipboard()->text().toStdString(); QVERIFY(!psbt_string.empty()); diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 67a420f5ce0..a9142b930d5 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -464,7 +464,6 @@ WalletModel::UnlockContext::~UnlockContext() bool WalletModel::bumpFee(Txid hash, Txid& new_hash) { CCoinControl coin_control; - coin_control.m_signal_bip125_rbf = true; std::vector errors; CAmount old_fee; CAmount new_fee;