From 2a33f5b322bcdca9edbe552a142e2d6b49a7a702 Mon Sep 17 00:00:00 2001 From: David Burkett Date: Sun, 30 Jan 2022 21:52:17 -0500 Subject: [PATCH] MWEB: UI: Don't allow sending to MWEB addresses until after activation. --- src/interfaces/node.cpp | 1 + src/interfaces/node.h | 3 +++ src/qt/guiutil.cpp | 10 ++++++++++ src/qt/guiutil.h | 3 +++ src/qt/sendcoinsdialog.cpp | 4 ++++ src/qt/sendcoinsentry.cpp | 11 +++++++++++ src/validation.cpp | 5 +++++ src/validation.h | 3 +++ 8 files changed, 40 insertions(+) diff --git a/src/interfaces/node.cpp b/src/interfaces/node.cpp index 0de641656..abc29ce16 100644 --- a/src/interfaces/node.cpp +++ b/src/interfaces/node.cpp @@ -196,6 +196,7 @@ public: return GuessVerificationProgress(Params().TxData(), tip); } bool isInitialBlockDownload() override { return ::ChainstateActive().IsInitialBlockDownload(); } + bool isMWEBActive() override { return ::ChainstateActive().IsMWEBActive(); } bool getReindex() override { return ::fReindex; } bool getImporting() override { return ::fImporting; } void setNetworkActive(bool active) override diff --git a/src/interfaces/node.h b/src/interfaces/node.h index e34b2fa26..a2fff39dd 100644 --- a/src/interfaces/node.h +++ b/src/interfaces/node.h @@ -139,6 +139,9 @@ public: //! Is initial block download. virtual bool isInitialBlockDownload() = 0; + //! Is MWEB activated. + virtual bool isMWEBActive() = 0; + //! Get reindex. virtual bool getReindex() = 0; diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 12b02d3d3..cc8b19547 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -212,6 +212,16 @@ bool isDust(interfaces::Node& node, const QString& address, const CAmount& amoun return IsDust(txOut, node.getDustRelayFee()); } +bool isMWEBAddressBeforeActivated(interfaces::Node& node, const QString& address) +{ + CTxDestination dest = DecodeDestination(address.toStdString()); + if (dest.type() == typeid(StealthAddress)) { + return !node.isMWEBActive(); + } + + return false; +} + QString HtmlEscape(const QString& str, bool fMultiLine) { QString escaped = str.toHtmlEscaped(); diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h index 2bd94b5eb..ad17d0c60 100644 --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -61,6 +61,9 @@ namespace GUIUtil // Returns true if given address+amount meets "dust" definition bool isDust(interfaces::Node& node, const QString& address, const CAmount& amount); + // Returns true if address is of type StealthAddress and MWEB has not yet been activated. + bool isMWEBAddressBeforeActivated(interfaces::Node& node, const QString& address); + // HTML escaping for rich text controls QString HtmlEscape(const QString& str, bool fMultiLine=false); QString HtmlEscape(const std::string& str, bool fMultiLine=false); diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp index 2e61242bc..f72d9f56f 100644 --- a/src/qt/sendcoinsdialog.cpp +++ b/src/qt/sendcoinsdialog.cpp @@ -175,6 +175,10 @@ void SendCoinsDialog::setModel(WalletModel *_model) connect(_model->getOptionsModel(), &OptionsModel::mwebFeaturesChanged, this, &SendCoinsDialog::mwebFeatureChanged); ui->frameMWEBFeatures->setVisible(_model->getOptionsModel()->getMWEBFeatures()); + bool mweb_active = model->node().isMWEBActive(); + ui->pushButtonMWEBPegIn->setEnabled(mweb_active); + ui->pushButtonMWEBPegIn->setToolTip(mweb_active ? "" : "Pegin is not available until MWEB activation"); + // fee section for (const int n : confTargets) { ui->confTargetSelector->addItem(tr("%1 (%2 blocks)").arg(GUIUtil::formatNiceTimeOffset(n*Params().GetConsensus().nPowTargetSpacing)).arg(n)); diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp index dfee7c5c7..955420fbf 100644 --- a/src/qt/sendcoinsentry.cpp +++ b/src/qt/sendcoinsentry.cpp @@ -167,6 +167,17 @@ bool SendCoinsEntry::validate(interfaces::Node& node) retval = false; } + if (retval && GUIUtil::isMWEBAddressBeforeActivated(node, ui->payTo->text())) { + ui->payTo->setValid(false); + retval = false; + + QMessageBox msgBox; + msgBox.setInformativeText("You cannot send to an MWEB address until after the feature has been activated."); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + msgBox.exec(); + } + return retval; } diff --git a/src/validation.cpp b/src/validation.cpp index 4009043c9..0a578fca8 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1353,6 +1353,11 @@ bool CChainState::IsInitialBlockDownload() const return false; } +bool CChainState::IsMWEBActive() const +{ + return m_chain.Tip() != nullptr && IsMWEBEnabled(m_chain.Tip(), Params().GetConsensus()); +} + static CBlockIndex *pindexBestForkTip = nullptr, *pindexBestForkBase = nullptr; static void AlertNotify(const std::string& strMessage) diff --git a/src/validation.h b/src/validation.h index 1d1d62cdb..3935f7b87 100644 --- a/src/validation.h +++ b/src/validation.h @@ -695,6 +695,9 @@ public: /** Check whether we are doing an initial block download (synchronizing from disk or network) */ bool IsInitialBlockDownload() const; + /** Check whether MWEB has been activated */ + bool IsMWEBActive() const; + /** * Make various assertions about the state of the block index. *