Compare commits
115 Commits
f083d74eae
...
858a76f0b4
@ -1,9 +1,12 @@
|
||||
[submodule "monero"]
|
||||
path = monero
|
||||
url = https://git.wownero.com/feather/monero.git
|
||||
url = https://git.wownero.com/feather/wownero.git
|
||||
[submodule "contrib/torsocks"]
|
||||
path = contrib/torsocks
|
||||
url = https://git.torproject.org/torsocks.git
|
||||
[submodule "contrib/tor"]
|
||||
path = contrib/tor
|
||||
url = https://git.torproject.org/tor.git
|
||||
[submodule "contrib/KDMacTouchBar"]
|
||||
path = contrib/KDMacTouchBar
|
||||
url = https://github.com/KDAB/KDMacTouchBar.git
|
||||
|
@ -0,0 +1 @@
|
||||
Subproject commit 470c4316460bb8c3e23bfa37c79c8621ef3f1b4c
|
@ -1 +1 @@
|
||||
Subproject commit a39fd7ea978053929da63dcdb8073806573be5ba
|
||||
Subproject commit 9d6a7bcc14e512ccb04f5f286c1710fca19e4762
|
@ -0,0 +1,226 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#include "MorphTokenWidget.h"
|
||||
#include "ui_MorphTokenWidget.h"
|
||||
#include "mainwindow.h"
|
||||
#include "qrcode/QrCode.h"
|
||||
#include "dialog/qrcodedialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
MorphTokenWidget::MorphTokenWidget(QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::MorphTokenWidget)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
m_ctx = MainWindow::getContext();
|
||||
|
||||
m_network = new UtilsNetworking(this->m_ctx->network);
|
||||
m_api = new MorphTokenApi(this, m_network);
|
||||
|
||||
connect(ui->btnCreateTrade, &QPushButton::clicked, this, &MorphTokenWidget::createTrade);
|
||||
connect(ui->btn_lookupTrade, &QPushButton::clicked, this, &MorphTokenWidget::lookupTrade);
|
||||
connect(ui->btn_getRates, &QPushButton::clicked, this, &MorphTokenWidget::getRates);
|
||||
|
||||
connect(m_api, &MorphTokenApi::ApiResponse, this, &MorphTokenWidget::onApiResponse);
|
||||
|
||||
connect(ui->combo_From, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index){
|
||||
this->displayRate();
|
||||
ui->label_refundAddress->setText(QString("Refund address (%1):").arg(ui->combo_From->currentText()));
|
||||
});
|
||||
connect(ui->combo_To, QOverload<int>::of(&QComboBox::currentIndexChanged), [this](int index){
|
||||
this->displayRate();
|
||||
ui->label_destinationAddress->setText(QString("Destination address (%1):").arg(ui->combo_To->currentText()));
|
||||
});
|
||||
|
||||
connect(ui->check_autorefresh, &QCheckBox::toggled, [this](bool toggled){
|
||||
m_countdown = 30;
|
||||
toggled ? m_countdownTimer.start(1000) : m_countdownTimer.stop();
|
||||
ui->check_autorefresh->setText("Autorefresh");
|
||||
});
|
||||
connect(&m_countdownTimer, &QTimer::timeout, this, &MorphTokenWidget::onCountdown);
|
||||
|
||||
connect(ui->line_Id, &QLineEdit::textChanged, [this](const QString &text){
|
||||
ui->btn_lookupTrade->setEnabled(!text.isEmpty());
|
||||
ui->check_autorefresh->setEnabled(!text.isEmpty());
|
||||
});
|
||||
|
||||
// Default to BTC -> XMR
|
||||
ui->combo_From->setCurrentIndex(1);
|
||||
ui->combo_To->setCurrentIndex(0);
|
||||
|
||||
ui->label_rate->setVisible(false);
|
||||
m_ratesTimer.setSingleShot(true);
|
||||
connect(&m_ratesTimer, &QTimer::timeout, [this]{
|
||||
ui->label_rate->setVisible(false);
|
||||
});
|
||||
|
||||
ui->qrCode->setVisible(false);
|
||||
ui->label_depositAddress->setVisible(false);
|
||||
connect(ui->qrCode, &ClickableLabel::clicked, this, &MorphTokenWidget::showQrCodeDialog);
|
||||
|
||||
ui->tabWidget->setTabVisible(2, false);
|
||||
}
|
||||
|
||||
void MorphTokenWidget::createTrade() {
|
||||
QString inputAsset = ui->combo_From->currentText();
|
||||
QString outputAsset = ui->combo_To->currentText();
|
||||
QString refundAddress = ui->line_refundAddress->text();
|
||||
QString destinationAddress = ui->line_destinationAddress->text();
|
||||
|
||||
m_api->createTrade(inputAsset, outputAsset, refundAddress, destinationAddress);
|
||||
}
|
||||
|
||||
void MorphTokenWidget::lookupTrade() {
|
||||
QString morphId = ui->line_Id->text();
|
||||
|
||||
if (!morphId.isEmpty())
|
||||
m_api->getTrade(morphId);
|
||||
}
|
||||
|
||||
void MorphTokenWidget::getRates() {
|
||||
m_api->getRates();
|
||||
}
|
||||
|
||||
void MorphTokenWidget::onApiResponse(const MorphTokenApi::MorphTokenResponse &resp) {
|
||||
if (!resp.ok) {
|
||||
ui->check_autorefresh->setChecked(false);
|
||||
QMessageBox::warning(this, "MorphToken error", QString("Request failed:\n\n%1").arg(resp.message));
|
||||
return;
|
||||
}
|
||||
|
||||
ui->debugInfo->setPlainText(QJsonDocument(resp.obj).toJson(QJsonDocument::Indented));
|
||||
|
||||
bool shouldShowQr = (resp.endpoint == MorphTokenApi::Endpoint::CREATE_TRADE || resp.endpoint == MorphTokenApi::Endpoint::GET_TRADE);
|
||||
ui->qrCode->setVisible(shouldShowQr);
|
||||
ui->label_depositAddress->setVisible(shouldShowQr);
|
||||
|
||||
if (resp.endpoint == MorphTokenApi::Endpoint::CREATE_TRADE || resp.endpoint == MorphTokenApi::Endpoint::GET_TRADE) {
|
||||
ui->tabWidget->setCurrentIndex(1);
|
||||
ui->line_Id->setText(resp.obj.value("id").toString());
|
||||
|
||||
auto obj = resp.obj;
|
||||
auto input = obj["input"].toObject();
|
||||
auto output = obj["output"].toArray()[0].toObject();
|
||||
QString state = obj.value("state").toString();
|
||||
QString statusText;
|
||||
|
||||
ui->trade->setTitle(QString("Trade (%1)").arg(state));
|
||||
|
||||
statusText += QString("Morph ID: %1\n\n").arg(obj["id"].toString());
|
||||
|
||||
if (state == "PENDING") {
|
||||
statusText += QString("Waiting for a deposit, send %1 to %2\n").arg(input["asset"].toString(),
|
||||
input["deposit_address"].toString());
|
||||
statusText += QString("Rate: 1 %1 -> %2 %3\n\n").arg(input["asset"].toString(),
|
||||
output["seen_rate"].toString(),
|
||||
output["asset"].toString());
|
||||
statusText += "Limits:\n";
|
||||
statusText += QString(" Minimum amount accepted: %1 %2\n").arg(formatAmount(input["asset"].toString(), input["limits"].toObject()["min"].toDouble()),
|
||||
input["asset"].toString());
|
||||
statusText += QString(" Maximum amount accepted: %1 %2\n").arg(formatAmount(input["asset"].toString(), input["limits"].toObject()["max"].toDouble()),
|
||||
input["asset"].toString());
|
||||
statusText += QString("\nSend a single deposit. If the amount is outside the limits, a refund will happen.");
|
||||
|
||||
m_depositAddress = input["deposit_address"].toString();
|
||||
|
||||
const QrCode qrc(m_depositAddress, QrCode::Version::AUTO, QrCode::ErrorCorrectionLevel::MEDIUM);
|
||||
int width = ui->qrCode->width();
|
||||
if (qrc.isValid()) {
|
||||
ui->qrCode->setPixmap(qrc.toPixmap(1).scaled(width, width, Qt::KeepAspectRatio));
|
||||
}
|
||||
} else if (state == "PROCESSING" || state == "TRADING" || state == "CONFIRMING") {
|
||||
if (state == "CONFIRMING") {
|
||||
statusText += QString("Waiting for confirmations\n");
|
||||
} else if (state == "TRADING") {
|
||||
statusText += QString("Your transaction has been received and is confirmed. MorphToken is now executing your trade.\n"
|
||||
"Usually this step takes no longer than a minute, "
|
||||
"but in rare cases it can take a couple hours.\n"
|
||||
"Wait a bit before contacting support.\n");
|
||||
}
|
||||
statusText += QString("Converting %1 to %2\n").arg(input["asset"].toString(), output["asset"].toString());
|
||||
statusText += QString("Sending to %1\n").arg(output["address"].toString());
|
||||
statusText += QString("Stuck? Contact support at contact@morphtoken.com");
|
||||
} else if (state == "COMPLETE") {
|
||||
if (output["txid"].toString().isEmpty()) {
|
||||
statusText += QString("MorphToken is sending your transaction.\n");
|
||||
statusText += QString("MorphToken will send %1 %2 to %2").arg(this->formatAmount(output["asset"].toString(), output["converted_amount"].toDouble() - output["network_fee"].toObject()["fee"].toDouble()),
|
||||
output["asset"].toString(),
|
||||
output["address"].toString());
|
||||
} else {
|
||||
statusText += QString("Sent %1 %2 to %3\ntxid: {}").arg(this->formatAmount(output["asset"].toString(), output["converted_amount"].toDouble() - output["network_fee"].toObject()["fee"].toDouble()),
|
||||
output["asset"].toString(),
|
||||
output["address"].toString(),
|
||||
output["txid"].toString());
|
||||
}
|
||||
} else if (state == "PROCESSING_REFUND" || state == "COMPLETE_WITH_REFUND") {
|
||||
statusText += QString("MorphToken will refund %1 %2\nReason: %3\n").arg(obj["final_amount"].toString(),
|
||||
obj["asset"].toString(),
|
||||
obj["reason"].toString());
|
||||
|
||||
if (obj.contains("txid")) {
|
||||
statusText += QString("txid: %1").arg(obj["txid"].toString());
|
||||
}
|
||||
} else if (state == "COMPLETE_WITHOUT_REFUND") {
|
||||
statusText += "Deposit amount below network fee, too small to refund.";
|
||||
}
|
||||
|
||||
ui->label_status->setText(statusText);
|
||||
} else if (resp.endpoint == MorphTokenApi::Endpoint::GET_RATES) {
|
||||
m_rates = resp.obj.value("data").toObject();
|
||||
this->displayRate();
|
||||
ui->label_rate->setVisible(true);
|
||||
m_ratesTimer.start(120 * 1000);
|
||||
}
|
||||
|
||||
if (resp.endpoint == MorphTokenApi::Endpoint::CREATE_TRADE) {
|
||||
QMessageBox::information(this, "MorphToken", "Trade created!\n\nMake sure to save your Morph ID. You may need it in case something goes wrong.");
|
||||
}
|
||||
}
|
||||
|
||||
void MorphTokenWidget::onCountdown() {
|
||||
if (m_countdown > 0) {
|
||||
m_countdown -= 1;
|
||||
} else {
|
||||
this->lookupTrade();
|
||||
m_countdown = 30;
|
||||
}
|
||||
ui->check_autorefresh->setText(QString("Autorefresh (%1)").arg(m_countdown));
|
||||
}
|
||||
|
||||
void MorphTokenWidget::displayRate() {
|
||||
QString inputAsset = ui->combo_From->currentText();
|
||||
QString outputAsset = ui->combo_To->currentText();
|
||||
QString outputRate = m_rates.value(inputAsset).toObject().value(outputAsset).toString("1");
|
||||
|
||||
QString rateStr = QString("1 %1 -> %2 %3").arg(inputAsset, outputRate, outputAsset);
|
||||
ui->label_rate->setText(rateStr);
|
||||
}
|
||||
|
||||
void MorphTokenWidget::showQrCodeDialog() {
|
||||
QrCode qr(m_depositAddress, QrCode::Version::AUTO, QrCode::ErrorCorrectionLevel::HIGH);
|
||||
auto *dialog = new QrCodeDialog(this, qr, "Deposit address");
|
||||
dialog->exec();
|
||||
dialog->deleteLater();
|
||||
}
|
||||
|
||||
QString MorphTokenWidget::formatAmount(const QString &asset, double amount) {
|
||||
double displayAmount;
|
||||
double div;
|
||||
|
||||
if (asset == "ETH")
|
||||
div = 1e18;
|
||||
else if (asset == "XMR")
|
||||
div = 1e12;
|
||||
else
|
||||
div = 1e8;
|
||||
|
||||
displayAmount = amount / div;
|
||||
|
||||
return QString::number(displayAmount, 'f', 8);
|
||||
}
|
||||
|
||||
MorphTokenWidget::~MorphTokenWidget() {
|
||||
delete ui;
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#ifndef FEATHER_MORPHTOKENWIDGET_H
|
||||
#define FEATHER_MORPHTOKENWIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include "appcontext.h"
|
||||
#include "utils/MorphTokenApi.h"
|
||||
|
||||
namespace Ui {
|
||||
class MorphTokenWidget;
|
||||
}
|
||||
|
||||
class MorphTokenWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MorphTokenWidget(QWidget *parent = nullptr);
|
||||
~MorphTokenWidget() override;
|
||||
|
||||
private:
|
||||
void createTrade();
|
||||
void lookupTrade();
|
||||
void getRates();
|
||||
void onApiResponse(const MorphTokenApi::MorphTokenResponse &resp);
|
||||
|
||||
void onCountdown();
|
||||
void displayRate();
|
||||
void showQrCodeDialog();
|
||||
|
||||
QString formatAmount(const QString &asset, double amount);
|
||||
|
||||
Ui::MorphTokenWidget *ui;
|
||||
|
||||
AppContext *m_ctx;
|
||||
MorphTokenApi *m_api;
|
||||
UtilsNetworking *m_network;
|
||||
QTimer m_countdownTimer;
|
||||
int m_countdown = 30;
|
||||
QJsonObject m_rates;
|
||||
QTimer m_ratesTimer;
|
||||
QString m_depositAddress;
|
||||
};
|
||||
|
||||
#endif //FEATHER_MORPHTOKENWIDGET_H
|
@ -0,0 +1,423 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MorphTokenWidget</class>
|
||||
<widget class="QWidget" name="MorphTokenWidget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1036</width>
|
||||
<height>614</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tabCreateTrade">
|
||||
<attribute name="title">
|
||||
<string>Create trade</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>From:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="combo_From">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>XMR</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>BTC</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>ETH</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>BCH</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>LTC</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>DASH</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>To:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="combo_To">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>XMR</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>BTC</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>ETH</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>BCH</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>LTC</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>DASH</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_rate">
|
||||
<property name="text">
|
||||
<string>rate</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_refundAddress">
|
||||
<property name="text">
|
||||
<string>Refund address (XMR):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="line_refundAddress"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_destinationAddress">
|
||||
<property name="text">
|
||||
<string>Destination address (XMR):</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="line_destinationAddress"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Powered by MorphToken.com</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_getRates">
|
||||
<property name="text">
|
||||
<string>Get Rates</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btnCreateTrade">
|
||||
<property name="text">
|
||||
<string>Create Trade</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabLookupTrade">
|
||||
<attribute name="title">
|
||||
<string>Lookup trade</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Morph ID or MorphToken deposit address:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="line_Id"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="check_autorefresh">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Autorefresh</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_lookupTrade">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Lookup trade</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="trade">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Trade</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_status">
|
||||
<property name="text">
|
||||
<string>No trade loaded.</string>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="ClickableLabel" name="qrCode">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>qrcode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_depositAddress">
|
||||
<property name="text">
|
||||
<string>Deposit address</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tabDebug">
|
||||
<attribute name="title">
|
||||
<string>Debug</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="debugInfo">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>ClickableLabel</class>
|
||||
<extends>QLabel</extends>
|
||||
<header>components.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -0,0 +1,14 @@
|
||||
[Desktop Entry]
|
||||
Comment=Lightweight Wownero Wallet
|
||||
Exec=feather-wow
|
||||
GenericName[en_US]=Wownero Wallet
|
||||
GenericName=Wownero Wallet
|
||||
Icon=feather-wow
|
||||
Name[en_US]=Feather-WOW
|
||||
Name=Feather-WOW
|
||||
Categories=Finance;Network;
|
||||
StartupNotify=false
|
||||
StartupWMClass=feather
|
||||
Terminal=false
|
||||
Type=Application
|
||||
MimeType=x-scheme-handler/wownero;
|
@ -1,14 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Comment=Lightweight Monero Wallet
|
||||
Exec=feather
|
||||
GenericName[en_US]=Monero Wallet
|
||||
GenericName=Monero Wallet
|
||||
Icon=feather
|
||||
Name[en_US]=Feather
|
||||
Name=Feather
|
||||
Categories=Finance;Network;
|
||||
StartupNotify=false
|
||||
StartupWMClass=feather
|
||||
Terminal=false
|
||||
Type=Application
|
||||
MimeType=x-scheme-handler/monero;
|
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.9 KiB |
Before Width: | Height: | Size: 801 B After Width: | Height: | Size: 801 B |
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 706 KiB After Width: | Height: | Size: 706 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 110 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 93 KiB |
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 151 KiB |
@ -1,444 +0,0 @@
|
||||
1518932025:1
|
||||
1519057016:1500
|
||||
1519148374:3000
|
||||
1519251680:4500
|
||||
1519344568:6000
|
||||
1519443436:7500
|
||||
1519538388:9000
|
||||
1519630287:10500
|
||||
1519706564:12000
|
||||
1519797372:13500
|
||||
1519887275:15000
|
||||
1519977816:16500
|
||||
1520068127:18000
|
||||
1520163067:19500
|
||||
1520267595:21000
|
||||
1520378423:22500
|
||||
1520470528:24000
|
||||
1520547672:25500
|
||||
1520637599:27000
|
||||
1520727714:28500
|
||||
1520817129:30000
|
||||
1520907017:31500
|
||||
1521042482:33000
|
||||
1521203259:34500
|
||||
1521379791:36000
|
||||
1521565539:37500
|
||||
1521768004:39000
|
||||
1521952047:40500
|
||||
1522127660:42000
|
||||
1522284923:43500
|
||||
1522510139:45000
|
||||
1522676022:46500
|
||||
1522871613:48000
|
||||
1522969561:49500
|
||||
1523145200:51000
|
||||
1523316302:52500
|
||||
1523550884:54000
|
||||
1523758049:55500
|
||||
1523917524:57000
|
||||
1524106084:58500
|
||||
1524290437:60000
|
||||
1524464139:61500
|
||||
1524728732:63000
|
||||
1524905041:64500
|
||||
1525093135:66000
|
||||
1525239917:67500
|
||||
1525443579:69000
|
||||
1525663214:70500
|
||||
1525839621:72000
|
||||
1525989826:73500
|
||||
1526182919:75000
|
||||
1526437405:76500
|
||||
1526649137:78000
|
||||
1526812889:79500
|
||||
1526991726:81000
|
||||
1527184073:82500
|
||||
1527351889:84000
|
||||
1527567839:85500
|
||||
1527759754:87000
|
||||
1527916443:88500
|
||||
1528110008:90000
|
||||
1528285005:91500
|
||||
1528486806:93000
|
||||
1528666327:94500
|
||||
1528872096:96000
|
||||
1529015390:97500
|
||||
1529205809:99000
|
||||
1529384415:100500
|
||||
1529595764:102000
|
||||
1529770640:103500
|
||||
1529950955:105000
|
||||
1530115141:106500
|
||||
1530306273:108000
|
||||
1530491510:109500
|
||||
1530677550:111000
|
||||
1530823854:112500
|
||||
1531032372:114000
|
||||
1531175619:115500
|
||||
1531371373:117000
|
||||
1531541897:118500
|
||||
1531706629:120000
|
||||
1531888223:121500
|
||||
1532104373:123000
|
||||
1532314129:124500
|
||||
1532503060:126000
|
||||
1532663651:127500
|
||||
1532894128:129000
|
||||
1533095950:130500
|
||||
1533302631:132000
|
||||
1533464469:133500
|
||||
1533670723:135000
|
||||
1533833911:136500
|
||||
1534030841:138000
|
||||
1534203160:139500
|
||||
1534397055:141000
|
||||
1534577048:142500
|
||||
1534752236:144000
|
||||
1534931462:145500
|
||||
1535119263:147000
|
||||
1535300364:148500
|
||||
1535471540:150000
|
||||
1535640429:151500
|
||||
1535836082:153000
|
||||
1536059510:154500
|
||||
1536209710:156000
|
||||
1536366875:157500
|
||||
1536560444:159000
|
||||
1536749043:160500
|
||||
1536926345:162000
|
||||
1537105693:163500
|
||||
1537296613:165000
|
||||
1537501175:166500
|
||||
1537667740:168000
|
||||
1537844801:169500
|
||||
1538000228:171000
|
||||
1538199137:172500
|
||||
1538418406:174000
|
||||
1538612473:175500
|
||||
1538979696:177000
|
||||
1539147054:178500
|
||||
1539303989:180000
|
||||
1539488395:181500
|
||||
1539652212:183000
|
||||
1539819281:184500
|
||||
1539971301:186000
|
||||
1540146343:187500
|
||||
1540330288:189000
|
||||
1540505588:190500
|
||||
1540688044:192000
|
||||
1540869374:193500
|
||||
1541049379:195000
|
||||
1541223210:196500
|
||||
1541393586:198000
|
||||
1541577202:199500
|
||||
1541762094:201000
|
||||
1541909862:202500
|
||||
1542199063:204000
|
||||
1542399873:205500
|
||||
1542579333:207000
|
||||
1542763985:208500
|
||||
1542947442:210000
|
||||
1543124804:211500
|
||||
1543323933:213000
|
||||
1543489307:214500
|
||||
1543672244:216000
|
||||
1543837576:217500
|
||||
1544042420:219000
|
||||
1544222096:220500
|
||||
1544402628:222000
|
||||
1544546843:223500
|
||||
1544730464:225000
|
||||
1545134663:226500
|
||||
1545301874:228000
|
||||
1545488939:229500
|
||||
1545664263:231000
|
||||
1545834607:232500
|
||||
1546014630:234000
|
||||
1546192930:235500
|
||||
1546373750:237000
|
||||
1546556089:238500
|
||||
1546738764:240000
|
||||
1546917228:241500
|
||||
1547091360:243000
|
||||
1547272679:244500
|
||||
1547463907:246000
|
||||
1547636722:247500
|
||||
1547817060:249000
|
||||
1548001021:250500
|
||||
1548185375:252000
|
||||
1548380319:253500
|
||||
1548555267:255000
|
||||
1548741069:256500
|
||||
1548926544:258000
|
||||
1549140801:259500
|
||||
1549297081:261000
|
||||
1549478379:262500
|
||||
1549651888:264000
|
||||
1549860339:265500
|
||||
1550024455:267000
|
||||
1550217332:268500
|
||||
1551312389:270000
|
||||
1551527936:271500
|
||||
1551665288:273000
|
||||
1551836443:274500
|
||||
1552026339:276000
|
||||
1552218441:277500
|
||||
1552443760:279000
|
||||
1552680291:280500
|
||||
1552854334:282000
|
||||
1553030527:283500
|
||||
1553211359:285000
|
||||
1553385763:286500
|
||||
1553588198:288000
|
||||
1553760642:289500
|
||||
1553937158:291000
|
||||
1554121990:292500
|
||||
1554302691:294000
|
||||
1554479953:295500
|
||||
1554666762:297000
|
||||
1554850956:298500
|
||||
1555057081:300000
|
||||
1555228611:301500
|
||||
1555400592:303000
|
||||
1555615005:304500
|
||||
1555789135:306000
|
||||
1555995570:307500
|
||||
1556183867:309000
|
||||
1556362195:310500
|
||||
1556541232:312000
|
||||
1556728140:313500
|
||||
1556903453:315000
|
||||
1557065264:316500
|
||||
1557273415:318000
|
||||
1557443047:319500
|
||||
1557618850:321000
|
||||
1557798876:322500
|
||||
1557976530:324000
|
||||
1558172356:325500
|
||||
1558356032:327000
|
||||
1558534222:328500
|
||||
1558719934:330000
|
||||
1558892036:331500
|
||||
1559075695:333000
|
||||
1559253052:334500
|
||||
1559462339:336000
|
||||
1559647394:337500
|
||||
1559827424:339000
|
||||
1560002042:340500
|
||||
1560189126:342000
|
||||
1560343483:343500
|
||||
1560548477:345000
|
||||
1560709613:346500
|
||||
1560888640:348000
|
||||
1561072261:349500
|
||||
1561249189:351000
|
||||
1561433494:352500
|
||||
1561609875:354000
|
||||
1561789136:355500
|
||||
1561971530:357000
|
||||
1562146235:358500
|
||||
1562283612:360000
|
||||
1562536678:361500
|
||||
1562727970:363000
|
||||
1562896064:364500
|
||||
1563081360:366000
|
||||
1563222147:367500
|
||||
1563471753:369000
|
||||
1563648133:370500
|
||||
1563844968:372000
|
||||
1564019071:373500
|
||||
1564194349:375000
|
||||
1564378444:376500
|
||||
1564557884:378000
|
||||
1564733144:379500
|
||||
1564931656:381000
|
||||
1565088150:382500
|
||||
1565272766:384000
|
||||
1565457895:385500
|
||||
1565632566:387000
|
||||
1565824568:388500
|
||||
1565992971:390000
|
||||
1566155025:391500
|
||||
1566345274:393000
|
||||
1566534162:394500
|
||||
1566736618:396000
|
||||
1566937517:397500
|
||||
1567128136:399000
|
||||
1567296600:400500
|
||||
1567482630:402000
|
||||
1567671945:403500
|
||||
1567828904:405000
|
||||
1568061755:406500
|
||||
1568241437:408000
|
||||
1568413206:409500
|
||||
1568589427:411000
|
||||
1568777072:412500
|
||||
1568950797:414000
|
||||
1569140033:415500
|
||||
1569321139:417000
|
||||
1569497726:418500
|
||||
1569685524:420000
|
||||
1569858754:421500
|
||||
1570025222:423000
|
||||
1570195891:424500
|
||||
1570412169:426000
|
||||
1570568122:427500
|
||||
1570772965:429000
|
||||
1570968490:430500
|
||||
1571107236:432000
|
||||
1571359933:433500
|
||||
1571520970:435000
|
||||
1571737619:436500
|
||||
1571890574:438000
|
||||
1572104152:439500
|
||||
1572299391:441000
|
||||
1572483040:442500
|
||||
1572663772:444000
|
||||
1572839626:445500
|
||||
1573049256:447000
|
||||
1573229282:448500
|
||||
1573407580:450000
|
||||
1573589178:451500
|
||||
1573735333:453000
|
||||
1573840717:454500
|
||||
1574096272:456000
|
||||
1574280161:457500
|
||||
1574455892:459000
|
||||
1574604632:460500
|
||||
1574809987:462000
|
||||
1574975801:463500
|
||||
1575140569:465000
|
||||
1575422392:466500
|
||||
1575583824:468000
|
||||
1575763253:469500
|
||||
1575944350:471000
|
||||
1576125074:472500
|
||||
1576324269:474000
|
||||
1576508865:475500
|
||||
1576669612:477000
|
||||
1576891906:478500
|
||||
1577078563:480000
|
||||
1577265105:481500
|
||||
1577431370:483000
|
||||
1577744409:484500
|
||||
1577874268:486000
|
||||
1578038130:487500
|
||||
1578231375:489000
|
||||
1578439644:490500
|
||||
1578625982:492000
|
||||
1578808598:493500
|
||||
1578985283:495000
|
||||
1579175621:496500
|
||||
1579347774:498000
|
||||
1579517894:499500
|
||||
1579687667:501000
|
||||
1579868646:502500
|
||||
1580046838:504000
|
||||
1580240961:505500
|
||||
1580428207:507000
|
||||
1580572904:508500
|
||||
1580823996:510000
|
||||
1580994064:511500
|
||||
1581183924:513000
|
||||
1581351893:514500
|
||||
1581521085:516000
|
||||
1581702405:517500
|
||||
1581943619:519000
|
||||
1582098842:520500
|
||||
1582299537:522000
|
||||
1582480013:523500
|
||||
1582659742:525000
|
||||
1582839127:526500
|
||||
1583020057:528000
|
||||
1583266489:529500
|
||||
1583429819:531000
|
||||
1583615548:532500
|
||||
1583785190:534000
|
||||
1584011766:535500
|
||||
1584192961:537000
|
||||
1584342104:538500
|
||||
1584521327:540000
|
||||
1584706894:541500
|
||||
1584883565:543000
|
||||
1585062315:544500
|
||||
1585244138:546000
|
||||
1585427591:547500
|
||||
1585600165:549000
|
||||
1585784601:550500
|
||||
1585961031:552000
|
||||
1586147565:553500
|
||||
1586322716:555000
|
||||
1586513730:556500
|
||||
1586698639:558000
|
||||
1586878453:559500
|
||||
1587062131:561000
|
||||
1587234968:562500
|
||||
1587391529:564000
|
||||
1587591247:565500
|
||||
1587752262:567000
|
||||
1587969335:568500
|
||||
1588148503:570000
|
||||
1588405392:571500
|
||||
1588593609:573000
|
||||
1588778703:574500
|
||||
1588949467:576000
|
||||
1589172941:577500
|
||||
1589358899:579000
|
||||
1589536247:580500
|
||||
1589730950:582000
|
||||
1589882572:583500
|
||||
1590062931:585000
|
||||
1590237283:586500
|
||||
1590430792:588000
|
||||
1590599140:589500
|
||||
1590807968:591000
|
||||
1590987339:592500
|
||||
1591166304:594000
|
||||
1591348974:595500
|
||||
1591542069:597000
|
||||
1591723208:598500
|
||||
1591908870:600000
|
||||
1592060567:601500
|
||||
1592259549:603000
|
||||
1592465269:604500
|
||||
1592647205:606000
|
||||
1592828242:607500
|
||||
1593006687:609000
|
||||
1593201658:610500
|
||||
1593492855:612000
|
||||
1593636856:613500
|
||||
1593811224:615000
|
||||
1594004429:616500
|
||||
1594162422:618000
|
||||
1594348191:619500
|
||||
1594523256:621000
|
||||
1594685351:622500
|
||||
1594890677:624000
|
||||
1595073577:625500
|
||||
1595269373:627000
|
||||
1595477524:628500
|
||||
1595668392:630000
|
||||
1595867552:631500
|
||||
1596043173:633000
|
||||
1596209876:634500
|
||||
1596419711:636000
|
||||
1596600935:637500
|
||||
1596770710:639000
|
||||
1596979435:640500
|
||||
1597172685:642000
|
||||
1597347250:643500
|
||||
1597508807:645000
|
||||
1597698614:646500
|
||||
1597871525:648000
|
||||
1598058524:649500
|
||||
1598368966:651000
|
||||
1598552832:652500
|
||||
1598715002:654000
|
||||
1598902853:655500
|
||||
1599078705:657000
|
||||
1599253008:658500
|
||||
1599430407:660000
|
||||
1599636188:661500
|
||||
1599809533:663000
|
||||
1600001474:664500
|
@ -0,0 +1,170 @@
|
||||
1522624244:1
|
||||
1522919763:1500
|
||||
1523409727:3000
|
||||
1523960364:4500
|
||||
1524369547:6000
|
||||
1524784400:7500
|
||||
1525233663:9000
|
||||
1525687037:10500
|
||||
1526135584:12000
|
||||
1526578718:13500
|
||||
1527063859:15000
|
||||
1527518523:16500
|
||||
1527977555:18000
|
||||
1528436212:19500
|
||||
1528893646:21000
|
||||
1529347707:22500
|
||||
1529812899:24000
|
||||
1530272289:25500
|
||||
1530735091:27000
|
||||
1531195321:28500
|
||||
1531660804:30000
|
||||
1532117133:31500
|
||||
1532568099:33000
|
||||
1533015693:34500
|
||||
1533470854:36000
|
||||
1533923432:37500
|
||||
1534374443:39000
|
||||
1534823621:40500
|
||||
1535290349:42000
|
||||
1535735446:43500
|
||||
1536201310:45000
|
||||
1536655339:46500
|
||||
1537109771:48000
|
||||
1537565159:49500
|
||||
1538015344:51000
|
||||
1538470517:52500
|
||||
1538927269:54000
|
||||
1539379855:55500
|
||||
1539826869:57000
|
||||
1540311781:58500
|
||||
1540788117:60000
|
||||
1541297876:61500
|
||||
1541794302:63000
|
||||
1542407858:64500
|
||||
1543204218:66000
|
||||
1543955252:67500
|
||||
1544703247:69000
|
||||
1545372024:70500
|
||||
1546002226:72000
|
||||
1546636335:73500
|
||||
1547342810:75000
|
||||
1548268561:76500
|
||||
1548921502:78000
|
||||
1549481994:79500
|
||||
1550247894:81000
|
||||
1550743647:82500
|
||||
1551184199:84000
|
||||
1551626083:85500
|
||||
1552086272:87000
|
||||
1552546202:88500
|
||||
1552994646:90000
|
||||
1553451645:91500
|
||||
1553898976:93000
|
||||
1554352300:94500
|
||||
1554801655:96000
|
||||
1555254551:97500
|
||||
1555700170:99000
|
||||
1556151520:100500
|
||||
1556602014:102000
|
||||
1557057709:103500
|
||||
1557508808:105000
|
||||
1557961787:106500
|
||||
1558413175:108000
|
||||
1558860703:109500
|
||||
1559310651:111000
|
||||
1559759587:112500
|
||||
1560207825:114000
|
||||
1560635185:115500
|
||||
1561076902:117000
|
||||
1561514633:118500
|
||||
1561983210:120000
|
||||
1562435722:121500
|
||||
1562903313:123000
|
||||
1563367656:124500
|
||||
1563794760:126000
|
||||
1564249987:127500
|
||||
1564698967:129000
|
||||
1565154467:130500
|
||||
1565606876:132000
|
||||
1566053072:133500
|
||||
1566496455:135000
|
||||
1566940483:136500
|
||||
1567391114:138000
|
||||
1567840593:139500
|
||||
1568290979:141000
|
||||
1568739494:142500
|
||||
1569196321:144000
|
||||
1569643702:145500
|
||||
1570095074:147000
|
||||
1570533207:148500
|
||||
1570991907:150000
|
||||
1571447301:151500
|
||||
1571895478:153000
|
||||
1572343106:154500
|
||||
1572791579:156000
|
||||
1573241814:157500
|
||||
1573692641:159000
|
||||
1574137867:160500
|
||||
1574600312:162000
|
||||
1575051207:163500
|
||||
1575500955:165000
|
||||
1575953057:166500
|
||||
1576401859:168000
|
||||
1576850419:169500
|
||||
1577301553:171000
|
||||
1577753392:172500
|
||||
1578199780:174000
|
||||
1578655276:175500
|
||||
1579104342:177000
|
||||
1579549362:178500
|
||||
1580004525:180000
|
||||
1580451365:181500
|
||||
1580900062:183000
|
||||
1581350016:184500
|
||||
1581795609:186000
|
||||
1582251322:187500
|
||||
1582703447:189000
|
||||
1583152160:190500
|
||||
1583601824:192000
|
||||
1584051198:193500
|
||||
1584499159:195000
|
||||
1584949547:196500
|
||||
1585404000:198000
|
||||
1585843662:199500
|
||||
1586292852:201000
|
||||
1586738236:202500
|
||||
1587201986:204000
|
||||
1587663936:205500
|
||||
1588119101:207000
|
||||
1588586510:208500
|
||||
1589057972:210000
|
||||
1589520509:211500
|
||||
1589974638:213000
|
||||
1590425544:214500
|
||||
1590876865:216000
|
||||
1591326399:217500
|
||||
1591759684:219000
|
||||
1592226165:220500
|
||||
1592681388:222000
|
||||
1593141896:223500
|
||||
1593595859:225000
|
||||
1594048319:226500
|
||||
1594489197:228000
|
||||
1594955184:229500
|
||||
1595408732:231000
|
||||
1595854685:232500
|
||||
1596303095:234000
|
||||
1596732814:235500
|
||||
1597198383:237000
|
||||
1597650820:238500
|
||||
1598099448:240000
|
||||
1598553007:241500
|
||||
1599004645:243000
|
||||
1599459515:244500
|
||||
1599914532:246000
|
||||
1600357718:247500
|
||||
1600811447:249000
|
||||
1601257433:250500
|
||||
1601710572:252000
|
||||
1602154921:253500
|
@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#include "passworddialog.h"
|
||||
#include "ui_passworddialog.h"
|
||||
|
||||
PasswordDialog::PasswordDialog(QWidget *parent, const QString &walletName, bool incorrectPassword)
|
||||
: QDialog(parent)
|
||||
, ui(new Ui::PasswordDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
ui->label_wallet->setText(QString("Please enter password for wallet: %1").arg(walletName));
|
||||
ui->label_incorrectPassword->setVisible(incorrectPassword);
|
||||
|
||||
connect(ui->buttonBox, &QDialogButtonBox::accepted, [this]{
|
||||
password = ui->line_password->text();
|
||||
});
|
||||
|
||||
this->adjustSize();
|
||||
}
|
||||
|
||||
PasswordDialog::~PasswordDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#ifndef FEATHER_PASSWORDDIALOG_H
|
||||
#define FEATHER_PASSWORDDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui {
|
||||
class PasswordDialog;
|
||||
}
|
||||
|
||||
class PasswordDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit PasswordDialog(QWidget *parent, const QString &walletName, bool incorrectPassword);
|
||||
~PasswordDialog() override;
|
||||
|
||||
QString password = "";
|
||||
|
||||
private:
|
||||
Ui::PasswordDialog *ui;
|
||||
};
|
||||
|
||||
#endif //FEATHER_PASSWORDDIALOG_H
|
@ -0,0 +1,85 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>PasswordDialog</class>
|
||||
<widget class="QDialog" name="PasswordDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>832</width>
|
||||
<height>158</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Password required</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_wallet">
|
||||
<property name="text">
|
||||
<string>Please enter password for wallet: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_incorrectPassword">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><span style=" font-weight:600; color:#a40000;">Incorrect password, try again.</span></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="line_password">
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>PasswordDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>PasswordDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -0,0 +1,102 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#include "tximportdialog.h"
|
||||
#include "ui_tximportdialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
TxImportDialog::TxImportDialog(QWidget *parent, AppContext *ctx)
|
||||
: QDialog(parent)
|
||||
, m_ctx(ctx)
|
||||
, m_loadTimer(new QTimer(this))
|
||||
, ui(new Ui::TxImportDialog)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
ui->resp->hide();
|
||||
ui->label_loading->hide();
|
||||
|
||||
m_network = new UtilsNetworking(m_ctx->network, this);
|
||||
|
||||
auto node = ctx->nodes->connection();
|
||||
m_rpc = new DaemonRpc(this, m_network, node.full);
|
||||
|
||||
connect(ui->btn_load, &QPushButton::clicked, this, &TxImportDialog::loadTx);
|
||||
connect(ui->btn_import, &QPushButton::clicked, this, &TxImportDialog::onImport);
|
||||
|
||||
connect(m_rpc, &DaemonRpc::ApiResponse, this, &TxImportDialog::onApiResponse);
|
||||
|
||||
connect(m_loadTimer, &QTimer::timeout, [this]{
|
||||
ui->label_loading->setText(ui->label_loading->text() + ".");
|
||||
});
|
||||
|
||||
this->adjustSize();
|
||||
}
|
||||
|
||||
void TxImportDialog::loadTx() {
|
||||
QString txid = ui->line_txid->text();
|
||||
QString node = m_ctx->nodes->connection().full;
|
||||
|
||||
if (!node.startsWith("http://"))
|
||||
node = QString("http://%1").arg(node);
|
||||
|
||||
m_rpc->setDaemonAddress(node);
|
||||
m_rpc->getTransactions(QStringList() << txid, false, true);
|
||||
|
||||
ui->label_loading->setText("Loading transaction");
|
||||
ui->label_loading->setHidden(false);
|
||||
m_loadTimer->start(1000);
|
||||
}
|
||||
|
||||
void TxImportDialog::onApiResponse(const DaemonRpc::DaemonResponse &resp) {
|
||||
m_loadTimer->stop();
|
||||
ui->label_loading->setHidden(true);
|
||||
if (!resp.ok) {
|
||||
QMessageBox::warning(this, "Import transaction", resp.status);
|
||||
return;
|
||||
}
|
||||
|
||||
if (resp.endpoint == DaemonRpc::Endpoint::GET_TRANSACTIONS) {
|
||||
ui->resp->setVisible(true);
|
||||
ui->resp->setPlainText(QJsonDocument(resp.obj).toJson(QJsonDocument::Indented));
|
||||
this->adjustSize();
|
||||
|
||||
if (resp.obj.contains("missed_tx")) {
|
||||
ui->btn_import->setEnabled(false);
|
||||
QMessageBox::warning(this, "Load transaction", "Transaction could not be found. Make sure the txid is correct, or try connecting to a different node.");
|
||||
return;
|
||||
}
|
||||
|
||||
QMessageBox::information(this, "Load transaction", "Transaction loaded successfully.\n\nAfter closing this message box click the Import button to import the transaction into your wallet.");
|
||||
m_transaction = resp.obj;
|
||||
ui->btn_import->setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
void TxImportDialog::onImport() {
|
||||
QJsonObject tx = m_transaction.value("txs").toArray().first().toObject();
|
||||
|
||||
QString txid = tx.value("tx_hash").toString();
|
||||
|
||||
QVector<quint64> output_indices;
|
||||
for (const auto &o: tx.value("output_indices").toArray()) {
|
||||
output_indices.push_back(o.toInt());
|
||||
}
|
||||
|
||||
quint64 height = tx.value("block_height").toInt();
|
||||
quint64 timestamp = tx.value("block_timestamp").toInt();
|
||||
|
||||
bool pool = tx.value("in_pool").toBool();
|
||||
bool double_spend_seen = tx.value("double_spend_seen").toBool();
|
||||
|
||||
if (m_ctx->currentWallet->importTransaction(tx.value("tx_hash").toString(), output_indices, height, timestamp, false, pool, double_spend_seen)) {
|
||||
QMessageBox::information(this, "Import transaction", "Transaction imported successfully.");
|
||||
} else {
|
||||
QMessageBox::warning(this, "Import transaction", "Transaction import failed.");
|
||||
}
|
||||
m_ctx->refreshModels();
|
||||
}
|
||||
|
||||
TxImportDialog::~TxImportDialog() {
|
||||
delete ui;
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#ifndef FEATHER_TXIMPORTDIALOG_H
|
||||
#define FEATHER_TXIMPORTDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include "appcontext.h"
|
||||
#include "utils/daemonrpc.h"
|
||||
|
||||
namespace Ui {
|
||||
class TxImportDialog;
|
||||
}
|
||||
|
||||
class TxImportDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit TxImportDialog(QWidget *parent, AppContext *ctx);
|
||||
~TxImportDialog() override;
|
||||
|
||||
private slots:
|
||||
void loadTx();
|
||||
void onImport();
|
||||
void onApiResponse(const DaemonRpc::DaemonResponse &resp);
|
||||
|
||||
private:
|
||||
Ui::TxImportDialog *ui;
|
||||
UtilsNetworking *m_network;
|
||||
AppContext *m_ctx;
|
||||
DaemonRpc *m_rpc;
|
||||
QTimer *m_loadTimer;
|
||||
|
||||
QJsonObject m_transaction;
|
||||
};
|
||||
|
||||
|
||||
#endif //FEATHER_TXIMPORTDIALOG_H
|
@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TxImportDialog</class>
|
||||
<widget class="QDialog" name="TxImportDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>700</width>
|
||||
<height>442</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>700</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Import Transaction</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="line_txid">
|
||||
<property name="placeholderText">
|
||||
<string>Transaction ID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="resp">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Debug info..</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_load">
|
||||
<property name="text">
|
||||
<string>Load</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_import">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Import</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_loading">
|
||||
<property name="text">
|
||||
<string>Loading transaction</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>TxImportDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>TxImportDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
// Copyright (c) 2020, The Monero Project.
|
||||
|
||||
#ifndef FEATHER_GLOBALS_H
|
||||
#define FEATHER_GLOBALS_H
|
||||
|
||||
#include <QtGlobal>
|
||||
|
||||
namespace globals
|
||||
{
|
||||
const qreal cdiv = 1e12;
|
||||
}
|
||||
|
||||
#endif //FEATHER_GLOBALS_H
|