Skip to content
Snippets Groups Projects
DapChainWalletHandler.cpp 7.97 KiB
#include "DapChainWalletHandler.h"
#include <QDebug>
#include <QRegularExpression>

DapChainWalletHandler::DapChainWalletHandler(QObject *parent) : QObject(parent)
{
    m_timeout = new QTimer(this);
    QObject::connect(m_timeout, &QTimer::timeout, this, &DapChainWalletHandler::onReadWallet);
    m_timeout->setInterval(5000);
    m_timeout->start();
}

bool DapChainWalletHandler::appendWallet(const QString& aWalletName)
{
    QProcess process;
    process.start(QString("%1 wallet new -w %2").arg(CLI_PATH).arg(aWalletName));
    process.waitForFinished(-1);
    QByteArray result = process.readAll();

    QRegExp rx("new address\\s(\\w+)");
    return rx.indexIn(result, 0);
}

bool DapChainWalletHandler::createTransaction(const QString& aFromAddress, const QString& aToAddress, const QString& aTokenName, const QString& aNetwork, const quint64 aValue) const
{
    QString fromWalletName;
    for(int i = 0; i < m_walletList.count(); i++)
    {
        if(m_walletList[i].first.Address == aFromAddress)
            fromWalletName = m_walletList[i].first.Name;
    }

    if(fromWalletName.isEmpty() || !m_networkList.contains(aNetwork)) return false;
    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(fromWalletName)
                  .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;
}

QByteArray DapChainWalletHandler::walletData() const
{
    QByteArray data;
    QDataStream out(&data, QIODevice::WriteOnly);
    out << m_walletList;

    return data;
}

void DapChainWalletHandler::onReadWallet()
{
    QList<QPair<DapChainWalletData, QList<DapChainWalletTokenData>>> walletList;

    QProcess process;
    process.start(QString("%1 wallet list").arg(CLI_PATH));
    process.waitForFinished(-1);
    QByteArray result = process.readAll();
    QRegularExpression rx("wallet:\\s(.+)\\s+addr:\\s(.+)", QRegularExpression::MultilineOption);
    QRegularExpressionMatchIterator itr = rx.globalMatch(result);
    while (itr.hasNext())
    {
        QRegularExpressionMatch match = itr.next();
        QString walletName = match.captured(1);

        for(int i = 0; i < m_networkList.count(); i++)
        {
            DapChainWalletData wallet;
            wallet.Name = walletName;
            wallet.Network = m_networkList.at(i);
            QPair<DapChainWalletData, QList<DapChainWalletTokenData>> walletPair(wallet, QList<DapChainWalletTokenData>());

            QProcess process_token;
            process_token.start(QString("%1 wallet info -w %2 -net %3")
                                .arg(CLI_PATH)
                                .arg(walletName)
                                .arg(m_networkList.at(i)));

            process_token.waitForFinished(-1);
            QByteArray result_tokens = process_token.readAll();
            QRegExp regex("wallet: (.+)\\s+addr:\\s+(.+)\\s+(balance)|(\\d+.\\d+)\\s\\((\\d+)\\)\\s(\\w+)");

            int pos = 0;
            while((pos = regex.indexIn(result_tokens, pos)) != -1)
            {
                DapChainWalletTokenData token;
                if(!regex.cap(2).isEmpty())
                {
                    walletPair.first.Address = regex.cap(2);
                }
                else
                {
                    token.Balance = regex.cap(4).toDouble();
                    token.Emission = regex.cap(5).toUInt();
                    token.Name = regex.cap(6);
                    walletPair.second.append(token);
                }

                pos += regex.matchedLength();
            }

            walletList.append(walletPair);
        }

    }

    if(m_walletList != walletList)
    {
        m_walletList = walletList;
        emit walletDataChanged(walletData());
    }
}

void DapChainWalletHandler::setNetworkList(const QStringList& aNetworkList)
{
    if(m_networkList == aNetworkList) return;
    m_networkList = aNetworkList;
}









