--- a/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs +++ b/crates/evm-coder/procedural/src/abi_derive/derive_enum.rs @@ -47,11 +47,10 @@ ) } -pub fn impl_enum_abi_type(name: &syn::Ident, option_count: usize) -> proc_macro2::TokenStream { +pub fn impl_enum_abi_type(name: &syn::Ident) -> proc_macro2::TokenStream { quote! { impl ::evm_coder::abi::AbiType for #name { const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = ::SIGNATURE; - const FIELDS_COUNT: usize = #option_count; fn is_dynamic() -> bool { ::is_dynamic() --- a/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs +++ b/crates/evm-coder/procedural/src/abi_derive/derive_struct.rs @@ -100,12 +100,10 @@ pub fn impl_struct_abi_type( name: &syn::Ident, tuple_type: proc_macro2::TokenStream, - fields_count: usize, ) -> proc_macro2::TokenStream { quote! { impl ::evm_coder::abi::AbiType for #name { const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <#tuple_type as ::evm_coder::abi::AbiType>::SIGNATURE; - const FIELDS_COUNT: usize = #fields_count; fn is_dynamic() -> bool { <#tuple_type as ::evm_coder::abi::AbiType>::is_dynamic() } --- a/crates/evm-coder/procedural/src/abi_derive/mod.rs +++ b/crates/evm-coder/procedural/src/abi_derive/mod.rs @@ -49,7 +49,7 @@ let struct_from_tuple = struct_from_tuple(name, is_named_fields, field_names.clone()); let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name); - let abi_type = impl_struct_abi_type(name, tuple_type.clone(), params_count); + let abi_type = impl_struct_abi_type(name, tuple_type.clone()); let abi_read = impl_struct_abi_read(name, tuple_type, tuple_names, struct_from_tuple); let abi_write = impl_struct_abi_write(name, is_named_fields, tuple_ref_type, tuple_data); let solidity_type = impl_struct_solidity_type(name, field_types.clone(), params_count); @@ -83,7 +83,7 @@ let from = impl_enum_from_u8(name, enum_options.clone()); let solidity_option = impl_solidity_option(name, enum_options.clone()); let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name); - let abi_type = impl_enum_abi_type(name, option_count); + let abi_type = impl_enum_abi_type(name); let abi_read = impl_enum_abi_read(name); let abi_write = impl_enum_abi_write(name); let solidity_type = impl_enum_solidity_type(name); --- a/crates/evm-coder/src/abi/impls.rs +++ b/crates/evm-coder/src/abi/impls.rs @@ -16,7 +16,6 @@ impl AbiType for $ty { const SIGNATURE: SignatureUnit = make_signature!(new fixed(stringify!($name))); - const FIELDS_COUNT: usize = 1; fn is_dynamic() -> bool { $dynamic @@ -97,7 +96,6 @@ impl AbiType for &T { const SIGNATURE: SignatureUnit = T::SIGNATURE; - const FIELDS_COUNT: usize = T::FIELDS_COUNT; fn is_dynamic() -> bool { T::is_dynamic() @@ -127,7 +125,6 @@ impl AbiType for Vec { const SIGNATURE: SignatureUnit = make_signature!(new nameof(T::SIGNATURE) fixed("[]")); - const FIELDS_COUNT: usize = 1; fn is_dynamic() -> bool { true @@ -203,7 +200,6 @@ shift_left(1) fixed(")") ); - const FIELDS_COUNT: usize = count!($($ident)*); fn is_dynamic() -> bool { false --- a/crates/evm-coder/src/abi/traits.rs +++ b/crates/evm-coder/src/abi/traits.rs @@ -10,9 +10,6 @@ /// Signature for Etherium ABI. const SIGNATURE: SignatureUnit; - /// Count of enum variants or struct fields. - const FIELDS_COUNT: usize; - /// Signature as str. fn as_str() -> &'static str { from_utf8(&Self::SIGNATURE.data[..Self::SIGNATURE.len]).expect("bad utf-8") --- a/crates/evm-coder/tests/abi_derive_generation.rs +++ b/crates/evm-coder/tests/abi_derive_generation.rs @@ -173,50 +173,6 @@ } #[test] - fn impl_abi_type_fields_count() { - assert_eq!( - ::FIELDS_COUNT, - 1 - ); - assert_eq!( - ::FIELDS_COUNT, - 1 - ); - assert_eq!( - ::FIELDS_COUNT, - 2 - ); - assert_eq!( - ::FIELDS_COUNT, - 2 - ); - assert_eq!( - ::FIELDS_COUNT, - 2 - ); - assert_eq!( - ::FIELDS_COUNT, - 1 - ); - assert_eq!( - ::FIELDS_COUNT, - 2 - ); - assert_eq!( - ::FIELDS_COUNT, - 1 - ); - assert_eq!( - ::FIELDS_COUNT, - 2 - ); - assert_eq!( - ::FIELDS_COUNT, - 3 - ); - } - - #[test] fn impl_abi_type_is_dynamic() { assert_eq!( ::is_dynamic(), --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -347,6 +347,10 @@ ) -> Result { self.consume_store_reads_and_writes(1, 1)?; + if !limit.has_value() { + return Err(Error::Revert("user can't disable limits".into())); + } + let caller = T::CrossAccountId::from_eth(caller); >::update_limits(&caller, self, limit.try_into()?).map_err(dispatch_to_evm::) } --- a/pallets/common/src/eth.rs +++ b/pallets/common/src/eth.rs @@ -264,16 +264,17 @@ value: value.into(), } } + + /// Whether the field contains a value. + pub fn has_value(&self) -> bool { + self.value.status + } } impl TryInto for CollectionLimit { type Error = evm_coder::execution::Error; fn try_into(self) -> Result { - if !self.value.status { - return Err(Self::Error::Revert("user can't disable limits".into())); - } - let value = self.value.value.try_into().map_err(|error| { Self::Error::Revert(format!( "can't convert value to u32 \"{}\" because: \"{error}\"", @@ -433,17 +434,6 @@ let mut perms = Vec::new(); for TokenPropertyPermission { key, permissions } in permissions { - if permissions.len() > ::FIELDS_COUNT { - return Err(alloc::format!( - "Actual number of fields {} for {}, which exceeds the maximum value of {}", - permissions.len(), - stringify!(EthTokenPermissions), - ::FIELDS_COUNT - ) - .as_str() - .into()); - } - let token_permission = PropertyPermission::from_vec(permissions); perms.push(up_data_structs::PropertyKeyPermission { --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -38,6 +38,7 @@ use pallet_common::{ CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations, erc::{CommonEvmHandler, PrecompileResult, CollectionCall, static_property::key}, + eth, }; use pallet_evm::{account::CrossAccountId, PrecompileHandle}; use pallet_evm_coder_substrate::call; @@ -93,25 +94,21 @@ fn set_token_property_permissions( &mut self, caller: caller, - permissions: Vec, + permissions: Vec, ) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); - let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions( - permissions, - )?; + let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?; >::set_token_property_permissions(self, &caller, perms) .map_err(dispatch_to_evm::) } /// @notice Get permissions for token properties. - fn token_property_permissions( - &self, - ) -> Result> { + fn token_property_permissions(&self) -> Result> { let perms = >::token_property_permission(self.id); Ok(perms .into_iter() - .map(pallet_common::eth::TokenPropertyPermission::from) + .map(eth::TokenPropertyPermission::from) .collect()) } @@ -159,7 +156,7 @@ &mut self, caller: caller, token_id: uint256, - properties: Vec, + properties: Vec, ) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?; @@ -170,7 +167,7 @@ let properties = properties .into_iter() - .map(pallet_common::eth::Property::try_into) + .map(eth::Property::try_into) .collect::>>()?; >::set_token_properties( @@ -753,9 +750,9 @@ /// Returns the owner (in cross format) of the token. /// /// @param tokenId Id for the token. - fn cross_owner_of(&self, token_id: uint256) -> Result { + fn cross_owner_of(&self, token_id: uint256) -> Result { Self::token_owner(&self, token_id.try_into()?) - .map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::(&o)) + .map(|o| eth::CrossAddress::from_sub_cross_account::(&o)) .ok_or(Error::Revert("key too large".into())) } @@ -764,11 +761,7 @@ /// @param tokenId Id for the token. /// @param keys Properties keys. Empty keys for all propertyes. /// @return Vector of properties key/value pairs. - fn properties( - &self, - token_id: uint256, - keys: Vec, - ) -> Result> { + fn properties(&self, token_id: uint256, keys: Vec) -> Result> { let keys = keys .into_iter() .map(|key| { @@ -784,7 +777,7 @@ if keys.is_empty() { None } else { Some(keys) }, ) .into_iter() - .map(pallet_common::eth::Property::try_from) + .map(eth::Property::try_from) .collect::>>() } @@ -798,7 +791,7 @@ fn approve_cross( &mut self, caller: caller, - approved: pallet_common::eth::CrossAddress, + approved: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -837,7 +830,7 @@ fn transfer_cross( &mut self, caller: caller, - to: pallet_common::eth::CrossAddress, + to: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -861,8 +854,8 @@ fn transfer_from_cross( &mut self, caller: caller, - from: pallet_common::eth::CrossAddress, - to: pallet_common::eth::CrossAddress, + from: eth::CrossAddress, + to: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -908,7 +901,7 @@ fn burn_from_cross( &mut self, caller: caller, - from: pallet_common::eth::CrossAddress, + from: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -1030,8 +1023,8 @@ fn mint_cross( &mut self, caller: caller, - to: pallet_common::eth::CrossAddress, - properties: Vec, + to: eth::CrossAddress, + properties: Vec, ) -> Result { let token_id = >::get(self.id) .checked_add(1) @@ -1041,7 +1034,7 @@ let properties = properties .into_iter() - .map(pallet_common::eth::Property::try_into) + .map(eth::Property::try_into) .collect::>>()? .try_into() .map_err(|_| Error::Revert(alloc::format!("too many properties")))?; --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -32,8 +32,9 @@ use frame_support::{BoundedBTreeMap, BoundedVec}; use pallet_common::{ CollectionHandle, CollectionPropertyPermissions, CommonCollectionOperations, + Error as CommonError, erc::{CommonEvmHandler, CollectionCall, static_property::key}, - Error as CommonError, + eth, }; use pallet_evm::{account::CrossAccountId, PrecompileHandle}; use pallet_evm_coder_substrate::{call, dispatch_to_evm}; @@ -96,25 +97,21 @@ fn set_token_property_permissions( &mut self, caller: caller, - permissions: Vec, + permissions: Vec, ) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); - let perms = pallet_common::eth::TokenPropertyPermission::into_property_key_permissions( - permissions, - )?; + let perms = eth::TokenPropertyPermission::into_property_key_permissions(permissions)?; >::set_token_property_permissions(self, &caller, perms) .map_err(dispatch_to_evm::) } /// @notice Get permissions for token properties. - fn token_property_permissions( - &self, - ) -> Result> { + fn token_property_permissions(&self) -> Result> { let perms = >::token_property_permission(self.id); Ok(perms .into_iter() - .map(pallet_common::eth::TokenPropertyPermission::from) + .map(eth::TokenPropertyPermission::from) .collect()) } @@ -162,7 +159,7 @@ &mut self, caller: caller, token_id: uint256, - properties: Vec, + properties: Vec, ) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?; @@ -173,7 +170,7 @@ let properties = properties .into_iter() - .map(pallet_common::eth::Property::try_into) + .map(eth::Property::try_into) .collect::>>()?; >::set_token_properties( @@ -788,9 +785,9 @@ /// Returns the owner (in cross format) of the token. /// /// @param tokenId Id for the token. - fn cross_owner_of(&self, token_id: uint256) -> Result { + fn cross_owner_of(&self, token_id: uint256) -> Result { Self::token_owner(&self, token_id.try_into()?) - .map(|o| pallet_common::eth::CrossAddress::from_sub_cross_account::(&o)) + .map(|o| eth::CrossAddress::from_sub_cross_account::(&o)) .ok_or(Error::Revert("key too large".into())) } @@ -799,11 +796,7 @@ /// @param tokenId Id for the token. /// @param keys Properties keys. Empty keys for all propertyes. /// @return Vector of properties key/value pairs. - fn properties( - &self, - token_id: uint256, - keys: Vec, - ) -> Result> { + fn properties(&self, token_id: uint256, keys: Vec) -> Result> { let keys = keys .into_iter() .map(|key| { @@ -819,7 +812,7 @@ if keys.is_empty() { None } else { Some(keys) }, ) .into_iter() - .map(pallet_common::eth::Property::try_from) + .map(eth::Property::try_from) .collect::>>() } /// @notice Transfer ownership of an RFT @@ -855,7 +848,7 @@ fn transfer_cross( &mut self, caller: caller, - to: pallet_common::eth::CrossAddress, + to: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -883,8 +876,8 @@ fn transfer_from_cross( &mut self, caller: caller, - from: pallet_common::eth::CrossAddress, - to: pallet_common::eth::CrossAddress, + from: eth::CrossAddress, + to: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -939,7 +932,7 @@ fn burn_from_cross( &mut self, caller: caller, - from: pallet_common::eth::CrossAddress, + from: eth::CrossAddress, token_id: uint256, ) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -1076,8 +1069,8 @@ fn mint_cross( &mut self, caller: caller, - to: pallet_common::eth::CrossAddress, - properties: Vec, + to: eth::CrossAddress, + properties: Vec, ) -> Result { let token_id = >::get(self.id) .checked_add(1) @@ -1087,7 +1080,7 @@ let properties = properties .into_iter() - .map(pallet_common::eth::Property::try_into) + .map(eth::Property::try_into) .collect::>>()? .try_into() .map_err(|_| Error::Revert(alloc::format!("too many properties")))?;