Browse Source

Merge #11991: [qt] Receive: checkbox for bech32 address

63ac8907c [qt] receive tab: bech32 address opt-in checkbox (Sjors Provoost)

Pull request description:

  <img width="647" alt="schermafbeelding 2018-01-12 om 18 34 48" src="https://user-images.githubusercontent.com/10217/34887691-a6a796fe-f7c7-11e7-8b89-87ce07c61ce3.png">

  Checkbox does what you would expect. Press tab from the amount field to get there.

  It's unchecked by default.

  When launched with `-addresstype=bech32` it's checked by default. When launched with `-addresstype=legacy` it unchecked and disabled.

  The change in `receivecoinsdialog.ui` is smaller than it looks, due to the way git handles XML diffs. I had to add a horizontal spacer to make it look decent, see https://github.com/bitcoin/bitcoin/issues/11950#issuecomment-352870909. This causes column numbers to change in the rest of the grid.

  I recommend testing on at least one other OS than OSX to be on the safe side.

Tree-SHA512: ec4b733b796d9a94278a5d8040a69d9574ef50021e68f94f61f2da75d1bb57f39272cbc9f1f7d34f733a19640daf666a23844fcd132f83bfdaf327d9d1d6f105
0.16
Jonas Schnelli 7 years ago
parent
commit
062c8b69f4
No known key found for this signature in database
GPG Key ID: 1EB776BB03C7922D
  1. 6
      src/qt/addresstablemodel.cpp
  2. 4
      src/qt/addresstablemodel.h
  3. 5
      src/qt/editaddressdialog.cpp
  4. 121
      src/qt/forms/receivecoinsdialog.ui
  5. 17
      src/qt/receivecoinsdialog.cpp
  6. 5
      src/qt/walletmodel.cpp
  7. 4
      src/qt/walletmodel.h
  8. 2
      src/wallet/wallet.h

6
src/qt/addresstablemodel.cpp

