Merge pull request 'Remove MorphToken, reason: Tor block' (#237) from tobtoht/feather:into_the_trash_it_goes into master
Reviewed-on: feather/feather#237remotes/1691844314220217825/master
commit
ccd19edf2f
@ -1,230 +0,0 @@
|
|||||||
// 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.";
|
|
||||||
} else if (state == "PROCESSING_DELAY") {
|
|
||||||
statusText += "Please enter in contact with support.\n\ncontact@morphtoken.com";
|
|
||||||
} else if (state == "CANCELLED") {
|
|
||||||
statusText += "The trade was cancelled. If this is unexpected, please contact support at contact@morphtoken.com";
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
// 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
|
|
@ -1,423 +0,0 @@
|
|||||||
<?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>0</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>
|
|
Before Width: | Height: | Size: 3.6 KiB |
@ -1,93 +0,0 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
// Copyright (c) 2020, The Monero Project.
|
|
||||||
|
|
||||||
#include "MorphTokenApi.h"
|
|
||||||
|
|
||||||
MorphTokenApi::MorphTokenApi(QObject *parent, UtilsNetworking *network, QString baseUrl)
|
|
||||||
: QObject(parent)
|
|
||||||
, m_network(network)
|
|
||||||
, m_baseUrl(std::move(baseUrl))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void MorphTokenApi::createTrade(const QString &inputAsset, const QString &outputAsset, const QString &refundAddress, const QString &outputAddress) {
|
|
||||||
QJsonObject trade;
|
|
||||||
|
|
||||||
QJsonObject input;
|
|
||||||
input["asset"] = inputAsset;
|
|
||||||
input["refund"] = refundAddress;
|
|
||||||
|
|
||||||
QJsonArray output;
|
|
||||||
QJsonObject outputObj;
|
|
||||||
outputObj["asset"] = outputAsset;
|
|
||||||
outputObj["weight"] = 10000;
|
|
||||||
outputObj["address"] = outputAddress;
|
|
||||||
output.append(outputObj);
|
|
||||||
|
|
||||||
trade["input"] = input;
|
|
||||||
trade["output"] = output;
|
|
||||||
|
|
||||||
QString url = QString("%1/morph").arg(m_baseUrl);
|
|
||||||
QNetworkReply *reply = m_network->postJson(url, trade);
|
|
||||||
connect(reply, &QNetworkReply::finished, std::bind(&MorphTokenApi::onResponse, this, reply, Endpoint::CREATE_TRADE));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MorphTokenApi::getTrade(const QString &morphId) {
|
|
||||||
QString url = QString("%1/morph/%2").arg(m_baseUrl, morphId);
|
|
||||||
QNetworkReply *reply = m_network->getJson(url);
|
|
||||||
connect(reply, &QNetworkReply::finished, std::bind(&MorphTokenApi::onResponse, this, reply, Endpoint::GET_TRADE));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MorphTokenApi::getRates() {
|
|
||||||
QString url = QString("%1/rates").arg(m_baseUrl);
|
|
||||||
QNetworkReply *reply = m_network->getJson(url);
|
|
||||||
connect(reply, &QNetworkReply::finished, std::bind(&MorphTokenApi::onResponse, this, reply, Endpoint::GET_RATES));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MorphTokenApi::getLimits(const QString &inputAsset, const QString &outputAsset) {
|
|
||||||
QJsonObject limits;
|
|
||||||
|
|
||||||
QJsonObject input;
|
|
||||||
input["asset"] = inputAsset;
|
|
||||||
|
|
||||||
QJsonArray output;
|
|
||||||
QJsonObject outputObj;
|
|
||||||
outputObj["asset"] = outputAsset;
|
|
||||||
outputObj["weight"] = 10000;
|
|
||||||
output.append(outputObj);
|
|
||||||
|
|
||||||
limits["input"] = input;
|
|
||||||
limits["output"] = output;
|
|
||||||
|
|
||||||
QString url = QString("%1/limits").arg(m_baseUrl);
|
|
||||||
QNetworkReply *reply = m_network->postJson(url, limits);
|
|
||||||
connect(reply, &QNetworkReply::finished, std::bind(&MorphTokenApi::onResponse, this, reply, Endpoint::GET_LIMITS));
|
|
||||||
}
|
|
||||||
|
|
||||||
void MorphTokenApi::onResponse(QNetworkReply *reply, Endpoint endpoint) {
|
|
||||||
const auto ok = reply->error() == QNetworkReply::NoError;
|
|
||||||
const auto err = reply->errorString();
|
|
||||||
|
|
||||||
QByteArray data = reply->readAll();
|
|
||||||
QJsonObject obj;
|
|
||||||
if (!data.isEmpty() && Utils::validateJSON(data)) {
|
|
||||||
auto doc = QJsonDocument::fromJson(data);
|
|
||||||
obj = doc.object();
|
|
||||||
}
|
|
||||||
else if (!ok) {
|
|
||||||
emit ApiResponse(MorphTokenResponse(false, endpoint, err, {}));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
emit ApiResponse(MorphTokenResponse(false, endpoint, "Invalid response from MorphToken", {}));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj.contains("success")) {
|
|
||||||
emit ApiResponse(MorphTokenResponse(false, endpoint, obj.value("description").toString(), obj));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
reply->deleteLater();
|
|
||||||
emit ApiResponse(MorphTokenResponse(true, endpoint, "", obj));
|
|
||||||
}
|
|
@ -1,51 +0,0 @@
|
|||||||
// SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
// Copyright (c) 2020, The Monero Project.
|
|
||||||
|
|
||||||
#ifndef FEATHER_MORPHTOKENAPI_H
|
|
||||||
#define FEATHER_MORPHTOKENAPI_H
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <utility>
|
|
||||||
#include "utils/networking.h"
|
|
||||||
|
|
||||||
class MorphTokenApi : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum Endpoint {
|
|
||||||
CREATE_TRADE = 0,
|
|
||||||
GET_TRADE,
|
|
||||||
GET_RATES,
|
|
||||||
GET_LIMITS
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MorphTokenResponse {
|
|
||||||
explicit MorphTokenResponse(bool ok, Endpoint endpoint, QString message, QJsonObject obj)
|
|
||||||
: ok(ok), endpoint(endpoint), message(std::move(message)), obj(std::move(obj)) {};
|
|
||||||
|
|
||||||
bool ok;
|
|
||||||
Endpoint endpoint;
|
|
||||||
QString message;
|
|
||||||
QJsonObject obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit MorphTokenApi(QObject *parent, UtilsNetworking *network, QString baseUrl = "https://api.morphtoken.com");
|
|
||||||
|
|
||||||
void createTrade(const QString &inputAsset, const QString &outputAsset, const QString &refundAddress, const QString &outputAddress);
|
|
||||||
void getTrade(const QString &morphId);
|
|
||||||
void getRates();
|
|
||||||
void getLimits(const QString &inputAsset, const QString &outputAsset);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void ApiResponse(MorphTokenResponse resp);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void onResponse(QNetworkReply *reply, Endpoint endpoint);
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString m_baseUrl;
|
|
||||||
UtilsNetworking *m_network;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //FEATHER_MORPHTOKENAPI_H
|
|
Loading…
Reference in new issue