From 7e10e255145b3fc72fdd065087d6fc31376ca9c1 Mon Sep 17 00:00:00 2001 From: matejcik Date: Sun, 27 Apr 2025 13:45:41 +0200 Subject: [PATCH] fix(core/solana): improve token info display --- core/embed/rust/librust_qstr.h | 2 +- .../generated/translated_string.rs | 6 +-- core/mocks/trezortranslate_keys.pyi | 2 +- core/src/apps/solana/definitions.py | 15 +++++- core/src/apps/solana/format.py | 7 +-- core/src/apps/solana/layout.py | 54 ++++++++----------- .../src/apps/solana/predefined_transaction.py | 12 +---- core/src/apps/solana/sign_tx.py | 5 +- core/src/trezor/ui/layouts/bolt/__init__.py | 2 +- core/src/trezor/ui/layouts/caesar/__init__.py | 2 +- .../src/trezor/ui/layouts/delizia/__init__.py | 2 +- core/tools/translations/rules.json | 2 +- core/translations/cs.json | 2 +- core/translations/de.json | 2 +- core/translations/en.json | 2 +- core/translations/es.json | 2 +- core/translations/fr.json | 2 +- core/translations/it.json | 2 +- core/translations/order.json | 2 +- core/translations/pt.json | 2 +- core/translations/signatures.json | 6 +-- core/translations/tr.json | 2 +- 22 files changed, 60 insertions(+), 75 deletions(-) diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index 62373585a8..59bb4f2796 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -1155,7 +1155,7 @@ static void _librust_qstrs(void) { MP_QSTR_solana__stake_question; MP_QSTR_solana__stake_withdrawal_warning; MP_QSTR_solana__stake_withdrawal_warning_title; - MP_QSTR_solana__token_address; + MP_QSTR_solana__title_token; MP_QSTR_solana__transaction_contains_unknown_instructions; MP_QSTR_solana__transaction_fee; MP_QSTR_solana__transaction_requires_x_signers_template; diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs index 4bef93f097..1d83b5cfba 100644 --- a/core/embed/rust/src/translations/generated/translated_string.rs +++ b/core/embed/rust/src/translations/generated/translated_string.rs @@ -967,7 +967,7 @@ pub enum TranslatedString { #[cfg(feature = "universal_fw")] solana__multiple_signers = 672, // "Multiple signers" #[cfg(feature = "universal_fw")] - solana__token_address = 673, // "Token address" + solana__title_token = 673, // "Token" #[cfg(feature = "universal_fw")] solana__transaction_contains_unknown_instructions = 674, // "Transaction contains unknown instructions." #[cfg(feature = "universal_fw")] @@ -2379,7 +2379,7 @@ impl TranslatedString { #[cfg(feature = "universal_fw")] Self::solana__multiple_signers => "Multiple signers", #[cfg(feature = "universal_fw")] - Self::solana__token_address => "Token address", + Self::solana__title_token => "Token", #[cfg(feature = "universal_fw")] Self::solana__transaction_contains_unknown_instructions => "Transaction contains unknown instructions.", #[cfg(feature = "universal_fw")] @@ -3790,7 +3790,7 @@ impl TranslatedString { #[cfg(feature = "universal_fw")] Qstr::MP_QSTR_solana__multiple_signers => Some(Self::solana__multiple_signers), #[cfg(feature = "universal_fw")] - Qstr::MP_QSTR_solana__token_address => Some(Self::solana__token_address), + Qstr::MP_QSTR_solana__title_token => Some(Self::solana__title_token), #[cfg(feature = "universal_fw")] Qstr::MP_QSTR_solana__transaction_contains_unknown_instructions => Some(Self::solana__transaction_contains_unknown_instructions), #[cfg(feature = "universal_fw")] diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi index 209309da1c..8796db70ad 100644 --- a/core/mocks/trezortranslate_keys.pyi +++ b/core/mocks/trezortranslate_keys.pyi @@ -797,7 +797,7 @@ class TR: solana__stake_question: str = "Stake SOL?" solana__stake_withdrawal_warning: str = "The current wallet isn't the SOL staking withdraw authority." solana__stake_withdrawal_warning_title: str = "Withdraw authority address" - solana__token_address: str = "Token address" + solana__title_token: str = "Token" solana__transaction_contains_unknown_instructions: str = "Transaction contains unknown instructions." solana__transaction_fee: str = "Transaction fee" solana__transaction_requires_x_signers_template: str = "Transaction requires {0} signers which increases the fee." diff --git a/core/src/apps/solana/definitions.py b/core/src/apps/solana/definitions.py index 13bd84657e..d9c6a03e18 100644 --- a/core/src/apps/solana/definitions.py +++ b/core/src/apps/solana/definitions.py @@ -25,5 +25,16 @@ class Definitions: return cls(tokens) - def get_token(self, mint: bytes) -> SolanaTokenInfo | None: - return self._tokens.get(mint) + def has_token(self, mint: bytes) -> bool: + return mint in self._tokens + + def get_token(self, mint: bytes) -> SolanaTokenInfo: + token = self._tokens.get(mint) + if token is not None: + return token + + return SolanaTokenInfo( + mint=mint, + symbol="[UNKN]", + name="Unknown token", + ) diff --git a/core/src/apps/solana/format.py b/core/src/apps/solana/format.py index 208aecf9ff..62b4cf7353 100644 --- a/core/src/apps/solana/format.py +++ b/core/src/apps/solana/format.py @@ -25,12 +25,7 @@ def format_token_amount( ) -> str: formatted = format_amount(value, decimals=decimals) token = definitions.get_token(mint) - if token: - symbol = token.symbol - else: - symbol = "[UNKN]" - - return f"{formatted} {symbol}" + return f"{formatted} {token.symbol}" def format_unix_timestamp(value: int) -> str: diff --git a/core/src/apps/solana/layout.py b/core/src/apps/solana/layout.py index 6ae4850145..f270650d57 100644 --- a/core/src/apps/solana/layout.py +++ b/core/src/apps/solana/layout.py @@ -22,6 +22,8 @@ from .types import AddressType if TYPE_CHECKING: from typing import Sequence + from trezor.messages import SolanaTokenInfo + from .definitions import Definitions from .transaction import Fee from .transaction.instructions import Instruction, SystemProgramTransferInstruction @@ -125,15 +127,18 @@ async def confirm_instruction( account_value = instruction.parsed_accounts[ui_property.account] - if ui_property.default_value_to_hide == "signer" and signer_public_key == account_value[0]: + if ( + ui_property.default_value_to_hide == "signer" + and signer_public_key == account_value[0] + ): continue account_data: list[tuple[str, str]] = [] # account included in the transaction directly if len(account_value) == 2: account_description = f"{base58.encode(account_value[0])}" - token = definitions.get_token(account_value[0]) - if token is not None: + if definitions.has_token(account_value[0]): + token = definitions.get_token(account_value[0]) account_description = f"{token.name}\n{account_description}" elif account_value[0] == signer_public_key: account_description = f"{account_description} ({TR.words__signer})" @@ -284,34 +289,28 @@ async def confirm_unsupported_program_confirm( async def confirm_system_transfer( transfer_instruction: SystemProgramTransferInstruction, fee: Fee, - signer_path: list[int], blockhash: bytes, ) -> None: await confirm_solana_recipient( recipient=base58.encode(transfer_instruction.recipient_account[0]), title=TR.words__recipient, - items=( - (f"{TR.words__account}:", _format_path(signer_path)), - (f"{TR.address_details__derivation_path}:", address_n_to_str(signer_path)), - (f"{TR.words__blockhash}:", base58.encode(blockhash)), - ), ) - await confirm_custom_transaction(transfer_instruction.lamports, 9, "SOL", fee) + await confirm_custom_transaction( + transfer_instruction.lamports, 9, "SOL", fee, blockhash + ) async def confirm_token_transfer( destination_account: bytes, token_account: bytes, - token_mint: bytes, - token_symbol: str, + token: SolanaTokenInfo, amount: int, decimals: int, fee: Fee, - signer_path: list[int], blockhash: bytes, ) -> None: - items = [(TR.words__recipient, base58.encode(destination_account))] + items = [] if token_account != destination_account: items.append( (f"{TR.solana__associated_token_account}:", base58.encode(token_account)) @@ -320,23 +319,21 @@ async def confirm_token_transfer( await confirm_solana_recipient( recipient=base58.encode(destination_account), title=TR.words__recipient, - items=( - (f"{TR.words__account}:", _format_path(signer_path)), - (f"{TR.address_details__derivation_path}:", address_n_to_str(signer_path)), - (f"{TR.words__blockhash}:", base58.encode(blockhash)), - ), + items=items, ) + value = token.name + "\n" + base58.encode(token.mint) + await confirm_value( - title=TR.solana__token_address, - value=base58.encode(token_mint), + title=TR.solana__title_token, + value=value, description="", br_name="confirm_token_address", br_code=ButtonRequestType.ConfirmOutput, verb=TR.buttons__continue, ) - await confirm_custom_transaction(amount, decimals, token_symbol, fee) + await confirm_custom_transaction(amount, decimals, token.symbol, fee, blockhash) def _fee_ui_info( @@ -367,8 +364,10 @@ async def confirm_custom_transaction( decimals: int, unit: str, fee: Fee, + blockhash: bytes, ) -> None: fee_title, fee_str, fee_items = _fee_ui_info(False, fee) + fee_items.append((TR.words__blockhash, base58.encode(blockhash))) await confirm_solana_tx( amount=f"{format_amount(amount, decimals)} {unit}", fee=fee_str, @@ -502,21 +501,12 @@ async def confirm_claim_transaction( async def confirm_transaction( - signer_path: list[int], blockhash: bytes, fee: Fee, has_unsupported_instructions: bool, ) -> None: fee_title, fee_str, fee_items = _fee_ui_info(has_unsupported_instructions, fee) - await confirm_properties( - "confirm_account_blockhash", - TR.words__title_information, - ( - (f"{TR.words__account}:", _format_path(signer_path)), - (f"{TR.address_details__derivation_path}:", address_n_to_str(signer_path)), - (f"{TR.words__blockhash}:", base58.encode(blockhash)), - ), - ) + fee_items.append((TR.words__blockhash, base58.encode(blockhash))) await confirm_solana_tx( amount="", amount_title="", diff --git a/core/src/apps/solana/predefined_transaction.py b/core/src/apps/solana/predefined_transaction.py index ca3b948a62..e52b076b74 100644 --- a/core/src/apps/solana/predefined_transaction.py +++ b/core/src/apps/solana/predefined_transaction.py @@ -154,20 +154,14 @@ async def try_confirm_token_transfer_transaction( ] ) - token_symbol = "[UNKN]" token = additional_info.definitions.get_token(token_mint) - if token is not None: - token_symbol = token.symbol - await confirm_token_transfer( token_account if base_address is None else base_address, token_account, - token_mint, - token_symbol, + token, total_token_amount, transfer_token_instructions[0].decimals, fee, - signer_path, blockhash, ) return True @@ -193,9 +187,7 @@ async def try_confirm_predefined_transaction( if instructions_count == 1: if SystemProgramTransferInstruction.is_type_of(instructions[0]): - await confirm_system_transfer( - instructions[0], fee, signer_path, blockhash - ) + await confirm_system_transfer(instructions[0], fee, blockhash) return True if await try_confirm_staking_transaction( diff --git a/core/src/apps/solana/sign_tx.py b/core/src/apps/solana/sign_tx.py index 2825d1d302..7076a734a8 100644 --- a/core/src/apps/solana/sign_tx.py +++ b/core/src/apps/solana/sign_tx.py @@ -76,10 +76,7 @@ async def sign_tx( address_n, signer_public_key, transaction, additional_tx_info ) await confirm_transaction( - address_n, - transaction.blockhash, - fee, - _has_unsupported_instructions(transaction), + transaction.blockhash, fee, _has_unsupported_instructions(transaction) ) signature = ed25519.sign(node.private_key(), serialized_tx) diff --git a/core/src/trezor/ui/layouts/bolt/__init__.py b/core/src/trezor/ui/layouts/bolt/__init__.py index dd75137d89..a34fd5c0fc 100644 --- a/core/src/trezor/ui/layouts/bolt/__init__.py +++ b/core/src/trezor/ui/layouts/bolt/__init__.py @@ -954,7 +954,7 @@ if not utils.BITCOIN_ONLY: def confirm_solana_recipient( recipient: str, title: str, - items: Iterable[tuple[str, str]], + items: Iterable[tuple[str, str]] = (), br_name: str = "confirm_solana_recipient", br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, ) -> Awaitable[None]: diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py index bb675edc20..3365fb4214 100644 --- a/core/src/trezor/ui/layouts/caesar/__init__.py +++ b/core/src/trezor/ui/layouts/caesar/__init__.py @@ -923,7 +923,7 @@ if not utils.BITCOIN_ONLY: def confirm_solana_recipient( recipient: str, title: str, - items: Iterable[tuple[str, str]], + items: Iterable[tuple[str, str]] = (), br_name: str = "confirm_solana_recipient", br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, ) -> Awaitable[None]: diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py index 5c25a422e4..b41b84581b 100644 --- a/core/src/trezor/ui/layouts/delizia/__init__.py +++ b/core/src/trezor/ui/layouts/delizia/__init__.py @@ -849,7 +849,7 @@ if not utils.BITCOIN_ONLY: def confirm_solana_recipient( recipient: str, title: str, - items: Iterable[tuple[str, str]], + items: Iterable[tuple[str, str]] = (), br_name: str = "confirm_solana_recipient", br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, ) -> Awaitable[None]: diff --git a/core/tools/translations/rules.json b/core/tools/translations/rules.json index a57a724c6d..8ac171aa2d 100644 --- a/core/tools/translations/rules.json +++ b/core/tools/translations/rules.json @@ -672,7 +672,7 @@ "solana__is_provided_via_lookup_table_template": "text,2", "solana__lookup_table_address": "text,1", "solana__multiple_signers": "text,1", - "solana__token_address": "text,1", + "solana__token_mint": "text,1", "solana__transaction_contains_unknown_instructions": "text,2", "solana__transaction_requires_x_signers_template": "text,3", "stellar__account_merge": "text,1", diff --git a/core/translations/cs.json b/core/translations/cs.json index 52855f8757..498a037d1f 100644 --- a/core/translations/cs.json +++ b/core/translations/cs.json @@ -824,7 +824,7 @@ "solana__stake_question": "Stakovat SOL?", "solana__stake_withdrawal_warning": "Tato pěněženka nemůže být použita pro výběr z tohoto stakingu.", "solana__stake_withdrawal_warning_title": "Adresa autority oprávněné k výběru", - "solana__token_address": "Adresa tokenu", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "Transakce obsahuje neznámý pokyn.", "solana__transaction_requires_x_signers_template": "Transakce vyžaduje {0} podepisujících osob, což zvyšuje poplatek.", "solana__unstake": "Zrušit staking", diff --git a/core/translations/de.json b/core/translations/de.json index 64130aa3ab..cc98a83246 100644 --- a/core/translations/de.json +++ b/core/translations/de.json @@ -824,7 +824,7 @@ "solana__stake_question": "SOL Staken?", "solana__stake_withdrawal_warning": "Diese Wallet hat keine SOL-Staking Auszahlungsberechtigung.", "solana__stake_withdrawal_warning_title": "Auszahlungsautoritätsadresse", - "solana__token_address": "Token-Adresse", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "Transaktion enthält unbekannte Anweisungen.", "solana__transaction_requires_x_signers_template": "Transaktion erfordert {0} Unterzeichner. Dadurch steigt die Gebühr.", "solana__unstake": "Entstaken", diff --git a/core/translations/en.json b/core/translations/en.json index c634bea64d..355457e173 100644 --- a/core/translations/en.json +++ b/core/translations/en.json @@ -802,7 +802,7 @@ "solana__stake_question": "Stake SOL?", "solana__stake_withdrawal_warning": "The current wallet isn't the SOL staking withdraw authority.", "solana__stake_withdrawal_warning_title": "Withdraw authority address", - "solana__token_address": "Token address", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "Transaction contains unknown instructions.", "solana__transaction_requires_x_signers_template": "Transaction requires {0} signers which increases the fee.", "solana__unstake": "Unstake", diff --git a/core/translations/es.json b/core/translations/es.json index 62a38c7d9c..05377e35e4 100644 --- a/core/translations/es.json +++ b/core/translations/es.json @@ -829,7 +829,7 @@ "solana__stake_question": "¿Hacer stake de SOL?", "solana__stake_withdrawal_warning": "El monedero actual no podrá retirar de este staking.", "solana__stake_withdrawal_warning_title": "Dirección de la autoridad de retiro", - "solana__token_address": "Dirección de token", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "La transacción contiene instrucciones desconocidas.", "solana__transaction_requires_x_signers_template": "La transacción requiere {0} firmantes, lo que aumenta la comisión.", "solana__unstake": "Retirar stake", diff --git a/core/translations/fr.json b/core/translations/fr.json index 38fcb88db4..5cab3e1fb0 100644 --- a/core/translations/fr.json +++ b/core/translations/fr.json @@ -824,7 +824,7 @@ "solana__stake_question": "Staker de l'SOL ?", "solana__stake_withdrawal_warning": "Ce portefeuille ne pourra pas être utilisé pour retirer de ce staking.", "solana__stake_withdrawal_warning_title": "Adresse de l’autorité de retrait", - "solana__token_address": "Adr. du jeton", + "solana__title_token": "Jeton", "solana__transaction_contains_unknown_instructions": "La transaction contient des instructions inconnues.", "solana__transaction_requires_x_signers_template": "La transaction nécessite {0} signataires, ce qui augmente les frais.", "solana__unstake": "Unstake", diff --git a/core/translations/it.json b/core/translations/it.json index a3658a229d..633d5ea506 100644 --- a/core/translations/it.json +++ b/core/translations/it.json @@ -812,7 +812,7 @@ "solana__is_provided_via_lookup_table_template": "{0} viene fornito tramite una tabella di ricerca.", "solana__lookup_table_address": "Indirizzo tabella di ricerca", "solana__multiple_signers": "Più firmatari", - "solana__token_address": "Indirizzo token", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "La transazione contiene istruzioni sconosciute.", "solana__transaction_requires_x_signers_template": "Poiché la transazione richiede {0} firmatari, la commissione è più elevata.", "stellar__account_merge": "Unione conti", diff --git a/core/translations/order.json b/core/translations/order.json index dc7310dc56..0825c853dc 100644 --- a/core/translations/order.json +++ b/core/translations/order.json @@ -672,7 +672,7 @@ "670": "solana__is_provided_via_lookup_table_template", "671": "solana__lookup_table_address", "672": "solana__multiple_signers", - "673": "solana__token_address", + "673": "solana__title_token", "674": "solana__transaction_contains_unknown_instructions", "675": "solana__transaction_requires_x_signers_template", "676": "stellar__account_merge", diff --git a/core/translations/pt.json b/core/translations/pt.json index 0a261a570b..df0621639f 100644 --- a/core/translations/pt.json +++ b/core/translations/pt.json @@ -823,7 +823,7 @@ "solana__stake_question": "Fazer stake de SOL?", "solana__stake_withdrawal_warning": "A carteira atual não é a autoridade de saque do staking de SOL.", "solana__stake_withdrawal_warning_title": "Endereço da autoridade de saque", - "solana__token_address": "Endereço de token", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "A transação contém instruções desconhecidas.", "solana__transaction_requires_x_signers_template": "A transação exige {0} signatários, o que aumenta a taxa.", "solana__unstake": "Tirar do stake", diff --git a/core/translations/signatures.json b/core/translations/signatures.json index 534d284873..b042ba044b 100644 --- a/core/translations/signatures.json +++ b/core/translations/signatures.json @@ -1,8 +1,8 @@ { "current": { - "merkle_root": "836336e1f6274de86978d69d6a3ad52cb62d65fd38a2b6dd8848bc73dc81f9d0", - "datetime": "2025-04-29T09:28:34.391244", - "commit": "563adefd9727f856711ccf5b134e2ded14f6d2ca" + "merkle_root": "cf835159e227117eb1c2cd8a784c259b523c5b9489e408a4cefa169601437af6", + "datetime": "2025-04-29T09:29:38.532833", + "commit": "af2c36a22ffa4d6326a6161b2ce3037560f5eb7d" }, "history": [ { diff --git a/core/translations/tr.json b/core/translations/tr.json index 3786512d5c..913030efcc 100644 --- a/core/translations/tr.json +++ b/core/translations/tr.json @@ -736,7 +736,7 @@ "solana__is_provided_via_lookup_table_template": "{0}, bir arama tablosu aracılığıyla sağlanır.", "solana__lookup_table_address": "Arama tablosu adresi", "solana__multiple_signers": "Birden fazla imzalayan", - "solana__token_address": "Token adresi", + "solana__title_token": "Token", "solana__transaction_contains_unknown_instructions": "İşlem bilinmeyen talimatlar içeriyor.", "solana__transaction_requires_x_signers_template": "İşlem için {0} imzalayan gerekiyor ve bu da ücreti artırıyor.", "stellar__account_merge": "Hesap Birleştirme",