diff --git a/CMakeLists.txt b/CMakeLists.txt
index b004afa7..fb53063e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -38,7 +38,6 @@ option(WITH_PLUGIN_CROWDFUNDING "Include Crowdfunding Home plugin" ON)
option(WITH_PLUGIN_BOUNTIES "Include Bounties Home plugin" ON)
option(WITH_PLUGIN_REVUO "Include Revuo Home plugin" ON)
option(WITH_PLUGIN_CALC "Include Calc tab plugin" ON)
-option(WITH_PLUGIN_XMRIG "Include XMRig plugin" ON)
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
include(CheckCCompilerFlag)
diff --git a/RELEASE.md b/RELEASE.md
index eba243ce..5d8777f5 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -3,7 +3,6 @@
- Before a minor release:
- Update `src/assets/restore_heights_monero_{mainnet,stagenet}.txt`
- To obtain values, run `contrib/generate-restore-heights/heights.py`
- - Update `m_defaultPools` in `src/widgets/XMRigWidget.h`
- Update default node lists in `src/assets/nodes.json`
- Bump `openssl`, `qt`, `tor_*` packages in `contrib/depends/packages`
- Update or patch any statically linked dependencies that have known vulnerabilities
diff --git a/src/MainWindow.ui b/src/MainWindow.ui
index eced3c55..753e8503 100644
--- a/src/MainWindow.ui
+++ b/src/MainWindow.ui
@@ -809,11 +809,6 @@
Outputs
-
-
- Show Mining
-
-
Transaction
diff --git a/src/WindowManager.cpp b/src/WindowManager.cpp
index 4c0ff302..5d6696e9 100644
--- a/src/WindowManager.cpp
+++ b/src/WindowManager.cpp
@@ -315,16 +315,6 @@ void WindowManager::onWalletOpened(Wallet *wallet) {
this->onInitialNetworkConfigured();
-// if (!wallet->cacheAttributeExists("feather.xmrig_password") && !wallet->cacheAttributeExists("feather.created")) {
-// auto result = QMessageBox::question(nullptr, "Foreign wallet",
-// "This wallet file was not created with Feather. This may cause unexpected behavior. Please restore your wallet from seed.\n\nOpen this wallet anyway?");
-// if (result == QMessageBox::No) {
-// wallet->deleteLater();
-// this->initWizard();
-// return;
-// }
-// }
-
// Create new mainwindow with wallet
m_splashDialog->hide();
diff --git a/src/assets.qrc b/src/assets.qrc
index b69574ca..de87ab63 100644
--- a/src/assets.qrc
+++ b/src/assets.qrc
@@ -106,7 +106,6 @@
assets/images/update.png
assets/images/warning.png
assets/images/vrdp_32px.png
- assets/images/xmrig.svg
assets/images/zoom.png
assets/restore_heights_monero_mainnet.txt
assets/restore_heights_monero_stagenet.txt
diff --git a/src/assets/images/xmrig.svg b/src/assets/images/xmrig.svg
deleted file mode 100644
index c029755f..00000000
--- a/src/assets/images/xmrig.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/plugins/xmrig/XMRigPlugin.cpp b/src/plugins/xmrig/XMRigPlugin.cpp
deleted file mode 100644
index afdac604..00000000
--- a/src/plugins/xmrig/XMRigPlugin.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#include "XMRigPlugin.h"
-
-#include "plugins/PluginRegistry.h"
-
-XMRigPlugin::XMRigPlugin()
-{
-}
-
-
-void XMRigPlugin::initialize(Wallet *wallet, QObject *parent) {
- this->setParent(parent);
- m_tab = new XMRigWidget(wallet, nullptr);
-}
-
-QString XMRigPlugin::id() {
- return "xmrig";
-}
-
-int XMRigPlugin::idx() const {
- return 70;
-}
-
-QString XMRigPlugin::parent() {
- return {};
-}
-
-QString XMRigPlugin::displayName() {
- return "Mining";
-}
-
-QString XMRigPlugin::description() {
- return {};
-}
-
-QString XMRigPlugin::icon() {
- return "mining.png";
-}
-
-QStringList XMRigPlugin::socketData() {
- return {"xmrig"};
-}
-
-Plugin::PluginType XMRigPlugin::type() {
- return Plugin::PluginType::TAB;
-}
-
-QWidget* XMRigPlugin::tab() {
- return m_tab;
-}
-
-bool XMRigPlugin::requiresWebsocket() {
- return false;
-}
-
-const bool XMRigPlugin::registered = [] {
- PluginRegistry::registerPlugin(XMRigPlugin::create());
- PluginRegistry::getInstance().registerPluginCreator(&XMRigPlugin::create);
- return true;
-}();
diff --git a/src/plugins/xmrig/XMRigPlugin.h b/src/plugins/xmrig/XMRigPlugin.h
deleted file mode 100644
index a31632a4..00000000
--- a/src/plugins/xmrig/XMRigPlugin.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#ifndef XMRIGPLUGIN_H
-#define XMRIGPLUGIN_H
-
-#include "plugins/Plugin.h"
-#include "XMRigWidget.h"
-
-class XMRigPlugin : public Plugin {
- Q_OBJECT
-
-public:
- explicit XMRigPlugin();
-
- QString id() override;
- int idx() const override;
- QString parent() override;
- QString displayName() override;
- QString description() override;
- QString icon() override;
- QStringList socketData() override;
- PluginType type() override;
- QWidget* tab() override;
- bool requiresWebsocket() override;
-
- void initialize(Wallet *wallet, QObject *parent) override;
-
- static XMRigPlugin* create() { return new XMRigPlugin(); }
-
-private:
- XMRigWidget* m_tab = nullptr;
- static const bool registered;
-};
-
-#endif //XMRIGPLUGIN_H
diff --git a/src/plugins/xmrig/XMRigWidget.cpp b/src/plugins/xmrig/XMRigWidget.cpp
deleted file mode 100644
index a4a2e3b4..00000000
--- a/src/plugins/xmrig/XMRigWidget.cpp
+++ /dev/null
@@ -1,417 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#include "XMRigWidget.h"
-#include "ui_XMRigWidget.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "WebsocketNotifier.h"
-#include "utils/Icons.h"
-#include "utils/Utils.h"
-#include "WindowManager.h"
-
-XMRigWidget::XMRigWidget(Wallet *wallet, QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::XMRigWidget)
- , m_wallet(wallet)
- , m_XMRig(new XmRig(Config::defaultConfigDir().path(), this))
- , m_model(new QStandardItemModel(this))
- , m_contextMenu(new QMenu(this))
-{
- ui->setupUi(this);
-
- connect(m_XMRig, &XmRig::stateChanged, this, &XMRigWidget::onXMRigStateChanged);
- connect(m_XMRig, &XmRig::output, this, &XMRigWidget::onProcessOutput);
- connect(m_XMRig, &XmRig::error, this, &XMRigWidget::onProcessError);
- connect(m_XMRig, &XmRig::hashrate, this, &XMRigWidget::onHashrate);
-
- ui->deprecationFrame->setInfo(icons()->icon("warning.png"), "This feature is deprecated and will be removed in an upcoming version.");
-
- // [Downloads] tab
- ui->tableView->setModel(m_model);
- m_contextMenu->addAction(icons()->icon("network.png"), "Download file", this, &XMRigWidget::linkClicked);
- connect(ui->tableView, &QHeaderView::customContextMenuRequested, this, &XMRigWidget::showContextMenu);
- connect(ui->tableView, &QTableView::doubleClicked, this, &XMRigWidget::linkClicked);
-
- // [Settings] tab
- ui->poolFrame->show();
- ui->soloFrame->hide();
-
- // XMRig executable
- connect(ui->btn_browse, &QPushButton::clicked, this, &XMRigWidget::onBrowseClicked);
- ui->lineEdit_path->setText(conf()->get(Config::xmrigPath).toString());
-
- // Run as admin/root
- bool elevated = conf()->get(Config::xmrigElevated).toBool();
- if (elevated) {
- ui->radio_elevateYes->setChecked(true);
- } else {
- ui->radio_elevateNo->setChecked(true);
- }
- connect(ui->radio_elevateYes, &QRadioButton::toggled, this, &XMRigWidget::onXMRigElevationChanged);
-#if defined(Q_OS_WIN)
- ui->radio_elevateYes->setToolTip("Not supported on Windows, yet.");
- ui->radio_elevateYes->setEnabled(false);
- ui->radio_elevateNo->setChecked(true);
-#endif
-
- // CPU threads
- ui->threadSlider->setMinimum(1);
- ui->threadSlider->setMaximum(QThread::idealThreadCount());
-
- int threads = conf()->get(Config::xmrigThreads).toInt();
- ui->threadSlider->setValue(threads);
- ui->label_threads->setText(QString("CPU threads: %1").arg(threads));
-
- connect(ui->threadSlider, &QSlider::valueChanged, this, &XMRigWidget::onThreadsValueChanged);
-
- // Mining mode
- connect(ui->combo_miningMode, QOverload::of(&QComboBox::currentIndexChanged), this, &XMRigWidget::onMiningModeChanged);
- ui->combo_miningMode->setCurrentIndex(conf()->get(Config::miningMode).toInt());
-
- // Pool/node address
- this->updatePools();
- connect(ui->combo_pools, &QComboBox::currentTextChanged, this, &XMRigWidget::onPoolChanged);
-
- connect(ui->btn_poolConfig, &QPushButton::clicked, [this]{
- QStringList pools = conf()->get(Config::pools).toStringList();
- bool ok;
- QString poolStr = QInputDialog::getMultiLineText(this, "Pool addresses", "Set pool addresses (one per line):", pools.join("\n"), &ok);
- if (!ok) {
- return;
- }
- QStringList newPools = poolStr.split("\n");
- newPools.removeAll("");
- newPools.removeDuplicates();
- conf()->set(Config::pools, newPools);
- this->updatePools();
- });
-
- ui->lineEdit_solo->setText(conf()->get(Config::xmrigDaemon).toString());
- connect(ui->lineEdit_solo, &QLineEdit::textChanged, [this](){
- conf()->set(Config::xmrigDaemon, ui->lineEdit_solo->text());
- });
-
- // Network settings
- connect(ui->check_tls, &QCheckBox::toggled, this, &XMRigWidget::onNetworkTLSToggled);
- connect(ui->relayTor, &QCheckBox::toggled, this, &XMRigWidget::onNetworkTorToggled);
- ui->check_tls->setChecked(conf()->get(Config::xmrigNetworkTLS).toBool());
- ui->relayTor->setChecked(conf()->get(Config::xmrigNetworkTor).toBool());
-
- // Receiving address
- auto username = m_wallet->getCacheAttribute("feather.xmrig_username");
- if (!username.isEmpty()) {
- ui->lineEdit_address->setText(username);
- }
- connect(ui->lineEdit_address, &QLineEdit::textChanged, [=]() {
- m_wallet->setCacheAttribute("feather.xmrig_username", ui->lineEdit_address->text());
- });
- connect(ui->btn_fillPrimaryAddress, &QPushButton::clicked, this, &XMRigWidget::onUsePrimaryAddressClicked);
-
- // Password
- auto password = m_wallet->getCacheAttribute("feather.xmrig_password");
- ui->lineEdit_password->setText(password);
- connect(ui->lineEdit_password, &QLineEdit::textChanged, [=]() {
- m_wallet->setCacheAttribute("feather.xmrig_password", ui->lineEdit_password->text());
- });
-
- // [Status] tab
- connect(ui->btn_start, &QPushButton::clicked, this, &XMRigWidget::onStartClicked);
- connect(ui->btn_stop, &QPushButton::clicked, this, &XMRigWidget::onStopClicked);
- connect(ui->btn_clear, &QPushButton::clicked, this, &XMRigWidget::onClearClicked);
-
- ui->btn_stop->setEnabled(false);
- ui->check_autoscroll->setChecked(true);
- ui->label_status->setTextInteractionFlags(Qt::TextSelectableByMouse);
- ui->label_status->hide();
-
- this->printConsoleInfo();
-
- connect(windowManager(), &WindowManager::websocketStatusChanged, this, &XMRigWidget::setDownloadsTabEnabled);
- connect(websocketNotifier(), &WebsocketNotifier::dataReceived, this, [this](const QString &type, const QJsonValue &json) {
- if (type == "xmrig") {
- QJsonObject xmrig_data = json.toObject();
- this->onDownloads(xmrig_data);
- }
- });
-}
-
-bool XMRigWidget::isMining() {
- return m_isMining;
-}
-
-void XMRigWidget::setDownloadsTabEnabled(bool enabled) {
- ui->tabWidget->setTabVisible(2, enabled);
-}
-
-void XMRigWidget::onWalletClosed() {
- this->onStopClicked();
-}
-
-void XMRigWidget::onThreadsValueChanged(int threads) {
- conf()->set(Config::xmrigThreads, threads);
- ui->label_threads->setText(QString("CPU threads: %1").arg(threads));
-}
-
-void XMRigWidget::onPoolChanged(const QString &pool) {
- if (!pool.isEmpty()) {
- conf()->set(Config::xmrigPool, pool);
- }
-}
-
-void XMRigWidget::onXMRigElevationChanged(bool elevated) {
- conf()->set(Config::xmrigElevated, elevated);
-}
-
-void XMRigWidget::onBrowseClicked() {
- QString fileName = QFileDialog::getOpenFileName(this, "Path to XMRig executable", QDir::homePath());
- if (fileName.isEmpty()) {
- return;
- }
- conf()->set(Config::xmrigPath, fileName);
- ui->lineEdit_path->setText(fileName);
-}
-
-void XMRigWidget::onClearClicked() {
- ui->console->clear();
-}
-
-void XMRigWidget::onUsePrimaryAddressClicked() {
- ui->lineEdit_address->setText(m_wallet->address(0, 0));
-}
-
-void XMRigWidget::onStartClicked() {
- QString xmrigPath = conf()->get(Config::xmrigPath).toString();
- if (!this->checkXMRigPath()) {
- return;
- }
-
- QString address = [this](){
- if (ui->combo_miningMode->currentIndex() == Config::MiningMode::Pool) {
- return conf()->get(Config::xmrigPool).toString();
- } else {
- return ui->lineEdit_solo->text().trimmed();
- }
- }();
- if (address.isEmpty()) {
- ui->console->appendPlainText("No pool or node address set. Please configure on the Settings tab.");
- return;
- }
-
- // username is receiving address usually
- auto username = m_wallet->getCacheAttribute("feather.xmrig_username");
- auto password = m_wallet->getCacheAttribute("feather.xmrig_password");
-
- if (username.isEmpty()) {
- ui->console->appendPlainText("Please specify a receiving address on the Settings screen.");
- return;
- }
-
- int threads = ui->threadSlider->value();
- bool solo = (ui->combo_miningMode->currentIndex() == Config::MiningMode::Solo);
- QStringList extraOptions = ui->lineEdit_extraOptions->text().split(" ");
-
- m_XMRig->start(xmrigPath, threads, address, username, password, ui->relayTor->isChecked(), ui->check_tls->isChecked(),
- ui->radio_elevateYes->isChecked(), solo, extraOptions);
-}
-
-void XMRigWidget::onStopClicked() {
- m_XMRig->stop();
-}
-
-void XMRigWidget::onProcessOutput(const QByteArray &data) {
- auto output = Utils::barrayToString(data);
- if(output.endsWith("\n"))
- output = output.trimmed();
-
- ui->console->appendPlainText(output);
-
- if(ui->check_autoscroll->isChecked())
- ui->console->verticalScrollBar()->setValue(ui->console->verticalScrollBar()->maximum());
-}
-
-void XMRigWidget::onProcessError(const QString &msg) {
- ui->console->appendPlainText("\n" + msg);
- ui->btn_start->setEnabled(true);
- ui->btn_stop->setEnabled(false);
- this->setMiningStopped();
-}
-
-void XMRigWidget::onHashrate(const QString &hashrate) {
- ui->label_status->show();
- ui->label_status->setText(QString("Mining at %1").arg(hashrate));
-}
-
-void XMRigWidget::onDownloads(const QJsonObject &data) {
- // For the downloads table we'll manually update the table
- // with items once, as opposed to creating a class in
- // src/models/. Saves effort; full-blown model
- // is unnecessary in this case.
-
- m_model->clear();
- m_urls.clear();
-
- auto version = data.value("version").toString();
- ui->label_latest_version->setText(QString("Latest version: %1").arg(version));
- QJsonObject assets = data.value("assets").toObject();
-
- const auto _linux = assets.value("linux").toArray();
- const auto macos = assets.value("macos").toArray();
- const auto windows = assets.value("windows").toArray();
-
- auto info = QSysInfo::productType();
- QJsonArray *os_assets;
- if(info == "osx") {
- os_assets = const_cast(&macos);
- } else if (info == "windows") {
- os_assets = const_cast(&windows);
- } else {
- // assume linux
- os_assets = const_cast(&_linux);
- }
-
- int i = 0;
- for(const auto &entry: *os_assets) {
- auto _obj = entry.toObject();
- auto _name = _obj.value("name").toString();
- auto _url = _obj.value("url").toString();
- auto _created_at = _obj.value("created_at").toString();
-
- m_urls.append(_url);
- auto download_count = _obj.value("download_count").toInt();
-
- m_model->setItem(i, 0, Utils::qStandardItem(_name));
- m_model->setItem(i, 1, Utils::qStandardItem(_created_at));
- m_model->setItem(i, 2, Utils::qStandardItem(QString::number(download_count)));
- i++;
- }
-
- m_model->setHeaderData(0, Qt::Horizontal, tr("Filename"), Qt::DisplayRole);
- m_model->setHeaderData(1, Qt::Horizontal, tr("Date"), Qt::DisplayRole);
- m_model->setHeaderData(2, Qt::Horizontal, tr("Downloads"), Qt::DisplayRole);
-
- ui->tableView->verticalHeader()->setVisible(false);
- ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
- ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
- ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
- ui->tableView->setColumnWidth(2, 100);
-}
-
-void XMRigWidget::showContextMenu(const QPoint &pos) {
- QModelIndex index = ui->tableView->indexAt(pos);
- if (!index.isValid()) {
- return;
- }
- m_contextMenu->exec(ui->tableView->viewport()->mapToGlobal(pos));
-}
-
-void XMRigWidget::updatePools() {
- QStringList pools = conf()->get(Config::pools).toStringList();
- if (pools.isEmpty()) {
- pools = m_defaultPools;
- conf()->set(Config::pools, pools);
- }
- ui->combo_pools->clear();
- ui->combo_pools->insertItems(0, pools);
-
- QString preferredPool = conf()->get(Config::xmrigPool).toString();
- if (pools.contains(preferredPool)) {
- ui->combo_pools->setCurrentIndex(pools.indexOf(preferredPool));
- } else {
- preferredPool = pools.at(0);
- conf()->set(Config::xmrigPool, preferredPool);
- }
-}
-
-void XMRigWidget::printConsoleInfo() {
- ui->console->appendPlainText(QString("Detected %1 CPU threads.").arg(QThread::idealThreadCount()));
- if (this->checkXMRigPath()) {
- QString path = conf()->get(Config::xmrigPath).toString();
- ui->console->appendPlainText(QString("XMRig path set to %1").arg(path));
- }
-}
-
-void XMRigWidget::onMiningModeChanged(int mode) {
- conf()->set(Config::miningMode, mode);
-
- if (mode == Config::MiningMode::Pool) {
- ui->poolFrame->show();
- ui->soloFrame->hide();
- ui->label_poolNodeAddress->setText("Pool address:");
- ui->check_tls->setChecked(true);
- } else { // Solo mining
- ui->poolFrame->hide();
- ui->soloFrame->show();
- ui->label_poolNodeAddress->setText("Node address:");
- ui->check_tls->setChecked(false);
- }
-}
-
-void XMRigWidget::onNetworkTLSToggled(bool checked) {
- conf()->set(Config::xmrigNetworkTLS, checked);
-}
-
-void XMRigWidget::onNetworkTorToggled(bool checked) {
- conf()->set(Config::xmrigNetworkTor, checked);
-}
-
-void XMRigWidget::onXMRigStateChanged(QProcess::ProcessState state) {
- if (state == QProcess::ProcessState::Starting) {
- ui->btn_start->setEnabled(false);
- ui->btn_stop->setEnabled(false);
- this->setMiningStarted();
- }
- else if (state == QProcess::ProcessState::Running) {
- ui->btn_start->setEnabled(false);
- ui->btn_stop->setEnabled(true);
- this->setMiningStarted();
- }
- else if (state == QProcess::ProcessState::NotRunning) {
- ui->btn_start->setEnabled(true); // todo
- ui->btn_stop->setEnabled(false);
- ui->label_status->hide();
- this->setMiningStopped();
- }
-}
-
-void XMRigWidget::setMiningStopped() {
- m_isMining = false;
- emit miningEnded();
-}
-
-void XMRigWidget::setMiningStarted() {
- m_isMining = true;
- emit miningStarted();
-}
-
-bool XMRigWidget::checkXMRigPath() {
- QString path = conf()->get(Config::xmrigPath).toString();
-
- if (path.isEmpty()) {
- ui->console->appendPlainText("No XMRig executable is set. Please configure on the Settings tab.");
- return false;
- } else if (!Utils::fileExists(path)) {
- ui->console->appendPlainText("Invalid path to XMRig executable detected. Please reconfigure on the Settings tab.");
- return false;
- } else {
- return true;
- }
-}
-
-void XMRigWidget::linkClicked() {
- QModelIndex index = ui->tableView->currentIndex();
- auto download_link = m_urls.at(index.row());
- Utils::externalLinkWarning(this, download_link);
-}
-
-QStandardItemModel *XMRigWidget::model() {
- return m_model;
-}
-
-XMRigWidget::~XMRigWidget() = default;
\ No newline at end of file
diff --git a/src/plugins/xmrig/XMRigWidget.h b/src/plugins/xmrig/XMRigWidget.h
deleted file mode 100644
index 3e5ed5c8..00000000
--- a/src/plugins/xmrig/XMRigWidget.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#ifndef FEATHER_XMRIGWIDGET_H
-#define FEATHER_XMRIGWIDGET_H
-
-#include
-#include
-#include
-#include
-
-#include "xmrig.h"
-#include "utils/config.h"
-#include "libwalletqt/Wallet.h"
-
-namespace Ui {
- class XMRigWidget;
-}
-
-class XMRigWidget : public QWidget
-{
- Q_OBJECT
-
-public:
- explicit XMRigWidget(Wallet *wallet, QWidget *parent = nullptr);
- ~XMRigWidget() override;
- QStandardItemModel *model();
-
- bool isMining();
- void setDownloadsTabEnabled(bool enabled);
-
-public slots:
- void onWalletClosed();
- void onStartClicked();
- void onStopClicked();
- void onClearClicked();
- void onUsePrimaryAddressClicked();
- void onDownloads(const QJsonObject &data);
- void linkClicked();
- void onProcessError(const QString &msg);
- void onProcessOutput(const QByteArray &msg);
- void onHashrate(const QString &hashrate);
- void onMiningModeChanged(int mode);
- void onNetworkTLSToggled(bool checked);
- void onNetworkTorToggled(bool checked);
- void onXMRigStateChanged(QProcess::ProcessState state);
-
-private slots:
- void onBrowseClicked();
- void onThreadsValueChanged(int date);
- void onPoolChanged(const QString &pool);
- void onXMRigElevationChanged(bool elevated);
-
-signals:
- void miningStarted();
- void miningEnded();
-
-private:
- void showContextMenu(const QPoint &pos);
- void updatePools();
- void printConsoleInfo();
- void setMiningStopped();
- void setMiningStarted();
- bool checkXMRigPath();
-
- QScopedPointer ui;
- Wallet *m_wallet;
- XmRig *m_XMRig;
- QStandardItemModel *m_model;
- QMenu *m_contextMenu;
-
- bool m_isMining = false;
- QStringList m_urls;
- QStringList m_defaultPools{"pool.xmr.pt:9000", "pool.supportxmr.com:9000", "mine.xmrpool.net:443", "xmrpool.eu:9999", "xmr-eu1.nanopool.org:14433","monerohash.com:9999"};
-};
-
-#endif // FEATHER_XMRWIDGET_H
diff --git a/src/plugins/xmrig/XMRigWidget.ui b/src/plugins/xmrig/XMRigWidget.ui
deleted file mode 100644
index 9acf10b0..00000000
--- a/src/plugins/xmrig/XMRigWidget.ui
+++ /dev/null
@@ -1,533 +0,0 @@
-
-
- XMRigWidget
-
-
-
- 0
- 0
- 1329
- 540
-
-
-
- Form
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
- -
-
-
- 1
-
-
-
- Status
-
-
-
-
-
-
- QFrame::Shape::NoFrame
-
-
- QFrame::Shadow::Plain
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- true
-
-
-
- -
-
-
-
-
-
- Clear
-
-
-
- -
-
-
- auto-scroll
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- Mining at
-
-
-
- -
-
-
- Stop
-
-
-
- -
-
-
- Start mining
-
-
-
-
-
-
-
-
-
-
-
-
- Settings
-
-
- -
-
-
- QFrame::Shape::StyledPanel
-
-
- QFrame::Shadow::Raised
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- XMRig executable:
-
-
-
- -
-
-
-
-
-
- /path/to/xmrig
-
-
-
- -
-
-
- Browse
-
-
-
-
-
- -
-
-
- Run as admin/root:
-
-
-
- -
-
-
-
-
-
- Yes
-
-
-
- -
-
-
- No
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- CPU threads:
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
- Mining mode:
-
-
-
- -
-
-
-
-
-
-
-
- Pool mining
-
-
- -
-
- Solo mining
-
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- Pool/node address:
-
-
-
- -
-
-
-
-
-
- QFrame::Shape::NoFrame
-
-
- QFrame::Shadow::Plain
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- -
-
-
- Configure
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 414
- 20
-
-
-
-
-
-
-
- -
-
-
- QFrame::Shape::NoFrame
-
-
- QFrame::Shadow::Plain
-
-
-
- 0
-
-
- 0
-
-
- 0
-
-
-
-
-
- 127.0.0.1:18081
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 173
- 20
-
-
-
-
-
-
-
-
-
- -
-
-
- Network settings:
-
-
-
- -
-
-
-
-
-
- Secure connection (TLS)
-
-
-
- -
-
-
- Connect via Tor
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- 40
- 20
-
-
-
-
-
-
- -
-
-
- Receiving address:
-
-
-
- -
-
-
-
-
-
- -
-
-
- Use primary address
-
-
-
-
-
- -
-
-
- Password (optional):
-
-
-
- -
-
-
- -
-
-
- Extra command-line options:
-
-
-
- -
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- 20
- 0
-
-
-
-
-
-
-
-
- Downloads
-
-
- -
-
-
-
-
-
- Latest version:
-
-
-
- -
-
-
- false
-
-
- (right-click to download)
-
-
- Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
-
-
-
-
-
- -
-
-
- Qt::ContextMenuPolicy::CustomContextMenu
-
-
- QAbstractItemView::EditTrigger::NoEditTriggers
-
-
- QAbstractItemView::SelectionMode::SingleSelection
-
-
- QAbstractItemView::SelectionBehavior::SelectRows
-
-
- false
-
-
- false
-
-
-
-
-
-
-
-
-
-
-
- InfoFrame
- QFrame
-
- 1
-
-
-
-
-
- linkClicked()
-
-
diff --git a/src/plugins/xmrig/xmrig.cpp b/src/plugins/xmrig/xmrig.cpp
deleted file mode 100644
index 7070c4b5..00000000
--- a/src/plugins/xmrig/xmrig.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#include
-#include
-
-#include "utils/config.h"
-#include "utils/Utils.h"
-#include "xmrig.h"
-#include "utils/TorManager.h"
-
-XmRig::XmRig(const QString &configDir, QObject *parent)
- : QObject(parent)
- , m_process(new QProcess(this))
-{
- m_process->setProcessChannelMode(QProcess::MergedChannels);
- connect(m_process, &QProcess::readyReadStandardOutput, this, &XmRig::handleProcessOutput);
- connect(m_process, &QProcess::errorOccurred, this, &XmRig::handleProcessError);
- connect(m_process, &QProcess::stateChanged, this, &XmRig::onStateChanged);
-}
-
-void XmRig::stop() {
- qDebug() << m_process->processId();
- if (m_process->state() == QProcess::Running) {
-#if defined(Q_OS_WIN)
- m_process->kill(); // https://doc.qt.io/qt-5/qprocess.html#terminate
-#elif defined(Q_OS_LINUX)
- if (m_elevated) {
- m_killProcess.start("pkexec", QStringList() << "kill" << QString::number(m_process->processId()));
- return;
- }
-#endif
- m_process->terminate();
- }
-}
-
-void XmRig::start(const QString &path, int threads, const QString &address, const QString &username,
- const QString &password, bool tor, bool tls, bool elevated, bool solo, const QStringList &extraOptions)
-{
- m_elevated = elevated;
-
- auto state = m_process->state();
- if (state == QProcess::ProcessState::Running || state == QProcess::ProcessState::Starting) {
- emit error("Can't start XMRig, already running or starting");
- return;
- }
-
- if (path.isEmpty()) {
- emit error("XmRig->Start path parameter missing.");
- return;
- }
-
- if (!Utils::fileExists(path)) {
- emit error(QString("Path to XMRig binary invalid; file does not exist: %1").arg(path));
- return;
- }
-
- QStringList arguments;
- if (m_elevated) {
- arguments << path;
- }
- arguments << "-o" << address;
- arguments << "-u" << username;
- if (!password.isEmpty()) {
- arguments << "-p" << password;
- }
- arguments << "--no-color";
- arguments << "-t" << QString::number(threads);
- if (tor) {
- QString host = conf()->get(Config::socks5Host).toString();
- QString port = conf()->get(Config::socks5Port).toString();
- if (!torManager()->isLocalTor()) {
- host = torManager()->featherTorHost;
- port = QString::number(torManager()->featherTorPort);
- }
- arguments << "-x" << QString("%1:%2").arg(host, port);
- }
- if (tls) {
- arguments << "--tls";
- }
- if (solo) {
- arguments << "--daemon";
- }
- arguments += extraOptions;
-
- QString cmd = QString("%1 %2").arg(path, arguments.join(" "));
- emit output(cmd.toUtf8());
-
- if (m_elevated) {
- m_process->start("pkexec", arguments);
- } else {
- m_process->start(path, arguments);
- }
-}
-
-void XmRig::onStateChanged(QProcess::ProcessState state) {
- emit stateChanged(state);
-
- if (state == QProcess::ProcessState::Running) {
- emit output("XMRig started");
- }
-
- else if (state == QProcess::ProcessState::NotRunning) {
- emit output("XMRig stopped");
- }
-}
-
-void XmRig::handleProcessOutput() {
- QByteArray _output = m_process->readAllStandardOutput();
- if(_output.contains("miner") && _output.contains("speed")) {
- // detect hashrate
- auto str = Utils::barrayToString(_output);
- auto spl = str.mid(str.indexOf("speed")).split(" ");
- auto rate = spl.at(2) + "H/s";
- qDebug() << "mining hashrate: " << rate;
- emit hashrate(rate);
- }
-
- emit output(_output);
-}
-
-void XmRig::handleProcessError(QProcess::ProcessError err) {
- if (err == QProcess::ProcessError::Crashed)
- emit error("XMRig crashed or killed");
- else if (err == QProcess::ProcessError::FailedToStart) {
- auto path = conf()->get(Config::xmrigPath).toString();
- emit error(QString("XMRig binary failed to start: %1").arg(path));
- }
-}
diff --git a/src/plugins/xmrig/xmrig.h b/src/plugins/xmrig/xmrig.h
deleted file mode 100644
index 244f0d3c..00000000
--- a/src/plugins/xmrig/xmrig.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// SPDX-License-Identifier: BSD-3-Clause
-// SPDX-FileCopyrightText: The Monero Project
-
-#ifndef FEATHER_XMRIG_H
-#define FEATHER_XMRIG_H
-
-#include
-
-class XmRig : public QObject
-{
-Q_OBJECT
-
-public:
- explicit XmRig(const QString &configDir, QObject *parent = nullptr);
-
- void start(const QString &path, int threads, const QString &address, const QString &username, const QString &password, bool tor = false, bool tls = true, bool elevated = false, bool solo = false, const QStringList &extraOptions = {});
- void stop();
-
-signals:
- void error(const QString &msg);
- void output(const QByteArray &data);
- void hashrate(const QString &rate);
- void stateChanged(QProcess::ProcessState state);
-
-private slots:
- void onStateChanged(QProcess::ProcessState);
- void handleProcessOutput();
- void handleProcessError(QProcess::ProcessError error);
-
-private:
- QProcess *m_process;
- QProcess m_killProcess;
- bool m_elevated;
-};
-
-#endif //FEATHER_XMRIG_H
diff --git a/src/utils/config.cpp b/src/utils/config.cpp
index 433891ab..77eec2be 100644
--- a/src/utils/config.cpp
+++ b/src/utils/config.cpp
@@ -60,17 +60,6 @@ static const QHash configStrings = {
{Config::showChangeAddresses,{QS("showChangeAddresses"), false}},
{Config::showAddressIndex,{QS("showAddressIndex"), true}},
{Config::showAddressLabels,{QS("showAddressLabels"), true}},
-
- // Mining
- {Config::miningMode,{QS("miningMode"), Config::MiningMode::Pool}},
- {Config::xmrigPath,{QS("xmrigPath"), ""}},
- {Config::xmrigElevated,{QS("xmrigElevated"), false}},
- {Config::xmrigThreads,{QS("xmrigThreads"), 1}},
- {Config::xmrigPool,{QS("xmrigPool"), "pool.xmr.pt:9000"}},
- {Config::xmrigDaemon,{QS("xmrigDaemon"), "127.0.0.1:18081"}},
- {Config::xmrigNetworkTLS,{QS("xmrigNetworkTLS"), true}},
- {Config::xmrigNetworkTor,{QS("xmrigNetworkTor"), false}},
- {Config::pools,{QS("pools"), {}}},
// Settings
{Config::lastSettingsPage, {QS("lastSettingsPage"), 0}},
@@ -135,7 +124,7 @@ static const QHash configStrings = {
{Config::useLocalTor, {QS("useLocalTor"), false}},
{Config::initSyncThreshold, {QS("initSyncThreshold"), 360}},
- {Config::enabledPlugins, {QS("enabledPlugins"), QStringList{"tickers", "crowdfunding", "bounties", "revuo", "calc", "xmrig"}}},
+ {Config::enabledPlugins, {QS("enabledPlugins"), QStringList{"tickers", "crowdfunding", "bounties", "revuo", "calc"}}},
{Config::restartRequired, {QS("restartRequired"), false}},
{Config::tickers, {QS("tickers"), QStringList{"XMR", "BTC", "XMR/BTC"}}},
diff --git a/src/utils/config.h b/src/utils/config.h
index a4fc86c7..998254b5 100644
--- a/src/utils/config.h
+++ b/src/utils/config.h
@@ -60,17 +60,6 @@ public:
showAddressIndex,
showAddressLabels,
- // Mining
- miningMode,
- xmrigPath,
- xmrigElevated,
- xmrigThreads,
- xmrigPool,
- xmrigDaemon,
- xmrigNetworkTLS,
- xmrigNetworkTor,
- pools,
-
// Settings
lastSettingsPage,