--- a/pallets/nft/src/eth/sponsoring.rs +++ b/pallets/nft/src/eth/sponsoring.rs @@ -2,12 +2,11 @@ use crate::{ Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket, - eth::{account::EvmBackwardsAddressMapping, map_eth_to_id}, limit, + eth::{account::EvmBackwardsAddressMapping, map_eth_to_id}, }; use evm_coder::{Call, abi::AbiReader}; use frame_support::{ storage::{StorageMap, StorageDoubleMap}, - traits::Get, }; use sp_core::H160; use sp_std::prelude::*; @@ -18,6 +17,7 @@ }; use core::convert::TryInto; use core::marker::PhantomData; +use nft_data_structs::{NFT_SPONSOR_TRANSFER_TIMEOUT, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT}; struct AnyError; @@ -44,7 +44,7 @@ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 { collection_limits.sponsor_transfer_timeout } else { - ::get() + NFT_SPONSOR_TRANSFER_TIMEOUT }; let mut sponsor = true; @@ -75,7 +75,7 @@ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 { collection_limits.sponsor_transfer_timeout } else { - ::get() + FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT }; let block_number = >::block_number() as T::BlockNumber; --- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -38,7 +38,9 @@ use core::ops::{Deref, DerefMut}; use nft_data_structs::{ MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES, - AccessMode, ChainLimits, Collection, CreateItemData, CollectionLimits, CollectionId, + CUSTOM_DATA_LIMIT, COLLECTION_NUMBER_LIMIT, ACCOUNT_TOKEN_OWNERSHIP_LIMIT, + VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, COLLECTION_ADMINS_LIMIT, + OFFCHAIN_SCHEMA_LIMIT, AccessMode, Collection, CreateItemData, CollectionLimits, CollectionId, CollectionMode, TokenId, SchemaVersion, SponsorshipState, Ownership, NftItemType, FungibleItemType, ReFungibleItemType, }; @@ -243,15 +245,6 @@ <::Currency as Currency>::Balance, >; type TreasuryAccountId: Get; - type ChainLimits: ChainLimits; -} - -pub type ChainLimitsOf = ::ChainLimits; -#[macro_export] -macro_rules! limit { - ($config:ty, $limit:ident) => { - <$crate::ChainLimitsOf<$config> as nft_data_structs::ChainLimits>::$limit - } } // # Used definitions @@ -495,7 +488,7 @@ let destroyed_count = DestroyedCollectionCount::get(); // bound Total number of collections - ensure!(created_count - destroyed_count < ::get(), Error::::TotalCollectionsLimitExceeded); + ensure!(created_count - destroyed_count < COLLECTION_NUMBER_LIMIT, Error::::TotalCollectionsLimitExceeded); // check params ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::::CollectionDecimalPointLimitExceeded); @@ -511,7 +504,7 @@ CreatedCollectionCount::put(next_id); let limits = CollectionLimits { - sponsored_data_size: ::get(), + sponsored_data_size: CUSTOM_DATA_LIMIT, ..Default::default() }; @@ -740,7 +733,7 @@ match admin_arr.binary_search(&new_admin_id) { Ok(_) => {}, Err(idx) => { - ensure!(admin_arr.len() < ::get() as usize, Error::::CollectionAdminsLimitExceeded); + ensure!(admin_arr.len() < COLLECTION_ADMINS_LIMIT as usize, Error::::CollectionAdminsLimitExceeded); admin_arr.insert(idx, new_admin_id); >::insert(collection_id, admin_arr); } @@ -864,7 +857,7 @@ #[weight = ::WeightInfo::create_item(data.data_size())] #[transactional] - pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData>) -> DispatchResult { + pub fn create_item(origin, collection_id: CollectionId, owner: T::CrossAccountId, data: CreateItemData) -> DispatchResult { let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); let collection = Self::get_collection(collection_id)?; @@ -895,7 +888,7 @@ .map(|data| { data.data_size() }) .sum())] #[transactional] - pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec>>) -> DispatchResult { + pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::CrossAccountId, items_data: Vec) -> DispatchResult { ensure!(!items_data.is_empty(), Error::::EmptyArgument); let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); @@ -1140,7 +1133,7 @@ Self::check_owner_or_admin_permissions(&target_collection, &sender)?; // check schema limit - ensure!(schema.len() as u32 <= ::get(), ""); + ensure!(schema.len() as u32 <= OFFCHAIN_SCHEMA_LIMIT, ""); target_collection.offchain_schema = schema; target_collection.save() @@ -1170,7 +1163,7 @@ Self::check_owner_or_admin_permissions(&target_collection, &sender)?; // check schema limit - ensure!(schema.len() as u32 <= ::get(), ""); + ensure!(schema.len() as u32 <= CONST_ON_CHAIN_SCHEMA_LIMIT, ""); target_collection.const_on_chain_schema = schema; target_collection.save() @@ -1200,7 +1193,7 @@ Self::check_owner_or_admin_permissions(&target_collection, &sender)?; // check schema limit - ensure!(schema.len() as u32 <= ::get(), ""); + ensure!(schema.len() as u32 <= VARIABLE_ON_CHAIN_SCHEMA_LIMIT, ""); target_collection.variable_on_chain_schema = schema; target_collection.save() @@ -1221,7 +1214,7 @@ // collection bounds ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT && new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP && - new_limits.sponsored_data_size <= as ChainLimits>::CustomDataLimit::get(), + new_limits.sponsored_data_size <= CUSTOM_DATA_LIMIT, Error::::CollectionLimitBoundsExceeded); // token_limit check prev @@ -1246,7 +1239,7 @@ sender: &T::CrossAccountId, collection: &CollectionHandle, owner: &T::CrossAccountId, - data: CreateItemData>, + data: CreateItemData, ) -> DispatchResult { Self::can_create_items_in_collection(collection, sender, owner, 1)?; Self::validate_create_item_args(collection, &data)?; @@ -1457,7 +1450,7 @@ Self::token_exists(collection, item_id)?; ensure!( - ::get() >= data.len() as u32, + CUSTOM_DATA_LIMIT >= data.len() as u32, Error::::TokenVariableDataLimitExceeded ); @@ -1484,7 +1477,7 @@ sender: &T::CrossAccountId, collection: &CollectionHandle, owner: &T::CrossAccountId, - items_data: Vec>>, + items_data: Vec, ) -> DispatchResult { Self::can_create_items_in_collection(collection, sender, owner, items_data.len() as u32)?; @@ -1598,18 +1591,18 @@ fn validate_create_item_args( target_collection: &CollectionHandle, - data: &CreateItemData>, + data: &CreateItemData, ) -> DispatchResult { match target_collection.mode { CollectionMode::NFT => { if let CreateItemData::NFT(data) = data { // check sizes ensure!( - ::get() >= data.const_data.len() as u32, + CUSTOM_DATA_LIMIT >= data.const_data.len() as u32, Error::::TokenConstDataLimitExceeded ); ensure!( - ::get() >= data.variable_data.len() as u32, + CUSTOM_DATA_LIMIT >= data.variable_data.len() as u32, Error::::TokenVariableDataLimitExceeded ); } else { @@ -1626,11 +1619,11 @@ if let CreateItemData::ReFungible(data) = data { // check sizes ensure!( - ::get() >= data.const_data.len() as u32, + CUSTOM_DATA_LIMIT >= data.const_data.len() as u32, Error::::TokenConstDataLimitExceeded ); ensure!( - ::get() >= data.variable_data.len() as u32, + CUSTOM_DATA_LIMIT >= data.variable_data.len() as u32, Error::::TokenVariableDataLimitExceeded ); @@ -1655,7 +1648,7 @@ fn create_item_no_validation( collection: &CollectionHandle, owner: &T::CrossAccountId, - data: CreateItemData>, + data: CreateItemData, ) -> DispatchResult { match data { CreateItemData::NFT(data) => { @@ -2278,7 +2271,7 @@ // bound Owned tokens by a single address let count = >::get(owner.as_sub()); ensure!( - count < ::get(), + count < ACCOUNT_TOKEN_OWNERSHIP_LIMIT, Error::::AddressOwnershipLimitExceeded ); --- a/pallets/nft/src/sponsorship.rs +++ b/pallets/nft/src/sponsorship.rs @@ -1,22 +1,25 @@ use crate::{ Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket, - ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, - CreateItemData, CollectionMode, limit, + ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, CreateItemData, + CollectionMode, }; use core::marker::PhantomData; use up_sponsorship::SponsorshipHandler; use frame_support::{ - traits::{IsSubType, Get}, + traits::{IsSubType}, storage::{StorageMap, StorageDoubleMap}, }; -use nft_data_structs::{TokenId, CollectionId}; +use nft_data_structs::{ + TokenId, CollectionId, NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, + FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, +}; pub struct NftSponsorshipHandler(PhantomData); impl NftSponsorshipHandler { pub fn withdraw_create_item( who: &T::AccountId, collection_id: &CollectionId, - _properties: &CreateItemData, + _properties: &CreateItemData, ) -> Option { let collection = CollectionById::::get(collection_id)?; @@ -61,7 +64,7 @@ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 { collection_limits.sponsor_transfer_timeout } else { - ::get() + NFT_SPONSOR_TRANSFER_TIMEOUT }; let mut sponsored = true; @@ -83,7 +86,7 @@ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 { collection_limits.sponsor_transfer_timeout } else { - ::get() + FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT }; let block_number = >::block_number() as T::BlockNumber; @@ -106,7 +109,7 @@ let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 { collection_limits.sponsor_transfer_timeout } else { - ::get() + REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT }; let mut sponsored = true; --- a/primitives/nft/src/lib.rs +++ b/primitives/nft/src/lib.rs @@ -28,6 +28,29 @@ pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000; pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000; +pub const COLLECTION_NUMBER_LIMIT: u32 = 100000; +pub const CUSTOM_DATA_LIMIT: u32 = 2048; +pub const COLLECTION_ADMINS_LIMIT: u64 = 5; +pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = 1000000; + +// Timeouts for item types in passed blocks +pub const NFT_SPONSOR_TRANSFER_TIMEOUT: u32 = 5; +pub const FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5; +pub const REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5; + +// Schema limits +pub const OFFCHAIN_SCHEMA_LIMIT: u32 = 1024; +pub const VARIABLE_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024; +pub const CONST_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024; + +/// How much items can be created per single +/// create_many call +pub const MAX_ITEMS_PER_BATCH: u32 = 200; + +parameter_types! { + pub const CustomDataLimit: u32 = CUSTOM_DATA_LIMIT; +} + pub type CollectionId = u32; pub type TokenId = u32; pub type DecimalPoints = u8; @@ -203,27 +226,6 @@ } } -pub trait ChainLimits { - type CollectionNumberLimit: Get; - type AccountTokenOwnershipLimit: Get; - type CollectionAdminsLimit: Get; - type CustomDataLimit: Get; - - // Timeouts for item types in passed blocks - type NftSponsorTransferTimeout: Get; - type FungibleSponsorTransferTimeout: Get; - type ReFungibleSponsorTransferTimeout: Get; - - // Schema limits - type OffchainSchemaLimit: Get; - type VariableOnChainSchemaLimit: Get; - type ConstOnChainSchemaLimit: Get; - - /// How much items can be created per single - /// create_many call - type MaxItemsPerBatch: Get; -} - /// BoundedVec doesn't supports serde #[cfg(feature = "serde1")] mod bounded_serde { @@ -257,16 +259,16 @@ } } -#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative)] +#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))] -pub struct CreateNftData { +#[derivative(Debug)] +pub struct CreateNftData { #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))] #[derivative(Debug = "ignore")] - pub const_data: BoundedVec, + pub const_data: BoundedVec, #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))] #[derivative(Debug = "ignore")] - pub variable_data: BoundedVec, + pub variable_data: BoundedVec, } #[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq)] @@ -275,29 +277,28 @@ pub value: u128, } -#[derive(Encode, Decode, MaxEncodedLen, Default, Derivative)] +#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))] -pub struct CreateReFungibleData { +#[derivative(Debug)] +pub struct CreateReFungibleData { #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))] #[derivative(Debug = "ignore")] - pub const_data: BoundedVec, + pub const_data: BoundedVec, #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))] #[derivative(Debug = "ignore")] - pub variable_data: BoundedVec, + pub variable_data: BoundedVec, pub pieces: u128, } -#[derive(Encode, Decode, MaxEncodedLen, Derivative)] +#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -#[derivative(Debug(bound = ""), PartialEq(bound = ""), Clone(bound = ""))] -pub enum CreateItemData { - NFT(CreateNftData), +pub enum CreateItemData { + NFT(CreateNftData), Fungible(CreateFungibleData), - ReFungible(CreateReFungibleData), + ReFungible(CreateReFungibleData), } -impl CreateItemData { +impl CreateItemData { pub fn data_size(&self) -> usize { match self { CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(), @@ -307,19 +308,19 @@ } } -impl From> for CreateItemData { - fn from(item: CreateNftData) -> Self { +impl From for CreateItemData { + fn from(item: CreateNftData) -> Self { CreateItemData::NFT(item) } } -impl From> for CreateItemData { - fn from(item: CreateReFungibleData) -> Self { +impl From for CreateItemData { + fn from(item: CreateReFungibleData) -> Self { CreateItemData::ReFungible(item) } } -impl From for CreateItemData { +impl From for CreateItemData { fn from(item: CreateFungibleData) -> Self { CreateItemData::Fungible(item) } --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -683,35 +683,6 @@ } 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; } @@ -728,7 +699,6 @@ type Currency = Balances; type CollectionCreationPrice = CollectionCreationPrice; type TreasuryAccountId = TreasuryAccountId; - type ChainLimits = ChainLimits; } parameter_types! {