difftreelog
Merge pull request #179 from UniqueNetwork/fix/update-contracts-intergration
in: master
Fix contracts intergration
16 files changed
Cargo.lockdiffbeforeafterboth4935name = "nft-data-structs"4935name = "nft-data-structs"4936version = "0.9.0"4936version = "0.9.0"4937dependencies = [4937dependencies = [4938 "derivative",4938 "frame-support",4939 "frame-support",4939 "frame-system",4940 "frame-system",4941 "max-encoded-len",4940 "parity-scale-codec",4942 "parity-scale-codec",4941 "serde",4943 "serde",4942 "sp-core",4944 "sp-core",4943 "sp-runtime",4945 "sp-runtime",4946 "sp-std",4944]4947]494549484946[[package]]4949[[package]]4999 "cumulus-primitives-core",5002 "cumulus-primitives-core",5000 "cumulus-primitives-timestamp",5003 "cumulus-primitives-timestamp",5001 "cumulus-primitives-utility",5004 "cumulus-primitives-utility",5005 "derivative",5002 "fp-rpc",5006 "fp-rpc",5003 "frame-benchmarking",5007 "frame-benchmarking",5004 "frame-executive",5008 "frame-executive",5007 "frame-system-benchmarking",5011 "frame-system-benchmarking",5008 "frame-system-rpc-runtime-api",5012 "frame-system-rpc-runtime-api",5009 "hex-literal",5013 "hex-literal",5014 "max-encoded-len",5010 "nft-data-structs",5015 "nft-data-structs",5011 "pallet-aura",5016 "pallet-aura",5012 "pallet-balances",5017 "pallet-balances",node/cli/src/chain_spec.rsdiffbeforeafterboth202 nft_item_id: vec![],202 nft_item_id: vec![],203 fungible_item_id: vec![],203 fungible_item_id: vec![],204 refungible_item_id: vec![],204 refungible_item_id: vec![],205 chain_limit: ChainLimits {206 collection_numbers_limit: 100000,207 account_token_ownership_limit: 1000000,208 collections_admins_limit: 5,209 custom_data_limit: 2048,210 nft_sponsor_transfer_timeout: 15,211 fungible_sponsor_transfer_timeout: 15,212 refungible_sponsor_transfer_timeout: 15,213 offchain_schema_limit: 1024,214 variable_on_chain_schema_limit: 1024,215 const_on_chain_schema_limit: 1024,216 },217 },205 },218 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },206 parachain_info: nft_runtime::ParachainInfoConfig { parachain_id: id },219 aura: nft_runtime::AuraConfig {207 aura: nft_runtime::AuraConfig {pallets/nft/Cargo.tomldiffbeforeafterboth41 'evm-coder/std',41 'evm-coder/std',42 'pallet-evm-coder-substrate/std',42 'pallet-evm-coder-substrate/std',43]43]44limit-testing = ["nft-data-structs/limit-testing"]444545################################################################################46################################################################################46# Substrate Dependencies47# Substrate Dependenciespallets/nft/src/default_weights.rsdiffbeforeafterboth117 .saturating_add(DbWeight::get().reads(2_u64))117 .saturating_add(DbWeight::get().reads(2_u64))118 .saturating_add(DbWeight::get().writes(1_u64))118 .saturating_add(DbWeight::get().writes(1_u64))119 }119 }120 fn set_chain_limits() -> Weight {121 1_300_000_u64122 .saturating_add(DbWeight::get().reads(0_u64))123 .saturating_add(DbWeight::get().writes(1_u64))124 }125 fn set_contract_sponsoring_rate_limit() -> Weight {120 fn set_contract_sponsoring_rate_limit() -> Weight {126 3_500_000_u64121 3_500_000_u64127 .saturating_add(DbWeight::get().reads(0_u64))122 .saturating_add(DbWeight::get().reads(0_u64))pallets/nft/src/eth/sponsoring.rsdiffbeforeafterboth1//! Implements EVM sponsoring logic via OnChargeEVMTransaction1//! Implements EVM sponsoring logic via OnChargeEVMTransaction223use crate::{3use crate::{4 ChainLimit, Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,4 Collection, CollectionById, Config, FungibleTransferBasket, NftTransferBasket,5 eth::{account::EvmBackwardsAddressMapping, map_eth_to_id},5 eth::{account::EvmBackwardsAddressMapping, map_eth_to_id},6};6};7use evm_coder::{Call, abi::AbiReader};7use evm_coder::{Call, abi::AbiReader};8use frame_support::{8use frame_support::{9 storage::{StorageMap, StorageDoubleMap, StorageValue},9 storage::{StorageMap, StorageDoubleMap},10};10};11use sp_core::H160;11use sp_core::H160;12use sp_std::prelude::*;12use sp_std::prelude::*;17};17};18use core::convert::TryInto;18use core::convert::TryInto;19use core::marker::PhantomData;19use core::marker::PhantomData;20use nft_data_structs::{NFT_SPONSOR_TRANSFER_TIMEOUT, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT};202121struct AnyError;22struct AnyError;222343 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {44 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {44 collection_limits.sponsor_transfer_timeout45 collection_limits.sponsor_transfer_timeout45 } else {46 } else {46 ChainLimit::get().nft_sponsor_transfer_timeout47 NFT_SPONSOR_TRANSFER_TIMEOUT47 };48 };484949 let mut sponsor = true;50 let mut sponsor = true;74 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {75 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {75 collection_limits.sponsor_transfer_timeout76 collection_limits.sponsor_transfer_timeout76 } else {77 } else {77 ChainLimit::get().fungible_sponsor_transfer_timeout78 FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT78 };79 };798080 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;81 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;38use core::ops::{Deref, DerefMut};38use core::ops::{Deref, DerefMut};39use nft_data_structs::{39use nft_data_structs::{40 MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES,40 MAX_DECIMAL_POINTS, MAX_SPONSOR_TIMEOUT, MAX_TOKEN_OWNERSHIP, MAX_REFUNGIBLE_PIECES,41 CUSTOM_DATA_LIMIT, COLLECTION_NUMBER_LIMIT, ACCOUNT_TOKEN_OWNERSHIP_LIMIT,42 VARIABLE_ON_CHAIN_SCHEMA_LIMIT, CONST_ON_CHAIN_SCHEMA_LIMIT, COLLECTION_ADMINS_LIMIT,41 AccessMode, ChainLimits, Collection, CreateItemData, CollectionLimits, CollectionId,43 OFFCHAIN_SCHEMA_LIMIT, AccessMode, Collection, CreateItemData, CollectionLimits, CollectionId,42 CollectionMode, TokenId, SchemaVersion, SponsorshipState, Ownership, NftItemType,44 CollectionMode, TokenId, SchemaVersion, SponsorshipState, Ownership, NftItemType,43 FungibleItemType, ReFungibleItemType,45 FungibleItemType, ReFungibleItemType,44};46};86 fn set_variable_meta_data() -> Weight;88 fn set_variable_meta_data() -> Weight;87 fn enable_contract_sponsoring() -> Weight;89 fn enable_contract_sponsoring() -> Weight;88 fn set_schema_version() -> Weight;90 fn set_schema_version() -> Weight;89 fn set_chain_limits() -> Weight;90 fn set_contract_sponsoring_rate_limit() -> Weight;91 fn set_contract_sponsoring_rate_limit() -> Weight;91 fn set_variable_meta_data_sponsoring_rate_limit() -> Weight;92 fn set_variable_meta_data_sponsoring_rate_limit() -> Weight;92 fn toggle_contract_white_list() -> Weight;93 fn toggle_contract_white_list() -> Weight;280 ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;281 ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;281 //#endregion282 //#endregion282283 //#region Chain limits struct284 pub ChainLimit get(fn chain_limit) config(): ChainLimits;285 //#endregion286283287 //#region Bound counters284 //#region Bound counters288 /// Amount of collections destroyed, used for total amount tracking with285 /// Amount of collections destroyed, used for total amount tracking with435 origin: T::Origin432 origin: T::Origin436 {433 {437 fn deposit_event() = default;434 fn deposit_event() = default;435 const CollectionAdminsLimit: u64 = COLLECTION_ADMINS_LIMIT;438 type Error = Error<T>;436 type Error = Error<T>;439437440 fn on_initialize(_now: T::BlockNumber) -> Weight {438 fn on_initialize(_now: T::BlockNumber) -> Weight {486 _ => 0484 _ => 0487 };485 };488489 let chain_limit = ChainLimit::get();490486491 let created_count = CreatedCollectionCount::get();487 let created_count = CreatedCollectionCount::get();492 let destroyed_count = DestroyedCollectionCount::get();488 let destroyed_count = DestroyedCollectionCount::get();493489494 // bound Total number of collections490 // bound Total number of collections495 ensure!(created_count - destroyed_count < chain_limit.collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);491 ensure!(created_count - destroyed_count < COLLECTION_NUMBER_LIMIT, Error::<T>::TotalCollectionsLimitExceeded);496492497 // check params493 // check params498 ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);494 ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);508 CreatedCollectionCount::put(next_id);504 CreatedCollectionCount::put(next_id);509505510 let limits = CollectionLimits {506 let limits = CollectionLimits {511 sponsored_data_size: chain_limit.custom_data_limit,507 sponsored_data_size: CUSTOM_DATA_LIMIT,512 ..Default::default()508 ..Default::default()513 };509 };514510737 match admin_arr.binary_search(&new_admin_id) {733 match admin_arr.binary_search(&new_admin_id) {738 Ok(_) => {},734 Ok(_) => {},739 Err(idx) => {735 Err(idx) => {740 let limits = ChainLimit::get();741 ensure!(admin_arr.len() < limits.collections_admins_limit as usize, Error::<T>::CollectionAdminsLimitExceeded);736 ensure!(admin_arr.len() < COLLECTION_ADMINS_LIMIT as usize, Error::<T>::CollectionAdminsLimitExceeded);742 admin_arr.insert(idx, new_admin_id);737 admin_arr.insert(idx, new_admin_id);743 <AdminList<T>>::insert(collection_id, admin_arr);738 <AdminList<T>>::insert(collection_id, admin_arr);744 }739 }1138 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1133 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;113911341140 // check schema limit1135 // check schema limit1141 ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");1136 ensure!(schema.len() as u32 <= OFFCHAIN_SCHEMA_LIMIT, "");114211371143 target_collection.offchain_schema = schema;1138 target_collection.offchain_schema = schema;1144 target_collection.save()1139 target_collection.save()1168 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1163 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;116911641170 // check schema limit1165 // check schema limit1171 ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");1166 ensure!(schema.len() as u32 <= CONST_ON_CHAIN_SCHEMA_LIMIT, "");117211671173 target_collection.const_on_chain_schema = schema;1168 target_collection.const_on_chain_schema = schema;1174 target_collection.save()1169 target_collection.save()1198 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;1193 Self::check_owner_or_admin_permissions(&target_collection, &sender)?;119911941200 // check schema limit1195 // check schema limit1201 ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");1196 ensure!(schema.len() as u32 <= VARIABLE_ON_CHAIN_SCHEMA_LIMIT, "");120211971203 target_collection.variable_on_chain_schema = schema;1198 target_collection.variable_on_chain_schema = schema;1204 target_collection.save()1199 target_collection.save()1205 }1200 }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 }122112011222 #[weight = <T as Config>::WeightInfo::set_collection_limits()]1202 #[weight = <T as Config>::WeightInfo::set_collection_limits()]1223 #[transactional]1203 #[transactional]1230 let mut target_collection = Self::get_collection(collection_id)?;1210 let mut target_collection = Self::get_collection(collection_id)?;1231 Self::check_owner_permissions(&target_collection, sender.as_sub())?;1211 Self::check_owner_permissions(&target_collection, sender.as_sub())?;1232 let old_limits = &target_collection.limits;1212 let old_limits = &target_collection.limits;1233 let chain_limits = ChainLimit::get();123412131235 // collection bounds1214 // collection bounds1236 ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&1215 ensure!(new_limits.sponsor_transfer_timeout <= MAX_SPONSOR_TIMEOUT &&1237 new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&1216 new_limits.account_token_ownership_limit <= MAX_TOKEN_OWNERSHIP &&1238 new_limits.sponsored_data_size <= chain_limits.custom_data_limit,1217 new_limits.sponsored_data_size <= CUSTOM_DATA_LIMIT,1239 Error::<T>::CollectionLimitBoundsExceeded);1218 Error::<T>::CollectionLimitBoundsExceeded);124012191241 // token_limit check prev1220 // token_limit check prev1471 Self::token_exists(collection, item_id)?;1450 Self::token_exists(collection, item_id)?;147214511473 ensure!(1452 ensure!(1474 ChainLimit::get().custom_data_limit >= data.len() as u32,1453 CUSTOM_DATA_LIMIT >= data.len() as u32,1475 Error::<T>::TokenVariableDataLimitExceeded1454 Error::<T>::TokenVariableDataLimitExceeded1476 );1455 );147714561616 ) -> DispatchResult {1595 ) -> DispatchResult {1617 match target_collection.mode {1596 match target_collection.mode {1618 CollectionMode::NFT => {1597 CollectionMode::NFT => {1619 if let CreateItemData::NFT(data) = data {1598 if !matches!(data, CreateItemData::NFT(_)) {1620 // check sizes1621 ensure!(1622 ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,1623 Error::<T>::TokenConstDataLimitExceeded1624 );1625 ensure!(1626 ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,1627 Error::<T>::TokenVariableDataLimitExceeded1628 );1629 } else {1630 fail!(Error::<T>::NotNftDataUsedToMintNftCollectionToken);1599 fail!(Error::<T>::NotNftDataUsedToMintNftCollectionToken);1631 }1600 }1632 }1601 }1633 CollectionMode::Fungible(_) => {1602 CollectionMode::Fungible(_) => {1634 if let CreateItemData::Fungible(_) = data {1603 if !matches!(data, CreateItemData::Fungible(_)) {1635 } else {1636 fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);1604 fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);1637 }1605 }1638 }1606 }1639 CollectionMode::ReFungible => {1607 CollectionMode::ReFungible => {1640 if let CreateItemData::ReFungible(data) = data {1608 if let CreateItemData::ReFungible(data) = data {1641 // check sizes1642 ensure!(1643 ChainLimit::get().custom_data_limit >= data.const_data.len() as u32,1644 Error::<T>::TokenConstDataLimitExceeded1645 );1646 ensure!(1647 ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32,1648 Error::<T>::TokenVariableDataLimitExceeded1649 );16501651 // Check refungibility limits1609 // Check refungibility limits1652 ensure!(1610 ensure!(1675 CreateItemData::NFT(data) => {1633 CreateItemData::NFT(data) => {1676 let item = NftItemType {1634 let item = NftItemType {1677 owner: owner.clone(),1635 owner: owner.clone(),1678 const_data: data.const_data,1636 const_data: data.const_data.into_inner(),1679 variable_data: data.variable_data,1637 variable_data: data.variable_data.into_inner(),1680 };1638 };168116391682 Self::add_nft_item(collection, item)?;1640 Self::add_nft_item(collection, item)?;169216501693 let item = ReFungibleItemType {1651 let item = ReFungibleItemType {1694 owner: owner_list,1652 owner: owner_list,1695 const_data: data.const_data,1653 const_data: data.const_data.into_inner(),1696 variable_data: data.variable_data,1654 variable_data: data.variable_data.into_inner(),1697 };1655 };169816561699 Self::add_refungible_item(collection, item)?;1657 Self::add_refungible_item(collection, item)?;2292 // bound Owned tokens by a single address2250 // bound Owned tokens by a single address2293 let count = <AccountItemCount<T>>::get(owner.as_sub());2251 let count = <AccountItemCount<T>>::get(owner.as_sub());2294 ensure!(2252 ensure!(2295 count < ChainLimit::get().account_token_ownership_limit,2253 count < ACCOUNT_TOKEN_OWNERSHIP_LIMIT,2296 Error::<T>::AddressOwnershipLimitExceeded2254 Error::<T>::AddressOwnershipLimitExceeded2297 );2255 );22982256pallets/nft/src/sponsorship.rsdiffbeforeafterboth1use crate::{1use crate::{2 Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket,2 Config, Call, CollectionById, CreateItemBasket, VariableMetaDataBasket,3 ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, ChainLimit,3 ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, CreateItemData,4 CreateItemData, CollectionMode,4 CollectionMode,5};5};6use core::marker::PhantomData;6use core::marker::PhantomData;7use up_sponsorship::SponsorshipHandler;7use up_sponsorship::SponsorshipHandler;8use frame_support::{8use frame_support::{9 traits::IsSubType,9 traits::{IsSubType},10 storage::{StorageMap, StorageDoubleMap, StorageValue},10 storage::{StorageMap, StorageDoubleMap},11};11};12use nft_data_structs::{TokenId, CollectionId};12use nft_data_structs::{13 TokenId, CollectionId, NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,14 FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT,15};131614pub struct NftSponsorshipHandler<T>(PhantomData<T>);17pub struct NftSponsorshipHandler<T>(PhantomData<T>);47 item_id: &TokenId,50 item_id: &TokenId,48 ) -> Option<T::AccountId> {51 ) -> Option<T::AccountId> {49 let collection = CollectionById::<T>::get(collection_id)?;52 let collection = CollectionById::<T>::get(collection_id)?;50 let limits = ChainLimit::get();515352 let mut sponsor_transfer = false;54 let mut sponsor_transfer = false;53 if collection.sponsorship.confirmed() {55 if collection.sponsorship.confirmed() {62 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {64 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {63 collection_limits.sponsor_transfer_timeout65 collection_limits.sponsor_transfer_timeout64 } else {66 } else {65 limits.nft_sponsor_transfer_timeout67 NFT_SPONSOR_TRANSFER_TIMEOUT66 };68 };676968 let mut sponsored = true;70 let mut sponsored = true;84 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {86 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {85 collection_limits.sponsor_transfer_timeout87 collection_limits.sponsor_transfer_timeout86 } else {88 } else {87 limits.fungible_sponsor_transfer_timeout89 FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT88 };90 };899190 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;92 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;107 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {109 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {108 collection_limits.sponsor_transfer_timeout110 collection_limits.sponsor_transfer_timeout109 } else {111 } else {110 limits.refungible_sponsor_transfer_timeout112 REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT111 };113 };112114113 let mut sponsored = true;115 let mut sponsored = true;pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use super::*;2use super::*;3use crate::mock::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, ChainLimits, CreateItemData};4use crate::{AccessMode, CollectionMode, Ownership, CreateItemData};5use nft_data_structs::{5use nft_data_structs::{6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,6 CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7 MAX_DECIMAL_POINTS,7 MAX_DECIMAL_POINTS,8};8};9use frame_support::{assert_noop, assert_ok};9use frame_support::{assert_noop, assert_ok};10use frame_system::{RawOrigin};10use sp_std::convert::TryInto;111112fn default_collection_numbers_limit() -> u32 {13 1014}1516fn default_limits() {17 assert_ok!(TemplateModule::set_chain_limits(18 RawOrigin::Root.into(),19 ChainLimits {20 collection_numbers_limit: default_collection_numbers_limit(),21 account_token_ownership_limit: 10,22 collections_admins_limit: 5,23 custom_data_limit: 2048,24 nft_sponsor_transfer_timeout: 15,25 fungible_sponsor_transfer_timeout: 15,26 refungible_sponsor_transfer_timeout: 15,27 const_on_chain_schema_limit: 1024,28 offchain_schema_limit: 1024,29 variable_on_chain_schema_limit: 1024,30 }31 ));32}3334fn default_nft_data() -> CreateNftData {12fn default_nft_data() -> CreateNftData {35 CreateNftData {13 CreateNftData {36 const_data: vec![1, 2, 3],14 const_data: vec![1, 2, 3].try_into().unwrap(),37 variable_data: vec![3, 2, 1],15 variable_data: vec![3, 2, 1].try_into().unwrap(),38 }16 }39}17}4018442245fn default_re_fungible_data() -> CreateReFungibleData {23fn default_re_fungible_data() -> CreateReFungibleData {46 CreateReFungibleData {24 CreateReFungibleData {47 const_data: vec![1, 2, 3],25 const_data: vec![1, 2, 3].try_into().unwrap(),48 variable_data: vec![3, 2, 1],26 variable_data: vec![3, 2, 1].try_into().unwrap(),49 pieces: 1023,27 pieces: 1023,50 }28 }51}29}112#[test]90#[test]113fn set_version_schema() {91fn set_version_schema() {114 new_test_ext().execute_with(|| {92 new_test_ext().execute_with(|| {115 default_limits();116 let origin1 = Origin::signed(1);93 let origin1 = Origin::signed(1);117 let collection_id = create_test_collection(&CollectionMode::NFT, 1);94 let collection_id = create_test_collection(&CollectionMode::NFT, 1);11895133#[test]110#[test]134fn create_fungible_collection_fails_with_large_decimal_numbers() {111fn create_fungible_collection_fails_with_large_decimal_numbers() {135 new_test_ext().execute_with(|| {112 new_test_ext().execute_with(|| {136 default_limits();137138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();113 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();114 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();115 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();156#[test]131#[test]157fn create_nft_item() {132fn create_nft_item() {158 new_test_ext().execute_with(|| {133 new_test_ext().execute_with(|| {159 default_limits();160 let collection_id = create_test_collection(&CollectionMode::NFT, 1);134 let collection_id = create_test_collection(&CollectionMode::NFT, 1);161135162 let data = default_nft_data();136 let data = default_nft_data();163 create_test_item(collection_id, &data.clone().into());137 create_test_item(collection_id, &data.clone().into());164 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();138 let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();165 assert_eq!(item.const_data, data.const_data);139 assert_eq!(item.const_data, data.const_data.into_inner());166 assert_eq!(item.variable_data, data.variable_data);140 assert_eq!(item.variable_data, data.variable_data.into_inner());167 });141 });168}142}169143172#[test]146#[test]173fn create_nft_multiple_items() {147fn create_nft_multiple_items() {174 new_test_ext().execute_with(|| {148 new_test_ext().execute_with(|| {175 default_limits();176177 create_test_collection(&CollectionMode::NFT, 1);149 create_test_collection(&CollectionMode::NFT, 1);178150179 let origin1 = Origin::signed(1);151 let origin1 = Origin::signed(1);190 .map(|d| { d.into() })162 .map(|d| { d.into() })191 .collect()163 .collect()192 ));164 ));193 for (index, data) in items_data.iter().enumerate() {165 for (index, data) in items_data.into_iter().enumerate() {194 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();166 let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();195 assert_eq!(item.const_data.to_vec(), data.const_data);167 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());196 assert_eq!(item.variable_data.to_vec(), data.variable_data);168 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());197 }169 }198 });170 });199}171}200172201#[test]173#[test]202fn create_refungible_item() {174fn create_refungible_item() {203 new_test_ext().execute_with(|| {175 new_test_ext().execute_with(|| {204 default_limits();205 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);176 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);206177207 let data = default_re_fungible_data();178 let data = default_re_fungible_data();208 create_test_item(collection_id, &data.clone().into());179 create_test_item(collection_id, &data.clone().into());209 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();180 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();210 assert_eq!(item.const_data, data.const_data);181 assert_eq!(item.const_data, data.const_data.into_inner());211 assert_eq!(item.variable_data, data.variable_data);182 assert_eq!(item.variable_data, data.variable_data.into_inner());212 assert_eq!(183 assert_eq!(213 item.owner[0],184 item.owner[0],214 Ownership {185 Ownership {222#[test]193#[test]223fn create_multiple_refungible_items() {194fn create_multiple_refungible_items() {224 new_test_ext().execute_with(|| {195 new_test_ext().execute_with(|| {225 default_limits();226227 create_test_collection(&CollectionMode::ReFungible, 1);196 create_test_collection(&CollectionMode::ReFungible, 1);228197229 let origin1 = Origin::signed(1);198 let origin1 = Origin::signed(1);244 .map(|d| { d.into() })213 .map(|d| { d.into() })245 .collect()214 .collect()246 ));215 ));247 for (index, data) in items_data.iter().enumerate() {216 for (index, data) in items_data.into_iter().enumerate() {248 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();217 let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();249 assert_eq!(item.const_data.to_vec(), data.const_data);218 assert_eq!(item.const_data.to_vec(), data.const_data.into_inner());250 assert_eq!(item.variable_data.to_vec(), data.variable_data);219 assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner());251 assert_eq!(220 assert_eq!(252 item.owner[0],221 item.owner[0],253 Ownership {222 Ownership {262#[test]231#[test]263fn create_fungible_item() {232fn create_fungible_item() {264 new_test_ext().execute_with(|| {233 new_test_ext().execute_with(|| {265 default_limits();266267 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);234 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);268235269 let data = default_fungible_data();236 let data = default_fungible_data();302#[test]269#[test]303fn transfer_fungible_item() {270fn transfer_fungible_item() {304 new_test_ext().execute_with(|| {271 new_test_ext().execute_with(|| {305 default_limits();306307 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);308273309 let origin1 = Origin::signed(1);274 let origin1 = Origin::signed(1);344#[test]309#[test]345fn transfer_refungible_item() {310fn transfer_refungible_item() {346 new_test_ext().execute_with(|| {311 new_test_ext().execute_with(|| {347 default_limits();348349 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);312 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);350313351 let data = default_re_fungible_data();314 let data = default_re_fungible_data();355 let origin2 = Origin::signed(2);318 let origin2 = Origin::signed(2);356 {319 {357 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();320 let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();358 assert_eq!(item.const_data, data.const_data);321 assert_eq!(item.const_data, data.const_data.into_inner());359 assert_eq!(item.variable_data, data.variable_data);322 assert_eq!(item.variable_data, data.variable_data.into_inner());360 assert_eq!(323 assert_eq!(361 item.owner[0],324 item.owner[0],362 Ownership {325 Ownership {441#[test]404#[test]442fn transfer_nft_item() {405fn transfer_nft_item() {443 new_test_ext().execute_with(|| {406 new_test_ext().execute_with(|| {444 default_limits();445446 let collection_id = create_test_collection(&CollectionMode::NFT, 1);407 let collection_id = create_test_collection(&CollectionMode::NFT, 1);447408448 let data = default_nft_data();409 let data = default_nft_data();464#[test]425#[test]465fn nft_approve_and_transfer_from() {426fn nft_approve_and_transfer_from() {466 new_test_ext().execute_with(|| {427 new_test_ext().execute_with(|| {467 default_limits();468469 let collection_id = create_test_collection(&CollectionMode::NFT, 1);428 let collection_id = create_test_collection(&CollectionMode::NFT, 1);470429471 let data = default_nft_data();430 let data = default_nft_data();503#[test]462#[test]504fn nft_approve_and_transfer_from_white_list() {463fn nft_approve_and_transfer_from_white_list() {505 new_test_ext().execute_with(|| {464 new_test_ext().execute_with(|| {506 default_limits();507508 let collection_id = create_test_collection(&CollectionMode::NFT, 1);465 let collection_id = create_test_collection(&CollectionMode::NFT, 1);509466510 let origin1 = Origin::signed(1);467 let origin1 = Origin::signed(1);514 create_test_item(collection_id, &data.clone().into());471 create_test_item(collection_id, &data.clone().into());515472516 assert_eq!(473 assert_eq!(517 TemplateModule::nft_item_id(1, 1).unwrap().const_data,474 &TemplateModule::nft_item_id(1, 1).unwrap().const_data,518 data.const_data475 &data.const_data.into_inner()519 );476 );520 assert_eq!(TemplateModule::balance_count(1, 1), 1);477 assert_eq!(TemplateModule::balance_count(1, 1), 1);521 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);478 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573#[test]530#[test]574fn refungible_approve_and_transfer_from() {531fn refungible_approve_and_transfer_from() {575 new_test_ext().execute_with(|| {532 new_test_ext().execute_with(|| {576 default_limits();577578 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);533 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);579534580 let origin1 = Origin::signed(1);535 let origin1 = Origin::signed(1);636#[test]591#[test]637fn fungible_approve_and_transfer_from() {592fn fungible_approve_and_transfer_from() {638 new_test_ext().execute_with(|| {593 new_test_ext().execute_with(|| {639 default_limits();640641 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);594 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);642595643 let data = default_fungible_data();596 let data = default_fungible_data();710#[test]663#[test]711fn change_collection_owner() {664fn change_collection_owner() {712 new_test_ext().execute_with(|| {665 new_test_ext().execute_with(|| {713 default_limits();714715 let collection_id = create_test_collection(&CollectionMode::NFT, 1);666 let collection_id = create_test_collection(&CollectionMode::NFT, 1);716667717 let origin1 = Origin::signed(1);668 let origin1 = Origin::signed(1);730#[test]681#[test]731fn destroy_collection() {682fn destroy_collection() {732 new_test_ext().execute_with(|| {683 new_test_ext().execute_with(|| {733 default_limits();734735 let collection_id = create_test_collection(&CollectionMode::NFT, 1);684 let collection_id = create_test_collection(&CollectionMode::NFT, 1);736685737 let origin1 = Origin::signed(1);686 let origin1 = Origin::signed(1);742#[test]691#[test]743fn burn_nft_item() {692fn burn_nft_item() {744 new_test_ext().execute_with(|| {693 new_test_ext().execute_with(|| {745 default_limits();746747 let collection_id = create_test_collection(&CollectionMode::NFT, 1);694 let collection_id = create_test_collection(&CollectionMode::NFT, 1);748695749 let origin1 = Origin::signed(1);696 let origin1 = Origin::signed(1);773#[test]720#[test]774fn burn_fungible_item() {721fn burn_fungible_item() {775 new_test_ext().execute_with(|| {722 new_test_ext().execute_with(|| {776 default_limits();777778 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);723 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);779724780 let origin1 = Origin::signed(1);725 let origin1 = Origin::signed(1);804#[test]749#[test]805fn burn_refungible_item() {750fn burn_refungible_item() {806 new_test_ext().execute_with(|| {751 new_test_ext().execute_with(|| {807 default_limits();808809 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);752 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);810 let origin1 = Origin::signed(1);753 let origin1 = Origin::signed(1);811754851#[test]794#[test]852fn add_collection_admin() {795fn add_collection_admin() {853 new_test_ext().execute_with(|| {796 new_test_ext().execute_with(|| {854 default_limits();855856 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);797 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);857 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);798 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);858 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);799 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);879#[test]820#[test]880fn remove_collection_admin() {821fn remove_collection_admin() {881 new_test_ext().execute_with(|| {822 new_test_ext().execute_with(|| {882 default_limits();883884 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);823 let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);885 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);824 create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);886 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);825 create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);916#[test]855#[test]917fn balance_of() {856fn balance_of() {918 new_test_ext().execute_with(|| {857 new_test_ext().execute_with(|| {919 default_limits();920921 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);858 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);922 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);859 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);923 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);860 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);969#[test]906#[test]970fn approve() {907fn approve() {971 new_test_ext().execute_with(|| {908 new_test_ext().execute_with(|| {972 default_limits();973974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);909 let collection_id = create_test_collection(&CollectionMode::NFT, 1);975910976 let data = default_nft_data();911 let data = default_nft_data();987#[test]922#[test]988fn transfer_from() {923fn transfer_from() {989 new_test_ext().execute_with(|| {924 new_test_ext().execute_with(|| {990 default_limits();991992 let collection_id = create_test_collection(&CollectionMode::NFT, 1);925 let collection_id = create_test_collection(&CollectionMode::NFT, 1);993 let origin1 = Origin::signed(1);926 let origin1 = Origin::signed(1);994 let origin2 = Origin::signed(2);927 let origin2 = Origin::signed(2);1051#[test]984#[test]1052fn owner_can_add_address_to_white_list() {985fn owner_can_add_address_to_white_list() {1053 new_test_ext().execute_with(|| {986 new_test_ext().execute_with(|| {1054 default_limits();10551056 let collection_id = create_test_collection(&CollectionMode::NFT, 1);987 let collection_id = create_test_collection(&CollectionMode::NFT, 1);10579881058 let origin1 = Origin::signed(1);989 let origin1 = Origin::signed(1);1068#[test]999#[test]1069fn admin_can_add_address_to_white_list() {1000fn admin_can_add_address_to_white_list() {1070 new_test_ext().execute_with(|| {1001 new_test_ext().execute_with(|| {1071 default_limits();10721073 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1002 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1074 let origin1 = Origin::signed(1);1003 let origin1 = Origin::signed(1);1075 let origin2 = Origin::signed(2);1004 let origin2 = Origin::signed(2);1091#[test]1020#[test]1092fn nonprivileged_user_cannot_add_address_to_white_list() {1021fn nonprivileged_user_cannot_add_address_to_white_list() {1093 new_test_ext().execute_with(|| {1022 new_test_ext().execute_with(|| {1094 default_limits();10951096 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1023 let collection_id = create_test_collection(&CollectionMode::NFT, 1);109710241098 let origin2 = Origin::signed(2);1025 let origin2 = Origin::signed(2);1106#[test]1033#[test]1107fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1034fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1108 new_test_ext().execute_with(|| {1035 new_test_ext().execute_with(|| {1109 default_limits();11101111 let origin1 = Origin::signed(1);1036 let origin1 = Origin::signed(1);111210371113 assert_noop!(1038 assert_noop!(1120#[test]1045#[test]1121fn nobody_can_add_address_to_white_list_of_deleted_collection() {1046fn nobody_can_add_address_to_white_list_of_deleted_collection() {1122 new_test_ext().execute_with(|| {1047 new_test_ext().execute_with(|| {1123 default_limits();11241125 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1048 let collection_id = create_test_collection(&CollectionMode::NFT, 1);112610491127 let origin1 = Origin::signed(1);1050 let origin1 = Origin::signed(1);1140#[test]1063#[test]1141fn address_is_already_added_to_white_list() {1064fn address_is_already_added_to_white_list() {1142 new_test_ext().execute_with(|| {1065 new_test_ext().execute_with(|| {1143 default_limits();11441145 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1066 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1146 let origin1 = Origin::signed(1);1067 let origin1 = Origin::signed(1);114710681162#[test]1083#[test]1163fn owner_can_remove_address_from_white_list() {1084fn owner_can_remove_address_from_white_list() {1164 new_test_ext().execute_with(|| {1085 new_test_ext().execute_with(|| {1165 default_limits();11661167 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1086 let collection_id = create_test_collection(&CollectionMode::NFT, 1);116810871169 let origin1 = Origin::signed(1);1088 let origin1 = Origin::signed(1);1184#[test]1103#[test]1185fn admin_can_remove_address_from_white_list() {1104fn admin_can_remove_address_from_white_list() {1186 new_test_ext().execute_with(|| {1105 new_test_ext().execute_with(|| {1187 default_limits();11881189 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1106 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1190 let origin1 = Origin::signed(1);1107 let origin1 = Origin::signed(1);1191 let origin2 = Origin::signed(2);1108 let origin2 = Origin::signed(2);1213#[test]1130#[test]1214fn nonprivileged_user_cannot_remove_address_from_white_list() {1131fn nonprivileged_user_cannot_remove_address_from_white_list() {1215 new_test_ext().execute_with(|| {1132 new_test_ext().execute_with(|| {1216 default_limits();12171218 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1133 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1219 let origin1 = Origin::signed(1);1134 let origin1 = Origin::signed(1);1220 let origin2 = Origin::signed(2);1135 let origin2 = Origin::signed(2);1235#[test]1150#[test]1236fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1151fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1237 new_test_ext().execute_with(|| {1152 new_test_ext().execute_with(|| {1238 default_limits();1239 let origin1 = Origin::signed(1);1153 let origin1 = Origin::signed(1);124011541241 assert_noop!(1155 assert_noop!(1248#[test]1162#[test]1249fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1163fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1250 new_test_ext().execute_with(|| {1164 new_test_ext().execute_with(|| {1251 default_limits();12521253 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1165 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1254 let origin1 = Origin::signed(1);1166 let origin1 = Origin::signed(1);1255 let origin2 = Origin::signed(2);1167 let origin2 = Origin::signed(2);1272#[test]1184#[test]1273fn address_is_already_removed_from_white_list() {1185fn address_is_already_removed_from_white_list() {1274 new_test_ext().execute_with(|| {1186 new_test_ext().execute_with(|| {1275 default_limits();12761277 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1187 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1278 let origin1 = Origin::signed(1);1188 let origin1 = Origin::signed(1);127911891300#[test]1210#[test]1301fn white_list_test_1() {1211fn white_list_test_1() {1302 new_test_ext().execute_with(|| {1212 new_test_ext().execute_with(|| {1303 default_limits();13041305 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1213 let collection_id = create_test_collection(&CollectionMode::NFT, 1);130612141307 let origin1 = Origin::signed(1);1215 let origin1 = Origin::signed(1);1330#[test]1238#[test]1331fn white_list_test_2() {1239fn white_list_test_2() {1332 new_test_ext().execute_with(|| {1240 new_test_ext().execute_with(|| {1333 default_limits();13341335 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1241 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1336 let origin1 = Origin::signed(1);1242 let origin1 = Origin::signed(1);133712431381#[test]1287#[test]1382fn white_list_test_3() {1288fn white_list_test_3() {1383 new_test_ext().execute_with(|| {1289 new_test_ext().execute_with(|| {1384 default_limits();13851386 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1290 let collection_id = create_test_collection(&CollectionMode::NFT, 1);138712911388 let origin1 = Origin::signed(1);1292 let origin1 = Origin::signed(1);1411#[test]1315#[test]1412fn white_list_test_4() {1316fn white_list_test_4() {1413 new_test_ext().execute_with(|| {1317 new_test_ext().execute_with(|| {1414 default_limits();14151416 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1318 let collection_id = create_test_collection(&CollectionMode::NFT, 1);141713191418 let origin1 = Origin::signed(1);1320 let origin1 = Origin::signed(1);1463#[test]1365#[test]1464fn white_list_test_5() {1366fn white_list_test_5() {1465 new_test_ext().execute_with(|| {1367 new_test_ext().execute_with(|| {1466 default_limits();14671468 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1368 let collection_id = create_test_collection(&CollectionMode::NFT, 1);146913691470 let origin1 = Origin::signed(1);1370 let origin1 = Origin::signed(1);1488#[test]1388#[test]1489fn white_list_test_6() {1389fn white_list_test_6() {1490 new_test_ext().execute_with(|| {1390 new_test_ext().execute_with(|| {1491 default_limits();14921493 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1391 let collection_id = create_test_collection(&CollectionMode::NFT, 1);149413921495 let origin1 = Origin::signed(1);1393 let origin1 = Origin::signed(1);1516#[test]1414#[test]1517fn white_list_test_7() {1415fn white_list_test_7() {1518 new_test_ext().execute_with(|| {1416 new_test_ext().execute_with(|| {1519 default_limits();15201521 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1417 let collection_id = create_test_collection(&CollectionMode::NFT, 1);152214181523 let data = default_nft_data();1419 let data = default_nft_data();1548#[test]1444#[test]1549fn white_list_test_8() {1445fn white_list_test_8() {1550 new_test_ext().execute_with(|| {1446 new_test_ext().execute_with(|| {1551 default_limits();15521553 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1447 let collection_id = create_test_collection(&CollectionMode::NFT, 1);155414481555 let data = default_nft_data();1449 let data = default_nft_data();1598#[test]1492#[test]1599fn white_list_test_9() {1493fn white_list_test_9() {1600 new_test_ext().execute_with(|| {1494 new_test_ext().execute_with(|| {1601 default_limits();16021603 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1495 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1604 let origin1 = Origin::signed(1);1496 let origin1 = Origin::signed(1);160514971623#[test]1515#[test]1624fn white_list_test_10() {1516fn white_list_test_10() {1625 new_test_ext().execute_with(|| {1517 new_test_ext().execute_with(|| {1626 default_limits();16271628 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1518 let collection_id = create_test_collection(&CollectionMode::NFT, 1);162915191630 let origin1 = Origin::signed(1);1520 let origin1 = Origin::signed(1);1660#[test]1550#[test]1661fn white_list_test_11() {1551fn white_list_test_11() {1662 new_test_ext().execute_with(|| {1552 new_test_ext().execute_with(|| {1663 default_limits();16641665 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1553 let collection_id = create_test_collection(&CollectionMode::NFT, 1);166615541667 let origin1 = Origin::signed(1);1555 let origin1 = Origin::signed(1);1694#[test]1582#[test]1695fn white_list_test_12() {1583fn white_list_test_12() {1696 new_test_ext().execute_with(|| {1584 new_test_ext().execute_with(|| {1697 default_limits();16981699 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1585 let collection_id = create_test_collection(&CollectionMode::NFT, 1);170015861701 let origin1 = Origin::signed(1);1587 let origin1 = Origin::signed(1);1723#[test]1609#[test]1724fn white_list_test_13() {1610fn white_list_test_13() {1725 new_test_ext().execute_with(|| {1611 new_test_ext().execute_with(|| {1726 default_limits();17271728 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1612 let collection_id = create_test_collection(&CollectionMode::NFT, 1);172916131730 let origin1 = Origin::signed(1);1614 let origin1 = Origin::signed(1);1749#[test]1633#[test]1750fn white_list_test_14() {1634fn white_list_test_14() {1751 new_test_ext().execute_with(|| {1635 new_test_ext().execute_with(|| {1752 default_limits();17531754 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1636 let collection_id = create_test_collection(&CollectionMode::NFT, 1);175516371756 let origin1 = Origin::signed(1);1638 let origin1 = Origin::signed(1);1786#[test]1668#[test]1787fn white_list_test_15() {1669fn white_list_test_15() {1788 new_test_ext().execute_with(|| {1670 new_test_ext().execute_with(|| {1789 default_limits();17901791 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1671 let collection_id = create_test_collection(&CollectionMode::NFT, 1);179216721793 let origin1 = Origin::signed(1);1673 let origin1 = Origin::signed(1);1815#[test]1695#[test]1816fn white_list_test_16() {1696fn white_list_test_16() {1817 new_test_ext().execute_with(|| {1697 new_test_ext().execute_with(|| {1818 default_limits();18191820 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1698 let collection_id = create_test_collection(&CollectionMode::NFT, 1);182116991822 let origin1 = Origin::signed(1);1700 let origin1 = Origin::signed(1);1851#[test]1729#[test]1852fn total_number_collections_bound() {1730fn total_number_collections_bound() {1853 new_test_ext().execute_with(|| {1731 new_test_ext().execute_with(|| {1854 default_limits();18551856 create_test_collection(&CollectionMode::NFT, 1);1732 create_test_collection(&CollectionMode::NFT, 1);1857 });1733 });1858}1734}1861#[test]1737#[test]1862fn total_number_collections_bound_neg() {1738fn total_number_collections_bound_neg() {1863 new_test_ext().execute_with(|| {1739 new_test_ext().execute_with(|| {1864 default_limits();18651866 let origin1 = Origin::signed(1);1740 let origin1 = Origin::signed(1);186717411868 for i in 0..default_collection_numbers_limit() {1742 for i in 0..COLLECTION_NUMBER_LIMIT {1869 create_test_collection(&CollectionMode::NFT, i + 1);1743 create_test_collection(&CollectionMode::NFT, i + 1);1870 }1744 }187117451891#[test]1765#[test]1892fn owned_tokens_bound() {1766fn owned_tokens_bound() {1893 new_test_ext().execute_with(|| {1767 new_test_ext().execute_with(|| {1894 default_limits();18951896 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1768 let collection_id = create_test_collection(&CollectionMode::NFT, 1);189717691898 let data = default_nft_data();1770 let data = default_nft_data();1905#[test]1777#[test]1906fn owned_tokens_bound_neg() {1778fn owned_tokens_bound_neg() {1907 new_test_ext().execute_with(|| {1779 new_test_ext().execute_with(|| {1908 assert_ok!(TemplateModule::set_chain_limits(1909 RawOrigin::Root.into(),1910 ChainLimits {1911 collection_numbers_limit: 10,1912 account_token_ownership_limit: 1,1913 collections_admins_limit: 5,1914 custom_data_limit: 2048,1915 nft_sponsor_transfer_timeout: 15,1916 fungible_sponsor_transfer_timeout: 15,1917 refungible_sponsor_transfer_timeout: 15,1918 const_on_chain_schema_limit: 1024,1919 offchain_schema_limit: 1024,1920 variable_on_chain_schema_limit: 1024,1921 }1922 ));19231924 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1780 let collection_id = create_test_collection(&CollectionMode::NFT, 1);192517811926 let origin1 = Origin::signed(1);1782 let origin1 = Origin::signed(1);1927 let data = default_nft_data();1928 create_test_item(collection_id, &data.clone().into());192917831784 for _ in 0..ACCOUNT_TOKEN_OWNERSHIP_LIMIT {1785 let data = default_nft_data();1786 create_test_item(collection_id, &data.clone().into());1787 }17881789 let data = default_nft_data();1930 assert_noop!(1790 assert_noop!(1931 TemplateModule::create_item(origin1, 1, account(1), data.into()),1791 TemplateModule::create_item(origin1, 1, account(1), data.into()),1932 Error::<Test>::AddressOwnershipLimitExceeded1792 Error::<Test>::AddressOwnershipLimitExceeded1938#[test]1798#[test]1939fn collection_admins_bound() {1799fn collection_admins_bound() {1940 new_test_ext().execute_with(|| {1800 new_test_ext().execute_with(|| {1941 assert_ok!(TemplateModule::set_chain_limits(1942 RawOrigin::Root.into(),1943 ChainLimits {1944 collection_numbers_limit: 10,1945 account_token_ownership_limit: 10,1946 collections_admins_limit: 2,1947 custom_data_limit: 2048,1948 nft_sponsor_transfer_timeout: 15,1949 fungible_sponsor_transfer_timeout: 15,1950 refungible_sponsor_transfer_timeout: 15,1951 const_on_chain_schema_limit: 1024,1952 offchain_schema_limit: 1024,1953 variable_on_chain_schema_limit: 1024,1954 }1955 ));19561957 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1801 let collection_id = create_test_collection(&CollectionMode::NFT, 1);195818021959 let origin1 = Origin::signed(1);1803 let origin1 = Origin::signed(1);1975#[test]1819#[test]1976fn collection_admins_bound_neg() {1820fn collection_admins_bound_neg() {1977 new_test_ext().execute_with(|| {1821 new_test_ext().execute_with(|| {1978 assert_ok!(TemplateModule::set_chain_limits(1979 RawOrigin::Root.into(),1980 ChainLimits {1981 collection_numbers_limit: 10,1982 account_token_ownership_limit: 1,1983 collections_admins_limit: 1,1984 custom_data_limit: 2048,1985 nft_sponsor_transfer_timeout: 15,1986 fungible_sponsor_transfer_timeout: 15,1987 refungible_sponsor_transfer_timeout: 15,1988 const_on_chain_schema_limit: 1024,1989 offchain_schema_limit: 1024,1990 variable_on_chain_schema_limit: 1024,1991 }1992 ));19931994 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1822 let collection_id = create_test_collection(&CollectionMode::NFT, 1);199518231996 let origin1 = Origin::signed(1);1824 let origin1 = Origin::signed(1);199718251998 assert_ok!(TemplateModule::add_collection_admin(1826 for i in 0..COLLECTION_ADMINS_LIMIT {1827 assert_ok!(TemplateModule::add_collection_admin(1999 origin1.clone(),1828 origin1.clone(),2000 collection_id,1829 collection_id,2001 account(2)1830 account(2 + i)2002 ));1831 ));1832 }2003 assert_noop!(1833 assert_noop!(2004 TemplateModule::add_collection_admin(origin1, collection_id, account(3)),1834 TemplateModule::add_collection_admin(1835 origin1,1836 collection_id,1837 account(3 + COLLECTION_ADMINS_LIMIT)1838 ),2005 Error::<Test>::CollectionAdminsLimitExceeded1839 Error::<Test>::CollectionAdminsLimitExceeded2006 );1840 );2007 });1841 });2008}1842}20092010// NFT custom data size. Negative test const_data.2011#[test]2012fn custom_data_size_nft_const_data_bound_neg() {2013 new_test_ext().execute_with(|| {2014 assert_ok!(TemplateModule::set_chain_limits(2015 RawOrigin::Root.into(),2016 ChainLimits {2017 collection_numbers_limit: 10,2018 account_token_ownership_limit: 10,2019 collections_admins_limit: 5,2020 custom_data_limit: 2,2021 nft_sponsor_transfer_timeout: 15,2022 fungible_sponsor_transfer_timeout: 15,2023 refungible_sponsor_transfer_timeout: 15,2024 const_on_chain_schema_limit: 1024,2025 offchain_schema_limit: 1024,2026 variable_on_chain_schema_limit: 1024,2027 }2028 ));20292030 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20312032 let origin1 = Origin::signed(1);2033 let too_big_const_data = CreateItemData::NFT(CreateNftData {2034 const_data: vec![1, 2, 3, 4],2035 variable_data: vec![],2036 });20372038 assert_noop!(2039 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2040 Error::<Test>::TokenConstDataLimitExceeded2041 );2042 });2043}20442045// NFT custom data size. Negative test variable_data.2046#[test]2047fn custom_data_size_nft_variable_data_bound_neg() {2048 new_test_ext().execute_with(|| {2049 assert_ok!(TemplateModule::set_chain_limits(2050 RawOrigin::Root.into(),2051 ChainLimits {2052 collection_numbers_limit: 10,2053 account_token_ownership_limit: 10,2054 collections_admins_limit: 5,2055 custom_data_limit: 2,2056 nft_sponsor_transfer_timeout: 15,2057 fungible_sponsor_transfer_timeout: 15,2058 refungible_sponsor_transfer_timeout: 15,2059 const_on_chain_schema_limit: 1024,2060 offchain_schema_limit: 1024,2061 variable_on_chain_schema_limit: 1024,2062 }2063 ));20642065 let collection_id = create_test_collection(&CollectionMode::NFT, 1);20662067 let origin1 = Origin::signed(1);2068 let too_big_const_data = CreateItemData::NFT(CreateNftData {2069 const_data: vec![],2070 variable_data: vec![1, 2, 3, 4],2071 });20722073 assert_noop!(2074 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2075 Error::<Test>::TokenVariableDataLimitExceeded2076 );2077 });2078}20792080// Re fungible custom data size. Negative test const_data.2081#[test]2082fn custom_data_size_re_fungible_const_data_bound_neg() {2083 new_test_ext().execute_with(|| {2084 assert_ok!(TemplateModule::set_chain_limits(2085 RawOrigin::Root.into(),2086 ChainLimits {2087 collection_numbers_limit: 10,2088 account_token_ownership_limit: 10,2089 collections_admins_limit: 5,2090 custom_data_limit: 2,2091 nft_sponsor_transfer_timeout: 15,2092 fungible_sponsor_transfer_timeout: 15,2093 refungible_sponsor_transfer_timeout: 15,2094 const_on_chain_schema_limit: 1024,2095 offchain_schema_limit: 1024,2096 variable_on_chain_schema_limit: 1024,2097 }2098 ));20992100 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21012102 let origin1 = Origin::signed(1);2103 let too_big_const_data = CreateItemData::NFT(CreateNftData {2104 const_data: vec![1, 2, 3, 4],2105 variable_data: vec![],2106 });21072108 assert_noop!(2109 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2110 Error::<Test>::TokenConstDataLimitExceeded2111 );2112 });2113}21142115// Re fungible custom data size. Negative test variable_data.2116#[test]2117fn custom_data_size_re_fungible_variable_data_bound_neg() {2118 new_test_ext().execute_with(|| {2119 assert_ok!(TemplateModule::set_chain_limits(2120 RawOrigin::Root.into(),2121 ChainLimits {2122 collection_numbers_limit: 10,2123 account_token_ownership_limit: 10,2124 collections_admins_limit: 5,2125 custom_data_limit: 2,2126 nft_sponsor_transfer_timeout: 15,2127 fungible_sponsor_transfer_timeout: 15,2128 refungible_sponsor_transfer_timeout: 15,2129 const_on_chain_schema_limit: 1024,2130 offchain_schema_limit: 1024,2131 variable_on_chain_schema_limit: 1024,2132 }2133 ));21342135 let collection_id = create_test_collection(&CollectionMode::NFT, 1);21362137 let origin1 = Origin::signed(1);2138 let too_big_const_data = CreateItemData::NFT(CreateNftData {2139 const_data: vec![],2140 variable_data: vec![1, 2, 3, 4],2141 });21422143 assert_noop!(2144 TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2145 Error::<Test>::TokenVariableDataLimitExceeded2146 );2147 });2148}2149// #endregion1843// #endregion215018442151#[test]1845#[test]2152fn set_const_on_chain_schema() {1846fn set_const_on_chain_schema() {2153 new_test_ext().execute_with(|| {1847 new_test_ext().execute_with(|| {2154 default_limits();21552156 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1848 let collection_id = create_test_collection(&CollectionMode::NFT, 1);215718492158 let origin1 = Origin::signed(1);1850 let origin1 = Origin::signed(1);2180#[test]1872#[test]2181fn set_variable_on_chain_schema() {1873fn set_variable_on_chain_schema() {2182 new_test_ext().execute_with(|| {1874 new_test_ext().execute_with(|| {2183 default_limits();21842185 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1875 let collection_id = create_test_collection(&CollectionMode::NFT, 1);218618762187 let origin1 = Origin::signed(1);1877 let origin1 = Origin::signed(1);2209#[test]1899#[test]2210fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1900fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2211 new_test_ext().execute_with(|| {1901 new_test_ext().execute_with(|| {2212 default_limits();22132214 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1902 let collection_id = create_test_collection(&CollectionMode::NFT, 1);221519032216 let origin1 = Origin::signed(1);1904 let origin1 = Origin::signed(1);221719052218 let data = default_nft_data();1906 let data = default_nft_data();2219 create_test_item(1, &data.into());1907 create_test_item(1, &data.into());222019082221 let variable_data = b"test set_variable_meta_data method.".to_vec();1909 let variable_data = b"test data".to_vec();2222 assert_ok!(TemplateModule::set_variable_meta_data(1910 assert_ok!(TemplateModule::set_variable_meta_data(2223 origin1,1911 origin1,2224 collection_id,1912 collection_id,2238#[test]1926#[test]2239fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1927fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2240 new_test_ext().execute_with(|| {1928 new_test_ext().execute_with(|| {2241 default_limits();22422243 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);1929 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);224419302245 let origin1 = Origin::signed(1);1931 let origin1 = Origin::signed(1);224619322247 let data = default_re_fungible_data();1933 let data = default_re_fungible_data();2248 create_test_item(1, &data.into());1934 create_test_item(1, &data.into());224919352250 let variable_data = b"test set_variable_meta_data method.".to_vec();1936 let variable_data = b"test data".to_vec();2251 assert_ok!(TemplateModule::set_variable_meta_data(1937 assert_ok!(TemplateModule::set_variable_meta_data(2252 origin1,1938 origin1,2253 collection_id,1939 collection_id,2267#[test]1953#[test]2268fn set_variable_meta_data_on_fungible_token_fails() {1954fn set_variable_meta_data_on_fungible_token_fails() {2269 new_test_ext().execute_with(|| {1955 new_test_ext().execute_with(|| {2270 default_limits();22712272 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);1956 let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);227319572274 let origin1 = Origin::signed(1);1958 let origin1 = Origin::signed(1);227519592276 let data = default_fungible_data();1960 let data = default_fungible_data();2277 create_test_item(1, &data.into());1961 create_test_item(1, &data.into());227819622279 let variable_data = b"test set_variable_meta_data method.".to_vec();1963 let variable_data = b"test data".to_vec();2280 assert_noop!(1964 assert_noop!(2281 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),1965 TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2282 Error::<Test>::CantStoreMetadataInFungibleTokens1966 Error::<Test>::CantStoreMetadataInFungibleTokens2287#[test]1971#[test]2288fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1972fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2289 new_test_ext().execute_with(|| {1973 new_test_ext().execute_with(|| {2290 assert_ok!(TemplateModule::set_chain_limits(2291 RawOrigin::Root.into(),2292 ChainLimits {2293 collection_numbers_limit: default_collection_numbers_limit(),2294 account_token_ownership_limit: 10,2295 collections_admins_limit: 5,2296 custom_data_limit: 10,2297 nft_sponsor_transfer_timeout: 15,2298 fungible_sponsor_transfer_timeout: 15,2299 refungible_sponsor_transfer_timeout: 15,2300 const_on_chain_schema_limit: 1024,2301 offchain_schema_limit: 1024,2302 variable_on_chain_schema_limit: 1024,2303 }2304 ));23052306 let collection_id = create_test_collection(&CollectionMode::NFT, 1);1974 let collection_id = create_test_collection(&CollectionMode::NFT, 1);230719752308 let origin1 = Origin::signed(1);1976 let origin1 = Origin::signed(1);2321#[test]1989#[test]2322fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1990fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2323 new_test_ext().execute_with(|| {1991 new_test_ext().execute_with(|| {2324 assert_ok!(TemplateModule::set_chain_limits(2325 RawOrigin::Root.into(),2326 ChainLimits {2327 collection_numbers_limit: default_collection_numbers_limit(),2328 account_token_ownership_limit: 10,2329 collections_admins_limit: 5,2330 custom_data_limit: 10,2331 nft_sponsor_transfer_timeout: 15,2332 fungible_sponsor_transfer_timeout: 15,2333 refungible_sponsor_transfer_timeout: 15,2334 const_on_chain_schema_limit: 1024,2335 offchain_schema_limit: 1024,2336 variable_on_chain_schema_limit: 1024,2337 }2338 ));23392340 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);1992 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);234119932342 let origin1 = Origin::signed(1);1994 let origin1 = Origin::signed(1);2355#[test]2007#[test]2356fn collection_transfer_flag_works() {2008fn collection_transfer_flag_works() {2357 new_test_ext().execute_with(|| {2009 new_test_ext().execute_with(|| {2358 default_limits();23592360 let origin1 = Origin::signed(1);2010 let origin1 = Origin::signed(1);236120112362 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2012 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2382#[test]2032#[test]2383fn collection_transfer_flag_works_neg() {2033fn collection_transfer_flag_works_neg() {2384 new_test_ext().execute_with(|| {2034 new_test_ext().execute_with(|| {2385 default_limits();23862387 let origin1 = Origin::signed(1);2035 let origin1 = Origin::signed(1);238820362389 let collection_id = create_test_collection(&CollectionMode::NFT, 1);2037 let collection_id = create_test_collection(&CollectionMode::NFT, 1);primitives/nft/Cargo.tomldiffbeforeafterboth9version = '0.9.0'9version = '0.9.0'101011[dependencies]11[dependencies]12codec = { package = "parity-scale-codec", version = "2.0.0", default-features = false, features = ['derive'] }12codec = { package = "parity-scale-codec", version = "2.2.0", default-features = false, features = ['derive'] }13serde = { version = "1.0.119", features = ['derive'], default-features = false }13serde = { version = "1.0.119", features = ['derive'], default-features = false, optional = true }14max-encoded-len = { default-features = false, features = ['derive'], version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }14frame-support = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }15frame-support = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }15frame-system = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }16frame-system = { default-features = false, version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }16sp-core = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }17sp-core = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }18sp-std = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }17sp-runtime = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }19sp-runtime = { version = "3.0.0", default-features = false, git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }20derivative = "2.2.0"182119[features]22[features]20default = ["std"]23default = ["std"]21std = [24std = [25 "serde1",22 "serde/std",26 "serde/std",23 "codec/std",27 "codec/std",28 "max-encoded-len/std",24 "frame-system/std",29 "frame-system/std",25 "frame-support/std",30 "frame-support/std",26 "sp-runtime/std",31 "sp-runtime/std",27 "sp-core/std",32 "sp-core/std",33 "sp-std/std",28]34]35serde1 = ["serde"]36limit-testing = []primitives/nft/src/lib.rsdiffbeforeafterboth1#![cfg_attr(not(feature = "std"), no_std)]1#![cfg_attr(not(feature = "std"), no_std)]223#[cfg(feature = "serde")]3pub use serde::{Serialize, Deserialize};4pub use serde::{Serialize, Deserialize};455use sp_runtime::sp_std::prelude::Vec;6use sp_runtime::sp_std::prelude::Vec;6use codec::{Decode, Encode};7use codec::{Decode, Encode};8use max_encoded_len::MaxEncodedLen;7pub use frame_support::{9pub use frame_support::{8 construct_runtime, decl_event, decl_module, decl_storage, decl_error,10 BoundedVec, construct_runtime, decl_event, decl_module, decl_storage, decl_error,9 dispatch::DispatchResult,11 dispatch::DispatchResult,10 ensure, fail, parameter_types,12 ensure, fail, parameter_types,11 traits::{13 traits::{19 },21 },20 StorageValue, transactional,22 StorageValue, transactional,21};23};24use derivative::Derivative;222523pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;26pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;24pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;27pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;25pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;28pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;26pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;29pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;3031pub const COLLECTION_NUMBER_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {32 10000033} else {34 1035};36pub const CUSTOM_DATA_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {37 204838} else {39 1040};41pub const COLLECTION_ADMINS_LIMIT: u64 = 5;42pub const ACCOUNT_TOKEN_OWNERSHIP_LIMIT: u32 = if cfg!(not(feature = "limit-testing")) {43 100000044} else {45 1046};4748// Timeouts for item types in passed blocks49pub const NFT_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;50pub const FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;51pub const REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT: u32 = 5;5253// Schema limits54pub const OFFCHAIN_SCHEMA_LIMIT: u32 = 1024;55pub const VARIABLE_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;56pub const CONST_ON_CHAIN_SCHEMA_LIMIT: u32 = 1024;5758/// How much items can be created per single59/// create_many call60pub const MAX_ITEMS_PER_BATCH: u32 = 200;6162parameter_types! {63 pub const CustomDataLimit: u32 = CUSTOM_DATA_LIMIT;64}276528pub type CollectionId = u32;66pub type CollectionId = u32;29pub type TokenId = u32;67pub type TokenId = u32;30pub type DecimalPoints = u8;68pub type DecimalPoints = u8;316932#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]70#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]33#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]71#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]34pub enum CollectionMode {72pub enum CollectionMode {35 Invalid,73 Invalid,36 NFT,74 NFT,61}99}6210063#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]101#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]64#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]102#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]65pub enum AccessMode {103pub enum AccessMode {66 Normal,104 Normal,67 WhiteList,105 WhiteList,73}111}7411275#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]113#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]76#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]114#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]77pub enum SchemaVersion {115pub enum SchemaVersion {78 ImageURL,116 ImageURL,79 Unique,117 Unique,85}123}8612487#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]125#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]88#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]126#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]89pub struct Ownership<AccountId> {127pub struct Ownership<AccountId> {90 pub owner: AccountId,128 pub owner: AccountId,91 pub fraction: u128,129 pub fraction: u128,92}130}9313194#[derive(Encode, Decode, Debug, Clone, PartialEq)]132#[derive(Encode, Decode, Debug, Clone, PartialEq)]95#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]133#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]96pub enum SponsorshipState<AccountId> {134pub enum SponsorshipState<AccountId> {97 /// The fees are applied to the transaction sender135 /// The fees are applied to the transaction sender98 Disabled,136 Disabled,128}166}129167130#[derive(Encode, Decode, Clone, PartialEq)]168#[derive(Encode, Decode, Clone, PartialEq)]131#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]169#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]132pub struct Collection<T: frame_system::Config> {170pub struct Collection<T: frame_system::Config> {133 pub owner: T::AccountId,171 pub owner: T::AccountId,134 pub mode: CollectionMode,172 pub mode: CollectionMode,148}186}149187150#[derive(Encode, Decode, Debug, Clone, PartialEq)]188#[derive(Encode, Decode, Debug, Clone, PartialEq)]151#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]189#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]152pub struct NftItemType<AccountId> {190pub struct NftItemType<AccountId> {153 pub owner: AccountId,191 pub owner: AccountId,154 pub const_data: Vec<u8>,192 pub const_data: Vec<u8>,155 pub variable_data: Vec<u8>,193 pub variable_data: Vec<u8>,156}194}157195158#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]196#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]159#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]197#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]160pub struct FungibleItemType {198pub struct FungibleItemType {161 pub value: u128,199 pub value: u128,162}200}163201164#[derive(Encode, Decode, Debug, Clone, PartialEq)]202#[derive(Encode, Decode, Debug, Clone, PartialEq)]165#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]203#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]166pub struct ReFungibleItemType<AccountId> {204pub struct ReFungibleItemType<AccountId> {167 pub owner: Vec<Ownership<AccountId>>,205 pub owner: Vec<Ownership<AccountId>>,168 pub const_data: Vec<u8>,206 pub const_data: Vec<u8>,169 pub variable_data: Vec<u8>,207 pub variable_data: Vec<u8>,170}208}171209172#[derive(Encode, Decode, Debug, Clone, PartialEq)]210#[derive(Encode, Decode, Debug, Clone, PartialEq)]173#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]211#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]174pub struct CollectionLimits<BlockNumber: Encode + Decode> {212pub struct CollectionLimits<BlockNumber: Encode + Decode> {175 pub account_token_ownership_limit: u32,213 pub account_token_ownership_limit: u32,176 pub sponsored_data_size: u32,214 pub sponsored_data_size: u32,200 }238 }201}239}202240203#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]241/// BoundedVec doesn't supports serde204#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]242#[cfg(feature = "serde1")]205pub struct ChainLimits {243mod bounded_serde {244 use core::convert::TryFrom;206 pub collection_numbers_limit: u32,245 use frame_support::{BoundedVec, traits::Get};246 use serde::{247 ser::{self, Serialize},248 de::{self, Deserialize, Error},249 };250 use sp_std::vec::Vec;251207 pub account_token_ownership_limit: u32,252 pub fn serialize<D, V, S>(value: &BoundedVec<V, S>, serializer: D) -> Result<D::Ok, D::Error>208 pub collections_admins_limit: u64,253 where209 pub custom_data_limit: u32,254 D: ser::Serializer,210211 // Timeouts for item types in passed blocks212 pub nft_sponsor_transfer_timeout: u32,255 V: Serialize,256 {213 pub fungible_sponsor_transfer_timeout: u32,257 let vec: &Vec<_> = &value;258 vec.serialize(serializer)259 }260214 pub refungible_sponsor_transfer_timeout: u32,261 pub fn deserialize<'de, D, V, S>(deserializer: D) -> Result<BoundedVec<V, S>, D::Error>215262 where216 // Schema limits217 pub offchain_schema_limit: u32,263 D: de::Deserializer<'de>,218 pub variable_on_chain_schema_limit: u32,264 V: de::Deserialize<'de>,219 pub const_on_chain_schema_limit: u32,265 S: Get<u32>,266 {267 // TODO: Implement custom visitor, which will limit vec size at parse time? Will serde only be used by chainspec?268 let vec = <Vec<V>>::deserialize(deserializer)?;269 let len = vec.len();270 TryFrom::try_from(vec).map_err(|_| D::Error::invalid_length(len, &"lesser size"))271 }220}272}221273222#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]274#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)]223#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]275#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]276#[derivative(Debug)]224pub struct CreateNftData {277pub struct CreateNftData {278 #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]279 #[derivative(Debug = "ignore")]225 pub const_data: Vec<u8>,280 pub const_data: BoundedVec<u8, CustomDataLimit>,281 #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]282 #[derivative(Debug = "ignore")]226 pub variable_data: Vec<u8>,283 pub variable_data: BoundedVec<u8, CustomDataLimit>,227}284}228285229#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]286#[derive(Encode, Decode, MaxEncodedLen, Default, Debug, Clone, PartialEq)]230#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]287#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]231pub struct CreateFungibleData {288pub struct CreateFungibleData {232 pub value: u128,289 pub value: u128,233}290}234291235#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]292#[derive(Encode, Decode, MaxEncodedLen, Default, PartialEq, Clone, Derivative)]236#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]293#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]294#[derivative(Debug)]237pub struct CreateReFungibleData {295pub struct CreateReFungibleData {296 #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]297 #[derivative(Debug = "ignore")]238 pub const_data: Vec<u8>,298 pub const_data: BoundedVec<u8, CustomDataLimit>,299 #[cfg_attr(feature = "serde1", serde(with = "bounded_serde"))]300 #[derivative(Debug = "ignore")]239 pub variable_data: Vec<u8>,301 pub variable_data: BoundedVec<u8, CustomDataLimit>,240 pub pieces: u128,302 pub pieces: u128,241}303}242304243#[derive(Encode, Decode, Debug, Clone, PartialEq)]305#[derive(Encode, Decode, MaxEncodedLen, PartialEq, Clone, Debug)]244#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]306#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]245pub enum CreateItemData {307pub enum CreateItemData {246 NFT(CreateNftData),308 NFT(CreateNftData),247 Fungible(CreateFungibleData),309 Fungible(CreateFungibleData),runtime/Cargo.tomldiffbeforeafterboth31]31]32std = [32std = [33 'codec/std',33 'codec/std',34 'max-encoded-len/std',34 'cumulus-pallet-aura-ext/std',35 'cumulus-pallet-aura-ext/std',35 'cumulus-pallet-parachain-system/std',36 'cumulus-pallet-parachain-system/std',36 'cumulus-pallet-xcm/std',37 'cumulus-pallet-xcm/std',84 'xcm-builder/std',85 'xcm-builder/std',85 'xcm-executor/std',86 'xcm-executor/std',86]87]88limit-testing = [89 'pallet-nft/limit-testing',90 'nft-data-structs/limit-testing',91]879288################################################################################93################################################################################89# Substrate Dependencies94# Substrate Dependencies378# local dependencies383# local dependencies379384380[dependencies]385[dependencies]386max-encoded-len = { default-features = false, features = ['derive'], version = '3.0.0', git = 'https://github.com/paritytech/substrate.git', branch = 'polkadot-v0.9.8' }387derivative = "2.2.0"381pallet-nft = { path = '../pallets/nft', default-features = false, version = '3.0.0' }388pallet-nft = { path = '../pallets/nft', default-features = false, version = '3.0.0' }382pallet-inflation = { path = '../pallets/inflation', default-features = false, version = '3.0.0' }389pallet-inflation = { path = '../pallets/inflation', default-features = false, version = '3.0.0' }383nft-data-structs = { path = '../primitives/nft', default-features = false, version = '0.9.0' }390nft-data-structs = { path = '../primitives/nft', default-features = false, version = '0.9.0' }runtime/src/chain_extension.rsdiffbeforeafterboth6//6//778use codec::{Decode, Encode};8use codec::{Decode, Encode};9use max_encoded_len::MaxEncodedLen;10use derivative::Derivative;91110pub use pallet_contracts::chain_extension::RetVal;12pub use pallet_contracts::chain_extension::RetVal;11use pallet_contracts::chain_extension::{13use pallet_contracts::chain_extension::{20use pallet_nft::CrossAccountId;22use pallet_nft::CrossAccountId;21use nft_data_structs::*;23use nft_data_structs::*;2223use crate::Vec;242425/// Create item parameters25/// Create item parameters26#[derive(Debug, PartialEq, Encode, Decode)]26#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]27pub struct NFTExtCreateItem<E: Ext> {27pub struct NFTExtCreateItem<AccountId> {28 pub owner: <E::T as SysConfig>::AccountId,28 pub owner: AccountId,29 pub collection_id: u32,29 pub collection_id: u32,30 pub data: CreateItemData,30 pub data: CreateItemData,31}31}323233/// Transfer parameters33/// Transfer parameters34#[derive(Debug, PartialEq, Encode, Decode)]34#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]35pub struct NFTExtTransfer<E: Ext> {35pub struct NFTExtTransfer<AccountId> {36 pub recipient: <E::T as SysConfig>::AccountId,36 pub recipient: AccountId,37 pub collection_id: u32,37 pub collection_id: u32,38 pub token_id: u32,38 pub token_id: u32,39 pub amount: u128,39 pub amount: u128,40}40}414142#[derive(Debug, PartialEq, Encode, Decode)]42#[derive(Derivative, PartialEq, Encode, Decode, MaxEncodedLen)]43#[derivative(Debug)]43pub struct NFTExtCreateMultipleItems<E: Ext> {44pub struct NFTExtCreateMultipleItems<AccountId> {44 pub owner: <E::T as SysConfig>::AccountId,45 pub owner: AccountId,45 pub collection_id: u32,46 pub collection_id: u32,47 #[derivative(Debug = "ignore")]46 pub data: Vec<CreateItemData>,48 pub data: BoundedVec<CreateItemData, MaxItemsPerBatch>,47}49}485049#[derive(Debug, PartialEq, Encode, Decode)]51#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]50pub struct NFTExtApprove<E: Ext> {52pub struct NFTExtApprove<AccountId> {51 pub spender: <E::T as SysConfig>::AccountId,53 pub spender: AccountId,52 pub collection_id: u32,54 pub collection_id: u32,53 pub item_id: u32,55 pub item_id: u32,54 pub amount: u128,56 pub amount: u128,55}57}565857#[derive(Debug, PartialEq, Encode, Decode)]59#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]58pub struct NFTExtTransferFrom<E: Ext> {60pub struct NFTExtTransferFrom<AccountId> {59 pub owner: <E::T as SysConfig>::AccountId,61 pub owner: AccountId,60 pub recipient: <E::T as SysConfig>::AccountId,62 pub recipient: AccountId,61 pub collection_id: u32,63 pub collection_id: u32,62 pub item_id: u32,64 pub item_id: u32,63 pub amount: u128,65 pub amount: u128,64}66}656766#[derive(Debug, PartialEq, Encode, Decode)]68#[derive(Derivative, PartialEq, Encode, Decode, MaxEncodedLen)]69#[derivative(Debug)]67pub struct NFTExtSetVariableMetaData {70pub struct NFTExtSetVariableMetaData {68 pub collection_id: u32,71 pub collection_id: u32,69 pub item_id: u32,72 pub item_id: u32,73 #[derivative(Debug = "ignore")]70 pub data: Vec<u8>,74 pub data: BoundedVec<u8, MaxDataSize>,71}75}727673#[derive(Debug, PartialEq, Encode, Decode)]77#[derive(Debug, PartialEq, Encode, Decode, MaxEncodedLen)]74pub struct NFTExtToggleWhiteList<E: Ext> {78pub struct NFTExtToggleWhiteList<AccountId> {75 pub collection_id: u32,79 pub collection_id: u32,76 pub address: <E::T as SysConfig>::AccountId,80 pub address: AccountId,77 pub whitelisted: bool,81 pub whitelisted: bool,78}82}7983828683pub type NftWeightInfoOf<C> = <C as pallet_nft::Config>::WeightInfo;87pub type NftWeightInfoOf<C> = <C as pallet_nft::Config>::WeightInfo;8889pub type AccountIdOf<C> = <C as SysConfig>::AccountId;849085impl<C: Config + pallet_contracts::Config> ChainExtension<C> for NFTExtension {91impl<C: Config + pallet_contracts::Config> ChainExtension<C> for NFTExtension {86 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>92 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>93 match func_id {99 match func_id {94 0 => {100 0 => {95 let mut env = env.buf_in_buf_out();101 let mut env = env.buf_in_buf_out();96 let input: NFTExtTransfer<E> = env.read_as()?;102 let input: NFTExtTransfer<AccountIdOf<C>> = env.read_as()?;97 env.charge_weight(NftWeightInfoOf::<C>::transfer())?;103 env.charge_weight(NftWeightInfoOf::<C>::transfer())?;9810499 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;105 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;106 input.amount,112 input.amount,107 )?;113 )?;108114109 pallet_nft::Module::<C>::submit_logs(collection)?;115 collection.submit_logs()?;110 Ok(RetVal::Converging(0))116 Ok(RetVal::Converging(0))111 }117 }112 1 => {118 1 => {113 // Create Item119 // Create Item114 let mut env = env.buf_in_buf_out();120 let mut env = env.buf_in_buf_out();115 let input: NFTExtCreateItem<E> = env.read_as()?;121 let input: NFTExtCreateItem<AccountIdOf<C>> = env.read_as()?;116 env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.data_size()))?;122 env.charge_weight(NftWeightInfoOf::<C>::create_item(input.data.data_size()))?;117123118 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;124 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;124 input.data,130 input.data,125 )?;131 )?;126132127 pallet_nft::Module::<C>::submit_logs(collection)?;133 collection.submit_logs()?;128 Ok(RetVal::Converging(0))134 Ok(RetVal::Converging(0))129 }135 }130 2 => {136 2 => {131 // Create multiple items137 // Create multiple items132 let mut env = env.buf_in_buf_out();138 let mut env = env.buf_in_buf_out();133 let input: NFTExtCreateMultipleItems<E> = env.read_as()?;139 let input: NFTExtCreateMultipleItems<AccountIdOf<C>> = env.read_as()?;134 env.charge_weight(NftWeightInfoOf::<C>::create_item(140 env.charge_weight(NftWeightInfoOf::<C>::create_item(135 input.data.iter().map(|i| i.data_size()).sum(),141 input.data.iter().map(|i| i.data_size()).sum(),136 ))?;142 ))?;141 &C::CrossAccountId::from_sub(env.ext().address().clone()),147 &C::CrossAccountId::from_sub(env.ext().address().clone()),142 &collection,148 &collection,143 &C::CrossAccountId::from_sub(input.owner),149 &C::CrossAccountId::from_sub(input.owner),144 input.data,150 input.data.into_inner(),145 )?;151 )?;146152147 pallet_nft::Module::<C>::submit_logs(collection)?;153 collection.submit_logs()?;148 Ok(RetVal::Converging(0))154 Ok(RetVal::Converging(0))149 }155 }150 3 => {156 3 => {151 // Approve157 // Approve152 let mut env = env.buf_in_buf_out();158 let mut env = env.buf_in_buf_out();153 let input: NFTExtApprove<E> = env.read_as()?;159 let input: NFTExtApprove<AccountIdOf<C>> = env.read_as()?;154 env.charge_weight(NftWeightInfoOf::<C>::approve())?;160 env.charge_weight(NftWeightInfoOf::<C>::approve())?;155161156 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;162 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;163 input.amount,169 input.amount,164 )?;170 )?;165171166 pallet_nft::Module::<C>::submit_logs(collection)?;172 collection.submit_logs()?;167 Ok(RetVal::Converging(0))173 Ok(RetVal::Converging(0))168 }174 }169 4 => {175 4 => {170 // Transfer from176 // Transfer from171 let mut env = env.buf_in_buf_out();177 let mut env = env.buf_in_buf_out();172 let input: NFTExtTransferFrom<E> = env.read_as()?;178 let input: NFTExtTransferFrom<AccountIdOf<C>> = env.read_as()?;173 env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;179 env.charge_weight(NftWeightInfoOf::<C>::transfer_from())?;174180175 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;181 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;183 input.amount,189 input.amount,184 )?;190 )?;185191186 pallet_nft::Module::<C>::submit_logs(collection)?;192 collection.submit_logs()?;187 Ok(RetVal::Converging(0))193 Ok(RetVal::Converging(0))188 }194 }189 5 => {195 5 => {198 &C::CrossAccountId::from_sub(env.ext().address().clone()),204 &C::CrossAccountId::from_sub(env.ext().address().clone()),199 &collection,205 &collection,200 input.item_id,206 input.item_id,201 input.data,207 input.data.into_inner(),202 )?;208 )?;203209204 pallet_nft::Module::<C>::submit_logs(collection)?;210 collection.submit_logs()?;205 Ok(RetVal::Converging(0))211 Ok(RetVal::Converging(0))206 }212 }207 6 => {213 6 => {208 // Toggle whitelist214 // Toggle whitelist209 let mut env = env.buf_in_buf_out();215 let mut env = env.buf_in_buf_out();210 let input: NFTExtToggleWhiteList<E> = env.read_as()?;216 let input: NFTExtToggleWhiteList<AccountIdOf<C>> = env.read_as()?;211 env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;217 env.charge_weight(NftWeightInfoOf::<C>::add_to_white_list())?;212218213 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;219 let collection = pallet_nft::Module::<C>::get_collection(input.collection_id)?;219 input.whitelisted,225 input.whitelisted,220 )?;226 )?;221227222 pallet_nft::Module::<C>::submit_logs(collection)?;228 collection.submit_logs()?;223 Ok(RetVal::Converging(0))229 Ok(RetVal::Converging(0))224 }230 }225 _ => Err(DispatchError::Other("unknown chain_extension func_id")),231 _ => Err(DispatchError::Other("unknown chain_extension func_id")),runtime/src/lib.rsdiffbeforeafterboth72use sp_runtime::{72use sp_runtime::{73 traits::{Dispatchable},73 traits::{Dispatchable},74};74};75// use pallet_contracts::chain_extension::UncheckedFrom;767577// pub use pallet_timestamp::Call as TimestampCall;76// pub use pallet_timestamp::Call as TimestampCall;78pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;77pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;379 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE378 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE380}379}381380382/*381/*383parameter_types! {382parameter_types! {384 pub TombstoneDeposit: Balance = deposit(383 pub TombstoneDeposit: Balance = deposit(385 1,384 1,386 sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,385 sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,387 );386 );388 pub DepositPerContract: Balance = TombstoneDeposit::get();387 pub DepositPerContract: Balance = TombstoneDeposit::get();389 pub const DepositPerStorageByte: Balance = deposit(0, 1);388 pub const DepositPerStorageByte: Balance = deposit(0, 1);390 pub const DepositPerStorageItem: Balance = deposit(1, 0);389 pub const DepositPerStorageItem: Balance = deposit(1, 0);391 pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);390 pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);392 pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;391 pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;393 pub const SignedClaimHandicap: u32 = 2;392 pub const SignedClaimHandicap: u32 = 2;394 pub const MaxDepth: u32 = 32;393 pub const MaxDepth: u32 = 32;395 pub const MaxValueSize: u32 = 16 * 1024;394 pub const MaxValueSize: u32 = 16 * 1024;396 pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb395 pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb397 // The lazy deletion runs inside on_initialize.396 // The lazy deletion runs inside on_initialize.398 pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *397 pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *399 RuntimeBlockWeights::get().max_block;398 RuntimeBlockWeights::get().max_block;400 // The weight needed for decoding the queue should be less or equal than a fifth399 // The weight needed for decoding the queue should be less or equal than a fifth401 // of the overall weight dedicated to the lazy deletion.400 // of the overall weight dedicated to the lazy deletion.402 pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (401 pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (403 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -402 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -404 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)403 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)405 )) / 5) as u32;404 )) / 5) as u32;406 pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();405 pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();407}406}408407409impl pallet_contracts::Config for Runtime {408impl pallet_contracts::Config for Runtime {410 type Time = Timestamp;409 type Time = Timestamp;411 type Randomness = RandomnessCollectiveFlip;410 type Randomness = RandomnessCollectiveFlip;412 type Currency = Balances;411 type Currency = Balances;413 type Event = Event;412 type Event = Event;414 type RentPayment = ();413 type RentPayment = ();415 type SignedClaimHandicap = SignedClaimHandicap;414 type SignedClaimHandicap = SignedClaimHandicap;416 type TombstoneDeposit = TombstoneDeposit;415 type TombstoneDeposit = TombstoneDeposit;417 type DepositPerContract = DepositPerContract;416 type DepositPerContract = DepositPerContract;418 type DepositPerStorageByte = DepositPerStorageByte;417 type DepositPerStorageByte = DepositPerStorageByte;419 type DepositPerStorageItem = DepositPerStorageItem;418 type DepositPerStorageItem = DepositPerStorageItem;420 type RentFraction = RentFraction;419 type RentFraction = RentFraction;421 type SurchargeReward = SurchargeReward;420 type SurchargeReward = SurchargeReward;422 type WeightPrice = pallet_transaction_payment::Module<Self>;421 type WeightPrice = pallet_transaction_payment::Pallet<Self>;423 type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;422 type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;424 type ChainExtension = NFTExtension;423 type ChainExtension = NFTExtension;425 type DeletionQueueDepth = DeletionQueueDepth;424 type DeletionQueueDepth = DeletionQueueDepth;426 type DeletionWeightLimit = DeletionWeightLimit;425 type DeletionWeightLimit = DeletionWeightLimit;427 type Schedule = Schedule;426 type Schedule = Schedule;428 type CallStack = [pallet_contracts::Frame<Self>; 31];427 type CallStack = [pallet_contracts::Frame<Self>; 31];429}428}430*/429*/431430432parameter_types! {431parameter_types! {433 pub const TransactionByteFee: Balance = 501 * MICROUNIQUE; // Targeting 0.1 Unique per NFT transfer432 pub const TransactionByteFee: Balance = 501 * MICROUNIQUE; // Targeting 0.1 Unique per NFT transferruntime/src/nft_weights.rsdiffbeforeafterboth123 .saturating_add(DbWeight::get().reads(2_u64))123 .saturating_add(DbWeight::get().reads(2_u64))124 .saturating_add(DbWeight::get().writes(1_u64))124 .saturating_add(DbWeight::get().writes(1_u64))125 }125 }126 fn set_chain_limits() -> Weight {127 1_300_000_u64128 .saturating_add(DbWeight::get().reads(0_u64))129 .saturating_add(DbWeight::get().writes(1_u64))130 }131 fn set_contract_sponsoring_rate_limit() -> Weight {126 fn set_contract_sponsoring_rate_limit() -> Weight {132 3_500_000_u64127 3_500_000_u64133 .saturating_add(DbWeight::get().reads(0_u64))128 .saturating_add(DbWeight::get().reads(0_u64))tests/src/addCollectionAdmin.test.tsdiffbeforeafterboth117 ];117 ];118 const collectionId = await createCollectionExpectSuccess();118 const collectionId = await createCollectionExpectSuccess();119119120 const chainLimit = await api.query.nft.chainLimit() as unknown as { CollectionAdminsLimit: BN };120 const chainAdminLimit = api.consts.nft.collectionAdminsLimit.toNumber();121 const chainAdminLimit = chainLimit.CollectionAdminsLimit.toNumber();122 expect(chainAdminLimit).to.be.equal(5);121 expect(chainAdminLimit).to.be.equal(5);123122124 for (let i = 0; i < chainAdminLimit; i++) {123 for (let i = 0; i < chainAdminLimit; i++) {tests/src/collision-tests/adminLimitsOff.test.tsdiffbeforeafterboth34 await usingApi(async (api) => {34 await usingApi(async (api) => {35 const collectionId = await createCollectionExpectSuccess();35 const collectionId = await createCollectionExpectSuccess();363637 const chainLimit = await api.query.nft.chainLimit() as unknown as { CollectionAdminsLimit: BN };37 const chainAdminLimit = api.consts.nft.collectionAdminsLimit.toNumber();38 const chainAdminLimit = chainLimit.CollectionAdminsLimit.toNumber();39 expect(chainAdminLimit).to.be.equal(5);38 expect(chainAdminLimit).to.be.equal(5);403941 const changeAdminTx1 = api.tx.nft.addCollectionAdmin(collectionId, Eve.address);40 const changeAdminTx1 = api.tx.nft.addCollectionAdmin(collectionId, Eve.address);