From 79f0fb39d1b66a37ec66110e9e9b657b5be2d3ec Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 14 Jan 2019 15:03:35 -0800 Subject: [PATCH 01/25] Add null checks --- src/mainwindow.cpp | 29 +++++++++++++++-------------- src/mainwindow.h | 1 - src/mainwindow.ui | 2 +- src/rpc.cpp | 19 +++++++++++++++---- src/rpc.h | 2 +- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6f0d8cb..4de5965 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -39,7 +39,8 @@ MainWindow::MainWindow(QWidget *parent) : // Set up check for updates action QObject::connect(ui->actionCheck_for_Updates, &QAction::triggered, [=] () { - QDesktopServices::openUrl(QUrl("https://github.com/ZcashFoundation/zec-qt-wallet/releases")); + // Silent is false, so show notification even if no update was found + rpc->checkForUpdate(false); }); // Pay zcash URI @@ -659,21 +660,16 @@ void MainWindow::doImport(QList* keys) { } } -void MainWindow::payZcashURIError(QString errorDetail) { - QMessageBox::critical(this, tr("Error paying zcash URI"), - tr("URI should be of the form 'zcash:?amt=x&memo=y") + "\n" + errorDetail); -} - void MainWindow::payZcashURI() { + // Error to display if something goes wrong. + auto payZcashURIError = [=] (QString errorDetail = "") { + QMessageBox::critical(this, tr("Error paying zcash URI"), + tr("URI should be of the form 'zcash:?amt=x&memo=y") + "\n" + errorDetail); + }; + // Read a zcash URI and pay it - QInputDialog uriDialog(this); - uriDialog.setInputMode(QInputDialog::TextInput); - uriDialog.setWindowTitle(tr("Paste zcash URI")); - uriDialog.setLabelText("zcash://" + QString(" ").repeated(180)); // Hack to adjust the width of the dialog - if (uriDialog.exec() != QDialog::Accepted) { - return; - } - QString uri = uriDialog.textValue(); + QString uri = QInputDialog::getText(this, tr("Paste zcash URI"), + "zcash://" + QString(" ").repeated(180)); // URI should be of the form zcash://address?amt=x&memo=y if (!uri.startsWith("zcash:")) { @@ -707,6 +703,11 @@ void MainWindow::payZcashURI() { QStringList args = uri.split("&"); for (QString arg: args) { QStringList kv = arg.split("="); + if (kv.length() != 2) { + payZcashURIError(); + return; + } + if (kv[0].toLower() == "amt" || kv[0].toLower() == "amount") { amount = kv[1].toDouble(); } else if (kv[0].toLower() == "memo") { diff --git a/src/mainwindow.h b/src/mainwindow.h index f02adb4..5b5350e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -89,7 +89,6 @@ private: void donate(); void addressBook(); - void payZcashURIError(QString errorDetail = ""); void payZcashURI(); void postToZBoard(); void importPrivKey(); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 86f1a90..7e758d1 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1111,7 +1111,7 @@ - Pay zcash URI... + Pay zcash &URI... diff --git a/src/rpc.cpp b/src/rpc.cpp index 5b5cfef..7eab839 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -905,7 +905,7 @@ void RPC::watchTxStatus() { }); } -void RPC::checkForUpdate() { +void RPC::checkForUpdate(bool silent) { if (conn == nullptr) return noConnection(); @@ -926,13 +926,18 @@ void RPC::checkForUpdate() { QVersionNumber maxVersion(0, 0, 0); for (QJsonValue rel : releases) { + if (!rel.toObject().contains("tag_name")) + continue; + QString tag = rel.toObject()["tag_name"].toString(); if (tag.startsWith("v")) tag = tag.right(tag.length() - 1); - auto v = QVersionNumber::fromString(tag); - if (v > maxVersion) - maxVersion = v; + if (!tag.isEmpty()) { + auto v = QVersionNumber::fromString(tag); + if (v > maxVersion) + maxVersion = v; + } } auto currentVersion = QVersionNumber::fromString(APP_VERSION); @@ -946,6 +951,12 @@ void RPC::checkForUpdate() { if (ans == QMessageBox::Yes) { QDesktopServices::openUrl(QUrl("https://github.com/ZcashFoundation/zec-qt-wallet/releases")); } + } else { + if (!silent) { + QMessageBox::information(main, QObject::tr("No updates available"), + QObject::tr("You already have the latest release v%1") + .arg(currentVersion.toString())); + } } } } diff --git a/src/rpc.h b/src/rpc.h index 7f0c18d..3b53fb8 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -38,7 +38,7 @@ public: void refreshAddresses(); - void checkForUpdate(); + void checkForUpdate(bool silent = true); void refreshZECPrice(); void getZboardTopics(std::function)> cb); From 8887ddeaaab7117f24738dd6e1daa7a12eb3dc05 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 14 Jan 2019 15:04:27 -0800 Subject: [PATCH 02/25] update label --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 4de5965..466f30f 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -669,7 +669,7 @@ void MainWindow::payZcashURI() { // Read a zcash URI and pay it QString uri = QInputDialog::getText(this, tr("Paste zcash URI"), - "zcash://" + QString(" ").repeated(180)); + "Zcash URI" + QString(" ").repeated(180)); // URI should be of the form zcash://address?amt=x&memo=y if (!uri.startsWith("zcash:")) { From 2408fecb0700809b183d84d5077d33cdcab77613 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 14 Jan 2019 15:09:15 -0800 Subject: [PATCH 03/25] capitalization and update translations --- res/zec_qt_wallet_de.ts | 220 +++++++++++++++++++++++++--------------- res/zec_qt_wallet_es.ts | 220 +++++++++++++++++++++++++--------------- res/zec_qt_wallet_fr.ts | 220 +++++++++++++++++++++++++--------------- res/zec_qt_wallet_pt.ts | 220 +++++++++++++++++++++++++--------------- src/mainwindow.cpp | 2 +- 5 files changed, 545 insertions(+), 337 deletions(-) diff --git a/res/zec_qt_wallet_de.ts b/res/zec_qt_wallet_de.ts index 2e38021..fd505b8 100644 --- a/res/zec_qt_wallet_de.ts +++ b/res/zec_qt_wallet_de.ts @@ -138,8 +138,8 @@ - - + + Memo YOUR_TRANSLATION_HERE @@ -244,7 +244,7 @@ - + Loading... YOUR_TRANSLATION_HERE @@ -276,303 +276,333 @@ YOUR_TRANSLATION_HERE - + &Help YOUR_TRANSLATION_HERE - + &Apps YOUR_TRANSLATION_HERE - + &Edit YOUR_TRANSLATION_HERE - + E&xit YOUR_TRANSLATION_HERE - + &About YOUR_TRANSLATION_HERE - + &Settings YOUR_TRANSLATION_HERE - + Ctrl+P YOUR_TRANSLATION_HERE - + &Donate YOUR_TRANSLATION_HERE - + Check github.com for &updates YOUR_TRANSLATION_HERE - + Sapling &turnstile YOUR_TRANSLATION_HERE - + Ctrl+A, Ctrl+T YOUR_TRANSLATION_HERE - + &Import private key YOUR_TRANSLATION_HERE - + &Export all private keys YOUR_TRANSLATION_HERE - + &z-board.net YOUR_TRANSLATION_HERE - + Ctrl+A, Ctrl+Z YOUR_TRANSLATION_HERE - + Address &book YOUR_TRANSLATION_HERE - + Ctrl+B YOUR_TRANSLATION_HERE - + &Backup wallet.dat YOUR_TRANSLATION_HERE - - + + Export transactions - + + Pay zcash &URI... + + + + Tor configuration is available only when running an embedded zcashd. - + Enable Tor - + Connection over Tor has been enabled. To use this feature, you need to restart zec-qt-wallet. - + Disable Tor - + Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart zec-qt-wallet. - + Thanks for supporting zec-qt-wallet! YOUR_TRANSLATION_HERE - + Donate 0.01 YOUR_TRANSLATION_HERE - + to support zec-qt-wallet YOUR_TRANSLATION_HERE - + You are on testnet, your post won't actually appear on z-board.net YOUR_TRANSLATION_HERE - + You need a sapling address with available balance to post YOUR_TRANSLATION_HERE - + Computing Tx: YOUR_TRANSLATION_HERE - + The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited YOUR_TRANSLATION_HERE - + Private key import rescan finished YOUR_TRANSLATION_HERE + Error paying zcash URI + + + + + URI should be of the form 'zcash:<addr>?amt=x&memo=y + + + + + Paste Zcash URI + + + + + Could not understand address + + + + + Unknown field in URI: + + + + Please paste your private keys (z-Addr or t-Addr) here, one per line YOUR_TRANSLATION_HERE - + The keys will be imported into your connected zcashd node YOUR_TRANSLATION_HERE - + Error - + Error exporting transactions, file was not saved - + No wallet.dat YOUR_TRANSLATION_HERE - + Couldn't find the wallet.dat on this computer YOUR_TRANSLATION_HERE - + You need to back it up from the machine zcashd is running on YOUR_TRANSLATION_HERE - + Backup wallet.dat YOUR_TRANSLATION_HERE - + Couldn't backup YOUR_TRANSLATION_HERE - + Couldn't backup the wallet.dat file. YOUR_TRANSLATION_HERE - + You need to back it up manually. YOUR_TRANSLATION_HERE - + These are all the private keys for all the addresses in your wallet YOUR_TRANSLATION_HERE - + Private key for YOUR_TRANSLATION_HERE - + Save File YOUR_TRANSLATION_HERE - + Unable to open file YOUR_TRANSLATION_HERE - - + + Copy address YOUR_TRANSLATION_HERE - - - + + + Copied to clipboard YOUR_TRANSLATION_HERE - + Get private key YOUR_TRANSLATION_HERE - + Shield balance to Sapling YOUR_TRANSLATION_HERE - - + + View on block explorer YOUR_TRANSLATION_HERE - + Migrate to Sapling YOUR_TRANSLATION_HERE - + Copy txid YOUR_TRANSLATION_HERE - + View Memo YOUR_TRANSLATION_HERE - + Reply to - + Created new t-Addr YOUR_TRANSLATION_HERE - + Address has been previously used - + Address is unused @@ -756,77 +786,99 @@ Not starting embedded zcashd because --no-embedded was passed YOUR_TRANSLATION_HERE - + Downloading blocks YOUR_TRANSLATION_HERE - + Block height YOUR_TRANSLATION_HERE - + Syncing YOUR_TRANSLATION_HERE - + Connected YOUR_TRANSLATION_HERE - + testnet: YOUR_TRANSLATION_HERE - + Connected to zcashd YOUR_TRANSLATION_HERE - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was YOUR_TRANSLATION_HERE - + The transaction with id YOUR_TRANSLATION_HERE - + failed. The error was YOUR_TRANSLATION_HERE - + failed YOUR_TRANSLATION_HERE - + Tx YOUR_TRANSLATION_HERE - + tx computing. This can take several minutes. YOUR_TRANSLATION_HERE - + + Update Available + + + + + A new release v%1 is available! You have v%2. + +Would you like to visit the releases page? + + + + + No updates available + + + + + You already have the latest release v%1 + + + + Please wait for zec-qt-wallet to exit YOUR_TRANSLATION_HERE - + Waiting for zcashd to exit YOUR_TRANSLATION_HERE @@ -866,13 +918,13 @@ Please set the host/port and user/password in the Edit->Settings menu. - + Connection Error YOUR_TRANSLATION_HERE - + Transaction Error YOUR_TRANSLATION_HERE @@ -882,8 +934,8 @@ Please set the host/port and user/password in the Edit->Settings menu.YOUR_TRANSLATION_HERE - + No Connection YOUR_TRANSLATION_HERE diff --git a/res/zec_qt_wallet_es.ts b/res/zec_qt_wallet_es.ts index 06a4518..d7f69e0 100644 --- a/res/zec_qt_wallet_es.ts +++ b/res/zec_qt_wallet_es.ts @@ -138,8 +138,8 @@ - - + + Memo Memo @@ -244,7 +244,7 @@ - + Loading... Cargando... @@ -276,303 +276,333 @@ &Archivo - + &Help &Ayuda - + &Apps &Apps - + &Edit &Editar - + E&xit Salir - + &About &Acerca de - + &Settings &Configuración - + Ctrl+P Ctrl+P - + &Donate &Donar - + Check github.com for &updates Consulte las actualizaciones en github.com - + Sapling &turnstile Sapling &turnstile - + Ctrl+A, Ctrl+T Ctrl+A, Ctrl+T - + &Import private key Importar clave privada - + &Export all private keys Exportar todas las claves privadas - + &z-board.net z-board.net - + Ctrl+A, Ctrl+Z Ctrl+A, Ctrl+Z - + Address &book Directorio - + Ctrl+B Ctrl+B - + &Backup wallet.dat Respaldar wallet.dat - - + + Export transactions - + + Pay zcash &URI... + + + + Tor configuration is available only when running an embedded zcashd. - + Enable Tor - + Connection over Tor has been enabled. To use this feature, you need to restart zec-qt-wallet. - + Disable Tor - + Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart zec-qt-wallet. - + Thanks for supporting zec-qt-wallet! Gracias por apoyar zec-qt-wallet! - + Donate 0.01 Donar 0.01 - + to support zec-qt-wallet para apoyar zec-qt-wallet - + You are on testnet, your post won't actually appear on z-board.net Estas en testnet, tu publicación no aparecerá en z-board.net - + You need a sapling address with available balance to post Necesitas una dirección Sapling con saldo disponible para publicar - + Computing Tx: Calculando Tx: - + The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited Las claves fueron importadas. Puede que se demore varios minutos en volver a escanear el blockchain. Hasta entonces, la funcionalidad puede ser limitada. - + Private key import rescan finished Importación de clave privada re-escaneada finalizada + Error paying zcash URI + + + + + URI should be of the form 'zcash:<addr>?amt=x&memo=y + + + + + Paste Zcash URI + + + + + Could not understand address + + + + + Unknown field in URI: + + + + Please paste your private keys (z-Addr or t-Addr) here, one per line Por favor pegue sus claves privadas (z-Addr o t-Addr) aqui, una por línea - + The keys will be imported into your connected zcashd node Las claves serán importadas en su nodo zcashd conectado - + Error - + Error exporting transactions, file was not saved - + No wallet.dat Sin wallet.dat - + Couldn't find the wallet.dat on this computer No se pudo encontrar wallet.dat en esta computadora - + You need to back it up from the machine zcashd is running on Necesitas hacer una copia de seguridad de la computadora en la que se está ejecutando zcashd - + Backup wallet.dat Respaldar wallet.dat - + Couldn't backup No se pudo hacer una copia de seguridad - + Couldn't backup the wallet.dat file. No se pudo hacer copia de seguridad de wallet.dat - + You need to back it up manually. Necesitas hacer una copia de seguridad manualmente. - + These are all the private keys for all the addresses in your wallet Estas son todas las claves privadas para todas las direcciones en tu billetera - + Private key for Clave privada para - + Save File Guardar Archivo - + Unable to open file No es posible abrir el archivo - - + + Copy address Copiar dirección - - - + + + Copied to clipboard Copiado al portapapeles - + Get private key Obtener clave privada - + Shield balance to Sapling Proteger saldo a Sapling - - + + View on block explorer Ver en el explorador de bloques - + Migrate to Sapling Migrar a Sapling - + Copy txid Copiar txid - + View Memo Ver Memo - + Reply to - + Created new t-Addr Nuevo dirección t-Addr creada - + Address has been previously used - + Address is unused @@ -674,83 +704,105 @@ doesn't look like a z-address QObject - + No Connection Sin Conexión - + Downloading blocks Descargando Bloques - + Block height Altura del bloque - + Syncing Sincronizando - + Connected Conectando - + testnet: testnet: - + Connected to zcashd Conectando a zcashd - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was Hubo un error al conectar con zcashd. El error fue - + The transaction with id La transacción con id - + failed. The error was falló. El error fue - + Tx Tx - + failed falló - + tx computing. This can take several minutes. tx computando. Esto puede tomar varios minutos. - + + Update Available + + + + + A new release v%1 is available! You have v%2. + +Would you like to visit the releases page? + + + + + No updates available + + + + + You already have the latest release v%1 + + + + Please wait for zec-qt-wallet to exit Por favor, espere que zec-qt-wallet salga - + Waiting for zcashd to exit Esperando que zcashd salga @@ -826,7 +878,7 @@ Por favor, especificar el host/puerta y usario/contraseña en el menú Editar-&g - + Transaction Error Error De Transacción @@ -892,7 +944,7 @@ No iniciaré zcashd incorporado porque la opcion --no-embedded fue dada. - + Connection Error Error de conexión diff --git a/res/zec_qt_wallet_fr.ts b/res/zec_qt_wallet_fr.ts index 091dffa..a263e31 100644 --- a/res/zec_qt_wallet_fr.ts +++ b/res/zec_qt_wallet_fr.ts @@ -138,8 +138,8 @@ - - + + Memo Mémo @@ -245,7 +245,7 @@ - + Loading... Chargement... @@ -277,303 +277,333 @@ &Fichier - + &Help &Aide - + &Apps &Applications - + &Edit &Edition - + E&xit Q&uiter - + &About &À propos - + &Settings &Préférences - + Ctrl+P Ctrl+P - + &Donate &Faire un don - + Check github.com for &updates Vérifier &github.com pour des mises à jour - + Sapling &turnstile Sapling &turnstile - + Ctrl+A, Ctrl+T Ctrl+A, Ctrl+T - + &Import private key &Importer une clef privée - + &Export all private keys &Exporter toutes les clefs privées - + &z-board.net &z-board.net - + Ctrl+A, Ctrl+Z Ctrl+A, Ctrl+Z - + Address &book Carnet &d'adresse - + Ctrl+B Ctrl+B - + &Backup wallet.dat &Sauvegarder "wallet.dat" - - + + Export transactions Exporter les transactions - + + Pay zcash &URI... + + + + Tor configuration is available only when running an embedded zcashd. La configuration de Tor est disponible uniquement lors de l'exécution du processus zcashd intégré. - + Enable Tor Activer Tor - + Connection over Tor has been enabled. To use this feature, you need to restart zec-qt-wallet. La connection via Tor est activée. Afin d'utiliser cette fonctionnalité, veuillez redémarer zec-qt-wallet. - + Disable Tor Désactiver Tor - + Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart zec-qt-wallet. La connection via Tor a été désactivée. Afin de complètement se déconnecter de Tor, vous devez redémarrer zec-qt-wallet. - + Thanks for supporting zec-qt-wallet! Merci de supporter zec-qt-wallet ! - + Donate 0.01 Donner 0.01 - + to support zec-qt-wallet pour supporter zec-qt-wallet - + You are on testnet, your post won't actually appear on z-board.net Vous êtes connecté au réseau de test. Votre message n'apparaîtra donc pas sur z-board.net - + You need a sapling address with available balance to post Vous avez besoin d'une adresse de type Sapling avec un solde suffisant pour pouvoir poster - + Computing Tx: Calcul de la transaction en cours: - + The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited Les clefs ont été importées. Cela peut prendre quelque minutes pour rescanner la blockchain. Durant cette période, les fonctionnalités peuvent être limitées - + Private key import rescan finished Rescan de l'import de la clef privée achevé + Error paying zcash URI + + + + + URI should be of the form 'zcash:<addr>?amt=x&memo=y + + + + + Paste Zcash URI + + + + + Could not understand address + + + + + Unknown field in URI: + + + + Please paste your private keys (z-Addr or t-Addr) here, one per line Veuillez coller votre clef privée (Adresse-z ou Adresse-t) ici. Une clef par ligne - + The keys will be imported into your connected zcashd node Les clef seront importées dans votre noeud zcashd connecté - + Error Erreur - + Error exporting transactions, file was not saved Erreur lors de l'exportation des transactions. Le fichier n'a pas été sauvegardé. - + No wallet.dat Pas de fichier "wallet.dat" - + Couldn't find the wallet.dat on this computer Impossible de trouver le fichier "wallet.dat" sur cet ordinateur - + You need to back it up from the machine zcashd is running on Vous devez effectuer la sauvegarde depuis la machine sur laquelle zcashd est en cours d'exécution - + Backup wallet.dat Sauvegarder wallet.dat - + Couldn't backup La sauvegarde n'a pas pu être effectuée - + Couldn't backup the wallet.dat file. Impossible de sauvegarder le fichier "wallet.dat". - + You need to back it up manually. Vous devez le sauvegarder manuellement. - + These are all the private keys for all the addresses in your wallet Ce sont toutes les clés privées pour toutes les adresses de votre portefeuille - + Private key for Clef privée pour - + Save File Sauvegarder le fichier - + Unable to open file mpossible d'ouvrir le fichier - - + + Copy address Copier l'adresse - - - + + + Copied to clipboard Copié dans le presse-papier - + Get private key Obtenir la clef privée - + Shield balance to Sapling Rendre privé le solde vers Sapling - - + + View on block explorer Voir dans l'explorateur de block - + Migrate to Sapling Migrer vers Sapling - + Copy txid Copier l'ID de transaction - + View Memo Voir le mémo - + Reply to Répondre à - + Created new t-Addr Nouvelle Adresse-t créée - + Address has been previously used L'adresse a été utilisée précédemment. - + Address is unused L'adresse est inutilisée. @@ -768,77 +798,99 @@ Not starting embedded zcashd because --no-embedded was passed MB à - + Downloading blocks Blocs en cours de téléchargement - + Block height Hauteur de bloc - + Syncing Synchronisation - + Connected Connecté - + testnet: réseau test: - + Connected to zcashd Connecté à zcashd - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was Une erreur est survenue lors de la connection à zcashd. L'erreur est - + The transaction with id La transaction avec ID - + failed. The error was a échoué. L'erreur était - + failed a échoué - + Tx Tx - + tx computing. This can take several minutes. tx en cours de calcul. Ceci peut prendre quelques minutes. - + + Update Available + + + + + A new release v%1 is available! You have v%2. + +Would you like to visit the releases page? + + + + + No updates available + + + + + You already have the latest release v%1 + + + + Please wait for zec-qt-wallet to exit Veuillez patienter. Fermeture de zec-qt-wallet en cours - + Waiting for zcashd to exit Attente de la fermeture de zcashd @@ -882,13 +934,13 @@ Veuillez configurer l'hôte/port et utilisateur/mot de passe dans le menu E - + Connection Error Erreur de connection - + Transaction Error Erreur de transaction @@ -898,8 +950,8 @@ Veuillez configurer l'hôte/port et utilisateur/mot de passe dans le menu E Une erreur est survenue en envoyant la transaction. L'erreur est: - + No Connection Pas de connection diff --git a/res/zec_qt_wallet_pt.ts b/res/zec_qt_wallet_pt.ts index a0cd396..60cecf2 100644 --- a/res/zec_qt_wallet_pt.ts +++ b/res/zec_qt_wallet_pt.ts @@ -138,8 +138,8 @@ - - + + Memo Anexar recado @@ -244,7 +244,7 @@ - + Loading... Carregando... @@ -276,303 +276,333 @@ &Arquivo - + &Help &Ajuda - + &Apps &Aplicações - + &Edit &Editar - + E&xit Sair - + &About &Sobre - + &Settings &Preferências - + Ctrl+P Ctrl+P - + &Donate &Doar - + Check github.com for &updates &Checar github.com por atualizações - + Sapling &turnstile Sapling &turnstile - + Ctrl+A, Ctrl+T Ctrl+A, Ctrl+T - + &Import private key &Importar chave privada - + &Export all private keys &Exportar todas as chaves privadas - + &z-board.net &z-board.net - + Ctrl+A, Ctrl+Z Ctrl+A, Ctrl+Z - + Address &book &Agenda de Endereços - + Ctrl+B Ctrl+B - + &Backup wallet.dat &Salvar wallet.dat - - + + Export transactions - + + Pay zcash &URI... + + + + Tor configuration is available only when running an embedded zcashd. - + Enable Tor - + Connection over Tor has been enabled. To use this feature, you need to restart zec-qt-wallet. - + Disable Tor - + Connection over Tor has been disabled. To fully disconnect from Tor, you need to restart zec-qt-wallet. - + Thanks for supporting zec-qt-wallet! Obrigado por apoiar a zec-qt-wallet! - + Donate 0.01 Doar 0.01 - + to support zec-qt-wallet para apoiar zec-qt-wallet - + You are on testnet, your post won't actually appear on z-board.net Você está na testnet, seu post não aparecerá no z-board.net - + You need a sapling address with available balance to post Você precisa de um endereço sapling com saldo disponível para postar - + Computing Tx: Gerando Tx: - + The keys were imported. It may take several minutes to rescan the blockchain. Until then, functionality may be limited Chaves importadas. Pode demorar alguns minutos para re-escanear a blockchain. Até lá, funcionalidades poderão estar limitadas - + Private key import rescan finished Re-escan de chave privada completo + Error paying zcash URI + + + + + URI should be of the form 'zcash:<addr>?amt=x&memo=y + + + + + Paste Zcash URI + + + + + Could not understand address + + + + + Unknown field in URI: + + + + Please paste your private keys (z-Addr or t-Addr) here, one per line Coloque sua(s) chave(s) privadas (z-Addr ou t-Addr) aqui, uma por linha - + The keys will be imported into your connected zcashd node As chaves serão importadas em seu nó zcashd conectado - + Error - + Error exporting transactions, file was not saved - + No wallet.dat Nenhum wallet.data - + Couldn't find the wallet.dat on this computer Não foi localizado o wallet.dat nesse computador - + You need to back it up from the machine zcashd is running on Você precisar salvar a partir da máquina que zcashd está rodando - + Backup wallet.dat Salvar wallet.dat - + Couldn't backup Não foi possível salvar - + Couldn't backup the wallet.dat file. Não foi possível salvar o arquivo wallet.dat. - + You need to back it up manually. Você precisar salvá-lo manualmente. - + These are all the private keys for all the addresses in your wallet YOUR_TRANSLATION_HERE - + Private key for Chave privada para - + Save File Salvar Arquivo - + Unable to open file Não foi possível abrir o arquivo - - + + Copy address Copiar endereço - - - + + + Copied to clipboard Copiado - + Get private key Obter chave privada - + Shield balance to Sapling Blindar saldo para Sapling - - + + View on block explorer Ver no explorador de blocos - + Migrate to Sapling Migrar para Sapling - + Copy txid Copiar txid - + View Memo Ver Recado - + Reply to - + Created new t-Addr Criar novo t-Addr - + Address has been previously used - + Address is unused @@ -766,77 +796,99 @@ Não iniciando zcashd acoplado porque nenhum foi passado como parâmetroMB a - + Downloading blocks Baixando blocos - + Block height Altura do bloco - + Syncing Sincronizando - + Connected Conectado - + testnet: testnet: - + Connected to zcashd Conectado ao zcashd - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was Ocorreu um erro conectando ao zcashd. O erro foi - + The transaction with id A transação com id - + failed. The error was falhou. O erro foi - + failed falhou - + Tx Tx - + tx computing. This can take several minutes. gerando transação. Isso pode levar alguns minutos. - + + Update Available + + + + + A new release v%1 is available! You have v%2. + +Would you like to visit the releases page? + + + + + No updates available + + + + + You already have the latest release v%1 + + + + Please wait for zec-qt-wallet to exit Por favor, espera zec-qt-wallet finalizar - + Waiting for zcashd to exit Esperando zcashd finalizar @@ -880,13 +932,13 @@ Por favor, coloque o host/porta e usuário/senha no menu Editar>Preferências - + Connection Error Erro na Conexão - + Transaction Error Erro na transação @@ -896,8 +948,8 @@ Por favor, coloque o host/porta e usuário/senha no menu Editar>Preferências Ocorreu um erro enviando a transação. O erro foi: - + No Connection Sem Conexão diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 466f30f..749c204 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -668,7 +668,7 @@ void MainWindow::payZcashURI() { }; // Read a zcash URI and pay it - QString uri = QInputDialog::getText(this, tr("Paste zcash URI"), + QString uri = QInputDialog::getText(this, tr("Paste Zcash URI"), "Zcash URI" + QString(" ").repeated(180)); // URI should be of the form zcash://address?amt=x&memo=y From 05d90ca95323d6dbba456164fc0488a4b0f90956 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 14 Jan 2019 15:17:32 -0800 Subject: [PATCH 04/25] v0.5.7 --- README.md | 6 +++--- src/version.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a4775c3..2b3febd 100644 --- a/README.md +++ b/README.md @@ -10,14 +10,14 @@ Head over to the releases page and grab the latest installers or binary. https:/ If you are on Debian/Ubuntu, please download the `.deb` package and install it. ``` -sudo dpkg -i linux-deb-zec-qt-wallet-v0.5.6.deb +sudo dpkg -i linux-deb-zec-qt-wallet-v0.5.7.deb sudo apt install -f ``` Or you can download and run the binaries directly. ``` -tar -xvf zec-qt-wallet-v0.5.6.tar.gz -./zec-qt-wallet-v0.5.6/zec-qt-wallet +tar -xvf zec-qt-wallet-v0.5.7.tar.gz +./zec-qt-wallet-v0.5.7/zec-qt-wallet ``` ### Windows diff --git a/src/version.h b/src/version.h index fd3ca23..ec5d866 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define APP_VERSION "0.5.6" +#define APP_VERSION "0.5.7" From 4442d3aa596280927e869e42a4b5014b166977a3 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 14 Jan 2019 15:23:52 -0800 Subject: [PATCH 05/25] Don't show error on cancel --- src/mainwindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 749c204..3ec9b68 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -671,6 +671,9 @@ void MainWindow::payZcashURI() { QString uri = QInputDialog::getText(this, tr("Paste Zcash URI"), "Zcash URI" + QString(" ").repeated(180)); + if (uri.isEmpty()) + return; + // URI should be of the form zcash://address?amt=x&memo=y if (!uri.startsWith("zcash:")) { payZcashURIError(); From c872184c6470697dc2664c7978d0f8b8efc6e3b0 Mon Sep 17 00:00:00 2001 From: den200 Date: Thu, 17 Jan 2019 17:56:03 +0100 Subject: [PATCH 06/25] Extra French translation (#89) --- res/zec_qt_wallet_fr.ts | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/res/zec_qt_wallet_fr.ts b/res/zec_qt_wallet_fr.ts index a263e31..2d9bfbf 100644 --- a/res/zec_qt_wallet_fr.ts +++ b/res/zec_qt_wallet_fr.ts @@ -224,7 +224,7 @@ Address used - + Adresse utilisée @@ -375,7 +375,7 @@ Pay zcash &URI... - + PAyer une URI zcash @@ -446,27 +446,27 @@ Error paying zcash URI - + Erreur lors du payement du URI zcash URI should be of the form 'zcash:<addr>?amt=x&memo=y - + Le format URI doit être comme suit: 'zcash:<addr>?amt=x&memo=y< Paste Zcash URI - + Coller le URI Zcash Could not understand address - + Adresse non valide Unknown field in URI: - + Champ inconnu dans le URI @@ -679,7 +679,7 @@ Cette adresse ne semble pas être de type adresse-z Amount '%1' is invalid! - + Le montant '%1' est invalide. @@ -830,7 +830,7 @@ Not starting embedded zcashd because --no-embedded was passed zcashd has no peer connections - + zcashd n'a aucune connexion à un pair @@ -865,24 +865,24 @@ Not starting embedded zcashd because --no-embedded was passed Update Available - + MàJ disponible A new release v%1 is available! You have v%2. Would you like to visit the releases page? - + Voulez-vous visiter la page des nouvelles versions ? No updates available - + Pas de MàJ disponible You already have the latest release v%1 - + Vous utilisez déjà la dernière version v%1 @@ -973,22 +973,22 @@ Veuillez configurer l'hôte/port et utilisateur/mot de passe dans le menu E Import Address Book - + Importer le carnet d'adresses Unable to open file - mpossible d'ouvrir le fichier + Impossible d'ouvrir le fichier Address Book Import Done - + Import du carnet d'adresses terminé Imported %1 new Address book entries - + %1 nouvelle(s) entrée(s) importée(s) dans le carnet d'adresses. @@ -1246,7 +1246,7 @@ Vous avez soit des fonds non confirmés soit le solde est trop petit pour une mi Import Address Book - + Importer de carnet d'adresses @@ -1269,7 +1269,7 @@ Vous avez soit des fonds non confirmés soit le solde est trop petit pour une mi zcashd doesn't seem to have any peers. You might not be connected to the internet, so this Transaction might not work. - + zcashd semble n'avoir aucune connexion à un autre pair. Comme vous n'êtes peut-être pas connecté à Internet, cette transaction pourrait ne pas fonctionner. From 0358a1efa55949a78d7641453429fa4bc1b34695 Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Tue, 22 Jan 2019 18:31:33 -0800 Subject: [PATCH 07/25] add execute method to allow autonomous Txns --- .gitignore | 1 + src/mainwindow.cpp | 19 +++++++------ src/rpc.cpp | 66 ++++++++++++++++++++++++++++++---------------- src/rpc.h | 18 ++++++++++--- src/sendtab.cpp | 27 +++++++++++-------- src/turnstile.cpp | 28 +++++++++++--------- 6 files changed, 102 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index ad04c2d..40c5a53 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ release/ x64/ artifacts/ .vscode/ +res/libsodium/libsodium* src/ui_*.h *.autosave src/precompiled.h.cpp diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3ec9b68..49c17d9 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -616,17 +616,20 @@ void MainWindow::postToZBoard() { tx.toAddrs.push_back(ToFields{ toAddr, Settings::getZboardAmount(), memo, memo.toUtf8().toHex() }); tx.fee = Settings::getMinerFee(); - json params = json::array(); - rpc->fillTxJsonParams(params, tx); - std::cout << std::setw(2) << params << std::endl; - // And send the Tx - rpc->sendZTransaction(params, [=](const json& reply) { - QString opid = QString::fromStdString(reply.get()); + rpc->executeTransaction(tx, [=] (QString opid) { ui->statusBar->showMessage(tr("Computing Tx: ") % opid); + }, + [=] (QString opid, QString txid) { + ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + }, + [=] (QString opid, QString errStr) { + ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; - // And then start monitoring the transaction - rpc->addNewTxToWatch(tx, opid); + QMessageBox::critical(this, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); }); } } diff --git a/src/rpc.cpp b/src/rpc.cpp index 7eab839..1527502 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -213,7 +213,8 @@ void RPC::getTransactions(const std::function& cb) { conn->doRPCWithDefaultErrorHandling(payload, cb); } -void RPC::sendZTransaction(json params, const std::function& cb) { +void RPC::sendZTransaction(json params, const std::function& cb, + const std::function& err) { json payload = { {"jsonrpc", "1.0"}, {"id", "someid"}, @@ -221,7 +222,13 @@ void RPC::sendZTransaction(json params, const std::function& 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 submitted, + const std::function computed, + const std::function 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()); + + // 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); } } diff --git a/src/rpc.h b/src/rpc.h index 3b53fb8..40c0b05 100644 --- a/src/rpc.h +++ b/src/rpc.h @@ -24,6 +24,13 @@ struct TransactionItem { QString memo; }; +struct WatchedTx { + QString opid; + Tx tx; + std::function completed; + std::function error; +}; + class RPC { public: @@ -42,10 +49,15 @@ public: void refreshZECPrice(); void getZboardTopics(std::function)> cb); + void executeTransaction(Tx tx, + const std::function submitted, + const std::function computed, + const std::function error); + void fillTxJsonParams(json& params, Tx tx); - void sendZTransaction (json params, const std::function& cb); + void sendZTransaction(json params, const std::function& cb, const std::function& err); void watchTxStatus(); - void addNewTxToWatch(Tx tx, const QString& newOpid); + void addNewTxToWatch(const QString& newOpid, WatchedTx wtx); const TxTableModel* getTransactionsModel() { return transactionsTableModel; } const QList* getAllZAddresses() { return zaddresses; } @@ -98,7 +110,7 @@ private: QMap* usedAddresses = nullptr; QList* zaddresses = nullptr; - QMap watchingOps; + QMap watchingOps; TxTableModel* transactionsTableModel = nullptr; BalancesTableModel* balancesTableModel = nullptr; diff --git a/src/sendtab.cpp b/src/sendtab.cpp index 5c1364d..d5f51d7 100644 --- a/src/sendtab.cpp +++ b/src/sendtab.cpp @@ -620,18 +620,23 @@ void MainWindow::sendButton() { // Show a dialog to confirm the Tx if (confirmTx(tx)) { - json params = json::array(); - rpc->fillTxJsonParams(params, tx); - std::cout << std::setw(2) << params << std::endl; - // And send the Tx - rpc->sendZTransaction(params, [=](const json& reply) { - QString opid = QString::fromStdString(reply.get()); - ui->statusBar->showMessage(tr("Computing Tx: ") % opid); - - // And then start monitoring the transaction - rpc->addNewTxToWatch(tx, opid); - }); + rpc->executeTransaction(tx, + [=] (QString opid) { + ui->statusBar->showMessage(tr("Computing Tx: ") % opid); + }, + [=] (QString opid, QString txid) { + ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + }, + [=] (QString opid, QString errStr) { + ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; + + QMessageBox::critical(this, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + } + ); } } diff --git a/src/turnstile.cpp b/src/turnstile.cpp index a2e1c2c..a94118d 100644 --- a/src/turnstile.cpp +++ b/src/turnstile.cpp @@ -351,17 +351,19 @@ void Turnstile::executeMigrationStep() { } void Turnstile::doSendTx(Tx tx, std::function cb) { - json params = json::array(); - rpc->fillTxJsonParams(params, tx); - std::cout << std::setw(2) << params << std::endl; - rpc->sendZTransaction(params, [=] (const json& reply) { - QString opid = QString::fromStdString(reply.get()); - //qDebug() << opid; - mainwindow->ui->statusBar->showMessage(QObject::tr("Computing Tx: ") % opid); - - // And then start monitoring the transaction - rpc->addNewTxToWatch(tx, opid); - - cb(); - }); + rpc->executeTransaction(tx, [=] (QString opid) { + mainwindow->ui->statusBar->showMessage(QObject::tr("Computing Tx: ") % opid); + }, + [=] (QString opid, QString txid) { + mainwindow->ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + }, + [=] (QString opid, QString errStr) { + mainwindow->ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + + if (!opid.isEmpty()) + errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; + + QMessageBox::critical(mainwindow, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + }); + } From beb038e82d085b6a0ce61a3172a0874046b4da4d Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Tue, 22 Jan 2019 20:42:26 -0800 Subject: [PATCH 08/25] Recurring Dialogs --- src/mainwindow.ui | 43 +++++--- src/newrecurring.ui | 216 +++++++++++++++++++++++++++++++++++++++++ src/recurring.cpp | 14 +++ src/recurring.h | 22 +++++ src/recurringdialog.ui | 92 ++++++++++++++++++ src/rpc.cpp | 8 +- zec-qt-wallet.pro | 10 +- 7 files changed, 387 insertions(+), 18 deletions(-) create mode 100644 src/newrecurring.ui create mode 100644 src/recurring.cpp create mode 100644 src/recurring.h create mode 100644 src/recurringdialog.ui diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 7e758d1..799fc90 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -22,7 +22,7 @@ - 2 + 1 @@ -346,8 +346,8 @@ 0 0 - 920 - 334 + 928 + 380 @@ -552,13 +552,6 @@ - - - - - - - @@ -572,6 +565,34 @@ + + + + + + + + + + + This transaction does not recur + + + + + + + Setup Recurring Payment + + + + + + + + + + @@ -992,7 +1013,7 @@ 0 0 968 - 22 + 19 diff --git a/src/newrecurring.ui b/src/newrecurring.ui new file mode 100644 index 0000000..d1b70fa --- /dev/null +++ b/src/newrecurring.ui @@ -0,0 +1,216 @@ + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Dialog + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + To + + + + + + + From + + + + + + + Schedule + + + + + + + Number of payments + + + + + + + Amount + + + + + + + Next Payment + + + + + + + TextLabel + + + + + + + Payment Description + + + + + + + + + + + + Every + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + Forever + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/recurring.cpp b/src/recurring.cpp new file mode 100644 index 0000000..032794a --- /dev/null +++ b/src/recurring.cpp @@ -0,0 +1,14 @@ +#include "recurring.h" +#include "ui_recurringdialog.h" + +RecurringDialog::RecurringDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::RecurringDialog) +{ + ui->setupUi(this); +} + +RecurringDialog::~RecurringDialog() +{ + delete ui; +} diff --git a/src/recurring.h b/src/recurring.h new file mode 100644 index 0000000..2cc86ae --- /dev/null +++ b/src/recurring.h @@ -0,0 +1,22 @@ +#ifndef RECURRING_H +#define RECURRING_H + +#include + +namespace Ui { +class RecurringDialog; +} + +class RecurringDialog : public QDialog +{ + Q_OBJECT + +public: + explicit RecurringDialog(QWidget *parent = nullptr); + ~RecurringDialog(); + +private: + Ui::RecurringDialog *ui; +}; + +#endif // RECURRING_H diff --git a/src/recurringdialog.ui b/src/recurringdialog.ui new file mode 100644 index 0000000..c957d87 --- /dev/null +++ b/src/recurringdialog.ui @@ -0,0 +1,92 @@ + + + RecurringDialog + + + + 0 + 0 + 601 + 438 + + + + Dialog + + + + + + + + + + + Add + + + + + + + Edit + + + + + + + Delete + + + + + + + Qt::Vertical + + + QDialogButtonBox::Close + + + + + + + + + + + buttonBox + accepted() + RecurringDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RecurringDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/rpc.cpp b/src/rpc.cpp index 1527502..738e3fa 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -535,6 +535,9 @@ void RPC::getInfoThenRefresh(bool force) { // Something changed, so refresh everything. lastBlock = curBlock; + // See if the turnstile migration has any steps that need to be done. + turnstile->executeMigrationStep(); + refreshBalances(); refreshAddresses(); // This calls refreshZSentTransactions() and refreshReceivedZTrans() refreshTransactions(); @@ -667,10 +670,7 @@ void RPC::refreshAddresses() { } // Function to create the data model and update the views, used below. -void RPC::updateUI(bool anyUnconfirmed) { - // See if the turnstile migration has any steps that need to be done. - turnstile->executeMigrationStep(); - +void RPC::updateUI(bool anyUnconfirmed) { ui->unconfirmedWarning->setVisible(anyUnconfirmed); // Update balances model data, which will update the table too diff --git a/zec-qt-wallet.pro b/zec-qt-wallet.pro index 730c9bd..1d9c835 100644 --- a/zec-qt-wallet.pro +++ b/zec-qt-wallet.pro @@ -51,7 +51,8 @@ SOURCES += \ src/fillediconlabel.cpp \ src/addressbook.cpp \ src/logger.cpp \ - src/addresscombo.cpp + src/addresscombo.cpp \ + src/recurring.cpp HEADERS += \ src/mainwindow.h \ @@ -71,7 +72,8 @@ HEADERS += \ src/fillediconlabel.h \ src/addressbook.h \ src/logger.h \ - src/addresscombo.h + src/addresscombo.h \ + src/recurring.h FORMS += \ src/mainwindow.ui \ @@ -84,7 +86,9 @@ FORMS += \ src/memodialog.ui \ src/connection.ui \ src/zboard.ui \ - src/addressbook.ui + src/addressbook.ui \ + src/recurringdialog.ui \ + src/newrecurring.ui TRANSLATIONS = res/zec_qt_wallet_es.ts \ From ace903807070820d69494c9e2b4796bf8d996c67 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Thu, 24 Jan 2019 15:09:14 -0800 Subject: [PATCH 09/25] Send page checkbox --- src/mainwindow.h | 3 + src/mainwindow.ui | 72 +++++++++++----- src/newrecurring.ui | 199 +++++++++++++++++++++++++------------------- src/recurring.cpp | 60 ++++++++++--- src/recurring.h | 38 ++++++--- src/sendtab.cpp | 30 +++++++ 6 files changed, 271 insertions(+), 131 deletions(-) diff --git a/src/mainwindow.h b/src/mainwindow.h index 5b5350e..d37ce6c 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -38,6 +38,7 @@ public: ~MainWindow(); void updateLabelsAutoComplete(); + RPC* getRPC() { return rpc; } void setDefaultPayFrom(); @@ -76,6 +77,8 @@ private: void addAddressSection(); void maxAmountChecked(int checked); + void editSchedule(); + void addressChanged(int number, const QString& text); void amountChanged (int number, const QString& text); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 799fc90..e86c960 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -346,8 +346,8 @@ 0 0 - 928 - 380 + 920 + 301 @@ -531,29 +531,36 @@ - + - + - Miner Fee + Recurring payment - - - - 0 - 0 - + + + Every month, starting 12-May-2012, for 6 payments + + + + - 0 + Edit Schedule + + + false + + + false - + Qt::Horizontal @@ -565,34 +572,57 @@ + + + + - + - + Miner Fee - + + + + 0 + 0 + + - This transaction does not recur + 0 - + - Setup Recurring Payment + - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + @@ -1013,7 +1043,7 @@ 0 0 968 - 19 + 22 diff --git a/src/newrecurring.ui b/src/newrecurring.ui index d1b70fa..f8f8521 100644 --- a/src/newrecurring.ui +++ b/src/newrecurring.ui @@ -1,29 +1,26 @@ - Dialog - + newRecurringDialog + 0 0 - 400 - 300 + 740 + 403 - Dialog + Edit Schedule - - - - - + + - + - + Qt::Horizontal @@ -37,10 +34,7 @@ - - - - + Qt::Horizontal @@ -50,85 +44,51 @@ - - - - - - - To - - - - - - - From - - - - + Schedule - - - - Number of payments - - - - - - - Amount - - - - - + + - Next Payment + Payment Description - - + + TextLabel - - - - Payment Description + + + + Qt::Horizontal - - - - - + + - - - Every + + + + 0 + 0 + - + - - - - + Qt::Horizontal @@ -142,17 +102,50 @@ - + + + + + + + From + + + + + + + Number of payments + + + + + + + Amount + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + - - - - - - Forever - - + @@ -169,21 +162,57 @@ - - - - Qt::Horizontal + + + + Next Payment + + + + + + + + + + To + + + + + + + + + + Memo + + + AddressCombo + QComboBox +
addresscombo.h
+
+
+ + txtDesc + cmbFromAddress + txtToAddr + txtAmt + cmbCurrency + cmbSchedule + txtNumPayments + buttonBox accepted() - Dialog + newRecurringDialog accept() @@ -199,7 +228,7 @@ buttonBox rejected() - Dialog + newRecurringDialog reject() diff --git a/src/recurring.cpp b/src/recurring.cpp index 032794a..64affec 100644 --- a/src/recurring.cpp +++ b/src/recurring.cpp @@ -1,14 +1,48 @@ #include "recurring.h" -#include "ui_recurringdialog.h" - -RecurringDialog::RecurringDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::RecurringDialog) -{ - ui->setupUi(this); -} - -RecurringDialog::~RecurringDialog() -{ - delete ui; -} + +#include "mainwindow.h" +#include "rpc.h" +#include "settings.h" +#include "ui_newrecurring.h" + +void Recurring::showEditDialog(QWidget* parent, MainWindow* main, Tx tx) { + Ui_newRecurringDialog ui; + QDialog d(parent); + ui.setupUi(&d); + Settings::saveRestore(&d); + + // Add all the from addresses + auto allBalances = main->getRPC()->getAllBalances(); + for (QString addr : allBalances->keys()) { + ui.cmbFromAddress->addItem(addr, allBalances->value(addr)); + } + + if (!tx.fromAddr.isEmpty()) { + ui.cmbFromAddress->setCurrentText(tx.fromAddr); + ui.cmbFromAddress->setEnabled(false); + } + + ui.cmbCurrency->addItem(Settings::getTokenName()); + ui.cmbCurrency->addItem("USD"); + + if (tx.toAddrs.length() > 0) { + ui.txtToAddr->setText(tx.toAddrs[0].addr); + ui.txtToAddr->setEnabled(false); + + ui.txtAmt->setText(Settings::getDecimalString(tx.toAddrs[0].amount)); + ui.txtAmt->setEnabled(false); + + ui.txtMemo->setPlainText(tx.toAddrs[0].txtMemo); + ui.txtMemo->setEnabled(false); + } + + ui.cmbSchedule->addItem("Every Day", QVariant(Schedule::DAY)); + ui.cmbSchedule->addItem("Every Week", QVariant(Schedule::WEEK)); + ui.cmbSchedule->addItem("Every Month", QVariant(Schedule::MONTH)); + ui.cmbSchedule->addItem("Every Year", QVariant(Schedule::YEAR)); + + ui.txtNumPayments->setText("10"); + + ui.txtDesc->setFocus(); + d.exec(); +} \ No newline at end of file diff --git a/src/recurring.h b/src/recurring.h index 2cc86ae..3f27115 100644 --- a/src/recurring.h +++ b/src/recurring.h @@ -1,22 +1,36 @@ #ifndef RECURRING_H #define RECURRING_H -#include +#include "precompiled.h" -namespace Ui { -class RecurringDialog; -} +#include "mainwindow.h" -class RecurringDialog : public QDialog -{ - Q_OBJECT +enum Schedule { + DAY = 1, + WEEK, + MONTH, + YEAR +}; + +struct RecurringPaymentInfo { + QString desc; + QString fromAddr; + QString toAddr; + double amt; + QString currency; + Schedule schedule; + int numPayments; + long startBlock; + int completedPayments; +}; + +class Recurring +{ public: - explicit RecurringDialog(QWidget *parent = nullptr); - ~RecurringDialog(); + Recurring(); -private: - Ui::RecurringDialog *ui; + static void showEditDialog(QWidget* parent, MainWindow* main, Tx tx); }; -#endif // RECURRING_H +#endif // RECURRING_H \ No newline at end of file diff --git a/src/sendtab.cpp b/src/sendtab.cpp index d5f51d7..05ce4dc 100644 --- a/src/sendtab.cpp +++ b/src/sendtab.cpp @@ -3,8 +3,10 @@ #include "addressbook.h" #include "ui_confirm.h" #include "ui_memodialog.h" +#include "ui_newrecurring.h" #include "settings.h" #include "rpc.h" +#include "recurring.h" using json = nlohmann::json; @@ -80,6 +82,29 @@ void MainWindow::setupSendTab() { QFont f = ui->Address1->font(); f.setPointSize(f.pointSize() - 1); ui->MemoTxt1->setFont(f); + + // Recurring button + QObject::connect(ui->chkRecurring, &QCheckBox::stateChanged, [=] (int checked) { + if (checked) { + ui->btnRecurSchedule->setEnabled(true); + } else { + ui->btnRecurSchedule->setEnabled(false); + ui->lblRecurDesc->setText(""); + } + + }); + + // Recurring schedule button + QObject::connect(ui->btnRecurSchedule, &QPushButton::clicked, this, &MainWindow::editSchedule); + + // Set the default state for the whole page + removeExtraAddresses(); +} + +void MainWindow::editSchedule() { + // Open the edit schedule dialog + Recurring::showEditDialog(this, this, createTxFromSendPage()); + } void MainWindow::updateLabelsAutoComplete() { @@ -354,6 +379,11 @@ void MainWindow::removeExtraAddresses() { delete addressGroupBox; } + + // Reset the recurring button + ui->chkRecurring->setCheckState(Qt::Unchecked); + ui->btnRecurSchedule->setEnabled(false); + ui->lblRecurDesc->setText(""); } void MainWindow::maxAmountChecked(int checked) { From 4087e0063ce686c0b34c35f8b56ec9017ff08e9d Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Sat, 26 Jan 2019 19:01:56 -0800 Subject: [PATCH 10/25] support memo/message/msg in zcash URI --- src/mainwindow.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3ec9b68..da2086b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -713,7 +713,7 @@ void MainWindow::payZcashURI() { if (kv[0].toLower() == "amt" || kv[0].toLower() == "amount") { amount = kv[1].toDouble(); - } else if (kv[0].toLower() == "memo") { + } else if (kv[0].toLower() == "memo" || kv[0].toLower() == "message" || kv[0].toLower() == "msg") { memo = kv[1]; // Test if this is hex From 1e3953613a3e28e5fe0cc8d4bcc7d7ad138cf77c Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Sun, 27 Jan 2019 12:05:00 -0800 Subject: [PATCH 11/25] Allow configuring custom data folder --- src/.ui_createzcashconfdialog.h.swp | Bin 0 -> 16384 bytes src/connection.cpp | 45 +++++++- src/createzcashconfdialog.ui | 173 ++++++++++++++++++++++++++++ zec-qt-wallet.pro | 3 +- 4 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 src/.ui_createzcashconfdialog.h.swp create mode 100644 src/createzcashconfdialog.ui diff --git a/src/.ui_createzcashconfdialog.h.swp b/src/.ui_createzcashconfdialog.h.swp new file mode 100644 index 0000000000000000000000000000000000000000..903309633e281725a79f16d17fed829e0164c43f GIT binary patch literal 16384 zcmeI3O>87b6~~KwkOe{#u@Z2|Mz!99$JThpo?R1XmRK5(XYB#+*t28rq7Y*Bbk|IG z-0mK_Yu0O9ks?J95&?(J1)*>u0&Ylr3dDf}0Vzlv5)@7dZiE8_E-XkO!N01%+dVVc zRW3k}_P0Az{krPazpAV2z3%PKUu|BdOQi*Z&qIW~MOsgaumAWUAvMk5hYJ1V(A-lT z%MitxpU!&oN+a_~vant)@3_oy%c+XXeS_=6Zuy9*bD!mN2a0JjUUnU|JT!Jyhbf#L zsfw$sw$;-N#kBh+Jy~=9D_0;_V6p-akn@#=`Eyfe>FE#cOg7Igas_e)as_e)as_e) zas_e)as_e){-+e+gS*JT(WARSAH2usZv49hM4&Co@=vZnu0XCpu0XCpu0XCpu0XCp zu0XCpu0XCpuE2k<0*Xe6i1oiGf_yyx7de1$KS+oP3@{Joz;7QQgmypka$HD#J_xBR=JMb;=P2hm@paTAN4@4{9Yfnt4(%bI zTUIpxYeBai75Pbe-5rKCyC!}=zUSZFz-f%isEV3JayVZzCEs$Q5M z-FmndX4%HpCmOW?bwbCg)h&nhnBy=ld)W$CwU`TuK90W$gldcs+@FM(47_`%iJ3HU zZ5c5Yvhl$fzi>vDiN>Ph zpvkrHo} zEZwL{->VN@Ztt%uT+s~2H}D$r?t)n2>17d?Q_>-NPzvb1GhGr%mjnoE{<=T9>Dx=sMnX zhjw(aw6IXB_~&AKvQPWWLTJXBMthFEkEXCtM9t7?Z#7E4@;)@CN%>vYXqL$MA2IFU zfr$UbGygXb@4pVd23`gVm;!%6oc~?$Jor4=1TAnH`~orl&%qafi2pwY&VYx(9}&xo z`2WY?S#SkRfwSOk#P5F=F+6w`JPjTK4}v!l!@mlC25y2cf)9h|5W_zLeuQ}a6W|+& z(Z3A71YQI$fFn=?Wl#cVz{5cF^Oopq{>c@{704CH75INt;2cASut&?~v0D;sGaIed z_$Koiaf*fL&=u)Q>`i4*;cZk?K}3~$JK2m4EIoeaB8k^Rj|oAMtV}k6bc3TSbkOo3v^*Jf$#|@@1+>r?yO{xQtphXW02DoFbh&jct#`uo2-lRZOuF zIi$LBol%7%@r5|axo)7F*h%+{{t&qdiVe-cb~t@(esLbPT0_$ua3`KYNk>3;<}G$r zRF#1g)x1b5yR|5`xwCfax^1H=L~6*N+s>b|c>CR_?3` ze{@w{^hSyLBSseCsKdl?JJkEXl_f|@kt3&F(^mJeEjFxdmr~P6x^~U5kQdoDxQTqn zZOlJp8@)+H<<7PwCe_JSkL5KWqx8fzFez4-SB)Rn%PPe6(!R{N;-y@wRkSAtp<~+I zT{)DGN>bg6=Yra)(+Xk0UZkDoTC28EaF}@J!Zaipis{S-j5ap6eG?eO@*wY^W<^!m zV0_JThYg^A*A`6woM;vw@KMfzBnAd4&FWkKW=kb&tt$&c-NvpKMzkRkJ} zC*;U>D~UXi=T?xkk}ak4Lh)XV=((58Dbl6vu6u`N-^Y39nI+xx$^!pn!r=D(ORuTO ztz|lzwwvT}+CJfW`e4w9Aa8K{-H2U73)#;pLJR469Zx5ivm#SvC!SIyO*QyHAw XSJS&+Tqx3yWzGfvuoQCiBb@&L@NwT2 literal 0 HcmV?d00001 diff --git a/src/connection.cpp b/src/connection.cpp index 5db52a3..21dcc60 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -2,6 +2,7 @@ #include "mainwindow.h" #include "settings.h" #include "ui_connection.h" +#include "ui_createzcashconfdialog.h" #include "rpc.h" #include "precompiled.h" @@ -128,9 +129,42 @@ void ConnectionLoader::createZcashConf() { main->logger->write("createZcashConf"); auto confLocation = zcashConfWritableLocation(); - main->logger->write("Creating file " + confLocation); - QFileInfo fi(confLocation); + + QDialog d(main); + Ui_createZcashConf ui; + ui.setupUi(&d); + + QPixmap logo(":/img/res/zcashdlogo.gif"); + ui.lblTopIcon->setBasePixmap(logo.scaled(256, 256, Qt::KeepAspectRatio, Qt::SmoothTransformation)); + ui.btnPickDir->setEnabled(false); + ui.lblDirName->setText(fi.dir().absolutePath()); + + QObject::connect(ui.chkCustomDatadir, &QCheckBox::stateChanged, [=](int chked) { + if (chked == Qt::Checked) { + ui.btnPickDir->setEnabled(true); + } + else { + ui.btnPickDir->setEnabled(false); + } + }); + + QObject::connect(ui.btnPickDir, &QPushButton::clicked, [=]() { + auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), fi.dir().absolutePath(), QFileDialog::ShowDirsOnly); + if (!datadir.isEmpty()) { + ui.lblDirName->setText(datadir); + } + }); + + // Show the dialog + QString datadir = ""; + bool useTor = false; + if (d.exec() == QDialog::Accepted) { + datadir = ui.lblDirName->text(); + useTor = ui.chkUseTor->isChecked(); + } + + main->logger->write("Creating file " + confLocation); QDir().mkdir(fi.dir().absolutePath()); QFile file(confLocation); @@ -145,6 +179,13 @@ void ConnectionLoader::createZcashConf() { out << "addnode=mainnet.z.cash\n"; out << "rpcuser=zec-qt-wallet\n"; out << "rpcpassword=" % randomPassword() << "\n"; + if (!datadir.isEmpty()) { + out << "datadir=" % QDir::toNativeSeparators(datadir) % "\n"; + } + if (useTor) { + out << "proxy=127.0.0.1:9050\n"; + } + file.close(); // Now that zcash.conf exists, try to autoconnect again diff --git a/src/createzcashconfdialog.ui b/src/createzcashconfdialog.ui new file mode 100644 index 0000000..b223bf6 --- /dev/null +++ b/src/createzcashconfdialog.ui @@ -0,0 +1,173 @@ + + + createZcashConf + + + + 0 + 0 + 503 + 288 + + + + Configure zcash.conf + + + + + + Qt::Horizontal + + + + + + + Please chose a directory to store your wallet.dat and blockchain + + + + + + + + 0 + 0 + + + + background: #fff; + + + + + + true + + + + + + + Connect over Tor + + + + + + + + + Choose directory + + + + + + + TextLabel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + true + + + + + + + Use custom datadir + + + + + + + Please note that you'll need to already have a Tor service configured on port 9050 + + + + + + + Qt::Horizontal + + + + + + + + FilledIconLabel + QLabel +
fillediconlabel.h
+
+
+ + + + buttonBox + accepted() + createZcashConf + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + createZcashConf + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/zec-qt-wallet.pro b/zec-qt-wallet.pro index 730c9bd..2b0da58 100644 --- a/zec-qt-wallet.pro +++ b/zec-qt-wallet.pro @@ -84,7 +84,8 @@ FORMS += \ src/memodialog.ui \ src/connection.ui \ src/zboard.ui \ - src/addressbook.ui + src/addressbook.ui \ + src/createzcashconfdialog.ui TRANSLATIONS = res/zec_qt_wallet_es.ts \ From db978a1548969e681c8626332545c7ab19783bad Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Sun, 27 Jan 2019 12:29:53 -0800 Subject: [PATCH 12/25] Show/Hide advanced config --- src/.ui_createzcashconfdialog.h.swp | Bin 16384 -> 0 bytes src/connection.cpp | 11 +- src/createzcashconfdialog.ui | 165 +++++++++++++++++----------- 3 files changed, 110 insertions(+), 66 deletions(-) delete mode 100644 src/.ui_createzcashconfdialog.h.swp diff --git a/src/.ui_createzcashconfdialog.h.swp b/src/.ui_createzcashconfdialog.h.swp deleted file mode 100644 index 903309633e281725a79f16d17fed829e0164c43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3O>87b6~~KwkOe{#u@Z2|Mz!99$JThpo?R1XmRK5(XYB#+*t28rq7Y*Bbk|IG z-0mK_Yu0O9ks?J95&?(J1)*>u0&Ylr3dDf}0Vzlv5)@7dZiE8_E-XkO!N01%+dVVc zRW3k}_P0Az{krPazpAV2z3%PKUu|BdOQi*Z&qIW~MOsgaumAWUAvMk5hYJ1V(A-lT z%MitxpU!&oN+a_~vant)@3_oy%c+XXeS_=6Zuy9*bD!mN2a0JjUUnU|JT!Jyhbf#L zsfw$sw$;-N#kBh+Jy~=9D_0;_V6p-akn@#=`Eyfe>FE#cOg7Igas_e)as_e)as_e) zas_e)as_e){-+e+gS*JT(WARSAH2usZv49hM4&Co@=vZnu0XCpu0XCpu0XCpu0XCp zu0XCpu0XCpuE2k<0*Xe6i1oiGf_yyx7de1$KS+oP3@{Joz;7QQgmypka$HD#J_xBR=JMb;=P2hm@paTAN4@4{9Yfnt4(%bI zTUIpxYeBai75Pbe-5rKCyC!}=zUSZFz-f%isEV3JayVZzCEs$Q5M z-FmndX4%HpCmOW?bwbCg)h&nhnBy=ld)W$CwU`TuK90W$gldcs+@FM(47_`%iJ3HU zZ5c5Yvhl$fzi>vDiN>Ph zpvkrHo} zEZwL{->VN@Ztt%uT+s~2H}D$r?t)n2>17d?Q_>-NPzvb1GhGr%mjnoE{<=T9>Dx=sMnX zhjw(aw6IXB_~&AKvQPWWLTJXBMthFEkEXCtM9t7?Z#7E4@;)@CN%>vYXqL$MA2IFU zfr$UbGygXb@4pVd23`gVm;!%6oc~?$Jor4=1TAnH`~orl&%qafi2pwY&VYx(9}&xo z`2WY?S#SkRfwSOk#P5F=F+6w`JPjTK4}v!l!@mlC25y2cf)9h|5W_zLeuQ}a6W|+& z(Z3A71YQI$fFn=?Wl#cVz{5cF^Oopq{>c@{704CH75INt;2cASut&?~v0D;sGaIed z_$Koiaf*fL&=u)Q>`i4*;cZk?K}3~$JK2m4EIoeaB8k^Rj|oAMtV}k6bc3TSbkOo3v^*Jf$#|@@1+>r?yO{xQtphXW02DoFbh&jct#`uo2-lRZOuF zIi$LBol%7%@r5|axo)7F*h%+{{t&qdiVe-cb~t@(esLbPT0_$ua3`KYNk>3;<}G$r zRF#1g)x1b5yR|5`xwCfax^1H=L~6*N+s>b|c>CR_?3` ze{@w{^hSyLBSseCsKdl?JJkEXl_f|@kt3&F(^mJeEjFxdmr~P6x^~U5kQdoDxQTqn zZOlJp8@)+H<<7PwCe_JSkL5KWqx8fzFez4-SB)Rn%PPe6(!R{N;-y@wRkSAtp<~+I zT{)DGN>bg6=Yra)(+Xk0UZkDoTC28EaF}@J!Zaipis{S-j5ap6eG?eO@*wY^W<^!m zV0_JThYg^A*A`6woM;vw@KMfzBnAd4&FWkKW=kb&tt$&c-NvpKMzkRkJ} zC*;U>D~UXi=T?xkk}ak4Lh)XV=((58Dbl6vu6u`N-^Y39nI+xx$^!pn!r=D(ORuTO ztz|lzwwvT}+CJfW`e4w9Aa8K{-H2U73)#;pLJR469Zx5ivm#SvC!SIyO*QyHAw XSJS&+Tqx3yWzGfvuoQCiBb@&L@NwT2 diff --git a/src/connection.cpp b/src/connection.cpp index 21dcc60..b54b3dc 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -138,7 +138,12 @@ void ConnectionLoader::createZcashConf() { QPixmap logo(":/img/res/zcashdlogo.gif"); ui.lblTopIcon->setBasePixmap(logo.scaled(256, 256, Qt::KeepAspectRatio, Qt::SmoothTransformation)); ui.btnPickDir->setEnabled(false); - ui.lblDirName->setText(fi.dir().absolutePath()); + + ui.grpAdvanced->setVisible(false); + QObject::connect(ui.btnAdvancedConfig, &QPushButton::toggled, [=](bool isVisible) { + ui.grpAdvanced->setVisible(isVisible); + ui.btnAdvancedConfig->setText(isVisible ? QObject::tr("Hide Advanced Config") : QObject::tr("Show Advanced Config")); + }); QObject::connect(ui.chkCustomDatadir, &QCheckBox::stateChanged, [=](int chked) { if (chked == Qt::Checked) { @@ -152,7 +157,7 @@ void ConnectionLoader::createZcashConf() { QObject::connect(ui.btnPickDir, &QPushButton::clicked, [=]() { auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), fi.dir().absolutePath(), QFileDialog::ShowDirsOnly); if (!datadir.isEmpty()) { - ui.lblDirName->setText(datadir); + ui.lblDirName->setText(QDir::toNativeSeparators(datadir)); } }); @@ -180,7 +185,7 @@ void ConnectionLoader::createZcashConf() { out << "rpcuser=zec-qt-wallet\n"; out << "rpcpassword=" % randomPassword() << "\n"; if (!datadir.isEmpty()) { - out << "datadir=" % QDir::toNativeSeparators(datadir) % "\n"; + out << "datadir=" % datadir % "\n"; } if (useTor) { out << "proxy=127.0.0.1:9050\n"; diff --git a/src/createzcashconfdialog.ui b/src/createzcashconfdialog.ui index b223bf6..4da75b2 100644 --- a/src/createzcashconfdialog.ui +++ b/src/createzcashconfdialog.ui @@ -6,28 +6,14 @@ 0 0 - 503 - 288 + 508 + 352 Configure zcash.conf - - - - Qt::Horizontal - - - - - - - Please chose a directory to store your wallet.dat and blockchain - - - @@ -47,31 +33,40 @@ - - - - Connect over Tor + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + true - - + + - + - Choose directory + Show Advanced Configuration - - - - - - TextLabel + + true - + Qt::Horizontal @@ -85,45 +80,89 @@ - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Ok - - - true - - - - + - Use custom datadir + Your zcash node will be configured for you automatically - - - - - - Please note that you'll need to already have a Tor service configured on port 9050 + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - Qt::Horizontal + + + + + + + + + Use custom datadir + + + + + + + Please chose a directory to store your wallet.dat and blockchain + + + + + + + + + Choose directory + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + Connect over Tor + + + + + + + Please note that you'll need to already have a Tor service configured on port 9050 + + + + From e93cf27adb924e5838ba6edf2bf8c28445a6da3e Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Sun, 27 Jan 2019 21:00:24 -0800 Subject: [PATCH 13/25] Fixed a bug where the last address label wouldn't be removed --- src/addressbook.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/addressbook.cpp b/src/addressbook.cpp index 7d74cbd..c839b18 100644 --- a/src/addressbook.cpp +++ b/src/addressbook.cpp @@ -254,9 +254,6 @@ void AddressBook::readFromStorage() { } void AddressBook::writeToStorage() { - if (allLabels.isEmpty()) - return; - QFile file(AddressBook::writeableFile()); file.open(QIODevice::ReadWrite | QIODevice::Truncate); QDataStream out(&file); // we will serialize the data into the file From 32eb3574f5370e2d7114611c907c742692b791ad Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 28 Jan 2019 10:44:24 -0800 Subject: [PATCH 14/25] Add zcashd version info in tooltip --- src/rpc.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/rpc.cpp b/src/rpc.cpp index 7eab839..7a7b443 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -523,6 +523,7 @@ void RPC::getInfoThenRefresh(bool force) { static int lastBlock = 0; int curBlock = reply["blocks"].get(); + int version = reply["version"].get(); if ( force || (curBlock != lastBlock) ) { // Something changed, so refresh everything. @@ -588,7 +589,7 @@ void RPC::getInfoThenRefresh(bool force) { // as the progress instead of verification progress. progress = (double)blockNumber / (double)estimatedheight; } - txt = txt % " ( " % QString::number(progress * 100, 'f', 0) % "% )"; + txt = txt % " ( " % QString::number(progress * 100, 'f', 2) % "% )"; ui->blockheight->setText(txt); ui->heightLabel->setText(QObject::tr("Downloading blocks")); } else { @@ -603,7 +604,7 @@ void RPC::getInfoThenRefresh(bool force) { " (" % (Settings::getInstance()->isTestnet() ? QObject::tr("testnet:") : "") % QString::number(blockNumber) % - (isSyncing ? ("/" % QString::number(progress*100, 'f', 0) % "%") : QString()) % + (isSyncing ? ("/" % QString::number(progress*100, 'f', 2) % "%") : QString()) % ")"; main->statusLabel->setText(statusText); @@ -615,6 +616,7 @@ void RPC::getInfoThenRefresh(bool force) { else { tooltip = QObject::tr("zcashd has no peer connections"); } + tooltip = tooltip % "(v " % QString::number(version) % ")"; if (!zecPrice.isEmpty()) { tooltip = "1 ZEC = " % zecPrice % "\n" % tooltip; From 7055e170aecc312cd4efbcb4b0b0016956ea2a4d Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 28 Jan 2019 10:44:55 -0800 Subject: [PATCH 15/25] Update translations --- res/zec_qt_wallet_de.ts | 222 +++++++++++++++++++++++++--------------- res/zec_qt_wallet_es.ts | 222 +++++++++++++++++++++++++--------------- res/zec_qt_wallet_pt.ts | 222 +++++++++++++++++++++++++--------------- 3 files changed, 420 insertions(+), 246 deletions(-) diff --git a/res/zec_qt_wallet_de.ts b/res/zec_qt_wallet_de.ts index fd505b8..ebc625b 100644 --- a/res/zec_qt_wallet_de.ts +++ b/res/zec_qt_wallet_de.ts @@ -138,8 +138,8 @@
- - + + Memo YOUR_TRANSLATION_HERE @@ -244,7 +244,7 @@ - + Loading... YOUR_TRANSLATION_HERE @@ -367,7 +367,7 @@ - + Export transactions @@ -458,151 +458,151 @@ - + Could not understand address - + Unknown field in URI: - + Please paste your private keys (z-Addr or t-Addr) here, one per line YOUR_TRANSLATION_HERE - + The keys will be imported into your connected zcashd node YOUR_TRANSLATION_HERE - + Error - + Error exporting transactions, file was not saved - + No wallet.dat YOUR_TRANSLATION_HERE - + Couldn't find the wallet.dat on this computer YOUR_TRANSLATION_HERE - + You need to back it up from the machine zcashd is running on YOUR_TRANSLATION_HERE - + Backup wallet.dat YOUR_TRANSLATION_HERE - + Couldn't backup YOUR_TRANSLATION_HERE - + Couldn't backup the wallet.dat file. YOUR_TRANSLATION_HERE - + You need to back it up manually. YOUR_TRANSLATION_HERE - + These are all the private keys for all the addresses in your wallet YOUR_TRANSLATION_HERE - + Private key for YOUR_TRANSLATION_HERE - + Save File YOUR_TRANSLATION_HERE - + Unable to open file YOUR_TRANSLATION_HERE - - + + Copy address YOUR_TRANSLATION_HERE - - - + + + Copied to clipboard YOUR_TRANSLATION_HERE - + Get private key YOUR_TRANSLATION_HERE - + Shield balance to Sapling YOUR_TRANSLATION_HERE - - + + View on block explorer YOUR_TRANSLATION_HERE - + Migrate to Sapling YOUR_TRANSLATION_HERE - + Copy txid YOUR_TRANSLATION_HERE - + View Memo YOUR_TRANSLATION_HERE - + Reply to - + Created new t-Addr YOUR_TRANSLATION_HERE - + Address has been previously used - + Address is unused @@ -704,27 +704,27 @@ doesn't look like a z-address QObject - + Attempting autoconnect YOUR_TRANSLATION_HERE - + Starting embedded zcashd YOUR_TRANSLATION_HERE - + zcashd is set to run as daemon YOUR_TRANSLATION_HERE - + Waiting for zcashd YOUR_TRANSLATION_HERE - + You have zcashd set to start as a daemon, which can cause problems with zec-qt-wallet .Please remove the following line from your zcash.conf and restart zec-qt-wallet @@ -732,7 +732,7 @@ daemon=1 YOUR_TRANSLATION_HERE - + Couldn't start the embedded zcashd. Please try restarting. @@ -743,193 +743,208 @@ If all else fails, please run zcashd manually. YOUR_TRANSLATION_HERE - + Couldn't connect to zcashd configured in zcash.conf. Not starting embedded zcashd because --no-embedded was passed YOUR_TRANSLATION_HERE - + + Hide Advanced Config + + + + + Show Advanced Config + + + + + Choose data directory + + + + All Downloads Finished Successfully! YOUR_TRANSLATION_HERE - + Couldn't download params. Please check the help site for more info. YOUR_TRANSLATION_HERE - + The process returned YOUR_TRANSLATION_HERE - - + + Downloading YOUR_TRANSLATION_HERE - + more remaining ) YOUR_TRANSLATION_HERE - + MB of YOUR_TRANSLATION_HERE - + MB at YOUR_TRANSLATION_HERE - + Downloading blocks YOUR_TRANSLATION_HERE - + Block height YOUR_TRANSLATION_HERE - + Syncing YOUR_TRANSLATION_HERE - + Connected YOUR_TRANSLATION_HERE - + testnet: YOUR_TRANSLATION_HERE - + Connected to zcashd YOUR_TRANSLATION_HERE - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was YOUR_TRANSLATION_HERE - + The transaction with id YOUR_TRANSLATION_HERE - + failed. The error was YOUR_TRANSLATION_HERE - + failed YOUR_TRANSLATION_HERE - + Tx YOUR_TRANSLATION_HERE - + tx computing. This can take several minutes. YOUR_TRANSLATION_HERE - + Update Available - + A new release v%1 is available! You have v%2. Would you like to visit the releases page? - + No updates available - + You already have the latest release v%1 - + Please wait for zec-qt-wallet to exit YOUR_TRANSLATION_HERE - + Waiting for zcashd to exit YOUR_TRANSLATION_HERE - + failed. Please check the help site for more info YOUR_TRANSLATION_HERE - + zcashd error YOUR_TRANSLATION_HERE - + A manual connection was requested, but the settings are not configured. Please set the host/port and user/password in the Edit->Settings menu. YOUR_TRANSLATION_HERE - + Could not connect to zcashd configured in settings. Please set the host/port and user/password in the Edit->Settings menu. YOUR_TRANSLATION_HERE - + Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu YOUR_TRANSLATION_HERE - + Your zcashd is starting up. Please wait. YOUR_TRANSLATION_HERE - - + + Connection Error YOUR_TRANSLATION_HERE - - + + Transaction Error YOUR_TRANSLATION_HERE - + There was an error sending the transaction. The error was: YOUR_TRANSLATION_HERE @@ -1265,6 +1280,49 @@ You either have unconfirmed funds or the balance is too low for an automatic mig YOUR_TRANSLATION_HERE + + createZcashConf + + + Configure zcash.conf + + + + + Show Advanced Configuration + + + + + Your zcash node will be configured for you automatically + + + + + Use custom datadir + + + + + Please chose a directory to store your wallet.dat and blockchain + + + + + Choose directory + + + + + Connect over Tor + + + + + Please note that you'll need to already have a Tor service configured on port 9050 + + + zboard diff --git a/res/zec_qt_wallet_es.ts b/res/zec_qt_wallet_es.ts index d7f69e0..cea8d94 100644 --- a/res/zec_qt_wallet_es.ts +++ b/res/zec_qt_wallet_es.ts @@ -138,8 +138,8 @@ - - + + Memo Memo @@ -244,7 +244,7 @@ - + Loading... Cargando... @@ -367,7 +367,7 @@ - + Export transactions @@ -458,151 +458,151 @@ - + Could not understand address - + Unknown field in URI: - + Please paste your private keys (z-Addr or t-Addr) here, one per line Por favor pegue sus claves privadas (z-Addr o t-Addr) aqui, una por línea - + The keys will be imported into your connected zcashd node Las claves serán importadas en su nodo zcashd conectado - + Error - + Error exporting transactions, file was not saved - + No wallet.dat Sin wallet.dat - + Couldn't find the wallet.dat on this computer No se pudo encontrar wallet.dat en esta computadora - + You need to back it up from the machine zcashd is running on Necesitas hacer una copia de seguridad de la computadora en la que se está ejecutando zcashd - + Backup wallet.dat Respaldar wallet.dat - + Couldn't backup No se pudo hacer una copia de seguridad - + Couldn't backup the wallet.dat file. No se pudo hacer copia de seguridad de wallet.dat - + You need to back it up manually. Necesitas hacer una copia de seguridad manualmente. - + These are all the private keys for all the addresses in your wallet Estas son todas las claves privadas para todas las direcciones en tu billetera - + Private key for Clave privada para - + Save File Guardar Archivo - + Unable to open file No es posible abrir el archivo - - + + Copy address Copiar dirección - - - + + + Copied to clipboard Copiado al portapapeles - + Get private key Obtener clave privada - + Shield balance to Sapling Proteger saldo a Sapling - - + + View on block explorer Ver en el explorador de bloques - + Migrate to Sapling Migrar a Sapling - + Copy txid Copiar txid - + View Memo Ver Memo - + Reply to - + Created new t-Addr Nuevo dirección t-Addr creada - + Address has been previously used - + Address is unused @@ -710,155 +710,170 @@ doesn't look like a z-address Sin Conexión - + Downloading blocks Descargando Bloques - + Block height Altura del bloque - + Syncing Sincronizando - + Connected Conectando - + testnet: testnet: - + Connected to zcashd Conectando a zcashd - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was Hubo un error al conectar con zcashd. El error fue - + The transaction with id La transacción con id - + failed. The error was falló. El error fue - + Tx Tx - + failed falló - + tx computing. This can take several minutes. tx computando. Esto puede tomar varios minutos. - + Update Available - + A new release v%1 is available! You have v%2. Would you like to visit the releases page? - + No updates available - + You already have the latest release v%1 - + Please wait for zec-qt-wallet to exit Por favor, espere que zec-qt-wallet salga - + Waiting for zcashd to exit Esperando que zcashd salga - + Attempting autoconnect Intentando de autoconectarse - + Starting embedded zcashd Iniciando zcashd incorporado - + zcashd is set to run as daemon zcashd está configurado para ejecutarse como demonio - + Waiting for zcashd Esperando zcashd - + + Hide Advanced Config + + + + + Show Advanced Config + + + + + Choose data directory + + + + All Downloads Finished Successfully! Todas Las Descargas Terminaron Exitosamente! - + Couldn't download params. Please check the help site for more info. No se pudieron descargar los parámetros. Por favor, consulta el sitio de ayuda para mayor información. - - + + Downloading Descargando - + more remaining ) faltan )) - + MB of MB de - + MB at MB a - + A manual connection was requested, but the settings are not configured. Please set the host/port and user/password in the Edit->Settings menu. @@ -867,7 +882,7 @@ Please set the host/port and user/password in the Edit->Settings menu. - + Could not connect to zcashd configured in settings. Please set the host/port and user/password in the Edit->Settings menu. @@ -877,18 +892,18 @@ Por favor, especificar el host/puerta y usario/contraseña en el menú Editar-&g - - + + Transaction Error Error De Transacción - + failed. Please check the help site for more info falló. Por favor, consulte el sitio de ayuda para más información - + You have zcashd set to start as a daemon, which can cause problems with zec-qt-wallet .Please remove the following line from your zcash.conf and restart zec-qt-wallet @@ -898,7 +913,7 @@ Por favor, eliminar la siguente linea de zcashd.conf y reinicia zec-qt-wallet daemon=1 - + Couldn't start the embedded zcashd. Please try restarting. @@ -914,12 +929,12 @@ Si todo falla, por favor ejecutar zcashd manualmente. - + The process returned El proceso devuelto - + Couldn't connect to zcashd configured in zcash.conf. Not starting embedded zcashd because --no-embedded was passed @@ -928,28 +943,28 @@ Not starting embedded zcashd because --no-embedded was passed No iniciaré zcashd incorporado porque la opcion --no-embedded fue dada. - + zcashd error error de zcashd - + Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu Autenticación fallida. El usario/contraseña que epecificó no fue aceptado por zcashd. Intenta cambiarlo en el menu Editar->Configuración. - + Your zcashd is starting up. Please wait. Tu zcashd se está iniciando. Por favor espera. - - + + Connection Error Error de conexión - + There was an error sending the transaction. The error was: Hubo un error al enviar la transacción. El error fue: @@ -1281,6 +1296,49 @@ El saldo es insuficiente para una migración automática. Estás utilizando una tarifa personalizada. Como las tarifas son transparentes estás perdiendo algo de privacidad. Por favor, solo haz esto si sabes lo que estás haciendo! + + createZcashConf + + + Configure zcash.conf + + + + + Show Advanced Configuration + + + + + Your zcash node will be configured for you automatically + + + + + Use custom datadir + + + + + Please chose a directory to store your wallet.dat and blockchain + + + + + Choose directory + + + + + Connect over Tor + + + + + Please note that you'll need to already have a Tor service configured on port 9050 + + + zboard diff --git a/res/zec_qt_wallet_pt.ts b/res/zec_qt_wallet_pt.ts index 60cecf2..4027b62 100644 --- a/res/zec_qt_wallet_pt.ts +++ b/res/zec_qt_wallet_pt.ts @@ -138,8 +138,8 @@ - - + + Memo Anexar recado @@ -244,7 +244,7 @@ - + Loading... Carregando... @@ -367,7 +367,7 @@ - + Export transactions @@ -458,151 +458,151 @@ - + Could not understand address - + Unknown field in URI: - + Please paste your private keys (z-Addr or t-Addr) here, one per line Coloque sua(s) chave(s) privadas (z-Addr ou t-Addr) aqui, uma por linha - + The keys will be imported into your connected zcashd node As chaves serão importadas em seu nó zcashd conectado - + Error - + Error exporting transactions, file was not saved - + No wallet.dat Nenhum wallet.data - + Couldn't find the wallet.dat on this computer Não foi localizado o wallet.dat nesse computador - + You need to back it up from the machine zcashd is running on Você precisar salvar a partir da máquina que zcashd está rodando - + Backup wallet.dat Salvar wallet.dat - + Couldn't backup Não foi possível salvar - + Couldn't backup the wallet.dat file. Não foi possível salvar o arquivo wallet.dat. - + You need to back it up manually. Você precisar salvá-lo manualmente. - + These are all the private keys for all the addresses in your wallet YOUR_TRANSLATION_HERE - + Private key for Chave privada para - + Save File Salvar Arquivo - + Unable to open file Não foi possível abrir o arquivo - - + + Copy address Copiar endereço - - - + + + Copied to clipboard Copiado - + Get private key Obter chave privada - + Shield balance to Sapling Blindar saldo para Sapling - - + + View on block explorer Ver no explorador de blocos - + Migrate to Sapling Migrar para Sapling - + Copy txid Copiar txid - + View Memo Ver Recado - + Reply to - + Created new t-Addr Criar novo t-Addr - + Address has been previously used - + Address is unused @@ -706,27 +706,27 @@ não se parece com um z-Address QObject - + Attempting autoconnect Tentando conectar-se automaticamente - + Starting embedded zcashd Iniciando zcashd acoplado - + zcashd is set to run as daemon erro no zcashd - + Waiting for zcashd Esperando pelo zcashd - + You have zcashd set to start as a daemon, which can cause problems with zec-qt-wallet .Please remove the following line from your zcash.conf and restart zec-qt-wallet @@ -736,7 +736,7 @@ daemon=1 daemon=1 - + Couldn't start the embedded zcashd. Please try restarting. @@ -751,7 +751,7 @@ Se você iniciou zcashd anteriormente com parâmetros customizados você pode pr Se ainda assim não der certo, por favor rode zcashd manualmente. - + Couldn't connect to zcashd configured in zcash.conf. Not starting embedded zcashd because --no-embedded was passed @@ -760,150 +760,165 @@ Not starting embedded zcashd because --no-embedded was passed Não iniciando zcashd acoplado porque nenhum foi passado como parâmetro - + + Hide Advanced Config + + + + + Show Advanced Config + + + + + Choose data directory + + + + All Downloads Finished Successfully! Todos os downloads terminaram com sucesso! - + Couldn't download params. Please check the help site for more info. Não foi possível baixar os parâmetros. Por favor, verifique o site de ajuda para mais informações. - + The process returned O processo retornou - - + + Downloading Baixando - + more remaining ) faltando ) - + MB of MB de - + MB at MB a - + Downloading blocks Baixando blocos - + Block height Altura do bloco - + Syncing Sincronizando - + Connected Conectado - + testnet: testnet: - + Connected to zcashd Conectado ao zcashd - + zcashd has no peer connections - + There was an error connecting to zcashd. The error was Ocorreu um erro conectando ao zcashd. O erro foi - + The transaction with id A transação com id - + failed. The error was falhou. O erro foi - + failed falhou - + Tx Tx - + tx computing. This can take several minutes. gerando transação. Isso pode levar alguns minutos. - + Update Available - + A new release v%1 is available! You have v%2. Would you like to visit the releases page? - + No updates available - + You already have the latest release v%1 - + Please wait for zec-qt-wallet to exit Por favor, espera zec-qt-wallet finalizar - + Waiting for zcashd to exit Esperando zcashd finalizar - + failed. Please check the help site for more info falhou. Por favor, cheque o site de ajuda para mais informações - + zcashd error erro no zcashd - + A manual connection was requested, but the settings are not configured. Please set the host/port and user/password in the Edit->Settings menu. @@ -912,7 +927,7 @@ Please set the host/port and user/password in the Edit->Settings menu. - + Could not connect to zcashd configured in settings. Please set the host/port and user/password in the Edit->Settings menu. @@ -921,29 +936,29 @@ Please set the host/port and user/password in the Edit->Settings menu. - + Authentication failed. The username / password you specified was not accepted by zcashd. Try changing it in the Edit->Settings menu Autenticação falhou. O usuário/senha especificado não foi aceitado pelo zcashd. Tente alterá-los em Editar->Preferências - + Your zcashd is starting up. Please wait. Seu zcashd está iniciando. Por favor aguarde. - - + + Connection Error Erro na Conexão - - + + Transaction Error Erro na transação - + There was an error sending the transaction. The error was: Ocorreu um erro enviando a transação. O erro foi: @@ -1280,6 +1295,49 @@ Você possui fundos não confirmados ou o saldo é muito baixo para uma migraç Você está usando uma taxa customizada. Como as taxas são transparentes, você pode estar comprometendo sua privacidade. Por favor, só use isso se souber o que está fazendo! + + createZcashConf + + + Configure zcash.conf + + + + + Show Advanced Configuration + + + + + Your zcash node will be configured for you automatically + + + + + Use custom datadir + + + + + Please chose a directory to store your wallet.dat and blockchain + + + + + Choose directory + + + + + Connect over Tor + + + + + Please note that you'll need to already have a Tor service configured on port 9050 + + + zboard From 8273e2a649edd4e903fc0edffdf890cace531d64 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 28 Jan 2019 11:01:11 -0800 Subject: [PATCH 16/25] v0.5.8 --- README.md | 6 +++--- res/zec_qt_wallet_fr.qm | Bin 197525 -> 200205 bytes res/zec_qt_wallet_fr.ts | 2 +- src/version.h | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2b3febd..f1e6479 100644 --- a/README.md +++ b/README.md @@ -10,14 +10,14 @@ Head over to the releases page and grab the latest installers or binary. https:/ If you are on Debian/Ubuntu, please download the `.deb` package and install it. ``` -sudo dpkg -i linux-deb-zec-qt-wallet-v0.5.7.deb +sudo dpkg -i linux-deb-zec-qt-wallet-v0.5.8.deb sudo apt install -f ``` Or you can download and run the binaries directly. ``` -tar -xvf zec-qt-wallet-v0.5.7.tar.gz -./zec-qt-wallet-v0.5.7/zec-qt-wallet +tar -xvf zec-qt-wallet-v0.5.8.tar.gz +./zec-qt-wallet-v0.5.8/zec-qt-wallet ``` ### Windows diff --git a/res/zec_qt_wallet_fr.qm b/res/zec_qt_wallet_fr.qm index 0b575d8b52f17081ecf748b26c953c03eb340168..cef7fde4baae531a90dcf640b4fe9143dd517c73 100644 GIT binary patch delta 16230 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�tIT!XiYii(YcY?jj;%u)IPOJK{F? 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 delta 14249 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 t( URI should be of the form 'zcash:<addr>?amt=x&memo=y - Le format URI doit être comme suit: 'zcash:<addr>?amt=x&memo=y< + Le format URI doit être comme suit: 'zcash:<addr>?amt=x&memo=y diff --git a/src/version.h b/src/version.h index ec5d866..473af92 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define APP_VERSION "0.5.7" +#define APP_VERSION "0.5.8" From 59484c880751acf65b14e938d9cc4c880fa553f0 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 28 Jan 2019 11:07:40 -0800 Subject: [PATCH 17/25] Supress warning --- src/connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connection.cpp b/src/connection.cpp index b54b3dc..0eac1c0 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -155,7 +155,7 @@ void ConnectionLoader::createZcashConf() { }); QObject::connect(ui.btnPickDir, &QPushButton::clicked, [=]() { - auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), fi.dir().absolutePath(), QFileDialog::ShowDirsOnly); + auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), "", QFileDialog::ShowDirsOnly); if (!datadir.isEmpty()) { ui.lblDirName->setText(QDir::toNativeSeparators(datadir)); } From ed9364c0d46821d6df8945eb23d71dfa31226827 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Mon, 28 Jan 2019 11:12:59 -0800 Subject: [PATCH 18/25] Default to prev dir --- src/connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connection.cpp b/src/connection.cpp index 0eac1c0..b2c46f2 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -155,7 +155,7 @@ void ConnectionLoader::createZcashConf() { }); QObject::connect(ui.btnPickDir, &QPushButton::clicked, [=]() { - auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), "", QFileDialog::ShowDirsOnly); + auto datadir = QFileDialog::getExistingDirectory(main, QObject::tr("Choose data directory"), ui.lblDirName->text(), QFileDialog::ShowDirsOnly); if (!datadir.isEmpty()) { ui.lblDirName->setText(QDir::toNativeSeparators(datadir)); } From 7026a530ff24670f4fe4a3a91af98e834b4601db Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Tue, 29 Jan 2019 15:10:31 -0800 Subject: [PATCH 19/25] Stop nagging for updates if the user presses cancel --- .gitignore | 1 + src/rpc.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ad04c2d..40c5a53 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ release/ x64/ artifacts/ .vscode/ +res/libsodium/libsodium* src/ui_*.h *.autosave src/precompiled.h.cpp diff --git a/src/rpc.cpp b/src/rpc.cpp index 7a7b443..fbce009 100644 --- a/src/rpc.cpp +++ b/src/rpc.cpp @@ -943,8 +943,14 @@ void RPC::checkForUpdate(bool silent) { } auto currentVersion = QVersionNumber::fromString(APP_VERSION); + + // Get the max version that the user has hidden updates for + QSettings s; + auto maxHiddenVersion = QVersionNumber::fromString(s.value("update/lastversion", "0.0.0").toString()); + qDebug() << "Version check: Current " << currentVersion << ", Available " << maxVersion; - if (maxVersion > currentVersion) { + + if (maxVersion > currentVersion && maxVersion > maxHiddenVersion) { auto ans = QMessageBox::information(main, QObject::tr("Update Available"), QObject::tr("A new release v%1 is available! You have v%2.\n\nWould you like to visit the releases page?") .arg(maxVersion.toString()) @@ -952,6 +958,9 @@ void RPC::checkForUpdate(bool silent) { QMessageBox::Yes, QMessageBox::Cancel); if (ans == QMessageBox::Yes) { QDesktopServices::openUrl(QUrl("https://github.com/ZcashFoundation/zec-qt-wallet/releases")); + } else { + // If the user selects cancel, don't bother them again for this version + s.setValue("update/lastversion", maxVersion.toString()); } } else { if (!silent) { From e47d3b5a359fa38b38b8f5c36dcfa45aa6d256c1 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Tue, 29 Jan 2019 15:18:38 -0800 Subject: [PATCH 20/25] #91 Store sent Tx address, handle multiple sent addresses case. --- src/senttxstore.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/senttxstore.cpp b/src/senttxstore.cpp index 9237a3c..3fc66ac 100644 --- a/src/senttxstore.cpp +++ b/src/senttxstore.cpp @@ -84,12 +84,22 @@ void SentTxStore::addToSentTx(Tx tx, QString txid) { totalAmount += i.amount; } + QString toAddresses; + if (tx.toAddrs.length() == 1) { + toAddresses = tx.toAddrs[0].addr; + } else { + // Concatenate all the toAddresses + for (auto a : tx.toAddrs) { + toAddresses += a.addr % "(" % Settings::getZECDisplayFormat(a.amount) % ") "; + } + } + auto list = jsonDoc.array(); QJsonObject txItem; txItem["type"] = "sent"; txItem["from"] = tx.fromAddr; txItem["datetime"] = QDateTime::currentMSecsSinceEpoch() / (qint64)1000; - txItem["address"] = QString(); // The sent address is blank, to be consistent with t-Addr sent behaviour + txItem["address"] = toAddresses; txItem["txid"] = txid; txItem["amount"] = -totalAmount; txItem["fee"] = -tx.fee; From 2f7cfca59b74f070f2b9c55cda7bc2d74ec1e509 Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Thu, 31 Jan 2019 20:05:59 -0800 Subject: [PATCH 21/25] Show address usage as tooltip --- src/mainwindow.cpp | 5 ++--- src/mainwindow.ui | 32 +++++++++----------------------- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index da2086b..e48870b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1242,7 +1242,6 @@ void MainWindow::setupRecieveTab() { ui->rcvBal->clear(); ui->txtRecieve->clear(); ui->qrcodeDisplay->clear(); - ui->lblUsed->clear(); return; } @@ -1259,9 +1258,9 @@ void MainWindow::setupRecieveTab() { ui->txtRecieve->setPlainText(addr); ui->qrcodeDisplay->setAddress(addr); if (rpc->getUsedAddresses()->value(addr, false)) { - ui->lblUsed->setText(tr("Address has been previously used")); + ui->rcvBal->setToolTip(tr("Address has been previously used")); } else { - ui->lblUsed->setText(tr("Address is unused")); + ui->rcvBal->setToolTip(tr("Address is unused")); } }); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 7e758d1..2976f41 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -346,8 +346,8 @@ 0 0 - 920 - 334 + 928 + 380 @@ -739,17 +739,7 @@ - - - - Address - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - + @@ -773,17 +763,13 @@ - - + + - Address used + Address - - - - - - + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -992,7 +978,7 @@ 0 0 968 - 22 + 19 From 35636710a185ad0aa81aa63c238953cbb26bf84a Mon Sep 17 00:00:00 2001 From: adityapk00 Date: Thu, 31 Jan 2019 20:14:58 -0800 Subject: [PATCH 22/25] Deprecate creating new Sprout addresses --- src/mainwindow.cpp | 13 +++++++++++-- src/mainwindow.ui | 4 ++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e48870b..d79df73 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1182,7 +1182,16 @@ void MainWindow::setupRecieveTab() { }); // zAddr toggle button, one for sprout and one for sapling - QObject::connect(ui->rdioZAddr, &QRadioButton::toggled, addZAddrsToComboList(false)); + QObject::connect(ui->rdioZAddr, &QRadioButton::toggled, [=](bool checked) { + ui->btnRecieveNewAddr->setEnabled(!checked); + if (checked) { + ui->btnRecieveNewAddr->setToolTip(tr("Creation of new Sprout addresses is deprecated")); + } + else { + ui->btnRecieveNewAddr->setToolTip(""); + } + addZAddrsToComboList(false)(checked); + }); QObject::connect(ui->rdioZSAddr, &QRadioButton::toggled, addZAddrsToComboList(true)); // Explicitly get new address button. @@ -1215,7 +1224,7 @@ void MainWindow::setupRecieveTab() { if (Settings::getInstance()->isSaplingActive()) { ui->rdioZSAddr->setVisible(true); ui->rdioZSAddr->setChecked(true); - ui->rdioZAddr->setText("z-Addr(Sprout)"); + ui->rdioZAddr->setText("z-Addr(Legacy Sprout)"); } else { ui->rdioZSAddr->setVisible(false); ui->rdioZAddr->setChecked(true); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 2976f41..e75fdef 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -629,7 +629,7 @@ - z-Addr(Sapling) + z-Addr @@ -649,7 +649,7 @@ - z-Addr(Sprout) + z-Addr(Legacy Sprout) From 058763a800a42b0cb32321a89023ebc3820477f3 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Fri, 1 Feb 2019 10:29:37 -0800 Subject: [PATCH 23/25] Clean warnings --- src/mainwindow.cpp | 2 +- src/mainwindow.ui | 4 ++-- src/sendtab.cpp | 7 ++++++- src/turnstile.cpp | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7710d86..18203bb 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -620,7 +620,7 @@ void MainWindow::postToZBoard() { rpc->executeTransaction(tx, [=] (QString opid) { ui->statusBar->showMessage(tr("Computing Tx: ") % opid); }, - [=] (QString opid, QString txid) { + [=] (QString /*opid*/, QString txid) { ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); }, [=] (QString opid, QString errStr) { diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 3ca0153..c45cfd9 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -531,7 +531,7 @@ - + @@ -1029,7 +1029,7 @@ 0 0 968 - 19 + 22 diff --git a/src/sendtab.cpp b/src/sendtab.cpp index 05ce4dc..878e0dd 100644 --- a/src/sendtab.cpp +++ b/src/sendtab.cpp @@ -97,6 +97,11 @@ void MainWindow::setupSendTab() { // Recurring schedule button QObject::connect(ui->btnRecurSchedule, &QPushButton::clicked, this, &MainWindow::editSchedule); + // Hide the recurring section for now + ui->chkRecurring->setVisible(false); + ui->lblRecurDesc->setVisible(false); + ui->btnRecurSchedule->setVisible(false); + // Set the default state for the whole page removeExtraAddresses(); } @@ -655,7 +660,7 @@ void MainWindow::sendButton() { [=] (QString opid) { ui->statusBar->showMessage(tr("Computing Tx: ") % opid); }, - [=] (QString opid, QString txid) { + [=] (QString, QString txid) { ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); }, [=] (QString opid, QString errStr) { diff --git a/src/turnstile.cpp b/src/turnstile.cpp index a94118d..e1f1cfd 100644 --- a/src/turnstile.cpp +++ b/src/turnstile.cpp @@ -350,11 +350,11 @@ void Turnstile::executeMigrationStep() { } } -void Turnstile::doSendTx(Tx tx, std::function cb) { +void Turnstile::doSendTx(Tx tx, std::function /*cb*/) { rpc->executeTransaction(tx, [=] (QString opid) { mainwindow->ui->statusBar->showMessage(QObject::tr("Computing Tx: ") % opid); }, - [=] (QString opid, QString txid) { + [=] (QString /*opid*/, QString txid) { mainwindow->ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); }, [=] (QString opid, QString errStr) { From 82d6e7552895afcaf24661d2ef75972620626ca7 Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Fri, 1 Feb 2019 10:48:06 -0800 Subject: [PATCH 24/25] Parse addresses properly --- src/mainwindow.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 18203bb..165f91a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -239,12 +239,18 @@ void MainWindow::turnstileDoMigration(QString fromAddr) { auto fnUpdateSproutBalance = [=] (QString addr) { double bal = 0; + + // The currentText contains the balance as well, so strip that. + if (addr.contains("(")) { + addr = addr.left(addr.indexOf("(")); + } + if (addr.startsWith("All")) { bal = fnGetAllSproutBalance(); } else { bal = rpc->getAllBalances()->value(addr); } - + auto balTxt = Settings::getZECUSDDisplayFormat(bal); if (bal < Turnstile::minMigrationAmount) { From 97461c373bb9eebcc01ed15367c0644f71c969ce Mon Sep 17 00:00:00 2001 From: Aditya Kulkarni Date: Fri, 1 Feb 2019 10:58:24 -0800 Subject: [PATCH 25/25] Add callbacks properly --- src/turnstile.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/turnstile.cpp b/src/turnstile.cpp index e1f1cfd..df58b15 100644 --- a/src/turnstile.cpp +++ b/src/turnstile.cpp @@ -320,8 +320,10 @@ void Turnstile::executeMigrationStep() { return; } + // Sometimes, we check too quickly, and the unspent UTXO is not updated yet, so we'll + // double check to see if there is enough balance. if (!rpc->getAllBalances()->keys().contains(nextStep->intTAddr)) { - qDebug() << QString("The intermediate t-address doesn't have balance, even though it is confirmed"); + //qDebug() << QString("The intermediate t-address doesn't have balance, even though it seems to be confirmed"); return; } @@ -350,12 +352,13 @@ void Turnstile::executeMigrationStep() { } } -void Turnstile::doSendTx(Tx tx, std::function /*cb*/) { +void Turnstile::doSendTx(Tx tx, std::function cb) { rpc->executeTransaction(tx, [=] (QString opid) { mainwindow->ui->statusBar->showMessage(QObject::tr("Computing Tx: ") % opid); }, [=] (QString /*opid*/, QString txid) { mainwindow->ui->statusBar->showMessage(Settings::txidStatusMessage + " " + txid); + cb(); }, [=] (QString opid, QString errStr) { mainwindow->ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000);