1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-05-08 09:58:46 +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_question;
MP_QSTR_solana__stake_withdrawal_warning; MP_QSTR_solana__stake_withdrawal_warning;
MP_QSTR_solana__stake_withdrawal_warning_title; 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_contains_unknown_instructions;
MP_QSTR_solana__transaction_fee; MP_QSTR_solana__transaction_fee;
MP_QSTR_solana__transaction_requires_x_signers_template; MP_QSTR_solana__transaction_requires_x_signers_template;

View File

@ -967,7 +967,7 @@ pub enum TranslatedString {
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
solana__multiple_signers = 672, // "Multiple signers" solana__multiple_signers = 672, // "Multiple signers"
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
solana__token_address = 673, // "Token address" solana__title_token = 673, // "Token"
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
solana__transaction_contains_unknown_instructions = 674, // "Transaction contains unknown instructions." solana__transaction_contains_unknown_instructions = 674, // "Transaction contains unknown instructions."
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
@ -2379,7 +2379,7 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
Self::solana__multiple_signers => "Multiple signers", Self::solana__multiple_signers => "Multiple signers",
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
Self::solana__token_address => "Token address", Self::solana__title_token => "Token",
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
Self::solana__transaction_contains_unknown_instructions => "Transaction contains unknown instructions.", Self::solana__transaction_contains_unknown_instructions => "Transaction contains unknown instructions.",
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
@ -3790,7 +3790,7 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]
Qstr::MP_QSTR_solana__multiple_signers => Some(Self::solana__multiple_signers), Qstr::MP_QSTR_solana__multiple_signers => Some(Self::solana__multiple_signers),
#[cfg(feature = "universal_fw")] #[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")] #[cfg(feature = "universal_fw")]
Qstr::MP_QSTR_solana__transaction_contains_unknown_instructions => Some(Self::solana__transaction_contains_unknown_instructions), Qstr::MP_QSTR_solana__transaction_contains_unknown_instructions => Some(Self::solana__transaction_contains_unknown_instructions),
#[cfg(feature = "universal_fw")] #[cfg(feature = "universal_fw")]

View File

@ -797,7 +797,7 @@ class TR:
solana__stake_question: str = "Stake SOL?" 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: str = "The current wallet isn't the SOL staking withdraw authority."
solana__stake_withdrawal_warning_title: str = "Withdraw authority address" 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_contains_unknown_instructions: str = "Transaction contains unknown instructions."
solana__transaction_fee: str = "Transaction fee" solana__transaction_fee: str = "Transaction fee"
solana__transaction_requires_x_signers_template: str = "Transaction requires {0} signers which increases the 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) return cls(tokens)
def get_token(self, mint: bytes) -> SolanaTokenInfo | None: def has_token(self, mint: bytes) -> bool:
return self._tokens.get(mint) 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: ) -> str:
formatted = format_amount(value, decimals=decimals) formatted = format_amount(value, decimals=decimals)
token = definitions.get_token(mint) token = definitions.get_token(mint)
if token: return f"{formatted} {token.symbol}"
symbol = token.symbol
else:
symbol = "[UNKN]"
return f"{formatted} {symbol}"
def format_unix_timestamp(value: int) -> str: def format_unix_timestamp(value: int) -> str:

View File

