feat(core): Show path for internal outputs in BTC signing.

andrewkozlik/account-naming2
Andrew Kozlik 1 year ago
parent 5668b5db2b
commit 4141118bbc

@ -0,0 +1 @@
Show path for internal outputs in BTC signing.

@ -1,9 +1,10 @@
from micropython import const
from typing import TYPE_CHECKING
from trezor.enums import InputScriptType
from trezor.messages import AuthorizeCoinJoin, SignMessage
from apps.common.paths import PATTERN_BIP44, PathSchema
from apps.common.paths import PATTERN_BIP44, PathSchema, unharden
from . import authorization
from .common import BITCOIN_NAMES
@ -15,7 +16,6 @@ if TYPE_CHECKING:
from trezor.protobuf import MessageType
from trezor.wire import Context
from trezor.enums import InputScriptType
from trezor.messages import (
GetAddress,
GetOwnershipId,
@ -331,3 +331,108 @@ def with_keychain(func: HandlerWithCoinInfo[MsgOut]) -> Handler[MsgIn, MsgOut]:
return await func(ctx, msg, keychain, coin)
return wrapper
class AccountType:
def __init__(
self,
account_name: str,
pattern: str,
script_type: InputScriptType,
require_segwit: bool,
require_bech32: bool,
require_taproot: bool,
):
self.account_name = account_name
self.pattern = pattern
self.script_type = script_type
self.require_segwit = require_segwit
self.require_bech32 = require_bech32
self.require_taproot = require_taproot
def get_name(
self,
coin: coininfo.CoinInfo,
address_n: Bip32Path,
script_type: InputScriptType,
) -> str | None:
if (
script_type != self.script_type
or not PathSchema.parse(self.pattern, coin.slip44).match(address_n)
or (not coin.segwit and self.require_segwit)
or (not coin.bech32_prefix and self.require_bech32)
or (not coin.taproot and self.require_taproot)
):
return None
name = f"{self.account_name} " if self.account_name else ""
name += "account"
account_pos = self.pattern.find("/account'")
if account_pos >= 0:
i = self.pattern.count("/", 0, account_pos)
account_number = unharden(address_n[i]) + 1
name += f" #{account_number}"
return name
def address_n_to_name(
coin: coininfo.CoinInfo, address_n: Bip32Path, script_type: InputScriptType
) -> str | None:
ACCOUNT_TYPES = (
AccountType(
"Legacy",
PATTERN_BIP44,
InputScriptType.SPENDADDRESS,
require_segwit=True,
require_bech32=False,
require_taproot=False,
),
AccountType(
"",
PATTERN_BIP44,
InputScriptType.SPENDADDRESS,
require_segwit=False,
require_bech32=False,
require_taproot=False,
),
AccountType(
"Legacy SegWit",
PATTERN_BIP49,
InputScriptType.SPENDP2SHWITNESS,
require_segwit=True,
require_bech32=False,
require_taproot=False,
),
AccountType(
"SegWit",
PATTERN_BIP84,
InputScriptType.SPENDWITNESS,
require_segwit=True,
require_bech32=True,
require_taproot=False,
),
AccountType(
"Taproot",
PATTERN_BIP86,
InputScriptType.SPENDTAPROOT,
require_segwit=False,
require_bech32=True,
require_taproot=True,
),
AccountType(
"Coinjoin",
PATTERN_SLIP25_TAPROOT,
InputScriptType.SPENDTAPROOT,
require_segwit=False,
require_bech32=True,
require_taproot=True,
),
)
for account in ACCOUNT_TYPES:
name = account.get_name(coin, address_n, script_type)
if name:
return name
return None

@ -6,8 +6,11 @@ from trezor.strings import format_amount
from trezor.ui import layouts
from trezor.ui.layouts import confirm_metadata
from apps.common.paths import address_n_to_str
from .. import addresses
from ..common import format_fee_rate
from ..common import CHANGE_OUTPUT_TO_INPUT_SCRIPT_TYPES, format_fee_rate
from ..keychain import address_n_to_name
if TYPE_CHECKING:
from typing import Any
@ -76,11 +79,20 @@ async def confirm_output(
else:
title = "Confirm sending"
address_label = None
if output.address_n:
script_type = CHANGE_OUTPUT_TO_INPUT_SCRIPT_TYPES[output.script_type]
address_label = (
address_n_to_name(coin, output.address_n, script_type)
or f"address path {address_n_to_str(output.address_n)}"
)
layout = layouts.confirm_output(
ctx,
address_short,
format_coin_amount(output.amount, coin, amount_unit),
title=title,
address_label=address_label,
)
await layout

@ -183,13 +183,15 @@ async def confirm_output(
amount: str,
title: str = "Confirm sending",
br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput,
address_label: str | None = None,
) -> None:
label = f" ({address_label})" if address_label else ""
result = await interact(
ctx,
RustLayout(
trezorui2.confirm_text(
title=title,
data=f"Send {amount} to {address}?",
data=f"Send {amount} to {address}{label}?",
description="Confirm Output",
)
),

@ -514,16 +514,18 @@ async def confirm_output(
amount: str,
title: str = "SENDING",
br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput,
address_label: str | None = None,
) -> None:
title = title.upper()
if title.startswith("CONFIRM "):
title = title[len("CONFIRM ") :]
description = f"To your {address_label}:" if address_label else "To:"
await confirm_value(
ctx,
title,
address,
"To:",
description,
"confirm_output",
br_code,
verb="NEXT",

@ -637,7 +637,7 @@
"TT_bitcoin-test_bcash.py::test_send_bch_change": "b1802a922a2b5ffbac250bc7c423d7d48540b70e1a5f74612ca593622e3e5cc9",
"TT_bitcoin-test_bcash.py::test_send_bch_external_presigned": "a4b87d5442725d6c1eb35cecc7e1f2be4ef375f932c59b5058e6453f751ed6d3",
"TT_bitcoin-test_bcash.py::test_send_bch_multisig_change": "a0d7243edbcd1db926e6b7ee02c228bdfb9ce05022b0c2259701a681b9d8888b",
"TT_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "61f24798e3775f2c8a191dab85b908b6f86b4a81711566d972761c6ae7faca12",
"TT_bitcoin-test_bcash.py::test_send_bch_multisig_wrongchange": "0975a8c60dd262621b2b85d5254a1a742fd91944b627ef1d2f6fcea6933aeb4d",
"TT_bitcoin-test_bcash.py::test_send_bch_nochange": "fb3f7d0d98820c8dcdac7eeda8b5f2cd542d56f3c670a72384c3cd193138ac51",
"TT_bitcoin-test_bcash.py::test_send_bch_oldaddr": "e7e68de16656f2e2a6112906fdaf0469c2b325a7a3909db9b212bbcb6e9df9e3",
"TT_bitcoin-test_bgold.py::test_attack_change_input": "8f08d33ab6db08efe4bd72ad56d2d1e9e87e6f1c0af6805d9001673ae1d66281",
@ -793,7 +793,7 @@
"TT_bitcoin-test_komodo.py::test_one_one_rewards_claim": "9b9e4d4333063943c51f46400c724c93296fe48712a9e77328349f82e50aecb8",
"TT_bitcoin-test_multisig.py::test_15_of_15": "51c922c38255587612c051e9006f46695d02f195c6de6a90f746a9e8bb705f18",
"TT_bitcoin-test_multisig.py::test_2_of_3": "0d04418a561386fcb0429b1de23ccd97c07d70685bcf3a34de9f1e27d1b44ced",
"TT_bitcoin-test_multisig.py::test_attack_change_input": "99abb73457ab5fe2cf4ca404a112c3198ed8c480d27c1da960ed042865c18c55",
"TT_bitcoin-test_multisig.py::test_attack_change_input": "5bdc543f0d8bb1c797b5f15c31527fa2407d35db47fdf8bb6a9eb9e778ebccfc",
"TT_bitcoin-test_multisig.py::test_missing_pubkey": "3d8ccb95dab0251757887d5fac8bfec1aa81945200a18a6a35f1e12cec3e8ee8",
"TT_bitcoin-test_multisig_change.py::test_external_external": "90e34306af107defc93d856d64193267d22bbd699f4c494ab7c83532af1bbe9e",
"TT_bitcoin-test_multisig_change.py::test_external_internal": "ad3441136556a22c1085c1343633cd131bdf5b3bdeef32202bdf829d1f858c52",
@ -801,8 +801,8 @@
"TT_bitcoin-test_multisig_change.py::test_multisig_change_match_first": "77bd0ea228f512b10c337dec58b34c46a047972f35d639a44127c5211eed7114",
"TT_bitcoin-test_multisig_change.py::test_multisig_change_match_second": "aec71c55ced2a140405903f8aa6dbc377d658196e1c35a4129708924c22d85d0",
"TT_bitcoin-test_multisig_change.py::test_multisig_external_external": "ffc6a5589435c8d6595edc3c01fdbb5f218cfcfa9e4f484461c8c6f2e6ccd0b8",
"TT_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "7245d0b27f18b8203381d44db18cc5d76eb1748da3f360f00b41a172556b89a5",
"TT_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "356674ab3134260d92a826005fc315e715cb47354cc4acbb28f74ed02ff3986d",
"TT_bitcoin-test_multisig_change.py::test_multisig_mismatch_change": "75df91dd76fdaf07bfe2aba288738adb5ae2697dcf249e0354e73be5012ea51b",
"TT_bitcoin-test_multisig_change.py::test_multisig_mismatch_inputs": "98d806e1ffc9c4ee4b828149931af2dd0b6281c6ae948dc7828270374086b157",
"TT_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-6-255-script_types3]": "5be6298cfb37a3127508cc32de570bdf5e82bde27664984126f9500cca675b91",
"TT_bitcoin-test_nonstandard_paths.py::test_getaddress[m-1195487518-script_types2]": "aa28c2664f48256b05816ab8aead59c0c2bec721433ac6cec3c35273d12f8bf3",
"TT_bitcoin-test_nonstandard_paths.py::test_getaddress[m-3h-100h-4-255-script_types1]": "d4bfaa37ab70ade3537ffe8193507f6184aae3ce7d67a710ab9cdc4a262e2b4d",
@ -986,13 +986,13 @@
"TT_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89800-02483045022100af3a87-80428fad": "9a8ffbdea9bafd49a136e75c32138146e118844ec842171f8d80a55bb903c5f6",
"TT_bitcoin-test_signtx_replacement.py::test_p2wpkh_payjoin[19909859-89859-02483045022100eb74ab-881c7bef": "ce5b348aa1d7fd99eb77ba5dcab2b76fd4606dcc05ff148e0d60c98ee04c7553",
"TT_bitcoin-test_signtx_replacement.py::test_tx_meld": "623f8c79e475501efa5d7729098185ff341e97d93b72c708fe8026b616ea8d4f",
"TT_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "cbf526eaf3a46eff9fc9bf6d4993da0cbcec6ef2451be84e830ed1b86c1a2f1d",
"TT_bitcoin-test_signtx_segwit.py::test_attack_change_input_address": "3cff8551335e60e555fdca5576fa868df30de809a48ec5a29413c98aa2e649db",
"TT_bitcoin-test_signtx_segwit.py::test_attack_mixed_inputs": "3b04c71f4bdc0fc3683e9237392837c31039e87ba87b53c9f6bf882b62cb1f83",
"TT_bitcoin-test_signtx_segwit.py::test_send_multisig_1": "1cf62512c5c12c4626ac58d845384f6eec9eba42bcc2c3e06cee33356b9d5810",
"TT_bitcoin-test_signtx_segwit.py::test_send_p2sh": "7e483c1aa764b27f50352ccd372c575947490332500292083b31e73df94cfa44",
"TT_bitcoin-test_signtx_segwit.py::test_send_p2sh_change": "44b732603bcc55e4ec7f044279c85ed3bfc7e96363dd89ab45d217e12fac12c8",
"TT_bitcoin-test_signtx_segwit.py::test_testnet_segwit_big_amount": "67094748ccd6147e38e41b88a3de4704da999e3bd08c05ca333f77e2d7d3b6b8",
"TT_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "63e68914640ba57119146cef4b2bbd73f5db22937574745503aa18398eb27732",
"TT_bitcoin-test_signtx_segwit_native.py::test_multisig_mismatch_inputs_single": "9d9c76ba6fb6600521b91daf2c07f7b8a71d3f440cf32a093c2062a1432f681a",
"TT_bitcoin-test_signtx_segwit_native.py::test_send_both": "fd5f9b47992b0f9c5a60178c4f8b572ee685e8ed18fc9127bb24eb7cecdfbf3a",
"TT_bitcoin-test_signtx_segwit_native.py::test_send_multisig_1": "3d877372d66e968d5cd797b84017cea3916392bdf3cf9a2b6f5e8bec9da20553",
"TT_bitcoin-test_signtx_segwit_native.py::test_send_multisig_2": "82d4087218e7aaef385447e5e3a2156561be1eb85cf49c6fab53dbc13b1b580e",

Loading…
Cancel
Save