From e4531a9e3013a12b2e9a85c00b2b07bfded5b150 Mon Sep 17 00:00:00 2001 From: tobtoht Date: Fri, 2 Jul 2021 17:43:47 +0200 Subject: [PATCH] Coins: improve sweepOutputs error handling --- src/CoinsWidget.cpp | 45 ++++++++++++++++++++++----------------------- src/CoinsWidget.h | 3 +-- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/CoinsWidget.cpp b/src/CoinsWidget.cpp index 6b4eb319..2a972943 100644 --- a/src/CoinsWidget.cpp +++ b/src/CoinsWidget.cpp @@ -54,8 +54,8 @@ CoinsWidget::CoinsWidget(QSharedPointer ctx, QWidget *parent) connect(m_freezeOutputAction, &QAction::triggered, this, &CoinsWidget::freezeOutput); connect(m_thawOutputAction, &QAction::triggered, this, &CoinsWidget::thawOutput); connect(m_viewOutputAction, &QAction::triggered, this, &CoinsWidget::viewOutput); - connect(m_sweepOutputAction, &QAction::triggered, this, &CoinsWidget::onSweepOutput); - connect(m_sweepOutputsAction, &QAction::triggered, this, &CoinsWidget::onSweepMulti); + connect(m_sweepOutputAction, &QAction::triggered, this, &CoinsWidget::onSweepOutputs); + connect(m_sweepOutputsAction, &QAction::triggered, this, &CoinsWidget::onSweepOutputs); connect(m_freezeAllSelectedAction, &QAction::triggered, this, &CoinsWidget::freezeAllSelected); connect(m_thawAllSelectedAction, &QAction::triggered, this, &CoinsWidget::thawAllSelected); @@ -195,26 +195,7 @@ void CoinsWidget::viewOutput() { dialog->show(); } -void CoinsWidget::onSweepOutput() { - CoinsInfo* c = this->currentEntry(); - if (!c) return; - - QString keyImage = c->keyImage(); - - if (!c->keyImageKnown()) { - QMessageBox::warning(this, "Unable to sweep output", "Unable to sweep output: key image unknown"); - return; - } - - auto *dialog = new OutputSweepDialog(this, c->amount()); - int ret = dialog->exec(); - if (!ret) return; - - m_ctx->onSweepOutput(keyImage, dialog->address(), dialog->churn(), dialog->outputs()); - dialog->deleteLater(); -} - -void CoinsWidget::onSweepMulti() { +void CoinsWidget::onSweepOutputs() { QVector selectedCoins = this->currentEntries(); QVector keyImages; @@ -224,9 +205,27 @@ void CoinsWidget::onSweepMulti() { QString keyImage = coin->keyImage(); if (!coin->keyImageKnown()) { - QMessageBox::warning(this, "Unable to sweep output", "Unable to sweep output: key image unknown"); + QMessageBox::warning(this, "Unable to sweep outputs", "Unable to create transaction: selected output has unknown key image"); return; } + + if (coin->spent()) { + QMessageBox::warning(this, "Unable to sweep outputs", "Unable to create transaction: selected output was already spent"); + return; + } + + if (coin->frozen()) { + QMessageBox::warning(this, "Unable to sweep outputs", "Unable to create transaction: selected output is frozen.\n\n" + "Thaw the selected output(s) before spending."); + return; + } + + if (!coin->unlocked()) { + QMessageBox::warning(this, "Unable to sweep outputs", "Unable to create transaction: selected output is locked.\n\n" + "Wait until the output has reached the required number of confirmation before spending."); + return; + } + keyImages.push_back(keyImage); totalAmount += coin->amount(); } diff --git a/src/CoinsWidget.h b/src/CoinsWidget.h index b1b1f0ad..90cbb534 100644 --- a/src/CoinsWidget.h +++ b/src/CoinsWidget.h @@ -38,8 +38,7 @@ private slots: void thawOutput(); void thawAllSelected(); void viewOutput(); - void onSweepOutput(); - void onSweepMulti(); + void onSweepOutputs(); void setSearchFilter(const QString &filter); void editLabel();