git.delta.rocks / unique-network / refs/commits / 481e942f67c4

difftreelog

feat support transfers from evm

Yaroslav Bolyukin2021-04-30parent: #f2db9e8.patch.diff
in: master

1 file changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
1213 /// * 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)?;
12191219
1220 Self::transfer_internal(sender, recipient, &collection, item_id, value)1220 Self::transfer_internal(sender, recipient, &collection, item_id, value)?;
1221
1222 Ok(())
1221 }1223 }
12221224
1223 /// 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.
17371739
1738impl<T: Config> Module<T> {1740impl<T: Config> Module<T> {
17391741
1740 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 check
1742 Self::is_correct_transfer(target_collection, &recipient)?;1744 Self::is_correct_transfer(target_collection, &recipient)?;
17431745
1906 Ok(())1908 Ok(())
1907 }1909 }
19081910
1909 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;
19111913
1912 // check token limit and account token limit1914 // check token limit and account token limit
1913 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;
22712273
2272 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);
22742276
2275 // 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)?;
22772279
2278 // update balanceOf of sender2280 // update balanceOf of sender
2279 <Balance<T>>::insert(collection_id, (*owner).clone(), balance.value - value);2281 <Balance<T>>::insert(collection_id, owner.as_sub(), balance.value - value);
22802282
2281 // Reduce or remove sender2283 // Reduce or remove sender
2282 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 }
2291
2292 Self::deposit_event(RawEvent::Transfer(collection.id, 1, owner.clone(), recipient.clone(), value));
22892293
2290 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);
23132317
2314 // update balance2318 // update balance
2315 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);
23192323
2320 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);
23242328
2325 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 }
2376
2377 Self::deposit_event(RawEvent::Transfer(collection.id, item_id, owner, new_owner, amount));
23722378
2373 Ok(())2379 Ok(())
2374 }2380 }
23752381
2376 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 );
23902396
2391 // update balance2397 // update balance
2392 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);
23962402
2397 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);
24012407
2402 // change owner2408 // change owner
2403 let old_owner = item.owner.clone();2409 let old_owner = item.owner.clone();
2407 // update index collection2413 // update index collection
2408 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)?;
2415
2416 Self::deposit_event(RawEvent::Transfer(collection.id, item_id, sender, new_owner, 1));
24092417
2410 Ok(())2418 Ok(())
2411 }2419 }