Skip to content
Permalink
Browse files

get_tx_key, get_tx_proof, tx_spend_proof async

  • Loading branch information...
ph4r05 committed Jun 18, 2019
1 parent 623568b commit 3aa88dc06c44b382e6872368ddb095a1d119b3e3
Showing with 92 additions and 11 deletions.
  1. +14 −3 main.qml
  2. +11 −8 pages/History.qml
  3. +60 −0 src/libwalletqt/Wallet.cpp
  4. +7 −0 src/libwalletqt/Wallet.h
@@ -1004,10 +1004,21 @@ ApplicationWindow {
", message: ", message);

var result;
var spendProofFallback = (txid, result) => {
if (!result || result.indexOf("error|") === 0) {
result = currentWallet.getSpendProofAsync(txid, message, txProofComputed);
} else {
txProofComputed(txid, result);
}
}

if (address.length > 0)
result = currentWallet.getTxProof(txid, address, message);
if (!result || result.indexOf("error|") === 0)
result = currentWallet.getSpendProof(txid, message);
currentWallet.getTxProofAsync(txid, address, message, spendProofFallback);
else
spendProofFallback(txid, result);
}

function txProofComputed(txid, result){
informationPopup.title = qsTr("Payment proof") + translationManager.emptyString;
if (result.indexOf("error|") === 0) {
var errorString = result.split("|")[1];
@@ -1576,27 +1576,30 @@ Rectangle {

function getTxKey(hash, elem){
if (elem.parent.state != 'ready'){
var txKey = currentWallet.getTxKey(hash)
elem.parent.text = txKey ? txKey : '-';
elem.parent.state = 'ready';
currentWallet.getTxKeyAsync(hash, (hash, txKey) => {
elem.parent.text = txKey ? txKey : '-';
elem.parent.state = 'ready';
toClipboard(txKey);
});
}

toClipboard(elem.parent.text);
}

function showTxDetails(hash, paymentId, destinations, subaddrAccount, subaddrIndex){
var tx_key = currentWallet.getTxKey(hash)
var tx_note = currentWallet.getUserNote(hash)
var rings = currentWallet.getRings(hash)
var address_label = subaddrIndex == 0 ? (qsTr("Primary address") + translationManager.emptyString) : currentWallet.getSubaddressLabel(subaddrAccount, subaddrIndex)
var address = currentWallet.address(subaddrAccount, subaddrIndex)
if (rings)
rings = rings.replace(/\|/g, '\n')

informationPopup.title = qsTr("Transaction details") + translationManager.emptyString;
informationPopup.content = buildTxDetailsString(hash, paymentId, tx_key, tx_note, destinations, rings, address, address_label);
informationPopup.onCloseCallback = null
informationPopup.open();
currentWallet.getTxKeyAsync(hash, (hash, tx_key) => {
informationPopup.title = qsTr("Transaction details") + translationManager.emptyString;
informationPopup.content = buildTxDetailsString(hash, paymentId, tx_key, tx_note, destinations, rings, address, address_label);
informationPopup.onCloseCallback = null
informationPopup.open();
});
}

function showTxProof(hash, paymentId, destinations, subaddrAccount, subaddrIndex){
@@ -662,6 +662,26 @@ QString Wallet::getTxKey(const QString &txid) const
return QString::fromStdString(m_walletImpl->getTxKey(txid.toStdString()));
}

void Wallet::getTxKeyAsync(const QString &txid, const QJSValue &ref) const
{
QFuture<QString> future = QtConcurrent::run(this, &Wallet::getTxKey, txid);
auto watcher = new QFutureWatcher<QString>();

connect(watcher, &QFutureWatcher<QString>::finished,
this, [this, watcher, txid, ref]() {
QFuture<QString> future = watcher->future();
watcher->deleteLater();

auto txKey = future.result();
if (ref.isCallable()){
QJSValue cb(ref);
cb.call(QJSValueList {txid, txKey});
}
emit txKeyReceived(txid, txKey, ref);
});
watcher->setFuture(future);
}

QString Wallet::checkTxKey(const QString &txid, const QString &tx_key, const QString &address)
{
uint64_t received;
@@ -680,6 +700,26 @@ QString Wallet::getTxProof(const QString &txid, const QString &address, const QS
return QString::fromStdString(result);
}

void Wallet::getTxProofAsync(const QString &txid, const QString &address, const QString &message, const QJSValue &ref) const
{
QFuture<QString> future = QtConcurrent::run(this, &Wallet::getTxProof, txid, address, message);
auto watcher = new QFutureWatcher<QString>();

connect(watcher, &QFutureWatcher<QString>::finished,
this, [this, watcher, txid, ref]() {
QFuture<QString> future = watcher->future();
watcher->deleteLater();

auto proof = future.result();
if (ref.isCallable()){
QJSValue cb(ref); // needed as callback is captured as const
cb.call(QJSValueList {txid, proof});
}
emit txProofComputed(txid, proof, ref);
});
watcher->setFuture(future);
}

QString Wallet::checkTxProof(const QString &txid, const QString &address, const QString &message, const QString &signature)
{
bool good;
@@ -699,6 +739,26 @@ Q_INVOKABLE QString Wallet::getSpendProof(const QString &txid, const QString &me
return QString::fromStdString(result);
}

void Wallet::getSpendProofAsync(const QString &txid, const QString &message, const QJSValue &ref) const
{
QFuture<QString> future = QtConcurrent::run(this, &Wallet::getSpendProof, txid, message);
auto watcher = new QFutureWatcher<QString>();

connect(watcher, &QFutureWatcher<QString>::finished,
this, [this, watcher, txid, ref]() {
QFuture<QString> future = watcher->future();
watcher->deleteLater();

auto proof = future.result();
if (ref.isCallable()){
QJSValue cb(ref); // needed as callback is captured as const
cb.call(QJSValueList {txid, proof});
}
emit spendProofComputed(txid, proof, ref);
});
watcher->setFuture(future);
}

Q_INVOKABLE QString Wallet::checkSpendProof(const QString &txid, const QString &message, const QString &signature) const
{
bool good;
@@ -33,6 +33,7 @@
#include <QTime>
#include <QMutex>
#include <QList>
#include <QJSValue>
#include <QtConcurrent/QtConcurrent>

#include "wallet/api/wallet2_api.h" // we need to have an access to the Monero::Wallet::Status enum here;
@@ -289,10 +290,13 @@ class Wallet : public QObject
Q_INVOKABLE bool setUserNote(const QString &txid, const QString &note);
Q_INVOKABLE QString getUserNote(const QString &txid) const;
Q_INVOKABLE QString getTxKey(const QString &txid) const;
Q_INVOKABLE void getTxKeyAsync(const QString &txid, const QJSValue &ref);
Q_INVOKABLE QString checkTxKey(const QString &txid, const QString &tx_key, const QString &address);
Q_INVOKABLE QString getTxProof(const QString &txid, const QString &address, const QString &message) const;
Q_INVOKABLE void getTxProofAsync(const QString &txid, const QString &address, const QString &message, const QJSValue &ref) const;
Q_INVOKABLE QString checkTxProof(const QString &txid, const QString &address, const QString &message, const QString &signature);
Q_INVOKABLE QString getSpendProof(const QString &txid, const QString &message) const;
Q_INVOKABLE void getSpendProofAsync(const QString &txid, const QString &message, const QJSValue &ref) const;
Q_INVOKABLE QString checkSpendProof(const QString &txid, const QString &message, const QString &signature) const;
// Rescan spent outputs
Q_INVOKABLE bool rescanSpent();
@@ -348,6 +352,9 @@ class Wallet : public QObject
void deviceButtonPressed();
void transactionCommitted(bool status, PendingTransaction *t, QStringList txid);
void heightRefreshed(quint64 walletHeight, quint64 daemonHeight, quint64 targetHeight) const;
void txKeyReceived(const QString &txId, const QString &txKey, const QJSValue &ref) const;
void txProofComputed(const QString &txId, const QString &txProof, const QJSValue &ref) const;
void spendProofComputed(const QString &txId, const QString &txProof, const QJSValue &ref) const;

// emitted when transaction is created async
void transactionCreated(PendingTransaction * transaction, QString address, QString paymentId, quint32 mixinCount);

0 comments on commit 3aa88dc

Please sign in to comment.
You can’t perform that action at this time.