[NFTs] Fix consumers issue (#2653)

When we call the `set_accept_ownership` method, we increase the number
of account consumers, but then we don't decrease it on collection
transfer, which leads to the wrong consumers number an account has.
This commit is contained in:
Jegor Sidorenko
2023-12-19 15:23:58 +02:00
committed by GitHub
parent 0b74812ce8
commit 166ae5ae12
5 changed files with 33 additions and 21 deletions
+13 -10
View File
@@ -856,34 +856,37 @@ pub mod pallet {
pub fn transfer_ownership(
origin: OriginFor<T>,
collection: T::CollectionId,
owner: AccountIdLookupOf<T>,
new_owner: AccountIdLookupOf<T>,
) -> DispatchResult {
let origin = ensure_signed(origin)?;
let owner = T::Lookup::lookup(owner)?;
let new_owner = T::Lookup::lookup(new_owner)?;
let acceptable_collection = OwnershipAcceptance::<T, I>::get(&owner);
let acceptable_collection = OwnershipAcceptance::<T, I>::get(&new_owner);
ensure!(acceptable_collection.as_ref() == Some(&collection), Error::<T, I>::Unaccepted);
Collection::<T, I>::try_mutate(collection.clone(), |maybe_details| {
let details = maybe_details.as_mut().ok_or(Error::<T, I>::UnknownCollection)?;
ensure!(origin == details.owner, Error::<T, I>::NoPermission);
if details.owner == owner {
if details.owner == new_owner {
return Ok(())
}
// Move the deposit to the new owner.
T::Currency::repatriate_reserved(
&details.owner,
&owner,
&new_owner,
details.total_deposit,
Reserved,
)?;
CollectionAccount::<T, I>::remove(&details.owner, &collection);
CollectionAccount::<T, I>::insert(&owner, &collection, ());
details.owner = owner.clone();
OwnershipAcceptance::<T, I>::remove(&owner);
Self::deposit_event(Event::OwnerChanged { collection, new_owner: owner });
CollectionAccount::<T, I>::remove(&details.owner, &collection);
CollectionAccount::<T, I>::insert(&new_owner, &collection, ());
details.owner = new_owner.clone();
OwnershipAcceptance::<T, I>::remove(&new_owner);
frame_system::Pallet::<T>::dec_consumers(&new_owner);
Self::deposit_event(Event::OwnerChanged { collection, new_owner });
Ok(())
})
}
+3
View File
@@ -254,8 +254,11 @@ fn transfer_owner_should_work() {
Uniques::transfer_ownership(RuntimeOrigin::signed(1), 0, 2),
Error::<Test>::Unaccepted
);
assert_eq!(System::consumers(&2), 0);
assert_ok!(Uniques::set_accept_ownership(RuntimeOrigin::signed(2), Some(0)));
assert_eq!(System::consumers(&2), 1);
assert_ok!(Uniques::transfer_ownership(RuntimeOrigin::signed(1), 0, 2));
assert_eq!(System::consumers(&2), 1);
assert_eq!(collections(), vec![(2, 0)]);
assert_eq!(Balances::total_balance(&1), 98);