From f3ce0b5ee1c5008f3637b0ea99a1ece1de789115 Mon Sep 17 00:00:00 2001 From: Daniel Shiposha Date: Sat, 14 May 2022 14:52:47 +0000 Subject: [PATCH] refactor: Remove variable data from tokens --- --- a/client/rpc/src/lib.rs +++ b/client/rpc/src/lib.rs @@ -71,13 +71,6 @@ token: TokenId, at: Option, ) -> Result>; - #[rpc(name = "unique_variableMetadata")] - fn variable_metadata( - &self, - collection: CollectionId, - token: TokenId, - at: Option, - ) -> Result>; #[rpc(name = "unique_collectionProperties")] fn collection_properties( @@ -279,7 +272,6 @@ ); pass_method!(topmost_token_owner(collection: CollectionId, token: TokenId) -> Option); pass_method!(const_metadata(collection: CollectionId, token: TokenId) -> Vec); - pass_method!(variable_metadata(collection: CollectionId, token: TokenId) -> Vec); pass_method!(collection_properties( collection: CollectionId, --- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -33,7 +33,7 @@ MAX_TOKEN_PREFIX_LENGTH, COLLECTION_ADMINS_LIMIT, MetaUpdatePermission, TokenId, CollectionStats, MAX_TOKEN_OWNERSHIP, CollectionMode, NFT_SPONSOR_TRANSFER_TIMEOUT, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, MAX_SPONSOR_TIMEOUT, - CUSTOM_DATA_LIMIT, CollectionLimits, CustomDataLimit, CreateCollectionData, SponsorshipState, + CUSTOM_DATA_LIMIT, CollectionLimits, CreateCollectionData, SponsorshipState, CreateItemExData, SponsoringRateLimit, budget::Budget, COLLECTION_FIELD_LIMIT, CollectionField, PhantomType, Property, Properties, PropertiesPermissionMap, PropertyKey, PropertyPermission, PropertiesError, PropertyKeyPermission, TokenData, TrySet, @@ -312,8 +312,6 @@ CollectionTokenPrefixLimitExceeded, /// Total collections bound exceeded. TotalCollectionsLimitExceeded, - /// variable_data exceeded data limit. - TokenVariableDataLimitExceeded, /// Exceeded max admin count CollectionAdminCountExceeded, /// Collection limit bounds per collection exceeded @@ -1073,7 +1071,6 @@ fn approve() -> Weight; fn transfer_from() -> Weight; fn burn_from() -> Weight; - fn set_variable_metadata(bytes: u32) -> Weight; } pub trait CommonCollectionOperations { @@ -1163,13 +1160,6 @@ nesting_budget: &dyn Budget, ) -> DispatchResultWithPostInfo; - fn set_variable_metadata( - &self, - sender: T::CrossAccountId, - token: TokenId, - data: BoundedVec, - ) -> DispatchResultWithPostInfo; - fn check_nesting( &self, sender: T::CrossAccountId, @@ -1185,7 +1175,6 @@ fn token_owner(&self, token: TokenId) -> Option; fn const_metadata(&self, token: TokenId) -> Vec; - fn variable_metadata(&self, token: TokenId) -> Vec; fn token_properties(&self, token_id: TokenId, keys: Vec) -> Vec; /// Amount of unique collection tokens fn total_supply(&self) -> u32; --- a/pallets/fungible/src/common.rs +++ b/pallets/fungible/src/common.rs @@ -16,12 +16,12 @@ use core::marker::PhantomData; -use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, BoundedVec}; +use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight}; use up_data_structs::{TokenId, CollectionId, CreateItemExData, budget::Budget}; use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight}; use sp_runtime::ArithmeticError; use sp_std::{vec::Vec, vec}; -use up_data_structs::{CustomDataLimit, Property, PropertyKey, PropertyKeyPermission}; +use up_data_structs::{Property, PropertyKey, PropertyKeyPermission}; use crate::{ Allowance, Balance, Config, Error, FungibleHandle, Pallet, SelfWeightOf, weights::WeightInfo, @@ -85,11 +85,6 @@ fn burn_from() -> Weight { >::burn_from() } - - fn set_variable_metadata(_bytes: u32) -> Weight { - // Error - 0 - } } impl CommonCollectionOperations for FungibleHandle { @@ -287,15 +282,6 @@ fail!(>::SettingPropertiesNotAllowed) } - fn set_variable_metadata( - &self, - _sender: T::CrossAccountId, - _token: TokenId, - _data: BoundedVec, - ) -> DispatchResultWithPostInfo { - fail!(>::FungibleItemsDontHaveData) - } - fn check_nesting( &self, _sender: ::CrossAccountId, @@ -330,9 +316,6 @@ None } fn const_metadata(&self, _token: TokenId) -> Vec { - Vec::new() - } - fn variable_metadata(&self, _token: TokenId) -> Vec { Vec::new() } --- a/pallets/nonfungible/Cargo.toml +++ b/pallets/nonfungible/Cargo.toml @@ -27,6 +27,7 @@ scale-info = { version = "2.0.1", default-features = false, features = [ "derive", ] } +struct-versioning = { path = "../../crates/struct-versioning" } [features] default = ["std"] --- a/pallets/nonfungible/src/benchmarking.rs +++ b/pallets/nonfungible/src/benchmarking.rs @@ -28,10 +28,8 @@ fn create_max_item_data(owner: T::CrossAccountId) -> CreateItemData { let const_data = create_data::(); - let variable_data = create_data::(); CreateItemData:: { const_data, - variable_data, owner, } } @@ -125,14 +123,4 @@ let item = create_max_item(&collection, &owner, sender.clone())?; >::set_allowance(&collection, &sender, item, Some(&burner))?; }: {>::burn_from(&collection, &burner, &sender, item, &Unlimited)?} - - set_variable_metadata { - let b in 0..CUSTOM_DATA_LIMIT; - bench_init!{ - owner: sub; collection: collection(owner); - owner: cross_from_sub; sender: cross_sub; - }; - let item = create_max_item(&collection, &owner, sender.clone())?; - let data = create_var_data(b).try_into().unwrap(); - }: {>::set_variable_metadata(&collection, &sender, item, data)?} } --- a/pallets/nonfungible/src/common.rs +++ b/pallets/nonfungible/src/common.rs @@ -16,9 +16,9 @@ use core::marker::PhantomData; -use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight, BoundedVec}; +use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight}; use up_data_structs::{ - TokenId, CustomDataLimit, CreateItemExData, CollectionId, budget::Budget, Property, + TokenId, CreateItemExData, CollectionId, budget::Budget, Property, PropertyKey, PropertyKeyPermission, }; use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight}; @@ -85,10 +85,6 @@ fn burn_from() -> Weight { >::burn_from() - } - - fn set_variable_metadata(bytes: u32) -> Weight { - >::set_variable_metadata(bytes) } } @@ -99,7 +95,6 @@ match data { up_data_structs::CreateItemData::NFT(data) => Ok(CreateItemData:: { const_data: data.const_data, - variable_data: data.variable_data, properties: data.properties, owner: to.clone(), }), @@ -325,19 +320,6 @@ } else { Ok(().into()) } - } - - fn set_variable_metadata( - &self, - sender: T::CrossAccountId, - token: TokenId, - data: BoundedVec, - ) -> DispatchResultWithPostInfo { - let len = data.len(); - with_weight( - >::set_variable_metadata(self, &sender, token, data), - >::set_variable_metadata(len as u32), - ) } fn check_nesting( @@ -376,12 +358,6 @@ fn const_metadata(&self, token: TokenId) -> Vec { >::get((self.id, token)) .map(|t| t.const_data) - .unwrap_or_default() - .into_inner() - } - fn variable_metadata(&self, token: TokenId) -> Vec { - >::get((self.id, token)) - .map(|t| t.variable_data) .unwrap_or_default() .into_inner() } --- a/pallets/nonfungible/src/erc.rs +++ b/pallets/nonfungible/src/erc.rs @@ -24,7 +24,7 @@ use up_data_structs::{TokenId, SchemaVersion}; use pallet_evm_coder_substrate::dispatch_to_evm; use sp_core::{H160, U256}; -use sp_std::{vec::Vec, vec}; +use sp_std::vec::Vec; use pallet_common::{ erc::{CommonEvmHandler, PrecompileResult, CollectionPropertiesCall}, CollectionHandle, @@ -274,7 +274,6 @@ &caller, CreateItemData:: { const_data: BoundedVec::default(), - variable_data: BoundedVec::default(), properties: BoundedVec::default(), owner: to, }, @@ -322,7 +321,6 @@ const_data: Vec::::from(token_uri) .try_into() .map_err(|_| "token uri is too long")?, - variable_data: BoundedVec::default(), properties: BoundedVec::default(), owner: to, }, @@ -387,37 +385,6 @@ .into()) } - #[weight(>::set_variable_metadata(data.len() as u32))] - fn set_variable_metadata( - &mut self, - caller: caller, - token_id: uint256, - data: bytes, - ) -> Result { - let caller = T::CrossAccountId::from_eth(caller); - let token = token_id.try_into()?; - - >::set_variable_metadata( - self, - &caller, - token, - data.try_into() - .map_err(|_| "metadata size exceeded limit")?, - ) - .map_err(dispatch_to_evm::)?; - Ok(()) - } - - fn get_variable_metadata(&self, token_id: uint256) -> Result { - self.consume_store_reads(1)?; - let token: TokenId = token_id.try_into()?; - - Ok(>::get((self.id, token)) - .ok_or("token not found")? - .variable_data - .into_inner()) - } - #[weight(>::create_multiple_items(token_ids.len() as u32))] fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec) -> Result { let caller = T::CrossAccountId::from_eth(caller); @@ -440,7 +407,6 @@ let data = (0..total_tokens) .map(|_| CreateItemData:: { const_data: BoundedVec::default(), - variable_data: BoundedVec::default(), properties: BoundedVec::default(), owner: to.clone(), }) @@ -484,7 +450,6 @@ const_data: Vec::::from(token_uri) .try_into() .map_err(|_| "token uri is too long")?, - variable_data: vec![].try_into().unwrap(), properties: BoundedVec::default(), owner: to.clone(), }); --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -49,17 +49,22 @@ pub type CreateItemData = CreateNftExData<::CrossAccountId>; pub(crate) type SelfWeightOf = ::WeightInfo; +#[struct_versioning::versioned(version = 2, upper)] #[derive(Encode, Decode, TypeInfo, MaxEncodedLen)] pub struct ItemData { pub const_data: BoundedVec, + + #[version(..2)] pub variable_data: BoundedVec, + pub owner: CrossAccountId, } #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::{Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key}; + use frame_support::{Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key, traits::StorageVersion}; + use frame_system::pallet_prelude::*; use up_data_structs::{CollectionId, TokenId}; use super::weights::WeightInfo; @@ -78,7 +83,10 @@ type WeightInfo: WeightInfo; } + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); @@ -133,6 +141,19 @@ Value = T::CrossAccountId, QueryKind = OptionQuery, >; + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_runtime_upgrade() -> Weight { + if StorageVersion::get::>() < StorageVersion::new(1) { + >::translate_values::, _>(|v| { + Some(>::from(v)) + }) + } + + 0 + } + } } pub struct NonfungibleHandle(pallet_common::CollectionHandle); @@ -577,7 +598,6 @@ (collection.id, token), ItemData { const_data: data.const_data, - variable_data: data.variable_data, owner: data.owner.clone(), }, ); @@ -773,28 +793,6 @@ // ========= Self::burn(collection, from, token) - } - - pub fn set_variable_metadata( - collection: &NonfungibleHandle, - sender: &T::CrossAccountId, - token: TokenId, - data: BoundedVec, - ) -> DispatchResult { - let token_data = - >::get((collection.id, token)).ok_or(>::TokenNotFound)?; - collection.check_can_update_meta(sender, &token_data.owner)?; - - // ========= - - >::insert( - (collection.id, token), - ItemData { - variable_data: data, - ..token_data - }, - ); - Ok(()) } pub fn check_nesting( --- a/pallets/nonfungible/src/stubs/UniqueNFT.sol +++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol @@ -61,6 +61,24 @@ } } +// Selector: 56fd500b +contract CollectionProperties is Dummy, ERC165 { + // Selector: setProperty(string,string) 62d9491f + function setProperty(string memory key, string memory value) public { + require(false, stub_error); + key; + value; + dummy = 0; + } + + // Selector: deleteProperty(string) 34241914 + function deleteProperty(string memory key) public { + require(false, stub_error); + key; + dummy = 0; + } +} + // Selector: 58800161 contract ERC721 is Dummy, ERC165, ERC721Events { // Selector: balanceOf(address) 70a08231 @@ -276,7 +294,7 @@ } } -// Selector: e562194d +// Selector: d74d154f contract ERC721UniqueExtensions is Dummy, ERC165 { // Selector: transfer(address,uint256) a9059cbb function transfer(address to, uint256 tokenId) public { @@ -301,26 +319,6 @@ return 0; } - // Selector: setVariableMetadata(uint256,bytes) d4eac26d - function setVariableMetadata(uint256 tokenId, bytes memory data) public { - require(false, stub_error); - tokenId; - data; - dummy = 0; - } - - // Selector: getVariableMetadata(uint256) e6c5ce6f - function getVariableMetadata(uint256 tokenId) - public - view - returns (bytes memory) - { - require(false, stub_error); - tokenId; - dummy; - return hex""; - } - // Selector: mintBulk(address,uint256[]) 44a9945e function mintBulk(address to, uint256[] memory tokenIds) public @@ -354,5 +352,6 @@ ERC721Enumerable, ERC721UniqueExtensions, ERC721Mintable, - ERC721Burnable + ERC721Burnable, + CollectionProperties {} --- a/pallets/nonfungible/src/weights.rs +++ b/pallets/nonfungible/src/weights.rs @@ -45,7 +45,6 @@ fn approve() -> Weight; fn transfer_from() -> Weight; fn burn_from() -> Weight; - fn set_variable_metadata(b: u32, ) -> Weight; } /// Weights for pallet_nonfungible using the Substrate node and recommended hardware. @@ -155,12 +154,6 @@ (27_580_000 as Weight) .saturating_add(T::DbWeight::get().reads(4 as Weight)) .saturating_add(T::DbWeight::get().writes(5 as Weight)) - } - // Storage: Nonfungible TokenData (r:1 w:1) - fn set_variable_metadata(_b: u32, ) -> Weight { - (7_700_000 as Weight) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } @@ -270,11 +263,5 @@ (27_580_000 as Weight) .saturating_add(RocksDbWeight::get().reads(4 as Weight)) .saturating_add(RocksDbWeight::get().writes(5 as Weight)) - } - // Storage: Nonfungible TokenData (r:1 w:1) - fn set_variable_metadata(_b: u32, ) -> Weight { - (7_700_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } } --- a/pallets/refungible/Cargo.toml +++ b/pallets/refungible/Cargo.toml @@ -24,6 +24,7 @@ scale-info = { version = "2.0.1", default-features = false, features = [ "derive", ] } +struct-versioning = { path = "../../crates/struct-versioning" } [features] default = ["std"] --- a/pallets/refungible/src/benchmarking.rs +++ b/pallets/refungible/src/benchmarking.rs @@ -31,10 +31,8 @@ users: impl IntoIterator, ) -> CreateRefungibleExData { let const_data = create_data::(); - let variable_data = create_data::(); CreateRefungibleExData { const_data, - variable_data, users: users .into_iter() .collect::>() @@ -203,14 +201,4 @@ let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?; >::set_allowance(&collection, &sender, &burner, item, 200)?; }: {>::burn_from(&collection, &burner, &sender, item, 200, &Unlimited)?} - - set_variable_metadata { - let b in 0..CUSTOM_DATA_LIMIT; - bench_init!{ - owner: sub; collection: collection(owner); - sender: cross_from_sub(owner); - }; - let item = create_max_item(&collection, &sender, [(sender.clone(), 200)])?; - let data = create_var_data(b).try_into().unwrap(); - }: {>::set_variable_metadata(&collection, &sender, item, data)?} } --- a/pallets/refungible/src/common.rs +++ b/pallets/refungible/src/common.rs @@ -17,9 +17,9 @@ use core::marker::PhantomData; use sp_std::collections::btree_map::BTreeMap; -use frame_support::{dispatch::DispatchResultWithPostInfo, fail, weights::Weight, BoundedVec}; +use frame_support::{dispatch::DispatchResultWithPostInfo, fail, weights::Weight}; use up_data_structs::{ - CollectionId, TokenId, CustomDataLimit, CreateItemExData, CreateRefungibleExData, + CollectionId, TokenId, CreateItemExData, CreateRefungibleExData, budget::Budget, Property, PropertyKey, PropertyKeyPermission, }; use pallet_common::{CommonCollectionOperations, CommonWeightInfo, with_weight}; @@ -110,10 +110,6 @@ fn burn_from() -> Weight { >::burn_from() - } - - fn set_variable_metadata(bytes: u32) -> Weight { - >::set_variable_metadata(bytes) } } @@ -124,7 +120,6 @@ match data { up_data_structs::CreateItemData::ReFungible(data) => Ok(CreateRefungibleExData { const_data: data.const_data, - variable_data: data.variable_data, users: { let mut out = BTreeMap::new(); out.insert(to.clone(), data.pieces); @@ -306,19 +301,6 @@ fail!(>::SettingPropertiesNotAllowed) } - fn set_variable_metadata( - &self, - sender: T::CrossAccountId, - token: TokenId, - data: BoundedVec, - ) -> DispatchResultWithPostInfo { - let len = data.len(); - with_weight( - >::set_variable_metadata(self, &sender, token, data), - >::set_variable_metadata(len as u32), - ) - } - fn check_nesting( &self, _sender: ::CrossAccountId, @@ -355,11 +337,6 @@ fn const_metadata(&self, token: TokenId) -> Vec { >::get((self.id, token)) .const_data - .into_inner() - } - fn variable_metadata(&self, token: TokenId) -> Vec { - >::get((self.id, token)) - .variable_data .into_inner() } --- a/pallets/refungible/src/lib.rs +++ b/pallets/refungible/src/lib.rs @@ -41,16 +41,20 @@ pub mod weights; pub(crate) type SelfWeightOf = ::WeightInfo; +#[struct_versioning::versioned(version = 2, upper)] #[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)] pub struct ItemData { pub const_data: BoundedVec, + + #[version(..2)] pub variable_data: BoundedVec, } #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::{Blake2_128, Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key}; + use frame_support::{Blake2_128, Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key, traits::StorageVersion}; + use frame_system::pallet_prelude::*; use up_data_structs::{CollectionId, TokenId}; use super::weights::WeightInfo; @@ -73,7 +77,10 @@ type WeightInfo: WeightInfo; } + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] #[pallet::generate_store(pub(super) trait Store)] pub struct Pallet(_); @@ -146,6 +153,19 @@ Value = u128, QueryKind = ValueQuery, >; + + #[pallet::hooks] + impl Hooks> for Pallet { + fn on_runtime_upgrade() -> Weight { + if StorageVersion::get::>() < StorageVersion::new(1) { + >::translate_values::(|v| { + Some(::from(v)) + }) + } + + 0 + } + } } pub struct RefungibleHandle(pallet_common::CollectionHandle); @@ -494,7 +514,6 @@ (collection.id, token_id), ItemData { const_data: token.const_data, - variable_data: token.variable_data, }, ); for (user, amount) in token.users.into_iter() { @@ -643,31 +662,6 @@ if let Some(allowance) = allowance { Self::set_allowance_unchecked(collection, from, spender, token, allowance); } - Ok(()) - } - - pub fn set_variable_metadata( - collection: &RefungibleHandle, - sender: &T::CrossAccountId, - token: TokenId, - data: BoundedVec, - ) -> DispatchResult { - collection.check_can_update_meta( - sender, - &T::CrossAccountId::from_sub(collection.owner.clone()), - )?; - - let token_data = >::get((collection.id, token)); - - // ========= - - >::insert( - (collection.id, token), - ItemData { - variable_data: data, - ..token_data - }, - ); Ok(()) } --- a/pallets/refungible/src/weights.rs +++ b/pallets/refungible/src/weights.rs @@ -53,7 +53,6 @@ fn transfer_from_removing() -> Weight; fn transfer_from_creating_removing() -> Weight; fn burn_from() -> Weight; - fn set_variable_metadata(b: u32, ) -> Weight; } /// Weights for pallet_refungible using the Substrate node and recommended hardware. @@ -242,12 +241,6 @@ (42_043_000 as Weight) .saturating_add(T::DbWeight::get().reads(5 as Weight)) .saturating_add(T::DbWeight::get().writes(7 as Weight)) - } - // Storage: Refungible TokenData (r:1 w:1) - fn set_variable_metadata(_b: u32, ) -> Weight { - (7_364_000 as Weight) - .saturating_add(T::DbWeight::get().reads(1 as Weight)) - .saturating_add(T::DbWeight::get().writes(1 as Weight)) } } @@ -436,11 +429,5 @@ (42_043_000 as Weight) .saturating_add(RocksDbWeight::get().reads(5 as Weight)) .saturating_add(RocksDbWeight::get().writes(7 as Weight)) - } - // Storage: Refungible TokenData (r:1 w:1) - fn set_variable_metadata(_b: u32, ) -> Weight { - (7_364_000 as Weight) - .saturating_add(RocksDbWeight::get().reads(1 as Weight)) - .saturating_add(RocksDbWeight::get().writes(1 as Weight)) } } --- a/pallets/unique/src/lib.rs +++ b/pallets/unique/src/lib.rs @@ -38,7 +38,7 @@ CONST_ON_CHAIN_SCHEMA_LIMIT, OFFCHAIN_SCHEMA_LIMIT, MAX_COLLECTION_NAME_LENGTH, MAX_COLLECTION_DESCRIPTION_LENGTH, MAX_TOKEN_PREFIX_LENGTH, AccessMode, CreateItemData, CollectionLimits, CollectionId, CollectionMode, TokenId, - SchemaVersion, SponsorshipState, MetaUpdatePermission, CreateCollectionData, CustomDataLimit, + SchemaVersion, SponsorshipState, MetaUpdatePermission, CreateCollectionData, CreateItemExData, budget, CollectionField, Property, PropertyKey, PropertyKeyPermission, }; use pallet_evm::account::CrossAccountId; @@ -238,9 +238,6 @@ pub ReFungibleTransferBasket get(fn refungible_transfer_basket): nmap hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId, hasher(twox_64_concat) T::AccountId => Option; //#endregion - /// Variable metadata sponsoring - /// Collection id (controlled?2), token id (controlled?2) - pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option; /// Approval sponsoring pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option; pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option; @@ -333,7 +330,6 @@ >::remove_prefix(collection_id, None); >::remove_prefix((collection_id,), None); - >::remove_prefix(collection_id, None); >::remove_prefix(collection_id, None); >::remove_prefix(collection_id, None); >::remove_prefix((collection_id,), None); @@ -929,31 +925,6 @@ let budget = budget::Value::new(2); dispatch_call::(collection_id, |d| d.transfer_from(sender, from, recipient, item_id, value, &budget)) - } - - /// Set off-chain data schema. - /// - /// # Permissions - /// - /// * Collection Owner - /// * Collection Admin - /// - /// # Arguments - /// - /// * collection_id. - /// - /// * schema: String representing the offchain data schema. - #[weight = T::CommonWeightInfo::set_variable_metadata(data.len() as u32)] - #[transactional] - pub fn set_variable_meta_data ( - origin, - collection_id: CollectionId, - item_id: TokenId, - data: BoundedVec, - ) -> DispatchResultWithPostInfo { - let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?); - - dispatch_call::(collection_id, |d| d.set_variable_metadata(sender, item_id, data)) } /// Set meta_update_permission value for particular collection --- a/primitives/data-structs/src/lib.rs +++ b/primitives/data-structs/src/lib.rs @@ -364,28 +364,6 @@ pub type CollectionPropertiesVec = BoundedVec>; -#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)] -#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -pub struct NftItemType { - pub owner: AccountId, - pub const_data: Vec, - pub variable_data: Vec, -} - -#[derive(Encode, Decode, Default, Debug, Clone, PartialEq, TypeInfo)] -#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -pub struct FungibleItemType { - pub value: u128, -} - -#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)] -#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -pub struct ReFungibleItemType { - pub owner: Vec>, - pub const_data: Vec, - pub variable_data: Vec, -} - /// All fields are wrapped in `Option`s, where None means chain default #[struct_versioning::versioned(version = 2, upper)] #[derive(Encode, Decode, Debug, Default, Clone, PartialEq, TypeInfo, MaxEncodedLen)] @@ -393,6 +371,8 @@ pub struct CollectionLimits { pub account_token_ownership_limit: Option, pub sponsored_data_size: Option, + + /// FIXME should we delete this or repurpose it? /// None - setVariableMetadata is not sponsored /// Some(v) - setVariableMetadata is sponsored /// if there is v block between txs @@ -490,9 +470,6 @@ #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))] #[derivative(Debug(format_with = "bounded::vec_debug"))] pub const_data: BoundedVec, - #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))] - #[derivative(Debug(format_with = "bounded::vec_debug"))] - pub variable_data: BoundedVec, #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))] #[derivative(Debug(format_with = "bounded::vec_debug"))] @@ -512,9 +489,6 @@ #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))] #[derivative(Debug(format_with = "bounded::vec_debug"))] pub const_data: BoundedVec, - #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))] - #[derivative(Debug(format_with = "bounded::vec_debug"))] - pub variable_data: BoundedVec, pub pieces: u128, } @@ -545,8 +519,6 @@ pub struct CreateNftExData { #[derivative(Debug(format_with = "bounded::vec_debug"))] pub const_data: BoundedVec, - #[derivative(Debug(format_with = "bounded::vec_debug"))] - pub variable_data: BoundedVec, #[derivative(Debug(format_with = "bounded::vec_debug"))] pub properties: CollectionPropertiesVec, pub owner: CrossAccountId, @@ -557,8 +529,6 @@ pub struct CreateRefungibleExData { #[derivative(Debug(format_with = "bounded::vec_debug"))] pub const_data: BoundedVec, - #[derivative(Debug(format_with = "bounded::vec_debug"))] - pub variable_data: BoundedVec, #[derivative(Debug(format_with = "bounded::map_debug"))] pub users: BoundedBTreeMap>, } @@ -586,8 +556,8 @@ impl CreateItemData { pub fn data_size(&self) -> usize { match self { - CreateItemData::NFT(data) => data.variable_data.len() + data.const_data.len(), - CreateItemData::ReFungible(data) => data.variable_data.len() + data.const_data.len(), + CreateItemData::NFT(data) => data.const_data.len(), + CreateItemData::ReFungible(data) => data.const_data.len(), _ => 0, } } --- a/primitives/rpc/src/lib.rs +++ b/primitives/rpc/src/lib.rs @@ -42,7 +42,6 @@ fn token_owner(collection: CollectionId, token: TokenId) -> Result>; fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result>; fn const_metadata(collection: CollectionId, token: TokenId) -> Result>; - fn variable_metadata(collection: CollectionId, token: TokenId) -> Result>; fn collection_properties(collection: CollectionId, properties: Vec>) -> Result>; --- a/runtime/common/src/runtime_apis.rs +++ b/runtime/common/src/runtime_apis.rs @@ -32,9 +32,6 @@ fn const_metadata(collection: CollectionId, token: TokenId) -> Result, DispatchError> { dispatch_unique_runtime!(collection.const_metadata(token)) } - fn variable_metadata(collection: CollectionId, token: TokenId) -> Result, DispatchError> { - dispatch_unique_runtime!(collection.variable_metadata(token)) - } fn collection_properties( collection: CollectionId, --- a/runtime/common/src/sponsoring.rs +++ b/runtime/common/src/sponsoring.rs @@ -21,7 +21,7 @@ storage::{StorageMap, StorageDoubleMap, StorageNMap}, }; use up_data_structs::{ - CollectionId, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, MetaUpdatePermission, + CollectionId, FUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, NFT_SPONSOR_TRANSFER_TIMEOUT, REFUNGIBLE_SPONSOR_TRANSFER_TIMEOUT, TokenId, CollectionMode, CreateItemData, }; @@ -30,7 +30,7 @@ use pallet_evm::account::CrossAccountId; use pallet_unique::{ Call as UniqueCall, Config as UniqueConfig, FungibleApproveBasket, RefungibleApproveBasket, - NftApproveBasket, VariableMetaDataBasket, CreateItemBasket, ReFungibleTransferBasket, + NftApproveBasket, CreateItemBasket, ReFungibleTransferBasket, FungibleTransferBasket, NftTransferBasket, }; use pallet_fungible::Config as FungibleConfig; @@ -139,64 +139,7 @@ Some(()) } - -pub fn withdraw_set_variable_meta_data( - who: &T::CrossAccountId, - collection: &CollectionHandle, - item_id: &TokenId, - data: &[u8], -) -> Option<()> { - // TODO: make it work for admins - if collection.meta_update_permission != MetaUpdatePermission::ItemOwner { - return None; - } - // preliminary sponsoring correctness check - match collection.mode { - CollectionMode::NFT => { - let owner = pallet_nonfungible::TokenData::::get((collection.id, item_id))?.owner; - if !owner.conv_eq(who) { - return None; - } - } - CollectionMode::Fungible(_) => { - if item_id != &TokenId::default() { - return None; - } - if >::get((collection.id, who)) == 0 { - return None; - } - } - CollectionMode::ReFungible => { - if !>::get((collection.id, who, item_id)) { - return None; - } - } - } - // Can't sponsor fungible collection, this tx will be rejected - // as invalid - if matches!(collection.mode, CollectionMode::Fungible(_)) { - return None; - } - if data.len() > collection.limits.sponsored_data_size() as usize { - return None; - } - - let block_number = >::block_number() as T::BlockNumber; - let limit = collection.limits.sponsored_data_rate_limit()?; - - if let Some(last_tx_block) = VariableMetaDataBasket::::get(collection.id, item_id) { - let timeout = last_tx_block + limit.into(); - if block_number < timeout { - return None; - } - } - - >::insert(collection.id, item_id, block_number); - - Some(()) -} - pub fn withdraw_approve( collection: &CollectionHandle, who: &T::AccountId, @@ -290,20 +233,6 @@ } => { let (sponsor, collection) = load(*collection_id)?; withdraw_approve::(&collection, who, item_id).map(|()| sponsor) - } - UniqueCall::set_variable_meta_data { - collection_id, - item_id, - data, - } => { - let (sponsor, collection) = load(*collection_id)?; - withdraw_set_variable_meta_data::( - &T::CrossAccountId::from_sub(who.clone()), - &collection, - item_id, - data, - ) - .map(|()| sponsor) } _ => None, } --- a/runtime/common/src/weights.rs +++ b/runtime/common/src/weights.rs @@ -86,10 +86,6 @@ dispatch_weight::() + max_weight_of!(transfer_from()) } - fn set_variable_metadata(bytes: u32) -> Weight { - dispatch_weight::() + max_weight_of!(set_variable_metadata(bytes)) - } - fn burn_from() -> Weight { dispatch_weight::() + max_weight_of!(burn_from()) } --- a/runtime/tests/src/tests.rs +++ b/runtime/tests/src/tests.rs @@ -47,7 +47,6 @@ fn default_nft_data() -> CreateNftData { CreateNftData { const_data: vec![1, 2, 3].try_into().unwrap(), - variable_data: vec![3, 2, 1].try_into().unwrap(), } } @@ -58,7 +57,6 @@ fn default_re_fungible_data() -> CreateReFungibleData { CreateReFungibleData { const_data: vec![1, 2, 3].try_into().unwrap(), - variable_data: vec![3, 2, 1].try_into().unwrap(), pieces: 1023, } } @@ -215,7 +213,6 @@ let item = >::get((collection_id, 1)).unwrap(); assert_eq!(item.const_data, data.const_data.into_inner()); - assert_eq!(item.variable_data, data.variable_data.into_inner()); }); } @@ -247,7 +244,6 @@ )) .unwrap(); assert_eq!(item.const_data.to_vec(), data.const_data.into_inner()); - assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner()); } }); } @@ -263,7 +259,6 @@ let balance = >::get((collection_id, TokenId(1), account(1))); assert_eq!(item.const_data, data.const_data.into_inner()); - assert_eq!(item.variable_data, data.variable_data.into_inner()); assert_eq!(balance, 1023); }); } @@ -299,7 +294,6 @@ let balance = >::get((CollectionId(1), TokenId(1), account(1))); assert_eq!(item.const_data.to_vec(), data.const_data.into_inner()); - assert_eq!(item.variable_data.to_vec(), data.variable_data.into_inner()); assert_eq!(balance, 1023); } }); @@ -413,7 +407,6 @@ create_test_item(collection_id, &data.clone().into()); let item = >::get((collection_id, TokenId(1))); assert_eq!(item.const_data, data.const_data.into_inner()); - assert_eq!(item.variable_data, data.variable_data.into_inner()); assert_eq!( >::get((collection_id, account(1))), 1 @@ -2427,117 +2420,6 @@ } #[test] -fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() { - new_test_ext().execute_with(|| { - let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1)); - - let origin1 = Origin::signed(1); - - let data = default_nft_data(); - create_test_item(CollectionId(1), &data.into()); - - let variable_data = b"test data".to_vec(); - assert_ok!(Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(1), - variable_data.clone().try_into().unwrap() - )); - - assert_eq!( - >::get((collection_id, 1)) - .unwrap() - .variable_data, - variable_data - ); - }); -} - -#[test] -fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() { - new_test_ext().execute_with(|| { - let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1)); - - let origin1 = Origin::signed(1); - - let data = default_re_fungible_data(); - create_test_item(collection_id, &data.into()); - - let variable_data = b"test data".to_vec(); - assert_ok!(Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(1), - variable_data.clone().try_into().unwrap() - )); - - assert_eq!( - >::get((collection_id, TokenId(1))).variable_data, - variable_data - ); - }); -} - -#[test] -fn set_variable_meta_data_on_fungible_token_fails() { - new_test_ext().execute_with(|| { - let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1)); - - let origin1 = Origin::signed(1); - - let data = default_fungible_data(); - create_test_item(collection_id, &data.into()); - - let variable_data = b"test data".to_vec(); - assert_noop!( - Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(0), - variable_data.try_into().unwrap() - ) - .map_err(|e| e.error), - >::FungibleItemsDontHaveData - ); - }); -} - -#[test] -fn set_variable_meta_data_on_nft_with_item_owner_permission_flag() { - new_test_ext().execute_with(|| { - //default_limits(); - - let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1)); - - let origin1 = Origin::signed(1); - - let data = default_nft_data(); - create_test_item(collection_id, &data.into()); - - assert_ok!(Unique::set_meta_update_permission_flag( - origin1.clone(), - collection_id, - MetaUpdatePermission::ItemOwner, - )); - - let variable_data = b"ten chars.".to_vec(); - assert_ok!(Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(1), - variable_data.clone().try_into().unwrap() - )); - - assert_eq!( - >::get((collection_id, TokenId(1))) - .unwrap() - .variable_data, - variable_data - ); - }); -} - -#[test] fn collection_transfer_flag_works() { new_test_ext().execute_with(|| { let origin1 = Origin::signed(1); @@ -2590,105 +2472,6 @@ } #[test] -fn set_variable_meta_data_on_nft_with_admin_flag() { - new_test_ext().execute_with(|| { - // default_limits(); - - let collection_id = - create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1)); - - let origin1 = Origin::signed(1); - let origin2 = Origin::signed(2); - - assert_ok!(Unique::set_mint_permission( - origin2.clone(), - collection_id, - true - )); - assert_ok!(Unique::add_to_allow_list( - origin2.clone(), - collection_id, - account(1) - )); - - assert_ok!(Unique::add_collection_admin( - origin2.clone(), - collection_id, - account(1) - )); - - let data = default_nft_data(); - create_test_item(collection_id, &data.into()); - - assert_ok!(Unique::set_meta_update_permission_flag( - origin2.clone(), - collection_id, - MetaUpdatePermission::Admin, - )); - - let variable_data = b"test.".to_vec(); - assert_ok!(Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(1), - variable_data.clone().try_into().unwrap() - )); - - assert_eq!( - >::get((collection_id, 1)) - .unwrap() - .variable_data, - variable_data - ); - }); -} - -#[test] -fn set_variable_meta_data_on_nft_with_admin_flag_neg() { - new_test_ext().execute_with(|| { - // default_limits(); - - let collection_id = - create_test_collection_for_owner(&CollectionMode::NFT, 2, CollectionId(1)); - - let origin1 = Origin::signed(1); - let origin2 = Origin::signed(2); - - assert_ok!(Unique::set_mint_permission( - origin2.clone(), - collection_id, - true - )); - assert_ok!(Unique::add_to_allow_list( - origin2.clone(), - collection_id, - account(1) - )); - - let data = default_nft_data(); - create_test_item(collection_id, &data.into()); - - assert_ok!(Unique::set_meta_update_permission_flag( - origin2.clone(), - collection_id, - MetaUpdatePermission::Admin, - )); - - let variable_data = b"test.".to_vec(); - assert_noop!( - Unique::set_variable_meta_data( - origin1, - collection_id, - TokenId(1), - variable_data.try_into().unwrap() - ) - .map_err(|e| e.error), - CommonError::::NoPermission - ); - }); -} - -#[test] fn set_variable_meta_flag_after_freeze() { new_test_ext().execute_with(|| { // default_limits(); @@ -2710,38 +2493,6 @@ MetaUpdatePermission::Admin ), CommonError::::MetadataFlagFrozen - ); - }); -} - -#[test] -fn set_variable_meta_data_on_nft_with_none_flag_neg() { - new_test_ext().execute_with(|| { - // default_limits(); - - let collection_id = - create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1)); - let origin1 = Origin::signed(1); - - let data = default_nft_data(); - create_test_item(collection_id, &data.into()); - - assert_ok!(Unique::set_meta_update_permission_flag( - origin1.clone(), - collection_id, - MetaUpdatePermission::None, - )); - - let variable_data = b"test.".to_vec(); - assert_noop!( - Unique::set_variable_meta_data( - origin1.clone(), - collection_id, - TokenId(1), - variable_data.try_into().unwrap() - ) - .map_err(|e| e.error), - CommonError::::NoPermission ); }); } --- a/smart_contracs/transfer/lib.rs +++ b/smart_contracs/transfer/lib.rs @@ -58,14 +58,12 @@ pub enum CreateItemData { Nft { const_data: Vec, - variable_data: Vec, }, Fungible { value: u128, }, ReFungible { const_data: Vec, - variable_data: Vec, pieces: u128, }, } @@ -88,8 +86,6 @@ fn approve(spender: DefaultAccountId, collection_id: u32, item_id: u32, amount: u128); #[ink(extension = 4, returns_result = false)] fn transfer_from(owner: DefaultAccountId, recipient: DefaultAccountId, collection_id: u32, item_id: u32, amount: u128); - #[ink(extension = 5, returns_result = false)] - fn set_variable_meta_data(collection_id: u32, item_id: u32, data: Vec); #[ink(extension = 6, returns_result = false)] fn toggle_allow_list(collection_id: u32, address: DefaultAccountId, allowlisted: bool); } @@ -143,12 +139,6 @@ let _ = self.env() .extension() .transfer_from(owner, recipient, collection_id, item_id, amount); - } - #[ink(message)] - pub fn set_variable_meta_data(&mut self, collection_id: u32, item_id: u32, data: Vec) { - let _ = self.env() - .extension() - .set_variable_meta_data(collection_id, item_id, data); } #[ink(message)] pub fn toggle_allow_list(&mut self, collection_id: u32, address: AccountId, allowlisted: bool) { -- gitstuff