trezor: implement "backend" support for p2sh-segwit and native-segwit multisig
This commit is contained in:
@@ -9,7 +9,7 @@ from electrum import constants
|
||||
from electrum.i18n import _
|
||||
from electrum.plugins import BasePlugin, Device
|
||||
from electrum.transaction import deserialize, Transaction
|
||||
from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey
|
||||
from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey, xtype_from_derivation
|
||||
|
||||
from ..hw_wallet import HW_PluginBase
|
||||
|
||||
@@ -29,15 +29,10 @@ class TrezorKeyStore(Hardware_KeyStore):
|
||||
return self.derivation
|
||||
|
||||
def get_script_gen(self):
|
||||
def is_p2sh_segwit():
|
||||
return self.derivation.startswith("m/49'/")
|
||||
|
||||
def is_native_segwit():
|
||||
return self.derivation.startswith("m/84'/")
|
||||
|
||||
if is_native_segwit():
|
||||
xtype = xtype_from_derivation(self.derivation)
|
||||
if xtype in ('p2wpkh', 'p2wsh'):
|
||||
return SCRIPT_GEN_NATIVE_SEGWIT
|
||||
elif is_p2sh_segwit():
|
||||
elif xtype in ('p2wpkh-p2sh', 'p2wsh-p2sh'):
|
||||
return SCRIPT_GEN_P2SH_SEGWIT
|
||||
else:
|
||||
return SCRIPT_GEN_LEGACY
|
||||
@@ -275,6 +270,17 @@ class TrezorPlugin(HW_PluginBase):
|
||||
client.used()
|
||||
return xpub
|
||||
|
||||
def get_trezor_input_script_type(self, script_gen, is_multisig):
|
||||
if script_gen == SCRIPT_GEN_NATIVE_SEGWIT:
|
||||
return self.types.InputScriptType.SPENDWITNESS
|
||||
elif script_gen == SCRIPT_GEN_P2SH_SEGWIT:
|
||||
return self.types.InputScriptType.SPENDP2SHWITNESS
|
||||
else:
|
||||
if is_multisig:
|
||||
return self.types.InputScriptType.SPENDMULTISIG
|
||||
else:
|
||||
return self.types.InputScriptType.SPENDADDRESS
|
||||
|
||||
def sign_transaction(self, keystore, tx, prev_tx, xpub_path):
|
||||
self.prev_tx = prev_tx
|
||||
self.xpub_path = xpub_path
|
||||
@@ -301,12 +307,7 @@ class TrezorPlugin(HW_PluginBase):
|
||||
xpubs = wallet.get_master_public_keys()
|
||||
if len(xpubs) == 1:
|
||||
script_gen = keystore.get_script_gen()
|
||||
if script_gen == SCRIPT_GEN_NATIVE_SEGWIT:
|
||||
script_type = self.types.InputScriptType.SPENDWITNESS
|
||||
elif script_gen == SCRIPT_GEN_P2SH_SEGWIT:
|
||||
script_type = self.types.InputScriptType.SPENDP2SHWITNESS
|
||||
else:
|
||||
script_type = self.types.InputScriptType.SPENDADDRESS
|
||||
script_type = self.get_trezor_input_script_type(script_gen, is_multisig=False)
|
||||
client.get_address(self.get_coin_name(), address_n, True, script_type=script_type)
|
||||
else:
|
||||
def f(xpub):
|
||||
@@ -321,7 +322,9 @@ class TrezorPlugin(HW_PluginBase):
|
||||
signatures=[b''] * wallet.n,
|
||||
m=wallet.m,
|
||||
)
|
||||
client.get_address(self.get_coin_name(), address_n, True, multisig=multisig)
|
||||
script_gen = keystore.get_script_gen()
|
||||
script_type = self.get_trezor_input_script_type(script_gen, is_multisig=True)
|
||||
client.get_address(self.get_coin_name(), address_n, True, multisig=multisig, script_type=script_type)
|
||||
|
||||
def tx_inputs(self, tx, for_sig=False, script_gen=SCRIPT_GEN_LEGACY):
|
||||
inputs = []
|
||||
@@ -338,12 +341,7 @@ class TrezorPlugin(HW_PluginBase):
|
||||
xpub, s = parse_xpubkey(x_pubkey)
|
||||
xpub_n = self.client_class.expand_path(self.xpub_path[xpub])
|
||||
txinputtype._extend_address_n(xpub_n + s)
|
||||
if script_gen == SCRIPT_GEN_NATIVE_SEGWIT:
|
||||
txinputtype.script_type = self.types.InputScriptType.SPENDWITNESS
|
||||
elif script_gen == SCRIPT_GEN_P2SH_SEGWIT:
|
||||
txinputtype.script_type = self.types.InputScriptType.SPENDP2SHWITNESS
|
||||
else:
|
||||
txinputtype.script_type = self.types.InputScriptType.SPENDADDRESS
|
||||
txinputtype.script_type = self.get_trezor_input_script_type(script_gen, is_multisig=False)
|
||||
else:
|
||||
def f(x_pubkey):
|
||||
if is_xpubkey(x_pubkey):
|
||||
@@ -359,12 +357,7 @@ class TrezorPlugin(HW_PluginBase):
|
||||
signatures=list(map(lambda x: bfh(x)[:-1] if x else b'', txin.get('signatures'))),
|
||||
m=txin.get('num_sig'),
|
||||
)
|
||||
if script_gen == SCRIPT_GEN_NATIVE_SEGWIT:
|
||||
script_type = self.types.InputScriptType.SPENDWITNESS
|
||||
elif script_gen == SCRIPT_GEN_P2SH_SEGWIT:
|
||||
script_type = self.types.InputScriptType.SPENDP2SHWITNESS
|
||||
else:
|
||||
script_type = self.types.InputScriptType.SPENDMULTISIG
|
||||
script_type = self.get_trezor_input_script_type(script_gen, is_multisig=True)
|
||||
txinputtype = self.types.TxInputType(
|
||||
script_type=script_type,
|
||||
multisig=multisig
|
||||
|
||||
Reference in New Issue
Block a user