|
|
@ -213,7 +213,8 @@ void RPC::getTransactions(const std::function<void(json)>& cb) { |
|
|
|
conn->doRPCWithDefaultErrorHandling(payload, cb); |
|
|
|
} |
|
|
|
|
|
|
|
void RPC::sendZTransaction(json params, const std::function<void(json)>& cb) { |
|
|
|
void RPC::sendZTransaction(json params, const std::function<void(json)>& cb, |
|
|
|
const std::function<void(QString)>& err) { |
|
|
|
json payload = { |
|
|
|
{"jsonrpc", "1.0"}, |
|
|
|
{"id", "someid"}, |
|
|
@ -221,7 +222,13 @@ void RPC::sendZTransaction(json params, const std::function<void(json)>& cb) { |
|
|
|
{"params", params} |
|
|
|
}; |
|
|
|
|
|
|
|
conn->doRPCWithDefaultErrorHandling(payload, cb); |
|
|
|
conn->doRPC(payload, cb, [=] (auto reply, auto parsed) { |
|
|
|
if (!parsed.is_discarded() && !parsed["error"]["message"].is_null()) { |
|
|
|
err(QString::fromStdString(parsed["error"]["message"])); |
|
|
|
} else { |
|
|
|
err(reply->errorString()); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/**
|
|
|
@ -831,12 +838,36 @@ void RPC::refreshSentZTrans() { |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
void RPC::addNewTxToWatch(Tx tx, const QString& newOpid) { |
|
|
|
watchingOps.insert(newOpid, tx); |
|
|
|
void RPC::addNewTxToWatch(const QString& newOpid, WatchedTx wtx) { |
|
|
|
watchingOps.insert(newOpid, wtx); |
|
|
|
|
|
|
|
watchTxStatus(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Execute a transaction!
|
|
|
|
void RPC::executeTransaction(Tx tx, |
|
|
|
const std::function<void(QString opid)> submitted, |
|
|
|
const std::function<void(QString opid, QString txid)> computed, |
|
|
|
const std::function<void(QString opid, QString errStr)> error) { |
|
|
|
// First, create the json params
|
|
|
|
json params = json::array(); |
|
|
|
fillTxJsonParams(params, tx); |
|
|
|
std::cout << std::setw(2) << params << std::endl; |
|
|
|
|
|
|
|
sendZTransaction(params, [=](const json& reply) { |
|
|
|
QString opid = QString::fromStdString(reply.get<json::string_t>()); |
|
|
|
|
|
|
|
// And then start monitoring the transaction
|
|
|
|
addNewTxToWatch( opid, WatchedTx { opid, tx, computed, error} ); |
|
|
|
submitted(opid); |
|
|
|
}, |
|
|
|
[=](QString errStr) { |
|
|
|
error("", errStr); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void RPC::watchTxStatus() { |
|
|
|
if (conn == nullptr) |
|
|
|
return noConnection(); |
|
|
@ -856,35 +887,26 @@ void RPC::watchTxStatus() { |
|
|
|
if (watchingOps.contains(id)) { |
|
|
|
// And if it ended up successful
|
|
|
|
QString status = QString::fromStdString(it["status"]); |
|
|
|
main->loadingLabel->setVisible(false); |
|
|
|
|
|
|
|
if (status == "success") { |
|
|
|
auto txid = QString::fromStdString(it["result"]["txid"]); |
|
|
|
|
|
|
|
SentTxStore::addToSentTx(watchingOps.value(id), txid); |
|
|
|
|
|
|
|
main->ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); |
|
|
|
main->loadingLabel->setVisible(false); |
|
|
|
SentTxStore::addToSentTx(watchingOps[id].tx, txid); |
|
|
|
|
|
|
|
auto wtx = watchingOps[id]; |
|
|
|
watchingOps.remove(id); |
|
|
|
wtx.completed(id, txid); |
|
|
|
|
|
|
|
// Refresh balances to show unconfirmed balances
|
|
|
|
refresh(true); |
|
|
|
refresh(true); |
|
|
|
} else if (status == "failed") { |
|
|
|
// If it failed, then we'll actually show a warning.
|
|
|
|
auto errorMsg = QString::fromStdString(it["error"]["message"]); |
|
|
|
QMessageBox msg( |
|
|
|
QMessageBox::Critical, |
|
|
|
QObject::tr("Transaction Error"), |
|
|
|
QObject::tr("The transaction with id ") % id % QObject::tr(" failed. The error was") + ":\n\n" + errorMsg, |
|
|
|
QMessageBox::Ok, |
|
|
|
main |
|
|
|
); |
|
|
|
|
|
|
|
watchingOps.remove(id); |
|
|
|
|
|
|
|
main->ui->statusBar->showMessage(QObject::tr(" Tx ") % id % QObject::tr(" failed"), 15 * 1000); |
|
|
|
main->loadingLabel->setVisible(false); |
|
|
|
|
|
|
|
msg.exec(); |
|
|
|
auto wtx = watchingOps[id]; |
|
|
|
watchingOps.remove(id); |
|
|
|
wtx.error(id, errorMsg); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|