From 7466d482d48b62f0480ef80c34088d62f308d889 Mon Sep 17 00:00:00 2001
From: "evgenii.tagiltsev" <tagiltsev.evgenii@gmail.com>
Date: Thu, 12 Dec 2019 12:58:11 +0100
Subject: [PATCH] [+] added class for creation transactions

---
 .../CellFrameDashboardGUI.pro                 |  6 ++--
 .../DapCommandController.cpp                  | 13 ++++++-
 CellFrameDashboardGUI/DapCommandController.h  |  7 ++++
 .../DapServiceController.cpp                  |  3 ++
 CellFrameDashboardGUI/DapServiceController.h  |  1 +
 CellFrameDashboardGUI/DapTransaction.cpp      | 22 ++++++++++++
 CellFrameDashboardGUI/DapTransaction.h        | 22 ++++++++++++
 CellFrameDashboardGUI/main.cpp                |  2 ++
 .../CellFrameDashboardService.pro             |  6 ++--
 .../DapChainDashboardService.cpp              |  7 ++++
 .../DapChainDashboardService.h                |  5 +++
 .../DapChainTransaction.cpp                   | 34 +++++++++++++++++++
 .../DapChainTransaction.h                     | 25 ++++++++++++++
 libdap                                        |  2 +-
 libdap-crypto                                 |  2 +-
 libdap-qt                                     |  2 +-
 libdap-qt-ui-qml                              |  2 +-
 17 files changed, 152 insertions(+), 9 deletions(-)
 create mode 100644 CellFrameDashboardGUI/DapTransaction.cpp
 create mode 100644 CellFrameDashboardGUI/DapTransaction.h
 create mode 100644 CellFrameDashboardService/DapChainTransaction.cpp
 create mode 100644 CellFrameDashboardService/DapChainTransaction.h

diff --git a/CellFrameDashboardGUI/CellFrameDashboardGUI.pro b/CellFrameDashboardGUI/CellFrameDashboardGUI.pro
index be1d35cb2..370cf496b 100755
--- a/CellFrameDashboardGUI/CellFrameDashboardGUI.pro
+++ b/CellFrameDashboardGUI/CellFrameDashboardGUI.pro
@@ -80,7 +80,8 @@ SOURCES += \
     $$PWD/DapServiceClientNativeLinux.cpp \
     $$PWD/DapServiceClientNativeWin.cpp \
     $$PWD/DapServiceClientNativeMacOS.cpp \
-    $$PWD/DapChainWalletsModel.cpp
+    $$PWD/DapChainWalletsModel.cpp \
+    DapTransaction.cpp
 
 RESOURCES += $$PWD/qml.qrc
 
@@ -107,7 +108,8 @@ HEADERS += \
     $$PWD/DapServiceClientNativeLinux.h \
     $$PWD/DapServiceClientNativeWin.h \
     $$PWD/DapChainWalletsModel.h \
-    $$PWD/DapWalletFilterModel.h
+    $$PWD/DapWalletFilterModel.h \
+    DapTransaction.h
 
 include (../libdap/libdap.pri)
 include (../libdap-crypto/libdap-crypto.pri)
diff --git a/CellFrameDashboardGUI/DapCommandController.cpp b/CellFrameDashboardGUI/DapCommandController.cpp
index e690e439f..5c430992f 100644
--- a/CellFrameDashboardGUI/DapCommandController.cpp
+++ b/CellFrameDashboardGUI/DapCommandController.cpp
@@ -79,7 +79,12 @@ void DapCommandController::changeCurrentNetwork(const QString& aNetwork)
     m_DAPRpcSocket->invokeRemoteMethod("RPCServer.changeCurrentNetwork", aNetwork);
 }
 
-#include "DapChainWallet.h"
+void DapCommandController::sendTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aToken, const QString& aNetwork, const quint64 aValue)
+{
+    DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.createTransaction", aFromWallet, aToAddress, aToken, aNetwork, aValue);
+    connect(reply, SIGNAL(finished()), this, SLOT(processGetResultTransaction()));
+}
+
 void DapCommandController::setNewWalletData(const QVariant& aData)
 {
     emit sigWalletData(QByteArray::fromHex(aData.toByteArray()));
@@ -223,6 +228,12 @@ void DapCommandController::processGetWalletData()
     emit sigWalletData(QByteArray::fromHex(result));
 }
 
