1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-15 19:08:07 +00:00

feat(cardano): ask detail lvl only on complex tx

- remove the choise of detail level ("Show simple" vs "Show all") when
signing simple transactions - these are the transactions typically
enabled by TrezorSuite.
This commit is contained in:
obrusvit 2024-09-27 13:08:48 +02:00 committed by Vít Obrusník
parent ab9381cea9
commit e42c433ded
2 changed files with 108 additions and 14 deletions

View File

@ -3,9 +3,9 @@ from typing import TYPE_CHECKING
from trezor import TR
from trezor.wire import ProcessError
from .. import layout
from .. import layout, seed
from ..helpers.paths import SCHEMA_MINT
from .signer import Signer
from .signer import Signer, SuiteTxType
if TYPE_CHECKING:
from trezor import messages
@ -19,6 +19,14 @@ class OrdinarySigner(Signer):
SIGNING_MODE_TITLE = TR.cardano__confirming_transction
def __init__(
self,
msg: messages.CardanoSignTxInit,
keychain: seed.Keychain,
):
super().__init__(msg, keychain)
self.suite_tx_type: SuiteTxType = self._suite_tx_type()
def _validate_tx_init(self) -> None:
msg = self.msg # local_cache_attribute
_assert_tx_init_cond = self._assert_tx_init_cond # local_cache_attribute
@ -29,21 +37,81 @@ class OrdinarySigner(Signer):
_assert_tx_init_cond(msg.total_collateral is None)
_assert_tx_init_cond(msg.reference_inputs_count == 0)
async def _confirm_tx(self, tx_hash: bytes) -> None:
def _suite_tx_type(self) -> SuiteTxType:
msg = self.msg # local_cache_attribute
# NOTE: witness_request_count equals the number of inputs
# NOTE: what about required_signer?
if (
msg.minting_asset_groups_count > 0
or msg.required_signers_count > 0
or msg.has_auxiliary_data
):
# transaction has more advanced features
return SuiteTxType.NOT_SUITE_TX
if (
msg.withdrawals_count > 0
and msg.certificates_count == 0
and msg.outputs_count == 1
):
return SuiteTxType.SIMPLE_STAKE_WITHDRAW
if (
msg.withdrawals_count == 0
and msg.certificates_count > 0
and msg.outputs_count == 1
):
return SuiteTxType.SIMPLE_STAKE_DELEGATE
if (
msg.withdrawals_count == 0
and msg.certificates_count == 0
and msg.outputs_count > 0
):
return SuiteTxType.SIMPLE_SEND
return SuiteTxType.NOT_SUITE_TX
async def _show_tx_init(self) -> None:
# super() omitted intentionally
is_network_id_verifiable = self._is_network_id_verifiable()
await layout.confirm_tx(
msg.fee,
msg.network_id,
msg.protocol_magic,
msg.ttl,
msg.validity_interval_start,
msg.total_collateral,
is_network_id_verifiable,
tx_hash=None,
)
# for OrdinarySigner, we do not show the prompt to choose level of details
if self.suite_tx_type is SuiteTxType.NOT_SUITE_TX:
self.should_show_details = await layout.show_tx_init(
self.SIGNING_MODE_TITLE
)
elif self.suite_tx_type in (
SuiteTxType.SIMPLE_STAKE_WITHDRAW,
SuiteTxType.SIMPLE_STAKE_DELEGATE,
):
self.should_show_details = True
else:
self.should_show_details = False
if not self._is_network_id_verifiable():
await layout.warn_tx_network_unverifiable()
async def _confirm_tx(self, tx_hash: bytes) -> None:
# super() omitted intentionally
msg = self.msg # local_cache_attribute
if self.suite_tx_type is SuiteTxType.SIMPLE_SEND:
await layout.confirm_tx(
self.total_amount,
msg.fee,
msg.network_id,
msg.protocol_magic,
msg.ttl,
msg.validity_interval_start,
)
else:
is_network_id_verifiable = self._is_network_id_verifiable()
await layout.confirm_tx_details(
msg.network_id,
msg.protocol_magic,
msg.ttl,
msg.fee,
msg.validity_interval_start,
msg.total_collateral,
is_network_id_verifiable,
tx_hash=None,
)
def _validate_certificate(self, certificate: messages.CardanoTxCertificate) -> None:
from trezor.enums import CardanoCertificateType

View File

@ -25,6 +25,7 @@ from ..helpers.paths import SCHEMA_STAKING
from ..helpers.utils import derive_public_key
if TYPE_CHECKING:
from enum import IntEnum
from typing import Any, Awaitable, ClassVar
from trezor.enums import CardanoAddressType
@ -35,6 +36,9 @@ if TYPE_CHECKING:
from ..helpers.hash_builder_collection import HashBuilderEmbeddedCBOR
CardanoTxResponseType = CardanoTxItemAck | messages.CardanoTxWitnessResponse
else:
IntEnum = object
_MINTING_POLICY_ID_LENGTH = const(28)
_MAX_ASSET_NAME_LENGTH = const(32)
@ -69,6 +73,22 @@ _POOL_REGISTRATION_CERTIFICATE_ITEMS_COUNT = const(10)
_MAX_CHUNK_SIZE = const(1024)
class SuiteTxType(IntEnum):
"""
The `SuiteTxType` class is an enumeration that serves to categorize transactions initiated by TrezorSuite.
- `SIMPLE_SEND`: Represents a send transaction (possibly to multiple recipients) with no additional features.
- `SIMPLE_STAKE_DELEGATE`: Represents a simple stake delegation transaction with no additional features.
- `SIMPLE_STAKE_WITHDRAW`: Represents a simple stake withdrawal transaction with no additional features.
- `NOT_SUITE_TX`: Represents a transaction that is not a suite transaction.
"""
SIMPLE_SEND = 0
SIMPLE_STAKE_DELEGATE = 1
SIMPLE_STAKE_WITHDRAW = 2
NOT_SUITE_TX = 3
class Signer:
"""
This class encapsulates the entire tx signing process. By default, most tx items are
@ -117,6 +137,7 @@ class Signer:
tx_dict_items_count, ProcessError("Invalid tx signing request")
)
self.suite_tx_type = SuiteTxType.NOT_SUITE_TX
self.should_show_details = False
async def sign(self) -> None:
@ -236,6 +257,7 @@ class Signer:
raise ProcessError("Total collateral is out of range!")
validate_network_info(msg.network_id, msg.protocol_magic)
async def _show_tx_init(self) -> None:
self.should_show_details = await layout.show_tx_init(self.SIGNING_MODE_TITLE)
@ -373,6 +395,10 @@ class Signer:
assert output.address is not None # _validate_output
address = output.address
if self.suite_tx_type == SuiteTxType.SIMPLE_SEND:
output_type = n
else:
output_type = "change" if self._is_change_output(output) else "address"
await layout.confirm_sending(
output.amount,
address,