diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 28cb8f8..698f17b 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1388,6 +1388,11 @@ void MainWindow::showAddressChecker() { return; } + if (!m_wallet->isAddressTorsionFree(address)) { + Utils::showWarning(this, "Address is not torsion-free", "This address is not compatible with reference wallets.\n\nSending to this address MAY RESULT IN A LOSS OF FUNDS."); + return; + } + SubaddressIndex index = m_wallet->subaddressIndex(address); if (!index.isValid()) { // TODO: probably mention lookahead here diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp index f9fa06a..4fed2ad 100644 --- a/src/libwalletqt/Wallet.cpp +++ b/src/libwalletqt/Wallet.cpp @@ -331,6 +331,15 @@ QString Wallet::getSubaddressLookahead() const { return QString("%1:%2").arg(QString::number(lookahead.first), QString::number(lookahead.second)); } +bool Wallet::isAddressTorsionFree(const QString& address) { + cryptonote::address_parse_info info; + bool r = cryptonote::get_account_address_from_str(info, m_wallet2->nettype(), address.toStdString()); + if (!r) { + return false; + } + return rct::isInMainSubgroup(rct::pk2rct(info.address.m_spend_public_key)) && rct::isInMainSubgroup(rct::pk2rct(info.address.m_view_public_key)); +} + // #################### Seed #################### QString Wallet::getSeed(const QString &seedOffset) const { diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h index 74838c6..79b1f15 100644 --- a/src/libwalletqt/Wallet.h +++ b/src/libwalletqt/Wallet.h @@ -176,6 +176,8 @@ public: void deviceShowAddressAsync(quint32 accountIndex, quint32 addressIndex, const QString &paymentId); QString getSubaddressLookahead() const; + bool isAddressTorsionFree(const QString& address); + // ##### Seed ##### //! returns mnemonic seed