git.delta.rocks / unique-network / refs/commits / a74fad685f6e

difftreelog

feat(rmrk) add associated bases property

Daniel Shiposha2022-06-30parent: #51e15a0.patch.diff
in: master

2 files changed

modifiedpallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth
24};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,
5555
56type PendingTarget = (CollectionId, TokenId);56type PendingTarget = (CollectionId, TokenId);
57type PendingChild = (RmrkCollectionId, RmrkNftId);57type PendingChild = (RmrkCollectionId, RmrkNftId);
58type PendingChildrenMap = BTreeSet<PendingChild>;58type PendingChildrenSet = BTreeSet<PendingChild>;
59
60type BasesMap = BTreeMap<RmrkBaseId, u32>;
5961
60#[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 );
821
822 if let RmrkResourceTypes::Composable(resource) = resource_info.resource {
823 let base_id = resource.base;
824
825 Self::remove_associated_base_id(collection_id, nft_id, base_id)?;
826 }
818827
819 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()?;
980
981 let base_id = resource.base;
971982
972 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 )?;
989
990 <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 )?;
9781007
979 Self::deposit_event(Event::ResourceAdded {1008 Self::deposit_event(Event::ResourceAdded {
980 nft_id,1009 nft_id,
11981227
1199 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 };
12131242
1214 f(&mut map);1243 f(&mut map);
12301259
1231 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 };
12351264
1236 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;
13141343
1315 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(),1350
1323 <Error<T>>::ResourceDoesntExist1351 let resource_info: RmrkResourceInfo = Self::decode_property(&resource)?;
1324 );
13251352
1326 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 );
1365
1366 if let RmrkResourceTypes::Composable(resource) = resource_info.resource {
1367 let base_id = resource.base;
1368
1369 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 }
1381
1382 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 };
1397
1398 let remaining = bases.get(&base_id);
1399
1400 if let Some(remaining) = remaining {
1401 if let Some(0) | None = remaining.checked_sub(1) {
1402 bases.remove(&base_id);
1403 }
1404 }
1405
1406 *value = Some(Self::encode_property(&bases)?);
1407 Ok(())
1408 }
1409 )
1410 }
13481411
1349 fn try_mutate_resource_info(1412 fn try_mutate_resource_info(
1350 collection_id: CollectionId,1413 collection_id: CollectionId,
modifiedpallets/proxy-rmrk-core/src/property.rsdiffbeforeafterboth
34 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"),