@ -22,6 +22,8 @@ from .types import AddressType
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Sequence from typing import Sequence
from trezor.messages import SolanaTokenInfo
from .definitions import Definitions from .definitions import Definitions
from .transaction import Fee from .transaction import Fee
from .transaction.instructions import Instruction, SystemProgramTransferInstruction from .transaction.instructions import Instruction, SystemProgramTransferInstruction
@ -125,15 +127,18 @@ async def confirm_instruction(
account_value = instruction.parsed_accounts[ui_property.account] 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 continue
account_data: list[tuple[str, str]] = [] account_data: list[tuple[str, str]] = []
# account included in the transaction directly # account included in the transaction directly
if len(account_value) == 2: if len(account_value) == 2:
account_description = f"{base58.encode(account_value[0])}" account_description = f"{base58.encode(account_value[0])}"
token = definitions.get_token(account_value[0]) if definitions.has_token(account_value[0]):
if token is not None: token = definitions.get_token(account_value[0])
account_description = f"{token.name}\n{account_description}" account_description = f"{token.name}\n{account_description}"
elif account_value[0] == signer_public_key: elif account_value[0] == signer_public_key:
account_description = f"{account_description} ({TR.words__signer})" account_description = f"{account_description} ({TR.words__signer})"
@ -284,34 +289,28 @@ async def confirm_unsupported_program_confirm(
async def confirm_system_transfer( async def confirm_system_transfer(
transfer_instruction: SystemProgramTransferInstruction, transfer_instruction: SystemProgramTransferInstruction,
fee: Fee, fee: Fee,
signer_path: list[int],
blockhash: bytes, blockhash: bytes,
) -> None: ) -> None:
await confirm_solana_recipient( await confirm_solana_recipient(
recipient=base58.encode(transfer_instruction.recipient_account[0]), recipient=base58.encode(transfer_instruction.recipient_account[0]),
title=TR.words__recipient, 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( async def confirm_token_transfer(
destination_account: bytes, destination_account: bytes,
token_account: bytes, token_account: bytes,
token_mint: bytes, token: SolanaTokenInfo,
token_symbol: str,
amount: int, amount: int,
decimals: int, decimals: int,
fee: Fee, fee: Fee,
signer_path: list[int],
blockhash: bytes, blockhash: bytes,
) -> None: ) -> None:
items = [(TR.words__recipient, base58.encode(destination_account))] items = []
if token_account != destination_account: if token_account != destination_account:
items.append( items.append(
(f"{TR.solana__associated_token_account}:", base58.encode(token_account)) (f"{TR.solana__associated_token_account}:", base58.encode(token_account))
@ -320,23 +319,21 @@ async def confirm_token_transfer(
await confirm_solana_recipient( await confirm_solana_recipient(
recipient=base58.encode(destination_account), recipient=base58.encode(destination_account),
title=TR.words__recipient, title=TR.words__recipient,
items=( items=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)),
),
) )
value = token.name + "\n" + base58.encode(token.mint)
await confirm_value( await confirm_value(
title=TR.solana__token_address, title=TR.solana__title_token,
value=base58.encode(token_mint), value=value,
description="", description="",
br_name="confirm_token_address", br_name="confirm_token_address",
br_code=ButtonRequestType.ConfirmOutput, br_code=ButtonRequestType.ConfirmOutput,
verb=TR.buttons__continue, 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( def _fee_ui_info(
@ -367,8 +364,10 @@ async def confirm_custom_transaction(
decimals: int, decimals: int,
unit: str, unit: str,
fee: Fee, fee: Fee,
blockhash: bytes,
) -> None: ) -> None:
fee_title, fee_str, fee_items = _fee_ui_info(False, fee) fee_title, fee_str, fee_items = _fee_ui_info(False, fee)
fee_items.append((TR.words__blockhash, base58.encode(blockhash)))
await confirm_solana_tx( await confirm_solana_tx(
amount=f"{format_amount(amount, decimals)} {unit}", amount=f"{format_amount(amount, decimals)} {unit}",
fee=fee_str, fee=fee_str,
@ -502,21 +501,12 @@ async def confirm_claim_transaction(
async def confirm_transaction( async def confirm_transaction(
signer_path: list[int],
blockhash: bytes, blockhash: bytes,
fee: Fee, fee: Fee,
has_unsupported_instructions: bool, has_unsupported_instructions: bool,
) -> None: ) -> None:
fee_title, fee_str, fee_items = _fee_ui_info(has_unsupported_instructions, fee) fee_title, fee_str, fee_items = _fee_ui_info(has_unsupported_instructions, fee)
await confirm_properties( fee_items.append((TR.words__blockhash, base58.encode(blockhash)))
"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)),
),
)
await confirm_solana_tx( await confirm_solana_tx(
amount="", amount="",
amount_title="", 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) token = additional_info.definitions.get_token(token_mint)
if token is not None:
token_symbol = token.symbol
await confirm_token_transfer( await confirm_token_transfer(
token_account if base_address is None else base_address, token_account if base_address is None else base_address,
token_account, token_account,
token_mint, token,
token_symbol,
total_token_amount, total_token_amount,
transfer_token_instructions[0].decimals, transfer_token_instructions[0].decimals,
fee, fee,
signer_path,
blockhash, blockhash,
) )
return True return True
@ -193,9 +187,7 @@ async def try_confirm_predefined_transaction(
if instructions_count == 1: if instructions_count == 1:
if SystemProgramTransferInstruction.is_type_of(instructions[0]): if SystemProgramTransferInstruction.is_type_of(instructions[0]):
await confirm_system_transfer( await confirm_system_transfer(instructions[0], fee, blockhash)
instructions[0], fee, signer_path, blockhash
)
return True return True
if await try_confirm_staking_transaction( 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 address_n, signer_public_key, transaction, additional_tx_info
) )
await confirm_transaction( 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) signature = ed25519.sign(node.private_key(), serialized_tx)

View File

@ -954,7 +954,7 @@ if not utils.BITCOIN_ONLY:
def confirm_solana_recipient( def confirm_solana_recipient(
recipient: str, recipient: str,
title: str, title: str,
items: Iterable[tuple[str, str]], items: Iterable[tuple[str, str]] = (),
br_name: str = "confirm_solana_recipient", br_name: str = "confirm_solana_recipient",
br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput,
) -> Awaitable[None]: ) -> Awaitable[None]:

View File

@ -923,7 +923,7 @@ if not utils.BITCOIN_ONLY:
def confirm_solana_recipient( def confirm_solana_recipient(
recipient: str, recipient: str,
title: str, title: str,
items: Iterable[tuple[str, str]], items: Iterable[tuple[str, str]] = (),
br_name: str = "confirm_solana_recipient", br_name: str = "confirm_solana_recipient",
br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput,
) -> Awaitable[None]: ) -> Awaitable[None]:

View File

@ -849,7 +849,7 @@ if not utils.BITCOIN_ONLY:
def confirm_solana_recipient( def confirm_solana_recipient(
recipient: str, recipient: str,
title: str, title: str,
items: Iterable[tuple[str, str]], items: Iterable[tuple[str, str]] = (),
br_name: str = "confirm_solana_recipient", br_name: str = "confirm_solana_recipient",
br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput, br_code: ButtonRequestType = ButtonRequestType.ConfirmOutput,
) -> Awaitable[None]: ) -> Awaitable[None]:

View File

@ -672,7 +672,7 @@
"solana__is_provided_via_lookup_table_template": "text,2", "solana__is_provided_via_lookup_table_template": "text,2",
"solana__lookup_table_address": "text,1", "solana__lookup_table_address": "text,1",
"solana__multiple_signers": "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_contains_unknown_instructions": "text,2",
"solana__transaction_requires_x_signers_template": "text,3", "solana__transaction_requires_x_signers_template": "text,3",
"stellar__account_merge": "text,1", "stellar__account_merge": "text,1",

View File

@ -824,7 +824,7 @@
"solana__stake_question": "Stakovat SOL?", "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": "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__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_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__transaction_requires_x_signers_template": "Transakce vyžaduje {0} podepisujících osob, což zvyšuje poplatek.",
"solana__unstake": "Zrušit staking", "solana__unstake": "Zrušit staking",

View File

@ -824,7 +824,7 @@
"solana__stake_question": "SOL Staken?", "solana__stake_question": "SOL Staken?",
"solana__stake_withdrawal_warning": "Diese Wallet hat keine SOL-Staking Auszahlungsberechtigung.", "solana__stake_withdrawal_warning": "Diese Wallet hat keine SOL-Staking Auszahlungsberechtigung.",
"solana__stake_withdrawal_warning_title": "Auszahlungsautoritätsadresse", "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_contains_unknown_instructions": "Transaktion enthält unbekannte Anweisungen.",
"solana__transaction_requires_x_signers_template": "Transaktion erfordert {0} Unterzeichner. Dadurch steigt die Gebühr.", "solana__transaction_requires_x_signers_template": "Transaktion erfordert {0} Unterzeichner. Dadurch steigt die Gebühr.",
"solana__unstake": "Entstaken", "solana__unstake": "Entstaken",

View File

@ -802,7 +802,7 @@
"solana__stake_question": "Stake SOL?", "solana__stake_question": "Stake SOL?",
"solana__stake_withdrawal_warning": "The current wallet isn't the SOL staking withdraw authority.", "solana__stake_withdrawal_warning": "The current wallet isn't the SOL staking withdraw authority.",
"solana__stake_withdrawal_warning_title": "Withdraw authority address", "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_contains_unknown_instructions": "Transaction contains unknown instructions.",
"solana__transaction_requires_x_signers_template": "Transaction requires {0} signers which increases the fee.", "solana__transaction_requires_x_signers_template": "Transaction requires {0} signers which increases the fee.",
"solana__unstake": "Unstake", "solana__unstake": "Unstake",

View File

@ -829,7 +829,7 @@
"solana__stake_question": "¿Hacer stake de SOL?", "solana__stake_question": "¿Hacer stake de SOL?",
"solana__stake_withdrawal_warning": "El monedero actual no podrá retirar de este staking.", "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__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_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__transaction_requires_x_signers_template": "La transacción requiere {0} firmantes, lo que aumenta la comisión.",
"solana__unstake": "Retirar stake", "solana__unstake": "Retirar stake",

View File

@ -824,7 +824,7 @@
"solana__stake_question": "Staker de l'SOL ?", "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": "Ce portefeuille ne pourra pas être utilisé pour retirer de ce staking.",
"solana__stake_withdrawal_warning_title": "Adresse de lautorité de retrait", "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_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__transaction_requires_x_signers_template": "La transaction nécessite {0} signataires, ce qui augmente les frais.",
"solana__unstake": "Unstake", "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__is_provided_via_lookup_table_template": "{0} viene fornito tramite una tabella di ricerca.",
"solana__lookup_table_address": "Indirizzo tabella di ricerca", "solana__lookup_table_address": "Indirizzo tabella di ricerca",
"solana__multiple_signers": "Più firmatari", "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_contains_unknown_instructions": "La transazione contiene istruzioni sconosciute.",
"solana__transaction_requires_x_signers_template": "Poiché la transazione richiede {0} firmatari, la commissione è più elevata.", "solana__transaction_requires_x_signers_template": "Poiché la transazione richiede {0} firmatari, la commissione è più elevata.",
"stellar__account_merge": "Unione conti", "stellar__account_merge": "Unione conti",

View File

@ -672,7 +672,7 @@
"670": "solana__is_provided_via_lookup_table_template", "670": "solana__is_provided_via_lookup_table_template",
"671": "solana__lookup_table_address", "671": "solana__lookup_table_address",
"672": "solana__multiple_signers", "672": "solana__multiple_signers",
"673": "solana__token_address", "673": "solana__title_token",
"674": "solana__transaction_contains_unknown_instructions", "674": "solana__transaction_contains_unknown_instructions",
"675": "solana__transaction_requires_x_signers_template", "675": "solana__transaction_requires_x_signers_template",
"676": "stellar__account_merge", "676": "stellar__account_merge",

View File

@ -823,7 +823,7 @@
"solana__stake_question": "Fazer stake de SOL?", "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": "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__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_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__transaction_requires_x_signers_template": "A transação exige {0} signatários, o que aumenta a taxa.",
"solana__unstake": "Tirar do stake", "solana__unstake": "Tirar do stake",

View File

@ -1,8 +1,8 @@
{ {
"current": { "current": {
"merkle_root": "836336e1f6274de86978d69d6a3ad52cb62d65fd38a2b6dd8848bc73dc81f9d0", "merkle_root": "cf835159e227117eb1c2cd8a784c259b523c5b9489e408a4cefa169601437af6",
"datetime": "2025-04-29T09:28:34.391244", "datetime": "2025-04-29T09:29:38.532833",
"commit": "563adefd9727f856711ccf5b134e2ded14f6d2ca" "commit": "af2c36a22ffa4d6326a6161b2ce3037560f5eb7d"
}, },
"history": [ "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__is_provided_via_lookup_table_template": "{0}, bir arama tablosu aracılığıyla sağlanır.",
"solana__lookup_table_address": "Arama tablosu adresi", "solana__lookup_table_address": "Arama tablosu adresi",
"solana__multiple_signers": "Birden fazla imzalayan", "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_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.", "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", "stellar__account_merge": "Hesap Birleştirme",