difftreelog
feat(rmrk) add associated bases property
in: master
2 files changed
pallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth24};24};25use frame_system::{pallet_prelude::*, ensure_signed};25use frame_system::{pallet_prelude::*, ensure_signed};26use sp_runtime::{DispatchError, Permill, traits::StaticLookup};26use sp_runtime::{DispatchError, Permill, traits::StaticLookup};27use sp_std::{vec::Vec, collections::btree_set::BTreeSet};27use sp_std::{vec::Vec, collections::{btree_set::BTreeSet, btree_map::BTreeMap}};28use up_data_structs::{*, mapping::TokenAddressMapping};28use up_data_structs::{*, mapping::TokenAddressMapping};29use pallet_common::{29use pallet_common::{30 Pallet as PalletCommon, Error as CommonError, CollectionHandle, CommonCollectionOperations,30 Pallet as PalletCommon, Error as CommonError, CollectionHandle, CommonCollectionOperations,555556type PendingTarget = (CollectionId, TokenId);56type PendingTarget = (CollectionId, TokenId);57type PendingChild = (RmrkCollectionId, RmrkNftId);57type PendingChild = (RmrkCollectionId, RmrkNftId);58type PendingChildrenMap = BTreeSet<PendingChild>;58type PendingChildrenSet = BTreeSet<PendingChild>;5960type BasesMap = BTreeMap<RmrkBaseId, u32>;596160#[frame_support::pallet]62#[frame_support::pallet]61pub mod pallet {63pub mod pallet {398 Self::rmrk_property(Equipped, &false)?,400 Self::rmrk_property(Equipped, &false)?,399 Self::rmrk_property(ResourcePriorities, &<Vec<u8>>::new())?,401 Self::rmrk_property(ResourcePriorities, &<Vec<u8>>::new())?,400 Self::rmrk_property(NextResourceId, &(0 as RmrkResourceId))?,402 Self::rmrk_property(NextResourceId, &(0 as RmrkResourceId))?,401 Self::rmrk_property(PendingChildren, &PendingChildrenMap::new())?,403 Self::rmrk_property(PendingChildren, &PendingChildrenSet::new())?,404 Self::rmrk_property(AssociatedBases, &BasesMap::new())?,402 ]405 ]403 .into_iter(),406 .into_iter(),404 )407 )816 resource_id_key,819 resource_id_key,817 );820 );821822 if let RmrkResourceTypes::Composable(resource) = resource_info.resource {823 let base_id = resource.base;824825 Self::remove_associated_base_id(collection_id, nft_id, base_id)?;826 }818827819 Self::deposit_event(Event::<T>::ResourceRemovalAccepted {828 Self::deposit_event(Event::<T>::ResourceRemovalAccepted {820 nft_id: rmrk_nft_id,829 nft_id: rmrk_nft_id,969 Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?;978 Self::get_typed_nft_collection(collection_id, misc::CollectionType::Regular)?;970 collection.check_is_external()?;979 collection.check_is_external()?;980981 let base_id = resource.base;971982972 let resource_id = Self::resource_add(983 let resource_id = Self::resource_add(973 sender,984 sender,976 RmrkResourceTypes::Composable(resource),987 RmrkResourceTypes::Composable(resource),977 )?;988 )?;989990 <PalletNft<T>>::try_mutate_token_aux_property(991 collection_id,992 nft_id.into(),993 PropertyScope::Rmrk,994 Self::rmrk_property_key(AssociatedBases)?,995 |value| -> DispatchResult {996 let mut bases: BasesMap = match value {997 Some(value) => Self::decode_property(value)?,998 None => BasesMap::new()999 };1000 1001 *bases.entry(base_id).or_insert(0) += 1;1002 1003 *value = Some(Self::encode_property(&bases)?);1004 Ok(())1005 }1006 )?;9781007979 Self::deposit_event(Event::ResourceAdded {1008 Self::deposit_event(Event::ResourceAdded {980 nft_id,1009 nft_id,119812271199 fn mutate_pending_child(1228 fn mutate_pending_child(1200 (target_collection_id, target_nft_id): (CollectionId, TokenId),1229 (target_collection_id, target_nft_id): (CollectionId, TokenId),1201 f: impl FnOnce(&mut PendingChildrenMap),1230 f: impl FnOnce(&mut PendingChildrenSet),1202 ) -> DispatchResult {1231 ) -> DispatchResult {1203 <PalletNft<T>>::try_mutate_token_aux_property(1232 <PalletNft<T>>::try_mutate_token_aux_property(1204 target_collection_id,1233 target_collection_id,1208 |pending_children| -> DispatchResult {1237 |pending_children| -> DispatchResult {1209 let mut map = match pending_children {1238 let mut map = match pending_children {1210 Some(map) => Self::decode_property(map)?,1239 Some(map) => Self::decode_property(map)?,1211 None => PendingChildrenMap::new(),1240 None => PendingChildrenSet::new(),1212 };1241 };121312421214 f(&mut map);1243 f(&mut map);123012591231 let pending_children = match property {1260 let pending_children = match property {1232 Some(map) => Self::decode_property(&map)?,1261 Some(map) => Self::decode_property(&map)?,1233 None => PendingChildrenMap::new(),1262 None => PendingChildrenSet::new(),1234 };1263 };123512641236 Ok(pending_children.into_iter())1265 Ok(pending_children.into_iter())1312 let resource_id_key = Self::rmrk_property_key(ResourceId(resource_id))?;1341 let resource_id_key = Self::rmrk_property_key(ResourceId(resource_id))?;1313 let scope = PropertyScope::Rmrk;1342 let scope = PropertyScope::Rmrk;131413431315 ensure!(1316 <PalletNft<T>>::token_aux_property((1344 let resource = <PalletNft<T>>::token_aux_property((1317 collection_id,1345 collection_id,1318 nft_id,1346 nft_id,1319 scope,1347 scope,1320 resource_id_key.clone()1348 resource_id_key.clone()1321 ))1349 )).ok_or(<Error<T>>::ResourceDoesntExist)?;1322 .is_some(),13501323 <Error<T>>::ResourceDoesntExist1351 let resource_info: RmrkResourceInfo = Self::decode_property(&resource)?;1324 );132513521326 let budget = up_data_structs::budget::Value::new(NESTING_BUDGET);1353 let budget = up_data_structs::budget::Value::new(NESTING_BUDGET);1327 let topmost_owner =1354 let topmost_owner =1336 Self::rmrk_property_key(ResourceId(resource_id))?,1363 Self::rmrk_property_key(ResourceId(resource_id))?,1337 );1364 );13651366 if let RmrkResourceTypes::Composable(resource) = resource_info.resource {1367 let base_id = resource.base;13681369 Self::remove_associated_base_id(collection_id, nft_id, base_id)?;1370 }1338 } else {1371 } else {1339 Self::try_mutate_resource_info(collection_id, nft_id, resource_id, |res| {1372 Self::try_mutate_resource_info(collection_id, nft_id, resource_id, |res| {1340 res.pending_removal = true;1373 res.pending_removal = true;1346 Ok(())1379 Ok(())1347 }1380 }13811382 fn remove_associated_base_id(1383 collection_id: CollectionId,1384 nft_id: TokenId,1385 base_id: RmrkBaseId,1386 ) -> DispatchResult {1387 <PalletNft<T>>::try_mutate_token_aux_property(1388 collection_id,1389 nft_id,1390 PropertyScope::Rmrk,1391 Self::rmrk_property_key(AssociatedBases)?,1392 |value| -> DispatchResult {1393 let mut bases: BasesMap = match value {1394 Some(value) => Self::decode_property(value)?,1395 None => BasesMap::new()1396 };13971398 let remaining = bases.get(&base_id);13991400 if let Some(remaining) = remaining {1401 if let Some(0) | None = remaining.checked_sub(1) {1402 bases.remove(&base_id);1403 }1404 }14051406 *value = Some(Self::encode_property(&bases)?);1407 Ok(())1408 }1409 )1410 }134814111349 fn try_mutate_resource_info(1412 fn try_mutate_resource_info(1350 collection_id: CollectionId,1413 collection_id: CollectionId,pallets/proxy-rmrk-core/src/property.rsdiffbeforeafterboth34 ResourceId(RmrkResourceId),34 ResourceId(RmrkResourceId),35 PendingNftAccept,35 PendingNftAccept,36 PendingChildren,36 PendingChildren,37 AssociatedBases,37 Parts,38 Parts,38 Base,39 Base,39 Src,40 Src,77 Self::ResourceId(id) => key!(RESOURCE_ID_PREFIX, id.to_le_bytes()),78 Self::ResourceId(id) => key!(RESOURCE_ID_PREFIX, id.to_le_bytes()),78 Self::PendingNftAccept => key!("pending-nft-accept"),79 Self::PendingNftAccept => key!("pending-nft-accept"),79 Self::PendingChildren => key!("pending-children"),80 Self::PendingChildren => key!("pending-children"),81 Self::AssociatedBases => key!("assoc-bases"),80 Self::Parts => key!("parts"),82 Self::Parts => key!("parts"),81 Self::Base => key!("base"),83 Self::Base => key!("base"),82 Self::Src => key!("src"),84 Self::Src => key!("src"),