mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-14 20:15:44 +00:00
[fix lint warnings: NFTs pallet] fix clippy::missing_docs_in_private_items warnings (#14610)
* add docs for impl_codec_bitflags * add missing docs for type aliases * add docs to transfer module * add docs for settings module * add docs to roles module * add docs to metadata module * add docs to migration module * add missing docs to feature library * methods not functions * add docs to lock module * add docs to attributes module * add docs to create_delete_item module * add docs for create_delete_collection module * add docs to buy_sell module * add missing doc for buy_sell module * add docs to atomic_swap module * add docs to atomic_swap module * add docs for approvals module * run cargo fmt * Fix issues with multi-line comments * Apply suggestions from code review Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> * update from review * fmt * update from review * remove bitflag example * ".git/.scripts/commands/fmt/fmt.sh" * Apply suggestions from code review Co-authored-by: Squirrel <gilescope@gmail.com> * add note about pallet features --------- Co-authored-by: Jegor Sidorenko <jegor@parity.io> Co-authored-by: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Co-authored-by: parity-processbot <> Co-authored-by: Squirrel <gilescope@gmail.com>
This commit is contained in:
@@ -15,11 +15,24 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
//! This module contains helper methods to perform the transfer functionalities
|
||||
//! of the NFTs pallet.
|
||||
|
||||
use crate::*;
|
||||
use frame_support::pallet_prelude::*;
|
||||
|
||||
impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
/// Performs the transfer action for the given `collection`, `item`, `dest`, and `event`.
|
||||
/// Transfer an NFT to the specified destination account.
|
||||
///
|
||||
/// - `collection`: The ID of the collection to which the NFT belongs.
|
||||
/// - `item`: The ID of the NFT to transfer.
|
||||
/// - `dest`: The destination account to which the NFT will be transferred.
|
||||
/// - `with_details`: A closure that provides access to the collection and item details,
|
||||
/// allowing customization of the transfer process.
|
||||
///
|
||||
/// This function performs the actual transfer of an NFT to the destination account.
|
||||
/// It checks various conditions like item lock status and transferability settings
|
||||
/// for the collection and item before transferring the NFT.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
@@ -39,45 +52,57 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
&mut ItemDetailsFor<T, I>,
|
||||
) -> DispatchResult,
|
||||
) -> DispatchResult {
|
||||
// Retrieve collection details.
|
||||
let collection_details =
|
||||
Collection::<T, I>::get(&collection).ok_or(Error::<T, I>::UnknownCollection)?;
|
||||
|
||||
// Ensure the item is not locked.
|
||||
ensure!(!T::Locker::is_locked(collection, item), Error::<T, I>::ItemLocked);
|
||||
|
||||
// Ensure the item is not transfer disabled on the system level attribute.
|
||||
ensure!(
|
||||
!Self::has_system_attribute(&collection, &item, PalletAttributes::TransferDisabled)?,
|
||||
Error::<T, I>::ItemLocked
|
||||
);
|
||||
|
||||
// Retrieve collection config and check if items are transferable.
|
||||
let collection_config = Self::get_collection_config(&collection)?;
|
||||
ensure!(
|
||||
collection_config.is_setting_enabled(CollectionSetting::TransferableItems),
|
||||
Error::<T, I>::ItemsNonTransferable
|
||||
);
|
||||
|
||||
// Retrieve item config and check if the item is transferable.
|
||||
let item_config = Self::get_item_config(&collection, &item)?;
|
||||
ensure!(
|
||||
item_config.is_setting_enabled(ItemSetting::Transferable),
|
||||
Error::<T, I>::ItemLocked
|
||||
);
|
||||
|
||||
// Retrieve the item details.
|
||||
let mut details =
|
||||
Item::<T, I>::get(&collection, &item).ok_or(Error::<T, I>::UnknownItem)?;
|
||||
|
||||
// Perform the transfer with custom details using the provided closure.
|
||||
with_details(&collection_details, &mut details)?;
|
||||
|
||||
// Update account ownership information.
|
||||
Account::<T, I>::remove((&details.owner, &collection, &item));
|
||||
Account::<T, I>::insert((&dest, &collection, &item), ());
|
||||
let origin = details.owner;
|
||||
details.owner = dest;
|
||||
|
||||
// The approved accounts have to be reset to None, because otherwise pre-approve attack
|
||||
// The approved accounts have to be reset to `None`, because otherwise pre-approve attack
|
||||
// would be possible, where the owner can approve their second account before making the
|
||||
// transaction and then claiming the item back.
|
||||
details.approvals.clear();
|
||||
|
||||
// Update item details.
|
||||
Item::<T, I>::insert(&collection, &item, &details);
|
||||
ItemPriceOf::<T, I>::remove(&collection, &item);
|
||||
PendingSwapOf::<T, I>::remove(&collection, &item);
|
||||
|
||||
// Emit `Transferred` event.
|
||||
Self::deposit_event(Event::Transferred {
|
||||
collection,
|
||||
item,
|
||||
@@ -87,16 +112,28 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Transfer ownership of a collection to another account.
|
||||
///
|
||||
/// - `origin`: The account requesting the transfer.
|
||||
/// - `collection`: The ID of the collection to transfer ownership.
|
||||
/// - `owner`: The new account that will become the owner of the collection.
|
||||
///
|
||||
/// This function transfers the ownership of a collection to the specified account.
|
||||
/// It performs checks to ensure that the `origin` is the current owner and that the
|
||||
/// new owner is an acceptable account based on the collection's acceptance settings.
|
||||
pub(crate) fn do_transfer_ownership(
|
||||
origin: T::AccountId,
|
||||
collection: T::CollectionId,
|
||||
owner: T::AccountId,
|
||||
) -> DispatchResult {
|
||||
// Check if the new owner is acceptable based on the collection's acceptance settings.
|
||||
let acceptable_collection = OwnershipAcceptance::<T, I>::get(&owner);
|
||||
ensure!(acceptable_collection.as_ref() == Some(&collection), Error::<T, I>::Unaccepted);
|
||||
|
||||
// Try to retrieve and mutate the collection details.
|
||||
Collection::<T, I>::try_mutate(collection, |maybe_details| {
|
||||
let details = maybe_details.as_mut().ok_or(Error::<T, I>::UnknownCollection)?;
|
||||
// Check if the `origin` is the current owner of the collection.
|
||||
ensure!(origin == details.owner, Error::<T, I>::NoPermission);
|
||||
if details.owner == owner {
|
||||
return Ok(())
|
||||
@@ -109,17 +146,28 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
details.owner_deposit,
|
||||
Reserved,
|
||||
)?;
|
||||
|
||||
// Update account ownership information.
|
||||
CollectionAccount::<T, I>::remove(&details.owner, &collection);
|
||||
CollectionAccount::<T, I>::insert(&owner, &collection, ());
|
||||
|
||||
details.owner = owner.clone();
|
||||
OwnershipAcceptance::<T, I>::remove(&owner);
|
||||
|
||||
// Emit `OwnerChanged` event.
|
||||
Self::deposit_event(Event::OwnerChanged { collection, new_owner: owner });
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
/// Set or unset the ownership acceptance for an account regarding a specific collection.
|
||||
///
|
||||
/// - `who`: The account for which to set or unset the ownership acceptance.
|
||||
/// - `maybe_collection`: An optional collection ID to set the ownership acceptance.
|
||||
///
|
||||
/// If `maybe_collection` is `Some(collection)`, then the account `who` will accept
|
||||
/// ownership transfers for the specified collection. If `maybe_collection` is `None`,
|
||||
/// then the account `who` will unset the ownership acceptance, effectively refusing
|
||||
/// ownership transfers for any collection.
|
||||
pub(crate) fn do_set_accept_ownership(
|
||||
who: T::AccountId,
|
||||
maybe_collection: Option<T::CollectionId>,
|
||||
@@ -139,14 +187,25 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
} else {
|
||||
OwnershipAcceptance::<T, I>::remove(&who);
|
||||
}
|
||||
|
||||
// Emit `OwnershipAcceptanceChanged` event.
|
||||
Self::deposit_event(Event::OwnershipAcceptanceChanged { who, maybe_collection });
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Forcefully change the owner of a collection.
|
||||
///
|
||||
/// - `collection`: The ID of the collection to change ownership.
|
||||
/// - `owner`: The new account that will become the owner of the collection.
|
||||
///
|
||||
/// This function allows for changing the ownership of a collection without any checks.
|
||||
/// It moves the deposit to the new owner, updates the collection's owner, and emits
|
||||
/// an `OwnerChanged` event.
|
||||
pub(crate) fn do_force_collection_owner(
|
||||
collection: T::CollectionId,
|
||||
owner: T::AccountId,
|
||||
) -> DispatchResult {
|
||||
// Try to retrieve and mutate the collection details.
|
||||
Collection::<T, I>::try_mutate(collection, |maybe_details| {
|
||||
let details = maybe_details.as_mut().ok_or(Error::<T, I>::UnknownCollection)?;
|
||||
if details.owner == owner {
|
||||
@@ -161,10 +220,12 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
Reserved,
|
||||
)?;
|
||||
|
||||
// Update collection accounts and set the new owner.
|
||||
CollectionAccount::<T, I>::remove(&details.owner, &collection);
|
||||
CollectionAccount::<T, I>::insert(&owner, &collection, ());
|
||||
details.owner = owner.clone();
|
||||
|
||||
// Emit `OwnerChanged` event.
|
||||
Self::deposit_event(Event::OwnerChanged { collection, new_owner: owner });
|
||||
Ok(())
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user