@ -341,7 +341,7 @@ void AddressTableModel::updateEntry(const QString &address,
priv->updateEntry(address, label, isMine, purpose, status); priv->updateEntry(address, label, isMine, purpose, status);
} }
QString AddressTableModel::addRow(const QString &type, const QString &label, const QString &address) QString AddressTableModel::addRow(const QString &type, const QString &label, const QString &address, const OutputType address_type)
{ {
std::string strLabel = label.toStdString(); std::string strLabel = label.toStdString();
std::string strAddress = address.toStdString(); std::string strAddress = address.toStdString();
@ -384,8 +384,8 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
return QString(); return QString();
} }
} }
wallet->LearnRelatedScripts(newKey, g_address_type); wallet->LearnRelatedScripts(newKey, address_type);
strAddress = EncodeDestination(GetDestinationForKey(newKey, g_address_type)); strAddress = EncodeDestination(GetDestinationForKey(newKey, address_type));
} }
else else
{ {

4
src/qt/addresstablemodel.h

@ -8,6 +8,8 @@
#include <QAbstractTableModel> #include <QAbstractTableModel>
#include <QStringList> #include <QStringList>
enum OutputType : int;
class AddressTablePriv; class AddressTablePriv;
class WalletModel; class WalletModel;
@ -61,7 +63,7 @@ public:
/* Add an address to the model. /* Add an address to the model.
Returns the added address on success, and an empty string otherwise. Returns the added address on success, and an empty string otherwise.
*/ */
QString addRow(const QString &type, const QString &label, const QString &address); QString addRow(const QString &type, const QString &label, const QString &address, const OutputType address_type);
/* Look up label for address in address book, if not found return empty string. /* Look up label for address in address book, if not found return empty string.
*/ */

5
src/qt/editaddressdialog.cpp

@ -11,6 +11,8 @@
#include <QDataWidgetMapper> #include <QDataWidgetMapper>
#include <QMessageBox> #include <QMessageBox>
extern OutputType g_address_type;
EditAddressDialog::EditAddressDialog(Mode _mode, QWidget *parent) : EditAddressDialog::EditAddressDialog(Mode _mode, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::EditAddressDialog), ui(new Ui::EditAddressDialog),
@ -77,7 +79,8 @@ bool EditAddressDialog::saveCurrentRow()
address = model->addRow( address = model->addRow(
mode == NewSendingAddress ? AddressTableModel::Send : AddressTableModel::Receive, mode == NewSendingAddress ? AddressTableModel::Send : AddressTableModel::Receive,
ui->labelEdit->text(), ui->labelEdit->text(),
ui->addressEdit->text()); ui->addressEdit->text(),
g_address_type);
break; break;
case EditReceivingAddress: case EditReceivingAddress:
case EditSendingAddress: case EditSendingAddress:

121
src/qt/forms/receivecoinsdialog.ui

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>776</width> <width>776</width>
<height>364</height> <height>396</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1"> <layout class="QVBoxLayout" name="verticalLayout" stretch="0,0,1">
@ -28,6 +28,22 @@
<layout class="QVBoxLayout" name="verticalLayout_3"> <layout class="QVBoxLayout" name="verticalLayout_3">
<item> <item>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>An optional amount to request. Leave this empty or zero to not request a specific amount.</string>
</property>
<property name="text">
<string>&amp;Amount:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>reqAmount</cstring>
</property>
</widget>
</item>
<item row="6" column="0"> <item row="6" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="toolTip"> <property name="toolTip">
@ -51,13 +67,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="2">
<widget class="QLineEdit" name="reqMessage">
<property name="toolTip">
<string>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</string>
</property>
</widget>
</item>
<item row="2" column="2"> <item row="2" column="2">
<widget class="QLabel" name="label_5"> <widget class="QLabel" name="label_5">
<property name="text"> <property name="text">
@ -81,32 +90,10 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="6" column="2">
<widget class="QLabel" name="label"> <widget class="QLineEdit" name="reqMessage">
<property name="toolTip">
<string>An optional amount to request. Leave this empty or zero to not request a specific amount.</string>
</property>
<property name="text">
<string>&amp;Amount:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>reqAmount</cstring>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="BitcoinAmountField" name="reqAmount">
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="toolTip"> <property name="toolTip">
<string>An optional amount to request. Leave this empty or zero to not request a specific amount.</string> <string>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -174,6 +161,73 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="2">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="BitcoinAmountField" name="reqAmount">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>1000</width>
<height>100</height>
</size>
</property>
<property name="toolTip">
<string>An optional amount to request. Leave this empty or zero to not request a specific amount.</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="useBech32">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>1000</width>
<height>16777215</height>
</size>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="toolTip">
<string>Bech32 addresses (BIP-173) are cheaper to spend from and offer better protection against typos. When unchecked a P2SH wrapped SegWit address will be created, compatible with older wallets.</string>
</property>
<property name="text">
<string>Generate Bech32 address</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout> </layout>
</item> </item>
</layout> </layout>
@ -306,6 +360,7 @@
<tabstops> <tabstops>
<tabstop>reqLabel</tabstop> <tabstop>reqLabel</tabstop>
<tabstop>reqAmount</tabstop> <tabstop>reqAmount</tabstop>
<tabstop>useBech32</tabstop>
<tabstop>reqMessage</tabstop> <tabstop>reqMessage</tabstop>
<tabstop>receiveButton</tabstop> <tabstop>receiveButton</tabstop>
<tabstop>clearButton</tabstop> <tabstop>clearButton</tabstop>

17
src/qt/receivecoinsdialog.cpp

@ -2,6 +2,8 @@
// Distributed under the MIT software license, see the accompanying // Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php. // file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <wallet/wallet.h>
#include <qt/receivecoinsdialog.h> #include <qt/receivecoinsdialog.h>
#include <qt/forms/ui_receivecoinsdialog.h> #include <qt/forms/ui_receivecoinsdialog.h>
@ -41,6 +43,15 @@ ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *_platformStyle, QWid
ui->removeRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove")); ui->removeRequestButton->setIcon(_platformStyle->SingleColorIcon(":/icons/remove"));
} }
// configure bech32 checkbox, disable if launched with legacy as default:
if (model->getDefaultAddressType() == OUTPUT_TYPE_BECH32) {
ui->useBech32->setCheckState(Qt::Checked);
} else {
ui->useBech32->setCheckState(Qt::Unchecked);
}
ui->useBech32->setVisible(model->getDefaultAddressType() != OUTPUT_TYPE_LEGACY);
// context menu actions // context menu actions
QAction *copyURIAction = new QAction(tr("Copy URI"), this); QAction *copyURIAction = new QAction(tr("Copy URI"), this);
QAction *copyLabelAction = new QAction(tr("Copy label"), this); QAction *copyLabelAction = new QAction(tr("Copy label"), this);
@ -133,7 +144,11 @@ void ReceiveCoinsDialog::on_receiveButton_clicked()
QString address; QString address;
QString label = ui->reqLabel->text(); QString label = ui->reqLabel->text();
/* Generate new receiving address */ /* Generate new receiving address */
address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, ""); OutputType address_type = model->getDefaultAddressType();
if (address_type != OUTPUT_TYPE_LEGACY) {
address_type = ui->useBech32->isChecked() ? OUTPUT_TYPE_BECH32 : OUTPUT_TYPE_P2SH_SEGWIT;
}
address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, "", address_type);
SendCoinsRecipient info(address, label, SendCoinsRecipient info(address, label,
ui->reqAmount->value(), ui->reqMessage->text()); ui->reqAmount->value(), ui->reqMessage->text());
ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this); ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this);

5
src/qt/walletmodel.cpp

@ -733,6 +733,11 @@ bool WalletModel::hdEnabled() const
return wallet->IsHDEnabled(); return wallet->IsHDEnabled();
} }
OutputType WalletModel::getDefaultAddressType() const
{
return g_address_type;
}
int WalletModel::getDefaultConfirmTarget() const int WalletModel::getDefaultConfirmTarget() const
{ {
return nTxConfirmTarget; return nTxConfirmTarget;

4
src/qt/walletmodel.h

@ -15,6 +15,8 @@
#include <QObject> #include <QObject>
enum OutputType : int;
class AddressTableModel; class AddressTableModel;
class OptionsModel; class OptionsModel;
class PlatformStyle; class PlatformStyle;
@ -214,6 +216,8 @@ public:
bool hdEnabled() const; bool hdEnabled() const;
OutputType getDefaultAddressType() const;
int getDefaultConfirmTarget() const; int getDefaultConfirmTarget() const;
private: private:

2
src/wallet/wallet.h

@ -99,7 +99,7 @@ enum WalletFeature
FEATURE_LATEST = FEATURE_COMPRPUBKEY // HD is optional, use FEATURE_COMPRPUBKEY as latest version FEATURE_LATEST = FEATURE_COMPRPUBKEY // HD is optional, use FEATURE_COMPRPUBKEY as latest version
}; };
enum OutputType enum OutputType : int
{ {
OUTPUT_TYPE_NONE, OUTPUT_TYPE_NONE,
OUTPUT_TYPE_LEGACY, OUTPUT_TYPE_LEGACY,

Loading…
Cancel
Save