+void DapCommandController::processGetResultTransaction()
+{
+    DapRpcServiceReply *reply = static_cast<DapRpcServiceReply *>(sender());
+    emit sendResponseTransaction(reply->response().toJsonValue().toBool());
+}
+
 void DapCommandController::processGetNetworkList()
 {
     DapRpcServiceReply *reply = static_cast<DapRpcServiceReply *>(sender());
diff --git a/CellFrameDashboardGUI/DapCommandController.h b/CellFrameDashboardGUI/DapCommandController.h
index 8d4f4a5a8..ea41c1a7c 100644
--- a/CellFrameDashboardGUI/DapCommandController.h
+++ b/CellFrameDashboardGUI/DapCommandController.h
@@ -9,6 +9,7 @@
 #include "DapRpcSocket.h"
 #include "DapRpcServiceProvider.h"
 #include "DapRpcService.h"
+#include "DapChainWallet.h"
 
 /// Class command controller for service
 class DapCommandController : public DapRpcService, public DapRpcServiceProvider
@@ -75,6 +76,8 @@ signals:
 // ---------------------------------------------
     void sigWalletData(QByteArray data);
 
+    void sendResponseTransaction(bool result);
+
 public:
     /// Overloaded constructor.
     /// @param apIODevice Data transfer device.
@@ -115,6 +118,8 @@ private slots:
  // ---------------------------------------------
     void processGetWalletData();
 
+    void processGetResultTransaction();
+
 public slots:
     /// Show or hide GUI client by clicking on the tray icon.
     /// @param aIsActivated Accepts true - when requesting to 
@@ -174,6 +179,8 @@ public slots:
     void setNewWalletData(const QVariant& aData);
 
     void requestWalletData();
+
+    void sendTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aToken, const QString& aNetwork, const quint64 aValue);
 };
 
 #endif // COMMANDCONTROLLER_H
diff --git a/CellFrameDashboardGUI/DapServiceController.cpp b/CellFrameDashboardGUI/DapServiceController.cpp
index aaa03277b..1f21aa904 100644
--- a/CellFrameDashboardGUI/DapServiceController.cpp
+++ b/CellFrameDashboardGUI/DapServiceController.cpp
@@ -73,6 +73,9 @@ void DapServiceController::init(DapServiceClient *apDapServiceClient)
 
     connect(m_pDapCommandController, &DapCommandController::sigWalletData, &DapChainWalletModel::instance(), &DapChainWalletModel::setWalletData);
 
+    connect(&DapTransaction::instance(), &DapTransaction::sendTransaction, m_pDapCommandController, &DapCommandController::sendTransaction);
+    connect(m_pDapCommandController, &DapCommandController::sendResponseTransaction, &DapTransaction::instance(), &DapTransaction::receiveResult);
+
 }
 
 QString DapServiceController::getBrand() const
diff --git a/CellFrameDashboardGUI/DapServiceController.h b/CellFrameDashboardGUI/DapServiceController.h
index f96d43b0d..27d08052e 100644
--- a/CellFrameDashboardGUI/DapServiceController.h
+++ b/CellFrameDashboardGUI/DapServiceController.h
@@ -17,6 +17,7 @@
 #include "DapScreenHistoryModel.h"
 #include "DapSettingsNetworkModel.h"
 #include "DapConsoleModel.h"
+#include "DapTransaction.h"
 
 #include "DapChainWalletModel.h"
 
diff --git a/CellFrameDashboardGUI/DapTransaction.cpp b/CellFrameDashboardGUI/DapTransaction.cpp
new file mode 100644
index 000000000..858e352e3
--- /dev/null
+++ b/CellFrameDashboardGUI/DapTransaction.cpp
@@ -0,0 +1,22 @@
+#include "DapTransaction.h"
+
+DapTransaction::DapTransaction(QObject *parent) : QObject(parent)
+{
+
+}
+
+DapTransaction& DapTransaction::instance()
+{
+    static DapTransaction instance;
+    return instance;
+}
+
+void DapTransaction::createRequestTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aToken, const QString& aNetwork, const quint64 aValue)
+{
+    emit sendTransaction(aFromWallet, aToAddress, aToken, aNetwork, aValue);
+}
+
+void DapTransaction::receiveResult(const bool aSuccessful)
+{
+    emit sendResult(aSuccessful);
+}
diff --git a/CellFrameDashboardGUI/DapTransaction.h b/CellFrameDashboardGUI/DapTransaction.h
new file mode 100644
index 000000000..a370b0d24
--- /dev/null
+++ b/CellFrameDashboardGUI/DapTransaction.h
@@ -0,0 +1,22 @@
+#ifndef DAPTRANSACTION_H
+#define DAPTRANSACTION_H
+
+#include <QObject>
+
+class DapTransaction : public QObject
+{
+    Q_OBJECT
+public:
+    explicit DapTransaction(QObject *parent = nullptr);
+    static DapTransaction& instance();
+
+public slots:
+    void createRequestTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aToken, const QString& aNetwork, const quint64 aValue);
+    void receiveResult(const bool aSuccessful);
+
+signals:
+    void sendResult(bool result);
+    void sendTransaction(const QString& fromWallet, const QString& toAddress, const QString& token, const QString& network, const quint64 value);
+};
+
+#endif // DAPTRANSACTION_H
diff --git a/CellFrameDashboardGUI/main.cpp b/CellFrameDashboardGUI/main.cpp
index 5551f3145..19f74a605 100644
--- a/CellFrameDashboardGUI/main.cpp
+++ b/CellFrameDashboardGUI/main.cpp
@@ -25,6 +25,7 @@
 #include "DapConsoleModel.h"
 #include "DapChainConvertor.h"
 #include "DapClipboard.h"
