--- a/crates/evm-coder/procedural/src/solidity_interface.rs +++ b/crates/evm-coder/procedural/src/solidity_interface.rs @@ -648,20 +648,15 @@ .unwrap_or_else(|| cases::camelcase::to_camel_case(&ident.to_string())); let mut selector_str = camel_name.clone(); selector_str.push('('); - let mut normal_args_count = 0u32; - let mut has_value_args = false; - for arg in args.iter() { - if arg.is_value() { - has_value_args = true; - } else if !arg.is_special() { - if normal_args_count != 0 { - selector_str.push(','); - } - write!(selector_str, "{}", arg.selector_ty()).unwrap(); - normal_args_count = normal_args_count.saturating_add(1); + let mut has_normal_args = false; + for (i, arg) in args.iter().filter(|arg| !arg.is_special()).enumerate() { + if i != 0 { + selector_str.push(','); } + write!(selector_str, "{}", arg.selector_ty()).unwrap(); + has_normal_args = true; } - let has_normal_args = normal_args_count > 0; + let has_value_args = args.iter().any(|a| a.is_value()); selector_str.push(')'); let selector = fn_selector_str(&selector_str); --- a/pallets/unique/src/eth/mod.rs +++ b/pallets/unique/src/eth/mod.rs @@ -173,13 +173,7 @@ base_uri_value, add_properties, )?; - let value = value.as_u128(); - let creation_price: Result = T::CollectionCreationPrice::get() - .try_into() - .map_err(|_| "collection creation price should be convertible to u128".into()); - if value != creation_price? { - return Err("Sent amount not equals to collection creation price".into()); - } + check_sent_amount_equals_collection_creation_price::(value)?; let collection_helpers_address = T::CrossAccountId::from_eth(::ContractAddress::get()); let collection_id = T::CollectionDispatch::create(caller.clone(), collection_helpers_address, data) @@ -188,6 +182,18 @@ Ok(address) } +fn check_sent_amount_equals_collection_creation_price(value: value) -> Result<()> { + let value = value.as_u128(); + let creation_price: u128 = T::CollectionCreationPrice::get() + .try_into() + .map_err(|_| ()) // workaround for `expect` requiring `Debug` trait + .expect("Collection creation price should be convertible to u128"); + if value != creation_price { + return Err(format!("Sent amount not equals to collection creation price ({0})", creation_price).into()); + } + Ok(()) +} + /// @title Contract, which allows users to operate with collections #[solidity_interface(name = CollectionHelpers, events(CollectionHelpersEvents))] impl EvmCollectionHelpers @@ -218,14 +224,7 @@ Default::default(), false, )?; - let value = value.as_u128(); - let creation_price: Result = T::CollectionCreationPrice::get() - .try_into() - .map_err(|_| "collection creation price should be convertible to u128".into()); - let creation_price = creation_price?; - if value != creation_price { - return Err(format!("Sent amount not equals to collection creation price ({0})", creation_price).into()); - } + check_sent_amount_equals_collection_creation_price::(value)?; let collection_helpers_address = T::CrossAccountId::from_eth(::ContractAddress::get()); let collection_id = T::CollectionDispatch::create(caller, collection_helpers_address, data).map_err(dispatch_to_evm::)?; @@ -255,13 +254,7 @@ base_uri_value, true, )?; - let value = value.as_u128(); - let creation_price: Result = T::CollectionCreationPrice::get() - .try_into() - .map_err(|_| "collection creation price should be convertible to u128".into()); - if value != creation_price? { - return Err("Sent amount not equals to collection creation price".into()); - } + check_sent_amount_equals_collection_creation_price::(value)?; let collection_helpers_address = T::CrossAccountId::from_eth(::ContractAddress::get()); let collection_id = T::CollectionDispatch::create(caller, collection_helpers_address, data) .map_err(pallet_evm_coder_substrate::dispatch_to_evm::)?;