difftreelog
feat sponsor token property modifications
in: master
3 files changed
pallets/unique/src/lib.rsdiffbeforeafterboth--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -242,6 +242,7 @@
/// Collection id (controlled?2), token id (controlled?2)
#[deprecated]
pub VariableMetaDataBasket get(fn variable_meta_data_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Option<T::BlockNumber>;
+ pub TokenPropertyBasket get(fn token_property_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>;
runtime/common/src/eth_sponsoring.rsdiffbeforeafterboth--- a/runtime/common/src/eth_sponsoring.rs
+++ b/runtime/common/src/eth_sponsoring.rs
@@ -30,7 +30,7 @@
use crate::sponsoring::*;
use pallet_nonfungible::erc::{
- UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call,
+ UniqueNFTCall, ERC721UniqueExtensionsCall, ERC721MintableCall, ERC721Call, TokenPropertiesCall,
};
use pallet_fungible::erc::{UniqueFungibleCall, ERC20Call};
use pallet_fungible::Config as FungibleConfig;
@@ -50,6 +50,17 @@
CollectionMode::NFT => {
let call = <UniqueNFTCall<T>>::parse(method_id, &mut reader).ok()??;
match call {
+ UniqueNFTCall::TokenProperties(
+ TokenPropertiesCall::SetProperty { token_id, key, value, .. },
+ ) => {
+ let token_id: TokenId = token_id.try_into().ok()?;
+ withdraw_set_token_property::<T>(
+ &collection,
+ &who,
+ &token_id,
+ key.len() + value.len(),
+ ).map(|()| sponsor)
+ }
UniqueNFTCall::ERC721UniqueExtensions(
ERC721UniqueExtensionsCall::Transfer { token_id, .. },
) => {
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,