difftreelog
feat support transfers from evm
in: master
1 file changed
pallets/nft/src/lib.rsdiffbeforeafterboth1213 /// * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)1213 /// * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)1214 #[weight = <T as Config>::WeightInfo::transfer()]1214 #[weight = <T as Config>::WeightInfo::transfer()]1215 #[transactional]1215 #[transactional]1216 pub fn transfer(origin, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {1216 pub fn transfer(origin, recipient: T::CrossAccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {1217 let sender = ensure_signed(origin)?;1217 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1218 let collection = Self::get_collection(collection_id)?;1218 let collection = Self::get_collection(collection_id)?;121912191220 Self::transfer_internal(sender, recipient, &collection, item_id, value)1220 Self::transfer_internal(sender, recipient, &collection, item_id, value)?;12211222 Ok(())1221 }1223 }122212241223 /// Set, change, or remove approved address to transfer the ownership of the NFT.1225 /// Set, change, or remove approved address to transfer the ownership of the NFT.173717391738impl<T: Config> Module<T> {1740impl<T: Config> Module<T> {173917411740 pub fn transfer_internal(sender: T::AccountId, recipient: T::AccountId, target_collection: &CollectionHandle<T>, item_id: TokenId, value: u128) -> DispatchResult {1742 pub fn transfer_internal(sender: T::CrossAccountId, recipient: T::CrossAccountId, target_collection: &CollectionHandle<T>, item_id: TokenId, value: u128) -> DispatchResult {1741 // Limits check1743 // Limits check1742 Self::is_correct_transfer(target_collection, &recipient)?;1744 Self::is_correct_transfer(target_collection, &recipient)?;174317451906 Ok(())1908 Ok(())1907 }1909 }190819101909 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::AccountId) -> DispatchResult {1911 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::CrossAccountId) -> DispatchResult {1910 let collection_id = collection.id;1912 let collection_id = collection.id;191119131912 // check token limit and account token limit1914 // check token limit and account token limit1913 let account_items: u32 = <AddressTokens<T>>::get(collection_id, recipient).len() as u32;1915 let account_items: u32 = <AddressTokens<T>>::get(collection_id, recipient.as_sub()).len() as u32;1914 ensure!(collection.limits.account_token_ownership_limit > account_items, Error::<T>::AccountTokenLimitExceeded);1916 ensure!(collection.limits.account_token_ownership_limit > account_items, Error::<T>::AccountTokenLimitExceeded);1915 1917 1916 Ok(())1918 Ok(())2264 fn transfer_fungible(2266 fn transfer_fungible(2265 collection: &CollectionHandle<T>,2267 collection: &CollectionHandle<T>,2266 value: u128,2268 value: u128,2267 owner: &T::AccountId,2269 owner: &T::CrossAccountId,2268 recipient: &T::AccountId,2270 recipient: &T::CrossAccountId,2269 ) -> DispatchResult {2271 ) -> DispatchResult {2270 let collection_id = collection.id;2272 let collection_id = collection.id;227122732272 let mut balance = <FungibleItemList<T>>::get(collection_id, owner);2274 let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());2273 ensure!(balance.value >= value, Error::<T>::TokenValueTooLow);2275 ensure!(balance.value >= value, Error::<T>::TokenValueTooLow);227422762275 // Send balance to recipient (updates balanceOf of recipient)2277 // Send balance to recipient (updates balanceOf of recipient)2276 Self::add_fungible_item(collection, recipient, value)?;2278 Self::add_fungible_item(collection, recipient, value)?;227722792278 // update balanceOf of sender2280 // update balanceOf of sender2279 <Balance<T>>::insert(collection_id, (*owner).clone(), balance.value - value);2281 <Balance<T>>::insert(collection_id, owner.as_sub(), balance.value - value);228022822281 // Reduce or remove sender2283 // Reduce or remove sender2282 if balance.value == value {2284 if balance.value == value {2283 <FungibleItemList<T>>::remove(collection_id, owner);2285 <FungibleItemList<T>>::remove(collection_id, owner.as_sub());2284 }2286 }2285 else {2287 else {2286 balance.value -= value;2288 balance.value -= value;2287 <FungibleItemList<T>>::insert(collection_id, (*owner).clone(), balance);2289 <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);2288 }2290 }22912292 Self::deposit_event(RawEvent::Transfer(collection.id, 1, owner.clone(), recipient.clone(), value));228922932290 Ok(())2294 Ok(())2291 }2295 }2294 collection: &CollectionHandle<T>,2298 collection: &CollectionHandle<T>,2295 item_id: TokenId,2299 item_id: TokenId,2296 value: u128,2300 value: u128,2297 owner: T::AccountId,2301 owner: T::CrossAccountId,2298 new_owner: T::AccountId,2302 new_owner: T::CrossAccountId,2299 ) -> DispatchResult {2303 ) -> DispatchResult {2300 let collection_id = collection.id;2304 let collection_id = collection.id;2301 let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id)2305 let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id)2312 ensure!(amount >= value, Error::<T>::TokenValueTooLow);2316 ensure!(amount >= value, Error::<T>::TokenValueTooLow);231323172314 // update balance2318 // update balance2315 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())2319 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())2316 .checked_sub(value)2320 .checked_sub(value)2317 .ok_or(Error::<T>::NumOverflow)?;2321 .ok_or(Error::<T>::NumOverflow)?;2318 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);2322 <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);231923232320 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone())2324 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())2321 .checked_add(value)2325 .checked_add(value)2322 .ok_or(Error::<T>::NumOverflow)?;2326 .ok_or(Error::<T>::NumOverflow)?;2323 <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);2327 <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);232423282325 let old_owner = item.owner.clone();2329 let old_owner = item.owner.clone();2326 let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);2330 let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);2370 <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);2374 <ReFungibleItemList<T>>::insert(collection_id, item_id, new_full_item);2371 }2375 }23762377 Self::deposit_event(RawEvent::Transfer(collection.id, item_id, owner, new_owner, amount));237223782373 Ok(())2379 Ok(())2374 }2380 }237523812376 fn transfer_nft(2382 fn transfer_nft(2377 collection: &CollectionHandle<T>,2383 collection: &CollectionHandle<T>,2378 item_id: TokenId,2384 item_id: TokenId,2379 sender: T::AccountId,2385 sender: T::CrossAccountId,2380 new_owner: T::AccountId,2386 new_owner: T::CrossAccountId,2381 ) -> DispatchResult {2387 ) -> DispatchResult {2382 let collection_id = collection.id;2388 let collection_id = collection.id;2383 let mut item = <NftItemList<T>>::get(collection_id, item_id)2389 let mut item = <NftItemList<T>>::get(collection_id, item_id)2389 );2395 );239023962391 // update balance2397 // update balance2392 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone())2398 let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.as_sub())2393 .checked_sub(1)2399 .checked_sub(1)2394 .ok_or(Error::<T>::NumOverflow)?;2400 .ok_or(Error::<T>::NumOverflow)?;2395 <Balance<T>>::insert(collection_id, item.owner.clone(), balance_old_owner);2401 <Balance<T>>::insert(collection_id, item.owner.as_sub(), balance_old_owner);239624022397 let balancenew_owner = <Balance<T>>::get(collection_id, new_owner.clone())2403 let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.as_sub())2398 .checked_add(1)2404 .checked_add(1)2399 .ok_or(Error::<T>::NumOverflow)?;2405 .ok_or(Error::<T>::NumOverflow)?;2400 <Balance<T>>::insert(collection_id, new_owner.clone(), balancenew_owner);2406 <Balance<T>>::insert(collection_id, new_owner.as_sub(), balance_new_owner);240124072402 // change owner2408 // change owner2403 let old_owner = item.owner.clone();2409 let old_owner = item.owner.clone();2407 // update index collection2413 // update index collection2408 Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;2414 Self::move_token_index(collection_id, item_id, &old_owner, &new_owner)?;24152416 Self::deposit_event(RawEvent::Transfer(collection.id, item_id, sender, new_owner, 1));240924172410 Ok(())2418 Ok(())2411 }2419 }