difftreelog
refactor move ChainLimits to runtime config
in: master
6 files changed
node/cli/src/chain_spec.rsdiffbeforeafterboth--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -202,18 +202,6 @@
nft_item_id: vec![],
fungible_item_id: vec![],
refungible_item_id: vec![],
- chain_limit: ChainLimits {
- collection_numbers_limit: 100000,
- account_token_ownership_limit: 1000000,
- collections_admins_limit: 5,
- custom_data_limit: 2048,
- nft_sponsor_transfer_timeout: 15,
- fungible_sponsor_transfer_timeout: 15,
- refungible_sponsor_transfer_timeout: 15,
- offchain_schema_limit: 1024,
- variable_on_chain_schema_limit: 1024,
- const_on_chain_schema_limit: 1024,
- },
},
parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },
aura: nft_runtime::AuraConfig {
pallets/nft/src/eth/sponsoring.rsdiffbeforeafterboth--- a/pallets/nft/src/eth/sponsoring.rs
+++ b/pallets/nft/src/eth/sponsoring.rs
@@ -1,12 +1,13 @@
//! Implements EVM sponsoring logic via OnChargeEVMTransaction
use crate::{
- ChainLimit, Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,
- eth::{account::EvmBackwardsAddressMapping, map_eth_to_id},
+ Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,
+ eth::{account::EvmBackwardsAddressMapping, map_eth_to_id}, limit,
};
use evm_coder::{Call, abi::AbiReader};
use frame_support::{
- storage::{StorageMap, StorageDoubleMap, StorageValue},
+ storage::{StorageMap, StorageDoubleMap},
+ traits::Get,
};
use sp_core::H160;
use sp_std::prelude::*;
@@ -43,7 +44,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- ChainLimit::get().nft_sponsor_transfer_timeout
+ <limit!(T, NftSponsorTransferTimeout)>::get()
};
let mut sponsor = true;
@@ -74,7 +75,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- ChainLimit::get().fungible_sponsor_transfer_timeout
+ <limit!(T, FungibleSponsorTransferTimeout)>::get()
};
let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
pallets/nft/src/lib.rsdiffbeforeafterboth31 StorageValue, transactional,31 StorageValue, transactional,32};32};333334use frame_system::{self as system, ensure_signed, ensure_root};34use frame_system::{self as system, ensure_signed};35use sp_core::H160;35use sp_core::H160;36use sp_std::vec;36use sp_std::vec;37use sp_runtime::sp_std::prelude::Vec;37use sp_runtime::sp_std::prelude::Vec;243 <<Self as Config>::Currency as Currency<Self::AccountId>>::Balance,243 <<Self as Config>::Currency as Currency<Self::AccountId>>::Balance,244 >;244 >;245 type TreasuryAccountId: Get<Self::AccountId>;245 type TreasuryAccountId: Get<Self::AccountId>;246 type ChainLimits: ChainLimits;246}247}248249pub type ChainLimitsOf<T> = <T as Config>::ChainLimits;250#[macro_export]251macro_rules! limit {252 ($config:ty, $limit:ident) => {253 <$crate::ChainLimitsOf<$config> as nft_data_structs::ChainLimits>::$limit254 }255}247256248// # Used definitions257// # Used definitions249//258//280 ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;289 ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;281 //#endregion290 //#endregion282283 //#region Chain limits struct284 pub ChainLimit get(fn chain_limit) config(): ChainLimits;285 //#endregion286291287 //#region Bound counters292 //#region Bound counters288 /// Amount of collections destroyed, used for total amount tracking with293 /// Amount of collections destroyed, used for total amount tracking with486 _ => 0491 _ => 0487 };492 };488489 let chain_limit = ChainLimit::get();490493491 let created_count = CreatedCollectionCount::get();494 let created_count = CreatedCollectionCount::get();492 let destroyed_count = DestroyedCollectionCount::get();495 let destroyed_count = DestroyedCollectionCount::get();493496494 // bound Total number of collections497 // bound Total number of collections495 ensure!(created_count - destroyed_count < chain_limit.collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);498 ensure!(created_count - destroyed_count < <limit!(T, CollectionNumberLimit)>::get(), Error::<T>::TotalCollectionsLimitExceeded);496499497 // check params500 // check params498 ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);501 ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);508 CreatedCollectionCount::put(next_id);511 CreatedCollectionCount::put(next_id);509512510 let limits = CollectionLimits {513 let limits = CollectionLimits {511 sponsored_data_size: chain_limit.custom_data_limit,514 sponsored_data_size: <limit!(T, CustomDataLimit)>::get(),512 ..Default::default()515 ..Default::default()513 };516 };514517737 match admin_arr.binary_search(&new_admin_id) {740 match admin_arr.binary_search(&new_admin_id) {738 Ok(_) => {},741 Ok(_) => {},739 Err(idx) => {742 Err(idx) => {740 let limits = ChainLimit::get();741 ensure!(admin_arr.len() < limits.collections_admins_limit as usize, Error::<T>::CollectionAdminsLimitExceeded);743 ensure!(admin_arr.len() < <limit!(T, CollectionAdminsLimit)>::get() as usize, Error::<T>::CollectionAdminsLimitExceeded);742 admin_arr.insert(idx, new_admin_id);744 admin_arr.insert(idx, new_admin_id);743 <AdminList<T>>::insert(collection_id, admin_arr);745 <AdminList<T>>::insert(collection_id, admin_arr);744 }746 }862864863 #[weight = <T as Config>::WeightInfo::create_item(data.data_size())]865 #[weight = <T as Config>::WeightInfo::create_item(data.data_size())]864 #[transactional]866 #[transactional]865 pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResult {867 pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData<ChainLimitsOf<T>>) -> DispatchResult {866 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);868 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);867 let collection = Self::get_collection(collection_id)?;869 let collection = Self::get_collection(collection_id)?;868870893 .map(|data| { data.data_size() })895 .map(|data| { data.data_size() })894 .sum())]896 .sum())]895 #[transactional]897 #[transactional]896 pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData>) -> DispatchResult {898 pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec<CreateItemData<ChainLimitsOf<T>>>) -> DispatchResult {897899898 ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);900 ensure!(!items_data.is_empty(), Error::<T>::EmptyArgument);899 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);901 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1138 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1140 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;113911411140 // check schema limit1142 // check schema limit1141 ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");1143 ensure!(schema.len() as u32 <= <limit!(T, OffchainSchemaLimit)>::get(), "");114211441143 target_collection.offchain_schema = schema;1145 target_collection.offchain_schema = schema;1144 target_collection.save()1146 target_collection.save()1168 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1170 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;116911711170 // check schema limit1172 // check schema limit1171 ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");1173 ensure!(schema.len() as u32 <= <limit!(T, ConstOnChainSchemaLimit)>::get(), "");117211741173 target_collection.const_on_chain_schema = schema;1175 target_collection.const_on_chain_schema = schema;1174 target_collection.save()1176 target_collection.save()1198 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1200 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;119912011200 // check schema limit1202 // check schema limit1201 ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");1203 ensure!(schema.len() as u32 <= <limit!(T, VariableOnChainSchemaLimit)>::get(), "");120212041203 target_collection.variable_on_chain_schema = schema;1205 target_collection.variable_on_chain_schema = schema;1204 target_collection.save()1206 target_collection.save()1205 }1207 }12061207 // Sudo permissions function1208 #[weight = <T as Config>::WeightInfo::set_chain_limits()]1209 #[transactional]1210 pub fn set_chain_limits(1211 origin,1212 limits: ChainLimits1213 ) -> DispatchResult {12141215 #[cfg(not(feature = "runtime-benchmarks"))]1216 ensure_root(origin)?;12171218 <ChainLimit>::put(limits);1219 Ok(())1220 }122112081222 #[weight = <T as Config>::WeightInfo::set_collection_limits()]1209 #[weight = <T as Config>::WeightInfo::set_collection_limits()]1223 #[transactional]1210 #[transactional]1230 let mut target_collection = Self::get_collection(collection_id)?;1217 let mut target_collection = Self::get_collection(collection_id)?;1231 Self::check_owner_permissions(&target_collection, sender.as_sub())?;1218 Self::check_owner_permissions(&target_collection, sender.as_sub())?;1232 let old_limits = &target_collection.limits;1219 let old_limits = &target_collection.limits;1233 let chain_limits = ChainLimit::get();123412201235 // collection bounds1221 // collection bounds1236 ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&1222 ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&1237 new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&1223 new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&1238 new_limits.sponsored_data_size <= chain_limits.custom_data_limit,1224 new_limits.sponsored_data_size <= <ChainLimitsOf<T> as ChainLimits>::CustomDataLimit::get(),1239 Error::<T>::CollectionLimitBoundsExceeded);1225 Error::<T>::CollectionLimitBoundsExceeded);124012261241 // token_limit check prev1227 // token_limit check prev1260 sender: &T::CrossAccountId,1246 sender: &T::CrossAccountId,1261 collection: &CollectionHandle<T>,1247 collection: &CollectionHandle<T>,1262 owner: &T::CrossAccountId,1248 owner: &T::CrossAccountId,1263 data: CreateItemData,1249 data: CreateItemData<ChainLimitsOf<T>>,1264 ) -> DispatchResult {1250 ) -> DispatchResult {1265 Self::can_create_items_in_collection(collection, sender, owner, 1)?;1251 Self::can_create_items_in_collection(collection, sender, owner, 1)?;1266 Self::validate_create_item_args(collection, &data)?;1252 Self::validate_create_item_args(collection, &data)?;1471 Self::token_exists(collection, item_id)?;1457 Self::token_exists(collection, item_id)?;147214581473 ensure!(1459 ensure!(1474 ChainLimit::get().custom_data_limit >= data.len() as u32,1460 <limit!(T, CustomDataLimit)>::get() >= data.len() as u32,1475 Error::<T>::TokenVariableDataLimitExceeded1461 Error::<T>::TokenVariableDataLimitExceeded1476 );1462 );147714631498 sender: &T::CrossAccountId,1484 sender: &T::CrossAccountId,1499 collection: &CollectionHandle<T>,1485 collection: &CollectionHandle<T>,1500 owner: &T::CrossAccountId,1486 owner: &T::CrossAccountId,1501 items_data: Vec<CreateItemData>,1487 items_data: Vec<CreateItemData<ChainLimitsOf<T>>>,1502 ) -> DispatchResult {1488 ) -> DispatchResult {1503 Self::can_create_items_in_collection(collection, sender, owner, items_data.len() as u32)?;1489 Self::can_create_items_in_collection(collection, sender, owner, items_data.len() as u32)?;15041490161215981613 fn validate_create_item_args(1599 fn validate_create_item_args(1614 target_collection: &CollectionHandle<T>,1600 target_collection: &CollectionHandle<T>,1615 data: &CreateItemData,1601 data: &CreateItemData<ChainLimitsOf<T>>,1616 ) -> DispatchResult {1602 ) -> DispatchResult {1617 match target_collection.mode {1603 match target_collection.mode {1618 CollectionMode::NFT => {1604 CollectionMode::NFT => {1619 if let CreateItemData::NFT(data) = data {1605 if let CreateItemData::NFT(data) = data {1620 // check sizes1606 // check sizes1621 ensure!(1607 ensure!(1622 ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,1608 <limit!(T, CustomDataLimit)>::get() >= data.const_data.len() as u32,1623 Error::<T>::TokenConstDataLimitExceeded1609 Error::<T>::TokenConstDataLimitExceeded1624 );1610 );1625 ensure!(1611 ensure!(1626 ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,1612 <limit!(T, CustomDataLimit)>::get() >= data.variable_data.len() as u32,1627 Error::<T>::TokenVariableDataLimitExceeded1613 Error::<T>::TokenVariableDataLimitExceeded1628 );1614 );1629 } else {1615 } else {1640 if let CreateItemData::ReFungible(data) = data {1626 if let CreateItemData::ReFungible(data) = data {1641 // check sizes1627 // check sizes1642 ensure!(1628 ensure!(1643 ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,1629 <limit!(T, CustomDataLimit)>::get() >= data.const_data.len() as u32,1644 Error::<T>::TokenConstDataLimitExceeded1630 Error::<T>::TokenConstDataLimitExceeded1645 );1631 );1646 ensure!(1632 ensure!(1647 ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,1633 <limit!(T, CustomDataLimit)>::get() >= data.variable_data.len() as u32,1648 Error::<T>::TokenVariableDataLimitExceeded1634 Error::<T>::TokenVariableDataLimitExceeded1649 );1635 );165016361669 fn create_item_no_validation(1655 fn create_item_no_validation(1670 collection: &CollectionHandle<T>,1656 collection: &CollectionHandle<T>,1671 owner: &T::CrossAccountId,1657 owner: &T::CrossAccountId,1672 data: CreateItemData,1658 data: CreateItemData<ChainLimitsOf<T>>,1673 ) -> DispatchResult {1659 ) -> DispatchResult {1674 match data {1660 match data {1675 CreateItemData::NFT(data) => {1661 CreateItemData::NFT(data) => {2292 // bound Owned tokens by a single address2278 // bound Owned tokens by a single address2293 let count = <AccountItemCount<T>>::get(owner.as_sub());2279 let count = <AccountItemCount<T>>::get(owner.as_sub());2294 ensure!(2280 ensure!(2295 count < ChainLimit::get().account_token_ownership_limit,2281 count < <limit!(T, AccountTokenOwnershipLimit)>::get(),2296 Error::<T>::AddressOwnershipLimitExceeded2282 Error::<T>::AddressOwnershipLimitExceeded2297 );2283 );22982284pallets/nft/src/sponsorship.rsdiffbeforeafterboth--- a/pallets/nft/src/sponsorship.rs
+++ b/pallets/nft/src/sponsorship.rs
@@ -1,13 +1,13 @@
use crate::{
Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket,
- ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, ChainLimit,
- CreateItemData, CollectionMode,
+ ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket,
+ CreateItemData, CollectionMode, limit,
};
use core::marker::PhantomData;
use up_sponsorship::SponsorshipHandler;
use frame_support::{
- traits::IsSubType,
- storage::{StorageMap, StorageDoubleMap, StorageValue},
+ traits::{IsSubType, Get},
+ storage::{StorageMap, StorageDoubleMap},
};
use nft_data_structs::{TokenId, CollectionId};
@@ -16,7 +16,7 @@
pub fn withdraw_create_item(
who: &T::AccountId,
collection_id: &CollectionId,
- _properties: &CreateItemData,
+ _properties: &CreateItemData<T::ChainLimits>,
) -> Option<T::AccountId> {
let collection = CollectionById::<T>::get(collection_id)?;
@@ -47,7 +47,6 @@
item_id: &TokenId,
) -> Option<T::AccountId> {
let collection = CollectionById::<T>::get(collection_id)?;
- let limits = ChainLimit::get();
let mut sponsor_transfer = false;
if collection.sponsorship.confirmed() {
@@ -62,7 +61,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.nft_sponsor_transfer_timeout
+ <limit!(T, NftSponsorTransferTimeout)>::get()
};
let mut sponsored = true;
@@ -84,7 +83,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.fungible_sponsor_transfer_timeout
+ <limit!(T, FungibleSponsorTransferTimeout)>::get()
};
let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
@@ -107,7 +106,7 @@
let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {
collection_limits.sponsor_transfer_timeout
} else {
- limits.refungible_sponsor_transfer_timeout
+ <limit!(T, ReFungibleSponsorTransferTimeout)>::get()
};
let mut sponsored = true;
primitives/nft/src/lib.rsdiffbeforeafterboth--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -28,14 +28,6 @@
pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;
pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;
-// TODO: Somehow use ChainLimits for BoundedVec len calculation?
-// Do we need ChainLimits anyway, if we can change them via forkless upgrades?
-parameter_types! {
-pub const MaxDataSize: u32 = 2048;
-// TODO: This limit isn't checked for substrate create_multiple_items call
-pub const MaxItemsPerBatch: u32 = 200;
-}
-
pub type CollectionId = u32;
pub type TokenId = u32;
pub type DecimalPoints = u8;
@@ -211,23 +203,25 @@
}
}
-#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct ChainLimits {
- pub collection_numbers_limit: u32,
- pub account_token_ownership_limit: u32,
- pub collections_admins_limit: u64,
- pub custom_data_limit: u32,
+pub trait ChainLimits {
+ type CollectionNumberLimit: Get<u32>;
+ type AccountTokenOwnershipLimit: Get<u32>;
+ type CollectionAdminsLimit: Get<u64>;
+ type CustomDataLimit: Get<u32>;
// Timeouts for item types in passed blocks
- pub nft_sponsor_transfer_timeout: u32,
- pub fungible_sponsor_transfer_timeout: u32,
- pub refungible_sponsor_transfer_timeout: u32,
+ type NftSponsorTransferTimeout: Get<u32>;
+ type FungibleSponsorTransferTimeout: Get<u32>;
+ type ReFungibleSponsorTransferTimeout: Get<u32>;
// Schema limits
- pub offchain_schema_limit: u32,
- pub variable_on_chain_schema_limit: u32,
- pub const_on_chain_schema_limit: u32,
+ type OffchainSchemaLimit: Get<u32>;
+ type VariableOnChainSchemaLimit: Get<u32>;
+ type ConstOnChainSchemaLimit: Get<u32>;
+
+ /// How much items can be created per single
+ /// create_many call
+ type MaxItemsPerBatch: Get<u32>;
}
/// BoundedVec doesn't supports serde
@@ -263,16 +257,16 @@
}
}
-#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative, Clone, PartialEq)]
+#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative)]
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-#[derivative(Debug)]
-pub struct CreateNftData {
+#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))]
+pub struct CreateNftData<T: ChainLimits> {
#[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
#[derivative(Debug = "ignore")]
- pub const_data: BoundedVec<u8, MaxDataSize>,
+ pub const_data: BoundedVec<u8, T::CustomDataLimit>,
#[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
#[derivative(Debug = "ignore")]
- pub variable_data: BoundedVec<u8, MaxDataSize>,
+ pub variable_data: BoundedVec<u8, T::CustomDataLimit>,
}
#[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq)]
@@ -281,28 +275,29 @@
pub value: u128,
}
-#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative, Clone, PartialEq)]
+#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative)]
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-#[derivative(Debug)]
-pub struct CreateReFungibleData {
+#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))]
+pub struct CreateReFungibleData<T: ChainLimits> {
#[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
#[derivative(Debug = "ignore")]
- pub const_data: BoundedVec<u8, MaxDataSize>,
+ pub const_data: BoundedVec<u8, T::CustomDataLimit>,
#[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]
#[derivative(Debug = "ignore")]
- pub variable_data: BoundedVec<u8, MaxDataSize>,
+ pub variable_data: BoundedVec<u8, T::CustomDataLimit>,
pub pieces: u128,
}
-#[derive(Encode, Decode, MaxEncodedLen, Debug, Clone, PartialEq)]
+#[derive(Encode, Decode, MaxEncodedLen, Derivative)]
#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub enum CreateItemData {
- NFT(CreateNftData),
+#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))]
+pub enum CreateItemData<T: ChainLimits> {
+ NFT(CreateNftData<T>),
Fungible(CreateFungibleData),
- ReFungible(CreateReFungibleData),
+ ReFungible(CreateReFungibleData<T>),
}
-impl CreateItemData {
+impl<T: ChainLimits> CreateItemData<T> {
pub fn data_size(&self) -> usize {
match self {
CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),
@@ -312,19 +307,19 @@
}
}
-impl From<CreateNftData> for CreateItemData {
- fn from(item: CreateNftData) -> Self {
+impl<T: ChainLimits> From<CreateNftData<T>> for CreateItemData<T> {
+ fn from(item: CreateNftData<T>) -> Self {
CreateItemData::NFT(item)
}
}
-impl From<CreateReFungibleData> for CreateItemData {
- fn from(item: CreateReFungibleData) -> Self {
+impl<T: ChainLimits> From<CreateReFungibleData<T>> for CreateItemData<T> {
+ fn from(item: CreateReFungibleData<T>) -> Self {
CreateItemData::ReFungible(item)
}
}
-impl From<CreateFungibleData> for CreateItemData {
+impl<T: ChainLimits> From<CreateFungibleData> for CreateItemData<T> {
fn from(item: CreateFungibleData) -> Self {
CreateItemData::Fungible(item)
}
runtime/src/lib.rsdiffbeforeafterboth--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -683,6 +683,35 @@
}
parameter_types! {
+ pub const CollectionNumberLimit: u32 = 100000;
+ pub const AccountTokenOwnershipLimit: u32 = 1000000;
+ pub const CollectionAdminsLimit: u64 = 5;
+ pub const CustomDataLimit: u32 = 2048;
+ pub const NftSponsorTransferTimeout: u32 = 5;
+ pub const FungibleSponsorTransferTimeout: u32 = 5;
+ pub const ReFungibleSponsorTransferTimeout: u32 = 5;
+ pub const OffchainSchemaLimit: u32 = 1024;
+ pub const VariableOnChainSchemaLimit: u32 = 1024;
+ pub const ConstOnChainSchemaLimit: u32 = 1024;
+ pub const MaxItemsPerBatch: u32 = 200;
+}
+
+pub struct ChainLimits;
+impl nft_data_structs::ChainLimits for ChainLimits {
+ type CollectionNumberLimit = CollectionNumberLimit;
+ type AccountTokenOwnershipLimit = AccountTokenOwnershipLimit;
+ type CollectionAdminsLimit = CollectionAdminsLimit;
+ type CustomDataLimit = CustomDataLimit;
+ type NftSponsorTransferTimeout = NftSponsorTransferTimeout;
+ type FungibleSponsorTransferTimeout = FungibleSponsorTransferTimeout;
+ type ReFungibleSponsorTransferTimeout = ReFungibleSponsorTransferTimeout;
+ type OffchainSchemaLimit = OffchainSchemaLimit;
+ type VariableOnChainSchemaLimit = VariableOnChainSchemaLimit;
+ type ConstOnChainSchemaLimit = ConstOnChainSchemaLimit;
+ type MaxItemsPerBatch = MaxItemsPerBatch;
+}
+
+parameter_types! {
pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();
pub const CollectionCreationPrice: Balance = 100 * UNIQUE;
}
@@ -699,6 +728,7 @@
type Currency = Balances;
type CollectionCreationPrice = CollectionCreationPrice;
type TreasuryAccountId = TreasuryAccountId;
+ type ChainLimits = ChainLimits;
}
parameter_types! {