QString DapChainWalletHandler::parse(const QByteArray &aWalletAddress)
{
    qDebug() << aWalletAddress;
    QStringList result = QString::fromLatin1(aWalletAddress).split(" ");
    return result.at(result.size()-1).trimmed();
}

QStringList DapChainWalletHandler::createWallet(const QString &asNameWallet)
{
    QByteArray result;
    QProcess process;
    process.start(QString("%1 wallet new -w %2").arg(CLI_PATH).arg(asNameWallet));
    process.waitForFinished(-1);
    result = process.readAll();
    QStringList list;
    list.append(asNameWallet);
    list.append(parse(result));
    return result.isEmpty() ? QStringList() : list;
}

void DapChainWalletHandler::removeWallet(const QString &asNameWallet)
{
    QByteArray result;
    QProcess process;
    process.start(QString("rm %1%2.dwallet").arg("/opt/cellframe-node/var/lib/wallet/").arg(asNameWallet));
    qDebug() << (QString("rm %1%2.dwallet").arg("/opt/cellframe-node/var/lib/wallet/").arg(asNameWallet));
    process.waitForFinished(-1);
    result = process.readAll();
}

QMap<QString, QVariant> DapChainWalletHandler::getWallets()
{
    QMap<QString, QVariant> map;
    QProcess process;
    process.start(QString("%1 wallet list").arg(CLI_PATH));
    process.waitForFinished(-1);
    QByteArray result = process.readAll();
    QRegularExpression rx("wallet:\\s(.+)\\s+addr:\\s(.+)", QRegularExpression::MultilineOption);
    QRegularExpressionMatchIterator itr = rx.globalMatch(result);
    while (itr.hasNext()) {
        QRegularExpressionMatch match = itr.next();
        map[match.captured(1)] = match.captured(2);
    }

    return map;
}

QStringList DapChainWalletHandler::getWalletInfo(const QString &asNameWallet)
{
    QProcess process;
    process.start(QString("%1 wallet info -w %2 -net private").arg(CLI_PATH).arg(asNameWallet));
    process.waitForFinished(-1);
    QByteArray result = process.readAll();
    QRegExp rx("wallet: (.+)\\s+addr:\\s+(\\w+)\\s+(balance)|(\\d+.\\d+)\\s(\\(\\d+\\))\\s(\\w+)");
    QStringList list;

    int pos = 0;
    while((pos = rx.indexIn(result, pos)) != -1)
    {
        if(rx.cap(1).isEmpty())
            list << rx.cap(4) << rx.cap(5) << rx.cap(6);
        else
            list << rx.cap(1) << rx.cap(2) << rx.cap(3);

        pos += rx.matchedLength();
    }

    return list;
}

QString DapChainWalletHandler::sendToken(const QString &asSendWallet, const QString &asAddressReceiver, const QString &asToken, const QString &aAmount)
{
    QString answer;
    qInfo() << QString("sendTokenTest(%1, %2, %3, %4)").arg(asSendWallet).arg(asAddressReceiver).arg(asToken).arg(aAmount);
    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(m_CurrentNetwork)
                  .arg(asSendWallet)
                  .arg(asAddressReceiver)
                  .arg(asToken)
                  .arg(aAmount) );
    processCreate.waitForFinished(-1);
    QString resultCreate = QString::fromLatin1(processCreate.readAll());
    qDebug() << resultCreate;
    if(!(resultCreate.isEmpty() || resultCreate.isNull()))
    {
        QProcess processMempool;
        processMempool.start(QString("%1 mempool_proc -net " + m_CurrentNetwork +" -chain gdb").arg(CLI_PATH));
        processMempool.waitForFinished(-1);
        answer = QString::fromLatin1(processMempool.readAll());
        qDebug() << answer;
    }
    return answer;
}

void DapChainWalletHandler::setCurrentNetwork(const QString& aNetwork)
{
    if(m_CurrentNetwork != aNetwork) return;
    m_CurrentNetwork = aNetwork;
}