difftreelog
feat sponsor token property modifications
in: master
3 files changed
pallets/unique/src/lib.rsdiffbeforeafterboth242 /// Collection id (controlled?2), token id (controlled?2)242 /// Collection id (controlled?2), token id (controlled?2)243 #[deprecated]243 #[deprecated]244 pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;244 pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;245 pub TokenPropertyBasket get(fn token_property_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;245246246 /// Approval sponsoring247 /// Approval sponsoring247 pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;248 pub NftApproveBasket get(fn nft_approve_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;runtime/common/src/eth_sponsoring.rsdiffbeforeafterboth30use crate::sponsoring::*;30use crate::sponsoring::*;313132use pallet_nonfungible::erc::{32use pallet_nonfungible::erc::{33 UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call,33 UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call, TokenPropertiesCall,34};34};35use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};35use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};36use pallet_fungible::Config as FungibleConfig;36use pallet_fungible::Config as FungibleConfig;50 CollectionMode::NFT => {50 CollectionMode::NFT => {51 let call = <UniqueNFTCall<T>>::parse(method_id, &mut reader).ok()??;51 let call = <UniqueNFTCall<T>>::parse(method_id, &mut reader).ok()??;52 match call {52 match call {53 UniqueNFTCall::TokenProperties(54 TokenPropertiesCall::SetProperty { token_id, key, value, .. },55 ) => {56 let token_id: TokenId = token_id.try_into().ok()?;57 withdraw_set_token_property::<T>(58 &collection,59 &who,60 &token_id,61 key.len() + value.len(),62 ).map(|()| sponsor)63 }53 UniqueNFTCall::ERC721UniqueExtensions(64 UniqueNFTCall::ERC721UniqueExtensions(54 ERC721UniqueExtensionsCall::Transfer { token_id, .. },65 ERC721UniqueExtensionsCall::Transfer { token_id, .. },55 ) => {66 ) => {runtime/common/src/sponsoring.rsdiffbeforeafterboth30use pallet_unique::{30use pallet_unique::{31 Call as UniqueCall, Config as UniqueConfig, FungibleApproveBasket, RefungibleApproveBasket,31 Call as UniqueCall, Config as UniqueConfig, FungibleApproveBasket, RefungibleApproveBasket,32 NftApproveBasket, CreateItemBasket, ReFungibleTransferBasket, FungibleTransferBasket,32 NftApproveBasket, CreateItemBasket, ReFungibleTransferBasket,33 NftTransferBasket,33 FungibleTransferBasket, NftTransferBasket, TokenPropertyBasket,34};34};35use pallet_fungible::Config as FungibleConfig;35use pallet_fungible::Config as FungibleConfig;36use pallet_nonfungible::Config as NonfungibleConfig;36use pallet_nonfungible::Config as NonfungibleConfig;39pub trait Config: UniqueConfig + FungibleConfig + NonfungibleConfig + RefungibleConfig {}39pub trait Config: UniqueConfig + FungibleConfig + NonfungibleConfig + RefungibleConfig {}40impl<T> Config for T where T: UniqueConfig + FungibleConfig + NonfungibleConfig + RefungibleConfig {}40impl<T> Config for T where T: UniqueConfig + FungibleConfig + NonfungibleConfig + RefungibleConfig {}4142// TODO: permission check?43pub fn withdraw_set_token_property<T: Config>(44 collection: &CollectionHandle<T>,45 who: &T::CrossAccountId,46 item_id: &TokenId,47 data_size: usize,48) -> Option<()> {49 // preliminary sponsoring correctness check50 match collection.mode {51 CollectionMode::NFT => {52 let owner = pallet_nonfungible::TokenData::<T>::get((collection.id, item_id))?.owner;53 if !owner.conv_eq(who) {54 return None;55 }56 }57 CollectionMode::Fungible(_) => {58 // Fungible tokens have no properties59 return None;60 }61 CollectionMode::ReFungible => {62 if !<pallet_refungible::Owned<T>>::get((collection.id, who, item_id)) {63 return None;64 }65 }66 }6768 if data_size > collection.limits.sponsored_data_size() as usize {69 return None;70 }7172 let block_number = <frame_system::Pallet<T>>::block_number() as T::BlockNumber;73 let limit = collection.limits.sponsored_data_rate_limit()?;7475 if let Some(last_tx_block) = TokenPropertyBasket::<T>::get(collection.id, item_id) {76 let timeout = last_tx_block + limit.into();77 if block_number < timeout {78 return None;79 }80 }8182 <TokenPropertyBasket<T>>::insert(collection.id, item_id, block_number);8384 Some(())85}418642pub fn withdraw_transfer<T: Config>(87pub fn withdraw_transfer<T: Config>(43 collection: &CollectionHandle<T>,88 collection: &CollectionHandle<T>,190{235{191 fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {236 fn get_sponsor(who: &T::AccountId, call: &C) -> Option<T::AccountId> {192 match IsSubType::<UniqueCall<T>>::is_sub_type(call)? {237 match IsSubType::<UniqueCall<T>>::is_sub_type(call)? {238 UniqueCall::set_token_properties {239 collection_id,240 token_id,241 properties,242 ..243 } => {244 let (sponsor, collection) = load::<T>(*collection_id)?;245 withdraw_set_token_property(246 &collection,247 &T::CrossAccountId::from_sub(who.clone()),248 &token_id,249 // No overflow may happen, as data larger than usize can't reach here250 properties.iter().map(|p| p.key.len() + p.value.len()).sum()251 )252 .map(|()| sponsor)253 }193 UniqueCall::create_item {254 UniqueCall::create_item {194 collection_id,255 collection_id,195 data,256 data,