+#include "DapTransaction.h"
 
 #include "DapChainWalletModel.h"
 #include "DapWalletFilterModel.h"
@@ -95,6 +96,7 @@ int main(int argc, char *argv[])
     engine.rootContext()->setContextProperty("dapWalletFilterModel", &DapWalletFilterModel::instance());
     engine.rootContext()->setContextProperty("dapWalletModel", &DapChainWalletModel::instance());
     engine.rootContext()->setContextProperty("clipboard", &DapClipboard::instance());
+    engine.rootContext()->setContextProperty("dapTransaction", &DapTransaction::instance());
     engine.rootContext()->setContextProperty("pt", 1.3);
     engine.load(QUrl("qrc:/screen/main.qml"));
 
diff --git a/CellFrameDashboardService/CellFrameDashboardService.pro b/CellFrameDashboardService/CellFrameDashboardService.pro
index 58f806d02..e59c75465 100755
--- a/CellFrameDashboardService/CellFrameDashboardService.pro
+++ b/CellFrameDashboardService/CellFrameDashboardService.pro
@@ -54,7 +54,8 @@ SOURCES += \
     $$PWD/DapChainWalletHandler.cpp \
     $$PWD/DapChainLogHandler.cpp \
     $$PWD/DapChainNetworkHandler.cpp \
-    $$PWD/DapChainConsoleHandler.cpp
+    $$PWD/DapChainConsoleHandler.cpp \
+    DapChainTransaction.cpp
 
 HEADERS += \
     $$PWD/DapChainDashboardService.h \
@@ -65,7 +66,8 @@ HEADERS += \
     $$PWD/DapChainWalletHandler.h \
     $$PWD/DapChainLogHandler.h \
     $$PWD/DapChainNetworkHandler.h \
-    $$PWD/DapChainConsoleHandler.h
+    $$PWD/DapChainConsoleHandler.h \
+    DapChainTransaction.h
 
 include (../libdap/libdap.pri)
 include (../libdap-crypto/libdap-crypto.pri)
diff --git a/CellFrameDashboardService/DapChainDashboardService.cpp b/CellFrameDashboardService/DapChainDashboardService.cpp
index 886a914b4..28aa41c49 100755
--- a/CellFrameDashboardService/DapChainDashboardService.cpp
+++ b/CellFrameDashboardService/DapChainDashboardService.cpp
@@ -26,6 +26,8 @@ DapChainDashboardService::DapChainDashboardService() : DapRpcService(nullptr)
     QObject::connect(m_pDapChainWalletHandler, &DapChainWalletHandler::walletDataChanged, this, &DapChainDashboardService::doSendNewWalletData);
     m_pDapChainWalletHandler->setNetworkList(m_pDapChainNetworkHandler->getNetworkList());
 
+    m_pDapChainTransaction = new DapChainTransaction(this);
+
 }
 
 bool DapChainDashboardService::start()
@@ -222,3 +224,8 @@ QByteArray DapChainDashboardService::walletData() const
 {
     return m_pDapChainWalletHandler->walletData();
 }
+
+bool DapChainDashboardService::createTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aTokenName, const QString& aNetwork, const quint64 aValue)
+{
+    return m_pDapChainTransaction->createTransaction(aFromWallet, aToAddress, aTokenName, aNetwork, aValue);
+}
diff --git a/CellFrameDashboardService/DapChainDashboardService.h b/CellFrameDashboardService/DapChainDashboardService.h
index 27aa3f299..825e5b2d5 100755
--- a/CellFrameDashboardService/DapChainDashboardService.h
+++ b/CellFrameDashboardService/DapChainDashboardService.h
@@ -29,6 +29,7 @@
 #include "DapChainHistoryHandler.h"
 #include "DapChainNetworkHandler.h"
 #include "DapChainConsoleHandler.h"
+#include "DapChainTransaction.h"
 
 #include <QLocalServer>
 typedef class DapRpcLocalServer DapUiService;
