diff --git a/src/qt/receiverequestdialog.h b/src/qt/receiverequestdialog.h --- a/src/qt/receiverequestdialog.h +++ b/src/qt/receiverequestdialog.h @@ -11,6 +11,7 @@ #include #include #include +#include class OptionsModel; class Config; @@ -69,4 +70,7 @@ const Config *cfg; }; +// exported for unittesting +QString ToCurrentEncoding(const QString &addr, const 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 @@ -1,4 +1,5 @@ // Copyright (c) 2011-2016 The Bitcoin Core developers +// Copyright (c) 2017 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -7,6 +8,7 @@ #include "bitcoinunits.h" #include "config.h" +#include "dstencode.h" #include "guiconstants.h" #include "guiutil.h" #include "optionsmodel.h" @@ -104,8 +106,25 @@ update(); } +// 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 ToCurrentEncoding(const QString &addr, const Config &cfg) { + if (!IsValidDestinationString(addr.toStdString(), cfg.GetChainParams())) { + // We have something sketchy as input. Do not try to convert. + return addr; + } + CTxDestination dst = + DecodeDestination(addr.toStdString(), cfg.GetChainParams()); + return QString::fromStdString( + EncodeDestination(dst, cfg.GetChainParams(), cfg)); +} + void ReceiveRequestDialog::setInfo(const SendCoinsRecipient &_info) { this->info = _info; + // Display addresses with currently configured encoding. + this->info.address = ToCurrentEncoding(this->info.address, *cfg); update(); } diff --git a/src/qt/test/guiutiltests.h b/src/qt/test/guiutiltests.h --- a/src/qt/test/guiutiltests.h +++ b/src/qt/test/guiutiltests.h @@ -13,6 +13,7 @@ private Q_SLOTS: void dummyAddressTest(); + void toCurrentEncodingTest(); }; #endif // BITCOIN_QT_TEST_GUIUTILTESTS_H 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 @@ -7,6 +7,7 @@ #include "config.h" #include "dstencode.h" #include "guiutil.h" +#include "receiverequestdialog.h" namespace { @@ -15,6 +16,9 @@ UtilCfgDummy() : useCashAddr(false) {} void SetCashAddrEncoding(bool b) override { useCashAddr = b; } bool UseCashAddrEncoding() const override { return useCashAddr; } + const CChainParams &GetChainParams() const override { + return Params(CBaseChainParams::MAIN); + } private: bool useCashAddr; @@ -37,3 +41,22 @@ QVERIFY(!IsValidDestinationString(dummyaddr, params)); QVERIFY(!dummyaddr.empty()); } + +void GUIUtilTests::toCurrentEncodingTest() { + UtilCfgDummy config; + + // garbage in, garbage out + QVERIFY(ToCurrentEncoding("garbage", config) == "garbage"); + + QString cashaddr_pubkey = + "bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"; + QString base58_pubkey = "1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu"; + + config.SetCashAddrEncoding(true); + QVERIFY(ToCurrentEncoding(cashaddr_pubkey, config) == cashaddr_pubkey); + QVERIFY(ToCurrentEncoding(base58_pubkey, config) == cashaddr_pubkey); + + config.SetCashAddrEncoding(false); + QVERIFY(ToCurrentEncoding(cashaddr_pubkey, config) == base58_pubkey); + QVERIFY(ToCurrentEncoding(base58_pubkey, config) == base58_pubkey); +}