-
Evgenii Tagiltsev authored1a913cd8
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;
}