You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.5 KiB
159 lines
5.5 KiB
import QtQuick |
|
import QtQuick.Controls |
|
import QtQuick.Layouts |
|
|
|
import org.electrum |
|
|
|
import "controls" |
|
|
|
ElDialog { |
|
id: root |
|
|
|
title: qsTr('Sweep private keys') |
|
iconSource: Qt.resolvedUrl('../../icons/sweep.png') |
|
|
|
property bool valid: false |
|
property string privateKeys |
|
|
|
width: parent.width |
|
height: parent.height |
|
padding: 0 |
|
|
|
function verifyPrivateKey(key) { |
|
valid = false |
|
validationtext.text = '' |
|
key = key.trim() |
|
|
|
if (!key) { |
|
return false |
|
} |
|
|
|
if (!bitcoin.isPrivateKeyList(key)) { |
|
validationtext.text = qsTr('Error: invalid private key(s)') |
|
return false |
|
} |
|
|
|
return valid = true |
|
} |
|
|
|
function addPrivateKey(key) { |
|
if (sweepkeys.text.includes(key)) |
|
return |
|
if (sweepkeys.text && !sweepkeys.text.endsWith('\n')) |
|
sweepkeys.text = sweepkeys.text + '\n' |
|
sweepkeys.text = sweepkeys.text + key + '\n' |
|
} |
|
|
|
ColumnLayout { |
|
anchors.fill: parent |
|
spacing: 0 |
|
|
|
ColumnLayout { |
|
Layout.leftMargin: constants.paddingLarge |
|
Layout.rightMargin: constants.paddingLarge |
|
|
|
ColumnLayout { |
|
Layout.fillWidth: true |
|
Layout.fillHeight: true |
|
|
|
RowLayout { |
|
Layout.fillWidth: true |
|
TextHighlightPane { |
|
Layout.fillWidth: true |
|
Label { |
|
text: qsTr('Enter the list of private keys to sweep into this wallet') |
|
width: parent.width |
|
wrapMode: Text.Wrap |
|
} |
|
} |
|
HelpButton { |
|
heading: qsTr('Sweep private keys') |
|
helptext: qsTr('This will create a transaction sending all funds associated with the private keys to the current wallet') + |
|
'<br/><br/>' + qsTr('WIF keys are typed in Electrum, based on script type.') + '<br/><br/>' + |
|
qsTr('A few examples') + ':<br/>' + |
|
'<tt><b>p2pkh</b>:KxZcY47uGp9a... \t-> 1DckmggQM...<br/>' + |
|
'<b>p2wpkh-p2sh</b>:KxZcY47uGp9a... \t-> 3NhNeZQXF...<br/>' + |
|
'<b>p2wpkh</b>:KxZcY47uGp9a... \t-> bc1q3fjfk...</tt>' |
|
} |
|
} |
|
RowLayout { |
|
Layout.fillWidth: true |
|
Layout.fillHeight: true |
|
|
|
ElTextArea { |
|
id: sweepkeys |
|
Layout.fillWidth: true |
|
Layout.fillHeight: true |
|
Layout.minimumHeight: 160 |
|
font.family: FixedFont |
|
wrapMode: TextEdit.WrapAnywhere |
|
onTextChanged: { |
|
if (anyActiveFocus) { |
|
verifyPrivateKey(text) |
|
} |
|
} |
|
inputMethodHints: Qt.ImhSensitiveData | Qt.ImhNoPredictiveText | Qt.ImhNoAutoUppercase |
|
background: PaneInsetBackground { |
|
baseColor: constants.darkerDialogBackground |
|
} |
|
} |
|
ColumnLayout { |
|
Layout.alignment: Qt.AlignTop |
|
ToolButton { |
|
icon.source: '../../icons/paste.png' |
|
icon.height: constants.iconSizeMedium |
|
icon.width: constants.iconSizeMedium |
|
onClicked: { |
|
if (verifyPrivateKey(AppController.clipboardToText())) |
|
addPrivateKey(AppController.clipboardToText()) |
|
} |
|
} |
|
ToolButton { |
|
icon.source: '../../icons/qrcode.png' |
|
icon.height: constants.iconSizeMedium |
|
icon.width: constants.iconSizeMedium |
|
scale: 1.2 |
|
onClicked: { |
|
var dialog = app.scanDialog.createObject(app, { |
|
hint: qsTr('Scan a private key') |
|
}) |
|
dialog.onFound.connect(function() { |
|
if (verifyPrivateKey(dialog.scanData)) |
|
addPrivateKey(dialog.scanData) |
|
dialog.close() |
|
}) |
|
dialog.open() |
|
} |
|
} |
|
} |
|
} |
|
|
|
InfoTextArea { |
|
id: validationtext |
|
iconStyle: InfoTextArea.IconStyle.Warn |
|
Layout.fillWidth: true |
|
Layout.margins: constants.paddingMedium |
|
visible: text |
|
} |
|
} |
|
} |
|
|
|
FlatButton { |
|
Layout.fillWidth: true |
|
Layout.preferredWidth: 1 |
|
enabled: valid |
|
icon.source: '../../icons/tab_send.png' |
|
text: qsTr('Sweep') |
|
onClicked: { |
|
console.log('sweeping') |
|
root.privateKeys = sweepkeys.text |
|
root.accept() |
|
} |
|
} |
|
|
|
} |
|
|
|
Bitcoin { |
|
id: bitcoin |
|
} |
|
}
|
|
|