mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 04:37:57 +00:00
f6b9e056ae
* Disallow admin to transfer or burn items he doesn't own * lock_collection should be accessible by collection's owner only * Allow admin to access lock_item_properties() * Fix do_lock_item_properties * Move update_mint_settings() to Issuer * Rename check_owner to check_origin * Typo * Make admin to be in charge of managing the metadata * Make admin the main attributes manager * offchain mint should be signed by Issuer * Remove the special case when the Issuer calls the mint() function * Rework burn and destroy methods * Return back item_metadatas * Don't repatriate the deposit on transfer * A bit more tests * One more test * Add migration * Chore * Clippy * Rename to owned_item * Address comments * Replace .filter_map with .find_map * Improve version validation in pre_upgrade() * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_nfts --------- Co-authored-by: parity-processbot <>
118 lines
3.7 KiB
Rust
118 lines
3.7 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
use crate::*;
|
|
use frame_support::pallet_prelude::*;
|
|
|
|
impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
|
pub fn do_create_collection(
|
|
collection: T::CollectionId,
|
|
owner: T::AccountId,
|
|
admin: T::AccountId,
|
|
config: CollectionConfigFor<T, I>,
|
|
deposit: DepositBalanceOf<T, I>,
|
|
event: Event<T, I>,
|
|
) -> DispatchResult {
|
|
ensure!(!Collection::<T, I>::contains_key(collection), Error::<T, I>::CollectionIdInUse);
|
|
|
|
T::Currency::reserve(&owner, deposit)?;
|
|
|
|
Collection::<T, I>::insert(
|
|
collection,
|
|
CollectionDetails {
|
|
owner: owner.clone(),
|
|
owner_deposit: deposit,
|
|
items: 0,
|
|
item_metadatas: 0,
|
|
item_configs: 0,
|
|
attributes: 0,
|
|
},
|
|
);
|
|
CollectionRoleOf::<T, I>::insert(
|
|
collection,
|
|
admin,
|
|
CollectionRoles(
|
|
CollectionRole::Admin | CollectionRole::Freezer | CollectionRole::Issuer,
|
|
),
|
|
);
|
|
|
|
let next_id = collection.increment();
|
|
|
|
CollectionConfigOf::<T, I>::insert(&collection, config);
|
|
CollectionAccount::<T, I>::insert(&owner, &collection, ());
|
|
NextCollectionId::<T, I>::set(Some(next_id));
|
|
|
|
Self::deposit_event(Event::NextCollectionIdIncremented { next_id });
|
|
Self::deposit_event(event);
|
|
Ok(())
|
|
}
|
|
|
|
pub fn do_destroy_collection(
|
|
collection: T::CollectionId,
|
|
witness: DestroyWitness,
|
|
maybe_check_owner: Option<T::AccountId>,
|
|
) -> Result<DestroyWitness, DispatchError> {
|
|
Collection::<T, I>::try_mutate_exists(collection, |maybe_details| {
|
|
let collection_details =
|
|
maybe_details.take().ok_or(Error::<T, I>::UnknownCollection)?;
|
|
if let Some(check_owner) = maybe_check_owner {
|
|
ensure!(collection_details.owner == check_owner, Error::<T, I>::NoPermission);
|
|
}
|
|
ensure!(collection_details.items == 0, Error::<T, I>::CollectionNotEmpty);
|
|
ensure!(collection_details.attributes == witness.attributes, Error::<T, I>::BadWitness);
|
|
ensure!(
|
|
collection_details.item_metadatas == witness.item_metadatas,
|
|
Error::<T, I>::BadWitness
|
|
);
|
|
ensure!(
|
|
collection_details.item_configs == witness.item_configs,
|
|
Error::<T, I>::BadWitness
|
|
);
|
|
|
|
for (_, metadata) in ItemMetadataOf::<T, I>::drain_prefix(&collection) {
|
|
if let Some(depositor) = metadata.deposit.account {
|
|
T::Currency::unreserve(&depositor, metadata.deposit.amount);
|
|
}
|
|
}
|
|
|
|
CollectionMetadataOf::<T, I>::remove(&collection);
|
|
Self::clear_roles(&collection)?;
|
|
|
|
for (_, (_, deposit)) in Attribute::<T, I>::drain_prefix((&collection,)) {
|
|
if !deposit.amount.is_zero() {
|
|
if let Some(account) = deposit.account {
|
|
T::Currency::unreserve(&account, deposit.amount);
|
|
}
|
|
}
|
|
}
|
|
|
|
CollectionAccount::<T, I>::remove(&collection_details.owner, &collection);
|
|
T::Currency::unreserve(&collection_details.owner, collection_details.owner_deposit);
|
|
CollectionConfigOf::<T, I>::remove(&collection);
|
|
let _ = ItemConfigOf::<T, I>::clear_prefix(&collection, witness.item_configs, None);
|
|
|
|
Self::deposit_event(Event::Destroyed { collection });
|
|
|
|
Ok(DestroyWitness {
|
|
item_metadatas: collection_details.item_metadatas,
|
|
item_configs: collection_details.item_configs,
|
|
attributes: collection_details.attributes,
|
|
})
|
|
})
|
|
}
|
|
}
|