diff --git a/nft/src/lib.rs b/nft/src/lib.rs index 06bdf6b986fc517db74ed75efe71b9d55a04d8b4..da8804fbda4e0ed30dd8911ac269ba85b3ed7c06 100644 --- a/nft/src/lib.rs +++ b/nft/src/lib.rs @@ -141,12 +141,14 @@ impl<T: Trait> Module<T> { /// Transfer NFT(non fungible token) from `from` account to `to` account pub fn transfer(from: &T::AccountId, to: &T::AccountId, token: (T::ClassId, T::TokenId)) -> DispatchResult { - if from == to { - return Ok(()); - } - TokensByOwner::<T>::try_mutate_exists(from, token, |token_by_owner| -> DispatchResult { - ensure!(token_by_owner.take().is_some(), Error::<T>::NoPermission); + ensure!(token_by_owner.is_some(), Error::<T>::NoPermission); + if from == to { + // no change needed + return Ok(()); + } + + *token_by_owner = None; TokensByOwner::<T>::insert(to, token, ()); Tokens::<T>::try_mutate_exists(token.0, token.1, |token_info| -> DispatchResult { @@ -218,4 +220,8 @@ impl<T: Trait> Module<T> { Ok(()) }) } + + pub fn is_owner(account: &T::AccountId, token: (T::ClassId, T::TokenId)) -> bool { + TokensByOwner::<T>::contains_key(account, token) + } } diff --git a/nft/src/tests.rs b/nft/src/tests.rs index 81187b78b750808bca3e998a8d4404effb36a8f7..a2419211c7b483e2b93782926a18b5cdc09b9692 100644 --- a/nft/src/tests.rs +++ b/nft/src/tests.rs @@ -62,6 +62,7 @@ fn transfer_should_work() { assert_ok!(NonFungibleTokenModule::transfer(&BOB, &BOB, (CLASS_ID, TOKEN_ID))); assert_ok!(NonFungibleTokenModule::transfer(&BOB, &ALICE, (CLASS_ID, TOKEN_ID))); assert_ok!(NonFungibleTokenModule::transfer(&ALICE, &BOB, (CLASS_ID, TOKEN_ID))); + assert!(NonFungibleTokenModule::is_owner(&BOB, (CLASS_ID, TOKEN_ID))); }); } @@ -82,6 +83,10 @@ fn transfer_should_fail() { NonFungibleTokenModule::mint(&BOB, CLASS_ID_NOT_EXIST, vec![1], ()), Error::<Runtime>::ClassNotFound ); + assert_noop!( + NonFungibleTokenModule::transfer(&ALICE, &ALICE, (CLASS_ID, TOKEN_ID)), + Error::<Runtime>::NoPermission + ); }); }