--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -2026,24 +2026,38 @@ let collection_id = collection.id; collection.consume_sload()?; + collection.consume_sload()?; + let mut recipient_balance = >::get(collection_id, recipient.as_sub()); let mut balance = >::get(collection_id, owner.as_sub()); - ensure!(balance.value >= value, Error::::TokenValueTooLow); - // Send balance to recipient (updates balanceOf of recipient) - Self::add_fungible_item(collection, recipient, value)?; + recipient_balance.value = recipient_balance + .value + .checked_add(value) + .ok_or(Error::::NumOverflow)?; + balance.value = balance + .value + .checked_sub(value) + .ok_or(Error::::NumOverflow)?; - // update balanceOf of sender + // update balanceOf + collection.consume_sstore()?; collection.consume_sstore()?; - >::insert(collection_id, owner.as_sub(), balance.value - value); + if balance.value != 0 { + >::insert(collection_id, owner.as_sub(), balance.value); + } else { + >::remove(collection_id, owner.as_sub()); + } + >::insert(collection_id, recipient.as_sub(), recipient_balance.value); // Reduce or remove sender collection.consume_sstore()?; - if balance.value == value { + collection.consume_sstore()?; + if balance.value != 0 { + >::insert(collection_id, owner.as_sub(), balance); + } else { >::remove(collection_id, owner.as_sub()); - } else { - balance.value -= value; - >::insert(collection_id, owner.as_sub(), balance); } + >::insert(collection_id, recipient.as_sub(), recipient_balance); collection.log(ERC20Events::Transfer { from: *owner.as_eth(),