aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2017-01-15 14:58:47 -0500
committerRiccardo Spagni <ric@spagni.net>2017-01-15 14:58:47 -0500
commit98ca4f1a70051447c39d5f9161db2e1741fdceb9 (patch)
tree620c481c47e094d34990fe1c210f1fd0b2fa6f90 /src
parent7cbd61dae21fdf8a27081d28ebb130195d77ed69 (diff)
parentae5c21ef17b5585e1c90423a9f45b62b3b678f46 (diff)
downloadmonzero-gui-98ca4f1a70051447c39d5f9161db2e1741fdceb9.tar.gz
monzero-gui-98ca4f1a70051447c39d5f9161db2e1741fdceb9.tar.xz
monzero-gui-98ca4f1a70051447c39d5f9161db2e1741fdceb9.zip
Merge pull request #398
ae5c21e export/import key images when cold signing (Jaquee) 24ccd27 Add rescan spent button (Jaquee) 15c79df GUI cold signing (Jaquee) fd98395 view only wallets (Jaquee) 8f56e98 save wallet name in appwindow (Jaquee) 842e4df adjust button size dynamically (Jaquee)
Diffstat (limited to 'src')
-rw-r--r--src/libwalletqt/PendingTransaction.cpp10
-rw-r--r--src/libwalletqt/PendingTransaction.h2
-rw-r--r--src/libwalletqt/UnsignedTransaction.cpp92
-rw-r--r--src/libwalletqt/UnsignedTransaction.h59
-rw-r--r--src/libwalletqt/Wallet.cpp43
-rw-r--r--src/libwalletqt/Wallet.h22
6 files changed, 224 insertions, 4 deletions
diff --git a/src/libwalletqt/PendingTransaction.cpp b/src/libwalletqt/PendingTransaction.cpp
index 8df7ad28..bd621d6c 100644
--- a/src/libwalletqt/PendingTransaction.cpp
+++ b/src/libwalletqt/PendingTransaction.cpp
@@ -13,7 +13,10 @@ QString PendingTransaction::errorString() const
bool PendingTransaction::commit()
{
- return m_pimpl->commit();
+ // Save transaction to file if fileName is set.
+ if(!m_fileName.isEmpty())
+ return m_pimpl->commit(m_fileName.toStdString());
+ return m_pimpl->commit(m_fileName.toStdString());
}
quint64 PendingTransaction::amount() const
@@ -47,6 +50,11 @@ quint64 PendingTransaction::txCount() const
return m_pimpl->txCount();
}
+void PendingTransaction::setFilename(const QString &fileName)
+{
+ m_fileName = fileName;
+}
+
PendingTransaction::PendingTransaction(Monero::PendingTransaction *pt, QObject *parent)
: QObject(parent), m_pimpl(pt)
{
diff --git a/src/libwalletqt/PendingTransaction.h b/src/libwalletqt/PendingTransaction.h
index ad2cb275..a20264e6 100644
--- a/src/libwalletqt/PendingTransaction.h
+++ b/src/libwalletqt/PendingTransaction.h
@@ -44,6 +44,7 @@ public:
quint64 fee() const;
QStringList txid() const;
quint64 txCount() const;
+ Q_INVOKABLE void setFilename(const QString &fileName);
private:
explicit PendingTransaction(Monero::PendingTransaction * pt, QObject *parent = 0);
@@ -51,6 +52,7 @@ private:
private:
friend class Wallet;
Monero::PendingTransaction * m_pimpl;
+ QString m_fileName;
};
#endif // PENDINGTRANSACTION_H
diff --git a/src/libwalletqt/UnsignedTransaction.cpp b/src/libwalletqt/UnsignedTransaction.cpp
new file mode 100644
index 00000000..47dca57b
--- /dev/null
+++ b/src/libwalletqt/UnsignedTransaction.cpp
@@ -0,0 +1,92 @@
+#include "UnsignedTransaction.h"
+#include <QVector>
+#include <QDebug>
+
+UnsignedTransaction::Status UnsignedTransaction::status() const
+{
+ return static_cast<Status>(m_pimpl->status());
+}
+
+QString UnsignedTransaction::errorString() const
+{
+ return QString::fromStdString(m_pimpl->errorString());
+}
+
+quint64 UnsignedTransaction::amount(int index) const
+{
+ std::vector<uint64_t> arr = m_pimpl->amount();
+ if(index > arr.size() - 1)
+ return 0;
+ return arr[index];
+}
+
+quint64 UnsignedTransaction::fee(int index) const
+{
+ std::vector<uint64_t> arr = m_pimpl->fee();
+ if(index > arr.size() - 1)
+ return 0;
+ return arr[index];
+}
+
+quint64 UnsignedTransaction::mixin(int index) const
+{
+ std::vector<uint64_t> arr = m_pimpl->mixin();
+ if(index > arr.size() - 1)
+ return 0;
+ return arr[index];
+}
+
+quint64 UnsignedTransaction::txCount() const
+{
+ return m_pimpl->txCount();
+}
+
+quint64 UnsignedTransaction::minMixinCount() const
+{
+ return m_pimpl->minMixinCount();
+}
+
+QString UnsignedTransaction::confirmationMessage() const
+{
+ return QString::fromStdString(m_pimpl->confirmationMessage());
+}
+
+QStringList UnsignedTransaction::paymentId() const
+{
+ QList<QString> list;
+ for (const auto &t: m_pimpl->paymentId())
+ list.append(QString::fromStdString(t));
+ return list;
+}
+
+QStringList UnsignedTransaction::recipientAddress() const
+{
+ QList<QString> list;
+ for (const auto &t: m_pimpl->recipientAddress())
+ list.append(QString::fromStdString(t));
+ return list;
+}
+
+bool UnsignedTransaction::sign(const QString &fileName) const
+{
+ if(!m_pimpl->sign(fileName.toStdString()))
+ return false;
+ // export key images
+ return m_walletImpl->exportKeyImages(fileName.toStdString() + "_keyImages");
+}
+
+void UnsignedTransaction::setFilename(const QString &fileName)
+{
+ m_fileName = fileName;
+}
+
+UnsignedTransaction::UnsignedTransaction(Monero::UnsignedTransaction *pt, Monero::Wallet *walletImpl, QObject *parent)
+ : QObject(parent), m_pimpl(pt), m_walletImpl(walletImpl)
+{
+
+}
+
+UnsignedTransaction::~UnsignedTransaction()
+{
+ delete m_pimpl;
+}
diff --git a/src/libwalletqt/UnsignedTransaction.h b/src/libwalletqt/UnsignedTransaction.h
new file mode 100644
index 00000000..749445a2
--- /dev/null
+++ b/src/libwalletqt/UnsignedTransaction.h
@@ -0,0 +1,59 @@
+#ifndef UNSIGNEDTRANSACTION_H
+#define UNSIGNEDTRANSACTION_H
+
+#include <QObject>
+
+#include <wallet/wallet2_api.h>
+
+class UnsignedTransaction : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(Status status READ status)
+ Q_PROPERTY(QString errorString READ errorString)
+ // Q_PROPERTY(QList<qulonglong> amount READ amount)
+ // Q_PROPERTY(QList<qulonglong> fee READ fee)
+ Q_PROPERTY(quint64 txCount READ txCount)
+ Q_PROPERTY(QString confirmationMessage READ confirmationMessage)
+ Q_PROPERTY(QStringList recipientAddress READ recipientAddress)
+ Q_PROPERTY(QStringList paymentId READ paymentId)
+ Q_PROPERTY(quint64 minMixinCount READ minMixinCount)
+
+public:
+ enum Status {
+ Status_Ok = Monero::UnsignedTransaction::Status_Ok,
+ Status_Error = Monero::UnsignedTransaction::Status_Error,
+ Status_Critical = Monero::UnsignedTransaction::Status_Critical
+ };
+ Q_ENUM(Status)
+
+ enum Priority {
+ Priority_Low = Monero::UnsignedTransaction::Priority_Low,
+ Priority_Medium = Monero::UnsignedTransaction::Priority_Medium,
+ Priority_High = Monero::UnsignedTransaction::Priority_High
+ };
+ Q_ENUM(Priority)
+
+ Status status() const;
+ QString errorString() const;
+ Q_INVOKABLE quint64 amount(int index) const;
+ Q_INVOKABLE quint64 fee(int index) const;
+ Q_INVOKABLE quint64 mixin(int index) const;
+ QStringList recipientAddress() const;
+ QStringList paymentId() const;
+ quint64 txCount() const;
+ QString confirmationMessage() const;
+ quint64 minMixinCount() const;
+ Q_INVOKABLE bool sign(const QString &fileName) const;
+ Q_INVOKABLE void setFilename(const QString &fileName);
+
+private:
+ explicit UnsignedTransaction(Monero::UnsignedTransaction * pt, Monero::Wallet *walletImpl, QObject *parent = 0);
+ ~UnsignedTransaction();
+private:
+ friend class Wallet;
+ Monero::UnsignedTransaction * m_pimpl;
+ QString m_fileName;
+ Monero::Wallet * m_walletImpl;
+};
+
+#endif // UNSIGNEDTRANSACTION_H
diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp
index 47f4a06a..6147e1cb 100644
--- a/src/libwalletqt/Wallet.cpp
+++ b/src/libwalletqt/Wallet.cpp
@@ -1,5 +1,6 @@
#include "Wallet.h"
#include "PendingTransaction.h"
+#include "UnsignedTransaction.h"
#include "TransactionHistory.h"
#include "AddressBook.h"
#include "model/TransactionHistoryModel.h"
@@ -158,6 +159,15 @@ void Wallet::initAsync(const QString &daemonAddress, quint64 upperTransactionLim
m_walletImpl->initAsync(daemonAddress.toStdString(), upperTransactionLimit);
}
+//! create a view only wallet
+bool Wallet::createViewOnly(const QString &path, const QString &password) const
+{
+ // Create path
+ QDir d = QFileInfo(path).absoluteDir();
+ d.mkpath(d.absolutePath());
+ return m_walletImpl->createWatchOnly(path.toStdString(),password.toStdString(),m_walletImpl->getSeedLanguage());
+}
+
bool Wallet::connectToDaemon()
{
return m_walletImpl->connectToDaemon();
@@ -168,6 +178,11 @@ void Wallet::setTrustedDaemon(bool arg)
m_walletImpl->setTrustedDaemon(arg);
}
+bool Wallet::viewOnly() const
+{
+ return m_walletImpl->watchOnly();
+}
+
quint64 Wallet::balance() const
{
return m_walletImpl->balance();
@@ -197,7 +212,6 @@ quint64 Wallet::daemonBlockChainHeight() const
quint64 Wallet::daemonBlockChainTargetHeight() const
{
-
if (m_daemonBlockChainTargetHeight == 0
|| m_daemonBlockChainTargetHeightTime.elapsed() / 1000 > m_daemonBlockChainTargetHeightTtl) {
m_daemonBlockChainTargetHeight = m_walletImpl->daemonBlockChainTargetHeight();
@@ -309,12 +323,34 @@ void Wallet::createSweepUnmixableTransactionAsync()
});
}
+UnsignedTransaction * Wallet::loadTxFile(const QString &fileName)
+{
+ qDebug() << "Trying to sign " << fileName;
+ Monero::UnsignedTransaction * ptImpl = m_walletImpl->loadUnsignedTx(fileName.toStdString());
+ UnsignedTransaction * result = new UnsignedTransaction(ptImpl, m_walletImpl, this);
+ return result;
+}
+
+bool Wallet::submitTxFile(const QString &fileName) const
+{
+ qDebug() << "Trying to submit " << fileName;
+ if (!m_walletImpl->submitTransaction(fileName.toStdString()))
+ return false;
+ // import key images
+ return m_walletImpl->importKeyImages(fileName.toStdString() + "_keyImages");
+}
+
void Wallet::disposeTransaction(PendingTransaction *t)
{
m_walletImpl->disposeTransaction(t->m_pimpl);
delete t;
}
+void Wallet::disposeTransaction(UnsignedTransaction *t)
+{
+ delete t;
+}
+
TransactionHistory *Wallet::history() const
{
return m_history;
@@ -474,6 +510,11 @@ bool Wallet::parse_uri(const QString &uri, QString &address, QString &payment_id
return res;
}
+bool Wallet::rescanSpent()
+{
+ return m_walletImpl->rescanSpent();
+}
+
Wallet::Wallet(Monero::Wallet *w, QObject *parent)
: QObject(parent)
, m_walletImpl(w)
diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h
index 63d3b1a3..2fb0ba6e 100644
--- a/src/libwalletqt/Wallet.h
+++ b/src/libwalletqt/Wallet.h
@@ -6,6 +6,7 @@
#include "wallet/wallet2_api.h" // we need to have an access to the Monero::Wallet::Status enum here;
#include "PendingTransaction.h" // we need to have an access to the PendingTransaction::Priority enum here;
+#include "UnsignedTransaction.h"
namespace Monero {
class Wallet; // forward declaration
@@ -36,7 +37,7 @@ class Wallet : public QObject
Q_PROPERTY(QString path READ path)
Q_PROPERTY(AddressBookModel * addressBookModel READ addressBookModel)
Q_PROPERTY(AddressBook * addressBook READ addressBook)
-
+ Q_PROPERTY(bool viewOnly READ viewOnly)
public:
@@ -98,6 +99,9 @@ public:
//! initializes wallet asynchronously
Q_INVOKABLE void initAsync(const QString &daemonAddress, quint64 upperTransactionLimit, bool isRecovering = false, quint64 restoreHeight = 0);
+ //! create a view only wallet
+ Q_INVOKABLE bool createViewOnly(const QString &path, const QString &password) const;
+
//! connects to daemon
Q_INVOKABLE bool connectToDaemon();
@@ -110,6 +114,9 @@ public:
//! returns unlocked balance
Q_INVOKABLE quint64 unlockedBalance() const;
+ //! returns if view only wallet
+ Q_INVOKABLE bool viewOnly() const;
+
//! returns current wallet's block height
//! (can be less than daemon's blockchain height when wallet sync in progress)
Q_INVOKABLE quint64 blockChainHeight() const;
@@ -156,9 +163,19 @@ public:
//! creates async sweep unmixable transaction
Q_INVOKABLE void createSweepUnmixableTransactionAsync();
+ //! Sign a transfer from file
+ Q_INVOKABLE UnsignedTransaction * loadTxFile(const QString &fileName);
+
+ //! Submit a transfer from file
+ Q_INVOKABLE bool submitTxFile(const QString &fileName) const;
+
+
//! deletes transaction and frees memory
Q_INVOKABLE void disposeTransaction(PendingTransaction * t);
+ //! deletes unsigned transaction and frees memory
+ Q_INVOKABLE void disposeTransaction(UnsignedTransaction * t);
+
//! returns transaction history
TransactionHistory * history() const;
@@ -193,8 +210,9 @@ public:
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;
+ // Rescan spent outputs
+ Q_INVOKABLE bool rescanSpent();
// TODO: setListenter() when it implemented in API
signals: