chore(core): add `{0} / {1} bytes` to translation strings
What changed, and why it matters
This commit is a routine user-interface cleanup. It adds new translation strings for showing Ethereum transaction data size (for example, "Input data: 12 / 100 bytes") and moves the code that displays streaming data chunks so it can be shared across all Trezor firmware variants. There is no security-relevant change visible in the code.
No security action needed. This is a localization/refactoring commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The change introduces translation keys ethereum__subtitle_input_data_bytes and ethereum__title_input_data_bytes, updates generated Rust translation tables, JSON translation files, and moves the confirm_blob_prefix helper from each layout module (bolt, caesar, delizia, eckhart) into the if not utils.BITCOIN_ONLY block. The helper now uses the new translated strings instead of an f-string built from a caller-supplied title. The caller in apps/ethereum/helpers.py no longer passes the title argument. Behavior is functionally equivalent; only localization and code placement differ.
Changed components
core/src/apps/ethereum/helpers.pycore/src/trezor/ui/layouts/bolt/__init__.pycore/src/trezor/ui/layouts/caesar/__init__.pycore/src/trezor/ui/layouts/delizia/__init__.pycore/src/trezor/ui/layouts/eckhart/__init__.pycore/translations/*.jsoncore/embed/rust/src/translations/generated/translated_string.rscore/embed/rust/librust_qstr.hcore/mocks/trezortranslate_keys.pyiInspect captured patch +246 / −132
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index 5cb45b3d..9b4c0832 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -1269,6 +1269,7 @@ static void _librust_qstrs(void) {
MP_QSTR_ethereum__staking_stake_intro;
MP_QSTR_ethereum__staking_unstake;
MP_QSTR_ethereum__staking_unstake_intro;
+ MP_QSTR_ethereum__subtitle_input_data_bytes;
MP_QSTR_ethereum__title_all_input_data_template;
MP_QSTR_ethereum__title_confirm_domain;
MP_QSTR_ethereum__title_confirm_message;
@@ -1276,6 +1277,7 @@ static void _librust_qstrs(void) {
MP_QSTR_ethereum__title_confirm_struct;
MP_QSTR_ethereum__title_confirm_typed_data;
MP_QSTR_ethereum__title_input_data;
+ MP_QSTR_ethereum__title_input_data_bytes;
MP_QSTR_ethereum__title_signing_address;
MP_QSTR_ethereum__title_token_contract;
MP_QSTR_ethereum__token_contract;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index b990055b..97fbc727 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1609,6 +1609,10 @@ pub enum TranslatedString {
ethereum__withdraw_amount = 1215, // "Withdraw amount"
#[cfg(feature = "universal_fw")]
ethereum__withdraw_to = 1216, // "Withdraw to"
+ #[cfg(feature = "universal_fw")]
+ ethereum__subtitle_input_data_bytes = 1217, // {"Bolt": "", "Caesar": "", "Delizia": "{0} / {1} bytes", "Eckhart": ""}
+ #[cfg(feature = "universal_fw")]
+ ethereum__title_input_data_bytes = 1218, // {"Bolt": "Input data:\n{0} / {1} bytes", "Caesar": "Input data: {0} / {1} bytes", "Delizia": "Input data", "Eckhart": "Input data:\n{0} / {1} bytes"}
}
impl TranslatedString {
@@ -2833,6 +2837,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -4055,6 +4061,8 @@ impl TranslatedString {
20204,
20219,
20230,
+ 20230,
+ 20257,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5276,6 +5284,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -6498,6 +6508,8 @@ impl TranslatedString {
20204,
20219,
20230,
+ 20230,
+ 20257,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7719,6 +7731,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -8941,6 +8955,8 @@ impl TranslatedString {
20204,
20219,
20230,
+ 20230,
+ 20257,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -10162,6 +10178,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -11384,6 +11402,8 @@ impl TranslatedString {
20204,
20219,
20230,
+ 20230,
+ 20257,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12606,6 +12626,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data: {0} / {1} bytes",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -13828,6 +13850,8 @@ impl TranslatedString {
18229,
18244,
18255,
+ 18255,
+ 18282,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15049,6 +15073,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data: {0} / {1} bytes",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -16271,6 +16297,8 @@ impl TranslatedString {
18229,
18244,
18255,
+ 18255,
+ 18282,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17492,6 +17520,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data: {0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -18714,6 +18744,8 @@ impl TranslatedString {
18229,
18244,
18255,
+ 18255,
+ 18282,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -19935,6 +19967,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data: {0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -21157,6 +21191,8 @@ impl TranslatedString {
18229,
18244,
18255,
+ 18255,
+ 18282,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -22379,6 +22415,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "{0} / {1} bytes",
+ "Input data",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -23601,6 +23639,8 @@ impl TranslatedString {
19509,
19524,
19535,
+ 19550,
+ 19560,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -24822,6 +24862,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "{0} / {1} bytes",
+ "Input data",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -26044,6 +26086,8 @@ impl TranslatedString {
19509,
19524,
19535,
+ 19550,
+ 19560,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27265,6 +27309,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "{0} / {1} bytes",
+ "Input data",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -28487,6 +28533,8 @@ impl TranslatedString {
19509,
19524,
19535,
+ 19550,
+ 19560,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -29708,6 +29756,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "{0} / {1} bytes",
+ "Input data",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -30930,6 +30980,8 @@ impl TranslatedString {
19509,
19524,
19535,
+ 19550,
+ 19560,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -32152,6 +32204,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(feature = "debug", feature = "universal_fw"))]
@@ -33374,6 +33428,8 @@ impl TranslatedString {
20533,
20548,
20559,
+ 20559,
+ 20586,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -34595,6 +34651,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -35817,6 +35875,8 @@ impl TranslatedString {
20533,
20548,
20559,
+ 20559,
+ 20586,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37038,6 +37098,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -38260,6 +38322,8 @@ impl TranslatedString {
20533,
20548,
20559,
+ 20559,
+ 20586,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -39481,6 +39545,8 @@ impl TranslatedString {
"Redeem to",
"Withdraw amount",
"Withdraw to",
+ "",
+ "Input data:\n{0} / {1} bytes",
);
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -40703,6 +40769,8 @@ impl TranslatedString {
20533,
20548,
20559,
+ 20559,
+ 20586,
];
}
@@ -41282,6 +41350,8 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__staking_unstake_intro, Self::ethereum__staking_unstake_intro),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_ethereum__subtitle_input_data_bytes, Self::ethereum__subtitle_input_data_bytes),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__title_all_input_data_template, Self::ethereum__title_all_input_data_template),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__title_confirm_domain, Self::ethereum__title_confirm_domain),
@@ -41296,6 +41366,8 @@ impl TranslatedString {
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__title_input_data, Self::ethereum__title_input_data),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_ethereum__title_input_data_bytes, Self::ethereum__title_input_data_bytes),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__title_signing_address, Self::ethereum__title_signing_address),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ethereum__title_token_contract, Self::ethereum__title_token_contract),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index 179224d5..5d148aaa 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -366,6 +366,7 @@ class TR:
ethereum__staking_stake_intro: str = "Stake ETH on Everstake?"
ethereum__staking_unstake: str = "Unstake"
ethereum__staking_unstake_intro: str = "Unstake ETH from Everstake?"
+ ethereum__subtitle_input_data_bytes: str = "{0} / {1} bytes"
ethereum__title_all_input_data_template: str = "All input data ({0} bytes)"
ethereum__title_confirm_domain: str = "Confirm domain"
ethereum__title_confirm_message: str = "Confirm message"
@@ -373,6 +374,7 @@ class TR:
ethereum__title_confirm_struct: str = "Confirm struct"
ethereum__title_confirm_typed_data: str = "Confirm typed data"
ethereum__title_input_data: str = "Input data"
+ ethereum__title_input_data_bytes: str = "Input data:\n{0} / {1} bytes"
ethereum__title_signing_address: str = "Signing address"
ethereum__title_token_contract: str = "Token contract"
ethereum__token_contract: str = "Token contract address"
diff --git a/core/src/apps/ethereum/helpers.py b/core/src/apps/ethereum/helpers.py
index aa32735f..063907ff 100644
--- a/core/src/apps/ethereum/helpers.py
+++ b/core/src/apps/ethereum/helpers.py
@@ -285,7 +285,6 @@ def get_data_confirmer(total_len: int) -> ConfirmDataFn:
while True:
assert 0 <= confirmed_len <= total_len
prefix_len = await confirm_blob_prefix(
- title=TR.ethereum__title_input_data,
data=chunk,
total_len=total_len,
confirmed_len=confirmed_len,
diff --git a/core/src/trezor/ui/layouts/bolt/__init__.py b/core/src/trezor/ui/layouts/bolt/__init__.py
index 25583b95..db093bcd 100644
--- a/core/src/trezor/ui/layouts/bolt/__init__.py
+++ b/core/src/trezor/ui/layouts/bolt/__init__.py
@@ -726,45 +726,6 @@ async def confirm_blob_intro(
return False
-_INFO_DATA_ROWS = const(3)
-_INFO_DATA_WIDTH_BYTES = const(9)
-
-
-async def confirm_blob_prefix(
- title: str,
- data: memoryview,
- *,
- total_len: int,
- confirmed_len: int,
- br_name: str,
- br_code: ButtonRequestType = BR_CODE_OTHER,
-) -> int | None:
- """
- Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
- """
- # 3 rows x 18 hex digits (the maximal width is 19 digits)
- prefix = data[: _INFO_DATA_ROWS * _INFO_DATA_WIDTH_BYTES]
- prefix_parts = (
- prefix[i * _INFO_DATA_WIDTH_BYTES : (i + 1) * _INFO_DATA_WIDTH_BYTES]
- for i in range(_INFO_DATA_ROWS)
- )
- confirmed_len += len(prefix)
-
- button_text = TR.words__show_next if confirmed_len < total_len else None
-
- show_more = await should_show_more(
- title=f"{title}:\n{confirmed_len} / {total_len} bytes",
- items=[(utils.hexlify_if_bytes(part), True) for part in prefix_parts],
- button_text=button_text, # will return True
- confirm=TR.words__confirm_all, # will return False
- br_name=br_name,
- br_code=br_code,
- )
- if show_more:
- return len(prefix)
- return None
-
-
def confirm_blob(
br_name: str,
title: str,
@@ -1064,6 +1025,42 @@ async def confirm_trade(
if not utils.BITCOIN_ONLY:
+ _INFO_DATA_ROWS = const(3)
+ _INFO_DATA_WIDTH_BYTES = const(9)
+
+ async def confirm_blob_prefix(
+ data: memoryview,
+ *,
+ total_len: int,
+ confirmed_len: int,
+ br_name: str,
+ br_code: ButtonRequestType = BR_CODE_OTHER,
+ ) -> int | None:
+ """
+ Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
+ """
+ # 3 rows x 18 hex digits (the maximal width is 19 digits)
+ prefix = data[: _INFO_DATA_ROWS * _INFO_DATA_WIDTH_BYTES]
+ prefix_parts = (
+ prefix[i * _INFO_DATA_WIDTH_BYTES : (i + 1) * _INFO_DATA_WIDTH_BYTES]
+ for i in range(_INFO_DATA_ROWS)
+ )
+ confirmed_len += len(prefix)
+
+ button_text = TR.words__show_next if confirmed_len < total_len else None
+
+ show_more = await should_show_more(
+ title=TR.ethereum__title_input_data_bytes.format(confirmed_len, total_len),
+ items=[(utils.hexlify_if_bytes(part), True) for part in prefix_parts],
+ button_text=button_text, # will return True
+ confirm=TR.words__confirm_all, # will return False
+ br_name=br_name,
+ br_code=br_code,
+ )
+ if show_more:
+ return len(prefix)
+ return None
+
def confirm_ethereum_unknown_contract_warning(
_title: str | None,
) -> Awaitable[None]:
diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py
index 05698c97..6fa430d6 100644
--- a/core/src/trezor/ui/layouts/caesar/__init__.py
+++ b/core/src/trezor/ui/layouts/caesar/__init__.py
@@ -753,36 +753,6 @@ async def confirm_blob_intro(
return False
-async def confirm_blob_prefix(
- title: str,
- data: memoryview,
- *,
- total_len: int,
- confirmed_len: int,
- br_name: str,
- br_code: ButtonRequestType = BR_CODE_OTHER,
-) -> int | None:
- """
- Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
- """
- prefix = data[: 4 * 9] # 4 rows x 18 hex digits
- confirmed_len += len(prefix)
-
- button_text = DOWN_ARROW if confirmed_len < total_len else ""
-
- show_more = await should_show_more(
- title=f"{title}: {confirmed_len} / {total_len} bytes",
- para=[(utils.hexlify_if_bytes(prefix), True)],
- button_text=button_text, # will return True
- confirm=TR.words__confirm_all, # will return False
- br_name=br_name,
- br_code=br_code,
- )
- if show_more:
- return len(prefix)
- return None
-
-
def confirm_blob(
br_name: str,
title: str,
@@ -1101,6 +1071,34 @@ async def confirm_trade(
if not utils.BITCOIN_ONLY:
+ async def confirm_blob_prefix(
+ data: memoryview,
+ *,
+ total_len: int,
+ confirmed_len: int,
+ br_name: str,
+ br_code: ButtonRequestType = BR_CODE_OTHER,
+ ) -> int | None:
+ """
+ Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
+ """
+ prefix = data[: 4 * 9] # 4 rows x 18 hex digits
+ confirmed_len += len(prefix)
+
+ button_text = DOWN_ARROW if confirmed_len < total_len else ""
+
+ show_more = await should_show_more(
+ title=TR.ethereum__title_input_data_bytes.format(confirmed_len, total_len),
+ para=[(utils.hexlify_if_bytes(prefix), True)],
+ button_text=button_text, # will return True
+ confirm=TR.words__confirm_all, # will return False
+ br_name=br_name,
+ br_code=br_code,
+ )
+ if show_more:
+ return len(prefix)
+ return None
+
def confirm_ethereum_unknown_contract_warning(
_title: str | None,
) -> Awaitable[None]:
diff --git a/core/src/trezor/ui/layouts/delizia/__init__.py b/core/src/trezor/ui/layouts/delizia/__init__.py
index 61a9048e..5c2ae092 100644
--- a/core/src/trezor/ui/layouts/delizia/__init__.py
+++ b/core/src/trezor/ui/layouts/delizia/__init__.py
@@ -709,35 +709,6 @@ async def confirm_blob_intro(
return res is CONFIRMED
-async def confirm_blob_prefix(
- title: str,
- data: memoryview,
- *,
- total_len: int,
- confirmed_len: int,
- br_name: str,
- br_code: ButtonRequestType = BR_CODE_OTHER,
-) -> int | None:
- """
- Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
- """
- prefix = data[: 7 * 9] # 7 rows x 18 hex digits
- confirmed_len += len(prefix)
-
- show_more = not await should_show_more(
- title=title,
- subtitle=f"{confirmed_len} / {total_len} bytes",
- para=[(utils.hexlify_if_bytes(prefix), True)],
- confirm="", # will return False
- button_text=TR.words__confirm_all, # will return True
- br_name=br_name,
- br_code=br_code,
- )
- if show_more:
- return len(prefix)
- return None
-
-
def confirm_blob(
br_name: str,
title: str,
@@ -1035,6 +1006,35 @@ async def confirm_trade(
if not utils.BITCOIN_ONLY:
+ async def confirm_blob_prefix(
+ data: memoryview,
+ *,
+ total_len: int,
+ confirmed_len: int,
+ br_name: str,
+ br_code: ButtonRequestType = BR_CODE_OTHER,
+ ) -> int | None:
+ """
+ Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
+ """
+ prefix = data[: 7 * 9] # 7 rows x 18 hex digits
+ confirmed_len += len(prefix)
+
+ show_more = not await should_show_more(
+ title=TR.ethereum__title_input_data_bytes,
+ subtitle=TR.ethereum__subtitle_input_data_bytes.format(
+ confirmed_len, total_len
+ ),
+ para=[(utils.hexlify_if_bytes(prefix), True)],
+ confirm="", # will return False
+ button_text=TR.words__confirm_all, # will return True
+ br_name=br_name,
+ br_code=br_code,
+ )
+ if show_more:
+ return len(prefix)
+ return None
+
def _get_account_info_items(
account: str | None, account_path: str | None, title: str | None = None
) -> list[tuple[str, list[StrPropertyType], str | None]]:
diff --git a/core/src/trezor/ui/layouts/eckhart/__init__.py b/core/src/trezor/ui/layouts/eckhart/__init__.py
index 48f76431..06c51841 100644
--- a/core/src/trezor/ui/layouts/eckhart/__init__.py
+++ b/core/src/trezor/ui/layouts/eckhart/__init__.py
@@ -717,35 +717,6 @@ async def confirm_blob_intro(
return res is CONFIRMED
-async def confirm_blob_prefix(
- title: str,
- data: memoryview,
- *,
- total_len: int,
- confirmed_len: int,
- br_name: str,
- br_code: ButtonRequestType = BR_CODE_OTHER,
-) -> int | None:
- """
- Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
- """
- prefix = data[: 9 * 9] # 9 rows x 18 hex digits
- confirmed_len += len(prefix)
- verb = TR.words__show_next if confirmed_len < total_len else TR.buttons__continue
-
- show_more = not await should_show_more(
- title=f"{title}:\n{confirmed_len} / {total_len} bytes",
- para=[(utils.hexlify_if_bytes(prefix), True)],
- confirm=verb, # will return False
- button_text=TR.words__confirm_all, # will return True
- br_name=br_name,
- br_code=br_code,
- )
- if show_more:
- return len(prefix)
- return None
-
-
def confirm_blob(
br_name: str,
title: str,
@@ -1034,6 +1005,35 @@ def confirm_trade(
if not utils.BITCOIN_ONLY:
+ async def confirm_blob_prefix(
+ data: memoryview,
+ *,
+ total_len: int,
+ confirmed_len: int,
+ br_name: str,
+ br_code: ButtonRequestType = BR_CODE_OTHER,
+ ) -> int | None:
+ """
+ Returns the number of bytes confirmed, or `None` if confirmation should be skipped.
+ """
+ prefix = data[: 9 * 9] # 9 rows x 18 hex digits
+ confirmed_len += len(prefix)
+ verb = (
+ TR.words__show_next if confirmed_len < total_len else TR.buttons__continue
+ )
+
+ show_more = not await should_show_more(
+ title=TR.ethereum__title_input_data_bytes.format(confirmed_len, total_len),
+ para=[(utils.hexlify_if_bytes(prefix), True)],
+ confirm=verb, # will return False
+ button_text=TR.words__confirm_all, # will return True
+ br_name=br_name,
+ br_code=br_code,
+ )
+ if show_more:
+ return len(prefix)
+ return None
+
def _get_account_info_items(
account: str | None, account_path: str | None
) -> list[StrPropertyType]:
diff --git a/core/translations/cs.json b/core/translations/cs.json
index b14e8b5b..8e5f77fa 100644
--- a/core/translations/cs.json
+++ b/core/translations/cs.json
@@ -792,6 +792,12 @@
"Eckhart": "Potvrdit typovaná data"
},
"ethereum__title_input_data": "Vstupní data",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Vstupní data:\n{0} / {1} bytes",
+ "Caesar": "Vstupní data: {0} / {1} bytes",
+ "Delizia": "Vstupní data",
+ "Eckhart": "Vstupní data:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "Podepisování adresy",
"ethereum__token_contract": "Kontrakt tokenu",
"ethereum__units_template": "{0} jednotek",
diff --git a/core/translations/de.json b/core/translations/de.json
index b8b97959..876844cb 100644
--- a/core/translations/de.json
+++ b/core/translations/de.json
@@ -1007,6 +1007,12 @@
"ethereum__title_confirm_struct": "Struktur bestätigen",
"ethereum__title_confirm_typed_data": "Daten bestätigen",
"ethereum__title_input_data": "Eingabe-Daten",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Eingabe-Daten:\n{0} / {1} bytes",
+ "Caesar": "Eingabe-Daten: {0} / {1} bytes",
+ "Delizia": "Eingabe-Daten",
+ "Eckhart": "Eingabe-Daten:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "Signieradresse",
"ethereum__token_contract": "Tokenvertrag",
"ethereum__units_template": "{0} Einheiten",
diff --git a/core/translations/en.json b/core/translations/en.json
index 77396f9a..c3ae28ce 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -793,6 +793,12 @@
"ethereum__staking_stake_intro": "Stake ETH on Everstake?",
"ethereum__staking_unstake": "Unstake",
"ethereum__staking_unstake_intro": "Unstake ETH from Everstake?",
+ "ethereum__subtitle_input_data_bytes": {
+ "Bolt": "",
+ "Caesar": "",
+ "Delizia": "{0} / {1} bytes",
+ "Eckhart": ""
+ },
"ethereum__title_all_input_data_template": "All input data ({0} bytes)",
"ethereum__title_confirm_domain": "Confirm domain",
"ethereum__title_confirm_message": "Confirm message",
@@ -800,6 +806,12 @@
"ethereum__title_confirm_struct": "Confirm struct",
"ethereum__title_confirm_typed_data": "Confirm typed data",
"ethereum__title_input_data": "Input data",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Input data:\n{0} / {1} bytes",
+ "Caesar": "Input data: {0} / {1} bytes",
+ "Delizia": "Input data",
+ "Eckhart": "Input data:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "Signing address",
"ethereum__title_token_contract": {
"Bolt": "Token contract",
diff --git a/core/translations/es.json b/core/translations/es.json
index 16cd165e..4d60d123 100644
--- a/core/translations/es.json
+++ b/core/translations/es.json
@@ -832,6 +832,12 @@
"Eckhart": "Validar datos"
},
"ethereum__title_input_data": "Datos de entrada",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Datos de entrada:\n{0} / {1} bytes",
+ "Caesar": "Datos de entrada: {0} / {1} bytes",
+ "Delizia": "Datos de entrada",
+ "Eckhart": "Datos de entrada:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "Dirección firma",
"ethereum__token_contract": "Contrato de token",
"ethereum__units_template": "{0} unidades",
diff --git a/core/translations/fr.json b/core/translations/fr.json
index 2e7e1ac0..70b1b927 100644
--- a/core/translations/fr.json
+++ b/core/translations/fr.json
@@ -1002,6 +1002,12 @@
"Eckhart": "Conf. données"
},
"ethereum__title_input_data": "Données entrées",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Données entrées:\n{0} / {1} bytes",
+ "Caesar": "Données entrées: {0} / {1} bytes",
+ "Delizia": "Données entrées",
+ "Eckhart": "Données entrées:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "Adresse de signature",
"ethereum__token_contract": {
"Bolt": "Contrat du jeton",
diff --git a/core/translations/order.json b/core/translations/order.json
index 759a12e6..15cb22b5 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1215,5 +1215,7 @@
"1213": "ethereum__vault_claim_to",
"1214": "ethereum__vault_redeem_to",
"1215": "ethereum__withdraw_amount",
- "1216": "ethereum__withdraw_to"
+ "1216": "ethereum__withdraw_to",
+ "1217": "ethereum__subtitle_input_data_bytes",
+ "1218": "ethereum__title_input_data_bytes"
}
diff --git a/core/translations/pt.json b/core/translations/pt.json
index d5a6f854..540c00ad 100644
--- a/core/translations/pt.json
+++ b/core/translations/pt.json
@@ -837,6 +837,12 @@
"Eckhart": "Conf. dados inseridos"
},
"ethereum__title_input_data": "Dados de entrada",
+ "ethereum__title_input_data_bytes": {
+ "Bolt": "Dados de entrada:\n{0} / {1} bytes",
+ "Caesar": "Dados de entrada: {0} / {1} bytes",
+ "Delizia": "Dados de entrada",
+ "Eckhart": "Dados de entrada:\n{0} / {1} bytes"
+ },
"ethereum__title_signing_address": "End. signatário",
"ethereum__token_contract": {
"Bolt": "Contrato de token",
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 054e2849..1b0cf4f3 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "22e2a042ba77ff91644fed78537fdb68b0f79e1fa46a2cee558826842c0d1f38",
- "datetime": "2026-04-22T08:16:45.804272+00:00",
- "commit": "753331d38f33d4347f9d1420a9c2e75ac30d8d42"
+ "merkle_root": "1d163d2ac74751115680109acf7a68b09335989afadb4b928d3515dcf47a90e8",
+ "datetime": "2026-04-24T19:31:12.423649+00:00",
+ "commit": "63cf88122c0d350ebb9546cdb61f90faf126d0c1"
},
"history": [
{
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.