From 742862849b4bfeaa04c5439268d2e42e63712a20 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Fri, 13 Oct 2023 10:39:15 +0000 Subject: [PATCH] fix: EVM mint with properties, minor improvements --- --- a/pallets/common/src/benchmarking.rs +++ b/pallets/common/src/benchmarking.rs @@ -29,9 +29,8 @@ use sp_std::{vec, vec::Vec}; use up_data_structs::{ AccessMode, CollectionId, CollectionMode, CollectionPermissions, CreateCollectionData, - NestingPermissions, PropertiesPermissionMap, Property, PropertyKey, PropertyValue, - MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_COLLECTION_NAME_LENGTH, MAX_PROPERTIES_PER_ITEM, - MAX_TOKEN_PREFIX_LENGTH, + NestingPermissions, Property, PropertyKey, PropertyValue, MAX_COLLECTION_DESCRIPTION_LENGTH, + MAX_COLLECTION_NAME_LENGTH, MAX_PROPERTIES_PER_ITEM, MAX_TOKEN_PREFIX_LENGTH, }; use crate::{BenchmarkPropertyWriter, CollectionHandle, Config, Pallet}; @@ -190,31 +189,6 @@ #[block] { >::set_collection_properties(&collection, &owner, props.into_iter())?; - } - - Ok(()) - } - - #[benchmark] - fn delete_collection_properties( - b: Linear<0, MAX_PROPERTIES_PER_ITEM>, - ) -> Result<(), BenchmarkError> { - bench_init! { - owner: sub; collection: collection(owner); - owner: cross_from_sub; - }; - let props = (0..b) - .map(|p| Property { - key: property_key(p as usize), - value: property_value(), - }) - .collect::>(); - >::set_collection_properties(&collection, &owner, props.into_iter())?; - let to_delete = (0..b).map(|p| property_key(p as usize)).collect::>(); - - #[block] - { - >::delete_collection_properties(&collection, &owner, to_delete.into_iter())?; } Ok(()) @@ -253,7 +227,7 @@ } #[benchmark] - fn init_token_properties_common() -> Result<(), BenchmarkError> { + fn property_writer_load_collection_info() -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); sender: sub; --- a/pallets/common/src/erc.rs +++ b/pallets/common/src/erc.rs @@ -126,7 +126,7 @@ /// /// @param key Property key. #[solidity(hide)] - #[weight(>::delete_collection_properties(1))] + #[weight(>::set_collection_properties(1))] fn delete_collection_property(&mut self, caller: Caller, key: String) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); let key = >::from(key) @@ -139,7 +139,7 @@ /// Delete collection properties. /// /// @param keys Properties keys. - #[weight(>::delete_collection_properties(keys.len() as u32))] + #[weight(>::set_collection_properties(keys.len() as u32))] fn delete_collection_properties(&mut self, caller: Caller, keys: Vec) -> Result<()> { let caller = T::CrossAccountId::from_eth(caller); let keys = keys --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -2626,8 +2626,8 @@ impl BenchmarkPropertyWriter { /// Creates a [`PropertyWriter`] for benchmarking tokens properties writing. pub fn new<'a, Handle>( - collection: &Handle, - collection_lazy_info: PropertyWriterLazyCollectionInfo, + collection: &'a Handle, + collection_lazy_info: PropertyWriterLazyCollectionInfo<'a>, ) -> PropertyWriter<'a, Self, T, Handle> where Handle: CommonCollectionOperations + Deref>, --- a/pallets/nonfungible/src/benchmarking.rs +++ b/pallets/nonfungible/src/benchmarking.rs @@ -18,7 +18,6 @@ use pallet_common::{ bench_init, benchmarking::{create_collection_raw, property_key, property_value}, - CommonCollectionOperations, }; use sp_std::prelude::*; use up_data_structs::{ @@ -131,53 +130,12 @@ #[block] { >::burn(&collection, &burner, item)?; - } - - Ok(()) - } - - #[benchmark] - fn burn_recursively_self_raw() -> Result<(), BenchmarkError> { - bench_init! { - owner: sub; collection: collection(owner); - sender: cross_from_sub(owner); burner: cross_sub; - }; - let item = create_max_item(&collection, &sender, burner.clone())?; - - #[block] - { - >::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?; } Ok(()) } #[benchmark] - fn burn_recursively_breadth_plus_self_plus_self_per_each_raw( - b: Linear<0, 200>, - ) -> Result<(), BenchmarkError> { - bench_init! { - owner: sub; collection: collection(owner); - sender: cross_from_sub(owner); burner: cross_sub; - }; - let item = create_max_item(&collection, &sender, burner.clone())?; - for _ in 0..b { - create_max_item( - &collection, - &sender, - T::CrossTokenAddressMapping::token_to_address(collection.id, item), - )?; - } - - #[block] - { - >::burn_recursively(&collection, &burner, item, &Unlimited, &Unlimited)?; - } - - Ok(()) - } - - #[benchmark] fn transfer_raw() -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); @@ -262,116 +220,34 @@ { >::burn_from(&collection, &burner, &sender, item, &Unlimited)?; } - } - // set_token_properties { - // let b in 0..MAX_PROPERTIES_PER_ITEM; - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - // let perms = (0..b).map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }).collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - // let props = (0..b).map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }).collect::>(); - // let item = create_max_item(&collection, &owner, owner.clone())?; - // }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?} - - // load_token_properties { - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - - // let item = create_max_item(&collection, &owner, owner.clone())?; - // }: { - // pallet_common::BenchmarkPropertyWriter::::load_token_properties( - // &collection, - // item, - // ) - // } - - // write_token_properties { - // let b in 0..MAX_PROPERTIES_PER_ITEM; - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; + Ok(()) + } - // let perms = (0..b).map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }).collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - // let props = (0..b).map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }).collect::>(); - // let item = create_max_item(&collection, &owner, owner.clone())?; - - // let lazy_collection_info = pallet_common::BenchmarkPropertyWriter::::load_collection_info( - // &collection, - // &owner, - // ); - // }: { - // let mut property_writer = pallet_common::BenchmarkPropertyWriter::new(&collection, lazy_collection_info); - - // property_writer.write_token_properties( - // item, - // props.into_iter(), - // crate::erc::ERC721TokenEvent::TokenChanged { - // token_id: item.into(), - // } - // .to_log(T::ContractAddress::get()), - // )? - // } - #[benchmark] - fn set_token_property_permissions( - b: Linear<0, MAX_PROPERTIES_PER_ITEM>, - ) -> Result<(), BenchmarkError> { + fn load_token_properties() -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); owner: cross_from_sub; }; - let perms = (0..b) - .map(|k| PropertyKeyPermission { - key: property_key(k as usize), - permission: PropertyPermission { - mutable: false, - collection_admin: false, - token_owner: false, - }, - }) - .collect::>(); + let item = create_max_item(&collection, &owner, owner.clone())?; + #[block] { - >::set_token_property_permissions(&collection, &owner, perms)?; + pallet_common::BenchmarkPropertyWriter::::load_token_properties(&collection, item); } Ok(()) } #[benchmark] - fn set_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { + fn write_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); owner: cross_from_sub; }; + let perms = (0..b) .map(|k| PropertyKeyPermission { key: property_key(k as usize), @@ -391,71 +267,29 @@ .collect::>(); let item = create_max_item(&collection, &owner, owner.clone())?; + let lazy_collection_info = + pallet_common::BenchmarkPropertyWriter::::load_collection_info(&collection, &owner); + #[block] { - >::set_token_properties( - &collection, - &owner, + let mut property_writer = + pallet_common::BenchmarkPropertyWriter::new(&collection, lazy_collection_info); + + property_writer.write_token_properties( item, props.into_iter(), - &Unlimited, + crate::erc::ERC721TokenEvent::TokenChanged { + token_id: item.into(), + } + .to_log(T::ContractAddress::get()), )?; } Ok(()) } - // TODO: #[benchmark] - fn init_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { - // bench_init! { - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - - // let perms = (0..b) - // .map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }) - // .collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - #[block] - {} - // let props = (0..b) - // .map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }) - // .collect::>(); - // let item = create_max_item(&collection, &owner, owner.clone())?; - - // let (is_collection_admin, property_permissions) = - // load_is_admin_and_property_permissions(&collection, &owner); - // #[block] - // { - // let mut property_writer = - // pallet_common::BenchmarkPropertyWriter::new(&collection, lazy_collection_info); - - // property_writer.write_token_properties( - // item, - // props.into_iter(), - // crate::erc::ERC721TokenEvent::TokenChanged { - // token_id: item.into(), - // } - // .to_log(T::ContractAddress::get()), - // )?; - // } - - Ok(()) - } - - #[benchmark] - fn delete_token_properties( + fn set_token_property_permissions( b: Linear<0, MAX_PROPERTIES_PER_ITEM>, ) -> Result<(), BenchmarkError> { bench_init! { @@ -466,54 +300,16 @@ .map(|k| PropertyKeyPermission { key: property_key(k as usize), permission: PropertyPermission { - mutable: true, - collection_admin: true, - token_owner: true, + mutable: false, + collection_admin: false, + token_owner: false, }, - }) - .collect::>(); - >::set_token_property_permissions(&collection, &owner, perms)?; - let props = (0..b) - .map(|k| Property { - key: property_key(k as usize), - value: property_value(), }) .collect::>(); - let item = create_max_item(&collection, &owner, owner.clone())?; - >::set_token_properties( - &collection, - &owner, - item, - props.into_iter(), - &Unlimited, - )?; - let to_delete = (0..b).map(|k| property_key(k as usize)).collect::>(); #[block] { - >::delete_token_properties( - &collection, - &owner, - item, - to_delete.into_iter(), - &Unlimited, - )?; - } - - Ok(()) - } - - #[benchmark] - fn token_owner() -> Result<(), BenchmarkError> { - bench_init! { - owner: sub; collection: collection(owner); - owner: cross_from_sub; - }; - let item = create_max_item(&collection, &owner, owner.clone())?; - - #[block] - { - collection.token_owner(item).unwrap(); + >::set_token_property_permissions(&collection, &owner, perms)?; } Ok(()) --- a/pallets/nonfungible/src/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -39,24 +39,21 @@ impl CommonWeightInfo for CommonWeights { fn create_multiple_items_ex(data: &CreateItemExData) -> Weight { match data { - CreateItemExData::NFT(t) => >::create_multiple_items_ex(t.len() as u32) - .saturating_add(write_token_properties_total_weight::( - t.iter().map(|t| t.properties.len() as u32), - >::write_token_properties, - )), + CreateItemExData::NFT(t) => mint_with_props_weight::( + >::create_multiple_items_ex(t.len() as u32), + t.iter().map(|t| t.properties.len() as u32), + ), _ => Weight::zero(), } } fn create_multiple_items(data: &[up_data_structs::CreateItemData]) -> Weight { - >::create_multiple_items(data.len() as u32).saturating_add( - write_token_properties_total_weight::( - data.iter().map(|t| match t { - up_data_structs::CreateItemData::NFT(n) => n.properties.len() as u32, - _ => 0, - }), - >::write_token_properties, - ), + mint_with_props_weight::( + >::create_multiple_items(data.len() as u32), + data.iter().map(|t| match t { + up_data_structs::CreateItemData::NFT(n) => n.properties.len() as u32, + _ => 0, + }), ) } @@ -113,6 +110,16 @@ } } +pub(crate) fn mint_with_props_weight( + create_no_data_weight: Weight, + tokens: impl Iterator + Clone, +) -> Weight { + create_no_data_weight.saturating_add(write_token_properties_total_weight::( + tokens, + >::write_token_properties, + )) +} + fn map_create_data( data: up_data_structs::CreateItemData, to: &T::CrossAccountId, --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -49,8 +49,10 @@ }; use crate::{ - common::CommonWeights, weights::WeightInfo, AccountBalance, Config, CreateItemData, - NonfungibleHandle, Pallet, SelfWeightOf, TokenData, TokenProperties, TokensMinted, + common::{mint_with_props_weight, CommonWeights}, + weights::WeightInfo, + AccountBalance, Config, CreateItemData, NonfungibleHandle, Pallet, SelfWeightOf, TokenData, + TokenProperties, TokensMinted, }; /// Nft events. @@ -620,7 +622,7 @@ /// @param tokenUri Token URI that would be stored in the NFT properties /// @return uint256 The id of the newly minted token #[solidity(rename_selector = "mintWithTokenURI")] - #[weight(>::create_item() + >::set_token_properties(1))] + #[weight(mint_with_props_weight::(>::create_item(), [1].into_iter()))] fn mint_with_token_uri( &mut self, caller: Caller, @@ -642,7 +644,7 @@ /// @param tokenId ID of the minted NFT /// @param tokenUri Token URI that would be stored in the NFT properties #[solidity(hide, rename_selector = "mintWithTokenURI")] - #[weight(>::create_item() + >::set_token_properties(1))] + #[weight(mint_with_props_weight::(>::create_item(), [1].into_iter()))] fn mint_with_token_uri_check_id( &mut self, caller: Caller, @@ -974,7 +976,12 @@ /// @notice Function to mint a token. /// @param data Array of pairs of token owner and token's properties for minted token - #[weight(>::create_multiple_items(data.len() as u32) + >::set_token_properties(data.len() as u32))] + #[weight( + mint_with_props_weight::( + >::create_multiple_items_ex(data.len() as u32), + data.iter().map(|d| d.properties.len() as u32), + ) + )] fn mint_bulk_cross(&mut self, caller: Caller, data: Vec) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -1008,7 +1015,12 @@ /// @param to The new owner /// @param tokens array of pairs of token ID and token URI for minted tokens #[solidity(hide, rename_selector = "mintBulkWithTokenURI")] - #[weight(>::create_multiple_items(tokens.len() as u32) + >::set_token_properties(tokens.len() as u32))] + #[weight( + mint_with_props_weight::( + >::create_multiple_items(tokens.len() as u32), + tokens.iter().map(|_| 1), + ) + )] fn mint_bulk_with_token_uri( &mut self, caller: Caller, @@ -1056,7 +1068,7 @@ /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token - #[weight(>::create_item() + >::set_token_properties(properties.len() as u32))] + #[weight(mint_with_props_weight::(>::create_item(), [properties.len() as u32].into_iter()))] fn mint_cross( &mut self, caller: Caller, --- a/pallets/refungible/src/benchmarking.rs +++ b/pallets/refungible/src/benchmarking.rs @@ -421,114 +421,30 @@ Ok(()) } - // set_token_properties { - // let b in 0..MAX_PROPERTIES_PER_ITEM; - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - // let perms = (0..b).map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }).collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - // let props = (0..b).map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }).collect::>(); - // let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - // }: {>::set_token_properties(&collection, &owner, item, props.into_iter(), &Unlimited)?} - - // load_token_properties { - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - - // let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - // }: { - // pallet_common::BenchmarkPropertyWriter::::load_token_properties( - // &collection, - // item, - // ) - // } - - // write_token_properties { - // let b in 0..MAX_PROPERTIES_PER_ITEM; - // bench_init!{ - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - - // let perms = (0..b).map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }).collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - // let props = (0..b).map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }).collect::>(); - // let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - - // let lazy_collection_info = pallet_common::BenchmarkPropertyWriter::::load_collection_info( - // &collection, - // &owner, - // ); - // }: { - // let mut property_writer = pallet_common::BenchmarkPropertyWriter::new(&collection, lazy_collection_info); - - // property_writer.write_token_properties( - // item, - // props.into_iter(), - // crate::erc::ERC721TokenEvent::TokenChanged { - // token_id: item.into(), - // } - // .to_log(T::ContractAddress::get()), - // )? - // } - #[benchmark] - fn set_token_property_permissions( - b: Linear<0, MAX_PROPERTIES_PER_ITEM>, - ) -> Result<(), BenchmarkError> { + fn load_token_properties() -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); owner: cross_from_sub; }; - let perms = (0..b) - .map(|k| PropertyKeyPermission { - key: property_key(k as usize), - permission: PropertyPermission { - mutable: false, - collection_admin: false, - token_owner: false, - }, - }) - .collect::>(); + let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; + #[block] { - >::set_token_property_permissions(&collection, &owner, perms)?; + pallet_common::BenchmarkPropertyWriter::::load_token_properties(&collection, item); } Ok(()) } #[benchmark] - fn set_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { + fn write_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { bench_init! { owner: sub; collection: collection(owner); owner: cross_from_sub; }; + let perms = (0..b) .map(|k| PropertyKeyPermission { key: property_key(k as usize), @@ -548,73 +464,29 @@ .collect::>(); let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; + let lazy_collection_info = + pallet_common::BenchmarkPropertyWriter::::load_collection_info(&collection, &owner); + #[block] { - >::set_token_properties( - &collection, - &owner, + let mut property_writer = + pallet_common::BenchmarkPropertyWriter::new(&collection, lazy_collection_info); + + property_writer.write_token_properties( item, props.into_iter(), - &Unlimited, + crate::erc::ERC721TokenEvent::TokenChanged { + token_id: item.into(), + } + .to_log(T::ContractAddress::get()), )?; } Ok(()) } - // TODO: #[benchmark] - fn init_token_properties(b: Linear<0, MAX_PROPERTIES_PER_ITEM>) -> Result<(), BenchmarkError> { - // bench_init! { - // owner: sub; collection: collection(owner); - // owner: cross_from_sub; - // }; - - // let perms = (0..b) - // .map(|k| PropertyKeyPermission { - // key: property_key(k as usize), - // permission: PropertyPermission { - // mutable: false, - // collection_admin: true, - // token_owner: true, - // }, - // }) - // .collect::>(); - // >::set_token_property_permissions(&collection, &owner, perms)?; - - #[block] - {} - // let props = (0..b).map(|k| Property { - // key: property_key(k as usize), - // value: property_value(), - // }).collect::>(); - // let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - - // let (is_collection_admin, property_permissions) = load_is_admin_and_property_permissions(&collection, &owner) - // let mut property_writer = pallet_common::collection_info_loaded_property_writer( - // &collection, - // is_collection_admin, - // property_permissions, - // ); - - // #[block] - // { - // property_writer.write_token_properties( - // true, - // item, - // props.into_iter(), - // crate::erc::ERC721TokenEvent::TokenChanged { - // token_id: item.into(), - // } - // .to_log(T::ContractAddress::get()), - // )?; - // } - - Ok(()) - } - - #[benchmark] - fn delete_token_properties( + fn set_token_property_permissions( b: Linear<0, MAX_PROPERTIES_PER_ITEM>, ) -> Result<(), BenchmarkError> { bench_init! { @@ -625,38 +497,16 @@ .map(|k| PropertyKeyPermission { key: property_key(k as usize), permission: PropertyPermission { - mutable: true, - collection_admin: true, - token_owner: true, + mutable: false, + collection_admin: false, + token_owner: false, }, - }) - .collect::>(); - >::set_token_property_permissions(&collection, &owner, perms)?; - let props = (0..b) - .map(|k| Property { - key: property_key(k as usize), - value: property_value(), }) .collect::>(); - let item = create_max_item(&collection, &owner, [(owner.clone(), 200)])?; - >::set_token_properties( - &collection, - &owner, - item, - props.into_iter(), - &Unlimited, - )?; - let to_delete = (0..b).map(|k| property_key(k as usize)).collect::>(); #[block] { - >::delete_token_properties( - &collection, - &owner, - item, - to_delete.into_iter(), - &Unlimited, - )?; + >::set_token_property_permissions(&collection, &owner, perms)?; } Ok(()) @@ -673,22 +523,6 @@ #[block] { >::repartition(&collection, &owner, item, 200)?; - } - - Ok(()) - } - - #[benchmark] - fn token_owner() -> Result<(), BenchmarkError> { - bench_init! { - owner: sub; collection: collection(owner); - sender: cross_from_sub(owner); owner: cross_sub; - }; - let item = create_max_item(&collection, &sender, [(owner, 100)])?; - - #[block] - { - >::token_owner(collection.id, item).unwrap(); } Ok(()) --- a/pallets/refungible/src/common.rs +++ b/pallets/refungible/src/common.rs @@ -47,35 +47,27 @@ pub struct CommonWeights(PhantomData); impl CommonWeightInfo for CommonWeights { fn create_multiple_items(data: &[up_data_structs::CreateItemData]) -> Weight { - >::create_multiple_items(data.len() as u32).saturating_add( - write_token_properties_total_weight::( - data.iter().map(|data| match data { - up_data_structs::CreateItemData::ReFungible(rft_data) => { - rft_data.properties.len() as u32 - } - _ => 0, - }), - >::write_token_properties, - ), + mint_with_props_weight::( + >::create_multiple_items(data.len() as u32), + data.iter().map(|data| match data { + up_data_structs::CreateItemData::ReFungible(rft_data) => { + rft_data.properties.len() as u32 + } + _ => 0, + }), ) } fn create_multiple_items_ex(call: &CreateItemExData) -> Weight { match call { - CreateItemExData::RefungibleMultipleOwners(i) => { - >::create_multiple_items_ex_multiple_owners(i.users.len() as u32) - .saturating_add(write_token_properties_total_weight::( - [i.properties.len() as u32].into_iter(), - >::write_token_properties, - )) - } - CreateItemExData::RefungibleMultipleItems(i) => { - >::create_multiple_items_ex_multiple_items(i.len() as u32) - .saturating_add(write_token_properties_total_weight::( - i.iter().map(|d| d.properties.len() as u32), - >::write_token_properties, - )) - } + CreateItemExData::RefungibleMultipleOwners(i) => mint_with_props_weight::( + >::create_multiple_items_ex_multiple_owners(i.users.len() as u32), + [i.properties.len() as u32].into_iter(), + ), + CreateItemExData::RefungibleMultipleItems(i) => mint_with_props_weight::( + >::create_multiple_items_ex_multiple_items(i.len() as u32), + i.iter().map(|d| d.properties.len() as u32), + ), _ => Weight::zero(), } } @@ -138,6 +130,16 @@ } } +pub(crate) fn mint_with_props_weight( + create_no_data_weight: Weight, + tokens: impl Iterator + Clone, +) -> Weight { + create_no_data_weight.saturating_add(write_token_properties_total_weight::( + tokens, + >::write_token_properties, + )) +} + fn map_create_data( data: up_data_structs::CreateItemData, to: &T::CrossAccountId, --- a/pallets/refungible/src/erc.rs +++ b/pallets/refungible/src/erc.rs @@ -50,8 +50,10 @@ }; use crate::{ - common::CommonWeights, weights::WeightInfo, AccountBalance, Balance, Config, CreateItemData, - Pallet, RefungibleHandle, SelfWeightOf, TokenProperties, TokensMinted, TotalSupply, + common::{mint_with_props_weight, CommonWeights}, + weights::WeightInfo, + AccountBalance, Balance, Config, CreateItemData, Pallet, RefungibleHandle, SelfWeightOf, + TokenProperties, TokensMinted, TotalSupply, }; frontier_contract! { @@ -661,7 +663,7 @@ /// @param tokenUri Token URI that would be stored in the NFT properties /// @return uint256 The id of the newly minted token #[solidity(rename_selector = "mintWithTokenURI")] - #[weight(>::create_item() + >::set_token_properties(1))] + #[weight(mint_with_props_weight::(>::create_item(), [1].into_iter()))] fn mint_with_token_uri( &mut self, caller: Caller, @@ -683,7 +685,7 @@ /// @param tokenId ID of the minted RFT /// @param tokenUri Token URI that would be stored in the RFT properties #[solidity(hide, rename_selector = "mintWithTokenURI")] - #[weight(>::create_item() + >::set_token_properties(1))] + #[weight(mint_with_props_weight::(>::create_item(), [1].into_iter()))] fn mint_with_token_uri_check_id( &mut self, caller: Caller, @@ -1052,22 +1054,26 @@ } /// @notice Function to mint a token. - /// @param tokenProperties Properties of minted token - #[weight(if token_properties.len() == 1 { - >::create_multiple_items_ex_multiple_owners(token_properties.iter().next().unwrap().owners.len() as u32) + /// @param tokensData Data of minted token(s) + #[weight(if tokens_data.len() == 1 { + let token_data = tokens_data.first().unwrap(); + + mint_with_props_weight::( + >::create_multiple_items_ex_multiple_owners(token_data.owners.len() as u32), + [token_data.properties.len() as u32].into_iter(), + ) } else { - >::create_multiple_items_ex_multiple_items(token_properties.len() as u32) - } + >::set_token_properties(token_properties.len() as u32))] - fn mint_bulk_cross( - &mut self, - caller: Caller, - token_properties: Vec, - ) -> Result { + mint_with_props_weight::( + >::create_multiple_items_ex_multiple_items(tokens_data.len() as u32), + tokens_data.iter().map(|d| d.properties.len() as u32), + ) + })] + fn mint_bulk_cross(&mut self, caller: Caller, tokens_data: Vec) -> Result { let caller = T::CrossAccountId::from_eth(caller); - let has_multiple_tokens = token_properties.len() > 1; + let has_multiple_tokens = tokens_data.len() > 1; - let mut create_rft_data = Vec::with_capacity(token_properties.len()); - for MintTokenData { owners, properties } in token_properties { + let mut create_rft_data = Vec::with_capacity(tokens_data.len()); + for MintTokenData { owners, properties } in tokens_data { let has_multiple_owners = owners.len() > 1; if has_multiple_tokens & has_multiple_owners { return Err( @@ -1108,7 +1114,12 @@ /// @param to The new owner /// @param tokens array of pairs of token ID and token URI for minted tokens #[solidity(hide, rename_selector = "mintBulkWithTokenURI")] - #[weight(>::create_multiple_items(tokens.len() as u32) + >::set_token_properties(tokens.len() as u32))] + #[weight( + mint_with_props_weight::( + >::create_multiple_items(tokens.len() as u32), + tokens.iter().map(|_| 1), + ) + )] fn mint_bulk_with_token_uri( &mut self, caller: Caller, @@ -1162,7 +1173,7 @@ /// @param to The new owner crossAccountId /// @param properties Properties of minted token /// @return uint256 The id of the newly minted token - #[weight(>::create_item() + >::set_token_properties(properties.len() as u32))] + #[weight(mint_with_props_weight::(>::create_item(), [properties.len() as u32].into_iter()))] fn mint_cross( &mut self, caller: Caller, -- gitstuff