From 9e4d6f679879720bb511679bba1ac746503e382c Mon Sep 17 00:00:00 2001 From: Carlos Medeiros <104493454+chcmedeiros@users.noreply.github.com> Date: Mon, 7 Apr 2025 07:51:22 -0500 Subject: [PATCH] Fix warnings (#368) * fix clippy warnings * bump version --- app/Makefile.version | 2 +- app/rust/src/ffi/context.rs | 8 +++++-- app/rust/src/ffi/eth_tx.rs | 13 +++++++----- app/rust/src/handlers.rs | 1 + app/rust/src/handlers/avax/message.rs | 5 ++++- app/rust/src/handlers/avax/sign_hash.rs | 6 +++++- app/rust/src/handlers/avax/signing.rs | 5 ++++- app/rust/src/handlers/eth/personal_msg.rs | 5 ++++- app/rust/src/handlers/eth/provide_nft_info.rs | 1 + app/rust/src/handlers/eth/public_key.rs | 1 + app/rust/src/handlers/eth/signing.rs | 5 ++++- app/rust/src/handlers/eth/utils/u256.rs | 2 +- app/rust/src/handlers/public_key.rs | 2 +- app/rust/src/handlers/public_key/ui.rs | 2 ++ app/rust/src/handlers/public_key/xpub.rs | 2 +- app/rust/src/handlers/wallet_id.rs | 2 +- app/rust/src/integration_tests/sign.rs | 6 +++--- app/rust/src/parser/address.rs | 4 ++-- app/rust/src/parser/asset_id.rs | 4 ++-- app/rust/src/parser/avm_output.rs | 4 ++-- app/rust/src/parser/chain_id.rs | 2 +- app/rust/src/parser/coreth/data.rs | 2 +- app/rust/src/parser/coreth/data/asset_call.rs | 2 +- .../src/parser/coreth/data/contract_call.rs | 2 +- app/rust/src/parser/coreth/data/deploy.rs | 2 +- app/rust/src/parser/coreth/data/erc20.rs | 8 +++---- app/rust/src/parser/coreth/data/erc721.rs | 13 ++++++------ app/rust/src/parser/coreth/export_tx.rs | 2 +- app/rust/src/parser/coreth/import_tx.rs | 2 +- app/rust/src/parser/coreth/inputs.rs | 4 ++-- app/rust/src/parser/coreth/native.rs | 4 ++-- app/rust/src/parser/coreth/native/base.rs | 4 ++-- app/rust/src/parser/coreth/native/eip1559.rs | 4 ++-- app/rust/src/parser/coreth/native/eip2930.rs | 4 ++-- app/rust/src/parser/coreth/native/legacy.rs | 2 +- app/rust/src/parser/coreth/native/sign_msg.rs | 4 ++-- app/rust/src/parser/coreth/outputs.rs | 10 ++++----- app/rust/src/parser/inputs.rs | 6 +++--- .../src/parser/inputs/secp_transfer_input.rs | 2 +- app/rust/src/parser/message.rs | 8 +++---- app/rust/src/parser/node_id.rs | 2 +- app/rust/src/parser/operations.rs | 6 +++--- .../parser/operations/nft_mint_operation.rs | 4 ++-- .../operations/nft_transfer_operation.rs | 4 ++-- .../parser/operations/secp_mint_operation.rs | 4 ++-- app/rust/src/parser/outputs.rs | 2 +- .../src/parser/outputs/nft_mint_output.rs | 2 +- .../src/parser/outputs/nft_transfer_output.rs | 2 +- .../src/parser/outputs/secp_mint_output.rs | 2 +- .../src/parser/outputs/secp_output_owners.rs | 2 +- .../parser/outputs/secp_transfer_output.rs | 2 +- app/rust/src/parser/proof_of_possession.rs | 6 +++--- app/rust/src/parser/pvm_output.rs | 4 ++-- app/rust/src/parser/snapshots_common.rs | 4 ++-- app/rust/src/parser/subnet_auth.rs | 2 +- app/rust/src/parser/subnet_id.rs | 2 +- app/rust/src/parser/transactions.rs | 2 +- .../parser/transactions/avm/create_asset.rs | 2 +- .../src/parser/transactions/avm/export_tx.rs | 2 +- .../src/parser/transactions/avm/import_tx.rs | 2 +- .../parser/transactions/avm/operation_tx.rs | 2 +- .../parser/transactions/pvm/add_delegator.rs | 2 +- .../transactions/pvm/add_subnet_validator.rs | 2 +- .../parser/transactions/pvm/add_validator.rs | 2 +- .../pvm/banff/add_permissionless_delegator.rs | 2 +- .../pvm/banff/add_permissionless_validator.rs | 2 +- .../pvm/banff/convert_subnet_to_l1.rs | 2 +- .../pvm/banff/disable_l1_validator.rs | 2 +- .../banff/increase_l1_validator_balance.rs | 2 +- .../pvm/banff/register_l1_validator.rs | 2 +- .../pvm/banff/remove_subnet_validator.rs | 2 +- .../pvm/banff/set_l1_validator_weight.rs | 2 +- .../pvm/banff/transform_subnet.rs | 4 ++-- .../src/parser/transactions/pvm/base_tx.rs | 2 +- .../transactions/pvm/create_chain_tx.rs | 2 +- .../transactions/pvm/create_subnet_tx.rs | 2 +- .../src/parser/transactions/pvm/export_tx.rs | 2 +- .../src/parser/transactions/pvm/import_tx.rs | 2 +- app/rust/src/parser/transactions/transfer.rs | 4 ++-- app/rust/src/parser/transactions/tx_header.rs | 2 +- app/rust/src/parser/utils.rs | 4 ++-- app/rust/src/parser/validator.rs | 6 +++--- app/rust/src/utils.rs | 20 +++++++++++------- app/rust/src/utils/buffer_upload.rs | 1 + tests_zemu/snapshots/fl-mainmenu/00004.png | Bin 9275 -> 9205 bytes tests_zemu/snapshots/sp-mainmenu/00004.png | Bin 375 -> 377 bytes tests_zemu/snapshots/sp-mainmenu/00010.png | Bin 375 -> 377 bytes tests_zemu/snapshots/st-mainmenu/00004.png | Bin 11084 -> 11013 bytes tests_zemu/snapshots/x-mainmenu/00004.png | Bin 375 -> 377 bytes tests_zemu/snapshots/x-mainmenu/00010.png | Bin 375 -> 377 bytes 90 files changed, 167 insertions(+), 133 deletions(-) diff --git a/app/Makefile.version b/app/Makefile.version index 9802732f9..90a6c080a 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=1 # Minor APPVERSION_N=2 # Patch -APPVERSION_P=3 +APPVERSION_P=4 diff --git a/app/rust/src/ffi/context.rs b/app/rust/src/ffi/context.rs index fa6614511..9b58ac667 100644 --- a/app/rust/src/ffi/context.rs +++ b/app/rust/src/ffi/context.rs @@ -96,6 +96,7 @@ impl TryFrom for Instruction { } } +#[allow(static_mut_refs)] #[no_mangle] pub unsafe extern "C" fn _set_root_path(raw_path: *const u8, path_len_bytes: u16) -> u32 { let path = core::slice::from_raw_parts(raw_path, path_len_bytes as usize); @@ -111,10 +112,12 @@ pub unsafe extern "C" fn _set_root_path(raw_path: *const u8, path_len_bytes: u16 } // important to use avax::signing::Sign - PATH.lock(Sign).replace(root_path); + let path_lock = PATH.lock(Sign); + *path_lock = Some(root_path); ParserError::ParserOk as u32 } +#[allow(static_mut_refs)] #[no_mangle] pub unsafe extern "C" fn _set_tx_hash(hash: *const u8, hash_len_bytes: u16) -> u16 { if hash_len_bytes != Sign::SIGN_HASH_SIZE as u16 { @@ -127,7 +130,8 @@ pub unsafe extern "C" fn _set_tx_hash(hash: *const u8, hash_len_bytes: u16) -> u // In this step the transaction has not been signed // so store the hash for the next steps - HASH.lock(Sign).replace(hash); + let hash_lock = HASH.lock(Sign); + *hash_lock = Some(hash); // next step requires SignHash handler to have // access to the path and hash resources that this handler just updated diff --git a/app/rust/src/ffi/eth_tx.rs b/app/rust/src/ffi/eth_tx.rs index e0a7e07a6..3b512fbac 100644 --- a/app/rust/src/ffi/eth_tx.rs +++ b/app/rust/src/ffi/eth_tx.rs @@ -9,6 +9,7 @@ use crate::{ use super::context::{parser_context_t, Instruction}; #[inline(never)] +#[allow(static_mut_refs)] pub unsafe fn num_items_eth(ctx: *const parser_context_t, num_items: &mut u8) -> u32 { let Ok(tx_type) = Instruction::try_from((*ctx).ins) else { return ParserError::InvalidTransactionType as u32; @@ -18,7 +19,8 @@ pub unsafe fn num_items_eth(ctx: *const parser_context_t, num_items: &mut u8) -> return ParserError::InvalidTransactionType as u32; } - if let Some(obj) = ETH_UI.lock(EthAccessors::Tx) { + let ui_lock = ETH_UI.lock(EthAccessors::Tx); + if let Some(obj) = ui_lock { match obj.num_items() { Ok(n) => { *num_items = n; @@ -32,6 +34,7 @@ pub unsafe fn num_items_eth(ctx: *const parser_context_t, num_items: &mut u8) -> } #[inline(never)] +#[allow(static_mut_refs)] pub unsafe fn get_eth_item( ctx: *const parser_context_t, display_idx: u8, @@ -70,6 +73,7 @@ pub unsafe fn get_eth_item( } #[no_mangle] +#[allow(static_mut_refs)] unsafe extern "C" fn _accept_eth_tx(tx: *mut u16, buffer: *mut u8, buffer_len: u32) -> u16 { if tx.is_null() || buffer.is_null() || buffer_len == 0 { return ApduError::DataInvalid as u16; @@ -77,14 +81,13 @@ unsafe extern "C" fn _accept_eth_tx(tx: *mut u16, buffer: *mut u8, buffer_len: u let data = std::slice::from_raw_parts_mut(buffer, buffer_len as usize); - let code = if let Some(obj) = ETH_UI.lock(EthAccessors::Tx) { + let ui_lock = ETH_UI.lock(EthAccessors::Tx); + if let Some(obj) = ui_lock { let (_tx, code) = obj.accept(data); *tx = _tx as u16; code } else { // No ethereum transaction has been processed yet ApduError::DataInvalid as u16 - }; - - code + } } diff --git a/app/rust/src/handlers.rs b/app/rust/src/handlers.rs index 3b446c277..2f70d6172 100644 --- a/app/rust/src/handlers.rs +++ b/app/rust/src/handlers.rs @@ -26,6 +26,7 @@ pub mod eth; mod utils; pub use utils::*; +#[allow(static_mut_refs)] pub mod resources { use crate::constants::MAX_BIP32_PATH_DEPTH; diff --git a/app/rust/src/handlers/avax/message.rs b/app/rust/src/handlers/avax/message.rs index 7adf4138c..70f773376 100644 --- a/app/rust/src/handlers/avax/message.rs +++ b/app/rust/src/handlers/avax/message.rs @@ -33,6 +33,7 @@ use crate::{ pub struct Sign; +#[allow(static_mut_refs)] impl Sign { // For avax signing which includes P, C, X chains, // sha256 is used @@ -65,7 +66,7 @@ impl Sign { let ui = SignUI { hash: digest, msg }; - crate::show_ui!(ui.show(flags)) + crate::show_ui!(unsafe { ui.show(flags) }) } } @@ -89,6 +90,7 @@ pub(crate) struct SignUI { msg: AvaxMessage<'static>, } +#[allow(static_mut_refs)] impl Viewable for SignUI { fn num_items(&mut self) -> Result { self.msg.num_items() @@ -128,6 +130,7 @@ impl Viewable for SignUI { } } +#[allow(static_mut_refs)] fn cleanup_globals() -> Result<(), Error> { unsafe { if let Ok(path) = PATH.acquire(Sign) { diff --git a/app/rust/src/handlers/avax/sign_hash.rs b/app/rust/src/handlers/avax/sign_hash.rs index b17657905..813f49c32 100644 --- a/app/rust/src/handlers/avax/sign_hash.rs +++ b/app/rust/src/handlers/avax/sign_hash.rs @@ -38,6 +38,7 @@ use crate::{ pub struct Sign; +#[allow(static_mut_refs)] impl Sign { // For avax transactions which includes P, C, X chains, // sha256 is used @@ -129,7 +130,7 @@ impl Sign { hash: unsigned_hash, }; - crate::show_ui!(ui.show(flags)) + crate::show_ui!(unsafe { ui.show(flags) }) } pub fn get_signing_info(data: &[u8]) -> Result, Error> { @@ -170,6 +171,7 @@ impl SignUI { } } +#[allow(static_mut_refs)] impl Viewable for SignUI { fn num_items(&mut self) -> Result { Ok(1) @@ -199,6 +201,7 @@ impl Viewable for SignUI { handle_ui_message(&hex[..size], message, page) } + fn accept(&mut self, _out: &mut [u8]) -> (usize, u16) { let tx = 0; @@ -287,6 +290,7 @@ impl ApduHandler for Sign { } } +#[allow(static_mut_refs)] pub fn cleanup_globals() -> Result<(), Error> { unsafe { if let Ok(path) = PATH.acquire(Sign) { diff --git a/app/rust/src/handlers/avax/signing.rs b/app/rust/src/handlers/avax/signing.rs index 747bf1190..652ddd458 100644 --- a/app/rust/src/handlers/avax/signing.rs +++ b/app/rust/src/handlers/avax/signing.rs @@ -38,6 +38,7 @@ use crate::{ pub struct Sign; +#[allow(static_mut_refs)] impl Sign { // For avax transactions which includes P, C, X chains, // sha256 is used @@ -159,7 +160,7 @@ impl Sign { transaction, }; - crate::show_ui!(ui.show(flags)) + crate::show_ui!(unsafe { ui.show(flags) }) } } @@ -183,6 +184,7 @@ pub(crate) struct SignUI { transaction: Transaction<'static>, } +#[allow(static_mut_refs)] impl Viewable for SignUI { fn num_items(&mut self) -> Result { self.transaction.num_items() @@ -222,6 +224,7 @@ impl Viewable for SignUI { } } +#[allow(static_mut_refs)] fn cleanup_globals() -> Result<(), Error> { unsafe { if let Ok(path) = PATH.acquire(Sign) { diff --git a/app/rust/src/handlers/eth/personal_msg.rs b/app/rust/src/handlers/eth/personal_msg.rs index 244829226..2f368c966 100644 --- a/app/rust/src/handlers/eth/personal_msg.rs +++ b/app/rust/src/handlers/eth/personal_msg.rs @@ -39,6 +39,7 @@ use crate::utils::convert_der_to_rs; pub struct Sign; +#[allow(static_mut_refs)] impl Sign { pub const SIGN_HASH_SIZE: usize = Keccak::<32>::DIGEST_LEN; @@ -105,7 +106,7 @@ impl Sign { tx, }; - crate::show_ui!(ui.show(flags)) + crate::show_ui!(unsafe { ui.show(flags) }) } #[inline(never)] @@ -200,6 +201,7 @@ impl Sign { } } +#[allow(static_mut_refs)] impl ApduHandler for Sign { #[inline(never)] fn handle(flags: &mut u32, tx: &mut u32, buffer: ApduBufferRead<'_>) -> Result<(), Error> { @@ -357,6 +359,7 @@ impl Viewable for SignUI { } } +#[allow(static_mut_refs)] fn cleanup_globals() -> Result<(), Error> { unsafe { if let Ok(path) = PATH.acquire(Sign) { diff --git a/app/rust/src/handlers/eth/provide_nft_info.rs b/app/rust/src/handlers/eth/provide_nft_info.rs index 0df2c6e36..eb6f5a2b7 100644 --- a/app/rust/src/handlers/eth/provide_nft_info.rs +++ b/app/rust/src/handlers/eth/provide_nft_info.rs @@ -18,6 +18,7 @@ use crate::{constants::ApduError as Error, dispatcher::ApduHandler, sys, utils:: pub struct Info; #[cfg(feature = "erc721")] +#[allow(static_mut_refs)] impl Info { pub fn process(input: &[u8]) -> Result<(), Error> { crate::zlog("NftInfo::process\x00"); diff --git a/app/rust/src/handlers/eth/public_key.rs b/app/rust/src/handlers/eth/public_key.rs index ec9ce045d..81504cdb6 100644 --- a/app/rust/src/handlers/eth/public_key.rs +++ b/app/rust/src/handlers/eth/public_key.rs @@ -36,6 +36,7 @@ use super::utils::parse_bip32_eth; pub struct GetPublicKey; +#[allow(static_mut_refs)] impl GetPublicKey { /// Retrieve the public key with the given bip32 path #[inline(never)] diff --git a/app/rust/src/handlers/eth/signing.rs b/app/rust/src/handlers/eth/signing.rs index 105808417..8e4c273f5 100644 --- a/app/rust/src/handlers/eth/signing.rs +++ b/app/rust/src/handlers/eth/signing.rs @@ -39,6 +39,7 @@ use crate::utils::convert_der_to_rs; pub struct Sign; +#[allow(static_mut_refs)] impl Sign { pub const SIGN_HASH_SIZE: usize = Keccak::<32>::DIGEST_LEN; @@ -112,7 +113,7 @@ impl Sign { tx, }; - crate::show_ui!(ui.show(flags)) + crate::show_ui!(unsafe { ui.show(flags) }) } #[inline(never)] @@ -244,6 +245,7 @@ impl Sign { } } +#[allow(static_mut_refs)] impl ApduHandler for Sign { #[inline(never)] fn handle(flags: &mut u32, tx: &mut u32, buffer: ApduBufferRead<'_>) -> Result<(), Error> { @@ -449,6 +451,7 @@ impl Viewable for SignUI { } } +#[allow(static_mut_refs)] pub fn cleanup_globals() -> Result<(), Error> { unsafe { if let Ok(path) = PATH.acquire(Sign) { diff --git a/app/rust/src/handlers/eth/utils/u256.rs b/app/rust/src/handlers/eth/utils/u256.rs index 3d3267c57..7f2347d2f 100644 --- a/app/rust/src/handlers/eth/utils/u256.rs +++ b/app/rust/src/handlers/eth/utils/u256.rs @@ -64,7 +64,7 @@ impl<'b> BorrowedU256<'b> { } } -impl<'b> Deref for BorrowedU256<'b> { +impl Deref for BorrowedU256<'_> { type Target = [u8]; fn deref(&self) -> &Self::Target { diff --git a/app/rust/src/handlers/public_key.rs b/app/rust/src/handlers/public_key.rs index 971d2ca88..84c186e96 100644 --- a/app/rust/src/handlers/public_key.rs +++ b/app/rust/src/handlers/public_key.rs @@ -177,7 +177,7 @@ impl ApduHandler for GetPublicKey { let mut ui = unsafe { ui.assume_init() }; if req_confirmation { - crate::show_ui!(ui.show(flags), tx) + crate::show_ui!(unsafe { ui.show(flags) }, tx) } else { //we don't need to show so we execute the "accept" already // this way the "formatting" to `buffer` is all in the ui code diff --git a/app/rust/src/handlers/public_key/ui.rs b/app/rust/src/handlers/public_key/ui.rs index e67427ca1..ebb1a66db 100644 --- a/app/rust/src/handlers/public_key/ui.rs +++ b/app/rust/src/handlers/public_key/ui.rs @@ -62,6 +62,7 @@ impl From for Error { } } +#[allow(static_mut_refs)] impl<'ui> AddrUIInitializer<'ui> { /// Create a new `AddrUI` initialized pub fn new(ui: &'ui mut MaybeUninit) -> Self { @@ -190,6 +191,7 @@ pub struct AddrUI { hrp: [u8; ASCII_HRP_MAX_SIZE + 1], //+1 to null terminate just in case } +#[allow(static_mut_refs)] impl AddrUI { //36 (32 + 4 checksum) * log(2, 256) / log(2, 58) ~ 49.1 // so we round up to 50 diff --git a/app/rust/src/handlers/public_key/xpub.rs b/app/rust/src/handlers/public_key/xpub.rs index 5f47b63d7..5aee9177f 100644 --- a/app/rust/src/handlers/public_key/xpub.rs +++ b/app/rust/src/handlers/public_key/xpub.rs @@ -118,7 +118,7 @@ impl ApduHandler for GetExtendedPublicKey { let mut ui = unsafe { ui.assume_init() }; if req_confirmation { - crate::show_ui!(ui.show(flags), tx) + crate::show_ui!(unsafe { ui.show(flags) }, tx) } else { //we don't need to show so we execute the "accept" already // this way the "formatting" to `buffer` is all in the ui code diff --git a/app/rust/src/handlers/wallet_id.rs b/app/rust/src/handlers/wallet_id.rs index 12f6797a6..32ace8525 100644 --- a/app/rust/src/handlers/wallet_id.rs +++ b/app/rust/src/handlers/wallet_id.rs @@ -149,7 +149,7 @@ impl ApduHandler for WalletId { let mut ui = unsafe { ui.assume_init() }; if req_confirmation { - crate::show_ui!(ui.show(flags), tx) + crate::show_ui!(unsafe { ui.show(flags) }, tx) } else { //we don't need to show so we execute the "accept" already // this way the "formatting" to `buffer` is all in the ui code diff --git a/app/rust/src/integration_tests/sign.rs b/app/rust/src/integration_tests/sign.rs index e84b05c59..fd5f583c4 100644 --- a/app/rust/src/integration_tests/sign.rs +++ b/app/rust/src/integration_tests/sign.rs @@ -45,11 +45,11 @@ fn p_create_chain() { let paths = (0..NUMBER_OF_SIGNERS) .map(|_| { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); ( - rng.gen_range(0..MAX_COMPONENT), - rng.gen_range(0..MAX_COMPONENT), + rng.random_range(0..MAX_COMPONENT), + rng.random_range(0..MAX_COMPONENT), ) }) .chunks(MAX_N_SIGNERS); diff --git a/app/rust/src/parser/address.rs b/app/rust/src/parser/address.rs index 997f404bb..9e8d6b230 100644 --- a/app/rust/src/parser/address.rs +++ b/app/rust/src/parser/address.rs @@ -37,7 +37,7 @@ pub const MAX_ADDRESS_ENCODED_LEN: usize = bech32::estimate_size(ASCII_HRP_MAX_S #[cfg_attr(any(test, feature = "derive-debug"), derive(Debug))] pub struct Address<'b>(&'b [u8; ADDRESS_LEN]); -impl<'a> Address<'a> { +impl Address<'_> { // Get the address encoding pub fn encode_into(&self, hrp: &str, encoded: &mut [u8]) -> Result { if hrp.len() > ASCII_HRP_MAX_SIZE { @@ -89,7 +89,7 @@ impl<'b> FromBytes<'b> for Address<'b> { } } -impl<'a> DisplayableItem for Address<'a> { +impl DisplayableItem for Address<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/asset_id.rs b/app/rust/src/parser/asset_id.rs index 3812473e0..a9cfa452f 100644 --- a/app/rust/src/parser/asset_id.rs +++ b/app/rust/src/parser/asset_id.rs @@ -30,7 +30,7 @@ pub const ASSET_ID_LEN: usize = 32; #[cfg_attr(any(test, feature = "derive-debug"), derive(Debug))] pub struct AssetId<'b>(&'b [u8; ASSET_ID_LEN]); -impl<'b> AssetId<'b> { +impl AssetId<'_> { pub fn id(&self) -> &[u8; ASSET_ID_LEN] { self.0 } @@ -55,7 +55,7 @@ impl<'b> AssetId<'b> { } } -impl<'a> DisplayableItem for AssetId<'a> { +impl DisplayableItem for AssetId<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/avm_output.rs b/app/rust/src/parser/avm_output.rs index 9aaf17e6b..877fd1800 100644 --- a/app/rust/src/parser/avm_output.rs +++ b/app/rust/src/parser/avm_output.rs @@ -29,7 +29,7 @@ use zemu_sys::ViewError; #[cfg_attr(test, derive(Debug))] pub struct AvmOutput<'b>(pub Output<'b>); -impl<'b> AvmOutput<'b> { +impl AvmOutput<'_> { pub fn amount(&self) -> Option { self.0.amount() } @@ -85,7 +85,7 @@ impl<'b> AvmOutput<'b> { } } -impl<'b> DisplayableItem for AvmOutput<'b> { +impl DisplayableItem for AvmOutput<'_> { fn num_items(&self) -> Result { // the asset_id is not part of the summary we need from objects of this type, // but could give to higher level objects information to display such information. diff --git a/app/rust/src/parser/chain_id.rs b/app/rust/src/parser/chain_id.rs index 0edf2a870..7e6f5ba8d 100644 --- a/app/rust/src/parser/chain_id.rs +++ b/app/rust/src/parser/chain_id.rs @@ -56,7 +56,7 @@ impl<'b> FromBytes<'b> for ChainId<'b> { } } -impl<'b> DisplayableItem for ChainId<'b> { +impl DisplayableItem for ChainId<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/coreth/data.rs b/app/rust/src/parser/coreth/data.rs index 5011e42dd..0610202e3 100644 --- a/app/rust/src/parser/coreth/data.rs +++ b/app/rust/src/parser/coreth/data.rs @@ -163,7 +163,7 @@ impl<'b> EthData<'b> { } } -impl<'b> DisplayableItem for EthData<'b> { +impl DisplayableItem for EthData<'_> { fn num_items(&self) -> Result { match self { Self::None => Ok(0), diff --git a/app/rust/src/parser/coreth/data/asset_call.rs b/app/rust/src/parser/coreth/data/asset_call.rs index 7a920a8be..cb9e86ca5 100644 --- a/app/rust/src/parser/coreth/data/asset_call.rs +++ b/app/rust/src/parser/coreth/data/asset_call.rs @@ -104,7 +104,7 @@ impl<'b> AssetCall<'b> { } } -impl<'b> DisplayableItem for AssetCall<'b> { +impl DisplayableItem for AssetCall<'_> { fn num_items(&self) -> Result { // transfer/deposit, asset_id and address Ok(1 + 1 + 1) diff --git a/app/rust/src/parser/coreth/data/contract_call.rs b/app/rust/src/parser/coreth/data/contract_call.rs index 5f8dc2389..9fc6cb9db 100644 --- a/app/rust/src/parser/coreth/data/contract_call.rs +++ b/app/rust/src/parser/coreth/data/contract_call.rs @@ -59,7 +59,7 @@ impl<'b> ContractCall<'b> { } } -impl<'b> DisplayableItem for ContractCall<'b> { +impl DisplayableItem for ContractCall<'_> { fn num_items(&self) -> Result { // data Ok(1) diff --git a/app/rust/src/parser/coreth/data/deploy.rs b/app/rust/src/parser/coreth/data/deploy.rs index 6f701be4d..e198fe9da 100644 --- a/app/rust/src/parser/coreth/data/deploy.rs +++ b/app/rust/src/parser/coreth/data/deploy.rs @@ -47,7 +47,7 @@ impl<'b> Deploy<'b> { } } -impl<'b> DisplayableItem for Deploy<'b> { +impl DisplayableItem for Deploy<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/coreth/data/erc20.rs b/app/rust/src/parser/coreth/data/erc20.rs index 8687ab09d..9c3d063e9 100644 --- a/app/rust/src/parser/coreth/data/erc20.rs +++ b/app/rust/src/parser/coreth/data/erc20.rs @@ -69,7 +69,7 @@ pub enum ERC20<'b> { }, } -impl<'b> Transfer<'b> { +impl Transfer<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0xa9, 0x05, 0x9c, 0xbb]); } @@ -100,7 +100,7 @@ impl<'b> FromBytes<'b> for Transfer<'b> { } } -impl<'b> TransferFrom<'b> { +impl TransferFrom<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0x23, 0xb8, 0x72, 0xdd]); } @@ -143,7 +143,7 @@ impl<'b> FromBytes<'b> for TransferFrom<'b> { } } -impl<'b> Approve<'b> { +impl Approve<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0x09, 0x5e, 0xa7, 0xb3]); } @@ -328,7 +328,7 @@ impl<'b> ERC20<'b> { } } -impl<'b> DisplayableItem for ERC20<'b> { +impl DisplayableItem for ERC20<'_> { fn num_items(&self) -> Result { let items = match self { ERC20::Transfer { .. } => 2, diff --git a/app/rust/src/parser/coreth/data/erc721.rs b/app/rust/src/parser/coreth/data/erc721.rs index f3ebc173b..a27c5043f 100644 --- a/app/rust/src/parser/coreth/data/erc721.rs +++ b/app/rust/src/parser/coreth/data/erc721.rs @@ -34,6 +34,7 @@ use crate::{ #[cfg_attr(test, derive(Debug))] pub struct ERC721Info; +#[allow(static_mut_refs)] impl ERC721Info { pub fn get_nft_info() -> Result<&'static NftInfo, ParserError> { match unsafe { NFT_INFO.acquire(Self) } { @@ -60,7 +61,7 @@ pub struct BaseTransfer<'b> { asset_id: AssetId<'b>, } -impl<'b> DisplayableItem for BaseTransfer<'b> { +impl DisplayableItem for BaseTransfer<'_> { fn num_items(&self) -> Result { Ok(3) } @@ -144,7 +145,7 @@ pub struct TransferFrom<'b> { base: BaseTransfer<'b>, } -impl<'b> TransferFrom<'b> { +impl TransferFrom<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0x23, 0xb8, 0x72, 0xdd]); } @@ -175,7 +176,7 @@ pub struct SafeTransferFrom<'b> { data: &'b [u8], } -impl<'b> SafeTransferFrom<'b> { +impl SafeTransferFrom<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0x42, 0x84, 0x2e, 0x0e]); pub const SELECTOR_DATA: u32 = u32::from_be_bytes([0xb8, 0x8d, 0x4f, 0xde]); const CALL_DATA_PREVIEW_LEN: usize = 15; @@ -211,7 +212,7 @@ pub struct Approve<'b> { asset_id: AssetId<'b>, } -impl<'b> Approve<'b> { +impl Approve<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0x09, 0x5e, 0xa7, 0xb3]); } @@ -246,7 +247,7 @@ pub struct ApprovalForAll<'b> { approve: bool, } -impl<'b> ApprovalForAll<'b> { +impl ApprovalForAll<'_> { pub const SELECTOR: u32 = u32::from_be_bytes([0xa2, 0x2c, 0xb4, 0x65]); } @@ -497,7 +498,7 @@ impl<'b> ERC721<'b> { } } -impl<'b> DisplayableItem for ERC721<'b> { +impl DisplayableItem for ERC721<'_> { fn num_items(&self) -> Result { let items = match self { ERC721::TransferFrom(t) => t.base.num_items()?, diff --git a/app/rust/src/parser/coreth/export_tx.rs b/app/rust/src/parser/coreth/export_tx.rs index 7c83ec035..57d3a3374 100644 --- a/app/rust/src/parser/coreth/export_tx.rs +++ b/app/rust/src/parser/coreth/export_tx.rs @@ -317,7 +317,7 @@ impl<'b> ExportTx<'b> { } } -impl<'b> DisplayableItem for ExportTx<'b> { +impl DisplayableItem for ExportTx<'_> { fn num_items(&self) -> Result { //description + number outputs + fee checked_add!(ViewError::Unknown, 2u8, self.num_outputs_items()?) diff --git a/app/rust/src/parser/coreth/import_tx.rs b/app/rust/src/parser/coreth/import_tx.rs index ea4c24698..9afacb60b 100644 --- a/app/rust/src/parser/coreth/import_tx.rs +++ b/app/rust/src/parser/coreth/import_tx.rs @@ -256,7 +256,7 @@ impl<'b> ImportTx<'b> { } } -impl<'b> DisplayableItem for ImportTx<'b> { +impl DisplayableItem for ImportTx<'_> { fn num_items(&self) -> Result { //type + number outputs + fee + description checked_add!(ViewError::Unknown, 3u8, self.num_output_items()?) diff --git a/app/rust/src/parser/coreth/inputs.rs b/app/rust/src/parser/coreth/inputs.rs index 790ef24f7..546d40f8d 100644 --- a/app/rust/src/parser/coreth/inputs.rs +++ b/app/rust/src/parser/coreth/inputs.rs @@ -40,7 +40,7 @@ pub struct EVMInput<'b> { nonce: u64, } -impl<'b> EVMInput<'b> { +impl EVMInput<'_> { pub fn amount(&self) -> Option { Some(self.amount) } @@ -82,7 +82,7 @@ impl<'b> FromBytes<'b> for EVMInput<'b> { } } -impl<'b> DisplayableItem for EVMInput<'b> { +impl DisplayableItem for EVMInput<'_> { fn num_items(&self) -> Result { // expert: address, nonce let expert = if is_app_mode_expert() { diff --git a/app/rust/src/parser/coreth/native.rs b/app/rust/src/parser/coreth/native.rs index 8c6cb635b..3b2159c9f 100644 --- a/app/rust/src/parser/coreth/native.rs +++ b/app/rust/src/parser/coreth/native.rs @@ -189,7 +189,7 @@ pub enum EthTransaction<'b> { Eip2930(Eip2930<'b>), } -impl<'b> EthTransaction<'b> { +impl EthTransaction<'_> { pub fn is_typed_tx(&self) -> bool { !matches!(self, EthTransaction::Legacy(_)) } @@ -276,7 +276,7 @@ impl<'b> FromBytes<'b> for EthTransaction<'b> { } } -impl<'b> DisplayableItem for EthTransaction<'b> { +impl DisplayableItem for EthTransaction<'_> { fn num_items(&self) -> Result { match self { Self::Legacy(t) => t.num_items(), diff --git a/app/rust/src/parser/coreth/native/base.rs b/app/rust/src/parser/coreth/native/base.rs index 58258eb86..862bf248d 100644 --- a/app/rust/src/parser/coreth/native/base.rs +++ b/app/rust/src/parser/coreth/native/base.rs @@ -44,7 +44,7 @@ pub struct BaseLegacy<'b> { pub value: BorrowedU256<'b>, pub data: EthData<'b>, } -impl<'b> BaseLegacy<'b> { +impl BaseLegacy<'_> { #[inline(never)] fn fee(&self) -> Result { let f = u256::pic_from_big_endian(); @@ -357,7 +357,7 @@ impl<'b> FromBytes<'b> for BaseLegacy<'b> { } } -impl<'b> DisplayableItem for BaseLegacy<'b> { +impl DisplayableItem for BaseLegacy<'_> { fn num_items(&self) -> Result { // The type of the data field defines how a transaction // info is displayed. diff --git a/app/rust/src/parser/coreth/native/eip1559.rs b/app/rust/src/parser/coreth/native/eip1559.rs index 8f45a51c6..5b9b9cad2 100644 --- a/app/rust/src/parser/coreth/native/eip1559.rs +++ b/app/rust/src/parser/coreth/native/eip1559.rs @@ -151,7 +151,7 @@ impl<'b> FromBytes<'b> for Eip1559<'b> { } } -impl<'b> Eip1559<'b> { +impl Eip1559<'_> { pub fn chain_id(&self) -> &[u8] { self.chain_id } @@ -417,7 +417,7 @@ impl<'b> Eip1559<'b> { } } -impl<'b> DisplayableItem for Eip1559<'b> { +impl DisplayableItem for Eip1559<'_> { fn num_items(&self) -> Result { // The type of the data field defines how a transaction // info is displayed. diff --git a/app/rust/src/parser/coreth/native/eip2930.rs b/app/rust/src/parser/coreth/native/eip2930.rs index 6b019f793..2bb89c343 100644 --- a/app/rust/src/parser/coreth/native/eip2930.rs +++ b/app/rust/src/parser/coreth/native/eip2930.rs @@ -37,7 +37,7 @@ pub struct Eip2930<'b> { // that they are expected } -impl<'b> Eip2930<'b> { +impl Eip2930<'_> { pub fn chain_id(&self) -> &[u8] { self.chain_id } @@ -93,7 +93,7 @@ impl<'b> FromBytes<'b> for Eip2930<'b> { } } -impl<'b> DisplayableItem for Eip2930<'b> { +impl DisplayableItem for Eip2930<'_> { fn num_items(&self) -> Result { let items = self.base.num_items()?; diff --git a/app/rust/src/parser/coreth/native/legacy.rs b/app/rust/src/parser/coreth/native/legacy.rs index b813a2b94..54457c396 100644 --- a/app/rust/src/parser/coreth/native/legacy.rs +++ b/app/rust/src/parser/coreth/native/legacy.rs @@ -120,7 +120,7 @@ impl<'b> FromBytes<'b> for Legacy<'b> { } } -impl<'b> DisplayableItem for Legacy<'b> { +impl DisplayableItem for Legacy<'_> { fn num_items(&self) -> Result { // chain_id is also mandatory Ok(self.base.num_items()? + 1) diff --git a/app/rust/src/parser/coreth/native/sign_msg.rs b/app/rust/src/parser/coreth/native/sign_msg.rs index f6ca4668a..fccec25c7 100644 --- a/app/rust/src/parser/coreth/native/sign_msg.rs +++ b/app/rust/src/parser/coreth/native/sign_msg.rs @@ -31,7 +31,7 @@ const MAX_ETH_MESSAGE_SIZE: usize = 100; #[cfg_attr(test, derive(Debug))] pub struct PersonalMsg<'b>(Message<'b>); -impl<'b> PersonalMsg<'b> { +impl PersonalMsg<'_> { pub fn msg(&self) -> &[u8] { self.0.msg() } @@ -53,7 +53,7 @@ impl<'b> FromBytes<'b> for PersonalMsg<'b> { } } -impl<'b> DisplayableItem for PersonalMsg<'b> { +impl DisplayableItem for PersonalMsg<'_> { fn num_items(&self) -> Result { checked_add!(ViewError::Unknown, 1u8, self.0.num_items()?) } diff --git a/app/rust/src/parser/coreth/outputs.rs b/app/rust/src/parser/coreth/outputs.rs index 7dd4f9cc8..b62eecd10 100644 --- a/app/rust/src/parser/coreth/outputs.rs +++ b/app/rust/src/parser/coreth/outputs.rs @@ -35,7 +35,7 @@ use crate::{ #[cfg_attr(test, derive(Debug))] pub struct EOutput<'b>(pub Output<'b>); -impl<'b> EOutput<'b> { +impl EOutput<'_> { pub fn amount(&self) -> Option { self.0.amount() } @@ -64,7 +64,7 @@ impl<'b> FromBytes<'b> for EOutput<'b> { } } -impl<'b> EOutput<'b> { +impl EOutput<'_> { fn parse_output_type(input: &[u8]) -> Result> { let (_, variant_type) = be_u32(input)?; @@ -78,7 +78,7 @@ impl<'b> EOutput<'b> { } } -impl<'b> DisplayableItem for EOutput<'b> { +impl DisplayableItem for EOutput<'_> { fn num_items(&self) -> Result { self.0.num_items() } @@ -106,7 +106,7 @@ pub struct EVMOutput<'b> { asset_id: AssetId<'b>, } -impl<'b> EVMOutput<'b> { +impl EVMOutput<'_> { pub fn amount(&self) -> Option { Some(self.amount) } @@ -148,7 +148,7 @@ impl<'b> FromBytes<'b> for EVMOutput<'b> { } } -impl<'b> DisplayableItem for EVMOutput<'b> { +impl DisplayableItem for EVMOutput<'_> { fn num_items(&self) -> Result { // amount, address checked_add!(ViewError::Unknown, 1u8, self.address.num_items()?) diff --git a/app/rust/src/parser/inputs.rs b/app/rust/src/parser/inputs.rs index cf24ecd29..4f39ec376 100644 --- a/app/rust/src/parser/inputs.rs +++ b/app/rust/src/parser/inputs.rs @@ -109,7 +109,7 @@ impl<'b> FromBytes<'b> for TransferableInput<'b> { } } -impl<'b> DisplayableItem for TransferableInput<'b> { +impl DisplayableItem for TransferableInput<'_> { fn num_items(&self) -> Result { checked_add!( ViewError::Unknown, @@ -201,7 +201,7 @@ struct SECPTransferVariant<'b>(InputType, SECPTransferInput<'b>); pub enum Input<'b> { SECPTransfer(SECPTransferInput<'b>), } -impl<'b> Input<'b> { +impl Input<'_> { pub fn amount(&self) -> Option { // follow clippy suggestion,because this enum // holds only one variant, if time comes with @@ -241,7 +241,7 @@ impl<'b> FromBytes<'b> for Input<'b> { } } -impl<'a> DisplayableItem for Input<'a> { +impl DisplayableItem for Input<'_> { fn num_items(&self) -> Result { match self { Self::SECPTransfer(t) => t.num_items(), diff --git a/app/rust/src/parser/inputs/secp_transfer_input.rs b/app/rust/src/parser/inputs/secp_transfer_input.rs index 1018c5ca5..c079d9974 100644 --- a/app/rust/src/parser/inputs/secp_transfer_input.rs +++ b/app/rust/src/parser/inputs/secp_transfer_input.rs @@ -77,7 +77,7 @@ impl<'b> FromBytes<'b> for SECPTransferInput<'b> { } } -impl<'a> DisplayableItem for SECPTransferInput<'a> { +impl DisplayableItem for SECPTransferInput<'_> { fn num_items(&self) -> Result { // output-type, amount, indices checked_add!(ViewError::Unknown, 2u8, self.address_indices.len() as u8) diff --git a/app/rust/src/parser/message.rs b/app/rust/src/parser/message.rs index 0c3c19001..ae019e5f4 100644 --- a/app/rust/src/parser/message.rs +++ b/app/rust/src/parser/message.rs @@ -62,7 +62,7 @@ pub struct Message<'b> { chunk_count: u8, } -impl<'b> Message<'b> { +impl Message<'_> { pub fn msg(&self) -> &[u8] { // wont panic as this check was done when parsing be_u32::<_, ParserError>(self.data) @@ -145,7 +145,7 @@ impl<'b> Message<'b> { for &byte in msg { total_len += if byte.is_ascii() { 1 } else { HEX_REPR_LEN }; } - ((total_len + MSG_MAX_CHUNK_LEN - 1) / MSG_MAX_CHUNK_LEN).min(255) as u8 + (total_len.div_ceil(MSG_MAX_CHUNK_LEN)).min(255) as u8 } } @@ -181,7 +181,7 @@ impl<'b> FromBytes<'b> for Message<'b> { } } -impl<'b> DisplayableItem for Message<'b> { +impl DisplayableItem for Message<'_> { fn num_items(&self) -> Result { Ok(self.chunk_count) } @@ -249,7 +249,7 @@ impl<'b> FromBytes<'b> for AvaxMessage<'b> { } } -impl<'b> DisplayableItem for AvaxMessage<'b> { +impl DisplayableItem for AvaxMessage<'_> { fn num_items(&self) -> Result { // Description + message let items = self.data.num_items()?; diff --git a/app/rust/src/parser/node_id.rs b/app/rust/src/parser/node_id.rs index 736870727..c360f7232 100644 --- a/app/rust/src/parser/node_id.rs +++ b/app/rust/src/parser/node_id.rs @@ -61,7 +61,7 @@ impl<'b> FromBytes<'b> for NodeId<'b> { } } -impl<'b> DisplayableItem for NodeId<'b> { +impl DisplayableItem for NodeId<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/operations.rs b/app/rust/src/parser/operations.rs index b2d634d46..1bdf3ead9 100644 --- a/app/rust/src/parser/operations.rs +++ b/app/rust/src/parser/operations.rs @@ -63,7 +63,7 @@ impl<'b> FromBytes<'b> for TransferableOp<'b> { } } -impl<'b> DisplayableItem for TransferableOp<'b> { +impl DisplayableItem for TransferableOp<'_> { fn num_items(&self) -> Result { self.operation.num_items() } @@ -126,7 +126,7 @@ pub enum Operation<'b> { NFTMint(NFTMintOperation<'b>), } -impl<'b> Operation<'b> { +impl Operation<'_> { pub fn operation_name(&self) -> &'static str { use bolos::{pic_str, PIC}; @@ -196,7 +196,7 @@ impl<'b> FromBytes<'b> for Operation<'b> { } } -impl<'b> DisplayableItem for Operation<'b> { +impl DisplayableItem for Operation<'_> { fn num_items(&self) -> Result { // operation description // + operation items diff --git a/app/rust/src/parser/operations/nft_mint_operation.rs b/app/rust/src/parser/operations/nft_mint_operation.rs index 79e8ef8da..a74b58e45 100644 --- a/app/rust/src/parser/operations/nft_mint_operation.rs +++ b/app/rust/src/parser/operations/nft_mint_operation.rs @@ -41,7 +41,7 @@ pub struct NFTMintOperation<'b> { nft_output: NFTTransferOutput<'b>, } -impl<'b> NFTMintOperation<'b> { +impl NFTMintOperation<'_> { pub const TYPE_ID: u32 = 0x0c; } @@ -75,7 +75,7 @@ impl<'b> FromBytes<'b> for NFTMintOperation<'b> { } } -impl<'a> DisplayableItem for NFTMintOperation<'a> { +impl DisplayableItem for NFTMintOperation<'_> { fn num_items(&self) -> Result { self.nft_output.num_items() } diff --git a/app/rust/src/parser/operations/nft_transfer_operation.rs b/app/rust/src/parser/operations/nft_transfer_operation.rs index 4ded41eda..0ba55a796 100644 --- a/app/rust/src/parser/operations/nft_transfer_operation.rs +++ b/app/rust/src/parser/operations/nft_transfer_operation.rs @@ -41,7 +41,7 @@ pub struct NFTTransferOperation<'b> { pub nft_transfer_output: NFTTransferOutput<'b>, } -impl<'b> NFTTransferOperation<'b> { +impl NFTTransferOperation<'_> { pub const TYPE_ID: u32 = 0x0d; } @@ -74,7 +74,7 @@ impl<'b> FromBytes<'b> for NFTTransferOperation<'b> { } } -impl<'b> DisplayableItem for NFTTransferOperation<'b> { +impl DisplayableItem for NFTTransferOperation<'_> { fn num_items(&self) -> Result { self.nft_transfer_output.num_items() } diff --git a/app/rust/src/parser/operations/secp_mint_operation.rs b/app/rust/src/parser/operations/secp_mint_operation.rs index da6b57546..6f0e67c70 100644 --- a/app/rust/src/parser/operations/secp_mint_operation.rs +++ b/app/rust/src/parser/operations/secp_mint_operation.rs @@ -38,7 +38,7 @@ pub struct SECPMintOperation<'b> { pub mint_output: SECPMintOutput<'b>, pub transfer_output: SECPTransferOutput<'b>, } -impl<'b> SECPMintOperation<'b> { +impl SECPMintOperation<'_> { pub const TYPE_ID: u32 = 8; } @@ -74,7 +74,7 @@ impl<'b> FromBytes<'b> for SECPMintOperation<'b> { } } -impl<'b> DisplayableItem for SECPMintOperation<'b> { +impl DisplayableItem for SECPMintOperation<'_> { fn num_items(&self) -> Result { // operation description // and the transfer to the new mint-output owners diff --git a/app/rust/src/parser/outputs.rs b/app/rust/src/parser/outputs.rs index 9782d4f8d..2881ecdde 100644 --- a/app/rust/src/parser/outputs.rs +++ b/app/rust/src/parser/outputs.rs @@ -295,7 +295,7 @@ impl<'b> Output<'b> { } } -impl<'a> DisplayableItem for Output<'a> { +impl DisplayableItem for Output<'_> { fn num_items(&self) -> Result { match self { Self::SECPTransfer(t) => t.num_items(), diff --git a/app/rust/src/parser/outputs/nft_mint_output.rs b/app/rust/src/parser/outputs/nft_mint_output.rs index 0cd4edfea..7bab019b2 100644 --- a/app/rust/src/parser/outputs/nft_mint_output.rs +++ b/app/rust/src/parser/outputs/nft_mint_output.rs @@ -93,7 +93,7 @@ impl<'b> FromBytes<'b> for NFTMintOutput<'b> { } } -impl<'a> DisplayableItem for NFTMintOutput<'a> { +impl DisplayableItem for NFTMintOutput<'_> { fn num_items(&self) -> Result { // output-type, group_id, threshold and addresses // do not show locktime if it is 0 diff --git a/app/rust/src/parser/outputs/nft_transfer_output.rs b/app/rust/src/parser/outputs/nft_transfer_output.rs index 89f1ff236..224b7832f 100644 --- a/app/rust/src/parser/outputs/nft_transfer_output.rs +++ b/app/rust/src/parser/outputs/nft_transfer_output.rs @@ -115,7 +115,7 @@ impl<'b> FromBytes<'b> for NFTTransferOutput<'b> { } } -impl<'a> DisplayableItem for NFTTransferOutput<'a> { +impl DisplayableItem for NFTTransferOutput<'_> { fn num_items(&self) -> Result { // group_id, payload and addresses checked_add!(ViewError::Unknown, 2u8, self.num_addresses() as u8) diff --git a/app/rust/src/parser/outputs/secp_mint_output.rs b/app/rust/src/parser/outputs/secp_mint_output.rs index bdb0c855f..07cfdc111 100644 --- a/app/rust/src/parser/outputs/secp_mint_output.rs +++ b/app/rust/src/parser/outputs/secp_mint_output.rs @@ -87,7 +87,7 @@ impl<'b> FromBytes<'b> for SECPMintOutput<'b> { } } -impl<'a> DisplayableItem for SECPMintOutput<'a> { +impl DisplayableItem for SECPMintOutput<'_> { fn num_items(&self) -> Result { // output-type, threshold and addresses checked_add!( diff --git a/app/rust/src/parser/outputs/secp_output_owners.rs b/app/rust/src/parser/outputs/secp_output_owners.rs index 4a9e90426..3acf5d448 100644 --- a/app/rust/src/parser/outputs/secp_output_owners.rs +++ b/app/rust/src/parser/outputs/secp_output_owners.rs @@ -108,7 +108,7 @@ impl<'b> FromBytes<'b> for SECPOutputOwners<'b> { } } -impl<'a> DisplayableItem for SECPOutputOwners<'a> { +impl DisplayableItem for SECPOutputOwners<'_> { fn num_items(&self) -> Result { // show an item for each address in the list let items = self.addresses.len() as u8; diff --git a/app/rust/src/parser/outputs/secp_transfer_output.rs b/app/rust/src/parser/outputs/secp_transfer_output.rs index 677db780c..057bde06d 100644 --- a/app/rust/src/parser/outputs/secp_transfer_output.rs +++ b/app/rust/src/parser/outputs/secp_transfer_output.rs @@ -89,7 +89,7 @@ impl<'b> FromBytes<'b> for SECPTransferOutput<'b> { } } -impl<'a> DisplayableItem for SECPTransferOutput<'a> { +impl DisplayableItem for SECPTransferOutput<'_> { fn num_items(&self) -> Result { // According to avalanche team, and to be "compatible" at presentation layer // we should summarize the items to show. As they suggested we only show the amount diff --git a/app/rust/src/parser/proof_of_possession.rs b/app/rust/src/parser/proof_of_possession.rs index 166e3d9b4..47be30245 100644 --- a/app/rust/src/parser/proof_of_possession.rs +++ b/app/rust/src/parser/proof_of_possession.rs @@ -34,7 +34,7 @@ pub struct ProofOfPossession<'b> { signature: &'b [u8; BLS_SIGNATURE_LEN], } -impl<'b> ProofOfPossession<'b> { +impl ProofOfPossession<'_> { pub fn render_address(&self, message: &mut [u8], page: u8) -> Result { let prefix = pic_str!(b"0x"!); // prefix @@ -80,7 +80,7 @@ pub enum BLSSigner<'b> { Proof(ProofOfPossession<'b>), } -impl<'b> BLSSigner<'b> { +impl BLSSigner<'_> { const EMPTY_TYTPE_ID: u32 = 0x1B; const SIGNER_TYTPE_ID: u32 = 0x1C; } @@ -118,7 +118,7 @@ impl<'b> FromBytes<'b> for BLSSigner<'b> { } } -impl<'b> DisplayableItem for BLSSigner<'b> { +impl DisplayableItem for BLSSigner<'_> { fn num_items(&self) -> Result { let i = match &self { BLSSigner::EmptyProof => 0, diff --git a/app/rust/src/parser/pvm_output.rs b/app/rust/src/parser/pvm_output.rs index ef92167b3..3cefbf867 100644 --- a/app/rust/src/parser/pvm_output.rs +++ b/app/rust/src/parser/pvm_output.rs @@ -52,7 +52,7 @@ impl<'b> Deref for PvmOutput<'b> { } } -impl<'b> PvmOutput<'b> { +impl PvmOutput<'_> { const LOCKED_OUTPUT_TAG: u32 = 0x00000016; pub fn amount(&self) -> Option { @@ -130,7 +130,7 @@ impl<'b> PvmOutput<'b> { } } -impl<'b> DisplayableItem for PvmOutput<'b> { +impl DisplayableItem for PvmOutput<'_> { fn num_items(&self) -> Result { // check if output is locked, if so the number of items // includes the locked information diff --git a/app/rust/src/parser/snapshots_common.rs b/app/rust/src/parser/snapshots_common.rs index 0ad269ef3..aaecaf4f5 100644 --- a/app/rust/src/parser/snapshots_common.rs +++ b/app/rust/src/parser/snapshots_common.rs @@ -62,12 +62,12 @@ impl<'b, const T: usize, const M: usize> From<&'b Page> for ReducedPage<'b } } -impl<'b> Debug for ReducedPage<'b> { +impl Debug for ReducedPage<'_> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Display::fmt(self, f) } } -impl<'b> Display for ReducedPage<'b> { +impl Display for ReducedPage<'_> { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!(f, "{:?}: {:?}", self.title, self.message) } diff --git a/app/rust/src/parser/subnet_auth.rs b/app/rust/src/parser/subnet_auth.rs index 22bab30f6..4bda9a687 100644 --- a/app/rust/src/parser/subnet_auth.rs +++ b/app/rust/src/parser/subnet_auth.rs @@ -36,7 +36,7 @@ pub struct SubnetAuth<'b> { pub sig_indices: &'b [[u8; U32_SIZE]], } -impl<'b> SubnetAuth<'b> { +impl SubnetAuth<'_> { pub const TYPE_ID: u32 = 0x0000000a; } diff --git a/app/rust/src/parser/subnet_id.rs b/app/rust/src/parser/subnet_id.rs index d27ef39c5..594bc8932 100644 --- a/app/rust/src/parser/subnet_id.rs +++ b/app/rust/src/parser/subnet_id.rs @@ -64,7 +64,7 @@ impl<'b> FromBytes<'b> for SubnetId<'b> { } } -impl<'b> DisplayableItem for SubnetId<'b> { +impl DisplayableItem for SubnetId<'_> { fn num_items(&self) -> Result { Ok(1) } diff --git a/app/rust/src/parser/transactions.rs b/app/rust/src/parser/transactions.rs index 4ff1666bc..633c25da6 100644 --- a/app/rust/src/parser/transactions.rs +++ b/app/rust/src/parser/transactions.rs @@ -390,7 +390,7 @@ impl<'b> Transaction<'b> { } } -impl<'b> DisplayableItem for Transaction<'b> { +impl DisplayableItem for Transaction<'_> { fn num_items(&self) -> Result { match self { Self::XImport(tx) => tx.num_items(), diff --git a/app/rust/src/parser/transactions/avm/create_asset.rs b/app/rust/src/parser/transactions/avm/create_asset.rs index b13ca2a76..b85680af8 100644 --- a/app/rust/src/parser/transactions/avm/create_asset.rs +++ b/app/rust/src/parser/transactions/avm/create_asset.rs @@ -115,7 +115,7 @@ impl<'b> FromBytes<'b> for CreateAssetTx<'b> { } } -impl<'b> DisplayableItem for CreateAssetTx<'b> { +impl DisplayableItem for CreateAssetTx<'_> { fn num_items(&self) -> Result { // description + asset_name + asset_symbol + denomination + fee Ok(1 + 1 + 1 + 1 + 1) diff --git a/app/rust/src/parser/transactions/avm/export_tx.rs b/app/rust/src/parser/transactions/avm/export_tx.rs index 0cc85b53f..cebe16e60 100644 --- a/app/rust/src/parser/transactions/avm/export_tx.rs +++ b/app/rust/src/parser/transactions/avm/export_tx.rs @@ -51,7 +51,7 @@ impl<'b> FromBytes<'b> for AvmExportTx<'b> { } } -impl<'b> DisplayableItem for AvmExportTx<'b> { +impl DisplayableItem for AvmExportTx<'_> { fn num_items(&self) -> Result { // only support SECP256k1 outputs // and to keep compatibility with the legacy app, diff --git a/app/rust/src/parser/transactions/avm/import_tx.rs b/app/rust/src/parser/transactions/avm/import_tx.rs index 6d01395a9..bae66814f 100644 --- a/app/rust/src/parser/transactions/avm/import_tx.rs +++ b/app/rust/src/parser/transactions/avm/import_tx.rs @@ -64,7 +64,7 @@ impl<'b> AvmImportTx<'b> { } } -impl<'b> DisplayableItem for AvmImportTx<'b> { +impl DisplayableItem for AvmImportTx<'_> { fn num_items(&self) -> Result { // only support SECP256k1 outputs // and to keep compatibility with the legacy app, diff --git a/app/rust/src/parser/transactions/avm/operation_tx.rs b/app/rust/src/parser/transactions/avm/operation_tx.rs index 884db28e5..49ff3c9b6 100644 --- a/app/rust/src/parser/transactions/avm/operation_tx.rs +++ b/app/rust/src/parser/transactions/avm/operation_tx.rs @@ -194,7 +194,7 @@ impl<'b> FromBytes<'b> for OperationTx<'b> { } } -impl<'b> DisplayableItem for OperationTx<'b> { +impl DisplayableItem for OperationTx<'_> { fn num_items(&self) -> Result { // description + let base = self.base_tx.base_outputs_num_items()?; diff --git a/app/rust/src/parser/transactions/pvm/add_delegator.rs b/app/rust/src/parser/transactions/pvm/add_delegator.rs index c56b5dba5..e8b83faeb 100644 --- a/app/rust/src/parser/transactions/pvm/add_delegator.rs +++ b/app/rust/src/parser/transactions/pvm/add_delegator.rs @@ -106,7 +106,7 @@ impl<'b> FromBytes<'b> for AddDelegatorTx<'b> { } } -impl<'b> DisplayableItem for AddDelegatorTx<'b> { +impl DisplayableItem for AddDelegatorTx<'_> { fn num_items(&self) -> Result { // tx_info, base_tx items, validator_items(4), // rewards_to, stake items and fee 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 d51c8e183..dbb259556 100644 --- a/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs +++ b/app/rust/src/parser/transactions/pvm/add_subnet_validator.rs @@ -72,7 +72,7 @@ impl<'b> FromBytes<'b> for AddSubnetValidatorTx<'b> { } } -impl<'b> DisplayableItem for AddSubnetValidatorTx<'b> { +impl DisplayableItem for AddSubnetValidatorTx<'_> { fn num_items(&self) -> Result { // tx_info, validator_items(4), // subnet_id and fee diff --git a/app/rust/src/parser/transactions/pvm/add_validator.rs b/app/rust/src/parser/transactions/pvm/add_validator.rs index 0442a3add..2693c576e 100644 --- a/app/rust/src/parser/transactions/pvm/add_validator.rs +++ b/app/rust/src/parser/transactions/pvm/add_validator.rs @@ -112,7 +112,7 @@ impl<'b> FromBytes<'b> for AddValidatorTx<'b> { } } -impl<'b> DisplayableItem for AddValidatorTx<'b> { +impl DisplayableItem for AddValidatorTx<'_> { fn num_items(&self) -> Result { // tx_info, base_tx items, validator_items(4), // fee, fee_delegation, rewards_to and stake items 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 169b9e9ad..1af117fcf 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 @@ -110,7 +110,7 @@ impl<'b> FromBytes<'b> for AddPermissionlessDelegatorTx<'b> { } } -impl<'b> DisplayableItem for AddPermissionlessDelegatorTx<'b> { +impl DisplayableItem for AddPermissionlessDelegatorTx<'_> { fn num_items(&self) -> Result { // tx_info, base_tx items, validator_items(4), // subnet id, rewards_to, 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 2b190f45b..290f930e0 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 @@ -131,7 +131,7 @@ impl<'b> FromBytes<'b> for AddPermissionlessValidatorTx<'b> { } } -impl<'b> DisplayableItem for AddPermissionlessValidatorTx<'b> { +impl DisplayableItem for AddPermissionlessValidatorTx<'_> { fn num_items(&self) -> Result { // tx_info, base_tx items, validator_items(4), // subnet id, validator_rewards_to, delegator_rewards_to, 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 25f7ff318..4dddf94be 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 @@ -135,7 +135,7 @@ impl<'b> FromBytes<'b> for ConvertSubnetToL1Tx<'b> { } } -impl<'b> DisplayableItem for ConvertSubnetToL1Tx<'b> { +impl DisplayableItem for ConvertSubnetToL1Tx<'_> { fn num_items(&self) -> Result { // tx description, chain_id, address, fee, validators let num_validators = BASE_FIELDS_LEN + self.num_validators() as u8; 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 4a9eb946e..947fc37ea 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 @@ -86,7 +86,7 @@ impl<'b> FromBytes<'b> for DisableL1ValidatorTx<'b> { } } -impl<'b> DisplayableItem for DisableL1ValidatorTx<'b> { +impl DisplayableItem for DisableL1ValidatorTx<'_> { fn num_items(&self) -> Result { // tx description, validator id, fee Ok(3) 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 bb6ff62d5..cec02fe2b 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 @@ -92,7 +92,7 @@ impl<'b> FromBytes<'b> for IncreaseL1ValidatorBalanceTx<'b> { } } -impl<'b> DisplayableItem for IncreaseL1ValidatorBalanceTx<'b> { +impl DisplayableItem for IncreaseL1ValidatorBalanceTx<'_> { fn num_items(&self) -> Result { // tx_info, validation_id, amount, fee Ok(4u8) 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 348a900f5..dcc76eed3 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 @@ -133,7 +133,7 @@ impl<'b> RegisterL1ValidatorTx<'b> { } } -impl<'b> DisplayableItem for RegisterL1ValidatorTx<'b> { +impl DisplayableItem for RegisterL1ValidatorTx<'_> { fn num_items(&self) -> Result { // tx_info, node_id, weight, balance, fee, remaining_balance_owner, disable_owner let n_addresses = 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 c5aaf497b..15c6a3534 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 @@ -72,7 +72,7 @@ impl<'b> FromBytes<'b> for RemoveSubnetValidatorTx<'b> { } } -impl<'b> DisplayableItem for RemoveSubnetValidatorTx<'b> { +impl DisplayableItem for RemoveSubnetValidatorTx<'_> { fn num_items(&self) -> Result { // tx_info, node_id_items(1), // subnet_id and fee 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 e1381894c..49b9f0193 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 @@ -91,7 +91,7 @@ impl<'b> SetL1ValidatorWeightTx<'b> { } } -impl<'b> DisplayableItem for SetL1ValidatorWeightTx<'b> { +impl DisplayableItem for SetL1ValidatorWeightTx<'_> { fn num_items(&self) -> Result { // tx_info, validation_id, nonce, weight Ok(4u8) 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 da7d7cbbe..54c1fc8f7 100644 --- a/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs +++ b/app/rust/src/parser/transactions/pvm/banff/transform_subnet.rs @@ -136,7 +136,7 @@ impl<'b> FromBytes<'b> for TransformSubnetTx<'b> { } } -impl<'b> TransformSubnetTx<'b> { +impl TransformSubnetTx<'_> { fn fee(&self) -> Result { let sum_inputs = self.base_tx.sum_inputs_amount()?; @@ -269,7 +269,7 @@ impl<'b> TransformSubnetTx<'b> { } } -impl<'b> DisplayableItem for TransformSubnetTx<'b> { +impl DisplayableItem for TransformSubnetTx<'_> { fn num_items(&self) -> Result { let num_expert_items = if is_app_mode_expert() { // init/max supply + min/max consumption rate diff --git a/app/rust/src/parser/transactions/pvm/base_tx.rs b/app/rust/src/parser/transactions/pvm/base_tx.rs index 253d6607e..a352f4162 100644 --- a/app/rust/src/parser/transactions/pvm/base_tx.rs +++ b/app/rust/src/parser/transactions/pvm/base_tx.rs @@ -64,7 +64,7 @@ impl<'b> FromBytes<'b> for PvmBaseTx<'b> { } } -impl<'b> DisplayableItem for PvmBaseTx<'b> { +impl DisplayableItem for PvmBaseTx<'_> { fn num_items(&self) -> Result { let outputs = self.base.base_outputs_num_items()?; 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 f14cdec16..bc7a62ad6 100644 --- a/app/rust/src/parser/transactions/pvm/create_chain_tx.rs +++ b/app/rust/src/parser/transactions/pvm/create_chain_tx.rs @@ -121,7 +121,7 @@ impl<'b> FromBytes<'b> for CreateChainTx<'b> { } } -impl<'b> DisplayableItem for CreateChainTx<'b> { +impl DisplayableItem for CreateChainTx<'_> { fn num_items(&self) -> Result { // we need to show: // tx description, SubnetID, ChainName, VMID, GenesisDataHash 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 822b33611..c9371b0b4 100644 --- a/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs +++ b/app/rust/src/parser/transactions/pvm/create_subnet_tx.rs @@ -93,7 +93,7 @@ impl<'b> FromBytes<'b> for CreateSubnetTx<'b> { } } -impl<'b> DisplayableItem for CreateSubnetTx<'b> { +impl DisplayableItem for CreateSubnetTx<'_> { fn num_items(&self) -> Result { checked_add!(ViewError::Unknown, 2u8, self.owners.num_items()?) } diff --git a/app/rust/src/parser/transactions/pvm/export_tx.rs b/app/rust/src/parser/transactions/pvm/export_tx.rs index ef3ff1ec2..37444f133 100644 --- a/app/rust/src/parser/transactions/pvm/export_tx.rs +++ b/app/rust/src/parser/transactions/pvm/export_tx.rs @@ -69,7 +69,7 @@ impl<'b> FromBytes<'b> for PvmExportTx<'b> { } } -impl<'b> DisplayableItem for PvmExportTx<'b> { +impl DisplayableItem for PvmExportTx<'_> { fn num_items(&self) -> Result { let outputs = self.0.num_outputs_items()?; diff --git a/app/rust/src/parser/transactions/pvm/import_tx.rs b/app/rust/src/parser/transactions/pvm/import_tx.rs index 36e08f770..b667f1fad 100644 --- a/app/rust/src/parser/transactions/pvm/import_tx.rs +++ b/app/rust/src/parser/transactions/pvm/import_tx.rs @@ -64,7 +64,7 @@ impl<'b> PvmImportTx<'b> { } } -impl<'b> DisplayableItem for PvmImportTx<'b> { +impl DisplayableItem for PvmImportTx<'_> { fn num_items(&self) -> Result { // only support SECP256k1 outputs // and to keep compatibility with the legacy app, diff --git a/app/rust/src/parser/transactions/transfer.rs b/app/rust/src/parser/transactions/transfer.rs index ef9af275d..01223ec66 100644 --- a/app/rust/src/parser/transactions/transfer.rs +++ b/app/rust/src/parser/transactions/transfer.rs @@ -31,7 +31,7 @@ pub struct Transfer<'b> { base: BaseTxFields<'b, AvmOutput<'b>>, } -impl<'b> Transfer<'b> { +impl Transfer<'_> { pub fn disable_output_if(&mut self, address: &[u8]) { self.base.disable_output_if(address); } @@ -139,7 +139,7 @@ impl<'b> FromBytes<'b> for Transfer<'b> { } } -impl<'b> DisplayableItem for Transfer<'b> { +impl DisplayableItem for Transfer<'_> { fn num_items(&self) -> Result { checked_add!(ViewError::Unknown, 2u8, self.base.base_outputs_num_items()?) } diff --git a/app/rust/src/parser/transactions/tx_header.rs b/app/rust/src/parser/transactions/tx_header.rs index d47f2879a..8f883ed28 100644 --- a/app/rust/src/parser/transactions/tx_header.rs +++ b/app/rust/src/parser/transactions/tx_header.rs @@ -27,7 +27,7 @@ pub struct Header<'b> { pub blockchain_id: &'b [u8; BLOCKCHAIN_ID_LEN], } -impl<'b> Header<'b> { +impl Header<'_> { pub fn network_info(&self) -> Result { NetworkInfo::try_from((self.network_id, self.blockchain_id)) } diff --git a/app/rust/src/parser/utils.rs b/app/rust/src/parser/utils.rs index 4babba79f..49e038ab7 100644 --- a/app/rust/src/parser/utils.rs +++ b/app/rust/src/parser/utils.rs @@ -288,10 +288,10 @@ mod tests { ]; fn create_number_table() -> std::vec::Vec<(u64, String)> { - let mut rng = rand::thread_rng(); + let mut rng = rand::rng(); (0..200) .map(|_| { - let num = rng.gen_range(0..u64::MAX); + let num = rng.random_range(0..u64::MAX); let string = format!("{}", num); (num, string) }) diff --git a/app/rust/src/parser/validator.rs b/app/rust/src/parser/validator.rs index 9249e7fd7..5b8906977 100644 --- a/app/rust/src/parser/validator.rs +++ b/app/rust/src/parser/validator.rs @@ -35,13 +35,13 @@ pub struct Validator<'b, W = Stake> { pub weight: W, } -impl<'b, W: StakeTrait> Validator<'b, W> { +impl Validator<'_, W> { pub fn stake(&self) -> u64 { self.weight.stake() } } -impl<'b, W: WeightTrait> Validator<'b, W> { +impl Validator<'_, W> { pub fn weight(&self) -> u64 { self.weight.weight() } @@ -79,7 +79,7 @@ impl<'b, W: FromBytes<'b>> FromBytes<'b> for Validator<'b, W> { } } -impl<'b, W: DisplayableItem> DisplayableItem for Validator<'b, W> { +impl DisplayableItem for Validator<'_, W> { fn num_items(&self) -> Result { // node_id(1), start_time, endtime and weight(1) let items = self.node_id.num_items()?; diff --git a/app/rust/src/utils.rs b/app/rust/src/utils.rs index 770de1bdb..0308e185f 100644 --- a/app/rust/src/utils.rs +++ b/app/rust/src/utils.rs @@ -213,15 +213,18 @@ mod maybe_null_terminated_to_string { /// sets `tx` to the amount returned if given, /// otherwise tx is returned only on success and discarded on failure macro_rules! show_ui { - ($show:expr, $tx:ident) => { - match unsafe { $show } { + ($show:expr, $tx:ident) => {{ + let result = $show; + match result { Ok((size, err)) if err == $crate::constants::ApduError::Success as u16 => { - *$tx = size as _; + let size = size as _; + *$tx = size; Ok(()) } Ok((size, err)) => { use core::convert::TryInto; - *$tx = size as _; + let size = size as _; + *$tx = size; match err.try_into() { Ok(err) => Err(err), @@ -230,9 +233,10 @@ macro_rules! show_ui { } Err(_) => Err($crate::constants::ApduError::ExecutionError), } - }; - ($show:expr) => { - match unsafe { $show } { + }}; + ($show:expr) => {{ + let result = $show; + match result { Ok((size, err)) if err == $crate::constants::ApduError::Success as u16 => Ok(size as _), Ok((_, err)) => { use core::convert::TryInto; @@ -244,5 +248,5 @@ macro_rules! show_ui { } Err(_) => Err($crate::constants::ApduError::ExecutionError), } - }; + }}; } diff --git a/app/rust/src/utils/buffer_upload.rs b/app/rust/src/utils/buffer_upload.rs index bd5be86a5..0adf04f61 100644 --- a/app/rust/src/utils/buffer_upload.rs +++ b/app/rust/src/utils/buffer_upload.rs @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ +#![allow(static_mut_refs)] use bolos::{nvm::NVMError, pic::PIC}; use crate::{ diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index fa96385ebd2704a39b8376cc664e6092a6a0b5a9..f2a16e5da4786f949f8a7bc9985c6f56f84036a5 100644 GIT binary patch literal 9205 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 G@c#ffg|aRH literal 9275 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 k<1%)dF9xFUK>z>% diff --git a/tests_zemu/snapshots/sp-mainmenu/00004.png b/tests_zemu/snapshots/sp-mainmenu/00004.png index 9d700e694d64ec7258eddc51297460e0f65540d1..5493a7e1edf19bd515acf97f478af34e0f0184b0 100644 GIT binary patch delta 350 zcmey)^pk0VO1*=pi(^Q|oVPav`I;4Y8WK0ZQM>csWAACXGg53~l3t9T>-}ekO(|=* zoXgCB0R0L|N{{Mu`pfb@ezKWaRz2?@|983SUwefVTb^XcDBhhdKZB*iqbBFlnynjU zuFbyB;ZgUs@YVP8AE$koD!*eh(>E!Zc^;3qvTE0#vC8DXr@UZO^>yZ3hyFZwd(U*` zi-Ek%e>Rii*_Bf+i-`E|_}Q~RwfkVKmh_kNyS=zCl=5WRpO(EgDMGwhDuGq}k@jId ztIV0Zo!QeSo!mFOIb?Ee`jrHgw1pER+TEip_FlW2__X)&A=~+me>SX;Nq#$P8^gN( z#n~eBZkn1~dJAM#rlS0?_&91aDP7Edr$bn zrNc#qb9i4on^rj`n9EBzZ|2A8kJ1dhl3V{hUiXP}#xAz4^S|=Fo)RHmERnz({z&?; zp4Ez(%bnSuDH#9CD{Gr|vHX~fixRi%BRiRuGWXn1lz!RxPkYL4D_vI$^}G73j?dBU zdb&&Y?ut#h?CPP{-bEbe+Hv*u^z|1F8SmcIye1nQ(EiDkVcjiX*{OG59=>%f=32(V r^(yN<>c8H6yiDw)1Q#M04&1L|ei_W=-+$uZYLKX>tDnm{r-UW|MW>_9 diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 9d700e694d64ec7258eddc51297460e0f65540d1..5493a7e1edf19bd515acf97f478af34e0f0184b0 100644 GIT binary patch delta 350 zcmey)^pk0VO1*=pi(^Q|oVPav`I;4Y8WK0ZQM>csWAACXGg53~l3t9T>-}ekO(|=* zoXgCB0R0L|N{{Mu`pfb@ezKWaRz2?@|983SUwefVTb^XcDBhhdKZB*iqbBFlnynjU zuFbyB;ZgUs@YVP8AE$koD!*eh(>E!Zc^;3qvTE0#vC8DXr@UZO^>yZ3hyFZwd(U*` zi-Ek%e>Rii*_Bf+i-`E|_}Q~RwfkVKmh_kNyS=zCl=5WRpO(EgDMGwhDuGq}k@jId ztIV0Zo!QeSo!mFOIb?Ee`jrHgw1pER+TEip_FlW2__X)&A=~+me>SX;Nq#$P8^gN( z#n~eBZkn1~dJAM#rlS0?_&91aDP7Edr$bn zrNc#qb9i4on^rj`n9EBzZ|2A8kJ1dhl3V{hUiXP}#xAz4^S|=Fo)RHmERnz({z&?; zp4Ez(%bnSuDH#9CD{Gr|vHX~fixRi%BRiRuGWXn1lz!RxPkYL4D_vI$^}G73j?dBU zdb&&Y?ut#h?CPP{-bEbe+Hv*u^z|1F8SmcIye1nQ(EiDkVcjiX*{OG59=>%f=32(V r^(yN<>c8H6yiDw)1Q#M04&1L|ei_W=-+$uZYLKX>tDnm{r-UW|MW>_9 diff --git a/tests_zemu/snapshots/st-mainmenu/00004.png b/tests_zemu/snapshots/st-mainmenu/00004.png index 9cea655ceaeff93f5e71568a0e27411c1e739a85..35aae78b4237bdf76fbe0f0ed3ddb3bfc839c3d3 100644 GIT binary patch delta 8650 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 delta 8682 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 E4`kViY5)KL diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 9d700e694d64ec7258eddc51297460e0f65540d1..5493a7e1edf19bd515acf97f478af34e0f0184b0 100644 GIT binary patch delta 350 zcmey)^pk0VO1*=pi(^Q|oVPav`I;4Y8WK0ZQM>csWAACXGg53~l3t9T>-}ekO(|=* zoXgCB0R0L|N{{Mu`pfb@ezKWaRz2?@|983SUwefVTb^XcDBhhdKZB*iqbBFlnynjU zuFbyB;ZgUs@YVP8AE$koD!*eh(>E!Zc^;3qvTE0#vC8DXr@UZO^>yZ3hyFZwd(U*` zi-Ek%e>Rii*_Bf+i-`E|_}Q~RwfkVKmh_kNyS=zCl=5WRpO(EgDMGwhDuGq}k@jId ztIV0Zo!QeSo!mFOIb?Ee`jrHgw1pER+TEip_FlW2__X)&A=~+me>SX;Nq#$P8^gN( z#n~eBZkn1~dJAM#rlS0?_&91aDP7Edr$bn zrNc#qb9i4on^rj`n9EBzZ|2A8kJ1dhl3V{hUiXP}#xAz4^S|=Fo)RHmERnz({z&?; zp4Ez(%bnSuDH#9CD{Gr|vHX~fixRi%BRiRuGWXn1lz!RxPkYL4D_vI$^}G73j?dBU zdb&&Y?ut#h?CPP{-bEbe+Hv*u^z|1F8SmcIye1nQ(EiDkVcjiX*{OG59=>%f=32(V r^(yN<>c8H6yiDw)1Q#M04&1L|ei_W=-+$uZYLKX>tDnm{r-UW|MW>_9 diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 9d700e694d64ec7258eddc51297460e0f65540d1..5493a7e1edf19bd515acf97f478af34e0f0184b0 100644 GIT binary patch delta 350 zcmey)^pk0VO1*=pi(^Q|oVPav`I;4Y8WK0ZQM>csWAACXGg53~l3t9T>-}ekO(|=* zoXgCB0R0L|N{{Mu`pfb@ezKWaRz2?@|983SUwefVTb^XcDBhhdKZB*iqbBFlnynjU zuFbyB;ZgUs@YVP8AE$koD!*eh(>E!Zc^;3qvTE0#vC8DXr@UZO^>yZ3hyFZwd(U*` zi-Ek%e>Rii*_Bf+i-`E|_}Q~RwfkVKmh_kNyS=zCl=5WRpO(EgDMGwhDuGq}k@jId ztIV0Zo!QeSo!mFOIb?Ee`jrHgw1pER+TEip_FlW2__X)&A=~+me>SX;Nq#$P8^gN( z#n~eBZkn1~dJAM#rlS0?_&91aDP7Edr$bn zrNc#qb9i4on^rj`n9EBzZ|2A8kJ1dhl3V{hUiXP}#xAz4^S|=Fo)RHmERnz({z&?; zp4Ez(%bnSuDH#9CD{Gr|vHX~fixRi%BRiRuGWXn1lz!RxPkYL4D_vI$^}G73j?dBU zdb&&Y?ut#h?CPP{-bEbe+Hv*u^z|1F8SmcIye1nQ(EiDkVcjiX*{OG59=>%f=32(V r^(yN<>c8H6yiDw)1Q#M04&1L|ei_W=-+$uZYLKX>tDnm{r-UW|MW>_9