1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-05-07 09:29:04 +00:00

fix(core/solana): improve token info display

This commit is contained in:
matejcik 2025-04-27 13:45:41 +02:00 committed by matejcik
parent dd5a3365a9
commit 7e10e25514
22 changed files with 60 additions and 75 deletions

View File

@ -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;

View File

@ -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")]

View File

@ -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."

View File

@ -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",
)

View File

@ -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:

View File

@ -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="",

View File

@ -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(

View File

@ -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)

View File

@ -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]:

View File

@ -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]:

View File

@ -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]:

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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 lautorité 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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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": [
{

View File

@ -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",