diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6e83887..d33cecd 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -106,6 +106,9 @@ void MainWindow::turnstileProgress() { auto nextTxBlock = curProgress.nextBlock - Settings::getInstance()->getBlockNumber(); + progress.fromAddr->setText(curProgress.from); + progress.toAddr->setText(curProgress.to); + if (curProgress.step == curProgress.totalSteps) { auto txt = QString("Turnstile migration finished"); if (curProgress.hasErrors) { @@ -115,7 +118,7 @@ void MainWindow::turnstileProgress() { } else { progress.nextTx->setText(QString("Next transaction in ") % QString::number(nextTxBlock < 0 ? 0 : nextTxBlock) - % " blocks\n" + % " blocks via " % curProgress.via % "\n" % (nextTxBlock <= 0 ? "(waiting for confirmations)" : "")); } @@ -138,6 +141,7 @@ void MainWindow::turnstileProgress() { progress.buttonBox->button(QDialogButtonBox::Discard)->setText("Abort"); else progress.buttonBox->button(QDialogButtonBox::Discard)->setVisible(false); + QObject::connect(progress.buttonBox->button(QDialogButtonBox::Discard), &QPushButton::clicked, [&] () { if (curProgress.step != curProgress.totalSteps) { auto abort = QMessageBox::warning(this, "Are you sure you want to Abort?", @@ -520,7 +524,7 @@ void MainWindow::setupBalancesTab() { }); } - if (Settings::getInstance()->isSproutAddress(addr)) { + if (Settings::getInstance()->isTestnet() && Settings::getInstance()->isSproutAddress(addr)) { menu.addAction("Migrate to Sapling", [=] () { this->turnstileDoMigration(addr); }); diff --git a/src/rpc.cpp b/src/rpc.cpp index 10a3f62..c644a68 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -194,7 +194,7 @@ void RPC::importZPrivKey(QString addr, bool rescan, const std::function& cb) { doRPC(payload, cb); } -void RPC::doSendRPC(const json& payload, const std::function& cb) { - QNetworkReply *reply = restclient->post(request, QByteArray::fromStdString(payload.dump())); +void RPC::doSendRPC(const json& payload, const std::function& cb, const std::function& err) { + QNetworkReply *reply = restclient->post(request, QByteArray::fromStdString(payload.dump())); - QObject::connect(reply, &QNetworkReply::finished, [=] { - reply->deleteLater(); - - if (reply->error() != QNetworkReply::NoError) { - auto parsed = json::parse(reply->readAll(), nullptr, false); - if (!parsed.is_discarded() && !parsed["error"]["message"].is_null()) { - handleTxError(QString::fromStdString(parsed["error"]["message"])); - } else { - handleTxError(reply->errorString()); - } - - return; - } - - auto parsed = json::parse(reply->readAll(), nullptr, false); - if (parsed.is_discarded()) { - handleTxError("Unknown error"); - } - - cb(parsed["result"]); - }); + QObject::connect(reply, &QNetworkReply::finished, [=] { + reply->deleteLater(); + + if (reply->error() != QNetworkReply::NoError) { + auto parsed = json::parse(reply->readAll(), nullptr, false); + if (!parsed.is_discarded() && !parsed["error"]["message"].is_null()) { + err(QString::fromStdString(parsed["error"]["message"])); + } + else { + err(reply->errorString()); + } + + return; + } + + auto parsed = json::parse(reply->readAll(), nullptr, false); + if (parsed.is_discarded()) { + err("Unknown error"); + } + + cb(parsed["result"]); + }); +} + +// Default implementation of a Send RPC that default shows an error message box with the error. +void RPC::doSendRPC(const json& payload, const std::function& cb) { + doSendRPC(payload, cb, [=](auto error) { this->handleTxError(error); }); } void RPC::sendZTransaction(json params, const std::function& cb) { diff --git a/src/rpc.h b/src/rpc.h index fb9d01f..a11beef 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -110,6 +110,7 @@ public: private: void doRPC (const json& payload, const std::function& cb); void doSendRPC (const json& payload, const std::function& cb); + void doSendRPC(const json& payload, const std::function& cb, const std::function& err); void refreshBalances(); diff --git a/src/turnstile.cpp b/src/turnstile.cpp index e69c9d4..baf7c7c 100644 --- a/src/turnstile.cpp +++ b/src/turnstile.cpp @@ -243,7 +243,9 @@ ProgressReport Turnstile::getPlanProgress() { i.status == TurnstileMigrationItemStatus::UnknownError; }) != plan.end(); - return ProgressReport{(int)step, total*2, nextBlock, hasErrors}; + auto stepData = (nextStep == plan.end() ? std::prev(nextStep) : nextStep); + + return ProgressReport{(int)step, total*2, nextBlock, hasErrors, stepData->fromAddr, stepData->destAddr, stepData->intTAddr}; } void Turnstile::executeMigrationStep() { diff --git a/src/turnstile.h b/src/turnstile.h index 6eb5196..ae4bf18 100644 --- a/src/turnstile.h +++ b/src/turnstile.h @@ -30,6 +30,9 @@ struct ProgressReport { int totalSteps; int nextBlock; bool hasErrors; + QString from; + QString to; + QString via; }; class Turnstile diff --git a/src/turnstileprogress.ui b/src/turnstileprogress.ui index bb91fa2..692630b 100644 --- a/src/turnstileprogress.ui +++ b/src/turnstileprogress.ui @@ -14,14 +14,38 @@ Turnstile Migration Progress - - - - 33 + + + + From - + + + + To + + + + + + + From Address + + + + + + + 4 / 12 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + @@ -37,38 +61,48 @@ - - - - Qt::Horizontal - - - - + Next Transaction in 4 hours - - - - 4 / 12 - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + 33 - + + + + Qt::Horizontal + + + + Migration Progress - + + + + Qt::Horizontal + + + QDialogButtonBox::Close|QDialogButtonBox::Discard + + + false + + + + @@ -84,20 +118,7 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Close|QDialogButtonBox::Discard - - - false - - - - + Qt::Vertical @@ -110,8 +131,22 @@ - - + + + + Qt::Horizontal + + + + + + + To Address + + + + + Qt::Horizontal diff --git a/src/txtablemodel.cpp b/src/txtablemodel.cpp index 1d3a6cb..b0030cd 100644 --- a/src/txtablemodel.cpp +++ b/src/txtablemodel.cpp @@ -98,7 +98,10 @@ void TxTableModel::updateAllData() { else return addr; } - case 2: return QDateTime::fromMSecsSinceEpoch(modeldata->at(index.row()).datetime * 1000).toLocalTime().toString(); + case 2: { + qDebug() << modeldata->at(index.row()).datetime; + return QDateTime::fromMSecsSinceEpoch(modeldata->at(index.row()).datetime * 1000).toLocalTime().toString(); + } case 3: return Settings::getInstance()->getZECDisplayFormat(modeldata->at(index.row()).amount); } }