diff options
author | MarcoFalke <falke.marco@gmail.com> | 2021-12-22 12:09:14 +0100 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2021-12-22 12:09:19 +0100 |
commit | 63b5dfac21613b984803347bfe81454da667016e (patch) | |
tree | 217d180d81c08709d2c7a890680a096016e219a6 | |
parent | 887796a5ffcbafcd281b920f8d55fcb6e8347584 (diff) | |
parent | c9a77e227eecf357c7dd550efb8c1827bb99a5de (diff) |
Merge bitcoin-core/gui#459: Address type dropdown, add Taproot (Receive tab)
c9a77e227eecf357c7dd550efb8c1827bb99a5de gui: address type dropdown, add bech32m (Sjors Provoost)
56113daef4830cad1af3c00f6b3c447c9e2a8e05 wallet: add taprootEnabled() to interface (Sjors Provoost)
Pull request description:
This PR replaces the Bech32 checkbox with an address type dropdown It "Use Taproot" checkbox to the receive screen for any wallet with a Taproot descriptor. The Bech32m option is hidden for wallets that don't have taproot descriptors.
Bech32 is kept as the default even for Taproot enabled wallets until it's more widely supported.
(an earlier attempt of this PR added a second checkbox)
<img width="469" alt="Schermafbeelding 2021-12-21 om 11 44 05" src="https://user-images.githubusercontent.com/10217/146872660-339fae1f-c0b8-4673-b8be-33c25f3933fd.png">
**Suggested testing**
* notice that the Bech32m entry only appears for wallet with a taproot descriptor
* verify that it generates a bc1p instead of bc1q address
1. Legacy wallet
2. Default descriptor wallet (current does not have taproot descriptor)
3. Wallet with taproot descriptor:
* just create a new descriptor wallet
Replaces https://github.com/bitcoin/bitcoin/pull/22260
ACKs for top commit:
Rspigler:
tACK c9a77e227eecf357c7dd550efb8c1827bb99a5de. I like the changes made now, thanks!
kristapsk:
re-ACK c9a77e227eecf357c7dd550efb8c1827bb99a5de
Tree-SHA512: bae66ac90ed55372e6c94878db0e37d32b7b5c24ed00c0f2ebb10fd127dddce3a061162df915d67e92d7b35b3da093137db17b73931a0ae1a470fff20be1f30b
-rw-r--r-- | doc/release-notes-gui-459.md | 4 | ||||
-rw-r--r-- | src/interfaces/wallet.h | 3 | ||||
-rw-r--r-- | src/qt/forms/receivecoinsdialog.ui | 10 | ||||
-rw-r--r-- | src/qt/receivecoinsdialog.cpp | 26 | ||||
-rw-r--r-- | src/wallet/interfaces.cpp | 5 |
5 files changed, 27 insertions, 21 deletions
diff --git a/doc/release-notes-gui-459.md b/doc/release-notes-gui-459.md new file mode 100644 index 0000000000..b590ac5d45 --- /dev/null +++ b/doc/release-notes-gui-459.md @@ -0,0 +1,4 @@ +GUI changes +----------- + +- The Bech32 checkbox has been replaced with a dropdown for all address types, including the new Bech32m (BIP-350) standard for Taproot enabled wallets. diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index 4213a22749..77e15fc097 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -256,6 +256,9 @@ public: // Return whether private keys enabled. virtual bool privateKeysDisabled() = 0; + // Return whether the wallet contains a Taproot scriptPubKeyMan + virtual bool taprootEnabled() = 0; + // Return whether wallet uses an external signer. virtual bool hasExternalSigner() = 0; diff --git a/src/qt/forms/receivecoinsdialog.ui b/src/qt/forms/receivecoinsdialog.ui index 06d39426c9..4b2c3ed434 100644 --- a/src/qt/forms/receivecoinsdialog.ui +++ b/src/qt/forms/receivecoinsdialog.ui @@ -195,7 +195,7 @@ </widget> </item> <item> - <widget class="QCheckBox" name="useBech32"> + <widget class="QComboBox" name="addressType"> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> <horstretch>0</horstretch> @@ -211,12 +211,6 @@ <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> - <property name="toolTip"> - <string>Native segwit addresses (aka Bech32 or BIP-173) reduce your transaction fees later on and offer better protection against typos, but old wallets don't support them. When unchecked, an address compatible with older wallets will be created instead.</string> - </property> - <property name="text"> - <string>Generate native segwit (Bech32) address</string> - </property> </widget> </item> <item> @@ -366,7 +360,7 @@ <tabstops> <tabstop>reqLabel</tabstop> <tabstop>reqAmount</tabstop> - <tabstop>useBech32</tabstop> + <tabstop>addressType</tabstop> <tabstop>reqMessage</tabstop> <tabstop>receiveButton</tabstop> <tabstop>clearButton</tabstop> diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp index d47ee95826..0d859a8253 100644 --- a/src/qt/receivecoinsdialog.cpp +++ b/src/qt/receivecoinsdialog.cpp @@ -87,10 +87,18 @@ void ReceiveCoinsDialog::setModel(WalletModel *_model) &QItemSelectionModel::selectionChanged, this, &ReceiveCoinsDialog::recentRequestsView_selectionChanged); - if (model->wallet().getDefaultAddressType() == OutputType::BECH32) { - ui->useBech32->setCheckState(Qt::Checked); - } else { - ui->useBech32->setCheckState(Qt::Unchecked); + // Populate address type dropdown and select default + auto add_address_type = [&](OutputType type, const QString& text, const QString& tooltip) { + const auto index = ui->addressType->count(); + ui->addressType->addItem(text, (int) type); + ui->addressType->setItemData(index, tooltip, Qt::ToolTipRole); + if (model->wallet().getDefaultAddressType() == type) ui->addressType->setCurrentIndex(index); + }; + add_address_type(OutputType::LEGACY, "Base58 (Legacy)", "Not recommended due to higher fees and less protection against typos."); + add_address_type(OutputType::P2SH_SEGWIT, "Base58 (P2SH-SegWit)", "Generates an address compatible with older wallets."); + add_address_type(OutputType::BECH32, "Bech32 (SegWit)", "Generates a native segwit address (BIP-173). Some old wallets don't support it."); + if (model->wallet().taprootEnabled()) { + add_address_type(OutputType::BECH32M, "Bech32m (Taproot)", "Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited."); } // Set the button to be enabled or disabled based on whether the wallet can give out new addresses. @@ -144,15 +152,7 @@ void ReceiveCoinsDialog::on_receiveButton_clicked() QString address; QString label = ui->reqLabel->text(); /* Generate new receiving address */ - OutputType address_type; - if (ui->useBech32->isChecked()) { - address_type = OutputType::BECH32; - } else { - address_type = model->wallet().getDefaultAddressType(); - if (address_type == OutputType::BECH32) { - address_type = OutputType::P2SH_SEGWIT; - } - } + const OutputType address_type = (OutputType)ui->addressType->currentData().toInt(); address = model->getAddressTableModel()->addRow(AddressTableModel::Receive, label, "", address_type); switch(model->getAddressTableModel()->getEditStatus()) diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp index bba909b807..04501ea5a2 100644 --- a/src/wallet/interfaces.cpp +++ b/src/wallet/interfaces.cpp @@ -461,6 +461,11 @@ public: bool canGetAddresses() override { return m_wallet->CanGetAddresses(); } bool hasExternalSigner() override { return m_wallet->IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER); } bool privateKeysDisabled() override { return m_wallet->IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); } + bool taprootEnabled() override { + if (m_wallet->IsLegacy()) return false; + auto spk_man = m_wallet->GetScriptPubKeyMan(OutputType::BECH32M, /*internal=*/false); + return spk_man != nullptr; + } OutputType getDefaultAddressType() override { return m_wallet->m_default_address_type; } CAmount getDefaultMaxTxFee() override { return m_wallet->m_default_max_tx_fee; } void remove() override |