@@ -65,6 +66,8 @@ class DapChainDashboardService : public DapRpcService
     /// Recipient network's name
     DapChainNetworkHandler* m_pDapChainNetworkHandler {nullptr};
 
+    DapChainTransaction* m_pDapChainTransaction {nullptr};
+
 public:
     /// Standard сonstructor.
     explicit DapChainDashboardService();
@@ -138,6 +141,8 @@ public slots:
 
     QByteArray walletData() const;
 
+    bool createTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aTokenName, const QString& aNetwork, const quint64 aValue);
+
 private slots:
     /// Request new history request by handle wallet's name
     void doRequestWallets();
diff --git a/CellFrameDashboardService/DapChainTransaction.cpp b/CellFrameDashboardService/DapChainTransaction.cpp
new file mode 100644
index 000000000..4bbc0f5ff
--- /dev/null
+++ b/CellFrameDashboardService/DapChainTransaction.cpp
@@ -0,0 +1,34 @@
+#include "DapChainTransaction.h"
+
+DapChainTransaction::DapChainTransaction(QObject *parent) : QObject(parent)
+{
+
+}
+
+bool DapChainTransaction::createTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aTokenName, const QString& aNetwork, const quint64 aValue) const
+{
+    QProcess processCreate;
+    processCreate.start(QString("%1 tx_create -net %2 -chain gdb -from_wallet %3 -to_addr %4 -token %5 -value %6")
+                  .arg(CLI_PATH)
+                  .arg(aNetwork)
+                  .arg(aFromWallet)
+                  .arg(aToAddress)
+                  .arg(aTokenName)
+                  .arg(QString::number(aValue)));
+    processCreate.waitForFinished(-1);
+    QByteArray result = processCreate.readAll();
+
+    QRegExp rx("transfer=(\\w+)");
+    rx.indexIn(result, 0);
+
+    if(rx.cap(1) == "Ok") {
+
+        QProcess processMempool;
+        processMempool.start(QString("%1 mempool_proc -net " + aNetwork +" -chain gdb").arg(CLI_PATH));
+        processMempool.waitForFinished(-1);
+        processMempool.readAll();
+        return true;
+    }
+
+    return false;
+}
diff --git a/CellFrameDashboardService/DapChainTransaction.h b/CellFrameDashboardService/DapChainTransaction.h
new file mode 100644
index 000000000..0434dee20
--- /dev/null
+++ b/CellFrameDashboardService/DapChainTransaction.h
@@ -0,0 +1,25 @@
+#ifndef DAPCHAINTRANSACTION_H
+#define DAPCHAINTRANSACTION_H
+
+#include <QObject>
+#include <QProcess>
+#include <QDebug>
+
+class DapChainTransaction : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DapChainTransaction(QObject *parent = nullptr);
+
+    /// Request for creation new transaction
+    /// @param name of wallet
+    /// @param address of a receiver
+    /// @param name of token
+    /// @param name of network
+    /// @param sum for transaction
+    /// @return result of trying to do transaction
+    bool createTransaction(const QString& aFromWallet, const QString& aToAddress, const QString& aTokenName, const QString& aNetwork, const quint64 aValue) const;
+};
+
+#endif // DAPCHAINTRANSACTION_H
diff --git a/libdap b/libdap
index 1c0614797..ee6e8617e 160000
--- a/libdap
+++ b/libdap
@@ -1 +1 @@
-Subproject commit 1c0614797a3a2a2f4c179630025600e177637a65
+Subproject commit ee6e8617e1f589b45f15e327ed18cddfa87915f8
diff --git a/libdap-crypto b/libdap-crypto
index c81202ba5..16a16e71b 160000
--- a/libdap-crypto
+++ b/libdap-crypto
@@ -1 +1 @@
-Subproject commit c81202ba5d48e5d77afcc8aea9962a10560527f3
+Subproject commit 16a16e71b9cfae4fd8df530ed8cd6146010ae7e0
diff --git a/libdap-qt b/libdap-qt
index 5f661c223..712993499 160000
--- a/libdap-qt
+++ b/libdap-qt
@@ -1 +1 @@
-Subproject commit 5f661c223be1ccd39f0dfa104a44de0d9f9dfb35
+Subproject commit 7129934993bef42104cffbef8f983cde724afce2
diff --git a/libdap-qt-ui-qml b/libdap-qt-ui-qml
index 8dfd465e9..4c38710d4 160000
--- a/libdap-qt-ui-qml
+++ b/libdap-qt-ui-qml
@@ -1 +1 @@
-Subproject commit 8dfd465e991656dca083c0fd3a0ff5825d61fe86
+Subproject commit 4c38710d45f7e5e7c3ba8139a964c886b4061f10
-- 
GitLab