Improve NFT locking (#14510)

* Update docs

* Prevent locking of the same NFT twice

* Validate item is not locked on burn

* Cover with tests

* chore
This commit is contained in:
Jegor Sidorenko
2023-07-05 11:17:08 +02:00
committed by GitHub
parent 1bf2504ebf
commit f5776f6897
4 changed files with 40 additions and 2 deletions
@@ -338,12 +338,12 @@ pub mod pallet {
T::PalletId::get().into_account_truncating()
}
/// Transfer the NFT from the account holding that NFT to the pallet's account.
/// Prevent further transferring of NFT.
fn do_lock_nft(nft_collection_id: T::NftCollectionId, nft_id: T::NftId) -> DispatchResult {
T::Nfts::disable_transfer(&nft_collection_id, &nft_id)
}
/// Transfer the NFT to the account returning the tokens.
/// Remove the transfer lock and transfer the NFT to the account returning the tokens.
fn do_unlock_nft(
nft_collection_id: T::NftCollectionId,
nft_id: T::NftId,
@@ -122,6 +122,33 @@ fn fractionalize_should_work() {
beneficiary: account(2),
}));
// owner can't burn an already fractionalized NFT
assert_noop!(
Nfts::burn(RuntimeOrigin::signed(account(1)), nft_collection_id, nft_id),
DispatchError::Module(ModuleError {
index: 4,
error: [12, 0, 0, 0],
message: Some("ItemLocked")
})
);
// can't fractionalize twice
assert_noop!(
NftFractionalization::fractionalize(
RuntimeOrigin::signed(account(1)),
nft_collection_id,
nft_id,
asset_id + 1,
account(2),
fractions,
),
DispatchError::Module(ModuleError {
index: 4,
error: [12, 0, 0, 0],
message: Some("ItemLocked")
})
);
let nft_id = nft_id + 1;
assert_noop!(
NftFractionalization::fractionalize(