From 0729da9ccf29dda57eacfee376c3f52599c24e62 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Mon, 21 Apr 2025 14:07:56 +0300 Subject: [PATCH] fix(legacy): use `GWei` when ETH amount is between 1e6 and 1e12 --- legacy/firmware/.changelog.d/4932.fixed | 1 + legacy/firmware/ethereum.c | 36 ++++++++++++++++++------- tests/ui_tests/fixtures.json | 18 ++++++------- 3 files changed, 36 insertions(+), 19 deletions(-) create mode 100644 legacy/firmware/.changelog.d/4932.fixed diff --git a/legacy/firmware/.changelog.d/4932.fixed b/legacy/firmware/.changelog.d/4932.fixed new file mode 100644 index 0000000000..7710c9923e --- /dev/null +++ b/legacy/firmware/.changelog.d/4932.fixed @@ -0,0 +1 @@ +Use `GWei` when formatting large ETH amounts. diff --git a/legacy/firmware/ethereum.c b/legacy/firmware/ethereum.c index 8a82291f8c..ca3a2cd4e7 100644 --- a/legacy/firmware/ethereum.c +++ b/legacy/firmware/ethereum.c @@ -316,17 +316,26 @@ static void send_signature(void) { */ static void ethereumFormatAmount(const bignum256 *amnt, const EthereumTokenInfo *token, char *buf, - int buflen) { + int buflen, bool use_gwei) { bignum256 bn1e9 = {0}; bn_read_uint32(1000000000, &bn1e9); + + bignum256 bn1e3 = {0}; + bn_read_uint32(1000, &bn1e3); + char suffix[50] = {' ', 0}; int decimals = 18; if (token) { strlcpy(suffix + 1, token->symbol, sizeof(suffix) - 1); decimals = token->decimals; } else if (bn_is_less(amnt, &bn1e9)) { - strlcpy(suffix + 1, "Wei", sizeof(suffix) - 1); - decimals = 0; + if (use_gwei && !bn_is_less(amnt, &bn1e3)) { + strlcpy(suffix + 1, "Gwei", sizeof(suffix) - 1); + decimals = 9; + } else { + strlcpy(suffix + 1, "Wei", sizeof(suffix) - 1); + decimals = 0; + } } else { strlcpy(suffix + 1, chain_suffix, sizeof(suffix) - 1); } @@ -351,10 +360,12 @@ static void layoutEthereumConfirmTx(const uint8_t *to, uint32_t to_len, if (bn_is_zero(&val)) { strcpy(amount, _("message")); } else { - ethereumFormatAmount(&val, NULL, amount, sizeof(amount)); + ethereumFormatAmount(&val, NULL, amount, sizeof(amount), + /*use_gwei=*/false); } } else { - ethereumFormatAmount(&val, token, amount, sizeof(amount)); + ethereumFormatAmount(&val, token, amount, sizeof(amount), + /*use_gwei=*/false); } char _to1[] = "to ____________"; @@ -434,14 +445,16 @@ static void layoutEthereumFee(const uint8_t *value, uint32_t value_len, parse_bignum256(gas_limit, gas_limit_len, &gas); bn_multiply(&val, &gas, &secp256k1.prime); - ethereumFormatAmount(&gas, NULL, gas_value, sizeof(gas_value)); + ethereumFormatAmount(&gas, NULL, gas_value, sizeof(gas_value), + /*use_gwei=*/true); parse_bignum256(value, value_len, &val); if (bn_is_zero(&val)) { strcpy(tx_value, is_token ? _("token") : _("message")); } else { - ethereumFormatAmount(&val, NULL, tx_value, sizeof(tx_value)); + ethereumFormatAmount(&val, NULL, tx_value, sizeof(tx_value), + /*use_gwei=*/false); } layoutDialogSwipe(&bmp_icon_question, _("Cancel"), _("Confirm"), NULL, @@ -466,7 +479,8 @@ static void layoutEthereumFeeEIP1559(const char *description, bn_multiply(&multiplier_val, &amount_val, &secp256k1.prime); } - ethereumFormatAmount(&amount_val, NULL, amount_str, sizeof(amount_str)); + ethereumFormatAmount(&amount_val, NULL, amount_str, sizeof(amount_str), + /*use_gwei=*/true); layoutDialogSwipeWrapping(&bmp_icon_question, _("Cancel"), _("Confirm"), _("Confirm fee"), description, amount_str); @@ -647,7 +661,8 @@ static bool layoutEthereumConfirmStakingTx(const struct signing_params *params, return false; } parse_bignum256(params->value_bytes, params->value_size, &value); - ethereumFormatAmount(&value, NULL, value_str, sizeof(value_str)); + ethereumFormatAmount(&value, NULL, value_str, sizeof(value_str), + /*use_gwei=*/false); _line1 = _("Stake"); _line2 = value_str; _line3 = _("on Everstake?"); @@ -665,7 +680,8 @@ static bool layoutEthereumConfirmStakingTx(const struct signing_params *params, return false; } bn_read_be(args_bytes, &value); - ethereumFormatAmount(&value, NULL, value_str, sizeof(value_str)); + ethereumFormatAmount(&value, NULL, value_str, sizeof(value_str), + /*use_gwei=*/false); _line1 = _("Unstake"); _line2 = value_str; _line3 = _("from Everstake?"); diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 19e0e355e7..989ac7223a 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -460,7 +460,7 @@ "T1B1_en_ethereum-test_sign_verify_message.py::test_verify[parameters6-result6]": "0f79aea15b09e207f7e2bb226421549a0446a4722dde3000c31c3c66ec2059d1", "T1B1_en_ethereum-test_sign_verify_message.py::test_verify[parameters7-result7]": "22daa96dbdd3aeeec11f1134baa29c0ccecbadf032a47aaa355f30c994897907", "T1B1_en_ethereum-test_sign_verify_message.py::test_verify_invalid": "cdec0f79f2abbd90f4346494037f7bb4dd4dccc7c6739b497873d0c5603f2a26", -"T1B1_en_ethereum-test_signtx.py::test_data_streaming": "058a66e82bb733d5c5c687b5537887022acfd7401bb0b5aa4a12f6f35b209239", +"T1B1_en_ethereum-test_signtx.py::test_data_streaming": "a032d9c42732e48799ad9d5bf6c779ef7fef6c5e39d485be346d12b37309c739", "T1B1_en_ethereum-test_signtx.py::test_sanity_checks": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_ethereum-test_signtx.py::test_sanity_checks_eip1559": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-Auxilium]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", @@ -473,14 +473,14 @@ "T1B1_en_ethereum-test_signtx.py::test_signtx[False-Unknown_chain_id_eth_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-Unknown_chain_id_testnet_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-data_1]": "8b432aba21bc4344814cceaf693e114b9d3e3d6ceb83c3a6af7c3ed0f9b37449", -"T1B1_en_ethereum-test_signtx.py::test_signtx[False-data_2_bigdata]": "445286b7501ca67dd16dafd7ea09c57cc4a37a642ae50f0c812d74353c37c017", +"T1B1_en_ethereum-test_signtx.py::test_signtx[False-data_2_bigdata]": "76231787087e489d5670a9d833c1004276c1d897470cb062adf364bac9ff11a3", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-erc20_token]": "d797c970429f1e974a69b9f5bd814a4f13f15b1b5d6ab1c117e65b919a434cf9", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-max_chain_id]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-max_chain_plus_one]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-max_uint64]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b", -"T1B1_en_ethereum-test_signtx.py::test_signtx[False-newcontract]": "a7efa7f690d1448dc48f642f69688e8b266417901cc014e5930c94c9087b3e08", +"T1B1_en_ethereum-test_signtx.py::test_signtx[False-newcontract]": "bd4ec07cc7dc6b727fa4c9931624171207052130b84ca20e3311601dece8e3b1", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-nodata_1]": "6bd90f2c98122de19159e60fd4dcf9f4b16a600407ac84ea1e447d561ea9decb", -"T1B1_en_ethereum-test_signtx.py::test_signtx[False-nodata_2_bigvalue]": "538f7be885ce6ea3a6dc842ef10797fa45184d7737f6f179c42d36fe92fadd45", +"T1B1_en_ethereum-test_signtx.py::test_signtx[False-nodata_2_bigvalue]": "643e6276f884ceb354126dc99f4a6a44fb14432cefad8f64b3d0f846d4111f69", "T1B1_en_ethereum-test_signtx.py::test_signtx[False-wanchain]": "37aa64fbab44b89757833df6ee78e302c97fe24c4cb74175f1843f635cb2dbec", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-Auxilium]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-ETC]": "05b7842c03625104ae3459a55097bc96e878eca465bf69ea2691407868e5dd4b", @@ -492,25 +492,25 @@ "T1B1_en_ethereum-test_signtx.py::test_signtx[True-Unknown_chain_id_eth_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-Unknown_chain_id_testnet_path]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-data_1]": "8b432aba21bc4344814cceaf693e114b9d3e3d6ceb83c3a6af7c3ed0f9b37449", -"T1B1_en_ethereum-test_signtx.py::test_signtx[True-data_2_bigdata]": "445286b7501ca67dd16dafd7ea09c57cc4a37a642ae50f0c812d74353c37c017", +"T1B1_en_ethereum-test_signtx.py::test_signtx[True-data_2_bigdata]": "76231787087e489d5670a9d833c1004276c1d897470cb062adf364bac9ff11a3", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-erc20_token]": "d797c970429f1e974a69b9f5bd814a4f13f15b1b5d6ab1c117e65b919a434cf9", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-max_chain_id]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-max_chain_plus_one]": "4552f9a68c62613e1ef7df68c1f47f7d4888c4505f0586012b71c07acba1fbcb", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-max_uint64]": "a6e6d63cba839c897e80dc0b7cf5c2263be8ff64a5281a43fca992380cca872b", -"T1B1_en_ethereum-test_signtx.py::test_signtx[True-newcontract]": "a7efa7f690d1448dc48f642f69688e8b266417901cc014e5930c94c9087b3e08", +"T1B1_en_ethereum-test_signtx.py::test_signtx[True-newcontract]": "bd4ec07cc7dc6b727fa4c9931624171207052130b84ca20e3311601dece8e3b1", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-nodata_1]": "6bd90f2c98122de19159e60fd4dcf9f4b16a600407ac84ea1e447d561ea9decb", -"T1B1_en_ethereum-test_signtx.py::test_signtx[True-nodata_2_bigvalue]": "538f7be885ce6ea3a6dc842ef10797fa45184d7737f6f179c42d36fe92fadd45", +"T1B1_en_ethereum-test_signtx.py::test_signtx[True-nodata_2_bigvalue]": "643e6276f884ceb354126dc99f4a6a44fb14432cefad8f64b3d0f846d4111f69", "T1B1_en_ethereum-test_signtx.py::test_signtx[True-wanchain]": "37aa64fbab44b89757833df6ee78e302c97fe24c4cb74175f1843f635cb2dbec", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-Ledger Live legacy path]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-data_1]": "171ffadf61a2520274bedf6a8543127f23a8948c2689e034f996e170289b1822", -"T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-data_2_bigdata]": "28d2a0d397b4e9865ca8286cc1a3669c3a7d34bb31b430662354bf3ec69d1cc5", +"T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-data_2_bigdata]": "b42d6d2b7c135ed0a266308a6084d2643b17979970603d4cb1fd5889427c38a7", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-erc20]": "4b97bba97b14f40c36a793e8a842d5c6fd13c4465b4d3b47b96bab943eb649f3", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-large_chainid]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-long_fees]": "cdeaa7c3e562acc91e061b867ab8d3b2fe9902375505d9d75e9a221e17aa40e8", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[False-nodata]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-Ledger Live legacy path]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-data_1]": "171ffadf61a2520274bedf6a8543127f23a8948c2689e034f996e170289b1822", -"T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-data_2_bigdata]": "28d2a0d397b4e9865ca8286cc1a3669c3a7d34bb31b430662354bf3ec69d1cc5", +"T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-data_2_bigdata]": "b42d6d2b7c135ed0a266308a6084d2643b17979970603d4cb1fd5889427c38a7", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-erc20]": "4b97bba97b14f40c36a793e8a842d5c6fd13c4465b4d3b47b96bab943eb649f3", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-large_chainid]": "5b008a081b4ef9e7b47c9d0c1fc4bb24d729d77841193694232bd2da4a386515", "T1B1_en_ethereum-test_signtx.py::test_signtx_eip1559[True-long_fees]": "cdeaa7c3e562acc91e061b867ab8d3b2fe9902375505d9d75e9a221e17aa40e8",