mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 06:28:31 +01:00
[Qt] simple fee bumper with user verification
This commit is contained in:
@@ -8,8 +8,10 @@
|
||||
#include "consensus/validation.h"
|
||||
#include "guiconstants.h"
|
||||
#include "guiutil.h"
|
||||
#include "optionsmodel.h"
|
||||
#include "paymentserver.h"
|
||||
#include "recentrequeststablemodel.h"
|
||||
#include "sendcoinsdialog.h"
|
||||
#include "transactiontablemodel.h"
|
||||
|
||||
#include "base58.h"
|
||||
@@ -17,15 +19,18 @@
|
||||
#include "keystore.h"
|
||||
#include "validation.h"
|
||||
#include "net.h" // for g_connman
|
||||
#include "policy/rbf.h"
|
||||
#include "sync.h"
|
||||
#include "ui_interface.h"
|
||||
#include "util.h" // for GetBoolArg
|
||||
#include "wallet/feebumper.h"
|
||||
#include "wallet/wallet.h"
|
||||
#include "wallet/walletdb.h" // for BackupWallet
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QMessageBox>
|
||||
#include <QSet>
|
||||
#include <QTimer>
|
||||
|
||||
@@ -693,6 +698,71 @@ bool WalletModel::abandonTransaction(uint256 hash) const
|
||||
return wallet->AbandonTransaction(hash);
|
||||
}
|
||||
|
||||
bool WalletModel::transactionSignalsRBF(uint256 hash) const
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
const CWalletTx *wtx = wallet->GetWalletTx(hash);
|
||||
if (wtx && SignalsOptInRBF(*wtx))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WalletModel::bumpFee(uint256 hash)
|
||||
{
|
||||
std::unique_ptr<CFeeBumper> feeBump;
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
feeBump.reset(new CFeeBumper(wallet, hash, 0, false, 0, true));
|
||||
}
|
||||
if (feeBump->getResult() != BumpFeeResult::OK)
|
||||
{
|
||||
QMessageBox::critical(0, tr("Fee bump error"), tr("Increasing transaction fee failed") + "<br />(" +
|
||||
(feeBump->getErrors().size() ? QString::fromStdString(feeBump->getErrors()[0]) : "") +")");
|
||||
return false;
|
||||
}
|
||||
|
||||
// allow a user based fee verification
|
||||
QString questionString = tr("Do you want to increase the fee from %1 to %2").arg(
|
||||
BitcoinUnits::formatHtmlWithUnit(getOptionsModel()->getDisplayUnit(), feeBump->getOldFee()),
|
||||
BitcoinUnits::formatHtmlWithUnit(getOptionsModel()->getDisplayUnit(), feeBump->getNewFee()));
|
||||
SendConfirmationDialog confirmationDialog(tr("Confirm fee bump"), questionString);
|
||||
confirmationDialog.exec();
|
||||
QMessageBox::StandardButton retval = (QMessageBox::StandardButton)confirmationDialog.result();
|
||||
|
||||
// cancel sign&broadcast if users doesn't want to bump the fee
|
||||
if (retval != QMessageBox::Yes) {
|
||||
return false;
|
||||
}
|
||||
|
||||
WalletModel::UnlockContext ctx(requestUnlock());
|
||||
if(!ctx.isValid())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// sign bumped transaction
|
||||
bool res = false;
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
res = feeBump->signTransaction(wallet);
|
||||
}
|
||||
if (!res) {
|
||||
QMessageBox::critical(0, tr("Fee bump error"), tr("Can't sign transaction."));
|
||||
return false;
|
||||
}
|
||||
// commit the bumped transaction
|
||||
{
|
||||
LOCK2(cs_main, wallet->cs_wallet);
|
||||
res = feeBump->commit(wallet);
|
||||
}
|
||||
if(!res) {
|
||||
QMessageBox::critical(0, tr("Fee bump error"), tr("Could not commit transaction") + "<br />(" +
|
||||
QString::fromStdString(feeBump->getErrors()[0])+")");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WalletModel::isWalletEnabled()
|
||||
{
|
||||
return !GetBoolArg("-disablewallet", DEFAULT_DISABLE_WALLET);
|
||||
|
||||
Reference in New Issue
Block a user