--- a/pallets/proxy-rmrk-core/src/lib.rs +++ b/pallets/proxy-rmrk-core/src/lib.rs @@ -54,6 +54,11 @@ #[pallet::getter(fn collection_index)] pub type CollectionIndex = StorageValue<_, RmrkCollectionId, ValueQuery>; + #[pallet::storage] + #[pallet::getter(fn collection_index_map)] + pub type CollectionIndexMap = + StorageMap<_, Twox64Concat, RmrkCollectionId, CollectionId, ValueQuery>; + #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); @@ -146,10 +151,14 @@ return Err(>::NoAvailableCollectionId.into()); } - let collection_id = collection_id_res?; + let unique_collection_id = collection_id_res?; + let rmrk_collection_id = >::get(); + + >::mutate(|n| *n += 1); + >::insert(rmrk_collection_id, unique_collection_id); >::set_scoped_collection_properties( - collection_id, + unique_collection_id, PropertyScope::Rmrk, [ Self::rmrk_property(Metadata, &metadata)?, @@ -158,11 +167,9 @@ .into_iter(), )?; - >::mutate(|n| *n += 1); - Self::deposit_event(Event::CollectionCreated { issuer: sender, - collection_id: collection_id.0, + collection_id: rmrk_collection_id, }); Ok(()) @@ -177,10 +184,8 @@ let sender = ensure_signed(origin)?; let cross_sender = T::CrossAccountId::from_sub(sender.clone()); - let unique_collection_id = collection_id.into(); - let collection = Self::get_typed_nft_collection( - unique_collection_id, + Self::unique_collection_id(collection_id)?, misc::CollectionType::Regular, )?; @@ -212,7 +217,7 @@ let new_issuer = T::Lookup::lookup(new_issuer)?; Self::change_collection_owner( - collection_id.into(), + Self::unique_collection_id(collection_id)?, misc::CollectionType::Regular, sender.clone(), new_issuer.clone(), @@ -237,7 +242,7 @@ let cross_sender = T::CrossAccountId::from_sub(sender.clone()); let collection = Self::get_typed_nft_collection( - collection_id.into(), + Self::unique_collection_id(collection_id)?, misc::CollectionType::Regular, )?; @@ -277,7 +282,7 @@ }); let collection = Self::get_typed_nft_collection( - collection_id.into(), + Self::unique_collection_id(collection_id)?, misc::CollectionType::Regular, )?; @@ -321,7 +326,7 @@ Self::destroy_nft( cross_sender, - collection_id.into(), + Self::unique_collection_id(collection_id)?, misc::CollectionType::Regular, nft_id.into(), )?; @@ -346,7 +351,7 @@ let sender = ensure_signed(origin)?; let sender = T::CrossAccountId::from_sub(sender); - let collection_id: CollectionId = rmrk_collection_id.into(); + let collection_id = Self::unique_collection_id(rmrk_collection_id)?; match maybe_nft_id { Some(nft_id) => { @@ -488,6 +493,10 @@ >::get() } + pub fn unique_collection_id(rmrk_collection_id: RmrkCollectionId) -> Result { + >::try_get(rmrk_collection_id).map_err(|_| >::CollectionUnknown.into()) + } + pub fn get_nft_collection( collection_id: CollectionId, ) -> Result, DispatchError> { --- a/runtime/common/src/runtime_apis.rs +++ b/runtime/common/src/runtime_apis.rs @@ -146,7 +146,7 @@ fn collection_by_id(collection_id: RmrkCollectionId) -> Result>, DispatchError> { use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, RmrkDecode, RmrkRebind}}; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; let collection = match RmrkCore::get_typed_nft_collection(collection_id, CollectionType::Regular) { Ok(c) => c, Err(_) => return Ok(None), @@ -167,7 +167,7 @@ use up_data_structs::mapping::TokenAddressMapping; use pallet_proxy_rmrk_core::{RmrkProperty, misc::RmrkDecode}; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; let nft_id = TokenId(nft_by_id); if !RmrkCore::nft_exists(collection_id, nft_id) { return Ok(None); } @@ -194,7 +194,7 @@ use pallet_proxy_rmrk_core::misc::CollectionType; let cross_account_id = CrossAccountId::from_sub(account_id); - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(Vec::new()); } Ok( @@ -206,7 +206,7 @@ } fn nft_children(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; let nft_id = TokenId(nft_id); if !RmrkCore::nft_exists(collection_id, nft_id) { return Ok(Vec::new()); } @@ -227,7 +227,7 @@ fn collection_properties(collection_id: RmrkCollectionId, filter_keys: Option>) -> Result, DispatchError> { use pallet_proxy_rmrk_core::misc::CollectionType; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; if RmrkCore::ensure_collection_type(collection_id, CollectionType::Regular).is_err() { return Ok(Vec::new()); } @@ -248,7 +248,7 @@ fn nft_properties(collection_id: RmrkCollectionId, nft_id: RmrkNftId, filter_keys: Option>) -> Result, DispatchError> { use pallet_proxy_rmrk_core::misc::NftType; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; let token_id = TokenId(nft_id); if RmrkCore::ensure_nft_type(collection_id, token_id, NftType::Regular).is_err() { @@ -272,7 +272,7 @@ use frame_support::BoundedVec; use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType, RmrkDecode}}; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; if !RmrkCore::collection_exists(collection_id) { return Ok(Vec::new()); } // todo make sure the collection type doesn't matter let nft_id = TokenId(nft_id); @@ -307,7 +307,7 @@ fn nft_resource_priorities(collection_id: RmrkCollectionId, nft_id: RmrkNftId) -> Result, DispatchError> { use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType, RmrkDecode}}; - let collection_id = CollectionId(collection_id); + let collection_id = RmrkCore::unique_collection_id(collection_id)?; if !RmrkCore::collection_exists(collection_id) { return Ok(Vec::new()); } // todo ensure the collection type doesn't matter let nft_id = TokenId(nft_id); @@ -336,7 +336,7 @@ RmrkProperty, misc::{CollectionType, RmrkDecode, RmrkRebind}, }; - let collection_id = CollectionId(base_id); + let collection_id = RmrkCore::unique_collection_id(base_id)?; let collection = match RmrkCore::get_typed_nft_collection(collection_id, CollectionType::Base) { Ok(c) => c, Err(_) => return Ok(None), @@ -352,7 +352,7 @@ fn base_parts(base_id: RmrkBaseId) -> Result, DispatchError> { use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, NftType, RmrkDecode}}; - let collection_id = CollectionId(base_id); + let collection_id = RmrkCore::unique_collection_id(base_id)?; if RmrkCore::ensure_collection_type(collection_id, CollectionType::Base).is_err() { return Ok(Vec::new()); } let parts = dispatch_unique_runtime!(collection_id.collection_tokens())? @@ -383,7 +383,7 @@ fn theme_names(base_id: RmrkBaseId) -> Result, DispatchError> { use pallet_proxy_rmrk_core::{RmrkProperty, misc::{CollectionType, RmrkDecode}}; - let collection_id = CollectionId(base_id); + let collection_id = RmrkCore::unique_collection_id(base_id)?; if RmrkCore::ensure_collection_type(collection_id, CollectionType::Base).is_err() { return Ok(Vec::new()); } @@ -411,7 +411,7 @@ misc::{CollectionType, NftType, RmrkDecode} }; - let collection_id = CollectionId(base_id); + let collection_id = RmrkCore::unique_collection_id(base_id)?; if RmrkCore::ensure_collection_type(collection_id, CollectionType::Base).is_err() { return Ok(None); }