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:
parent
dd5a3365a9
commit
7e10e25514
@ -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;
|
||||
|
@ -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")]
|
||||
|
@ -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."
|
||||
|
@ -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",
|
||||
)
|
||||
|
@ -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:
|
||||
|
@ -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="",
|
||||
|
@ -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(
|
||||
|
@ -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)
|
||||
|
@ -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]:
|
||||
|
@ -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]:
|
||||
|
@ -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]:
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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",
|
||||
|
@ -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": [
|
||||
{
|
||||
|
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user