refactor(core/ui): move altcoin and webauthn layouts to separate file

Also fix types.
pull/1750/head
Martin Milata 3 years ago
parent 31052007ff
commit 2a91052b02

@ -523,7 +523,12 @@ if FROZEN:
if TREZOR_MODEL == 'T':
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/tt/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/constants/tt.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/__init__.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/reset.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/recovery.py'))
if EVERYTHING:
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/altcoin.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/webauthn.py'))
elif TREZOR_MODEL == '1':
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/t1/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/constants/t1.py'))

@ -478,7 +478,12 @@ if FROZEN:
if TREZOR_MODEL == 'T':
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/tt/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/constants/tt.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/__init__.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/reset.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/recovery.py'))
if EVERYTHING:
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/altcoin.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/layouts/tt/webauthn.py'))
elif TREZOR_MODEL == '1':
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/components/t1/*.py'))
SOURCE_PY.extend(Glob(SOURCE_PY_DIR + 'trezor/ui/constants/t1.py'))

@ -156,12 +156,20 @@ trezor.ui.components.tt.confirm
import trezor.ui.components.tt.confirm
trezor.ui.components.tt.info
import trezor.ui.components.tt.info
trezor.ui.components.tt.keyboard_bip39
import trezor.ui.components.tt.keyboard_bip39
trezor.ui.components.tt.keyboard_slip39
import trezor.ui.components.tt.keyboard_slip39
trezor.ui.components.tt.num_input
import trezor.ui.components.tt.num_input
trezor.ui.components.tt.passphrase
import trezor.ui.components.tt.passphrase
trezor.ui.components.tt.pin
import trezor.ui.components.tt.pin
trezor.ui.components.tt.recovery
import trezor.ui.components.tt.recovery
trezor.ui.components.tt.reset
import trezor.ui.components.tt.reset
trezor.ui.components.tt.scroll
import trezor.ui.components.tt.scroll
trezor.ui.components.tt.swipe
@ -186,6 +194,12 @@ trezor.ui.layouts.t1
import trezor.ui.layouts.t1
trezor.ui.layouts.tt
import trezor.ui.layouts.tt
trezor.ui.layouts.tt.altcoin
import trezor.ui.layouts.tt.altcoin
trezor.ui.layouts.tt.recovery
import trezor.ui.layouts.tt.recovery
trezor.ui.layouts.tt.reset
import trezor.ui.layouts.tt.reset
trezor.ui.loader
import trezor.ui.loader
trezor.ui.popup
@ -290,8 +304,6 @@ apps.common.confirm
import apps.common.confirm
apps.common.keychain
import apps.common.keychain
apps.common.layout
import apps.common.layout
apps.common.passphrase
import apps.common.passphrase
apps.common.paths
@ -340,10 +352,6 @@ apps.management.recovery_device
import apps.management.recovery_device
apps.management.recovery_device.homescreen
import apps.management.recovery_device.homescreen
apps.management.recovery_device.keyboard_bip39
import apps.management.recovery_device.keyboard_bip39
apps.management.recovery_device.keyboard_slip39
import apps.management.recovery_device.keyboard_slip39
apps.management.recovery_device.layout
import apps.management.recovery_device.layout
apps.management.recovery_device.recover
@ -400,6 +408,12 @@ if utils.BITCOIN_ONLY:
import trezor.enums.TezosBallotType
trezor.enums.TezosContractType
import trezor.enums.TezosContractType
trezor.ui.components.common.webauthn
import trezor.ui.components.common.webauthn
trezor.ui.components.tt.webauthn
import trezor.ui.components.tt.webauthn
trezor.ui.layouts.tt.webauthn
import trezor.ui.layouts.tt.webauthn
apps.binance
import apps.binance
apps.binance.get_address
@ -686,8 +700,6 @@ if utils.BITCOIN_ONLY:
import apps.webauthn.add_resident_credential
apps.webauthn.common
import apps.webauthn.common
apps.webauthn.confirm
import apps.webauthn.confirm
apps.webauthn.credential
import apps.webauthn.credential
apps.webauthn.fido2

@ -6,7 +6,8 @@ from trezor.messages import (
BinanceTransferMsg,
)
from trezor.strings import format_amount
from trezor.ui.layouts import confirm_properties, confirm_transfer_binance
from trezor.ui.layouts import confirm_properties
from trezor.ui.layouts.tt.altcoin import confirm_transfer_binance
from . import helpers

@ -1,6 +1,7 @@
from micropython import const
from ubinascii import hexlify
from trezor import utils
from trezor.enums import AmountUnit, ButtonRequestType, OutputScriptType
from trezor.strings import format_amount
from trezor.ui import layouts
@ -8,6 +9,10 @@ from trezor.ui import layouts
from .. import addresses
from . import omni
if not utils.BITCOIN_ONLY:
from trezor.ui.layouts.tt import altcoin
if False:
from trezor import wire
from trezor.messages import TxOutput
@ -73,7 +78,7 @@ async def confirm_decred_sstx_submission(
assert output.address is not None
address_short = addresses.address_short(coin, output.address)
await layouts.confirm_decred_sstx_submission(
await altcoin.confirm_decred_sstx_submission(
ctx, address_short, format_coin_amount(output.amount, coin, amount_unit)
)

@ -3,12 +3,8 @@ from ubinascii import hexlify
from trezor import ui
from trezor.enums import ButtonRequestType
from trezor.strings import format_amount
from trezor.ui.layouts import (
confirm_address,
confirm_blob,
confirm_output,
confirm_total_ethereum,
)
from trezor.ui.layouts import confirm_address, confirm_blob, confirm_output
from trezor.ui.layouts.tt.altcoin import confirm_total_ethereum
from . import networks, tokens
from .address import address_from_bytes

@ -1,6 +1,7 @@
from trezor.enums import ButtonRequestType
from trezor.strings import format_amount
from trezor.ui.layouts import confirm_metadata, confirm_total_ripple
from trezor.ui.layouts import confirm_metadata
from trezor.ui.layouts.tt.altcoin import confirm_total_ripple
from . import helpers

@ -5,8 +5,8 @@ from trezor.ui.layouts import (
confirm_address,
confirm_blob,
confirm_metadata,
confirm_timebounds_stellar,
)
from trezor.ui.layouts.tt.altcoin import confirm_timebounds_stellar
from . import consts

@ -1,7 +1,9 @@
import storage.device
from trezor import wire
from trezor.messages import Success, WebAuthnAddResidentCredential
from trezor.ui.layouts import confirm_webauthn, show_error_and_raise
from trezor.ui.components.common.webauthn import ConfirmInfo
from trezor.ui.layouts import show_error_and_raise
from trezor.ui.layouts.tt.webauthn import confirm_webauthn
from .credential import Fido2Credential
from .resident_credentials import store_resident_credential

@ -11,7 +11,8 @@ from trezor.crypto import aes, der, hashlib, hmac, random
from trezor.crypto.curve import nist256p1
from trezor.ui.components.common.confirm import Pageable
from trezor.ui.components.common.webauthn import ConfirmInfo
from trezor.ui.layouts import confirm_webauthn, confirm_webauthn_reset, show_popup
from trezor.ui.layouts import show_popup
from trezor.ui.layouts.tt.webauthn import confirm_webauthn, confirm_webauthn_reset
from apps.base import set_homescreen
from apps.common import cbor

@ -3,7 +3,7 @@ import storage.resident_credentials
from trezor import wire
from trezor.messages import Success, WebAuthnRemoveResidentCredential
from trezor.ui.components.common.webauthn import ConfirmInfo
from trezor.ui.layouts import confirm_webauthn
from trezor.ui.layouts.tt.webauthn import confirm_webauthn
from .credential import Fido2Credential
from .resident_credentials import get_resident_credential

@ -11,10 +11,9 @@ from trezor.utils import chunks, chunks_intersperse
from ...components.common import break_path_to_lines
from ...components.common.confirm import is_confirmed, raise_if_cancelled
from ...components.common.webauthn import ConfirmInfo
from ...components.tt import passphrase, pin
from ...components.tt.button import ButtonCancel, ButtonDefault
from ...components.tt.confirm import Confirm, ConfirmPageable, HoldToConfirm, Pageable
from ...components.tt.confirm import Confirm, HoldToConfirm
from ...components.tt.scroll import (
PAGEBREAK,
Paginated,
@ -22,7 +21,6 @@ from ...components.tt.scroll import (
paginate_text,
)
from ...components.tt.text import LINE_WIDTH_PAGINATED, Span, Text
from ...components.tt.webauthn import ConfirmContent
from ...constants.tt import (
MONO_ADDR_PER_LINE,
MONO_HEX_PER_LINE,
@ -34,15 +32,9 @@ from ...constants.tt import (
from ..common import button_request, interact
if False:
from typing import (
Awaitable,
Iterator,
NoReturn,
Sequence,
Tuple,
)
from typing import Awaitable, Iterator, NoReturn, Sequence
from .common import PropertyType, ExceptionType
from ..common import PropertyType, ExceptionType
__all__ = (
@ -62,23 +54,16 @@ __all__ = (
"show_xpub",
"show_warning",
"confirm_output",
"confirm_decred_sstx_submission",
"confirm_blob",
"confirm_properties",
"confirm_total",
"confirm_total_ethereum",
"confirm_total_ripple",
"confirm_joint_total",
"confirm_metadata",
"confirm_replacement",
"confirm_modify_output",
"confirm_modify_fee",
"confirm_coinjoin",
"confirm_timebounds_stellar",
"confirm_transfer_binance",
"show_popup",
"confirm_webauthn",
"confirm_webauthn_reset",
"draw_simple_text",
"request_passphrase_on_device",
"request_pin_on_device",
@ -237,10 +222,6 @@ def _show_qr(
return Confirm(Container(qr, text), cancel=cancel, cancel_style=ButtonDefault)
def _split_address(address: str) -> Iterator[str]:
return chunks_intersperse(address, MONO_ADDR_PER_LINE)
def _truncate_hex(
hex_data: str,
lines: int = TEXT_MAX_LINES,
@ -522,25 +503,6 @@ async def confirm_output(
await raise_if_cancelled(interact(ctx, content, "confirm_output", br_code))
async def confirm_decred_sstx_submission(
ctx: wire.GenericContext,
address: str,
amount: str,
) -> None:
text = Text("Purchase ticket", ui.ICON_SEND, ui.GREEN, new_lines=False)
text.normal(amount)
text.normal("\nwith voting rights to\n")
text.mono(*_split_address(address))
await raise_if_cancelled(
interact(
ctx,
Confirm(text),
"confirm_decred_sstx_submission",
ButtonRequestType.ConfirmOutput,
)
)
async def confirm_blob(
ctx: wire.GenericContext,
br_type: str,
@ -784,38 +746,6 @@ async def confirm_total(
await raise_if_cancelled(interact(ctx, HoldToConfirm(text), br_type, br_code))
# TODO cleanup @ redesign
async def confirm_total_ethereum(
ctx: wire.GenericContext, total_amount: str, gas_price: str, fee_max: str
) -> None:
text = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN, new_lines=False)
text.bold(total_amount)
text.normal(" ", ui.GREY, "Gas price:", ui.FG)
text.bold(gas_price)
text.normal(" ", ui.GREY, "Maximum fee:", ui.FG)
text.bold(fee_max)
await raise_if_cancelled(
interact(ctx, HoldToConfirm(text), "confirm_total", ButtonRequestType.SignTx)
)
# TODO cleanup @ redesign
async def confirm_total_ripple(
ctx: wire.GenericContext,
address: str,
amount: str,
) -> None:
title = "Confirm sending"
text = Text(title, ui.ICON_SEND, ui.GREEN, new_lines=False)
text.bold("{} XRP\n".format(amount))
text.normal("to\n")
text.mono(*_split_address(address))
await raise_if_cancelled(
interact(ctx, HoldToConfirm(text), "confirm_output", ButtonRequestType.SignTx)
)
async def confirm_joint_total(
ctx: wire.GenericContext, spending_amount: str, total_amount: str
) -> None:
@ -882,7 +812,7 @@ async def confirm_modify_output(
page1 = Text("Modify amount", ui.ICON_SEND, ui.GREEN, new_lines=False)
page1.normal("Address:\n")
page1.br_half()
page1.mono(*_split_address(address))
page1.mono(*chunks_intersperse(address, MONO_ADDR_PER_LINE))
page2 = Text("Modify amount", ui.ICON_SEND, ui.GREEN, new_lines=False)
if sign < 0:
@ -966,7 +896,7 @@ async def confirm_signverify(
text = Text(header, new_lines=False)
text.bold("Confirm address:\n")
text.mono(*_split_address(address))
text.mono(*chunks_intersperse(address, MONO_ADDR_PER_LINE))
await raise_if_cancelled(
interact(ctx, Confirm(text), br_type, ButtonRequestType.Other)
)
@ -985,55 +915,10 @@ async def confirm_signverify(
)
# TODO cleanup @ redesign
async def confirm_timebounds_stellar(
ctx: wire.GenericContext, start: int, end: int
) -> None:
text = Text("Confirm timebounds", ui.ICON_SEND, ui.GREEN)
text.bold("Valid from (UTC):")
if start:
text.normal(str(start))
else:
text.mono("[no restriction]")
text.bold("Valid to (UTC):")
if end:
text.normal(str(end))
else:
text.mono("[no restriction]")
await raise_if_cancelled(
interact(
ctx, Confirm(text), "confirm_timebounds", ButtonRequestType.ConfirmOutput
)
)
# TODO cleanup @ redesign
async def confirm_transfer_binance(
ctx: wire.GenericContext, inputs_outputs: Sequence[Tuple[str, str, str]]
) -> None:
pages: list[ui.Component] = []
for title, amount, address in inputs_outputs:
coin_page = Text(title, ui.ICON_SEND, icon_color=ui.GREEN, new_lines=False)
coin_page.bold(amount)
coin_page.normal("\nto\n")
coin_page.mono(*_split_address(address))
pages.append(coin_page)
pages[-1] = HoldToConfirm(pages[-1])
await raise_if_cancelled(
interact(
ctx, Paginated(pages), "confirm_transfer", ButtonRequestType.ConfirmOutput
)
)
async def show_popup(
title: str,
description: str,
subtitle: Optional[str] = None,
subtitle: str | None = None,
description_param: str = "",
timeout_ms: int = 3000,
) -> None:
@ -1045,31 +930,6 @@ async def show_popup(
await Popup(text, timeout_ms)
async def confirm_webauthn(
ctx: Optional[wire.GenericContext],
info: ConfirmInfo,
pageable: Optional[Pageable] = None,
) -> bool:
if pageable is not None:
confirm: ui.Layout = ConfirmPageable(pageable, ConfirmContent(info))
else:
confirm = Confirm(ConfirmContent(info))
if ctx is None:
return is_confirmed(await confirm)
else:
return is_confirmed(
await interact(ctx, confirm, "confirm_webauthn", ButtonRequestType.Other)
)
async def confirm_webauthn_reset() -> bool:
text = Text("FIDO2 Reset", ui.ICON_CONFIG)
text.normal("Do you really want to")
text.bold("erase all credentials?")
return is_confirmed(await Confirm(text))
def draw_simple_text(title: str, description: str = "") -> None:
text = Text(title, ui.ICON_CONFIG, new_lines=False)
text.normal(description)
@ -1093,7 +953,7 @@ async def request_passphrase_on_device(ctx: wire.GenericContext, max_len: int) -
async def request_pin_on_device(
ctx: wire.GenericContext,
prompt: str,
attempts_remaining: Optional[int],
attempts_remaining: int | None,
allow_cancel: bool,
) -> str:
await button_request(ctx, "pin_device", code=ButtonRequestType.PinEntry)

@ -0,0 +1,105 @@
from trezor import ui, wire
from trezor.enums import ButtonRequestType
from trezor.utils import chunks_intersperse
from ...components.common.confirm import raise_if_cancelled
from ...components.tt.confirm import Confirm, HoldToConfirm
from ...components.tt.scroll import Paginated
from ...components.tt.text import Text
from ...constants.tt import MONO_ADDR_PER_LINE
from ..common import interact
if False:
from typing import Sequence
async def confirm_total_ethereum(
ctx: wire.GenericContext, total_amount: str, gas_price: str, fee_max: str
) -> None:
text = Text("Confirm transaction", ui.ICON_SEND, ui.GREEN, new_lines=False)
text.bold(total_amount)
text.normal(" ", ui.GREY, "Gas price:", ui.FG)
text.bold(gas_price)
text.normal(" ", ui.GREY, "Maximum fee:", ui.FG)
text.bold(fee_max)
await raise_if_cancelled(
interact(ctx, HoldToConfirm(text), "confirm_total", ButtonRequestType.SignTx)
)
async def confirm_total_ripple(
ctx: wire.GenericContext,
address: str,
amount: str,
) -> None:
title = "Confirm sending"
text = Text(title, ui.ICON_SEND, ui.GREEN, new_lines=False)
text.bold("{} XRP\n".format(amount))
text.normal("to\n")
text.mono(*chunks_intersperse(address, MONO_ADDR_PER_LINE))
await raise_if_cancelled(
interact(ctx, HoldToConfirm(text), "confirm_output", ButtonRequestType.SignTx)
)
async def confirm_timebounds_stellar(
ctx: wire.GenericContext, start: int, end: int
) -> None:
text = Text("Confirm timebounds", ui.ICON_SEND, ui.GREEN)
text.bold("Valid from (UTC):")
if start:
text.normal(str(start))
else:
text.mono("[no restriction]")
text.bold("Valid to (UTC):")
if end:
text.normal(str(end))
else:
text.mono("[no restriction]")
await raise_if_cancelled(
interact(
ctx, Confirm(text), "confirm_timebounds", ButtonRequestType.ConfirmOutput
)
)
async def confirm_transfer_binance(
ctx: wire.GenericContext, inputs_outputs: Sequence[tuple[str, str, str]]
) -> None:
pages: list[ui.Component] = []
for title, amount, address in inputs_outputs:
coin_page = Text(title, ui.ICON_SEND, icon_color=ui.GREEN, new_lines=False)
coin_page.bold(amount)
coin_page.normal("\nto\n")
coin_page.mono(*chunks_intersperse(address, MONO_ADDR_PER_LINE))
pages.append(coin_page)
pages[-1] = HoldToConfirm(pages[-1])
await raise_if_cancelled(
interact(
ctx, Paginated(pages), "confirm_transfer", ButtonRequestType.ConfirmOutput
)
)
async def confirm_decred_sstx_submission(
ctx: wire.GenericContext,
address: str,
amount: str,
) -> None:
text = Text("Purchase ticket", ui.ICON_SEND, ui.GREEN, new_lines=False)
text.normal(amount)
text.normal("\nwith voting rights to\n")
text.mono(*chunks_intersperse(address, MONO_ADDR_PER_LINE))
await raise_if_cancelled(
interact(
ctx,
Confirm(text),
"confirm_decred_sstx_submission",
ButtonRequestType.ConfirmOutput,
)
)

@ -0,0 +1,37 @@
from trezor import ui, wire
from trezor.enums import ButtonRequestType
from ...components.common.confirm import is_confirmed
from ...components.common.webauthn import ConfirmInfo
from ...components.tt.confirm import Confirm, ConfirmPageable, Pageable
from ...components.tt.text import Text
from ...components.tt.webauthn import ConfirmContent
from ..common import interact
if False:
from typing import Optional
async def confirm_webauthn(
ctx: Optional[wire.GenericContext],
info: ConfirmInfo,
pageable: Optional[Pageable] = None,
) -> bool:
if pageable is not None:
confirm: ui.Layout = ConfirmPageable(pageable, ConfirmContent(info))
else:
confirm = Confirm(ConfirmContent(info))
if ctx is None:
return is_confirmed(await confirm)
else:
return is_confirmed(
await interact(ctx, confirm, "confirm_webauthn", ButtonRequestType.Other)
)
async def confirm_webauthn_reset() -> bool:
text = Text("FIDO2 Reset", ui.ICON_CONFIG)
text.normal("Do you really want to")
text.bold("erase all credentials?")
return is_confirmed(await Confirm(text))
Loading…
Cancel
Save