From d800c41e619f684ec08bd1e44c6e87a467f51f67 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sat, 2 Nov 2024 11:59:07 +0100 Subject: [PATCH 1/6] feat: Add multisig_xpub_magic option to GetPublicKey. --- common/protob/messages-bitcoin.proto | 1 + core/src/trezor/messages.py | 2 + python/src/trezorlib/messages.py | 3 ++ .../src/protos/generated/messages_bitcoin.rs | 44 +++++++++++++++++-- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/common/protob/messages-bitcoin.proto b/common/protob/messages-bitcoin.proto index 9635cc8beb..a5bc87838c 100644 --- a/common/protob/messages-bitcoin.proto +++ b/common/protob/messages-bitcoin.proto @@ -85,6 +85,7 @@ message GetPublicKey { optional string coin_name = 4 [default='Bitcoin']; // coin to use for verifying optional InputScriptType script_type = 5 [default=SPENDADDRESS]; // used to distinguish between various address formats (non-segwit, segwit, etc.) optional bool ignore_xpub_magic = 6; // ignore SLIP-0132 XPUB magic, use xpub/tpub prefix for all account types + optional bool multisig_xpub_magic = 7; // use Ypub/Zpub prefix for SegWit script types } /** diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index 5a5bb25245..c6ca5141d8 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -482,6 +482,7 @@ class GetPublicKey(protobuf.MessageType): coin_name: "str" script_type: "InputScriptType" ignore_xpub_magic: "bool | None" + multisig_xpub_magic: "bool | None" def __init__( self, @@ -492,6 +493,7 @@ def __init__( coin_name: "str | None" = None, script_type: "InputScriptType | None" = None, ignore_xpub_magic: "bool | None" = None, + multisig_xpub_magic: "bool | None" = None, ) -> None: pass diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index d8ca51fc8e..0269713294 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -1108,6 +1108,7 @@ class GetPublicKey(protobuf.MessageType): 4: protobuf.Field("coin_name", "string", repeated=False, required=False, default='Bitcoin'), 5: protobuf.Field("script_type", "InputScriptType", repeated=False, required=False, default=InputScriptType.SPENDADDRESS), 6: protobuf.Field("ignore_xpub_magic", "bool", repeated=False, required=False, default=None), + 7: protobuf.Field("multisig_xpub_magic", "bool", repeated=False, required=False, default=None), } def __init__( @@ -1119,6 +1120,7 @@ def __init__( coin_name: Optional["str"] = 'Bitcoin', script_type: Optional["InputScriptType"] = InputScriptType.SPENDADDRESS, ignore_xpub_magic: Optional["bool"] = None, + multisig_xpub_magic: Optional["bool"] = None, ) -> None: self.address_n: Sequence["int"] = address_n if address_n is not None else [] self.ecdsa_curve_name = ecdsa_curve_name @@ -1126,6 +1128,7 @@ def __init__( self.coin_name = coin_name self.script_type = script_type self.ignore_xpub_magic = ignore_xpub_magic + self.multisig_xpub_magic = multisig_xpub_magic class PublicKey(protobuf.MessageType): diff --git a/rust/trezor-client/src/protos/generated/messages_bitcoin.rs b/rust/trezor-client/src/protos/generated/messages_bitcoin.rs index 4cd79fe34f..5edfa6a78b 100644 --- a/rust/trezor-client/src/protos/generated/messages_bitcoin.rs +++ b/rust/trezor-client/src/protos/generated/messages_bitcoin.rs @@ -427,6 +427,8 @@ pub struct GetPublicKey { pub script_type: ::std::option::Option<::protobuf::EnumOrUnknown>, // @@protoc_insertion_point(field:hw.trezor.messages.bitcoin.GetPublicKey.ignore_xpub_magic) pub ignore_xpub_magic: ::std::option::Option, + // @@protoc_insertion_point(field:hw.trezor.messages.bitcoin.GetPublicKey.multisig_xpub_magic) + pub multisig_xpub_magic: ::std::option::Option, // special fields // @@protoc_insertion_point(special_field:hw.trezor.messages.bitcoin.GetPublicKey.special_fields) pub special_fields: ::protobuf::SpecialFields, @@ -575,8 +577,27 @@ impl GetPublicKey { self.ignore_xpub_magic = ::std::option::Option::Some(v); } + // optional bool multisig_xpub_magic = 7; + + pub fn multisig_xpub_magic(&self) -> bool { + self.multisig_xpub_magic.unwrap_or(false) + } + + pub fn clear_multisig_xpub_magic(&mut self) { + self.multisig_xpub_magic = ::std::option::Option::None; + } + + pub fn has_multisig_xpub_magic(&self) -> bool { + self.multisig_xpub_magic.is_some() + } + + // Param is passed by value, moved + pub fn set_multisig_xpub_magic(&mut self, v: bool) { + self.multisig_xpub_magic = ::std::option::Option::Some(v); + } + fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData { - let mut fields = ::std::vec::Vec::with_capacity(6); + let mut fields = ::std::vec::Vec::with_capacity(7); let mut oneofs = ::std::vec::Vec::with_capacity(0); fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>( "address_n", @@ -608,6 +629,11 @@ impl GetPublicKey { |m: &GetPublicKey| { &m.ignore_xpub_magic }, |m: &mut GetPublicKey| { &mut m.ignore_xpub_magic }, )); + fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>( + "multisig_xpub_magic", + |m: &GetPublicKey| { &m.multisig_xpub_magic }, + |m: &mut GetPublicKey| { &mut m.multisig_xpub_magic }, + )); ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::( "GetPublicKey", fields, @@ -647,6 +673,9 @@ impl ::protobuf::Message for GetPublicKey { 48 => { self.ignore_xpub_magic = ::std::option::Option::Some(is.read_bool()?); }, + 56 => { + self.multisig_xpub_magic = ::std::option::Option::Some(is.read_bool()?); + }, tag => { ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?; }, @@ -677,6 +706,9 @@ impl ::protobuf::Message for GetPublicKey { if let Some(v) = self.ignore_xpub_magic { my_size += 1 + 1; } + if let Some(v) = self.multisig_xpub_magic { + my_size += 1 + 1; + } my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields()); self.special_fields.cached_size().set(my_size as u32); my_size @@ -701,6 +733,9 @@ impl ::protobuf::Message for GetPublicKey { if let Some(v) = self.ignore_xpub_magic { os.write_bool(6, v)?; } + if let Some(v) = self.multisig_xpub_magic { + os.write_bool(7, v)?; + } os.write_unknown_fields(self.special_fields.unknown_fields())?; ::std::result::Result::Ok(()) } @@ -724,6 +759,7 @@ impl ::protobuf::Message for GetPublicKey { self.coin_name = ::std::option::Option::None; self.script_type = ::std::option::Option::None; self.ignore_xpub_magic = ::std::option::Option::None; + self.multisig_xpub_magic = ::std::option::Option::None; self.special_fields.clear(); } @@ -735,6 +771,7 @@ impl ::protobuf::Message for GetPublicKey { coin_name: ::std::option::Option::None, script_type: ::std::option::Option::None, ignore_xpub_magic: ::std::option::Option::None, + multisig_xpub_magic: ::std::option::Option::None, special_fields: ::protobuf::SpecialFields::new(), }; &instance @@ -13354,13 +13391,14 @@ static file_descriptor_proto_data: &'static [u8] = b"\ HDNodeTypeR\x05nodes\x12\x1b\n\taddress_n\x18\x05\x20\x03(\rR\x08address\ N\x1ah\n\x0eHDNodePathType\x129\n\x04node\x18\x01\x20\x02(\x0b2%.hw.trez\ or.messages.common.HDNodeTypeR\x04node\x12\x1b\n\taddress_n\x18\x02\x20\ - \x03(\rR\x08addressN\"\xa6\x02\n\x0cGetPublicKey\x12\x1b\n\taddress_n\ + \x03(\rR\x08addressN\"\xd6\x02\n\x0cGetPublicKey\x12\x1b\n\taddress_n\ \x18\x01\x20\x03(\rR\x08addressN\x12(\n\x10ecdsa_curve_name\x18\x02\x20\ \x01(\tR\x0eecdsaCurveName\x12!\n\x0cshow_display\x18\x03\x20\x01(\x08R\ \x0bshowDisplay\x12$\n\tcoin_name\x18\x04\x20\x01(\t:\x07BitcoinR\x08coi\ nName\x12Z\n\x0bscript_type\x18\x05\x20\x01(\x0e2+.hw.trezor.messages.bi\ tcoin.InputScriptType:\x0cSPENDADDRESSR\nscriptType\x12*\n\x11ignore_xpu\ - b_magic\x18\x06\x20\x01(\x08R\x0fignoreXpubMagic\"\xa5\x01\n\tPublicKey\ + b_magic\x18\x06\x20\x01(\x08R\x0fignoreXpubMagic\x12.\n\x13multisig_xpub\ + _magic\x18\x07\x20\x01(\x08R\x11multisigXpubMagic\"\xa5\x01\n\tPublicKey\ \x129\n\x04node\x18\x01\x20\x02(\x0b2%.hw.trezor.messages.common.HDNodeT\ ypeR\x04node\x12\x12\n\x04xpub\x18\x02\x20\x02(\tR\x04xpub\x12)\n\x10roo\ t_fingerprint\x18\x03\x20\x01(\rR\x0frootFingerprint\x12\x1e\n\ndescript\ From 4287d2b3775e1a1cc5f609ccf6b3eb5fe53f8c0f Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sun, 3 Nov 2024 10:59:08 +0100 Subject: [PATCH 2/6] refactor(core): Add sanitize_input_script_type(). --- core/src/apps/bitcoin/common.py | 8 ++++++++ core/src/apps/bitcoin/get_ownership_id.py | 7 +------ core/src/apps/bitcoin/get_ownership_proof.py | 7 +------ 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core/src/apps/bitcoin/common.py b/core/src/apps/bitcoin/common.py index 92f63be59b..3fb2054a16 100644 --- a/core/src/apps/bitcoin/common.py +++ b/core/src/apps/bitcoin/common.py @@ -190,6 +190,14 @@ def input_is_external_unverified(txi: TxInput) -> bool: ) +def sanitize_input_script_type(coin: CoinInfo, script_type: InputScriptType) -> None: + if script_type in SEGWIT_INPUT_SCRIPT_TYPES and not coin.segwit: + raise wire.DataError("Segwit not enabled on this coin.") + + if script_type == InputScriptType.SPENDTAPROOT and not coin.taproot: + raise wire.DataError("Taproot not enabled on this coin") + + def tagged_hashwriter(tag: bytes) -> HashWriter: from trezor.crypto.hashlib import sha256 from trezor.utils import HashWriter diff --git a/core/src/apps/bitcoin/get_ownership_id.py b/core/src/apps/bitcoin/get_ownership_id.py index dec6af5619..24247285ac 100644 --- a/core/src/apps/bitcoin/get_ownership_id.py +++ b/core/src/apps/bitcoin/get_ownership_id.py @@ -13,7 +13,6 @@ async def get_ownership_id( msg: GetOwnershipId, keychain: Keychain, coin: CoinInfo ) -> OwnershipId: - from trezor.enums import InputScriptType from trezor.messages import OwnershipId from trezor.wire import DataError @@ -34,11 +33,7 @@ async def get_ownership_id( if script_type not in common.INTERNAL_INPUT_SCRIPT_TYPES: raise DataError("Invalid script type") - if script_type in common.SEGWIT_INPUT_SCRIPT_TYPES and not coin.segwit: - raise DataError("Segwit not enabled on this coin") - - if script_type == InputScriptType.SPENDTAPROOT and not coin.taproot: - raise DataError("Taproot not enabled on this coin") + common.sanitize_input_script_type(coin, script_type) node = keychain.derive(msg.address_n) address = addresses.get_address(script_type, coin, node, msg.multisig) diff --git a/core/src/apps/bitcoin/get_ownership_proof.py b/core/src/apps/bitcoin/get_ownership_proof.py index 1bb2fe27c6..0e365b8616 100644 --- a/core/src/apps/bitcoin/get_ownership_proof.py +++ b/core/src/apps/bitcoin/get_ownership_proof.py @@ -19,7 +19,6 @@ async def get_ownership_proof( authorization: CoinJoinAuthorization | None = None, ) -> OwnershipProof: from trezor import TR - from trezor.enums import InputScriptType from trezor.messages import OwnershipProof from trezor.ui.layouts import confirm_action, confirm_blob from trezor.wire import DataError, ProcessError @@ -46,11 +45,7 @@ async def get_ownership_proof( if script_type not in common.INTERNAL_INPUT_SCRIPT_TYPES: raise DataError("Invalid script type") - if script_type in common.SEGWIT_INPUT_SCRIPT_TYPES and not coin.segwit: - raise DataError("Segwit not enabled on this coin") - - if script_type == InputScriptType.SPENDTAPROOT and not coin.taproot: - raise DataError("Taproot not enabled on this coin") + common.sanitize_input_script_type(coin, script_type) node = keychain.derive(msg.address_n) address = addresses.get_address(script_type, coin, node, msg.multisig) From 6568c36a83ef015047a2868455b20ed08a20b184 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sun, 3 Nov 2024 10:59:30 +0100 Subject: [PATCH 3/6] feat(core): Support multisig_xpub_magic in GetPublicKey. --- core/.changelog.d/2658.added | 1 + core/src/apps/bitcoin/common.py | 27 ++++++++++++++++ core/src/apps/bitcoin/get_address.py | 20 ++++-------- core/src/apps/bitcoin/get_public_key.py | 43 ++++++------------------- 4 files changed, 44 insertions(+), 47 deletions(-) create mode 100644 core/.changelog.d/2658.added diff --git a/core/.changelog.d/2658.added b/core/.changelog.d/2658.added new file mode 100644 index 0000000000..1d290b5c18 --- /dev/null +++ b/core/.changelog.d/2658.added @@ -0,0 +1 @@ +Add multisig_xpub_magic option to GetPublicKey. diff --git a/core/src/apps/bitcoin/common.py b/core/src/apps/bitcoin/common.py index 3fb2054a16..206a0eb34c 100644 --- a/core/src/apps/bitcoin/common.py +++ b/core/src/apps/bitcoin/common.py @@ -271,3 +271,30 @@ def _polymod(c: int, val: int) -> int: for j in range(0, 8): ret[j] = CHECKSUM_CHARSET[(c >> (5 * (7 - j))) & 31] return "".join(ret) + + +def get_xpub_magic( + coin: CoinInfo, + script_type: InputScriptType, + ignore_xpub_magic: bool | None, + is_multisig: bool | None, +) -> int: + from trezor.enums import InputScriptType + + xpub_magic = None + if not ignore_xpub_magic: + # Handle SegWit v0 script types. + # When coin.segwit is true, cointool.py guarantees that the corresponding xpub_magic_* attributes not None. + if not is_multisig: + if script_type == InputScriptType.SPENDP2SHWITNESS: + xpub_magic = coin.xpub_magic_segwit_p2sh + elif script_type == InputScriptType.SPENDWITNESS: + xpub_magic = coin.xpub_magic_segwit_native + else: + if script_type == InputScriptType.SPENDWITNESS: + xpub_magic = coin.xpub_magic_multisig_segwit_native + elif script_type == InputScriptType.SPENDP2SHWITNESS: + xpub_magic = coin.xpub_magic_multisig_segwit_p2sh + + # SPENDADDRESS, SPENDMULTISIG, SPENDTAPROOT, ignore_xpub_magic or fallback. + return xpub_magic or coin.xpub_magic diff --git a/core/src/apps/bitcoin/get_address.py b/core/src/apps/bitcoin/get_address.py index 9bbd8e845e..8468eb378f 100644 --- a/core/src/apps/bitcoin/get_address.py +++ b/core/src/apps/bitcoin/get_address.py @@ -39,6 +39,7 @@ async def get_address(msg: GetAddress, keychain: Keychain, coin: CoinInfo) -> Ad from apps.common.paths import address_n_to_str, validate_path from . import addresses + from .common import get_xpub_magic from .keychain import ( address_n_to_name_or_unknown, validate_path_against_script_type, @@ -72,20 +73,7 @@ async def get_address(msg: GetAddress, keychain: Keychain, coin: CoinInfo) -> Ad address_case_sensitive = False # cashaddr address mac: bytes | None = None - multisig_xpub_magic = coin.xpub_magic - if multisig: - if coin.segwit and not msg.ignore_xpub_magic: - if ( - script_type == InputScriptType.SPENDWITNESS - and coin.xpub_magic_multisig_segwit_native is not None - ): - multisig_xpub_magic = coin.xpub_magic_multisig_segwit_native - elif ( - script_type == InputScriptType.SPENDP2SHWITNESS - and coin.xpub_magic_multisig_segwit_p2sh is not None - ): - multisig_xpub_magic = coin.xpub_magic_multisig_segwit_p2sh - else: + if not multisig: # Attach a MAC for single-sig addresses, but only if the path is standard # or if the user explicitly confirms a non-standard path. if msg.show_display or ( @@ -97,6 +85,10 @@ async def get_address(msg: GetAddress, keychain: Keychain, coin: CoinInfo) -> Ad if msg.show_display: path = address_n_to_str(address_n) if multisig: + multisig_xpub_magic = get_xpub_magic( + coin, script_type, msg.ignore_xpub_magic, is_multisig=True + ) + if multisig.nodes: pubnodes = multisig.nodes else: diff --git a/core/src/apps/bitcoin/get_public_key.py b/core/src/apps/bitcoin/get_public_key.py index f852b1d134..3d0637b1ec 100644 --- a/core/src/apps/bitcoin/get_public_key.py +++ b/core/src/apps/bitcoin/get_public_key.py @@ -10,20 +10,20 @@ async def get_public_key( msg: GetPublicKey, auth_msg: MessageType | None = None ) -> PublicKey: - from trezor import TR, wire + from trezor import TR from trezor.enums import InputScriptType from trezor.messages import HDNodeType, PublicKey, UnlockPath from apps.common import coininfo, paths from apps.common.keychain import FORBIDDEN_KEY_PATH, get_keychain + from .common import get_xpub_magic, sanitize_input_script_type + coin_name = msg.coin_name or "Bitcoin" script_type = msg.script_type or InputScriptType.SPENDADDRESS coin = coininfo.by_name(coin_name) curve_name = msg.ecdsa_curve_name or coin.curve_name address_n = msg.address_n # local_cache_attribute - ignore_xpub_magic = msg.ignore_xpub_magic # local_cache_attribute - xpub_magic = coin.xpub_magic # local_cache_attribute if address_n and address_n[0] == paths.SLIP25_PURPOSE: # UnlockPath is required to access SLIP25 paths. @@ -38,36 +38,13 @@ async def get_public_key( node = keychain.derive(address_n) - if ( - script_type - in ( - InputScriptType.SPENDADDRESS, - InputScriptType.SPENDMULTISIG, - InputScriptType.SPENDTAPROOT, - ) - and xpub_magic is not None - ): - node_xpub = node.serialize_public(xpub_magic) - elif ( - coin.segwit - and script_type == InputScriptType.SPENDP2SHWITNESS - and (ignore_xpub_magic or coin.xpub_magic_segwit_p2sh is not None) - ): - assert coin.xpub_magic_segwit_p2sh is not None - node_xpub = node.serialize_public( - xpub_magic if ignore_xpub_magic else coin.xpub_magic_segwit_p2sh - ) - elif ( - coin.segwit - and script_type == InputScriptType.SPENDWITNESS - and (ignore_xpub_magic or coin.xpub_magic_segwit_native is not None) - ): - assert coin.xpub_magic_segwit_native is not None - node_xpub = node.serialize_public( - xpub_magic if ignore_xpub_magic else coin.xpub_magic_segwit_native + sanitize_input_script_type(coin, script_type) + + node_xpub = node.serialize_public( + get_xpub_magic( + coin, script_type, msg.ignore_xpub_magic, msg.multisig_xpub_magic ) - else: - raise wire.DataError("Invalid combination of coin and script_type") + ) pubkey = node.public_key() # For curve25519 and ed25519, the public key has the prefix 0x00, as specified by SLIP-10. However, since this prefix is non-standard, it may be removed in the future. @@ -79,7 +56,7 @@ async def get_public_key( public_key=pubkey, ) descriptor = _xpub_descriptor( - node, xpub_magic, address_n, script_type, keychain.root_fingerprint() + node, coin.xpub_magic, address_n, script_type, keychain.root_fingerprint() ) if msg.show_display: From f19e42362154cea58f957135d18cb377c3a20f91 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sun, 3 Nov 2024 13:06:39 +0100 Subject: [PATCH 4/6] feat(trezorctl): Support multisig in get-public-node. --- python/.changelog.d/2658.added | 1 + python/src/trezorlib/btc.py | 2 ++ python/src/trezorlib/cli/btc.py | 13 +++++++++++++ 3 files changed, 16 insertions(+) create mode 100644 python/.changelog.d/2658.added diff --git a/python/.changelog.d/2658.added b/python/.changelog.d/2658.added new file mode 100644 index 0000000000..0ef29f81f3 --- /dev/null +++ b/python/.changelog.d/2658.added @@ -0,0 +1 @@ +Support multisig in get-public-node. diff --git a/python/src/trezorlib/btc.py b/python/src/trezorlib/btc.py index a71ead2adc..acd7f2f290 100644 --- a/python/src/trezorlib/btc.py +++ b/python/src/trezorlib/btc.py @@ -112,6 +112,7 @@ def get_public_node( coin_name: Optional[str] = None, script_type: messages.InputScriptType = messages.InputScriptType.SPENDADDRESS, ignore_xpub_magic: bool = False, + multisig_xpub_magic: bool = False, unlock_path: Optional[List[int]] = None, unlock_path_mac: Optional[bytes] = None, ) -> "MessageType": @@ -130,6 +131,7 @@ def get_public_node( coin_name=coin_name, script_type=script_type, ignore_xpub_magic=ignore_xpub_magic, + multisig_xpub_magic=multisig_xpub_magic, ) ) diff --git a/python/src/trezorlib/cli/btc.py b/python/src/trezorlib/cli/btc.py index dde59a6bc6..ca97118cca 100644 --- a/python/src/trezorlib/cli/btc.py +++ b/python/src/trezorlib/cli/btc.py @@ -28,6 +28,7 @@ from ..client import TrezorClient PURPOSE_BIP44 = 44 +PURPOSE_BIP45 = 45 PURPOSE_BIP48 = 48 PURPOSE_BIP49 = 49 PURPOSE_BIP84 = 84 @@ -137,6 +138,14 @@ def guess_script_type_from_path(address_n: List[int]) -> messages.InputScriptTyp 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]]: if address_n and address_n[0] == tools.H_(10025): return address_n[:1] @@ -237,6 +246,7 @@ def get_address( @click.option("-e", "--curve") @click.option("-t", "--script-type", type=ChoiceType(INPUT_SCRIPTS)) @click.option("-d", "--show-display", is_flag=True) +@click.option("-m", "--multisig", is_flag=True) @with_client def get_public_node( client: "TrezorClient", @@ -245,11 +255,13 @@ def get_public_node( curve: Optional[str], script_type: Optional[messages.InputScriptType], show_display: bool, + multisig: bool, ) -> dict: """Get public node of given path.""" address_n = tools.parse_path(address) if script_type is None: script_type = guess_script_type_from_path(address_n) + multisig = multisig or guess_multisig_from_path(address_n) result = btc.get_public_node( client, address_n, @@ -257,6 +269,7 @@ def get_public_node( show_display=show_display, coin_name=coin, script_type=script_type, + multisig_xpub_magic=multisig, unlock_path=get_unlock_path(address_n), ) return { From 90e5fdf8caa9dc1bd64a7388fa68703f0afd07ac Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Mon, 4 Nov 2024 16:34:50 +0100 Subject: [PATCH 5/6] feat(legacy): Support multisig_xpub_magic in GetPublicKey. --- legacy/firmware/.changelog.d/2658.added | 1 + legacy/firmware/fsm_msg_coin.h | 82 ++++++++++++------------- 2 files changed, 41 insertions(+), 42 deletions(-) create mode 100644 legacy/firmware/.changelog.d/2658.added diff --git a/legacy/firmware/.changelog.d/2658.added b/legacy/firmware/.changelog.d/2658.added new file mode 100644 index 0000000000..1d290b5c18 --- /dev/null +++ b/legacy/firmware/.changelog.d/2658.added @@ -0,0 +1 @@ +Add multisig_xpub_magic option to GetPublicKey. diff --git a/legacy/firmware/fsm_msg_coin.h b/legacy/firmware/fsm_msg_coin.h index b767859b76..873f226e73 100644 --- a/legacy/firmware/fsm_msg_coin.h +++ b/legacy/firmware/fsm_msg_coin.h @@ -17,6 +17,35 @@ * along with this library. If not, see . */ +static bool fsm_checkScriptType(const CoinInfo *coin, + InputScriptType script_type); + +static int fsm_getXpubMagic(const CoinInfo *coin, InputScriptType script_type, + bool ignore_xpub_magic, bool is_multisig) { + uint32_t xpub_magic = 0; + if (!ignore_xpub_magic) { + // Handle SegWit v0 script types. + // When coin.segwit is true, cointool.py guarantees that the corresponding + // xpub_magic_* attributes are defined. + if (!is_multisig) { + if (script_type == InputScriptType_SPENDP2SHWITNESS) { + xpub_magic = coin->xpub_magic_segwit_p2sh; + } else if (script_type == InputScriptType_SPENDWITNESS) { + xpub_magic = coin->xpub_magic_segwit_native; + } + } else { + if (script_type == InputScriptType_SPENDWITNESS) { + xpub_magic = coin->xpub_magic_multisig_segwit_native; + } else if (script_type == InputScriptType_SPENDP2SHWITNESS) { + xpub_magic = coin->xpub_magic_multisig_segwit_p2sh; + } + } + } + + // SPENDADDRESS, SPENDMULTISIG, SPENDTAPROOT, ignore_xpub_magic or fallback. + return (xpub_magic != 0) ? xpub_magic : coin->xpub_magic; +} + void fsm_msgGetPublicKey(const GetPublicKey *msg) { RESP_INIT(PublicKey); @@ -80,39 +109,17 @@ void fsm_msgGetPublicKey(const GetPublicKey *msg) { // removed in the future. memcpy(resp->node.public_key.bytes, node->public_key, 33); - if (coin->xpub_magic && (script_type == InputScriptType_SPENDADDRESS || - script_type == InputScriptType_SPENDMULTISIG)) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, - sizeof(resp->xpub)); - } else if (coin->has_segwit && - script_type == InputScriptType_SPENDP2SHWITNESS && - !msg->ignore_xpub_magic && coin->xpub_magic_segwit_p2sh) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic_segwit_p2sh, - resp->xpub, sizeof(resp->xpub)); - } else if (coin->has_segwit && - script_type == InputScriptType_SPENDP2SHWITNESS && - msg->ignore_xpub_magic && coin->xpub_magic) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, - sizeof(resp->xpub)); - } else if (coin->has_segwit && script_type == InputScriptType_SPENDWITNESS && - !msg->ignore_xpub_magic && coin->xpub_magic_segwit_native) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic_segwit_native, - resp->xpub, sizeof(resp->xpub)); - } else if (coin->has_segwit && script_type == InputScriptType_SPENDWITNESS && - msg->ignore_xpub_magic && coin->xpub_magic) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, - sizeof(resp->xpub)); - } else if (coin->has_taproot && script_type == InputScriptType_SPENDTAPROOT && - coin->xpub_magic) { - hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, - sizeof(resp->xpub)); - } else { - fsm_sendFailure(FailureType_Failure_DataError, - _("Invalid combination of coin and script_type")); + if (!fsm_checkScriptType(coin, msg->script_type)) { layoutHome(); return; } + uint32_t xpub_magic = fsm_getXpubMagic( + coin, script_type, msg->ignore_xpub_magic, msg->multisig_xpub_magic); + + hdnode_serialize_public(node, fingerprint, xpub_magic, resp->xpub, + sizeof(resp->xpub)); + if (msg->has_show_display && msg->show_display) { for (int page = 0; page < 2; page++) { layoutXPUB(resp->xpub, page); @@ -234,7 +241,8 @@ bool fsm_checkCoinPath(const CoinInfo *coin, InputScriptType script_type, return true; } -bool fsm_checkScriptType(const CoinInfo *coin, InputScriptType script_type) { +static bool fsm_checkScriptType(const CoinInfo *coin, + InputScriptType script_type) { if (!is_internal_input_script_type(script_type)) { fsm_sendFailure(FailureType_Failure_DataError, _("Invalid script type")); return false; @@ -312,18 +320,8 @@ void fsm_msgGetAddress(const GetAddress *msg) { strlcpy(desc, _("Address:"), sizeof(desc)); } - uint32_t multisig_xpub_magic = coin->xpub_magic; - if (msg->has_multisig && coin->has_segwit) { - if (!msg->has_ignore_xpub_magic || !msg->ignore_xpub_magic) { - if (msg->script_type == InputScriptType_SPENDWITNESS && - coin->xpub_magic_segwit_native) { - multisig_xpub_magic = coin->xpub_magic_segwit_native; - } else if (msg->script_type == InputScriptType_SPENDP2SHWITNESS && - coin->xpub_magic_segwit_p2sh) { - multisig_xpub_magic = coin->xpub_magic_segwit_p2sh; - } - } - } + uint32_t multisig_xpub_magic = fsm_getXpubMagic( + coin, msg->script_type, msg->ignore_xpub_magic, msg->has_multisig); bool is_cashaddr = coin->cashaddr_prefix != NULL; if (!fsm_layoutAddress(address, desc, is_cashaddr, From 326696043ad863357c17bc0b97c16d68b81dc6c4 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Mon, 4 Nov 2024 16:55:02 +0100 Subject: [PATCH 6/6] feat(tests): Test multisig_xpub_magic in GetPublicKey. --- .../device_tests/bitcoin/test_getpublickey.py | 24 ++- tests/ui_tests/fixtures.json | 152 +++++++++--------- 2 files changed, 97 insertions(+), 79 deletions(-) diff --git a/tests/device_tests/bitcoin/test_getpublickey.py b/tests/device_tests/bitcoin/test_getpublickey.py index e8b90cbb48..7b040d9f84 100644 --- a/tests/device_tests/bitcoin/test_getpublickey.py +++ b/tests/device_tests/bitcoin/test_getpublickey.py @@ -144,37 +144,46 @@ def test_slip25_path(client: Client): ) -VECTORS_SCRIPT_TYPES = ( # script_type, xpub, xpub_ignored_magic +VECTORS_SCRIPT_TYPES = ( # script_type, xpub, xpub_ignored_magic, xpub_multisig ( None, "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", + "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", ), ( messages.InputScriptType.SPENDADDRESS, "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", + "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", ), ( messages.InputScriptType.SPENDP2SHWITNESS, "ypub6WYmBsV2xgQueQwhduAUQTFzUuXzQ2HEidmRpwKzX7ox8dsG8RCRD23zYcTkJiHhXDeb2nEGSiPbSaqGhBQu5jkgNvaiEiMxmZyMXEvfNco", "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", + "Ypub6hSrK7DUXdyH4z75aZdTEXboChaFcNxq2uR6kCbXtteMkpSAtpahJ8uvMKRDs9WbkgiZuNEPKvn6ZkT2zQZrEDsMDPh7e7pxfJFE77WWd1r", ), ( messages.InputScriptType.SPENDWITNESS, "zpub6qP2VY9x7MxPVi8pUFx6cYMVesgSLeGjdkHecLDsu8BqBjgVP5Myq5i8ZpRLJcwcvrmPnFppuNk9KsSqQspusySHFGH8pdBT3J2zujqcVuz", "xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXFD3YS797S55Y42sm2raxPrXQWAJodn7aXnHJdhz433ZJDhyUztHW55WatHeoYUVqui8cYNX8y", + "Zpub72H7cmtPgKWkvHJCQvR5SchJNfihYzxKx1wKXbVRGu2EovFQ9UkFvCa4NXNos4AXAKqNeqpwnb8eT34bi6ys2TYx5jPYE2eSw2JsVjF4phE", ), ) -@pytest.mark.parametrize("script_type, xpub, xpub_ignored_magic", VECTORS_SCRIPT_TYPES) -def test_script_type(client: Client, script_type, xpub, xpub_ignored_magic): +@pytest.mark.parametrize( + "script_type, xpub, xpub_ignored_magic, xpub_multisig", VECTORS_SCRIPT_TYPES +) +def test_script_type( + client: Client, script_type, xpub, xpub_ignored_magic, xpub_multisig +): path = parse_path("m/44h/0h/0") res = btc.get_public_node( client, path, coin_name="Bitcoin", script_type=script_type ) assert res.xpub == xpub + res = btc.get_public_node( client, path, @@ -183,3 +192,12 @@ def test_script_type(client: Client, script_type, xpub, xpub_ignored_magic): ignore_xpub_magic=True, ) assert res.xpub == xpub_ignored_magic + + res = btc.get_public_node( + client, + path, + coin_name="Bitcoin", + script_type=script_type, + multisig_xpub_magic=True, + ) + assert res.xpub == xpub_multisig diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index a27f55c3d8..6b7c973b4b 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -139,10 +139,10 @@ "T1B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", -"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +"T1B1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_bitcoin-test_getpublickey.py::test_slip25_path": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", @@ -1214,10 +1214,10 @@ "T2T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", "T2T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", "T2T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", -"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", -"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", -"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", -"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", +"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", +"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", +"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", +"T2T1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", "T2T1_cs_bitcoin-test_getpublickey.py::test_slip25_path": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", "T2T1_cs_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", "T2T1_cs_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "1f6bdb20db5fd627b7a35e11124951ebbb4fa8d5891f896c5c631864fa9db57c", @@ -2658,10 +2658,10 @@ "T2T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", "T2T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", "T2T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", -"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", -"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", -"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", -"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", +"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", +"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", +"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", +"T2T1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", "T2T1_de_bitcoin-test_getpublickey.py::test_slip25_path": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", "T2T1_de_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", "T2T1_de_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "96b3a83a05af35d33094d43598e4efcadb4d00a07141cb79bdfee45365b189d4", @@ -4102,10 +4102,10 @@ "T2T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", "T2T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", "T2T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", -"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", -"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", -"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", -"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", +"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", +"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", +"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", +"T2T1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", "T2T1_en_bitcoin-test_getpublickey.py::test_slip25_path": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", "T2T1_en_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", "T2T1_en_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "41a900645bc9366f28d560c3cdc4e0b507a813efeafe7d4e784545fc4db4d0d1", @@ -5564,10 +5564,10 @@ "T2T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", "T2T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", "T2T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", -"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", -"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", -"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", -"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", +"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", +"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", +"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", +"T2T1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", "T2T1_es_bitcoin-test_getpublickey.py::test_slip25_path": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", "T2T1_es_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", "T2T1_es_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "ac79464ce2c278a9a54e156b9fee11d6937e14dbb4b099281f740816376efa8a", @@ -7008,10 +7008,10 @@ "T2T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", "T2T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", "T2T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", -"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", -"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", -"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", -"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", +"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", +"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", +"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", +"T2T1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", "T2T1_fr_bitcoin-test_getpublickey.py::test_slip25_path": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", "T2T1_fr_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", "T2T1_fr_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "1c7a2caf38a46a6fbd9cac51d349454a40a267a6c3220be119770fe2b9f249d2", @@ -8452,10 +8452,10 @@ "T2T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", "T2T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", "T2T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", -"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", -"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", -"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", -"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", +"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", +"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", +"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", +"T2T1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", "T2T1_pt_bitcoin-test_getpublickey.py::test_slip25_path": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", "T2T1_pt_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", "T2T1_pt_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "c8dd180b3a8e7a34d43048add9ede1704df12cf145d1a8803d896a82b864f344", @@ -10174,10 +10174,10 @@ "T3B1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "T3B1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "T3B1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", -"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", -"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", -"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", -"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", +"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", +"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", +"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", +"T3B1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "T3B1_cs_bitcoin-test_getpublickey.py::test_slip25_path": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "T3B1_cs_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "T3B1_cs_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", @@ -11538,10 +11538,10 @@ "T3B1_de_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "T3B1_de_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "T3B1_de_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", -"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", -"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", -"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", -"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", +"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", +"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", +"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", +"T3B1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "T3B1_de_bitcoin-test_getpublickey.py::test_slip25_path": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "T3B1_de_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "T3B1_de_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", @@ -12902,10 +12902,10 @@ "T3B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "T3B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "T3B1_en_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", +"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", +"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", +"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", +"T3B1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "T3B1_en_bitcoin-test_getpublickey.py::test_slip25_path": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "T3B1_en_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "T3B1_en_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", @@ -14266,10 +14266,10 @@ "T3B1_es_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "T3B1_es_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "T3B1_es_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", -"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", -"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", -"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", -"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", +"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", +"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", +"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", +"T3B1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "T3B1_es_bitcoin-test_getpublickey.py::test_slip25_path": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "T3B1_es_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "T3B1_es_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", @@ -15630,10 +15630,10 @@ "T3B1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", "T3B1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", "T3B1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", -"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", -"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", -"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", -"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", +"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", +"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", +"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", +"T3B1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", "T3B1_fr_bitcoin-test_getpublickey.py::test_slip25_path": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", "T3B1_fr_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", "T3B1_fr_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "e3c2430161dcb3c785aa1366fe9c249c15a2fba6c9dc932099c591305b88a00c", @@ -16994,10 +16994,10 @@ "T3B1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", "T3B1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", "T3B1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", -"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", -"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", -"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", -"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", +"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", +"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", +"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", +"T3B1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", "T3B1_pt_bitcoin-test_getpublickey.py::test_slip25_path": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", "T3B1_pt_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", "T3B1_pt_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "666a44b8f08b659b477eeef76082e0777fa42defa7b7ef584b4ca8bce4337424", @@ -18688,10 +18688,10 @@ "T3T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", "T3T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", "T3T1_cs_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", -"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", -"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", -"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", -"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", +"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", +"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", +"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", +"T3T1_cs_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", "T3T1_cs_bitcoin-test_getpublickey.py::test_slip25_path": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", "T3T1_cs_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", "T3T1_cs_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "e333c4ca5bad56f95c92048d50f9de86ba17177f57345eb1d215f1d5f46d7027", @@ -20052,10 +20052,10 @@ "T3T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", "T3T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", "T3T1_de_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", -"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", -"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", -"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", -"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", +"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", +"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", +"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", +"T3T1_de_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", "T3T1_de_bitcoin-test_getpublickey.py::test_slip25_path": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", "T3T1_de_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", "T3T1_de_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "e70bebe8aa868999dc88c44f04d136bbdae30a0abc1af2ed4740bb516b60a202", @@ -21416,10 +21416,10 @@ "T3T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", "T3T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", "T3T1_en_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", -"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", -"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", -"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", -"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", +"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", +"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", +"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", +"T3T1_en_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", "T3T1_en_bitcoin-test_getpublickey.py::test_slip25_path": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", "T3T1_en_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", "T3T1_en_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "5133fce02dd881612fb121f919b85166d9edf574147fc18d5ab9812f01a17e3a", @@ -22780,10 +22780,10 @@ "T3T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", "T3T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", "T3T1_es_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", -"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", -"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", -"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", -"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", +"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", +"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", +"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", +"T3T1_es_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", "T3T1_es_bitcoin-test_getpublickey.py::test_slip25_path": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", "T3T1_es_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", "T3T1_es_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "a44ee27c95d20bca090bfe76b46e7fdbffb1f12802a0a80a87e3e22251b3fe90", @@ -24144,10 +24144,10 @@ "T3T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", "T3T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", "T3T1_fr_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", -"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", -"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", -"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", -"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", +"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", +"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", +"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", +"T3T1_fr_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", "T3T1_fr_bitcoin-test_getpublickey.py::test_slip25_path": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", "T3T1_fr_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", "T3T1_fr_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "6844430088a65e658ba478d88a3627156d42aaedb444e272757496c676593258", @@ -25508,10 +25508,10 @@ "T3T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Bitcoin-path3]": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", "T3T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Litecoin-path4]": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", "T3T1_pt_bitcoin-test_getpublickey.py::test_invalid_path[Testnet-path1]": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", -"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-9813cc48": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", -"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-0710fbb3": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", -"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-84eaa56c": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", -"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-c37a47fd": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", +"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDADDRESS-xpub6BiVtCp7ozs-1fe2aa32": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", +"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDP2SHWITNESS-ypub6WYmBsV-b255fc10": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", +"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[InputScriptType.SPENDWITNESS-zpub6qP2VY9x7Mx-bf8bd70e": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", +"T3T1_pt_bitcoin-test_getpublickey.py::test_script_type[None-xpub6BiVtCp7ozsRo7kaoYNrCNAVJwPYTQHjoXF-ebea9841": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", "T3T1_pt_bitcoin-test_getpublickey.py::test_slip25_path": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", "T3T1_pt_bitcoin-test_getpublickey_curve.py::test_coin_and_curve": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104", "T3T1_pt_bitcoin-test_getpublickey_curve.py::test_ed25519_public": "708b1d45065e8456dc4d87f675b4014305d7e197b88b33485c30c10523577104",