1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-26 09:28:13 +00:00

feat(trezorctl): Support multisig in get-public-node.

This commit is contained in:
Andrew Kozlik 2024-11-03 13:06:39 +01:00
parent 6568c36a83
commit f19e423621
3 changed files with 16 additions and 0 deletions

View File

@ -0,0 +1 @@
Support multisig in get-public-node.

View File

@ -112,6 +112,7 @@ def get_public_node(
coin_name: Optional[str] = None, coin_name: Optional[str] = None,
script_type: messages.InputScriptType = messages.InputScriptType.SPENDADDRESS, script_type: messages.InputScriptType = messages.InputScriptType.SPENDADDRESS,
ignore_xpub_magic: bool = False, ignore_xpub_magic: bool = False,
multisig_xpub_magic: bool = False,
unlock_path: Optional[List[int]] = None, unlock_path: Optional[List[int]] = None,
unlock_path_mac: Optional[bytes] = None, unlock_path_mac: Optional[bytes] = None,
) -> "MessageType": ) -> "MessageType":
@ -130,6 +131,7 @@ def get_public_node(
coin_name=coin_name, coin_name=coin_name,
script_type=script_type, script_type=script_type,
ignore_xpub_magic=ignore_xpub_magic, ignore_xpub_magic=ignore_xpub_magic,
multisig_xpub_magic=multisig_xpub_magic,
) )
) )

View File

@ -28,6 +28,7 @@ if TYPE_CHECKING:
from ..client import TrezorClient from ..client import TrezorClient
PURPOSE_BIP44 = 44 PURPOSE_BIP44 = 44
PURPOSE_BIP45 = 45
PURPOSE_BIP48 = 48 PURPOSE_BIP48 = 48
PURPOSE_BIP49 = 49 PURPOSE_BIP49 = 49
PURPOSE_BIP84 = 84 PURPOSE_BIP84 = 84
@ -137,6 +138,14 @@ def guess_script_type_from_path(address_n: List[int]) -> messages.InputScriptTyp
return messages.InputScriptType.SPENDADDRESS return messages.InputScriptType.SPENDADDRESS
def guess_multisig_from_path(address_n: List[int]) -> bool:
if len(address_n) < 1 or not tools.is_hardened(address_n[0]):
return False
purpose = tools.unharden(address_n[0])
return purpose in (PURPOSE_BIP45, PURPOSE_BIP48)
def get_unlock_path(address_n: List[int]) -> Optional[List[int]]: def get_unlock_path(address_n: List[int]) -> Optional[List[int]]:
if address_n and address_n[0] == tools.H_(10025): if address_n and address_n[0] == tools.H_(10025):
return address_n[:1] return address_n[:1]
@ -237,6 +246,7 @@ def get_address(
@click.option("-e", "--curve") @click.option("-e", "--curve")
@click.option("-t", "--script-type", type=ChoiceType(INPUT_SCRIPTS)) @click.option("-t", "--script-type", type=ChoiceType(INPUT_SCRIPTS))
@click.option("-d", "--show-display", is_flag=True) @click.option("-d", "--show-display", is_flag=True)
@click.option("-m", "--multisig", is_flag=True)
@with_client @with_client
def get_public_node( def get_public_node(
client: "TrezorClient", client: "TrezorClient",
@ -245,11 +255,13 @@ def get_public_node(
curve: Optional[str], curve: Optional[str],
script_type: Optional[messages.InputScriptType], script_type: Optional[messages.InputScriptType],
show_display: bool, show_display: bool,
multisig: bool,
) -> dict: ) -> dict:
"""Get public node of given path.""" """Get public node of given path."""
address_n = tools.parse_path(address) address_n = tools.parse_path(address)
if script_type is None: if script_type is None:
script_type = guess_script_type_from_path(address_n) script_type = guess_script_type_from_path(address_n)
multisig = multisig or guess_multisig_from_path(address_n)
result = btc.get_public_node( result = btc.get_public_node(
client, client,
address_n, address_n,
@ -257,6 +269,7 @@ def get_public_node(
show_display=show_display, show_display=show_display,
coin_name=coin, coin_name=coin,
script_type=script_type, script_type=script_type,
multisig_xpub_magic=multisig,
unlock_path=get_unlock_path(address_n), unlock_path=get_unlock_path(address_n),
) )
return { return {