qml: multisig wizard; cosigner w. electrum seed
This commit is contained in:
@@ -11,8 +11,12 @@ WizardComponent {
|
|||||||
|
|
||||||
valid: keystoregroup.checkedButton !== null
|
valid: keystoregroup.checkedButton !== null
|
||||||
|
|
||||||
|
property int cosigner: 0
|
||||||
|
property int participants: 0
|
||||||
|
|
||||||
function apply() {
|
function apply() {
|
||||||
wizard_data['cosigner_keystore_type'] = keystoregroup.checkedButton.keystoretype
|
wizard_data['cosigner_keystore_type'] = keystoregroup.checkedButton.keystoretype
|
||||||
|
wizard_data['multisig_current_cosigner'] = cosigner
|
||||||
}
|
}
|
||||||
|
|
||||||
ButtonGroup {
|
ButtonGroup {
|
||||||
@@ -21,7 +25,7 @@ WizardComponent {
|
|||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
Label {
|
Label {
|
||||||
text: qsTr('Add a cosigner to your multi-sig wallet')
|
text: qsTr('Add cosigner #%1 of %2 to your multi-sig wallet').arg(cosigner).arg(participants)
|
||||||
}
|
}
|
||||||
RadioButton {
|
RadioButton {
|
||||||
ButtonGroup.group: keystoregroup
|
ButtonGroup.group: keystoregroup
|
||||||
@@ -35,5 +39,16 @@ WizardComponent {
|
|||||||
text: qsTr('Cosigner seed')
|
text: qsTr('Cosigner seed')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onReadyChanged: {
|
||||||
|
if (!ready)
|
||||||
|
return
|
||||||
|
|
||||||
|
participants = wizard_data['multisig_participants']
|
||||||
|
|
||||||
|
// cosigner index is determined here and put on the wizard_data dict in apply()
|
||||||
|
// as this page is the start for each additional cosigner
|
||||||
|
cosigner = 2 + Object.keys(wizard_data['multisig_cosigner_data']).length
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,14 +6,28 @@ import org.electrum 1.0
|
|||||||
|
|
||||||
import "../controls"
|
import "../controls"
|
||||||
|
|
||||||
WizardComponent {
|
WCHaveSeed {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
valid: false
|
headingtext: qsTr('Cosigner #%1 of %2').arg(cosigner).arg(participants)
|
||||||
|
|
||||||
ColumnLayout {
|
property int cosigner: 0
|
||||||
Label {
|
property int participants: 0
|
||||||
text: qsTr('TODO: Cosigner seed entry')
|
|
||||||
}
|
function apply() {
|
||||||
|
console.log('apply fn called')
|
||||||
|
wizard_data['cosigner_seed'] = seed
|
||||||
|
wizard_data['cosigner_seed_variant'] = seed_variant
|
||||||
|
wizard_data['cosigner_seed_type'] = seed_type
|
||||||
|
wizard_data['cosigner_seed_extend'] = seed_extend
|
||||||
|
wizard_data['cosigner_seed_extra_words'] = seed_extra_words
|
||||||
|
}
|
||||||
|
|
||||||
|
onReadyChanged: {
|
||||||
|
if (!ready)
|
||||||
|
return
|
||||||
|
|
||||||
|
participants = wizard_data['multisig_participants']
|
||||||
|
cosigner = wizard_data['multisig_current_cosigner']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import QtQuick.Controls.Material 2.0
|
|||||||
|
|
||||||
import org.electrum 1.0
|
import org.electrum 1.0
|
||||||
|
|
||||||
import ".."
|
|
||||||
import "../controls"
|
import "../controls"
|
||||||
|
|
||||||
WizardComponent {
|
WizardComponent {
|
||||||
@@ -14,9 +13,19 @@ WizardComponent {
|
|||||||
|
|
||||||
property bool is2fa: false
|
property bool is2fa: false
|
||||||
|
|
||||||
|
property string headingtext
|
||||||
|
|
||||||
|
// expose for WCCosignerSeed 'subclass'
|
||||||
|
property alias seed: seedtext.text
|
||||||
|
property alias seed_variant: seed_variant_cb.currentValue
|
||||||
|
property alias seed_type: bitcoin.seed_type
|
||||||
|
property alias seed_extend: extendcb.checked
|
||||||
|
property string seed_extra_words: extendcb.checked ? customwordstext.text : ''
|
||||||
|
|
||||||
function apply() {
|
function apply() {
|
||||||
|
console.log('apply fn called (WCHaveSeed)')
|
||||||
wizard_data['seed'] = seedtext.text
|
wizard_data['seed'] = seedtext.text
|
||||||
wizard_data['seed_variant'] = seed_variant.currentValue
|
wizard_data['seed_variant'] = seed_variant_cb.currentValue
|
||||||
wizard_data['seed_type'] = bitcoin.seed_type
|
wizard_data['seed_type'] = bitcoin.seed_type
|
||||||
wizard_data['seed_extend'] = extendcb.checked
|
wizard_data['seed_extend'] = extendcb.checked
|
||||||
wizard_data['seed_extra_words'] = extendcb.checked ? customwordstext.text : ''
|
wizard_data['seed_extra_words'] = extendcb.checked ? customwordstext.text : ''
|
||||||
@@ -40,11 +49,11 @@ WizardComponent {
|
|||||||
qsTr('However, we do not generate SLIP39 seeds.')
|
qsTr('However, we do not generate SLIP39 seeds.')
|
||||||
].join(' ')
|
].join(' ')
|
||||||
}
|
}
|
||||||
infotext.text = t[seed_variant.currentValue]
|
infotext.text = t[seed_variant_cb.currentValue]
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkValid() {
|
function checkValid() {
|
||||||
bitcoin.verify_seed(seedtext.text, seed_variant.currentValue, wizard_data['wallet_type'])
|
bitcoin.verify_seed(seedtext.text, seed_variant_cb.currentValue, wizard_data['wallet_type'])
|
||||||
}
|
}
|
||||||
|
|
||||||
Flickable {
|
Flickable {
|
||||||
@@ -58,13 +67,19 @@ WizardComponent {
|
|||||||
width: parent.width
|
width: parent.width
|
||||||
columns: 2
|
columns: 2
|
||||||
|
|
||||||
|
Label {
|
||||||
|
Layout.columnSpan: 2
|
||||||
|
visible: headingtext
|
||||||
|
text: headingtext
|
||||||
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
visible: !is2fa
|
visible: !is2fa
|
||||||
text: qsTr('Seed Type')
|
text: qsTr('Seed Type')
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
}
|
}
|
||||||
ComboBox {
|
ComboBox {
|
||||||
id: seed_variant
|
id: seed_variant_cb
|
||||||
visible: !is2fa
|
visible: !is2fa
|
||||||
|
|
||||||
textRole: 'text'
|
textRole: 'text'
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ WizardComponent {
|
|||||||
stepSize: 1
|
stepSize: 1
|
||||||
from: 1
|
from: 1
|
||||||
to: participants
|
to: participants
|
||||||
|
value: signatures
|
||||||
onValueChanged: {
|
onValueChanged: {
|
||||||
if (activeFocus)
|
if (activeFocus)
|
||||||
signatures = value
|
signatures = value
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
|
|||||||
QEAbstractWizard.__init__(self, parent)
|
QEAbstractWizard.__init__(self, parent)
|
||||||
self._daemon = daemon
|
self._daemon = daemon
|
||||||
|
|
||||||
# attach view names
|
# attach view names and accept handlers
|
||||||
self.navmap_merge({
|
self.navmap_merge({
|
||||||
'wallet_name': { 'gui': 'WCWalletName' },
|
'wallet_name': { 'gui': 'WCWalletName' },
|
||||||
'wallet_type': { 'gui': 'WCWalletType' },
|
'wallet_type': { 'gui': 'WCWalletType' },
|
||||||
@@ -63,7 +63,12 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
|
|||||||
'multisig_show_masterpubkey': { 'gui': 'WCShowMasterPubkey' },
|
'multisig_show_masterpubkey': { 'gui': 'WCShowMasterPubkey' },
|
||||||
'multisig_cosigner_keystore': { 'gui': 'WCCosignerKeystore' },
|
'multisig_cosigner_keystore': { 'gui': 'WCCosignerKeystore' },
|
||||||
'multisig_cosigner_key': { 'gui': 'WCCosignerKey' },
|
'multisig_cosigner_key': { 'gui': 'WCCosignerKey' },
|
||||||
'multisig_cosigner_seed': { 'gui': 'WCCosignerSeed' },
|
'multisig_cosigner_seed': { 'gui': 'WCCosignerSeed',
|
||||||
|
'accept': self.accept_cosigner_seed
|
||||||
|
},
|
||||||
|
'multisig_cosigner_bip39_refine': { 'gui': 'WCBIP39Refine',
|
||||||
|
'accept': self.accept_cosigner_bip39refine
|
||||||
|
},
|
||||||
'imported': { 'gui': 'WCImport' },
|
'imported': { 'gui': 'WCImport' },
|
||||||
'wallet_password': { 'gui': 'WCWalletPassword' }
|
'wallet_password': { 'gui': 'WCWalletPassword' }
|
||||||
})
|
})
|
||||||
@@ -81,6 +86,21 @@ class QENewWalletWizard(NewWalletWizard, QEAbstractWizard):
|
|||||||
def is_single_password(self):
|
def is_single_password(self):
|
||||||
return self._daemon.singlePasswordEnabled
|
return self._daemon.singlePasswordEnabled
|
||||||
|
|
||||||
|
def accept_cosigner_seed(self, wizard_data):
|
||||||
|
self._logger.debug('accept_cosigner_seed')
|
||||||
|
cosigner = wizard_data['multisig_current_cosigner'] if 'multisig_current_cosigner' in wizard_data else 2
|
||||||
|
wizard_data['multisig_cosigner_data'][str(cosigner)] = {
|
||||||
|
'seed': wizard_data['cosigner_seed'],
|
||||||
|
'seed_variant': wizard_data['cosigner_seed_variant'],
|
||||||
|
'seed_type': wizard_data['cosigner_seed_type'],
|
||||||
|
'seed_extend': wizard_data['cosigner_seed_extend'],
|
||||||
|
'seed_extra_words': wizard_data['cosigner_seed_extra_words']
|
||||||
|
}
|
||||||
|
|
||||||
|
def accept_cosigner_bip39refine(self, wizard_data):
|
||||||
|
pass # TODO
|
||||||
|
|
||||||
|
|
||||||
@pyqtSlot('QJSValue', bool, str)
|
@pyqtSlot('QJSValue', bool, str)
|
||||||
def createStorage(self, js_data, single_password_enabled, single_password):
|
def createStorage(self, js_data, single_password_enabled, single_password):
|
||||||
self._logger.info('Creating wallet from wizard data')
|
self._logger.info('Creating wallet from wizard data')
|
||||||
|
|||||||
@@ -173,10 +173,12 @@ class NewWalletWizard(AbstractWizard):
|
|||||||
'next': self.on_cosigner_keystore_type
|
'next': self.on_cosigner_keystore_type
|
||||||
},
|
},
|
||||||
'multisig_cosigner_key': {
|
'multisig_cosigner_key': {
|
||||||
'next': 'multisig_cosigner_keystore' # TODO
|
'next': lambda d: 'multisig_cosigner_keystore' if self.has_all_cosigner_data(d) else 'wallet_password',
|
||||||
|
'last': lambda v,d: self.is_single_password() and self.has_all_cosigner_data(d)
|
||||||
},
|
},
|
||||||
'multisig_cosigner_seed': {
|
'multisig_cosigner_seed': {
|
||||||
'next': 'multisig_cosigner_keystore' # TODO
|
'next': lambda d: 'multisig_cosigner_keystore' if self.has_all_cosigner_data(d) else 'wallet_password',
|
||||||
|
'last': lambda v,d: self.is_single_password() and self.has_all_cosigner_data(d)
|
||||||
},
|
},
|
||||||
'imported': {
|
'imported': {
|
||||||
'next': 'wallet_password',
|
'next': 'wallet_password',
|
||||||
@@ -234,6 +236,9 @@ class NewWalletWizard(AbstractWizard):
|
|||||||
'seed': 'multisig_cosigner_seed'
|
'seed': 'multisig_cosigner_seed'
|
||||||
}.get(t)
|
}.get(t)
|
||||||
|
|
||||||
|
def has_all_cosigner_data(self, wizard_data):
|
||||||
|
return len(wizard_data['multisig_cosigner_data']) < (wizard_data['multisig_participants'] - 1)
|
||||||
|
|
||||||
def finished(self, wizard_data):
|
def finished(self, wizard_data):
|
||||||
self._logger.debug('finished')
|
self._logger.debug('finished')
|
||||||
# override
|
# override
|
||||||
|
|||||||
Reference in New Issue
Block a user