diff --git a/src/base58.h b/src/base58.h --- a/src/base58.h +++ b/src/base58.h @@ -156,6 +156,7 @@ CBitcoinExtPubKey; std::string EncodeLegacyAddr(const CTxDestination &dest, const CChainParams &); -CTxDestination DecodeLegacyAddr(const std::string &str, const CChainParams &); +CTxDestination DecodeLegacyAddr(const std::string &str, + const CChainParams ¶ms); #endif // BITCOIN_BASE58_H diff --git a/src/base58.cpp b/src/base58.cpp --- a/src/base58.cpp +++ b/src/base58.cpp @@ -236,8 +236,8 @@ std::string operator()(const CNoDestination &no) const { return ""; } }; -CTxDestination DecodeDestination(const std::string &str, - const CChainParams ¶ms) { +CTxDestination DecodeLegacyDestination(const std::string &str, + const CChainParams ¶ms) { std::vector data; uint160 hash; if (!DecodeBase58Check(str, data)) { @@ -300,5 +300,5 @@ CTxDestination DecodeLegacyAddr(const std::string &str, const CChainParams ¶ms) { - return DecodeDestination(str, params); + return DecodeLegacyDestination(str, params); } diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -106,7 +106,7 @@ #ifdef ENABLE_WALLET if (enableWallet) { /** Create wallet frame and make it the central widget */ - walletFrame = new WalletFrame(_platformStyle, config, this); + walletFrame = new WalletFrame(_platformStyle, this); setCentralWidget(walletFrame); } else #endif // ENABLE_WALLET diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h --- a/src/qt/guiutil.h +++ b/src/qt/guiutil.h @@ -50,9 +50,8 @@ // Generate an invalid, but convincing address. std::string DummyAddress(const CChainParams ¶ms); -// Convert an address into the user chosen format -QString convertToConfiguredAddressFormat(const Config &config, - const QString &addr); +// Convert any address into cashaddr +QString convertToCashAddr(const CChainParams ¶ms, const QString &addr); // Set up widgets for address and amounts void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent); @@ -66,7 +65,7 @@ SendCoinsRecipient *out); bool parseBitcoinURI(const QString &scheme, QString uri, SendCoinsRecipient *out); -QString formatBitcoinURI(const Config &config, const SendCoinsRecipient &info); +QString formatBitcoinURI(const SendCoinsRecipient &info); // Returns true if given address+amount meets "dust" definition bool isDust(interfaces::Node &node, const QString &address, const Amount amount, diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -127,17 +127,14 @@ // Addresses are stored in the database with the encoding that the client was // configured with at the time of creation. // -// This converts to clients current configuration. -QString convertToConfiguredAddressFormat(const Config &config, - const QString &addr) { - if (!IsValidDestinationString(addr.toStdString(), - config.GetChainParams())) { +// This converts to cashaddr. +QString convertToCashAddr(const CChainParams ¶ms, const QString &addr) { + if (!IsValidDestinationString(addr.toStdString(), params)) { // We have something sketchy as input. Do not try to convert. return addr; } - CTxDestination dst = - DecodeDestination(addr.toStdString(), config.GetChainParams()); - return QString::fromStdString(EncodeDestination(dst, config)); + CTxDestination dst = DecodeDestination(addr.toStdString(), params); + return QString::fromStdString(EncodeCashAddr(dst, params)); } void setupAddressWidget(QValidatedLineEdit *widget, QWidget *parent) { @@ -250,12 +247,8 @@ return parseBitcoinURI(scheme, uriInstance, out); } -QString formatBitcoinURI(const Config &config, const SendCoinsRecipient &info) { - QString ret = info.address; - if (!config.UseCashAddrEncoding()) { - // prefix address with uri scheme for base58 encoded addresses. - ret = (bitcoinURIScheme(config) + ":%1").arg(ret); - } +QString formatBitcoinURI(const SendCoinsRecipient &info) { + QString ret = convertToCashAddr(Params(), info.address); int paramCount = 0; if (info.amount != Amount::zero()) { diff --git a/src/qt/receivecoinsdialog.h b/src/qt/receivecoinsdialog.h --- a/src/qt/receivecoinsdialog.h +++ b/src/qt/receivecoinsdialog.h @@ -15,7 +15,6 @@ #include #include -class Config; class PlatformStyle; class WalletModel; @@ -40,7 +39,7 @@ }; explicit ReceiveCoinsDialog(const PlatformStyle *platformStyle, - const Config *configIn, QWidget *parent = 0); + QWidget *parent = 0); ~ReceiveCoinsDialog(); void setModel(WalletModel *model); @@ -59,7 +58,6 @@ WalletModel *model; QMenu *contextMenu; const PlatformStyle *platformStyle; - const Config *config; QModelIndex selectedRow(); void copyColumnToClipboard(int column); diff --git a/src/qt/receivecoinsdialog.cpp b/src/qt/receivecoinsdialog.cpp --- a/src/qt/receivecoinsdialog.cpp +++ b/src/qt/receivecoinsdialog.cpp @@ -23,9 +23,9 @@ #include ReceiveCoinsDialog::ReceiveCoinsDialog(const PlatformStyle *_platformStyle, - const Config *configIn, QWidget *parent) + QWidget *parent) : QDialog(parent), ui(new Ui::ReceiveCoinsDialog), columnResizingFixer(0), - model(0), platformStyle(_platformStyle), config(configIn) { + model(0), platformStyle(_platformStyle) { ui->setupUi(this); if (!_platformStyle->getImagesOnButtons()) { @@ -142,7 +142,7 @@ label, ""); SendCoinsRecipient info(address, label, ui->reqAmount->value(), ui->reqMessage->text()); - ReceiveRequestDialog *dialog = new ReceiveRequestDialog(config, this); + ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose); dialog->setModel(model); dialog->setInfo(info); @@ -157,7 +157,7 @@ const QModelIndex &index) { const RecentRequestsTableModel *submodel = model->getRecentRequestsTableModel(); - ReceiveRequestDialog *dialog = new ReceiveRequestDialog(config, this); + ReceiveRequestDialog *dialog = new ReceiveRequestDialog(this); dialog->setModel(model); dialog->setInfo(submodel->entry(index.row()).recipient); dialog->setAttribute(Qt::WA_DeleteOnClose); @@ -260,8 +260,8 @@ const RecentRequestsTableModel *const submodel = model->getRecentRequestsTableModel(); - const QString uri = GUIUtil::formatBitcoinURI( - *config, submodel->entry(sel.row()).recipient); + const QString uri = + GUIUtil::formatBitcoinURI(submodel->entry(sel.row()).recipient); GUIUtil::setClipboard(uri); } diff --git a/src/qt/receiverequestdialog.h b/src/qt/receiverequestdialog.h --- a/src/qt/receiverequestdialog.h +++ b/src/qt/receiverequestdialog.h @@ -12,8 +12,6 @@ #include #include -class Config; - namespace Ui { class ReceiveRequestDialog; } @@ -49,7 +47,7 @@ Q_OBJECT public: - explicit ReceiveRequestDialog(const Config *configIn, QWidget *parent = 0); + explicit ReceiveRequestDialog(QWidget *parent = 0); ~ReceiveRequestDialog(); void setModel(WalletModel *model); @@ -65,7 +63,6 @@ Ui::ReceiveRequestDialog *ui; WalletModel *model; SendCoinsRecipient info; - const Config *config; }; #endif // BITCOIN_QT_RECEIVEREQUESTDIALOG_H diff --git a/src/qt/receiverequestdialog.cpp b/src/qt/receiverequestdialog.cpp --- a/src/qt/receiverequestdialog.cpp +++ b/src/qt/receiverequestdialog.cpp @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -76,10 +75,8 @@ contextMenu->exec(event->globalPos()); } -ReceiveRequestDialog::ReceiveRequestDialog(const Config *configIn, - QWidget *parent) - : QDialog(parent), ui(new Ui::ReceiveRequestDialog), model(0), - config(configIn) { +ReceiveRequestDialog::ReceiveRequestDialog(QWidget *parent) + : QDialog(parent), ui(new Ui::ReceiveRequestDialog), model(0) { ui->setupUi(this); #ifndef USE_QRCODE @@ -107,9 +104,6 @@ void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info) { this->info = _info; - // Display addresses with currently configured encoding. - this->info.address = - GUIUtil::convertToConfiguredAddressFormat(*config, this->info.address); update(); } @@ -119,7 +113,7 @@ if (target.isEmpty()) target = info.address; setWindowTitle(tr("Request payment to %1").arg(target)); - QString uri = GUIUtil::formatBitcoinURI(*config, info); + QString uri = GUIUtil::formatBitcoinURI(info); ui->btnSaveAs->setEnabled(false); QString html; html += ""; @@ -146,7 +140,7 @@ ui->outUri->setText(html); #ifdef USE_QRCODE - int fontSize = config->UseCashAddrEncoding() ? 10 : 12; + int fontSize = 10; ui->lblQRCode->setText(""); if (!uri.isEmpty()) { @@ -196,7 +190,7 @@ } void ReceiveRequestDialog::on_btnCopyURI_clicked() { - GUIUtil::setClipboard(GUIUtil::formatBitcoinURI(*config, info)); + GUIUtil::setClipboard(GUIUtil::formatBitcoinURI(info)); } void ReceiveRequestDialog::on_btnCopyAddress_clicked() { diff --git a/src/qt/test/guiutiltests.cpp b/src/qt/test/guiutiltests.cpp --- a/src/qt/test/guiutiltests.cpp +++ b/src/qt/test/guiutiltests.cpp @@ -37,24 +37,17 @@ void GUIUtilTests::toCurrentEncodingTest() { GUIUtilTestConfig config; + const CChainParams ¶ms = config.GetChainParams(); // garbage in, garbage out - QVERIFY(GUIUtil::convertToConfiguredAddressFormat(config, "garbage") == - "garbage"); + QVERIFY(GUIUtil::convertToCashAddr(params, "garbage") == "garbage"); QString cashaddr_pubkey = "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"; QString base58_pubkey = "1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu"; - config.SetCashAddrEncoding(true); - QVERIFY(GUIUtil::convertToConfiguredAddressFormat( - config, cashaddr_pubkey) == cashaddr_pubkey); - QVERIFY(GUIUtil::convertToConfiguredAddressFormat(config, base58_pubkey) == + QVERIFY(GUIUtil::convertToCashAddr(params, cashaddr_pubkey) == + cashaddr_pubkey); + QVERIFY(GUIUtil::convertToCashAddr(params, base58_pubkey) == cashaddr_pubkey); - - config.SetCashAddrEncoding(false); - QVERIFY(GUIUtil::convertToConfiguredAddressFormat( - config, cashaddr_pubkey) == base58_pubkey); - QVERIFY(GUIUtil::convertToConfiguredAddressFormat(config, base58_pubkey) == - base58_pubkey); } diff --git a/src/qt/test/uritests.cpp b/src/qt/test/uritests.cpp --- a/src/qt/test/uritests.cpp +++ b/src/qt/test/uritests.cpp @@ -173,41 +173,49 @@ QVERIFY(!GUIUtil::parseBitcoinURI(scheme, uri, &rv)); } -namespace { -class UriTestConfig : public DummyConfig { -public: - UriTestConfig(bool useCashAddrIn) - : DummyConfig(CBaseChainParams::MAIN), useCashAddr(useCashAddrIn) {} - bool UseCashAddrEncoding() const override { return useCashAddr; } - -private: - bool useCashAddr; -}; - -} // namespace - void URITests::uriTestFormatURI() { { - UriTestConfig cfg(true); SendCoinsRecipient r; r.address = "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"; r.message = "test"; - QString uri = GUIUtil::formatBitcoinURI(cfg, r); + QString uri = GUIUtil::formatBitcoinURI(r); QVERIFY(uri == "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a?" "message=test"); } { - UriTestConfig cfg(false); + // Garbage goes through (address checksum is invalid) SendCoinsRecipient r; r.address = "175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"; r.message = "test"; - QString uri = GUIUtil::formatBitcoinURI(cfg, r); - QVERIFY(uri == - "bitcoincash:175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=test"); + QString uri = GUIUtil::formatBitcoinURI(r); + QVERIFY(uri == "175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W?message=test"); + } + + { + // Legacy addresses are converted. + SendCoinsRecipient r; + r.address = "12c6DSiU4Rq3P4ZxziKxzrL5LmMBrzjrJX"; + r.message = "test"; + QString uri = GUIUtil::formatBitcoinURI(r); + QVERIFY(uri == "bitcoincash:qqgekzvw96vq5g57zwdfa5q6g609rrn0ycp33uc325?" + "message=test"); } } +namespace { +class UriTestConfig : public DummyConfig { +public: + UriTestConfig(bool useCashAddrIn) + : DummyConfig(CBaseChainParams::MAIN), useCashAddr(useCashAddrIn) {} + bool UseCashAddrEncoding() const override { return useCashAddr; } + +private: + bool useCashAddr; +}; + +} // namespace + void URITests::uriTestScheme() { { // cashaddr - scheme depends on selected chain params diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp --- a/src/qt/test/wallettests.cpp +++ b/src/qt/test/wallettests.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -179,8 +178,7 @@ QCOMPARE(balanceText, balanceComparison); // Check Request Payment button - const Config &config = GetConfig(); - ReceiveCoinsDialog receiveCoinsDialog(platformStyle.get(), &config); + ReceiveCoinsDialog receiveCoinsDialog(platformStyle.get()); receiveCoinsDialog.setModel(&walletModel); RecentRequestsTableModel *requestTableModel = walletModel.getRecentRequestsTableModel(); @@ -212,8 +210,8 @@ QString paymentText = rlist->toPlainText(); QStringList paymentTextList = paymentText.split('\n'); QCOMPARE(paymentTextList.at(0), QString("Payment information")); - QVERIFY(paymentTextList.at(1).indexOf( - QString("URI: bitcoincash:")) != -1); + QVERIFY(paymentTextList.at(1).indexOf(QString("URI: bchreg:")) != + -1); QVERIFY(paymentTextList.at(2).indexOf(QString("Address:")) != -1); QCOMPARE(paymentTextList.at(3), QString("Amount: 0.00000001 ") + diff --git a/src/qt/walletframe.h b/src/qt/walletframe.h --- a/src/qt/walletframe.h +++ b/src/qt/walletframe.h @@ -14,7 +14,6 @@ class SendCoinsRecipient; class WalletModel; class WalletView; -class Config; QT_BEGIN_NAMESPACE class QStackedWidget; @@ -32,7 +31,7 @@ public: explicit WalletFrame(const PlatformStyle *platformStyle, - const Config *configIn, BitcoinGUI *_gui = 0); + BitcoinGUI *_gui = 0); ~WalletFrame(); void setClientModel(ClientModel *clientModel); @@ -60,7 +59,6 @@ bool bOutOfSync; const PlatformStyle *platformStyle; - const Config *config; public: WalletView *currentWalletView(); diff --git a/src/qt/walletframe.cpp b/src/qt/walletframe.cpp --- a/src/qt/walletframe.cpp +++ b/src/qt/walletframe.cpp @@ -14,9 +14,8 @@ #include #include -WalletFrame::WalletFrame(const PlatformStyle *_platformStyle, - const Config *configIn, BitcoinGUI *_gui) - : QFrame(_gui), gui(_gui), platformStyle(_platformStyle), config(configIn) { +WalletFrame::WalletFrame(const PlatformStyle *_platformStyle, BitcoinGUI *_gui) + : QFrame(_gui), gui(_gui), platformStyle(_platformStyle) { // Leave HBox hook for adding a list view later QHBoxLayout *walletFrameLayout = new QHBoxLayout(this); setContentsMargins(0, 0, 0, 0); @@ -45,7 +44,7 @@ return false; } - WalletView *walletView = new WalletView(platformStyle, config, this); + WalletView *walletView = new WalletView(platformStyle, this); walletView->setBitcoinGUI(gui); walletView->setClientModel(clientModel); walletView->setWalletModel(walletModel); diff --git a/src/qt/walletview.h b/src/qt/walletview.h --- a/src/qt/walletview.h +++ b/src/qt/walletview.h @@ -19,7 +19,6 @@ class TransactionView; class WalletModel; class AddressBookPage; -class Config; QT_BEGIN_NAMESPACE class QModelIndex; @@ -37,8 +36,7 @@ Q_OBJECT public: - explicit WalletView(const PlatformStyle *platformStyle, const Config *cfg, - QWidget *parent); + explicit WalletView(const PlatformStyle *platformStyle, QWidget *parent); ~WalletView(); void setBitcoinGUI(BitcoinGUI *gui); diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -29,8 +29,7 @@ #include #include -WalletView::WalletView(const PlatformStyle *_platformStyle, const Config *cfg, - QWidget *parent) +WalletView::WalletView(const PlatformStyle *_platformStyle, QWidget *parent) : QStackedWidget(parent), clientModel(0), walletModel(0), platformStyle(_platformStyle) { // Create tabs @@ -52,7 +51,7 @@ vbox->addLayout(hbox_buttons); transactionsPage->setLayout(vbox); - receiveCoinsPage = new ReceiveCoinsDialog(platformStyle, cfg); + receiveCoinsPage = new ReceiveCoinsDialog(platformStyle); sendCoinsPage = new SendCoinsDialog(platformStyle); usedSendingAddressesPage =