difftreelog
refactor Remove variable data from tokens
in: master
23 files changed
client/rpc/src/lib.rsdiffbeforeafterboth--- a/client/rpc/src/lib.rs
+++ b/client/rpc/src/lib.rs
@@ -71,13 +71,6 @@
token: TokenId,
at: Option<BlockHash>,
) -> Result<Vec<u8>>;
- #[rpc(name = "unique_variableMetadata")]
- fn variable_metadata(
- &self,
- collection: CollectionId,
- token: TokenId,
- at: Option<BlockHash>,
- ) -> Result<Vec<u8>>;
#[rpc(name = "unique_collectionProperties")]
fn collection_properties(
@@ -279,7 +272,6 @@
);
pass_method!(topmost_token_owner(collection: CollectionId, token: TokenId) -> Option<CrossAccountId>);
pass_method!(const_metadata(collection: CollectionId, token: TokenId) -> Vec<u8>);
- pass_method!(variable_metadata(collection: CollectionId, token: TokenId) -> Vec<u8>);
pass_method!(collection_properties(
collection: CollectionId,
pallets/common/src/lib.rsdiffbeforeafterboth--- 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<T: Config> {
@@ -1163,13 +1160,6 @@
nesting_budget: &dyn Budget,
) -> DispatchResultWithPostInfo;
- fn set_variable_metadata(
- &self,
- sender: T::CrossAccountId,
- token: TokenId,
- data: BoundedVec<u8, CustomDataLimit>,
- ) -> DispatchResultWithPostInfo;
-
fn check_nesting(
&self,
sender: T::CrossAccountId,
@@ -1185,7 +1175,6 @@
fn token_owner(&self, token: TokenId) -> Option<T::CrossAccountId>;
fn const_metadata(&self, token: TokenId) -> Vec<u8>;
- fn variable_metadata(&self, token: TokenId) -> Vec<u8>;
fn token_properties(&self, token_id: TokenId, keys: Vec<PropertyKey>) -> Vec<Property>;
/// Amount of unique collection tokens
fn total_supply(&self) -> u32;
pallets/fungible/src/common.rsdiffbeforeafterboth--- 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 {
<SelfWeightOf<T>>::burn_from()
}
-
- fn set_variable_metadata(_bytes: u32) -> Weight {
- // Error
- 0
- }
}
impl<T: Config> CommonCollectionOperations<T> for FungibleHandle<T> {
@@ -287,15 +282,6 @@
fail!(<Error<T>>::SettingPropertiesNotAllowed)
}
- fn set_variable_metadata(
- &self,
- _sender: T::CrossAccountId,
- _token: TokenId,
- _data: BoundedVec<u8, CustomDataLimit>,
- ) -> DispatchResultWithPostInfo {
- fail!(<Error<T>>::FungibleItemsDontHaveData)
- }
-
fn check_nesting(
&self,
_sender: <T>::CrossAccountId,
@@ -330,9 +316,6 @@
None
}
fn const_metadata(&self, _token: TokenId) -> Vec<u8> {
- Vec::new()
- }
- fn variable_metadata(&self, _token: TokenId) -> Vec<u8> {
Vec::new()
}
pallets/nonfungible/Cargo.tomldiffbeforeafterboth--- 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"]
pallets/nonfungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/benchmarking.rs
+++ b/pallets/nonfungible/src/benchmarking.rs
@@ -28,10 +28,8 @@
fn create_max_item_data<T: Config>(owner: T::CrossAccountId) -> CreateItemData<T> {
let const_data = create_data::<CUSTOM_DATA_LIMIT>();
- let variable_data = create_data::<CUSTOM_DATA_LIMIT>();
CreateItemData::<T> {
const_data,
- variable_data,
owner,
}
}
@@ -125,14 +123,4 @@
let item = create_max_item(&collection, &owner, sender.clone())?;
<Pallet<T>>::set_allowance(&collection, &sender, item, Some(&burner))?;
}: {<Pallet<T>>::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();
- }: {<Pallet<T>>::set_variable_metadata(&collection, &sender, item, data)?}
}
pallets/nonfungible/src/common.rsdiffbeforeafterboth--- 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 {
<SelfWeightOf<T>>::burn_from()
- }
-
- fn set_variable_metadata(bytes: u32) -> Weight {
- <SelfWeightOf<T>>::set_variable_metadata(bytes)
}
}
@@ -99,7 +95,6 @@
match data {
up_data_structs::CreateItemData::NFT(data) => Ok(CreateItemData::<T> {
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<u8, CustomDataLimit>,
- ) -> DispatchResultWithPostInfo {
- let len = data.len();
- with_weight(
- <Pallet<T>>::set_variable_metadata(self, &sender, token, data),
- <CommonWeights<T>>::set_variable_metadata(len as u32),
- )
}
fn check_nesting(
@@ -376,12 +358,6 @@
fn const_metadata(&self, token: TokenId) -> Vec<u8> {
<TokenData<T>>::get((self.id, token))
.map(|t| t.const_data)
- .unwrap_or_default()
- .into_inner()
- }
- fn variable_metadata(&self, token: TokenId) -> Vec<u8> {
- <TokenData<T>>::get((self.id, token))
- .map(|t| t.variable_data)
.unwrap_or_default()
.into_inner()
}
pallets/nonfungible/src/erc.rsdiffbeforeafterboth1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617extern crate alloc;18use core::{19 char::{REPLACEMENT_CHARACTER, decode_utf16},20 convert::TryInto,21};22use evm_coder::{ToLog, execution::*, generate_stubgen, solidity, solidity_interface, types::*, weight};23use frame_support::BoundedVec;24use up_data_structs::{TokenId, SchemaVersion};25use pallet_evm_coder_substrate::dispatch_to_evm;26use sp_core::{H160, U256};27use sp_std::{vec::Vec, vec};28use pallet_common::{29 erc::{CommonEvmHandler, PrecompileResult, CollectionPropertiesCall},30 CollectionHandle,31};32use pallet_evm::account::CrossAccountId;33use pallet_evm_coder_substrate::call;34use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};3536use crate::{37 AccountBalance, Config, CreateItemData, NonfungibleHandle, Pallet, TokenData, TokensMinted,38 SelfWeightOf, weights::WeightInfo,39};4041fn error_unsupported_schema_version() -> Error {42 alloc::format!(43 "Unsupported schema version! Support only {:?}",44 SchemaVersion::ImageURL45 )46 .as_str()47 .into()48}4950#[derive(ToLog)]51pub enum ERC721Events {52 Transfer {53 #[indexed]54 from: address,55 #[indexed]56 to: address,57 #[indexed]58 token_id: uint256,59 },60 Approval {61 #[indexed]62 owner: address,63 #[indexed]64 approved: address,65 #[indexed]66 token_id: uint256,67 },68 #[allow(dead_code)]69 ApprovalForAll {70 #[indexed]71 owner: address,72 #[indexed]73 operator: address,74 approved: bool,75 },76}7778#[derive(ToLog)]79pub enum ERC721MintableEvents {80 #[allow(dead_code)]81 MintingFinished {},82}8384#[solidity_interface(name = "ERC721Metadata")]85impl<T: Config> NonfungibleHandle<T> {86 fn name(&self) -> Result<string> {87 Ok(decode_utf16(self.name.iter().copied())88 .map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))89 .collect::<string>())90 }9192 fn symbol(&self) -> Result<string> {93 Ok(string::from_utf8_lossy(&self.token_prefix).into())94 }9596 /// Returns token's const_metadata97 #[solidity(rename_selector = "tokenURI")]98 fn token_uri(&self, token_id: uint256) -> Result<string> {99 if !matches!(self.schema_version, SchemaVersion::ImageURL) {100 return Err(error_unsupported_schema_version());101 }102103 self.consume_store_reads(1)?;104 let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;105 Ok(string::from_utf8_lossy(106 &<TokenData<T>>::get((self.id, token_id))107 .ok_or("token not found")?108 .const_data,109 )110 .into())111 }112}113114#[solidity_interface(name = "ERC721Enumerable")]115impl<T: Config> NonfungibleHandle<T> {116 fn token_by_index(&self, index: uint256) -> Result<uint256> {117 Ok(index)118 }119120 /// Not implemented121 fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {122 // TODO: Not implemetable123 Err("not implemented".into())124 }125126 fn total_supply(&self) -> Result<uint256> {127 self.consume_store_reads(1)?;128 Ok(<Pallet<T>>::total_supply(self).into())129 }130}131132#[solidity_interface(name = "ERC721", events(ERC721Events))]133impl<T: Config> NonfungibleHandle<T> {134 fn balance_of(&self, owner: address) -> Result<uint256> {135 self.consume_store_reads(1)?;136 let owner = T::CrossAccountId::from_eth(owner);137 let balance = <AccountBalance<T>>::get((self.id, owner));138 Ok(balance.into())139 }140 fn owner_of(&self, token_id: uint256) -> Result<address> {141 self.consume_store_reads(1)?;142 let token: TokenId = token_id.try_into()?;143 Ok(*<TokenData<T>>::get((self.id, token))144 .ok_or("token not found")?145 .owner146 .as_eth())147 }148 /// Not implemented149 fn safe_transfer_from_with_data(150 &mut self,151 _from: address,152 _to: address,153 _token_id: uint256,154 _data: bytes,155 _value: value,156 ) -> Result<void> {157 // TODO: Not implemetable158 Err("not implemented".into())159 }160 /// Not implemented161 fn safe_transfer_from(162 &mut self,163 _from: address,164 _to: address,165 _token_id: uint256,166 _value: value,167 ) -> Result<void> {168 // TODO: Not implemetable169 Err("not implemented".into())170 }171172 #[weight(<SelfWeightOf<T>>::transfer_from())]173 fn transfer_from(174 &mut self,175 caller: caller,176 from: address,177 to: address,178 token_id: uint256,179 _value: value,180 ) -> Result<void> {181 let caller = T::CrossAccountId::from_eth(caller);182 let from = T::CrossAccountId::from_eth(from);183 let to = T::CrossAccountId::from_eth(to);184 let token = token_id.try_into()?;185 let budget = self186 .recorder187 .weight_calls_budget(<StructureWeight<T>>::find_parent());188189 <Pallet<T>>::transfer_from(self, &caller, &from, &to, token, &budget)190 .map_err(dispatch_to_evm::<T>)?;191 Ok(())192 }193194 #[weight(<SelfWeightOf<T>>::approve())]195 fn approve(196 &mut self,197 caller: caller,198 approved: address,199 token_id: uint256,200 _value: value,201 ) -> Result<void> {202 let caller = T::CrossAccountId::from_eth(caller);203 let approved = T::CrossAccountId::from_eth(approved);204 let token = token_id.try_into()?;205206 <Pallet<T>>::set_allowance(self, &caller, token, Some(&approved))207 .map_err(dispatch_to_evm::<T>)?;208 Ok(())209 }210211 /// Not implemented212 fn set_approval_for_all(213 &mut self,214 _caller: caller,215 _operator: address,216 _approved: bool,217 ) -> Result<void> {218 // TODO: Not implemetable219 Err("not implemented".into())220 }221222 /// Not implemented223 fn get_approved(&self, _token_id: uint256) -> Result<address> {224 // TODO: Not implemetable225 Err("not implemented".into())226 }227228 /// Not implemented229 fn is_approved_for_all(&self, _owner: address, _operator: address) -> Result<address> {230 // TODO: Not implemetable231 Err("not implemented".into())232 }233}234235#[solidity_interface(name = "ERC721Burnable")]236impl<T: Config> NonfungibleHandle<T> {237 #[weight(<SelfWeightOf<T>>::burn_item())]238 fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {239 let caller = T::CrossAccountId::from_eth(caller);240 let token = token_id.try_into()?;241242 <Pallet<T>>::burn(self, &caller, token).map_err(dispatch_to_evm::<T>)?;243 Ok(())244 }245}246247#[solidity_interface(name = "ERC721Mintable", events(ERC721MintableEvents))]248impl<T: Config> NonfungibleHandle<T> {249 fn minting_finished(&self) -> Result<bool> {250 Ok(false)251 }252253 /// `token_id` should be obtained with `next_token_id` method,254 /// unlike standard, you can't specify it manually255 #[weight(<SelfWeightOf<T>>::create_item())]256 fn mint(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {257 let caller = T::CrossAccountId::from_eth(caller);258 let to = T::CrossAccountId::from_eth(to);259 let token_id: u32 = token_id.try_into()?;260 let budget = self261 .recorder262 .weight_calls_budget(<StructureWeight<T>>::find_parent());263264 if <TokensMinted<T>>::get(self.id)265 .checked_add(1)266 .ok_or("item id overflow")?267 != token_id268 {269 return Err("item id should be next".into());270 }271272 <Pallet<T>>::create_item(273 self,274 &caller,275 CreateItemData::<T> {276 const_data: BoundedVec::default(),277 variable_data: BoundedVec::default(),278 properties: BoundedVec::default(),279 owner: to,280 },281 &budget,282 )283 .map_err(dispatch_to_evm::<T>)?;284285 Ok(true)286 }287288 /// `token_id` should be obtained with `next_token_id` method,289 /// unlike standard, you can't specify it manually290 #[solidity(rename_selector = "mintWithTokenURI")]291 #[weight(<SelfWeightOf<T>>::create_item())]292 fn mint_with_token_uri(293 &mut self,294 caller: caller,295 to: address,296 token_id: uint256,297 token_uri: string,298 ) -> Result<bool> {299 if !matches!(self.schema_version, SchemaVersion::ImageURL) {300 return Err(error_unsupported_schema_version());301 }302303 let caller = T::CrossAccountId::from_eth(caller);304 let to = T::CrossAccountId::from_eth(to);305 let token_id: u32 = token_id.try_into().map_err(|_| "amount overflow")?;306 let budget = self307 .recorder308 .weight_calls_budget(<StructureWeight<T>>::find_parent());309310 if <TokensMinted<T>>::get(self.id)311 .checked_add(1)312 .ok_or("item id overflow")?313 != token_id314 {315 return Err("item id should be next".into());316 }317318 <Pallet<T>>::create_item(319 self,320 &caller,321 CreateItemData::<T> {322 const_data: Vec::<u8>::from(token_uri)323 .try_into()324 .map_err(|_| "token uri is too long")?,325 variable_data: BoundedVec::default(),326 properties: BoundedVec::default(),327 owner: to,328 },329 &budget,330 )331 .map_err(dispatch_to_evm::<T>)?;332 Ok(true)333 }334335 /// Not implemented336 fn finish_minting(&mut self, _caller: caller) -> Result<bool> {337 Err("not implementable".into())338 }339}340341#[solidity_interface(name = "ERC721UniqueExtensions")]342impl<T: Config> NonfungibleHandle<T> {343 #[weight(<SelfWeightOf<T>>::transfer())]344 fn transfer(345 &mut self,346 caller: caller,347 to: address,348 token_id: uint256,349 _value: value,350 ) -> Result<void> {351 let caller = T::CrossAccountId::from_eth(caller);352 let to = T::CrossAccountId::from_eth(to);353 let token = token_id.try_into()?;354 let budget = self355 .recorder356 .weight_calls_budget(<StructureWeight<T>>::find_parent());357358 <Pallet<T>>::transfer(self, &caller, &to, token, &budget).map_err(dispatch_to_evm::<T>)?;359 Ok(())360 }361362 #[weight(<SelfWeightOf<T>>::burn_from())]363 fn burn_from(364 &mut self,365 caller: caller,366 from: address,367 token_id: uint256,368 _value: value,369 ) -> Result<void> {370 let caller = T::CrossAccountId::from_eth(caller);371 let from = T::CrossAccountId::from_eth(from);372 let token = token_id.try_into()?;373 let budget = self374 .recorder375 .weight_calls_budget(<StructureWeight<T>>::find_parent());376377 <Pallet<T>>::burn_from(self, &caller, &from, token, &budget)378 .map_err(dispatch_to_evm::<T>)?;379 Ok(())380 }381382 fn next_token_id(&self) -> Result<uint256> {383 self.consume_store_reads(1)?;384 Ok(<TokensMinted<T>>::get(self.id)385 .checked_add(1)386 .ok_or("item id overflow")?387 .into())388 }389390 #[weight(<SelfWeightOf<T>>::set_variable_metadata(data.len() as u32))]391 fn set_variable_metadata(392 &mut self,393 caller: caller,394 token_id: uint256,395 data: bytes,396 ) -> Result<void> {397 let caller = T::CrossAccountId::from_eth(caller);398 let token = token_id.try_into()?;399400 <Pallet<T>>::set_variable_metadata(401 self,402 &caller,403 token,404 data.try_into()405 .map_err(|_| "metadata size exceeded limit")?,406 )407 .map_err(dispatch_to_evm::<T>)?;408 Ok(())409 }410411 fn get_variable_metadata(&self, token_id: uint256) -> Result<bytes> {412 self.consume_store_reads(1)?;413 let token: TokenId = token_id.try_into()?;414415 Ok(<TokenData<T>>::get((self.id, token))416 .ok_or("token not found")?417 .variable_data418 .into_inner())419 }420421 #[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]422 fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {423 let caller = T::CrossAccountId::from_eth(caller);424 let to = T::CrossAccountId::from_eth(to);425 let mut expected_index = <TokensMinted<T>>::get(self.id)426 .checked_add(1)427 .ok_or("item id overflow")?;428 let budget = self429 .recorder430 .weight_calls_budget(<StructureWeight<T>>::find_parent());431432 let total_tokens = token_ids.len();433 for id in token_ids.into_iter() {434 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;435 if id != expected_index {436 return Err("item id should be next".into());437 }438 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;439 }440 let data = (0..total_tokens)441 .map(|_| CreateItemData::<T> {442 const_data: BoundedVec::default(),443 variable_data: BoundedVec::default(),444 properties: BoundedVec::default(),445 owner: to.clone(),446 })447 .collect();448449 <Pallet<T>>::create_multiple_items(self, &caller, data, &budget)450 .map_err(dispatch_to_evm::<T>)?;451 Ok(true)452 }453454 #[solidity(rename_selector = "mintBulkWithTokenURI")]455 #[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]456 fn mint_bulk_with_token_uri(457 &mut self,458 caller: caller,459 to: address,460 tokens: Vec<(uint256, string)>,461 ) -> Result<bool> {462 if !matches!(self.schema_version, SchemaVersion::ImageURL) {463 return Err(error_unsupported_schema_version());464 }465466 let caller = T::CrossAccountId::from_eth(caller);467 let to = T::CrossAccountId::from_eth(to);468 let mut expected_index = <TokensMinted<T>>::get(self.id)469 .checked_add(1)470 .ok_or("item id overflow")?;471 let budget = self472 .recorder473 .weight_calls_budget(<StructureWeight<T>>::find_parent());474475 let mut data = Vec::with_capacity(tokens.len());476 for (id, token_uri) in tokens {477 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;478 if id != expected_index {479 return Err("item id should be next".into());480 }481 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;482483 data.push(CreateItemData::<T> {484 const_data: Vec::<u8>::from(token_uri)485 .try_into()486 .map_err(|_| "token uri is too long")?,487 variable_data: vec![].try_into().unwrap(),488 properties: BoundedVec::default(),489 owner: to.clone(),490 });491 }492493 <Pallet<T>>::create_multiple_items(self, &caller, data, &budget)494 .map_err(dispatch_to_evm::<T>)?;495 Ok(true)496 }497}498499#[solidity_interface(500 name = "UniqueNFT",501 is(502 ERC721,503 ERC721Metadata,504 ERC721Enumerable,505 ERC721UniqueExtensions,506 ERC721Mintable,507 ERC721Burnable,508 via("CollectionHandle<T>", common_mut, CollectionProperties)509 )510)]511impl<T: Config> NonfungibleHandle<T> {}512513// Not a tests, but code generators514generate_stubgen!(gen_impl, UniqueNFTCall<()>, true);515generate_stubgen!(gen_iface, UniqueNFTCall<()>, false);516517impl<T: Config> CommonEvmHandler for NonfungibleHandle<T> {518 const CODE: &'static [u8] = include_bytes!("./stubs/UniqueNFT.raw");519520 fn call(self, source: &H160, input: &[u8], value: U256) -> Option<PrecompileResult> {521 call::<T, UniqueNFTCall<T>, _>(*source, self, value, input)522 }523}1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617extern crate alloc;18use core::{19 char::{REPLACEMENT_CHARACTER, decode_utf16},20 convert::TryInto,21};22use evm_coder::{ToLog, execution::*, generate_stubgen, solidity, solidity_interface, types::*, weight};23use frame_support::BoundedVec;24use up_data_structs::{TokenId, SchemaVersion};25use pallet_evm_coder_substrate::dispatch_to_evm;26use sp_core::{H160, U256};27use sp_std::vec::Vec;28use pallet_common::{29 erc::{CommonEvmHandler, PrecompileResult, CollectionPropertiesCall},30 CollectionHandle,31};32use pallet_evm::account::CrossAccountId;33use pallet_evm_coder_substrate::call;34use pallet_structure::{SelfWeightOf as StructureWeight, weights::WeightInfo as _};3536use crate::{37 AccountBalance, Config, CreateItemData, NonfungibleHandle, Pallet, TokenData, TokensMinted,38 SelfWeightOf, weights::WeightInfo,39};4041fn error_unsupported_schema_version() -> Error {42 alloc::format!(43 "Unsupported schema version! Support only {:?}",44 SchemaVersion::ImageURL45 )46 .as_str()47 .into()48}4950#[derive(ToLog)]51pub enum ERC721Events {52 Transfer {53 #[indexed]54 from: address,55 #[indexed]56 to: address,57 #[indexed]58 token_id: uint256,59 },60 Approval {61 #[indexed]62 owner: address,63 #[indexed]64 approved: address,65 #[indexed]66 token_id: uint256,67 },68 #[allow(dead_code)]69 ApprovalForAll {70 #[indexed]71 owner: address,72 #[indexed]73 operator: address,74 approved: bool,75 },76}7778#[derive(ToLog)]79pub enum ERC721MintableEvents {80 #[allow(dead_code)]81 MintingFinished {},82}8384#[solidity_interface(name = "ERC721Metadata")]85impl<T: Config> NonfungibleHandle<T> {86 fn name(&self) -> Result<string> {87 Ok(decode_utf16(self.name.iter().copied())88 .map(|r| r.unwrap_or(REPLACEMENT_CHARACTER))89 .collect::<string>())90 }9192 fn symbol(&self) -> Result<string> {93 Ok(string::from_utf8_lossy(&self.token_prefix).into())94 }9596 /// Returns token's const_metadata97 #[solidity(rename_selector = "tokenURI")]98 fn token_uri(&self, token_id: uint256) -> Result<string> {99 if !matches!(self.schema_version, SchemaVersion::ImageURL) {100 return Err(error_unsupported_schema_version());101 }102103 self.consume_store_reads(1)?;104 let token_id: u32 = token_id.try_into().map_err(|_| "token id overflow")?;105 Ok(string::from_utf8_lossy(106 &<TokenData<T>>::get((self.id, token_id))107 .ok_or("token not found")?108 .const_data,109 )110 .into())111 }112}113114#[solidity_interface(name = "ERC721Enumerable")]115impl<T: Config> NonfungibleHandle<T> {116 fn token_by_index(&self, index: uint256) -> Result<uint256> {117 Ok(index)118 }119120 /// Not implemented121 fn token_of_owner_by_index(&self, _owner: address, _index: uint256) -> Result<uint256> {122 // TODO: Not implemetable123 Err("not implemented".into())124 }125126 fn total_supply(&self) -> Result<uint256> {127 self.consume_store_reads(1)?;128 Ok(<Pallet<T>>::total_supply(self).into())129 }130}131132#[solidity_interface(name = "ERC721", events(ERC721Events))]133impl<T: Config> NonfungibleHandle<T> {134 fn balance_of(&self, owner: address) -> Result<uint256> {135 self.consume_store_reads(1)?;136 let owner = T::CrossAccountId::from_eth(owner);137 let balance = <AccountBalance<T>>::get((self.id, owner));138 Ok(balance.into())139 }140 fn owner_of(&self, token_id: uint256) -> Result<address> {141 self.consume_store_reads(1)?;142 let token: TokenId = token_id.try_into()?;143 Ok(*<TokenData<T>>::get((self.id, token))144 .ok_or("token not found")?145 .owner146 .as_eth())147 }148 /// Not implemented149 fn safe_transfer_from_with_data(150 &mut self,151 _from: address,152 _to: address,153 _token_id: uint256,154 _data: bytes,155 _value: value,156 ) -> Result<void> {157 // TODO: Not implemetable158 Err("not implemented".into())159 }160 /// Not implemented161 fn safe_transfer_from(162 &mut self,163 _from: address,164 _to: address,165 _token_id: uint256,166 _value: value,167 ) -> Result<void> {168 // TODO: Not implemetable169 Err("not implemented".into())170 }171172 #[weight(<SelfWeightOf<T>>::transfer_from())]173 fn transfer_from(174 &mut self,175 caller: caller,176 from: address,177 to: address,178 token_id: uint256,179 _value: value,180 ) -> Result<void> {181 let caller = T::CrossAccountId::from_eth(caller);182 let from = T::CrossAccountId::from_eth(from);183 let to = T::CrossAccountId::from_eth(to);184 let token = token_id.try_into()?;185 let budget = self186 .recorder187 .weight_calls_budget(<StructureWeight<T>>::find_parent());188189 <Pallet<T>>::transfer_from(self, &caller, &from, &to, token, &budget)190 .map_err(dispatch_to_evm::<T>)?;191 Ok(())192 }193194 #[weight(<SelfWeightOf<T>>::approve())]195 fn approve(196 &mut self,197 caller: caller,198 approved: address,199 token_id: uint256,200 _value: value,201 ) -> Result<void> {202 let caller = T::CrossAccountId::from_eth(caller);203 let approved = T::CrossAccountId::from_eth(approved);204 let token = token_id.try_into()?;205206 <Pallet<T>>::set_allowance(self, &caller, token, Some(&approved))207 .map_err(dispatch_to_evm::<T>)?;208 Ok(())209 }210211 /// Not implemented212 fn set_approval_for_all(213 &mut self,214 _caller: caller,215 _operator: address,216 _approved: bool,217 ) -> Result<void> {218 // TODO: Not implemetable219 Err("not implemented".into())220 }221222 /// Not implemented223 fn get_approved(&self, _token_id: uint256) -> Result<address> {224 // TODO: Not implemetable225 Err("not implemented".into())226 }227228 /// Not implemented229 fn is_approved_for_all(&self, _owner: address, _operator: address) -> Result<address> {230 // TODO: Not implemetable231 Err("not implemented".into())232 }233}234235#[solidity_interface(name = "ERC721Burnable")]236impl<T: Config> NonfungibleHandle<T> {237 #[weight(<SelfWeightOf<T>>::burn_item())]238 fn burn(&mut self, caller: caller, token_id: uint256) -> Result<void> {239 let caller = T::CrossAccountId::from_eth(caller);240 let token = token_id.try_into()?;241242 <Pallet<T>>::burn(self, &caller, token).map_err(dispatch_to_evm::<T>)?;243 Ok(())244 }245}246247#[solidity_interface(name = "ERC721Mintable", events(ERC721MintableEvents))]248impl<T: Config> NonfungibleHandle<T> {249 fn minting_finished(&self) -> Result<bool> {250 Ok(false)251 }252253 /// `token_id` should be obtained with `next_token_id` method,254 /// unlike standard, you can't specify it manually255 #[weight(<SelfWeightOf<T>>::create_item())]256 fn mint(&mut self, caller: caller, to: address, token_id: uint256) -> Result<bool> {257 let caller = T::CrossAccountId::from_eth(caller);258 let to = T::CrossAccountId::from_eth(to);259 let token_id: u32 = token_id.try_into()?;260 let budget = self261 .recorder262 .weight_calls_budget(<StructureWeight<T>>::find_parent());263264 if <TokensMinted<T>>::get(self.id)265 .checked_add(1)266 .ok_or("item id overflow")?267 != token_id268 {269 return Err("item id should be next".into());270 }271272 <Pallet<T>>::create_item(273 self,274 &caller,275 CreateItemData::<T> {276 const_data: BoundedVec::default(),277 properties: BoundedVec::default(),278 owner: to,279 },280 &budget,281 )282 .map_err(dispatch_to_evm::<T>)?;283284 Ok(true)285 }286287 /// `token_id` should be obtained with `next_token_id` method,288 /// unlike standard, you can't specify it manually289 #[solidity(rename_selector = "mintWithTokenURI")]290 #[weight(<SelfWeightOf<T>>::create_item())]291 fn mint_with_token_uri(292 &mut self,293 caller: caller,294 to: address,295 token_id: uint256,296 token_uri: string,297 ) -> Result<bool> {298 if !matches!(self.schema_version, SchemaVersion::ImageURL) {299 return Err(error_unsupported_schema_version());300 }301302 let caller = T::CrossAccountId::from_eth(caller);303 let to = T::CrossAccountId::from_eth(to);304 let token_id: u32 = token_id.try_into().map_err(|_| "amount overflow")?;305 let budget = self306 .recorder307 .weight_calls_budget(<StructureWeight<T>>::find_parent());308309 if <TokensMinted<T>>::get(self.id)310 .checked_add(1)311 .ok_or("item id overflow")?312 != token_id313 {314 return Err("item id should be next".into());315 }316317 <Pallet<T>>::create_item(318 self,319 &caller,320 CreateItemData::<T> {321 const_data: Vec::<u8>::from(token_uri)322 .try_into()323 .map_err(|_| "token uri is too long")?,324 properties: BoundedVec::default(),325 owner: to,326 },327 &budget,328 )329 .map_err(dispatch_to_evm::<T>)?;330 Ok(true)331 }332333 /// Not implemented334 fn finish_minting(&mut self, _caller: caller) -> Result<bool> {335 Err("not implementable".into())336 }337}338339#[solidity_interface(name = "ERC721UniqueExtensions")]340impl<T: Config> NonfungibleHandle<T> {341 #[weight(<SelfWeightOf<T>>::transfer())]342 fn transfer(343 &mut self,344 caller: caller,345 to: address,346 token_id: uint256,347 _value: value,348 ) -> Result<void> {349 let caller = T::CrossAccountId::from_eth(caller);350 let to = T::CrossAccountId::from_eth(to);351 let token = token_id.try_into()?;352 let budget = self353 .recorder354 .weight_calls_budget(<StructureWeight<T>>::find_parent());355356 <Pallet<T>>::transfer(self, &caller, &to, token, &budget).map_err(dispatch_to_evm::<T>)?;357 Ok(())358 }359360 #[weight(<SelfWeightOf<T>>::burn_from())]361 fn burn_from(362 &mut self,363 caller: caller,364 from: address,365 token_id: uint256,366 _value: value,367 ) -> Result<void> {368 let caller = T::CrossAccountId::from_eth(caller);369 let from = T::CrossAccountId::from_eth(from);370 let token = token_id.try_into()?;371 let budget = self372 .recorder373 .weight_calls_budget(<StructureWeight<T>>::find_parent());374375 <Pallet<T>>::burn_from(self, &caller, &from, token, &budget)376 .map_err(dispatch_to_evm::<T>)?;377 Ok(())378 }379380 fn next_token_id(&self) -> Result<uint256> {381 self.consume_store_reads(1)?;382 Ok(<TokensMinted<T>>::get(self.id)383 .checked_add(1)384 .ok_or("item id overflow")?385 .into())386 }387388 #[weight(<SelfWeightOf<T>>::create_multiple_items(token_ids.len() as u32))]389 fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {390 let caller = T::CrossAccountId::from_eth(caller);391 let to = T::CrossAccountId::from_eth(to);392 let mut expected_index = <TokensMinted<T>>::get(self.id)393 .checked_add(1)394 .ok_or("item id overflow")?;395 let budget = self396 .recorder397 .weight_calls_budget(<StructureWeight<T>>::find_parent());398399 let total_tokens = token_ids.len();400 for id in token_ids.into_iter() {401 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;402 if id != expected_index {403 return Err("item id should be next".into());404 }405 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;406 }407 let data = (0..total_tokens)408 .map(|_| CreateItemData::<T> {409 const_data: BoundedVec::default(),410 properties: BoundedVec::default(),411 owner: to.clone(),412 })413 .collect();414415 <Pallet<T>>::create_multiple_items(self, &caller, data, &budget)416 .map_err(dispatch_to_evm::<T>)?;417 Ok(true)418 }419420 #[solidity(rename_selector = "mintBulkWithTokenURI")]421 #[weight(<SelfWeightOf<T>>::create_multiple_items(tokens.len() as u32))]422 fn mint_bulk_with_token_uri(423 &mut self,424 caller: caller,425 to: address,426 tokens: Vec<(uint256, string)>,427 ) -> Result<bool> {428 if !matches!(self.schema_version, SchemaVersion::ImageURL) {429 return Err(error_unsupported_schema_version());430 }431432 let caller = T::CrossAccountId::from_eth(caller);433 let to = T::CrossAccountId::from_eth(to);434 let mut expected_index = <TokensMinted<T>>::get(self.id)435 .checked_add(1)436 .ok_or("item id overflow")?;437 let budget = self438 .recorder439 .weight_calls_budget(<StructureWeight<T>>::find_parent());440441 let mut data = Vec::with_capacity(tokens.len());442 for (id, token_uri) in tokens {443 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;444 if id != expected_index {445 return Err("item id should be next".into());446 }447 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;448449 data.push(CreateItemData::<T> {450 const_data: Vec::<u8>::from(token_uri)451 .try_into()452 .map_err(|_| "token uri is too long")?,453 properties: BoundedVec::default(),454 owner: to.clone(),455 });456 }457458 <Pallet<T>>::create_multiple_items(self, &caller, data, &budget)459 .map_err(dispatch_to_evm::<T>)?;460 Ok(true)461 }462}463464#[solidity_interface(465 name = "UniqueNFT",466 is(467 ERC721,468 ERC721Metadata,469 ERC721Enumerable,470 ERC721UniqueExtensions,471 ERC721Mintable,472 ERC721Burnable,473 via("CollectionHandle<T>", common_mut, CollectionProperties)474 )475)]476impl<T: Config> NonfungibleHandle<T> {}477478// Not a tests, but code generators479generate_stubgen!(gen_impl, UniqueNFTCall<()>, true);480generate_stubgen!(gen_iface, UniqueNFTCall<()>, false);481482impl<T: Config> CommonEvmHandler for NonfungibleHandle<T> {483 const CODE: &'static [u8] = include_bytes!("./stubs/UniqueNFT.raw");484485 fn call(self, source: &H160, input: &[u8], value: U256) -> Option<PrecompileResult> {486 call::<T, UniqueNFTCall<T>, _>(*source, self, value, input)487 }488}pallets/nonfungible/src/lib.rsdiffbeforeafterboth--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -49,17 +49,22 @@
pub type CreateItemData<T> = CreateNftExData<<T as pallet_evm::account::Config>::CrossAccountId>;
pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
+#[struct_versioning::versioned(version = 2, upper)]
#[derive(Encode, Decode, TypeInfo, MaxEncodedLen)]
pub struct ItemData<CrossAccountId> {
pub const_data: BoundedVec<u8, CustomDataLimit>,
+
+ #[version(..2)]
pub variable_data: BoundedVec<u8, CustomDataLimit>,
+
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<T>(_);
@@ -133,6 +141,19 @@
Value = T::CrossAccountId,
QueryKind = OptionQuery,
>;
+
+ #[pallet::hooks]
+ impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
+ fn on_runtime_upgrade() -> Weight {
+ if StorageVersion::get::<Pallet<T>>() < StorageVersion::new(1) {
+ <TokenData<T>>::translate_values::<ItemDataVersion1<T::CrossAccountId>, _>(|v| {
+ Some(<ItemDataVersion2<T::CrossAccountId>>::from(v))
+ })
+ }
+
+ 0
+ }
+ }
}
pub struct NonfungibleHandle<T: Config>(pallet_common::CollectionHandle<T>);
@@ -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<T>,
- sender: &T::CrossAccountId,
- token: TokenId,
- data: BoundedVec<u8, CustomDataLimit>,
- ) -> DispatchResult {
- let token_data =
- <TokenData<T>>::get((collection.id, token)).ok_or(<CommonError<T>>::TokenNotFound)?;
- collection.check_can_update_meta(sender, &token_data.owner)?;
-
- // =========
-
- <TokenData<T>>::insert(
- (collection.id, token),
- ItemData {
- variable_data: data,
- ..token_data
- },
- );
- Ok(())
}
pub fn check_nesting(
pallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth--- 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
{}
pallets/nonfungible/src/weights.rsdiffbeforeafterboth--- 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))
}
}
pallets/refungible/Cargo.tomldiffbeforeafterboth--- 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"]
pallets/refungible/src/benchmarking.rsdiffbeforeafterboth--- a/pallets/refungible/src/benchmarking.rs
+++ b/pallets/refungible/src/benchmarking.rs
@@ -31,10 +31,8 @@
users: impl IntoIterator<Item = (CrossAccountId, u128)>,
) -> CreateRefungibleExData<CrossAccountId> {
let const_data = create_data::<CUSTOM_DATA_LIMIT>();
- let variable_data = create_data::<CUSTOM_DATA_LIMIT>();
CreateRefungibleExData {
const_data,
- variable_data,
users: users
.into_iter()
.collect::<BTreeMap<_, _>>()
@@ -203,14 +201,4 @@
let item = create_max_item(&collection, &owner, [(sender.clone(), 200)])?;
<Pallet<T>>::set_allowance(&collection, &sender, &burner, item, 200)?;
}: {<Pallet<T>>::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();
- }: {<Pallet<T>>::set_variable_metadata(&collection, &sender, item, data)?}
}
pallets/refungible/src/common.rsdiffbeforeafterboth--- 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 {
<SelfWeightOf<T>>::burn_from()
- }
-
- fn set_variable_metadata(bytes: u32) -> Weight {
- <SelfWeightOf<T>>::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!(<Error<T>>::SettingPropertiesNotAllowed)
}
- fn set_variable_metadata(
- &self,
- sender: T::CrossAccountId,
- token: TokenId,
- data: BoundedVec<u8, CustomDataLimit>,
- ) -> DispatchResultWithPostInfo {
- let len = data.len();
- with_weight(
- <Pallet<T>>::set_variable_metadata(self, &sender, token, data),
- <CommonWeights<T>>::set_variable_metadata(len as u32),
- )
- }
-
fn check_nesting(
&self,
_sender: <T>::CrossAccountId,
@@ -355,11 +337,6 @@
fn const_metadata(&self, token: TokenId) -> Vec<u8> {
<TokenData<T>>::get((self.id, token))
.const_data
- .into_inner()
- }
- fn variable_metadata(&self, token: TokenId) -> Vec<u8> {
- <TokenData<T>>::get((self.id, token))
- .variable_data
.into_inner()
}
pallets/refungible/src/lib.rsdiffbeforeafterboth--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -41,16 +41,20 @@
pub mod weights;
pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
+#[struct_versioning::versioned(version = 2, upper)]
#[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)]
pub struct ItemData {
pub const_data: BoundedVec<u8, CustomDataLimit>,
+
+ #[version(..2)]
pub variable_data: BoundedVec<u8, CustomDataLimit>,
}
#[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<T>(_);
@@ -146,6 +153,19 @@
Value = u128,
QueryKind = ValueQuery,
>;
+
+ #[pallet::hooks]
+ impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
+ fn on_runtime_upgrade() -> Weight {
+ if StorageVersion::get::<Pallet<T>>() < StorageVersion::new(1) {
+ <TokenData<T>>::translate_values::<ItemDataVersion1, _>(|v| {
+ Some(<ItemDataVersion2>::from(v))
+ })
+ }
+
+ 0
+ }
+ }
}
pub struct RefungibleHandle<T: Config>(pallet_common::CollectionHandle<T>);
@@ -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<T>,
- sender: &T::CrossAccountId,
- token: TokenId,
- data: BoundedVec<u8, CustomDataLimit>,
- ) -> DispatchResult {
- collection.check_can_update_meta(
- sender,
- &T::CrossAccountId::from_sub(collection.owner.clone()),
- )?;
-
- let token_data = <TokenData<T>>::get((collection.id, token));
-
- // =========
-
- <TokenData<T>>::insert(
- (collection.id, token),
- ItemData {
- variable_data: data,
- ..token_data
- },
- );
Ok(())
}
pallets/refungible/src/weights.rsdiffbeforeafterboth--- 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))
}
}
pallets/unique/src/lib.rsdiffbeforeafterboth--- 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<T::BlockNumber>;
//#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<T::BlockNumber>;
/// Approval sponsoring
pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
pub FungibleApproveBasket get(fn fungible_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(twox_64_concat) T::AccountId => Option<T::BlockNumber>;
@@ -333,7 +330,6 @@
<FungibleTransferBasket<T>>::remove_prefix(collection_id, None);
<ReFungibleTransferBasket<T>>::remove_prefix((collection_id,), None);
- <VariableMetaDataBasket<T>>::remove_prefix(collection_id, None);
<NftApproveBasket<T>>::remove_prefix(collection_id, None);
<FungibleApproveBasket<T>>::remove_prefix(collection_id, None);
<RefungibleApproveBasket<T>>::remove_prefix((collection_id,), None);
@@ -929,31 +925,6 @@
let budget = budget::Value::new(2);
dispatch_call::<T, _>(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<u8, CustomDataLimit>,
- ) -> DispatchResultWithPostInfo {
- let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
-
- dispatch_call::<T, _>(collection_id, |d| d.set_variable_metadata(sender, item_id, data))
}
/// Set meta_update_permission value for particular collection
primitives/data-structs/src/lib.rsdiffbeforeafterboth--- a/primitives/data-structs/src/lib.rs
+++ b/primitives/data-structs/src/lib.rs
@@ -364,28 +364,6 @@
pub type CollectionPropertiesVec =
BoundedVec<Property, ConstU32<MAX_COLLECTION_PROPERTIES_ENCODE_LEN>>;
-#[derive(Encode, Decode, Debug, Clone, PartialEq, TypeInfo)]
-#[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))]
-pub struct NftItemType<AccountId> {
- pub owner: AccountId,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
-}
-
-#[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<AccountId> {
- pub owner: Vec<Ownership<AccountId>>,
- pub const_data: Vec<u8>,
- pub variable_data: Vec<u8>,
-}
-
/// 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<u32>,
pub sponsored_data_size: Option<u32>,
+
+ /// 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<u8, CustomDataLimit>,
- #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
- #[derivative(Debug(format_with = "bounded::vec_debug"))]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
#[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<u8, CustomDataLimit>,
- #[cfg_attr(feature = "serde1", serde(with = "bounded::vec_serde"))]
- #[derivative(Debug(format_with = "bounded::vec_debug"))]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
pub pieces: u128,
}
@@ -545,8 +519,6 @@
pub struct CreateNftExData<CrossAccountId> {
#[derivative(Debug(format_with = "bounded::vec_debug"))]
pub const_data: BoundedVec<u8, CustomDataLimit>,
- #[derivative(Debug(format_with = "bounded::vec_debug"))]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
#[derivative(Debug(format_with = "bounded::vec_debug"))]
pub properties: CollectionPropertiesVec,
pub owner: CrossAccountId,
@@ -557,8 +529,6 @@
pub struct CreateRefungibleExData<CrossAccountId> {
#[derivative(Debug(format_with = "bounded::vec_debug"))]
pub const_data: BoundedVec<u8, CustomDataLimit>,
- #[derivative(Debug(format_with = "bounded::vec_debug"))]
- pub variable_data: BoundedVec<u8, CustomDataLimit>,
#[derivative(Debug(format_with = "bounded::map_debug"))]
pub users: BoundedBTreeMap<CrossAccountId, u128, ConstU32<MAX_ITEMS_PER_BATCH>>,
}
@@ -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,
}
}
primitives/rpc/src/lib.rsdiffbeforeafterboth--- a/primitives/rpc/src/lib.rs
+++ b/primitives/rpc/src/lib.rs
@@ -42,7 +42,6 @@
fn token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>>;
fn topmost_token_owner(collection: CollectionId, token: TokenId) -> Result<Option<CrossAccountId>>;
fn const_metadata(collection: CollectionId, token: TokenId) -> Result<Vec<u8>>;
- fn variable_metadata(collection: CollectionId, token: TokenId) -> Result<Vec<u8>>;
fn collection_properties(collection: CollectionId, properties: Vec<Vec<u8>>) -> Result<Vec<Property>>;
runtime/common/src/runtime_apis.rsdiffbeforeafterboth--- 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<Vec<u8>, DispatchError> {
dispatch_unique_runtime!(collection.const_metadata(token))
}
- fn variable_metadata(collection: CollectionId, token: TokenId) -> Result<Vec<u8>, DispatchError> {
- dispatch_unique_runtime!(collection.variable_metadata(token))
- }
fn collection_properties(
collection: CollectionId,
runtime/common/src/sponsoring.rsdiffbeforeafterboth--- 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<T: Config>(
- who: &T::CrossAccountId,
- collection: &CollectionHandle<T>,
- 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::<T>::get((collection.id, item_id))?.owner;
- if !owner.conv_eq(who) {
- return None;
- }
- }
- CollectionMode::Fungible(_) => {
- if item_id != &TokenId::default() {
- return None;
- }
- if <pallet_fungible::Balance<T>>::get((collection.id, who)) == 0 {
- return None;
- }
- }
- CollectionMode::ReFungible => {
- if !<pallet_refungible::Owned<T>>::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 = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;
- let limit = collection.limits.sponsored_data_rate_limit()?;
-
- if let Some(last_tx_block) = VariableMetaDataBasket::<T>::get(collection.id, item_id) {
- let timeout = last_tx_block + limit.into();
- if block_number < timeout {
- return None;
- }
- }
-
- <VariableMetaDataBasket<T>>::insert(collection.id, item_id, block_number);
-
- Some(())
-}
-
pub fn withdraw_approve<T: Config>(
collection: &CollectionHandle<T>,
who: &T::AccountId,
@@ -290,20 +233,6 @@
} => {
let (sponsor, collection) = load(*collection_id)?;
withdraw_approve::<T>(&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>(
- &T::CrossAccountId::from_sub(who.clone()),
- &collection,
- item_id,
- data,
- )
- .map(|()| sponsor)
}
_ => None,
}
runtime/common/src/weights.rsdiffbeforeafterboth--- a/runtime/common/src/weights.rs
+++ b/runtime/common/src/weights.rs
@@ -86,10 +86,6 @@
dispatch_weight::<T>() + max_weight_of!(transfer_from())
}
- fn set_variable_metadata(bytes: u32) -> Weight {
- dispatch_weight::<T>() + max_weight_of!(set_variable_metadata(bytes))
- }
-
fn burn_from() -> Weight {
dispatch_weight::<T>() + max_weight_of!(burn_from())
}
runtime/tests/src/tests.rsdiffbeforeafterboth--- 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 = <pallet_nonfungible::TokenData<Test>>::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 =
<pallet_refungible::Balance<Test>>::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 =
<pallet_refungible::Balance<Test>>::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 = <pallet_refungible::TokenData<Test>>::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!(
<pallet_refungible::AccountBalance<Test>>::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!(
- <pallet_nonfungible::TokenData<Test>>::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!(
- <pallet_refungible::TokenData<Test>>::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),
- <pallet_fungible::Error<Test>>::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!(
- <pallet_nonfungible::TokenData<Test>>::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!(
- <pallet_nonfungible::TokenData<Test>>::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::<Test>::NoPermission
- );
- });
-}
-
-#[test]
fn set_variable_meta_flag_after_freeze() {
new_test_ext().execute_with(|| {
// default_limits();
@@ -2710,38 +2493,6 @@
MetaUpdatePermission::Admin
),
CommonError::<Test>::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::<Test>::NoPermission
);
});
}
smart_contracs/transfer/lib.rsdiffbeforeafterboth--- a/smart_contracs/transfer/lib.rs
+++ b/smart_contracs/transfer/lib.rs
@@ -58,14 +58,12 @@
pub enum CreateItemData {
Nft {
const_data: Vec<u8>,
- variable_data: Vec<u8>,
},
Fungible {
value: u128,
},
ReFungible {
const_data: Vec<u8>,
- variable_data: Vec<u8>,
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<u8>);
#[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<u8>) {
- 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) {