5 changed files with 322 additions and 4 deletions
@ -0,0 +1,159 @@ |
|||||||
|
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/add.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') |
||||||
|
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 |
||||||
|
console.log(root.privateKeys) |
||||||
|
root.accept() |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
Bitcoin { |
||||||
|
id: bitcoin |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue