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

difftreelog

Merge pull request #65 from usetech-llc/feature/NFTPAR-288

Greg Zaitsev2021-01-18parents: #add913f #4e9eae9.patch.diff
in: master
Feature/nftpar 288

3 files changed

modifiednode/src/chain_spec.rsdiffbeforeafterboth
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -209,7 +209,10 @@
                 custom_data_limit: 2048,
                 nft_sponsor_transfer_timeout: 15,
                 fungible_sponsor_transfer_timeout: 15,
-                refungible_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,
             },
         }),
         pallet_contracts: Some(ContractsConfig {
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -74,6 +74,12 @@
     ReFungible(DecimalPoints),
 }
 
+impl Default for CollectionMode {
+    fn default() -> Self {
+        Self::Invalid
+    }
+}
+
 impl Into<u8> for CollectionMode {
     fn into(self) -> u8 {
         match self {
@@ -97,12 +103,6 @@
     }
 }
 
-impl Default for CollectionMode {
-    fn default() -> Self {
-        Self::Invalid
-    }
-}
-
 #[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub enum SchemaVersion {
@@ -208,6 +208,11 @@
     pub nft_sponsor_transfer_timeout: u32,
     pub fungible_sponsor_transfer_timeout: u32,
     pub refungible_sponsor_transfer_timeout: u32,
+
+    // Schema limits
+    pub offchain_schema_limit: u32,
+    pub variable_on_chain_schema_limit: u32,
+    pub const_on_chain_schema_limit: u32,
 }
 
 pub trait WeightInfo {
@@ -367,7 +372,9 @@
         /// Account token limit exceeded per collection
         AccountTokenLimitExceeded,
         /// Collection limit bounds per collection exceeded
-        CollectionLimitBoundsExceeded
+        CollectionLimitBoundsExceeded,
+        /// Schema data size limit bound exceeded
+        SchemaDataLimitExceeded
 	}
 }
 
@@ -1281,6 +1288,9 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
 
+            // check schema limit
+            ensure!(schema.len() as u32 > ChainLimit::get().offchain_schema_limit, "");
+
             let mut target_collection = <Collection<T>>::get(collection_id);
             target_collection.offchain_schema = schema;
             <Collection<T>>::insert(collection_id, target_collection);
@@ -1309,6 +1319,9 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
 
+            // check schema limit
+            ensure!(schema.len() as u32 > ChainLimit::get().const_on_chain_schema_limit, "");
+
             let mut target_collection = <Collection<T>>::get(collection_id);
             target_collection.const_on_chain_schema = schema;
             <Collection<T>>::insert(collection_id, target_collection);
@@ -1337,6 +1350,9 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
 
+            // check schema limit
+            ensure!(schema.len() as u32 > ChainLimit::get().variable_on_chain_schema_limit, "");
+
             let mut target_collection = <Collection<T>>::get(collection_id);
             target_collection.variable_on_chain_schema = schema;
             <Collection<T>>::insert(collection_id, target_collection);
