2019-05-15 07:27:57 +00:00
// Copyright (c) 2014-2019, The Monero Project
2017-08-07 08:48:13 +00:00
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other
// materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors may be
// used to endorse or promote products derived from this software without specific
// prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2019-04-11 01:17:29 +00:00
import QtQuick 2.9
2017-08-07 08:48:13 +00:00
import QtQuick . Controls 1.4
import QtQuick . Controls . Styles 1.4
import QtQuick . Layouts 1.1
import QtQuick . Dialogs 1.2
2018-01-27 23:14:42 +00:00
import moneroComponents . Clipboard 1.0
2017-08-07 08:48:13 +00:00
import "../version.js" as Version
2018-12-29 23:24:39 +00:00
import "../components" as MoneroComponents
2018-01-27 23:14:42 +00:00
import "." 1.0
2017-08-07 08:48:13 +00:00
Rectangle {
id: page
2018-12-29 23:24:39 +00:00
property bool viewOnly: false
2019-04-25 19:09:23 +00:00
property int keysHeight: mainLayout . height + 100 // Ensure sufficient height for QR code, even in minimum width window case.
2017-08-07 08:48:13 +00:00
2018-01-27 23:14:42 +00:00
color: "transparent"
2017-08-07 08:48:13 +00:00
Clipboard { id: clipboard }
ColumnLayout {
id: mainLayout
2018-01-27 23:14:42 +00:00
2017-08-07 08:48:13 +00:00
anchors.left: parent . left
anchors.top: parent . top
anchors.right: parent . right
2018-01-27 23:14:42 +00:00
2019-04-25 19:09:23 +00:00
anchors.margins: ( isMobile ) ? 17 : 20
anchors.topMargin: 40
2018-01-27 23:14:42 +00:00
2019-04-25 19:09:23 +00:00
spacing: 30
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
2018-12-29 23:24:39 +00:00
MoneroComponents . WarningBox {
text: qsTr ( "WARNING: Do not reuse your Monero keys on another fork, UNLESS this fork has key reuse mitigations built in. Doing so will harm your privacy." ) + translationManager . emptyString ;
2018-03-31 12:57:00 +00:00
}
2018-12-29 23:24:39 +00:00
2017-08-07 08:48:13 +00:00
//! Manage wallet
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2018-12-29 23:24:39 +00:00
MoneroComponents . Label {
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
fontSize: 22
Layout.topMargin: 10
2017-08-07 08:48:13 +00:00
text: qsTr ( "Mnemonic seed" ) + translationManager . emptyString
}
2018-12-14 01:05:36 +00:00
2017-08-07 08:48:13 +00:00
Rectangle {
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
height: 2
2018-12-29 23:24:39 +00:00
color: MoneroComponents . Style . dividerColor
opacity: MoneroComponents . Style . dividerOpacity
2019-04-25 19:09:23 +00:00
Layout.bottomMargin: 10
2017-08-07 08:48:13 +00:00
}
2018-01-27 23:14:42 +00:00
2018-12-29 23:24:39 +00:00
MoneroComponents . WarningBox {
text: qsTr ( "WARNING: Copying your seed to clipboard can expose you to malicious software, which may record your seed and steal your Monero. Please write down your seed manually." ) + translationManager . emptyString
2018-12-14 01:05:36 +00:00
}
2018-12-29 23:24:39 +00:00
MoneroComponents . LineEditMulti {
2017-08-07 08:48:13 +00:00
id: seedText
2018-01-27 23:14:42 +00:00
spacing: 0
copyButton: true
addressValidation: false
2017-08-07 08:48:13 +00:00
readOnly: true
2018-07-18 13:00:53 +00:00
wrapMode: Text . WordWrap
2019-04-11 01:17:29 +00:00
fontColor: MoneroComponents . Style . defaultFontColor
2017-08-07 08:48:13 +00:00
}
}
ColumnLayout {
Layout.fillWidth: true
2019-05-15 07:27:57 +00:00
MoneroComponents . Label {
Layout.fillWidth: true
fontSize: 22
Layout.topMargin: 10
text: qsTr ( "Wallet restore height" ) + translationManager . emptyString
}
Rectangle {
Layout.fillWidth: true
height: 2
color: MoneroComponents . Style . dividerColor
opacity: MoneroComponents . Style . dividerOpacity
Layout.bottomMargin: 10
}
MoneroComponents . LineEdit {
Layout.fillWidth: true
2019-07-01 21:19:29 +00:00
id: walletCreationHeight
2019-05-15 07:27:57 +00:00
readOnly: true
copyButton: true
labelText: qsTr ( "Block #" ) + translationManager . emptyString
fontSize: 16
}
}
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2018-12-29 23:24:39 +00:00
MoneroComponents . Label {
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
fontSize: 22
Layout.topMargin: 10
2017-08-07 08:48:13 +00:00
text: qsTr ( "Keys" ) + translationManager . emptyString
}
Rectangle {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
height: 2
2018-12-29 23:24:39 +00:00
color: MoneroComponents . Style . dividerColor
opacity: MoneroComponents . Style . dividerOpacity
2019-04-25 19:09:23 +00:00
Layout.bottomMargin: 10
2017-08-07 08:48:13 +00:00
}
2018-12-29 23:24:39 +00:00
MoneroComponents . LineEdit {
2018-06-19 03:58:30 +00:00
Layout.fillWidth: true
id: secretViewKey
2017-08-07 08:48:13 +00:00
readOnly: true
2018-06-19 03:58:30 +00:00
copyButton: true
labelText: qsTr ( "Secret view key" ) + translationManager . emptyString
2019-04-25 19:09:23 +00:00
fontSize: 16
2018-06-19 03:58:30 +00:00
}
2018-12-29 23:24:39 +00:00
MoneroComponents . LineEdit {
2018-06-19 03:58:30 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
Layout.topMargin: 25
2018-06-19 03:58:30 +00:00
id: publicViewKey
readOnly: true
copyButton: true
labelText: qsTr ( "Public view key" ) + translationManager . emptyString
2019-04-25 19:09:23 +00:00
fontSize: 16
2018-06-19 03:58:30 +00:00
}
2018-12-29 23:24:39 +00:00
MoneroComponents . LineEdit {
2018-06-19 03:58:30 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
Layout.topMargin: 25
2018-06-19 03:58:30 +00:00
id: secretSpendKey
readOnly: true
copyButton: true
labelText: qsTr ( "Secret spend key" ) + translationManager . emptyString
2019-04-25 19:09:23 +00:00
fontSize: 16
2018-06-19 03:58:30 +00:00
}
2018-12-29 23:24:39 +00:00
MoneroComponents . LineEdit {
2018-06-19 03:58:30 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
Layout.topMargin: 25
2018-06-19 03:58:30 +00:00
id: publicSpendKey
readOnly: true
copyButton: true
labelText: qsTr ( "Public spend key" ) + translationManager . emptyString
2019-04-25 19:09:23 +00:00
fontSize: 16
2017-08-07 08:48:13 +00:00
}
}
ColumnLayout {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
2018-12-29 23:24:39 +00:00
MoneroComponents . Label {
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
fontSize: 22
Layout.topMargin: 10
2017-08-07 08:48:13 +00:00
text: qsTr ( "Export wallet" ) + translationManager . emptyString
}
Rectangle {
Layout.fillWidth: true
2018-01-27 23:14:42 +00:00
height: 2
2018-12-29 23:24:39 +00:00
color: MoneroComponents . Style . dividerColor
opacity: MoneroComponents . Style . dividerOpacity
2019-04-25 19:09:23 +00:00
Layout.bottomMargin: 10
2017-08-07 08:48:13 +00:00
}
2018-06-06 21:01:30 +00:00
ColumnLayout {
2018-12-29 23:24:39 +00:00
MoneroComponents . RadioButton {
2017-08-07 08:48:13 +00:00
id: showFullQr
2018-06-06 21:01:30 +00:00
enabled: ! this . checked
checked: fullWalletQRCode . visible
2017-08-07 08:48:13 +00:00
text: qsTr ( "Spendable Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = false
2018-06-06 21:01:30 +00:00
showViewOnlyQr . checked = false
2017-08-07 08:48:13 +00:00
}
}
2018-12-29 23:24:39 +00:00
MoneroComponents . RadioButton {
2018-06-06 21:01:30 +00:00
enabled: ! this . checked
2017-08-07 08:48:13 +00:00
id: showViewOnlyQr
2018-06-06 21:01:30 +00:00
checked: viewOnlyQRCode . visible
2017-08-07 08:48:13 +00:00
text: qsTr ( "View Only Wallet" ) + translationManager . emptyString
onClicked: {
viewOnlyQRCode . visible = true
2018-06-06 21:01:30 +00:00
showFullQr . checked = false
2017-08-07 08:48:13 +00:00
}
}
2019-04-25 19:09:23 +00:00
Layout.bottomMargin: 30
2017-08-07 08:48:13 +00:00
}
Image {
visible: ! viewOnlyQRCode . visible
id: fullWalletQRCode
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
Layout.minimumHeight: 180
2017-08-07 08:48:13 +00:00
smooth: false
fillMode: Image . PreserveAspectFit
}
Image {
visible: false
id: viewOnlyQRCode
Layout.fillWidth: true
2019-04-25 19:09:23 +00:00
Layout.minimumHeight: 180
2017-08-07 08:48:13 +00:00
smooth: false
fillMode: Image . PreserveAspectFit
}
2019-04-11 01:17:29 +00:00
MoneroComponents . TextPlain {
2017-08-07 08:48:13 +00:00
Layout.fillWidth: true
font.bold: true
2019-04-25 19:09:23 +00:00
font.pixelSize: 16
2018-12-29 23:24:39 +00:00
color: MoneroComponents . Style . defaultFontColor
2017-08-07 08:48:13 +00:00
text: ( viewOnlyQRCode . visible ) ? qsTr ( "View Only Wallet" ) + translationManager.emptyString : qsTr ( "Spendable Wallet" ) + translationManager . emptyString
horizontalAlignment: Text . AlignHCenter
}
2019-06-03 21:32:38 +00:00
MoneroComponents . StandardButton {
small: true
text: qsTr ( "Done" ) + translationManager . emptyString
onClicked: {
loadPage ( "Settings" )
}
2019-07-23 19:24:41 +00:00
Layout.alignment: Qt . AlignCenter
2019-06-03 21:32:38 +00:00
width: 135
}
2017-08-07 08:48:13 +00:00
}
}
// fires on every page load
function onPageCompleted ( ) {
console . log ( "keys page loaded" ) ;
2019-07-01 21:19:29 +00:00
walletCreationHeight . text = currentWallet . walletCreationHeight
2018-06-19 03:58:30 +00:00
secretViewKey . text = currentWallet . secretViewKey
publicViewKey . text = currentWallet . publicViewKey
secretSpendKey . text = ( ! currentWallet . viewOnly ) ? currentWallet.secretSpendKey : ""
publicSpendKey . text = currentWallet . publicSpendKey
2017-08-07 08:48:13 +00:00
2019-05-03 07:35:16 +00:00
seedText . text = currentWallet . seed === "" ? qsTr ( "Mnemonic seed protected by hardware device." ) + translationManager.emptyString : currentWallet . seed
2017-08-07 08:48:13 +00:00
if ( typeof currentWallet != "undefined" ) {
2018-11-29 01:17:15 +00:00
viewOnlyQRCode . source = "image://qrcode/monero_wallet:" + currentWallet . address ( 0 , 0 ) + "?view_key=" + currentWallet . secretViewKey + "&height=" + currentWallet . walletCreationHeight
fullWalletQRCode . source = viewOnlyQRCode . source + "&spend_key=" + currentWallet . secretSpendKey
2017-08-07 08:48:13 +00:00
if ( currentWallet . viewOnly ) {
viewOnlyQRCode . visible = true
showFullQr . visible = false
showViewOnlyQr . visible = false
2018-12-21 00:27:30 +00:00
seedText . text = qsTr ( "(View Only Wallet - No mnemonic seed available)" ) + translationManager . emptyString
secretSpendKey . text = qsTr ( "(View Only Wallet - No secret spend key available)" ) + translationManager . emptyString
2017-08-07 08:48:13 +00:00
}
2019-05-03 07:35:16 +00:00
// hardware device wallet
if ( currentWallet . seed === "" ) {
showFullQr . visible = false
viewOnlyQRCode . visible = true
showViewOnlyQr . visible = false
secretSpendKey . text = qsTr ( "(Hardware Device Wallet - No secret spend key available)" ) + translationManager . emptyString
}
2017-08-07 08:48:13 +00:00
}
}
// fires only once
Component.onCompleted: {
}
}