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