[Qt] Add checkbox in the GUI to opt-in to RBF when creating a transaction#9592
[Qt] Add checkbox in the GUI to opt-in to RBF when creating a transaction#9592jonasschnelli merged 3 commits intobitcoin:masterfrom
Conversation
jonasschnelli
left a comment
There was a problem hiding this comment.
utACK 054264a modulo send-dialog-confirmation text overhaul.
src/qt/sendcoinsdialog.cpp
Outdated
| if (ui->optInRBF->isChecked()) | ||
| { | ||
| questionString.append("<hr /><span style='color:#aa0000;'>"); | ||
| questionString.append(tr("This transaction is replacable (optin-RBF)!")); |
There was a problem hiding this comment.
For clarity, we should probably use This transactions signals replaceability (optin-RBF)
There was a problem hiding this comment.
This red warning with exclamation point is overly alarming. It almost implies it's dangerous to you that its replaceable. Transactions you send that are replaceable are not something to be warned about. Worst case someone doesn't accept them, and you can replace it.
There was a problem hiding this comment.
I'm not sure we need to specially say anything here, but something more like "This transaction may be replaced." sounds nicer.
There was a problem hiding this comment.
Fixed spelling of replaceable, removed exclamation point and red highlight in 8924813.
src/qt/sendcoinsdialog.cpp
Outdated
| 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(fWalletRbf ? Qt::Checked : Qt::Unchecked); |
There was a problem hiding this comment.
nit: we should probably access fWalletRbf over WalletModel (not directly over the global space).
|
concept ACK |
src/qt/forms/sendcoinsdialog.ui
Outdated
| </item> | ||
| <item> | ||
| <widget class="QCheckBox" name="optInRBF"> | ||
| <property name="text"> |
src/qt/forms/sendcoinsdialog.ui
Outdated
| <property name="text"> | ||
| <string>Allow Replace-By-Fee</string> | ||
| </property> | ||
| <property name="toolTip"> |
There was a problem hiding this comment.
"Indicates that the sender may wish to replace this transaction with a new one paying higher fees (prior to being confirmed)."
src/qt/sendcoinsdialog.cpp
Outdated
| if (ui->optInRBF->isChecked()) | ||
| { | ||
| questionString.append("<hr /><span style='color:#aa0000;'>"); | ||
| questionString.append(tr("This transaction is replacable (optin-RBF)!")); |
There was a problem hiding this comment.
I'm not sure we need to specially say anything here, but something more like "This transaction may be replaced." sounds nicer.
src/qt/walletmodel.h
Outdated
|
|
||
| // prepare transaction for getting txfee before sending coins | ||
| SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl = NULL); | ||
| SendCoinsReturn prepareTransaction(WalletModelTransaction &transaction, const CCoinControl *coinControl = NULL, bool optInRBF = false); |
There was a problem hiding this comment.
This changes the default behaviour. Presently, it uses fWalletRbf, but now it will become !RBF always.
Is there a reason not to pass this through CCoinControl?
src/wallet/wallet.cpp
Outdated
| // to avoid conflicting with other possible uses of nSequence, | ||
| // and in the spirit of "smallest posible change from prior | ||
| // behavior." | ||
| bool rbf = (flags & CREATE_TX_ENABLE_RBF || ::fWalletRbf) && !(flags & CREATE_TX_DISABLE_RBF); |
There was a problem hiding this comment.
This would be more readable as:
bool rbf = ::fWalletRbf;
if (flags & CREATE_TX_ENABLE_RBF) {
rbf = true;
} else if (flags & CREATE_TX_DISABLE_RBF) {
rbf = false;
}There was a problem hiding this comment.
Simplified with switch to coincontrol in 74a594d.
src/wallet/wallet.h
Outdated
|
|
||
| enum CreateTransactionFlags { | ||
| CREATE_TX_DEFAULT = 0, | ||
| CREATE_TX_DONT_SIGN = (1U << 0), |
There was a problem hiding this comment.
Please invert this. Not only is it unintuitive to have it backward, it also contradicts the current function signature (that is, passing true or false will silently get the opposite behaviour).
CREATE_TX_DEFAULT = 1,
CREATE_TX_SIGN = 1,There was a problem hiding this comment.
Reverted for switch to coin control in 2fce406.
|
Concept ACK |
Add signalRbf option to CCoinControl as suggested by Luke Dashjr <[email protected]> in bitcoin#9592 (comment)
Set signalRbf via CCoinControl as suggested by Luke Dashjr <[email protected]> in bitcoin#9592 (comment)
s/Allow/Request/ as suggested by Luke Dashjr <[email protected]> in bitcoin#9592 (comment)
Change RBF tooltip as suggested by Luke Dashjr <[email protected]> in bitcoin#9592 (comment)
Update RBF status line with comments in bitcoin#9592 (comment)
Access fWalletRbf global through WalletModel as suggested by Jonas Schnelli <[email protected]> in bitcoin#9592 (comment)
src/qt/sendcoinsdialog.cpp
Outdated
| if (ui->optInRBF->isChecked()) | ||
| { | ||
| questionString.append("<hr /><span>"); | ||
| questionString.append(tr("This transaction is replaceable (optin-RBF).")); |
There was a problem hiding this comment.
What about using This transaction signals replaceability?
|
Tested ACK 92b9ff6. With a German UI, the text can look a bit strange (see screenshot). Screenshots: Possible follow-up work: |
|
I'm wondering whether it would make more sense to put the RBF checkbox next to the fee options instead. That would definitely avoid the layout issue with "verbose" languages like German or Spanish. Think about it. We all know that RBF allows replacing transaction A with transaction B as long as A has no confirmations yet and B includes a higher fee. Nevertheless, as far as I know, the intended use case for RBF in Core is only to allow the user to increase the fee afterwards from the transactions history view by right-clicking, pressing "Increase fee..." and selecting a higher fee. My point is that the user will not perceive the transaction being replaced but rather being "upgraded". That's why I believe that from an UX point of view, RBF is more related to fees than to a transaction as a whole, and therefore putting the checkbox in the fees frame makes much more sense to me. |
|
I think @aesedepece made a good point. Moving it into the fee section makes sense. |
Move RBF checkbox to fee section as suggested in bitcoin#9592 (comment) and bitcoin#9592 (comment)
Change RBF status line as suggested in bitcoin#9592 (comment) and bitcoin#9592 (comment)
src/qt/sendcoinsdialog.cpp
Outdated
| if (ui->optInRBF->isChecked()) | ||
| { | ||
| questionString.append("<hr /><span>"); | ||
| questionString.append(tr("This transaction is replaceable (optin-RBF).")); |
|
Now the labels misses some bottom margin. This should fix it: diff --git a/src/qt/forms/sendcoinsdialog.ui b/src/qt/forms/sendcoinsdialog.ui
index a633478..e25fe05 100644
--- a/src/qt/forms/sendcoinsdialog.ui
+++ b/src/qt/forms/sendcoinsdialog.ui
@@ -1178,8 +1178,8 @@
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>800</width>
- <height>1</height>
+ <width>40</width>
+ <height>5</height>
</size>
</property>
</spacer> |
Increase spacing below RBF checkbox as suggested bitcoin#9592 (comment)
Before this commit, the checkbox would always start off unchecked. After this commit it will respect the -walletrbf setting (which is currently false by default).
jonasschnelli
left a comment
There was a problem hiding this comment.
(again) Tested ACK c4e4792
| if (ui->optInRBF->isChecked()) | ||
| { | ||
| questionString.append("<hr /><span>"); | ||
| questionString.append(tr("This transaction signals replaceability (optin-RBF).")); |
There was a problem hiding this comment.
I still think this is likely to confuse users. Why must we say so here? (The alternative case seems much more of a liability...)
There was a problem hiding this comment.
@jonasschnelli or others, you should comment if you think the "This transaction signals replaceability" text is useful, otherwise I'm fine with removing it.
There was a problem hiding this comment.
I don't know whats best here.
Somehow I agree with @luke-jr that it would probably be better the label non-RBF transactions (something like "this transaction signals to be final"), but meh.
We also need to respect that RBF is deployed as a new feature and maybe users are expecting to see wether the new features is enabled or not.
So, no strong opinion. The PRs current solution seems acceptable to me.
|
This PR has several ACKs. Should it be merged? |
|
Probably needs a GUI way to actually use it first. |
|
Merging them at the same time seems logical. |
|
Adding 0.15 milestone |
|
Going to merge this (even without #9697). A) it can make sense without a Qt bumper (at least you can bump over the console) and B) I don't want to kick this back to a rebase phase. |
…ing 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




The first three commits come from @jonasschnelli's PR #8182