changeset 26980:bac4978c7092

Merge #9592: [Qt] Add checkbox in the GUI to opt-in to RBF when creating a transaction c4e4792 [Qt] Change RBF checkbox to reflect -walletrbf setting (Russell Yanofsky) 838a58e [Qt] Add simple optin-RBF checkbox and confirmation info (Jonas Schnelli) 568c05a Allow to opt-into RBF when creating a transaction (Jonas Schnelli) Tree-SHA512: 3d52dcd4e44da8aed4d631748074afef78d38c860f2a8b95323f4801a989d6599a3498a753fc10daba4098c527ef5a0eb942e5b3f1bfd656e1a6bd272b8e6c57
author Jonas Schnelli <dev@jonasschnelli.ch>
date Fri, 17 Mar 2017 15:31:21 +0100
parents 4762c83728e8 64ae7d7740bd
children 9d8c73415792
files src/qt/forms/sendcoinsdialog.ui src/qt/sendcoinsdialog.cpp src/qt/walletmodel.cpp src/wallet/wallet.cpp
diffstat 6 files changed, 35 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/qt/forms/sendcoinsdialog.ui	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/qt/forms/sendcoinsdialog.ui	Fri Mar 17 15:31:21 2017 +0100
@@ -1180,6 +1180,16 @@
              </item>
             </layout>
            </item>
+           <item>
+            <widget class="QCheckBox" name="optInRBF">
+             <property name="text">
+              <string>Request Replace-By-Fee</string>
+             </property>
+             <property name="toolTip">
+              <string>Indicates that the sender may wish to replace this transaction with a new one paying higher fees (prior to being confirmed).</string>
+             </property>
+            </widget>
+           </item>
           </layout>
          </widget>
         </item>
@@ -1190,8 +1200,8 @@
           </property>
           <property name="sizeHint" stdset="0">
            <size>
-            <width>800</width>
-            <height>1</height>
+            <width>40</width>
+            <height>5</height>
            </size>
           </property>
          </spacer>
--- a/src/qt/sendcoinsdialog.cpp	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/qt/sendcoinsdialog.cpp	Fri Mar 17 15:31:21 2017 +0100
@@ -114,6 +114,7 @@
     ui->groupCustomFee->button((int)std::max(0, std::min(1, settings.value("nCustomFeeRadio").toInt())))->setChecked(true);
     ui->customFee->setValue(settings.value("nTransactionFee").toLongLong());
     ui->checkBoxMinimumFee->setChecked(settings.value("fPayOnlyMinFee").toBool());
+    ui->optInRBF->setCheckState(model->getDefaultWalletRbf() ? Qt::Checked : Qt::Unchecked);
     minimizeFeeSection(settings.value("fFeeSectionMinimized").toBool());
 }
 
@@ -247,6 +248,8 @@
     else
         ctrl.nConfirmTarget = 0;
 
+    ctrl.signalRbf = ui->optInRBF->isChecked();
+
     prepareStatus = model->prepareTransaction(currentTransaction, &ctrl);
 
     // process prepareStatus and on error generate message shown to user
@@ -326,6 +329,13 @@
     questionString.append(QString("<span style='font-size:10pt;font-weight:normal;'><br />(=%2)</span>")
         .arg(alternativeUnits.join(" " + tr("or") + "<br />")));
 
+    if (ui->optInRBF->isChecked())
+    {
+        questionString.append("<hr /><span>");
+        questionString.append(tr("This transaction signals replaceability (optin-RBF)."));
+        questionString.append("</span>");
+    }
+
     SendConfirmationDialog confirmationDialog(tr("Confirm send coins"),
         questionString.arg(formatted.join("<br />")), SEND_CONFIRM_DELAY, this);
     confirmationDialog.exec();
--- a/src/qt/walletmodel.cpp	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/qt/walletmodel.cpp	Fri Mar 17 15:31:21 2017 +0100
@@ -706,3 +706,8 @@
 {
     return nTxConfirmTarget;
 }
+
+bool WalletModel::getDefaultWalletRbf() const
+{
+    return fWalletRbf;
+}
--- a/src/qt/walletmodel.h	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/qt/walletmodel.h	Fri Mar 17 15:31:21 2017 +0100
@@ -213,6 +213,8 @@
 
     int getDefaultConfirmTarget() const;
 
+    bool getDefaultWalletRbf() const;
+
 private:
     CWallet *wallet;
     bool fHaveWatchOnly;
--- a/src/wallet/coincontrol.h	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/wallet/coincontrol.h	Fri Mar 17 15:31:21 2017 +0100
@@ -6,6 +6,7 @@
 #define BITCOIN_WALLET_COINCONTROL_H
 
 #include "primitives/transaction.h"
+#include "wallet/wallet.h"
 
 /** Coin Control Features. */
 class CCoinControl
@@ -24,6 +25,8 @@
     CFeeRate nFeeRate;
     //! Override the default confirmation target, 0 = use default
     int nConfirmTarget;
+    //! Signal BIP-125 replace by fee.
+    bool signalRbf;
 
     CCoinControl()
     {
@@ -40,6 +43,7 @@
         nFeeRate = CFeeRate(0);
         fOverrideFeeRate = false;
         nConfirmTarget = 0;
+        signalRbf = fWalletRbf;
     }
 
     bool HasSelected() const
--- a/src/wallet/wallet.cpp	Fri Mar 17 14:44:29 2017 +0100
+++ b/src/wallet/wallet.cpp	Fri Mar 17 15:31:21 2017 +0100
@@ -2517,9 +2517,10 @@
                 // to avoid conflicting with other possible uses of nSequence,
                 // and in the spirit of "smallest possible change from prior
                 // behavior."
+                bool rbf = coinControl ? coinControl->signalRbf : fWalletRbf;
                 for (const auto& coin : setCoins)
                     txNew.vin.push_back(CTxIn(coin.first->GetHash(),coin.second,CScript(),
-                                              std::numeric_limits<unsigned int>::max() - (fWalletRbf ? 2 : 1)));
+                                              std::numeric_limits<unsigned int>::max() - (rbf ? 2 : 1)));
 
                 // Fill in dummy signatures for fee calculation.
                 if (!DummySignTx(txNew, setCoins)) {