qml: add message sign/verify
This commit is contained in:
211
electrum/gui/qml/components/SignVerifyMessageDialog.qml
Normal file
211
electrum/gui/qml/components/SignVerifyMessageDialog.qml
Normal file
@@ -0,0 +1,211 @@
|
||||
import QtQuick 2.15
|
||||
import QtQuick.Layouts 1.0
|
||||
import QtQuick.Controls 2.14
|
||||
import QtQuick.Controls.Material 2.0
|
||||
|
||||
import org.electrum 1.0
|
||||
|
||||
import "controls"
|
||||
|
||||
ElDialog {
|
||||
id: dialog
|
||||
|
||||
enum Check {
|
||||
Unknown,
|
||||
Valid,
|
||||
Invalid
|
||||
}
|
||||
|
||||
property string address
|
||||
|
||||
property bool _addressValid: false
|
||||
property bool _addressMine: false
|
||||
property int _verified: SignVerifyMessageDialog.Check.Unknown
|
||||
|
||||
implicitHeight: parent.height
|
||||
implicitWidth: parent.width
|
||||
|
||||
title: qsTr('Sign/Verify Message')
|
||||
iconSource: Qt.resolvedUrl('../../icons/pen.png')
|
||||
|
||||
padding: 0
|
||||
|
||||
function validateAddress() {
|
||||
// TODO: not all types of addresses are valid (e.g. p2wsh)
|
||||
_addressValid = bitcoin.isAddress(addressField.text)
|
||||
_addressMine = Daemon.currentWallet.isAddressMine(addressField.text)
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
spacing: constants.paddingLarge
|
||||
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
Layout.leftMargin: constants.paddingLarge
|
||||
Layout.rightMargin: constants.paddingLarge
|
||||
|
||||
Label {
|
||||
text: qsTr('Address')
|
||||
color: Material.accentColor
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
TextField {
|
||||
id: addressField
|
||||
Layout.fillWidth: true
|
||||
placeholderText: qsTr('Address')
|
||||
font.family: FixedFont
|
||||
onTextChanged: {
|
||||
validateAddress()
|
||||
_verified = SignVerifyMessageDialog.Check.Unknown
|
||||
}
|
||||
}
|
||||
ToolButton {
|
||||
icon.source: '../../icons/paste.png'
|
||||
icon.color: 'transparent'
|
||||
onClicked: {
|
||||
addressField.text = AppController.clipboardToText()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr('Message')
|
||||
color: Material.accentColor
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
ElTextArea {
|
||||
id: plaintext
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
font.family: FixedFont
|
||||
wrapMode: TextInput.Wrap
|
||||
background: PaneInsetBackground {
|
||||
baseColor: constants.darkerDialogBackground
|
||||
}
|
||||
onTextChanged: _verified = SignVerifyMessageDialog.Check.Unknown
|
||||
}
|
||||
ColumnLayout {
|
||||
Layout.alignment: Qt.AlignTop
|
||||
ToolButton {
|
||||
icon.source: '../../icons/paste.png'
|
||||
icon.color: 'transparent'
|
||||
onClicked: {
|
||||
plaintext.text = AppController.clipboardToText()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Label {
|
||||
text: qsTr('Signature')
|
||||
color: Material.accentColor
|
||||
}
|
||||
Label {
|
||||
Layout.alignment: Qt.AlignRight
|
||||
visible: _verified != SignVerifyMessageDialog.Check.Unknown
|
||||
text: _verified == SignVerifyMessageDialog.Check.Valid
|
||||
? qsTr('Valid!')
|
||||
: qsTr('Invalid!')
|
||||
color: _verified == SignVerifyMessageDialog.Check.Valid
|
||||
? constants.colorDone
|
||||
: constants.colorError
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
ElTextArea {
|
||||
id: signature
|
||||
Layout.fillWidth: true
|
||||
Layout.maximumHeight: fontMetrics.lineSpacing * 4 + topPadding + bottomPadding
|
||||
Layout.minimumHeight: fontMetrics.lineSpacing * 4 + topPadding + bottomPadding
|
||||
font.family: FixedFont
|
||||
wrapMode: TextInput.Wrap
|
||||
background: PaneInsetBackground {
|
||||
baseColor: _verified == SignVerifyMessageDialog.Check.Unknown
|
||||
? constants.darkerDialogBackground
|
||||
: _verified == SignVerifyMessageDialog.Check.Valid
|
||||
? constants.colorValidBackground
|
||||
: constants.colorInvalidBackground
|
||||
}
|
||||
onTextChanged: _verified = SignVerifyMessageDialog.Check.Unknown
|
||||
}
|
||||
ColumnLayout {
|
||||
Layout.alignment: Qt.AlignTop
|
||||
ToolButton {
|
||||
icon.source: '../../icons/paste.png'
|
||||
icon.color: 'transparent'
|
||||
onClicked: {
|
||||
signature.text = AppController.clipboardToText()
|
||||
}
|
||||
}
|
||||
ToolButton {
|
||||
icon.source: '../../icons/share.png'
|
||||
icon.color: enabled ? 'transparent' : Material.iconDisabledColor
|
||||
enabled: signature.text
|
||||
onClicked: {
|
||||
var dialog = app.genericShareDialog.createObject(app, {
|
||||
title: qsTr('Message signature'),
|
||||
text_qr: signature.text
|
||||
})
|
||||
dialog.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ButtonContainer {
|
||||
Layout.fillWidth: true
|
||||
FlatButton {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredWidth: 1
|
||||
text: qsTr('Sign')
|
||||
visible: Daemon.currentWallet.canSignMessage
|
||||
enabled: _addressMine
|
||||
icon.source: '../../icons/seal.png'
|
||||
onClicked: {
|
||||
var sig = Daemon.currentWallet.signMessage(addressField.text, plaintext.text)
|
||||
signature.text = sig
|
||||
}
|
||||
}
|
||||
FlatButton {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredWidth: 1
|
||||
enabled: _addressValid && signature.text
|
||||
text: qsTr('Verify')
|
||||
icon.source: '../../icons/confirmed.png'
|
||||
onClicked: {
|
||||
var result = Daemon.verifyMessage(addressField.text, plaintext.text, signature.text)
|
||||
_verified = result
|
||||
? SignVerifyMessageDialog.Check.Valid
|
||||
: SignVerifyMessageDialog.Check.Invalid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
addressField.text = address
|
||||
}
|
||||
|
||||
Bitcoin {
|
||||
id: bitcoin
|
||||
}
|
||||
|
||||
FontMetrics {
|
||||
id: fontMetrics
|
||||
font: signature.font
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user