difftreelog
feat(rmrk) add equippable extrinsic
in: master
4 files changed
pallets/proxy-rmrk-core/src/lib.rsdiffbeforeafterboth--- a/pallets/proxy-rmrk-core/src/lib.rs
+++ b/pallets/proxy-rmrk-core/src/lib.rs
@@ -1298,7 +1298,7 @@
collection.save()
}
- fn check_collection_owner(
+ pub fn check_collection_owner(
collection: &NonfungibleHandle<T>,
account: &T::CrossAccountId,
) -> DispatchResult {
@@ -1363,7 +1363,11 @@
collection_id: CollectionId,
) -> Result<misc::CollectionType, DispatchError> {
Self::get_collection_property_decoded(collection_id, CollectionType)
- .map_err(|_| <Error<T>>::CorruptedCollectionType.into())
+ .map_err(|err| if err != <Error<T>>::CollectionUnknown.into() {
+ <Error<T>>::CorruptedCollectionType.into()
+ } else {
+ err
+ })
}
pub fn ensure_collection_type(
pallets/proxy-rmrk-equip/src/lib.rsdiffbeforeafterboth23use pallet_common::{Pallet as PalletCommon, Error as CommonError};23use pallet_common::{Pallet as PalletCommon, Error as CommonError};24use pallet_rmrk_core::{24use pallet_rmrk_core::{25 Pallet as PalletCore,25 Pallet as PalletCore,26 Error as CoreError,26 misc::{self, *},27 misc::{self, *},27 property::RmrkProperty::*,28 property::RmrkProperty::*,28};29};70 issuer: T::AccountId,71 issuer: T::AccountId,71 base_id: RmrkBaseId,72 base_id: RmrkBaseId,72 },73 },74 EquippablesUpdated {75 base_id: RmrkBaseId,76 slot_id: RmrkSlotId,77 },73 }78 }747975 #[pallet::error]80 #[pallet::error]79 NoAvailablePartId,84 NoAvailablePartId,80 BaseDoesntExist,85 BaseDoesntExist,81 NeedsDefaultThemeFirst,86 NeedsDefaultThemeFirst,87 PartDoesntExist,88 NoEquippableOnFixedPart,82 }89 }839084 #[pallet::call]91 #[pallet::call]182189183 let collection_id: CollectionId = base_id.into();190 let collection_id: CollectionId = base_id.into();184191185 let collection = <PalletCore<T>>::get_typed_nft_collection(192 let collection = Self::get_base(collection_id)?;186 collection_id,187 misc::CollectionType::Base,188 )189 .map_err(|_| <Error<T>>::BaseDoesntExist)?;190 collection.check_is_external()?;191193192 if theme.name.as_slice() == b"default" {194 if theme.name.as_slice() == b"default" {193 <BaseHasDefaultTheme<T>>::insert(collection_id, true);195 <BaseHasDefaultTheme<T>>::insert(collection_id, true);223 Ok(())225 Ok(())224 }226 }227228 #[transactional]229 #[pallet::weight(<SelfWeightOf<T>>::equippable())]230 pub fn equippable(231 origin: OriginFor<T>,232 base_id: RmrkBaseId,233 slot_id: RmrkSlotId,234 equippables: RmrkEquippableList,235 ) -> DispatchResult {236 let sender = ensure_signed(origin)?;237238 let base_collection_id = base_id.into();239 let collection = Self::get_base(base_collection_id)?;240241 <PalletCore<T>>::check_collection_owner(&collection, &T::CrossAccountId::from_sub(sender))242 .map_err(|err| if err == <CoreError<T>>::NoPermission.into() {243 <Error<T>>::PermissionError.into()244 } else {245 err246 })?;247248 let part_id = Self::internal_part_id(base_collection_id, slot_id)249 .ok_or(<Error<T>>::PartDoesntExist)?;250251 let nft_type = <PalletCore<T>>::get_nft_type(base_collection_id, part_id)252 .map_err(|_| <Error<T>>::PartDoesntExist)?;253254 match nft_type {255 NftType::Regular | NftType::Theme => return Err(<Error<T>>::PermissionError.into()),256 NftType::FixedPart => return Err(<Error<T>>::NoEquippableOnFixedPart.into()),257 NftType::SlotPart => {258 <PalletNft<T>>::set_scoped_token_property(259 base_collection_id,260 part_id,261 PropertyScope::Rmrk,262 <PalletCore<T>>::rmrk_property(EquippableList, &equippables)?,263 )?;264 }265 }266267 Self::deposit_event(Event::EquippablesUpdated {268 base_id,269 slot_id,270 });271272 Ok(())273 }225 }274 }226}275}227276269 Ok(token_id)318 Ok(token_id)270 }319 }320321 fn get_base(base_id: CollectionId) -> Result<NonfungibleHandle<T>, DispatchError> {322 let collection = <PalletCore<T>>::get_typed_nft_collection(base_id, misc::CollectionType::Base)323 .map_err(|err| if err == <CoreError<T>>::CollectionUnknown.into() {324 <Error<T>>::BaseDoesntExist.into()325 } else {326 err327 })?;328 collection.check_is_external()?;329330 Ok(collection)331 }271}332}272333pallets/proxy-rmrk-equip/src/weights.rsdiffbeforeafterboth--- a/pallets/proxy-rmrk-equip/src/weights.rs
+++ b/pallets/proxy-rmrk-equip/src/weights.rs
@@ -3,7 +3,7 @@
//! Autogenerated weights for pallet_proxy_rmrk_equip
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
-//! DATE: 2022-06-16, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! DATE: 2022-06-20, STEPS: `50`, REPEAT: 80, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! EXECUTION: None, WASM-EXECUTION: Compiled, CHAIN: None, DB CACHE: 1024
// Executed Command:
@@ -35,6 +35,7 @@
pub trait WeightInfo {
fn create_base(b: u32, ) -> Weight;
fn theme_add(b: u32, ) -> Weight;
+ fn equippable() -> Weight;
}
/// Weights for pallet_proxy_rmrk_equip using the Substrate node and recommended hardware.
@@ -53,13 +54,13 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: RmrkEquip InernalPartId (r:0 w:1)
fn create_base(b: u32, ) -> Weight {
- (43_216_000 as Weight)
+ (44_632_000 as Weight)
// Standard Error: 10_000
- .saturating_add((16_253_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((16_912_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(6 as Weight))
.saturating_add(T::DbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
- .saturating_add(T::DbWeight::get().writes(9 as Weight))
- .saturating_add(T::DbWeight::get().writes((3 as Weight).saturating_mul(b as Weight)))
+ .saturating_add(T::DbWeight::get().writes(8 as Weight))
+ .saturating_add(T::DbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
}
// Storage: Common CollectionProperties (r:1 w:0)
// Storage: Common CollectionById (r:1 w:0)
@@ -70,12 +71,21 @@
// Storage: Nonfungible TokenData (r:0 w:1)
// Storage: Nonfungible Owned (r:0 w:1)
fn theme_add(b: u32, ) -> Weight {
- (39_467_000 as Weight)
- // Standard Error: 15_000
- .saturating_add((2_332_000 as Weight).saturating_mul(b as Weight))
+ (39_525_000 as Weight)
+ // Standard Error: 12_000
+ .saturating_add((2_494_000 as Weight).saturating_mul(b as Weight))
.saturating_add(T::DbWeight::get().reads(6 as Weight))
.saturating_add(T::DbWeight::get().writes(5 as Weight))
}
+ // Storage: Common CollectionProperties (r:1 w:0)
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: RmrkEquip InernalPartId (r:1 w:0)
+ // Storage: Nonfungible TokenProperties (r:1 w:1)
+ fn equippable() -> Weight {
+ (27_371_000 as Weight)
+ .saturating_add(T::DbWeight::get().reads(4 as Weight))
+ .saturating_add(T::DbWeight::get().writes(1 as Weight))
+ }
}
// For backwards compatibility and tests
@@ -93,13 +103,13 @@
// Storage: Nonfungible Owned (r:0 w:1)
// Storage: RmrkEquip InernalPartId (r:0 w:1)
fn create_base(b: u32, ) -> Weight {
- (43_216_000 as Weight)
+ (44_632_000 as Weight)
// Standard Error: 10_000
- .saturating_add((16_253_000 as Weight).saturating_mul(b as Weight))
+ .saturating_add((16_912_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(6 as Weight))
.saturating_add(RocksDbWeight::get().reads((1 as Weight).saturating_mul(b as Weight)))
- .saturating_add(RocksDbWeight::get().writes(9 as Weight))
- .saturating_add(RocksDbWeight::get().writes((3 as Weight).saturating_mul(b as Weight)))
+ .saturating_add(RocksDbWeight::get().writes(8 as Weight))
+ .saturating_add(RocksDbWeight::get().writes((4 as Weight).saturating_mul(b as Weight)))
}
// Storage: Common CollectionProperties (r:1 w:0)
// Storage: Common CollectionById (r:1 w:0)
@@ -110,10 +120,19 @@
// Storage: Nonfungible TokenData (r:0 w:1)
// Storage: Nonfungible Owned (r:0 w:1)
fn theme_add(b: u32, ) -> Weight {
- (39_467_000 as Weight)
- // Standard Error: 15_000
- .saturating_add((2_332_000 as Weight).saturating_mul(b as Weight))
+ (39_525_000 as Weight)
+ // Standard Error: 12_000
+ .saturating_add((2_494_000 as Weight).saturating_mul(b as Weight))
.saturating_add(RocksDbWeight::get().reads(6 as Weight))
.saturating_add(RocksDbWeight::get().writes(5 as Weight))
}
+ // Storage: Common CollectionProperties (r:1 w:0)
+ // Storage: Common CollectionById (r:1 w:0)
+ // Storage: RmrkEquip InernalPartId (r:1 w:0)
+ // Storage: Nonfungible TokenProperties (r:1 w:1)
+ fn equippable() -> Weight {
+ (27_371_000 as Weight)
+ .saturating_add(RocksDbWeight::get().reads(4 as Weight))
+ .saturating_add(RocksDbWeight::get().writes(1 as Weight))
+ }
}
primitives/data-structs/src/lib.rsdiffbeforeafterboth--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -39,15 +39,15 @@
// RMRK
use rmrk_traits::{
CollectionInfo, NftInfo, ResourceInfo, PropertyInfo, BaseInfo, PartType, Theme, ThemeProperty,
- ResourceTypes, BasicResource, ComposableResource, SlotResource,
+ ResourceTypes, BasicResource, ComposableResource, SlotResource, EquippableList,
};
pub use rmrk_traits::{
primitives::{
CollectionId as RmrkCollectionId, NftId as RmrkNftId, BaseId as RmrkBaseId,
- PartId as RmrkPartId, ResourceId as RmrkResourceId,
+ SlotId as RmrkSlotId, PartId as RmrkPartId, ResourceId as RmrkResourceId,
},
NftChild as RmrkNftChild, AccountIdOrCollectionNftTuple as RmrkAccountIdOrCollectionNftTuple,
- FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart, EquippableList as RmrkEquippableList,
+ FixedPart as RmrkFixedPart, SlotPart as RmrkSlotPart,
};
mod bounded;
@@ -987,8 +987,9 @@
pub type RmrkResourceInfo = ResourceInfo<RmrkString, RmrkBoundedParts>;
pub type RmrkPropertyInfo = PropertyInfo<RmrkKeyString, RmrkValueString>;
pub type RmrkBaseInfo<AccountId> = BaseInfo<AccountId, RmrkString>;
-pub type RmrkPartType =
- PartType<RmrkString, BoundedVec<RmrkCollectionId, RmrkMaxCollectionsEquippablePerPart>>;
+pub type BoundedEquippableCollectionIds = BoundedVec<RmrkCollectionId, RmrkMaxCollectionsEquippablePerPart>;
+pub type RmrkPartType = PartType<RmrkString, BoundedEquippableCollectionIds>;
+pub type RmrkEquippableList = EquippableList<BoundedEquippableCollectionIds>;
pub type RmrkThemeProperty = ThemeProperty<RmrkString>;
pub type RmrkTheme = Theme<RmrkString, Vec<RmrkThemeProperty>>;
pub type RmrkBoundedTheme = Theme<RmrkString, BoundedVec<RmrkThemeProperty, MaxPropertiesPerTheme>>;