From 54804db96446c2778c225025cb3d7e610234cc3c Mon Sep 17 00:00:00 2001 From: Carlos Medeiros <104493454+chcmedeiros@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:14:23 -0600 Subject: [PATCH] Update deps (#345) * update deps * bump version * update crate --- app/Makefile.version | 2 +- app/rust/Cargo.lock | 557 ++++++++---------- app/rust/Cargo.toml | 7 +- app/rust/src/handlers/eth/personal_msg.rs | 5 +- app/rust/src/parser/constants.rs | 3 + app/rust/src/parser/coreth/export_tx.rs | 7 +- app/rust/src/parser/coreth/import_tx.rs | 8 +- app/rust/src/parser/coreth/inputs.rs | 15 +- app/rust/src/parser/coreth/native.rs | 5 +- app/rust/src/parser/coreth/outputs.rs | 5 +- app/rust/src/parser/inputs.rs | 8 +- .../src/parser/inputs/secp_transfer_input.rs | 12 +- .../src/parser/outputs/nft_mint_output.rs | 4 +- .../src/parser/outputs/nft_transfer_output.rs | 5 +- .../src/parser/outputs/secp_mint_output.rs | 12 +- .../src/parser/outputs/secp_output_owners.rs | 5 +- .../parser/outputs/secp_transfer_output.rs | 5 +- app/rust/src/parser/pvm_output.rs | 5 +- .../parser/transactions/avm/create_asset.rs | 7 +- .../src/parser/transactions/avm/export_tx.rs | 5 +- .../src/parser/transactions/avm/import_tx.rs | 5 +- .../parser/transactions/avm/operation_tx.rs | 5 +- .../parser/transactions/pvm/add_delegator.rs | 5 +- .../transactions/pvm/add_subnet_validator.rs | 5 +- .../parser/transactions/pvm/add_validator.rs | 5 +- .../pvm/banff/add_permissionless_delegator.rs | 5 +- .../pvm/banff/add_permissionless_validator.rs | 5 +- .../pvm/banff/convert_subnet_to_l1.rs | 5 +- .../pvm/banff/disable_l1_validator.rs | 5 +- .../banff/increase_l1_validator_balance.rs | 5 +- .../pvm/banff/register_l1_validator.rs | 11 +- .../pvm/banff/remove_subnet_validator.rs | 5 +- .../pvm/banff/set_l1_validator_weight.rs | 15 +- .../pvm/banff/transform_subnet.rs | 50 +- .../src/parser/transactions/pvm/base_tx.rs | 5 +- .../transactions/pvm/create_chain_tx.rs | 5 +- .../transactions/pvm/create_subnet_tx.rs | 5 +- .../src/parser/transactions/pvm/export_tx.rs | 5 +- .../src/parser/transactions/pvm/import_tx.rs | 5 +- app/rust/src/parser/transactions/transfer.rs | 5 +- app/rust/src/parser/utils.rs | 21 +- app/rust/src/parser/utils/time.rs | 6 +- app/rust/src/parser/validator/weight_type.rs | 8 +- tests_zemu/snapshots/fl-mainmenu/00004.png | Bin 9035 -> 9100 bytes tests_zemu/snapshots/s-mainmenu/00004.png | Bin 425 -> 421 bytes tests_zemu/snapshots/s-mainmenu/00010.png | Bin 425 -> 421 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 367 -> 372 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 367 -> 372 bytes tests_zemu/snapshots/st-mainmenu/00004.png | Bin 10876 -> 10910 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 367 -> 372 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 367 -> 372 bytes 51 files changed, 406 insertions(+), 472 deletions(-) diff --git a/app/Makefile.version b/app/Makefile.version index 8675b5473..76a23bf08 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=1 # Minor APPVERSION_N=1 # Patch -APPVERSION_P=2 +APPVERSION_P=3 diff --git a/app/rust/Cargo.lock b/app/rust/Cargo.lock index d010e5884..7cf08d1f1 100644 --- a/app/rust/Cargo.lock +++ b/app/rust/Cargo.lock @@ -13,21 +13,21 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "avalanche-app" @@ -46,8 +46,8 @@ dependencies = [ "hex", "insta", "itertools", + "itoa 1.0.14", "k256", - "lexical-core", "no-std-compat", "nom", "proptest", @@ -70,7 +70,7 @@ dependencies = [ "quote", "serde", "serde_json", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] @@ -91,7 +91,7 @@ version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags 2.5.0", + "bitflags", "cexpr", "clang-sys", "lazy_static", @@ -104,36 +104,30 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.59", + "syn 2.0.96", "which", ] [[package]] name = "bit-set" -version = "0.5.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "blake2" @@ -250,9 +244,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ "memchr", "serde", @@ -266,9 +260,9 @@ checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -293,9 +287,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -304,13 +298,13 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "windows-sys", ] @@ -331,9 +325,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -349,9 +343,9 @@ dependencies = [ [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -403,17 +397,31 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "curve25519-dalek" -version = "3.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", + "cfg-if", + "cpufeatures", + "curve25519-dalek-derive", + "digest 0.10.7", + "fiat-crypto", + "rustc_version", "subtle", "zeroize", ] +[[package]] +name = "curve25519-dalek-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -478,30 +486,31 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 2.2.0", + "signature", "spki", ] [[package]] name = "ed25519" -version = "1.5.3" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "signature 1.6.4", + "pkcs8", + "signature", ] [[package]] name = "ed25519-dalek" -version = "1.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" dependencies = [ "curve25519-dalek", "ed25519", - "rand 0.7.3", "serde", - "sha2 0.9.9", + "sha2 0.10.8", + "subtle", "zeroize", ] @@ -519,9 +528,9 @@ dependencies = [ [[package]] name = "either" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "elliptic-curve" @@ -545,9 +554,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "enum-ordinalize" @@ -559,34 +568,34 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] name = "enumflags2" -version = "0.7.9" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", ] [[package]] name = "enumflags2_derive" -version = "0.7.9" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] name = "errno" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", "windows-sys", @@ -594,9 +603,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.0.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "ff" @@ -608,6 +617,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "fiat-crypto" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + [[package]] name = "fnv" version = "1.0.7" @@ -626,9 +641,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -641,9 +656,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -651,15 +666,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -668,27 +683,27 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -725,9 +740,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -736,15 +751,15 @@ dependencies = [ [[package]] name = "glob" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "globset" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +checksum = "15f1ce686646e7f1e19bf7d5533fe443a45dbfb990e00629110797578b42fb19" dependencies = [ "aho-corasick", "bstr", @@ -766,9 +781,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hex" @@ -797,23 +812,23 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ "windows-sys", ] [[package]] name = "insta" -version = "1.38.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eab73f58e59ca6526037208f0e98851159ec1633cf17b6cd2e1f2c3fd5d53cc" +checksum = "6513e4067e16e69ed1db5ab56048ed65db32d10ba5fc1217f5393f8f17d8b5a5" dependencies = [ "console", "globset", - "lazy_static", "linked-hash-map", + "once_cell", "similar", "walkdir", ] @@ -835,29 +850,29 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", "elliptic-curve", "once_cell", "sha2 0.10.8", - "signature 2.2.0", + "signature", ] [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lazycell" @@ -865,39 +880,22 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libm", -] - [[package]] name = "libc" -version = "0.2.153" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets", ] -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - [[package]] name = "linked-hash-map" version = "0.5.6" @@ -906,15 +904,15 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -922,15 +920,15 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "04cbf5b083de1c7e0222a7a51dbfdba1cbe1c6ab0b15e29fff3f6c077fd9cd9f" [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "minimal-lexical" @@ -956,11 +954,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -982,19 +979,18 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", - "libm", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -1016,9 +1012,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1026,15 +1022,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -1054,9 +1050,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -1082,18 +1078,21 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "prettyplease" -version = "0.2.19" +version = "0.2.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac2cf0f2e4f42b49f5ffd07dae8d746508ef7526c13940e5f524012ae6c6550" +checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" dependencies = [ "proc-macro2", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] @@ -1131,22 +1130,22 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.80" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "proptest" -version = "1.4.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.5.0", + "bitflags", "lazy_static", "num-traits", "rand 0.8.5", @@ -1166,9 +1165,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.36" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -1232,7 +1231,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.14", + "getrandom 0.2.15", ] [[package]] @@ -1255,18 +1254,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ - "bitflags 1.3.2", + "bitflags", ] [[package]] name = "regex" -version = "1.10.4" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1276,9 +1275,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1287,9 +1286,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rfc6979" @@ -1316,13 +1315,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + [[package]] name = "rustix" -version = "0.38.32" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -1343,9 +1351,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "same-file" @@ -1376,33 +1384,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "semver" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" + [[package]] name = "serde" -version = "1.0.197" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] name = "serde_json" -version = "1.0.115" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" dependencies = [ - "itoa 1.0.11", + "itoa 1.0.14", + "memchr", "ryu", "serde", ] @@ -1430,7 +1445,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.96", ] [[package]] @@ -1463,12 +1478,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - [[package]] name = "signature" version = "2.2.0" @@ -1481,9 +1490,9 @@ dependencies = [ [[package]] name = "similar" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "slab" @@ -1529,9 +1538,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.59" +version = "2.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" dependencies = [ "proc-macro2", "quote", @@ -1540,24 +1549,26 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.2.15", + "once_cell", "rustix", "windows-sys", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", - "itoa 1.0.11", + "itoa 1.0.14", "num-conv", "powerfmt", "serde", @@ -1573,9 +1584,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -1604,21 +1615,21 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "wait-timeout" @@ -1681,11 +1692,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "winapi", + "windows-sys", ] [[package]] @@ -1696,133 +1707,76 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "zemu-sys" @@ -1837,25 +1791,32 @@ dependencies = [ ] [[package]] -name = "zeroize" -version = "1.7.0" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zeroize_derive", + "byteorder", + "zerocopy-derive", ] [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.59", + "syn 2.0.96", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zuit" version = "0.1.0" diff --git a/app/rust/Cargo.toml b/app/rust/Cargo.toml index d9694fd6c..e83de13f7 100644 --- a/app/rust/Cargo.toml +++ b/app/rust/Cargo.toml @@ -48,13 +48,10 @@ avalanche-app-derive = { path = "../../app-derive" } arrayvec = { version = "0.7", default-features = false } arrayref = "0.3.6" nom = { version = "7.1.1", default-features = false } -bytemuck = { version = "1" } -lexical-core = { version = "0.7", features = [ - "libm", -], default-features = false } +bytemuck = { version = "1.15.0" } educe = "0.4.19" byteorder = { version = "1.4.3", default-features = false } - +itoa = { version = "1.0.1", default-features = false } bolos = { path = "../../deps/ledger-rust/bolos" } bolos-common = { path = "../../deps/ledger-rust/bolos-common" } zemu-sys = { path = "../../deps/ledger-rust/zemu" } diff --git a/app/rust/src/handlers/eth/personal_msg.rs b/app/rust/src/handlers/eth/personal_msg.rs index 164c88f1b..244829226 100644 --- a/app/rust/src/handlers/eth/personal_msg.rs +++ b/app/rust/src/handlers/eth/personal_msg.rs @@ -17,7 +17,7 @@ use core::mem::MaybeUninit; use crate::handlers::eth::EthUi; use crate::handlers::resources::{EthAccessors, ETH_UI}; -use crate::parser::u32_to_str; +use crate::parser::{u32_to_str, U32_FORMATTED_SIZE}; use bolos::{ crypto::{bip32::BIP32Path, ecfp256::ECCInfo}, hash::{Hasher, Keccak}, @@ -68,7 +68,6 @@ impl Sign { #[inline(never)] fn digest(buffer: &[u8]) -> Result<[u8; Self::SIGN_HASH_SIZE], Error> { - use lexical_core::Number; let mut hasher = { let mut k = MaybeUninit::uninit(); @@ -77,7 +76,7 @@ impl Sign { //safe: initialized unsafe { k.assume_init() } }; - let mut len_str = [0u8; u32::FORMATTED_SIZE_DECIMAL]; + let mut len_str = [0u8; U32_FORMATTED_SIZE]; let len_str = u32_to_str(buffer.len() as u32, &mut len_str).map_err(|_| Error::ExecutionError)?; diff --git a/app/rust/src/parser/constants.rs b/app/rust/src/parser/constants.rs index 752c739b5..6b75bc5a4 100644 --- a/app/rust/src/parser/constants.rs +++ b/app/rust/src/parser/constants.rs @@ -101,3 +101,6 @@ pub const MSG_MAX_CHUNK_LEN: usize = 100; // types pub type OutputIdx = u64; +pub const U64_FORMATTED_SIZE: usize = 20; +pub const U32_FORMATTED_SIZE: usize = 10; +pub const U8_FORMATTED_SIZE: usize = 3; diff --git a/app/rust/src/parser/coreth/export_tx.rs b/app/rust/src/parser/coreth/export_tx.rs index 401d458e5..7c83ec035 100644 --- a/app/rust/src/parser/coreth/export_tx.rs +++ b/app/rust/src/parser/coreth/export_tx.rs @@ -29,6 +29,7 @@ use crate::{ parser::{ nano_avax_to_fp_str, ChainId, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, TransferableOutput, BLOCKCHAIN_ID_LEN, EVM_EXPORT_TX, MAX_ADDRESS_ENCODED_LEN, + U64_FORMATTED_SIZE, }, }; @@ -145,12 +146,11 @@ impl<'b> ExportTx<'b> { } fn fee_to_fp_str(&self, out_str: &'b mut [u8]) -> Result<&mut [u8], ParserError> { - use lexical_core::Number; let fee = self.fee()?; // the number plus '0.' - if out_str.len() < u64::FORMATTED_SIZE_DECIMAL + 2 { + if out_str.len() < U64_FORMATTED_SIZE + 2 { return Err(ParserError::UnexpectedBufferEnd); } nano_avax_to_fp_str(fee, out_str) @@ -330,7 +330,6 @@ impl<'b> DisplayableItem for ExportTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; if item_n == 0 { // render export title and network info @@ -346,7 +345,7 @@ impl<'b> DisplayableItem for ExportTx<'b> { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee_str = self .fee_to_fp_str(&mut buffer[..]) .map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/coreth/import_tx.rs b/app/rust/src/parser/coreth/import_tx.rs index 25e42268f..ea4c24698 100644 --- a/app/rust/src/parser/coreth/import_tx.rs +++ b/app/rust/src/parser/coreth/import_tx.rs @@ -29,7 +29,7 @@ use crate::{ parser::{ coreth::outputs::EVMOutput, nano_avax_to_fp_str, ChainId, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, TransferableInput, BLOCKCHAIN_ID_LEN, - EVM_IMPORT_TX, + EVM_IMPORT_TX, U64_FORMATTED_SIZE, }, }; @@ -135,12 +135,11 @@ impl<'b> ImportTx<'b> { } fn fee_to_fp_str(&self, out_str: &'b mut [u8]) -> Result<&mut [u8], ParserError> { - use lexical_core::Number; let fee = self.fee()?; // the number plus '0.' - if out_str.len() < u64::FORMATTED_SIZE_DECIMAL + 2 { + if out_str.len() < U64_FORMATTED_SIZE + 2 { return Err(ParserError::UnexpectedBufferEnd); } @@ -270,7 +269,6 @@ impl<'b> DisplayableItem for ImportTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; if item_n == 0 { let title_content = pic_str!(b"ImportTx"); @@ -287,7 +285,7 @@ impl<'b> DisplayableItem for ImportTx<'b> { x if x == (outputs_num_items + 1) => { let title_content = pic_str!(b"Fee"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee_str = self .fee_to_fp_str(&mut buffer[..]) .map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/coreth/inputs.rs b/app/rust/src/parser/coreth/inputs.rs index ccb83114c..790ef24f7 100644 --- a/app/rust/src/parser/coreth/inputs.rs +++ b/app/rust/src/parser/coreth/inputs.rs @@ -103,10 +103,11 @@ impl<'b> DisplayableItem for EVMInput<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::{write as itoa, Number}; + use itoa::Buffer; let expert = is_app_mode_expert(); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut itoa_buffer = Buffer::new(); // Reusable buffer for integer to string conversion + match item_n as usize { 0 => { @@ -119,9 +120,8 @@ impl<'b> DisplayableItem for EVMInput<'b> { 2 => { let title_content = pic_str!(b"Amount"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.amount, &mut buffer); - - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.amount); + handle_ui_message(buffer.as_bytes(), message, page) } 3 if expert => { //does it make sense to render all EVM input addrs @@ -134,9 +134,8 @@ impl<'b> DisplayableItem for EVMInput<'b> { 4 if expert => { let title_content = pic_str!(b"Nonce"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.nonce, &mut buffer); - - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.amount); + handle_ui_message(buffer.as_bytes(), message, page) } _ => Err(ViewError::NoData), } diff --git a/app/rust/src/parser/coreth/native.rs b/app/rust/src/parser/coreth/native.rs index 9d4ad96e5..8c6cb635b 100644 --- a/app/rust/src/parser/coreth/native.rs +++ b/app/rust/src/parser/coreth/native.rs @@ -22,7 +22,7 @@ use crate::{ handlers::{eth::u256, handle_ui_message}, parser::{ intstr_to_fpstr_inplace, DisplayableItem, FromBytes, ParserError, EIP1559_TX, EIP2930_TX, - U64_SIZE, + U64_SIZE, U64_FORMATTED_SIZE, }, }; @@ -132,14 +132,13 @@ pub fn render_chain_id( page: u8, chain_id: &[u8], ) -> Result { - use lexical_core::Number; let title_content = b"Chain ID"; title[..title_content.len()].copy_from_slice(title_content); if chain_id.len() <= core::mem::size_of::() { let chain_id = bytes_to_u64(chain_id).map_err(|_| ViewError::NoData)?; - let mut chain_id_str = [0u8; u64::FORMATTED_SIZE_DECIMAL + 1]; + let mut chain_id_str = [0u8; U64_FORMATTED_SIZE + 1]; crate::parser::u64_to_str(chain_id, &mut chain_id_str).map_err(|_| ViewError::NoData)?; diff --git a/app/rust/src/parser/coreth/outputs.rs b/app/rust/src/parser/coreth/outputs.rs index 64311e918..7dd4f9cc8 100644 --- a/app/rust/src/parser/coreth/outputs.rs +++ b/app/rust/src/parser/coreth/outputs.rs @@ -25,7 +25,7 @@ use crate::{ handlers::handle_ui_message, parser::{ error::ParserError, nano_avax_to_fp_str, Address, AssetId, DisplayableItem, FromBytes, - Output, OutputType, SECPTransferOutput, + Output, OutputType, SECPTransferOutput, U64_FORMATTED_SIZE, }, }; @@ -162,9 +162,8 @@ impl<'b> DisplayableItem for EVMOutput<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n as usize { 0 => { diff --git a/app/rust/src/parser/inputs.rs b/app/rust/src/parser/inputs.rs index 28baa2fee..cf24ecd29 100644 --- a/app/rust/src/parser/inputs.rs +++ b/app/rust/src/parser/inputs.rs @@ -130,9 +130,9 @@ impl<'b> DisplayableItem for TransferableInput<'b> { hash::{Hasher, Sha256}, pic_str, PIC, }; - use lexical_core::{write as itoa, Number}; + use itoa::Buffer; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut itoa_buffer = Buffer::new(); match item_n { 0 => { @@ -147,9 +147,9 @@ impl<'b> DisplayableItem for TransferableInput<'b> { 1 => { let title_content = pic_str!(b"Utxo index"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.utxo_index, &mut buffer); + let buffer = itoa_buffer.format(self.utxo_index); - handle_ui_message(buffer, message, page) + handle_ui_message(buffer.as_bytes(), message, page) } 2 => self.asset_id.render_item(0, title, message, page), diff --git a/app/rust/src/parser/inputs/secp_transfer_input.rs b/app/rust/src/parser/inputs/secp_transfer_input.rs index 7f04b2a4e..1018c5ca5 100644 --- a/app/rust/src/parser/inputs/secp_transfer_input.rs +++ b/app/rust/src/parser/inputs/secp_transfer_input.rs @@ -92,9 +92,9 @@ impl<'a> DisplayableItem for SECPTransferInput<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::{write as itoa, Number}; + use itoa::Buffer; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut itoa_buffer = Buffer::new(); let num_indices = self.address_indices.len(); @@ -108,9 +108,9 @@ impl<'a> DisplayableItem for SECPTransferInput<'a> { 1 => { let title_content = pic_str!(b"Amount"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.amount, &mut buffer); + let buffer = itoa_buffer.format(self.amount); - handle_ui_message(buffer, message, page) + handle_ui_message(buffer.as_bytes(), message, page) } i @ 2.. if i < num_indices + 2 => { // normalize the index into something between 0 and num_indices @@ -121,9 +121,9 @@ impl<'a> DisplayableItem for SECPTransferInput<'a> { let (_, index) = self.parse_index(item_n).map_err(|_| ViewError::Unknown)?; - let buffer = itoa(index, &mut buffer); + let buffer = itoa_buffer.format(index); - handle_ui_message(buffer, message, page) + handle_ui_message(buffer.as_bytes(), message, page) } _ => Err(ViewError::NoData), diff --git a/app/rust/src/parser/outputs/nft_mint_output.rs b/app/rust/src/parser/outputs/nft_mint_output.rs index 007bf7c18..3d0908bab 100644 --- a/app/rust/src/parser/outputs/nft_mint_output.rs +++ b/app/rust/src/parser/outputs/nft_mint_output.rs @@ -26,6 +26,7 @@ use crate::{ handlers::handle_ui_message, parser::{ u32_to_str, u64_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN, + U64_FORMATTED_SIZE, }, }; @@ -113,9 +114,8 @@ impl<'a> DisplayableItem for NFTMintOutput<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let addr_item_n = self.num_items()? - self.addresses.len() as u8; let render_locktime = self.locktime > 0; // Gets the page at which this field is displayed, by summing the boolean diff --git a/app/rust/src/parser/outputs/nft_transfer_output.rs b/app/rust/src/parser/outputs/nft_transfer_output.rs index eac7b6a63..d3b60ed56 100644 --- a/app/rust/src/parser/outputs/nft_transfer_output.rs +++ b/app/rust/src/parser/outputs/nft_transfer_output.rs @@ -24,7 +24,7 @@ use zemu_sys::ViewError; use crate::{ checked_add, handlers::handle_ui_message, - parser::{u32_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN}, + parser::{u32_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN, U32_FORMATTED_SIZE}, utils::hex_encode, }; @@ -130,9 +130,8 @@ impl<'a> DisplayableItem for NFTTransferOutput<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u32::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U32_FORMATTED_SIZE + 2]; match item_n as usize { 0 => { diff --git a/app/rust/src/parser/outputs/secp_mint_output.rs b/app/rust/src/parser/outputs/secp_mint_output.rs index bb4b69c73..bd7f4234f 100644 --- a/app/rust/src/parser/outputs/secp_mint_output.rs +++ b/app/rust/src/parser/outputs/secp_mint_output.rs @@ -107,9 +107,9 @@ impl<'a> DisplayableItem for SECPMintOutput<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::{write as itoa, Number}; + use itoa::Buffer; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut itoa_buffer = Buffer::new(); let addr_item_n = self.num_items()? - self.addresses.len() as u8; match item_n { @@ -123,18 +123,18 @@ impl<'a> DisplayableItem for SECPMintOutput<'a> { 1 if self.locktime > 0 => { let title_content = pic_str!(b"Locktime"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.locktime, &mut buffer); + let buffer = itoa_buffer.format(self.locktime); - handle_ui_message(buffer, message, page) + handle_ui_message(buffer.as_bytes(), message, page) } x @ 1.. if (x == 1 && self.locktime == 0) || (x == 2 && self.locktime > 0) => { let title_content = pic_str!(b"Threshold"); title[..title_content.len()].copy_from_slice(title_content); - let buffer = itoa(self.threshold, &mut buffer); + let buffer = itoa_buffer.format(self.threshold); - handle_ui_message(buffer, message, page) + handle_ui_message(buffer.as_bytes(), message, page) } x @ 2.. if x >= addr_item_n => { diff --git a/app/rust/src/parser/outputs/secp_output_owners.rs b/app/rust/src/parser/outputs/secp_output_owners.rs index 6f4875c23..1a7b664a7 100644 --- a/app/rust/src/parser/outputs/secp_output_owners.rs +++ b/app/rust/src/parser/outputs/secp_output_owners.rs @@ -26,7 +26,7 @@ use crate::{ handlers::handle_ui_message, parser::{ u64_to_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN, - MAX_ADDRESS_ENCODED_LEN, + MAX_ADDRESS_ENCODED_LEN, U64_FORMATTED_SIZE }, }; @@ -126,9 +126,8 @@ impl<'a> DisplayableItem for SECPOutputOwners<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let addr_items = self.addresses.len() as u8; let mut item_index = item_n; diff --git a/app/rust/src/parser/outputs/secp_transfer_output.rs b/app/rust/src/parser/outputs/secp_transfer_output.rs index 8d7a35d51..f8f33cf18 100644 --- a/app/rust/src/parser/outputs/secp_transfer_output.rs +++ b/app/rust/src/parser/outputs/secp_transfer_output.rs @@ -24,7 +24,7 @@ use zemu_sys::ViewError; use crate::{ checked_add, handlers::handle_ui_message, - parser::{nano_avax_to_fp_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN}, + parser::{nano_avax_to_fp_str, Address, DisplayableItem, FromBytes, ParserError, ADDRESS_LEN, U64_FORMATTED_SIZE}, }; const AVAX_TO_LEN: usize = 9; //b" AVAX to " @@ -108,9 +108,8 @@ impl<'a> DisplayableItem for SECPTransferOutput<'a> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2 + AVAX_TO_LEN]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2 + AVAX_TO_LEN]; let addr_item_n = self.num_items()? - self.addresses.len() as u8; match item_n { diff --git a/app/rust/src/parser/pvm_output.rs b/app/rust/src/parser/pvm_output.rs index 4f339a396..762c87613 100644 --- a/app/rust/src/parser/pvm_output.rs +++ b/app/rust/src/parser/pvm_output.rs @@ -18,7 +18,7 @@ use crate::{ parser::{ error::ParserError, nano_avax_to_fp_str, timestamp_to_str_date, Address, DisplayableItem, FromBytes, Output, OutputType, SECPOutputOwners, SECPTransferOutput, - FORMATTED_STR_DATE_LEN, + FORMATTED_STR_DATE_LEN, U64_FORMATTED_SIZE }, }; use core::ops::Deref; @@ -149,7 +149,6 @@ impl<'b> DisplayableItem for PvmOutput<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; let num_inner_items = self.output.num_items()?; match item_n { @@ -173,7 +172,7 @@ impl<'b> DisplayableItem for PvmOutput<'b> { let avax_until = PIC::new(AVAX_UNTIL).into_inner(); let mut content = [0; AVAX_UNTIL.len() + FORMATTED_STR_DATE_LEN - + u64::FORMATTED_SIZE_DECIMAL + + U64_FORMATTED_SIZE + 2]; // write the amount let amount = self.amount().ok_or(ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/avm/create_asset.rs b/app/rust/src/parser/transactions/avm/create_asset.rs index 9df178e77..b13ca2a76 100644 --- a/app/rust/src/parser/transactions/avm/create_asset.rs +++ b/app/rust/src/parser/transactions/avm/create_asset.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ u8_to_str, AvmOutput, BaseTxFields, DisplayableItem, FromBytes, Header, InitialState, - ObjectList, ParserError, AVM_CREATE_ASSET_TX, + ObjectList, ParserError, AVM_CREATE_ASSET_TX, U64_FORMATTED_SIZE, U8_FORMATTED_SIZE }, }; @@ -129,9 +129,8 @@ impl<'b> DisplayableItem for CreateAssetTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n { 0 => { @@ -154,7 +153,7 @@ impl<'b> DisplayableItem for CreateAssetTx<'b> { let label = pic_str!(b"Denomination"); title[..label.len()].copy_from_slice(label); - let mut buffer = [0; u8::FORMATTED_SIZE + 2]; + let mut buffer = [0; U8_FORMATTED_SIZE + 2]; let num = u8_to_str(self.denomination, &mut buffer[..]) .map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/avm/export_tx.rs b/app/rust/src/parser/transactions/avm/export_tx.rs index 0a56802d0..0cc85b53f 100644 --- a/app/rust/src/parser/transactions/avm/export_tx.rs +++ b/app/rust/src/parser/transactions/avm/export_tx.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, AvmOutput, BaseExport, DisplayableItem, FromBytes, ParserError, - AVM_EXPORT_TX, + AVM_EXPORT_TX, U64_FORMATTED_SIZE }, }; @@ -68,7 +68,6 @@ impl<'b> DisplayableItem for AvmExportTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { // render export title and network info @@ -83,7 +82,7 @@ impl<'b> DisplayableItem for AvmExportTx<'b> { x if x == outputs_num_items => { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/avm/import_tx.rs b/app/rust/src/parser/transactions/avm/import_tx.rs index 0a5d36558..6d01395a9 100644 --- a/app/rust/src/parser/transactions/avm/import_tx.rs +++ b/app/rust/src/parser/transactions/avm/import_tx.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, AvmOutput, BaseImport, DisplayableItem, FromBytes, ParserError, - AVM_IMPORT_TX, + AVM_IMPORT_TX, U64_FORMATTED_SIZE }, }; @@ -82,7 +82,6 @@ impl<'b> DisplayableItem for AvmImportTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { let title_content = pic_str!(b"ImportTx"); @@ -100,7 +99,7 @@ impl<'b> DisplayableItem for AvmImportTx<'b> { x if x == (inputs_num_items + 1) => { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/avm/operation_tx.rs b/app/rust/src/parser/transactions/avm/operation_tx.rs index b5173fca4..ae3cea250 100644 --- a/app/rust/src/parser/transactions/avm/operation_tx.rs +++ b/app/rust/src/parser/transactions/avm/operation_tx.rs @@ -17,7 +17,7 @@ use crate::checked_add; use crate::handlers::handle_ui_message; use crate::parser::{ nano_avax_to_fp_str, AvmOutput, BaseTxFields, ChainId, DisplayableItem, FromBytes, Header, - ObjectList, ParserError, TransferableOp, AVM_OPERATION_TX, MAX_ADDRESS_ENCODED_LEN, + ObjectList, ParserError, TransferableOp, AVM_OPERATION_TX, MAX_ADDRESS_ENCODED_LEN, U64_FORMATTED_SIZE }; use core::{mem::MaybeUninit, ptr::addr_of_mut}; use nom::bytes::complete::tag; @@ -211,7 +211,6 @@ impl<'b> DisplayableItem for OperationTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { let title_content = pic_str!(b"Operation"); @@ -235,7 +234,7 @@ impl<'b> DisplayableItem for OperationTx<'b> { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = diff --git a/app/rust/src/parser/transactions/pvm/add_delegator.rs b/app/rust/src/parser/transactions/pvm/add_delegator.rs index e7ec9f75e..ca045891c 100644 --- a/app/rust/src/parser/transactions/pvm/add_delegator.rs +++ b/app/rust/src/parser/transactions/pvm/add_delegator.rs @@ -25,7 +25,7 @@ use crate::{ parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, PvmOutput, SECPOutputOwners, Stake, TransferableOutput, Validator, - MAX_ADDRESS_ENCODED_LEN, PVM_ADD_DELEGATOR, + MAX_ADDRESS_ENCODED_LEN, PVM_ADD_DELEGATOR, U64_FORMATTED_SIZE, }, }; @@ -366,9 +366,8 @@ impl<'b> AddDelegatorTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let num_addresses = self.rewards_owner.addresses.len() as u8; match_ranges! { diff --git a/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs b/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs index 8f432e9b6..d51c8e183 100644 --- a/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs +++ b/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs @@ -21,7 +21,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, SubnetAuth, SubnetId, Validator, Weight, PVM_ADD_SUBNET_VALIDATOR, + PvmOutput, SubnetAuth, SubnetId, Validator, Weight, PVM_ADD_SUBNET_VALIDATOR, U64_FORMATTED_SIZE }, }; @@ -87,7 +87,6 @@ impl<'b> DisplayableItem for AddSubnetValidatorTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { let label = pic_str!(b"SubnetValidator"); @@ -114,7 +113,7 @@ impl<'b> DisplayableItem for AddSubnetValidatorTx<'b> { let fee = self.fee().map_err(|_| ViewError::Unknown)?; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee_buff = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; handle_ui_message(fee_buff, message, page) diff --git a/app/rust/src/parser/transactions/pvm/add_validator.rs b/app/rust/src/parser/transactions/pvm/add_validator.rs index 3409163b5..ba9c87ddf 100644 --- a/app/rust/src/parser/transactions/pvm/add_validator.rs +++ b/app/rust/src/parser/transactions/pvm/add_validator.rs @@ -25,7 +25,7 @@ use crate::{ intstr_to_fpstr_inplace, nano_avax_to_fp_str, u64_to_str, BaseTxFields, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, PvmOutput, SECPOutputOwners, Stake, TransferableOutput, Validator, DELEGATION_FEE_DIGITS, MAX_ADDRESS_ENCODED_LEN, - PVM_ADD_VALIDATOR, + PVM_ADD_VALIDATOR, U64_FORMATTED_SIZE }, }; @@ -377,9 +377,8 @@ impl<'b> AddValidatorTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let num_addresses = self.rewards_owner.addresses.len() as u8; match item_n { diff --git a/app/rust/src/parser/transactions/pvm/banff/add_permissionless_delegator.rs b/app/rust/src/parser/transactions/pvm/banff/add_permissionless_delegator.rs index 450d22d05..75fd8e0ca 100644 --- a/app/rust/src/parser/transactions/pvm/banff/add_permissionless_delegator.rs +++ b/app/rust/src/parser/transactions/pvm/banff/add_permissionless_delegator.rs @@ -25,7 +25,7 @@ use crate::{ parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, PvmOutput, SECPOutputOwners, Stake, SubnetId, TransferableOutput, - Validator, MAX_ADDRESS_ENCODED_LEN, PVM_ADD_PERMISSIONLESS_DELEGATOR, + Validator, MAX_ADDRESS_ENCODED_LEN, PVM_ADD_PERMISSIONLESS_DELEGATOR, U64_FORMATTED_SIZE }, }; @@ -397,9 +397,8 @@ impl<'b> AddPermissionlessDelegatorTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let num_addresses = self.rewards_owner.addresses.len() as u8; match item_n { diff --git a/app/rust/src/parser/transactions/pvm/banff/add_permissionless_validator.rs b/app/rust/src/parser/transactions/pvm/banff/add_permissionless_validator.rs index 40a82e10d..1845f2dc2 100644 --- a/app/rust/src/parser/transactions/pvm/banff/add_permissionless_validator.rs +++ b/app/rust/src/parser/transactions/pvm/banff/add_permissionless_validator.rs @@ -25,7 +25,7 @@ use crate::{ intstr_to_fpstr_inplace, nano_avax_to_fp_str, proof_of_possession::BLSSigner, u64_to_str, BaseTxFields, DisplayableItem, FromBytes, Header, ObjectList, OutputIdx, ParserError, PvmOutput, SECPOutputOwners, Stake, SubnetId, TransferableOutput, Validator, - DELEGATION_FEE_DIGITS, MAX_ADDRESS_ENCODED_LEN, PVM_ADD_PERMISSIONLESS_VALIDATOR, + DELEGATION_FEE_DIGITS, MAX_ADDRESS_ENCODED_LEN, PVM_ADD_PERMISSIONLESS_VALIDATOR, U64_FORMATTED_SIZE }, }; @@ -438,9 +438,8 @@ impl<'b> AddPermissionlessValidatorTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let num_addresses = (self.validator_rewards_owner.num_addresses() + self.delegator_rewards_owner.num_addresses()) as u8; diff --git a/app/rust/src/parser/transactions/pvm/banff/convert_subnet_to_l1.rs b/app/rust/src/parser/transactions/pvm/banff/convert_subnet_to_l1.rs index 9cbb5172a..25f7ff318 100644 --- a/app/rust/src/parser/transactions/pvm/banff/convert_subnet_to_l1.rs +++ b/app/rust/src/parser/transactions/pvm/banff/convert_subnet_to_l1.rs @@ -25,7 +25,7 @@ use crate::{ handlers::handle_ui_message, parser::{ l1_validator::L1Validator, nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, - Header, ObjectList, ParserError, PvmOutput, SubnetAuth, SubnetId, PVM_CONVERT_SUBNET_L1, + Header, ObjectList, ParserError, PvmOutput, SubnetAuth, SubnetId, PVM_CONVERT_SUBNET_L1, U64_FORMATTED_SIZE }, }; @@ -150,8 +150,7 @@ impl<'b> DisplayableItem for ConvertSubnetToL1Tx<'b> { page: u8, ) -> Result { use bolos::pic_str; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let prefix = pic_str!(b"0x"!); match item_n { 0 => { diff --git a/app/rust/src/parser/transactions/pvm/banff/disable_l1_validator.rs b/app/rust/src/parser/transactions/pvm/banff/disable_l1_validator.rs index 99f9093da..4a9eb946e 100644 --- a/app/rust/src/parser/transactions/pvm/banff/disable_l1_validator.rs +++ b/app/rust/src/parser/transactions/pvm/banff/disable_l1_validator.rs @@ -24,7 +24,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, SubnetAuth, PVM_DISABLE_L1_VALIDATOR, + PvmOutput, SubnetAuth, PVM_DISABLE_L1_VALIDATOR, U64_FORMATTED_SIZE }, }; @@ -100,8 +100,7 @@ impl<'b> DisplayableItem for DisableL1ValidatorTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n { 0 => { diff --git a/app/rust/src/parser/transactions/pvm/banff/increase_l1_validator_balance.rs b/app/rust/src/parser/transactions/pvm/banff/increase_l1_validator_balance.rs index 34cb45402..bb6ff62d5 100644 --- a/app/rust/src/parser/transactions/pvm/banff/increase_l1_validator_balance.rs +++ b/app/rust/src/parser/transactions/pvm/banff/increase_l1_validator_balance.rs @@ -18,7 +18,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, PVM_INCREASE_L1_VALIDATOR_BALANCE, + PvmOutput, PVM_INCREASE_L1_VALIDATOR_BALANCE, U64_FORMATTED_SIZE }, }; use bolos::PIC; @@ -106,9 +106,8 @@ impl<'b> DisplayableItem for IncreaseL1ValidatorBalanceTx<'b> { page: u8, ) -> Result { use bolos::pic_str; - use lexical_core::Number; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n { 0 => { diff --git a/app/rust/src/parser/transactions/pvm/banff/register_l1_validator.rs b/app/rust/src/parser/transactions/pvm/banff/register_l1_validator.rs index a0ee54adb..348a900f5 100644 --- a/app/rust/src/parser/transactions/pvm/banff/register_l1_validator.rs +++ b/app/rust/src/parser/transactions/pvm/banff/register_l1_validator.rs @@ -5,7 +5,7 @@ use crate::{ parser::{ pchain_owner::PchainOwner, proof_of_possession::BLS_SIGNATURE_LEN, BaseTxFields, DisplayableItem, FromBytes, Header, NodeId, ParserError, PvmOutput, SubnetId, - PVM_REGISTER_L1_VALIDATOR, + PVM_REGISTER_L1_VALIDATOR, U64_FORMATTED_SIZE }, }; use bolos::PIC; @@ -149,8 +149,9 @@ impl<'b> DisplayableItem for RegisterL1ValidatorTx<'b> { page: u8, ) -> Result { use bolos::pic_str; - use lexical_core::{write as itoa, Number}; - let mut buffer = [0; u64::FORMATTED_SIZE + 2]; + use itoa::Buffer; + let mut itoa_buffer = Buffer::new(); + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let n_remain_addresses = self.remaining_balance_owner.addresses.len(); let n_disable_addresses = self.disable_owner.addresses.len(); @@ -166,8 +167,8 @@ impl<'b> DisplayableItem for RegisterL1ValidatorTx<'b> { 2 => { let label = pic_str!(b"Weight"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.weight, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.weight); + handle_ui_message(buffer.as_bytes(), message, page) } 3 => { let label = pic_str!(b"Balance (AVAX)"); diff --git a/app/rust/src/parser/transactions/pvm/banff/remove_subnet_validator.rs b/app/rust/src/parser/transactions/pvm/banff/remove_subnet_validator.rs index fe8039bd4..c5aaf497b 100644 --- a/app/rust/src/parser/transactions/pvm/banff/remove_subnet_validator.rs +++ b/app/rust/src/parser/transactions/pvm/banff/remove_subnet_validator.rs @@ -21,7 +21,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, SubnetAuth, SubnetId, PVM_REMOVE_SUBNET_VALIDATOR, + PvmOutput, SubnetAuth, SubnetId, PVM_REMOVE_SUBNET_VALIDATOR, U64_FORMATTED_SIZE }, }; @@ -87,7 +87,6 @@ impl<'b> DisplayableItem for RemoveSubnetValidatorTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { // 17 character limit for Nano S @@ -113,7 +112,7 @@ impl<'b> DisplayableItem for RemoveSubnetValidatorTx<'b> { let fee = self.fee().map_err(|_| ViewError::Unknown)?; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee_buff = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; handle_ui_message(fee_buff, message, page) diff --git a/app/rust/src/parser/transactions/pvm/banff/set_l1_validator_weight.rs b/app/rust/src/parser/transactions/pvm/banff/set_l1_validator_weight.rs index 21c84d716..e1381894c 100644 --- a/app/rust/src/parser/transactions/pvm/banff/set_l1_validator_weight.rs +++ b/app/rust/src/parser/transactions/pvm/banff/set_l1_validator_weight.rs @@ -3,7 +3,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, PVM_SET_L1_VALIDATOR_WEIGHT, + PvmOutput, PVM_SET_L1_VALIDATOR_WEIGHT, U64_FORMATTED_SIZE }, }; use bolos::PIC; @@ -105,9 +105,10 @@ impl<'b> DisplayableItem for SetL1ValidatorWeightTx<'b> { page: u8, ) -> Result { use bolos::pic_str; - use lexical_core::{write as itoa, Number}; - let mut buffer = [0; u64::FORMATTED_SIZE + 2]; + use itoa::Buffer; + let mut itoa_buffer = Buffer::new(); + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n { 0 => { let label = pic_str!(b"SetL1ValWeight"); @@ -133,14 +134,14 @@ impl<'b> DisplayableItem for SetL1ValidatorWeightTx<'b> { 2 => { let label = pic_str!(b"Nonce"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.nonce, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.nonce); + handle_ui_message(buffer.as_bytes(), message, page) } 3 => { let label = pic_str!(b"Weight"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.weight, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.weight); + handle_ui_message(buffer.as_bytes(), message, page) } 4 => { let label = pic_str!(b"Fee(AVAX)"); diff --git a/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs b/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs index 508f8325a..da7d7cbbe 100644 --- a/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs +++ b/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs @@ -29,7 +29,7 @@ use crate::{ parser::{ intstr_to_fpstr_inplace, nano_avax_to_fp_str, u32_to_str, AssetId, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, PvmOutput, SubnetAuth, SubnetId, - DELEGATION_FEE_DIGITS, PVM_TRANSFORM_SUBNET, + DELEGATION_FEE_DIGITS, PVM_TRANSFORM_SUBNET, U64_FORMATTED_SIZE }, utils::is_app_mode_expert, }; @@ -155,67 +155,68 @@ impl<'b> TransformSubnetTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::{write as itoa, Number}; + use itoa::Buffer; //+2 for 0. in case of decimals and +1 for % in percentages - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2 + 1]; + let mut itoa_buffer = Buffer::new(); + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; match item_n { 0 => { let label = pic_str!(b"Initial supply"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.initial_supply, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.initial_supply); + handle_ui_message(buffer.as_bytes(), message, page) } 1 => { let label = pic_str!(b"Maximum supply"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.maximum_supply, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.maximum_supply); + handle_ui_message(buffer.as_bytes(), message, page) } 2 => { let label = pic_str!(b"Min consumption"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.min_consumption_rate, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.min_consumption_rate); + handle_ui_message(buffer.as_bytes(), message, page) } 3 => { let label = pic_str!(b"Max consumption"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.max_consumption_rate, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.max_consumption_rate); + handle_ui_message(buffer.as_bytes(), message, page) } 4 => { let label = pic_str!(b"Min valid. stake"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.min_validator_stake, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.min_validator_stake); + handle_ui_message(buffer.as_bytes(), message, page) } 5 => { let label = pic_str!(b"Max valid. stake"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.max_validator_stake, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.max_validator_stake); + handle_ui_message(buffer.as_bytes(), message, page) } 6 => { let label = pic_str!(b"Min stake time"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.min_stake_duration, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.min_stake_duration); + handle_ui_message(buffer.as_bytes(), message, page) } 7 => { let label = pic_str!(b"Max stake time"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.max_stake_duration, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.max_stake_duration); + handle_ui_message(buffer.as_bytes(), message, page) } 8 => { let label = pic_str!(b"Min delegate fee"); @@ -236,16 +237,16 @@ impl<'b> TransformSubnetTx<'b> { let label = pic_str!(b"Min delega. stake"); title[..label.len()].copy_from_slice(label); - let buffer = itoa(self.min_delegator_stake, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.min_delegator_stake); + handle_ui_message(buffer.as_bytes(), message, page) } 10 => { let label = pic_str!(b"Max weight fact."); title[..label.len()].copy_from_slice(label); // Determine how to display properly - let buffer = itoa(self.max_validator_weight_factor, &mut buffer); - handle_ui_message(buffer, message, page) + let buffer = itoa_buffer.format(self.max_validator_weight_factor); + handle_ui_message(buffer.as_bytes(), message, page) } 11 => { let label = pic_str!(b"Uptime req."); @@ -299,7 +300,6 @@ impl<'b> DisplayableItem for TransformSubnetTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; let expert = is_app_mode_expert(); @@ -319,7 +319,7 @@ impl<'b> DisplayableItem for TransformSubnetTx<'b> { let fee = self.fee().map_err(|_| ViewError::Unknown)?; - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee_buff = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; handle_ui_message(fee_buff, message, page) diff --git a/app/rust/src/parser/transactions/pvm/base_tx.rs b/app/rust/src/parser/transactions/pvm/base_tx.rs index 3bd7686ee..253d6607e 100644 --- a/app/rust/src/parser/transactions/pvm/base_tx.rs +++ b/app/rust/src/parser/transactions/pvm/base_tx.rs @@ -24,7 +24,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, MAX_ADDRESS_ENCODED_LEN, PVM_BASE_TX, PVM_BASE_TX_TRANSFER, + PvmOutput, MAX_ADDRESS_ENCODED_LEN, PVM_BASE_TX, PVM_BASE_TX_TRANSFER, U64_FORMATTED_SIZE }, }; @@ -79,7 +79,6 @@ impl<'b> DisplayableItem for PvmBaseTx<'b> { message: &mut [u8], page: u8, ) -> Result { - use lexical_core::Number; if item_n == 0 { // render export title and network info @@ -94,7 +93,7 @@ impl<'b> DisplayableItem for PvmBaseTx<'b> { x if x == outputs_num_items => { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/pvm/create_chain_tx.rs b/app/rust/src/parser/transactions/pvm/create_chain_tx.rs index 9eebed5ca..f14cdec16 100644 --- a/app/rust/src/parser/transactions/pvm/create_chain_tx.rs +++ b/app/rust/src/parser/transactions/pvm/create_chain_tx.rs @@ -24,7 +24,7 @@ use crate::{ handlers::handle_ui_message, parser::{ cb58_output_len, nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, - ParserError, PvmOutput, SubnetAuth, SubnetId, CB58_CHECKSUM_LEN, PVM_CREATE_CHAIN, + ParserError, PvmOutput, SubnetAuth, SubnetId, CB58_CHECKSUM_LEN, PVM_CREATE_CHAIN, U64_FORMATTED_SIZE }, utils::{bs58_encode, hex_encode, ApduPanic}, }; @@ -140,7 +140,6 @@ impl<'b> DisplayableItem for CreateChainTx<'b> { hash::{Hasher, Sha256}, pic_str, PIC, }; - use lexical_core::Number; let mut hex_buf = [0; Sha256::DIGEST_LEN * 2]; match item_n { @@ -184,7 +183,7 @@ impl<'b> DisplayableItem for CreateChainTx<'b> { let label = pic_str!(b"Fee(AVAX)"); title[..label.len()].copy_from_slice(label); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_buff = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs b/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs index dcac1c2e8..822b33611 100644 --- a/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs +++ b/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - PvmOutput, SECPOutputOwners, PVM_CREATE_SUBNET, + PvmOutput, SECPOutputOwners, PVM_CREATE_SUBNET, U64_FORMATTED_SIZE }, }; @@ -106,7 +106,6 @@ impl<'b> DisplayableItem for CreateSubnetTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; let owner_items = self.owners.num_items()?; let start_owner = 1; @@ -125,7 +124,7 @@ impl<'b> DisplayableItem for CreateSubnetTx<'b> { x if x == end_owner => { let label = pic_str!(b"Fee(AVAX)"); title[..label.len()].copy_from_slice(label); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_buff = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/pvm/export_tx.rs b/app/rust/src/parser/transactions/pvm/export_tx.rs index 77030ff3b..ef3ff1ec2 100644 --- a/app/rust/src/parser/transactions/pvm/export_tx.rs +++ b/app/rust/src/parser/transactions/pvm/export_tx.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseExport, DisplayableItem, FromBytes, ParserError, PvmOutput, - PVM_EXPORT_TX, + PVM_EXPORT_TX, U64_FORMATTED_SIZE }, }; @@ -84,7 +84,6 @@ impl<'b> DisplayableItem for PvmExportTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { // render export title and network info @@ -99,7 +98,7 @@ impl<'b> DisplayableItem for PvmExportTx<'b> { x if x == outputs_num_items => { let title_content = pic_str!(b"Fee(AVAX)"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/pvm/import_tx.rs b/app/rust/src/parser/transactions/pvm/import_tx.rs index a4ff58dc6..9aeb0a7c9 100644 --- a/app/rust/src/parser/transactions/pvm/import_tx.rs +++ b/app/rust/src/parser/transactions/pvm/import_tx.rs @@ -23,7 +23,7 @@ use crate::{ handlers::handle_ui_message, parser::{ nano_avax_to_fp_str, BaseImport, DisplayableItem, FromBytes, ParserError, PvmOutput, - PVM_IMPORT_TX, + PVM_IMPORT_TX, U64_FORMATTED_SIZE }, }; @@ -82,7 +82,6 @@ impl<'b> DisplayableItem for PvmImportTx<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { let title_content = pic_str!(b"ImportTx"); @@ -100,7 +99,7 @@ impl<'b> DisplayableItem for PvmImportTx<'b> { x if x == (inputs_num_items + 1) => { let title_content = pic_str!(b"Fee"); title[..title_content.len()].copy_from_slice(title_content); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let fee = self.fee().map_err(|_| ViewError::Unknown)?; let fee_str = nano_avax_to_fp_str(fee, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/transactions/transfer.rs b/app/rust/src/parser/transactions/transfer.rs index 268eac4df..ef9af275d 100644 --- a/app/rust/src/parser/transactions/transfer.rs +++ b/app/rust/src/parser/transactions/transfer.rs @@ -21,7 +21,7 @@ use crate::checked_add; use crate::handlers::handle_ui_message; use crate::parser::{ nano_avax_to_fp_str, AvmOutput, BaseTxFields, DisplayableItem, FromBytes, Header, ParserError, - MAX_ADDRESS_ENCODED_LEN, TRANSFER_TX, + MAX_ADDRESS_ENCODED_LEN, TRANSFER_TX, U64_FORMATTED_SIZE }; #[derive(Clone, Copy, PartialEq, Eq)] @@ -152,7 +152,6 @@ impl<'b> DisplayableItem for Transfer<'b> { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; if item_n == 0 { let label = pic_str!(b"Transfer"); @@ -174,7 +173,7 @@ impl<'b> DisplayableItem for Transfer<'b> { title[..t.len()].copy_from_slice(t); let fee = self.fee().map_err(|_| ViewError::Unknown)?; - let mut content = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut content = [0; U64_FORMATTED_SIZE + 2]; let fee = nano_avax_to_fp_str(fee, &mut content[..]).map_err(|_| ViewError::Unknown)?; diff --git a/app/rust/src/parser/utils.rs b/app/rust/src/parser/utils.rs index 7da3a789d..4babba79f 100644 --- a/app/rust/src/parser/utils.rs +++ b/app/rust/src/parser/utils.rs @@ -21,9 +21,8 @@ mod time; pub use self::time::timestamp_to_str_date; pub use path_wrapper::{parse_path_list, PathWrapper}; -use crate::parser::{ParserError, CB58_CHECKSUM_LEN, NANO_AVAX_DECIMAL_DIGITS}; +use crate::parser::{ParserError, CB58_CHECKSUM_LEN, NANO_AVAX_DECIMAL_DIGITS, U64_FORMATTED_SIZE, U32_FORMATTED_SIZE, U8_FORMATTED_SIZE}; use crate::sys::PIC; -use lexical_core::Number; #[cfg_attr(any(test, feature = "derive-debug"), derive(Debug))] pub enum IntStrToFpStrError { @@ -48,7 +47,7 @@ pub const fn cb58_output_len() -> usize { pub fn nano_avax_to_fp_str(value: u64, out_str: &mut [u8]) -> Result<&mut [u8], ParserError> { // the number plus '0.' - if out_str.len() < u64::FORMATTED_SIZE_DECIMAL + 2 { + if out_str.len() < U64_FORMATTED_SIZE + 2 { return Err(ParserError::UnexpectedBufferEnd); } @@ -63,10 +62,17 @@ macro_rules! num_to_str { // but lets do it later. ($int_type:ty, $_name: ident) => { pub fn $_name(number: $int_type, output: &mut [u8]) -> Result<&mut [u8], ParserError> { - if output.len() < <$int_type>::FORMATTED_SIZE_DECIMAL { + let required_size = match std::any::TypeId::of::<$int_type>() { + // Match the type to the corresponding constant + id if id == std::any::TypeId::of::() => U64_FORMATTED_SIZE, + id if id == std::any::TypeId::of::() => U32_FORMATTED_SIZE, + id if id == std::any::TypeId::of::() => U8_FORMATTED_SIZE, + _ => return Err(ParserError::UnexpectedBufferEnd), // Handle unexpected types + }; + + if output.len() < required_size { return Err(ParserError::UnexpectedBufferEnd); } - if number == 0 { output[0] = b'0'; return Ok(&mut output[..1]); @@ -244,8 +250,7 @@ macro_rules! checked_add { #[cfg(test)] mod tests { - use super::{intstr_to_fpstr_inplace, u64_to_str}; - use lexical_core::Number; + use super::{intstr_to_fpstr_inplace, u64_to_str, U64_FORMATTED_SIZE}; use rand::Rng; use std::{format, string::String, vec::Vec}; @@ -295,7 +300,7 @@ mod tests { #[test] fn int_to_str() { - let mut output = [0; u64::FORMATTED_SIZE_DECIMAL]; + let mut output = [0; U64_FORMATTED_SIZE]; let test = create_number_table(); for (number, dat) in test { let res = { diff --git a/app/rust/src/parser/utils/time.rs b/app/rust/src/parser/utils/time.rs index cd4ce043b..22c07d15b 100644 --- a/app/rust/src/parser/utils/time.rs +++ b/app/rust/src/parser/utils/time.rs @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ -use crate::parser::{u64_to_str, u8_to_str, FORMATTED_STR_DATE_LEN}; +use crate::parser::{u64_to_str, u8_to_str, FORMATTED_STR_DATE_LEN, U64_FORMATTED_SIZE}; use crate::sys::{pic_str, PIC}; use arrayvec::ArrayVec; use arrayvec::CapacityError; -use lexical_core::Number; - const MONTH_DAYS: &[u8; 12] = &[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; const YEAR_LOOKUP: &[u32; 400] = &[ @@ -161,7 +159,7 @@ pub fn timestamp_to_str_date( let date = timestamp_to_date(timestamp)?; let mut date_str = ArrayVec::<_, FORMATTED_STR_DATE_LEN>::new(); - let mut num_buff = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut num_buff = [0; U64_FORMATTED_SIZE + 2]; // separators let dash = b'-'; diff --git a/app/rust/src/parser/validator/weight_type.rs b/app/rust/src/parser/validator/weight_type.rs index 2cbd78515..8908df2ea 100644 --- a/app/rust/src/parser/validator/weight_type.rs +++ b/app/rust/src/parser/validator/weight_type.rs @@ -5,7 +5,7 @@ use zemu_sys::ViewError; use crate::{ handlers::handle_ui_message, - parser::{nano_avax_to_fp_str, u64_to_str, DisplayableItem, FromBytes}, + parser::{nano_avax_to_fp_str, u64_to_str, DisplayableItem, FromBytes, U64_FORMATTED_SIZE}, }; pub trait StakeTrait { @@ -56,14 +56,13 @@ impl DisplayableItem for Stake { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; match item_n { 0 => { let label = pic_str!(b"Total stake(AVAX)"); title[..label.len()].copy_from_slice(label); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL + 2]; + let mut buffer = [0; U64_FORMATTED_SIZE + 2]; let num = nano_avax_to_fp_str(self.0, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; @@ -114,14 +113,13 @@ impl DisplayableItem for Weight { page: u8, ) -> Result { use bolos::{pic_str, PIC}; - use lexical_core::Number; match item_n { 0 => { let label = pic_str!(b"Weight"); title[..label.len()].copy_from_slice(label); - let mut buffer = [0; u64::FORMATTED_SIZE_DECIMAL]; + let mut buffer = [0; U64_FORMATTED_SIZE]; let num = u64_to_str(self.0, &mut buffer[..]).map_err(|_| ViewError::Unknown)?; handle_ui_message(num, message, page) diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index 09991964ff284f6a6a383ce615e625b6c0064fbe..36d75b3b44dfcac2203e6e796585a3b6a5219768 100644 GIT binary patch literal 9100 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 CWun&r literal 9035 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 diff --git a/tests_zemu/snapshots/s-mainmenu/00010.png b/tests_zemu/snapshots/s-mainmenu/00010.png index b2a7be68c8b920fffa915791889ef0302fda7e54..95c759b0a3346c2067a311fdeac9ebd96da51392 100644 GIT binary patch delta 395 zcmV;60d)SU1Em9yB!6s4L_t(|ob8!G5`!QNMYU7!e_$7OK_`O=i2)^O``>g?HH4B6 z5z=V_0000Y*w$%V2ej?s=OSKlUD2@bH2&edM|Pf+m=}JTD@0FaLuRn8ySB`&cGEWN zPt*!vvpx@f`kvpJm+wb5OlSs4gJMTyPaZTgtR;GFN6=1ychvpYfncAU|m4Ldl5#dCjH*$Y6=JQ@H$6i;zf%miT13=J^x z8%XgKp=;U&6@Tj|MFYQcqvlgA8#HuuOX_z)a?EF-4`1}-9Sq&{#mE*}P2M^Z(C*i?F3E-@H8nv*S{g-lV&x`~Uy|07*qoLy`FnX~`TRbzV@4C?7*uaWdKy8KX*cad>;ph;o)`c>D%PDHLkV1nJSyMO=y diff --git a/tests_zemu/snapshots/sp-mainmenu/00004.png b/tests_zemu/snapshots/sp-mainmenu/00004.png index 7382ff93a3dff49c15aedd41d461458a754d2bc4..c7fbd9d493156e491a9b9eaa822ef0da3f6bdd50 100644 GIT binary patch delta 345 zcmaFQ^o41HO1-tGi(^Q|oVPav`3@=YG(61Q!};Al==~$+jfxwLT*4;&xj(s&k4@I+ zW+4LtH0XA8bo`iK?QZLAV=H|*Z~f)}FXM`5_s`@|Oo_kDlbKnWB&MMBa%be$YX_@t z-2Id0P0AHCzVhG#F@d6h9FNCa+oB@s*ItxdlkSlI{TzEw>&^AO*EnCi zOtiE7$19Px?UTl0RgJiU&!Y9G&6-!2gk{*j)ABuV#d5{pobrg^pz0Zi8=?x7_Zh!g z(md;DX~qJp6FvK89ttr2b?n4JuQg8E8~N8y;eVffvbZPnPxy+vr}%3OH0<gTe~DWM4fd>5fF diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 7382ff93a3dff49c15aedd41d461458a754d2bc4..c7fbd9d493156e491a9b9eaa822ef0da3f6bdd50 100644 GIT binary patch delta 345 zcmaFQ^o41HO1-tGi(^Q|oVPav`3@=YG(61Q!};Al==~$+jfxwLT*4;&xj(s&k4@I+ zW+4LtH0XA8bo`iK?QZLAV=H|*Z~f)}FXM`5_s`@|Oo_kDlbKnWB&MMBa%be$YX_@t z-2Id0P0AHCzVhG#F@d6h9FNCa+oB@s*ItxdlkSlI{TzEw>&^AO*EnCi zOtiE7$19Px?UTl0RgJiU&!Y9G&6-!2gk{*j)ABuV#d5{pobrg^pz0Zi8=?x7_Zh!g z(md;DX~qJp6FvK89ttr2b?n4JuQg8E8~N8y;eVffvbZPnPxy+vr}%3OH0<gTe~DWM4fd>5fF diff --git a/tests_zemu/snapshots/st-mainmenu/00004.png b/tests_zemu/snapshots/st-mainmenu/00004.png index 926edac1add36e6975944b8358fc4a9322148743..54e552237490689014e41832578a0523ed6c1f00 100644 GIT binary patch delta 8403 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Ξ3{a^J=^zHuC8gjeG=o~^w+1JIxx#;c1KDwnyU%gQD$)B#fjN91#dS2|rF zHr{3wMHQmFCXi|B!WyyxX;dloRA$$k8I5g33q$N$}2eE-6wm7Uu3yzK@ppOaf2o~k#|-z zylhk}>wS0c0?SFLceg23q9mg@#-=j7M#=|&0?!hOM0mDct2_xVi+YYcA)W+74$FGN z!yNS3cy}?*XnRJAO%m{Ej83nS?4mTenir;<>U6WCzj$^Q>;2h9YJ`7PFpa;|F}f|A266D*#H0l delta 8412 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 L;zsFpr||y=MSWOp diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 7382ff93a3dff49c15aedd41d461458a754d2bc4..c7fbd9d493156e491a9b9eaa822ef0da3f6bdd50 100644 GIT binary patch delta 345 zcmaFQ^o41HO1-tGi(^Q|oVPav`3@=YG(61Q!};Al==~$+jfxwLT*4;&xj(s&k4@I+ zW+4LtH0XA8bo`iK?QZLAV=H|*Z~f)}FXM`5_s`@|Oo_kDlbKnWB&MMBa%be$YX_@t z-2Id0P0AHCzVhG#F@d6h9FNCa+oB@s*ItxdlkSlI{TzEw>&^AO*EnCi zOtiE7$19Px?UTl0RgJiU&!Y9G&6-!2gk{*j)ABuV#d5{pobrg^pz0Zi8=?x7_Zh!g z(md;DX~qJp6FvK89ttr2b?n4JuQg8E8~N8y;eVffvbZPnPxy+vr}%3OH0<gTe~DWM4fd>5fF diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 7382ff93a3dff49c15aedd41d461458a754d2bc4..c7fbd9d493156e491a9b9eaa822ef0da3f6bdd50 100644 GIT binary patch delta 345 zcmaFQ^o41HO1-tGi(^Q|oVPav`3@=YG(61Q!};Al==~$+jfxwLT*4;&xj(s&k4@I+ zW+4LtH0XA8bo`iK?QZLAV=H|*Z~f)}FXM`5_s`@|Oo_kDlbKnWB&MMBa%be$YX_@t z-2Id0P0AHCzVhG#F@d6h9FNCa+oB@s*ItxdlkSlI{TzEw>&^AO*EnCi zOtiE7$19Px?UTl0RgJiU&!Y9G&6-!2gk{*j)ABuV#d5{pobrg^pz0Zi8=?x7_Zh!g z(md;DX~qJp6FvK89ttr2b?n4JuQg8E8~N8y;eVffvbZPnPxy+vr}%3OH0<gTe~DWM4fd>5fF