addedpallets/nft/src/types.rsdiffbeforeafterboth
after · pallets/nft/src/types.rs
1#[cfg(feature = "std")]2pub use std::*;34#[cfg(feature = "std")]5pub use serde::*;67use codec::{Decode, Encode};89pub type CollectionId = u32;10pub type TokenId = u32;11pub type DecimalPoints = u8;1213#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]14#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]15pub enum CollectionMode {16    Invalid,17    NFT,18    // decimal points19    Fungible(DecimalPoints),20    // decimal points21    ReFungible(DecimalPoints),22}2324impl Into<u8> for CollectionMode {25    fn into(self) -> u8 {26        match self {27            CollectionMode::Invalid => 0,28            CollectionMode::NFT => 1,29            CollectionMode::Fungible(_) => 2,30            CollectionMode::ReFungible(_) => 3,31        }32    }33}3435#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]36#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]37pub enum AccessMode {38    Normal,39    WhiteList,40}41impl Default for AccessMode {42    fn default() -> Self {43        Self::Normal44    }45}4647impl Default for CollectionMode {48    fn default() -> Self {49        Self::Invalid50    }51}5253#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]54#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]55pub enum SchemaVersion {56    ImageURL,57    Unique,58}59impl Default for SchemaVersion {60    fn default() -> Self {61        Self::ImageURL62    }63}6465#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]66#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]67pub struct Ownership<AccountId> {68    pub owner: AccountId,69    pub fraction: u128,70}7172#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]73#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]74pub struct CollectionType<AccountId> {75    pub owner: AccountId,76    pub mode: CollectionMode,77    pub access: AccessMode,78    pub decimal_points: DecimalPoints,79    pub name: Vec<u16>,        // 64 include null escape char80    pub description: Vec<u16>, // 256 include null escape char81    pub token_prefix: Vec<u8>, // 16 include null escape char82    pub mint_mode: bool,83    pub offchain_schema: Vec<u8>,84    pub schema_version: SchemaVersion,85    pub sponsor: AccountId, // Who pays fees. If set to default address, the fees are applied to the transaction sender86    pub unconfirmed_sponsor: AccountId, // Sponsor address that has not yet confirmed sponsorship87    pub limits: CollectionLimits, // Collection private restrictions 88    pub variable_on_chain_schema: Vec<u8>, //89    pub const_on_chain_schema: Vec<u8>, //90}9192#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]93#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]94pub struct NftItemType<AccountId> {95    pub collection: CollectionId,96    pub owner: AccountId,97    pub const_data: Vec<u8>,98    pub variable_data: Vec<u8>,99}100101#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]102#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]103pub struct FungibleItemType<AccountId> {104    pub collection: CollectionId,105    pub owner: AccountId,106    pub value: u128,107}108109#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]110#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]111pub struct ReFungibleItemType<AccountId> {112    pub collection: CollectionId,113    pub owner: Vec<Ownership<AccountId>>,114    pub const_data: Vec<u8>,115    pub variable_data: Vec<u8>,116}117118#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]119#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]120pub struct ApprovePermissions<AccountId> {121    pub approved: AccountId,122    pub amount: u128,123}124125#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]126#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]127pub struct VestingItem<AccountId, Moment> {128    pub sender: AccountId,129    pub recipient: AccountId,130    pub collection_id: CollectionId,131    pub item_id: TokenId,132    pub amount: u64,133    pub vesting_date: Moment,134}135136#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]137#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]138pub struct BasketItem<AccountId, BlockNumber> {139    pub address: AccountId,140    pub start_block: BlockNumber,141}142143#[derive(Encode, Decode, Debug, Clone, PartialEq)]144#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]145pub struct CollectionLimits {146    pub account_token_ownership_limit: u32,147    pub sponsored_data_size: u32,148    pub token_limit: u32,149150    // Timeouts for item types in passed blocks151    pub sponsor_transfer_timeout: u32,152}153154impl Default for CollectionLimits {155    fn default() -> CollectionLimits {156        CollectionLimits { 157            account_token_ownership_limit: 10_000_000, 158            token_limit: u32::max_value(),159            sponsored_data_size: u32::max_value(), 160            sponsor_transfer_timeout: 14400 }161    }162}163164#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]165#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]166pub struct ChainLimits {167    pub collection_numbers_limit: u32,168    pub account_token_ownership_limit: u32,169    pub collections_admins_limit: u64,170    pub custom_data_limit: u32,171172    // Timeouts for item types in passed blocks173    pub nft_sponsor_transfer_timeout: u32,174    pub fungible_sponsor_transfer_timeout: u32,175    pub refungible_sponsor_transfer_timeout: u32,176}177178179#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]180#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]181pub struct CreateNftData {182    pub const_data: Vec<u8>,183    pub variable_data: Vec<u8>,184}185186#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]187#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]188pub struct CreateFungibleData {189}190191#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]192#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]193pub struct CreateReFungibleData {194    pub const_data: Vec<u8>,195    pub variable_data: Vec<u8>,196}197198#[derive(Encode, Decode, Debug, Clone, PartialEq)]199#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]200pub enum CreateItemData {201    NFT(CreateNftData),202    Fungible(CreateFungibleData),203    ReFungible(CreateReFungibleData),204}205206impl CreateItemData {207    pub fn len(&self) -> usize {208        let len = match self {209            CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(),210            CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(),211            _ => 0212        };213        214        return len;215    }216}217218impl From<CreateNftData> for CreateItemData {219    fn from(item: CreateNftData) -> Self {220        CreateItemData::NFT(item)221    }222}223224impl From<CreateReFungibleData> for CreateItemData {225    fn from(item: CreateReFungibleData) -> Self {226        CreateItemData::ReFungible(item)227    }228}229230impl From<CreateFungibleData> for CreateItemData {231    fn from(item: CreateFungibleData) -> Self {232        CreateItemData::Fungible(item)233    }234}