Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Nfts: Multiple approvals #12178

Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bf7d59b
multiple approvals
Szegoo Sep 3, 2022
cf08222
clear
Szegoo Sep 3, 2022
b296ba3
tests & clean up
Szegoo Sep 3, 2022
a8c71d4
fix in logic & fmt
Szegoo Sep 3, 2022
3cfe0cc
fix benchmarks
Szegoo Sep 3, 2022
7a8391a
deadline
Szegoo Sep 3, 2022
21d5b81
test deadline
Szegoo Sep 3, 2022
62e6371
current_block + deadline
Szegoo Sep 4, 2022
8067c3b
update ApprovedTransfer event
Szegoo Sep 4, 2022
d4d1fe2
benchmark
Szegoo Sep 5, 2022
2d06e76
docs
Szegoo Sep 5, 2022
111adbb
Update frame/nfts/src/lib.rs
Szegoo Sep 6, 2022
3e7101d
fmt fix
Szegoo Sep 6, 2022
2247ee5
Update frame/nfts/src/lib.rs
Szegoo Sep 7, 2022
0a30732
update tests
Szegoo Sep 7, 2022
7bf0260
anyone can cancel
Szegoo Sep 8, 2022
b7a50f3
Update frame/nfts/src/tests.rs
Szegoo Sep 8, 2022
9c57d52
fmt
Szegoo Sep 8, 2022
a8371b3
fix logic
Szegoo Sep 8, 2022
b552b2e
unnecessary line
Szegoo Sep 8, 2022
00a271c
".git/.scripts/bench-bot.sh" pallet dev pallet_nfts
Sep 8, 2022
2a4775c
Update frame/nfts/src/lib.rs
jsidorenko Sep 8, 2022
bf7d701
Merge remote-tracking branch 'js/uniques-v2-main-branch/js/uniques-v2…
Szegoo Sep 8, 2022
5c8d01a
Update lib.rs
Szegoo Sep 8, 2022
0629062
fmt
Szegoo Sep 8, 2022
e8eec8b
Update frame/nfts/src/lib.rs
Szegoo Sep 9, 2022
5ec3892
Update frame/nfts/src/lib.rs
Szegoo Sep 9, 2022
f496fa7
fmt
Szegoo Sep 9, 2022
5697cbb
Update frame/nfts/src/lib.rs
Szegoo Sep 9, 2022
5be3e14
suggestion
Szegoo Sep 9, 2022
f8319df
new line
Szegoo Sep 9, 2022
74c439d
Merge branch 'js/uniques-v2-main-branch' into uniques-multiple-approvals
jsidorenko Sep 9, 2022
550f934
".git/.scripts/bench-bot.sh" pallet dev pallet_nfts
Sep 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions bin/node/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1453,6 +1453,7 @@ parameter_types! {
pub const ItemDeposit: Balance = 1 * DOLLARS;
pub const KeyLimit: u32 = 32;
pub const ValueLimit: u32 = 256;
pub const ApprovalsLimit: u32 = 20;
}

impl pallet_uniques::Config for Runtime {
Expand Down Expand Up @@ -1490,6 +1491,7 @@ impl pallet_nfts::Config for Runtime {
type StringLimit = StringLimit;
type KeyLimit = KeyLimit;
type ValueLimit = ValueLimit;
type ApprovalsLimit = ApprovalsLimit;
type WeightInfo = pallet_nfts::weights::SubstrateWeight<Runtime>;
#[cfg(feature = "runtime-benchmarks")]
type Helper = ();
Expand Down
23 changes: 19 additions & 4 deletions frame/nfts/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -368,9 +368,10 @@ benchmarks_instance_pallet! {
let (item, ..) = mint_item::<T, I>(0);
let delegate: T::AccountId = account("delegate", 0, SEED);
let delegate_lookup = T::Lookup::unlookup(delegate.clone());
}: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup)
let deadline = T::BlockNumber::max_value();
}: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup, Some(deadline))
verify {
assert_last_event::<T, I>(Event::ApprovedTransfer { collection, item, owner: caller, delegate }.into());
assert_last_event::<T, I>(Event::ApprovedTransfer { collection, item, owner: caller, delegate, deadline: Some(deadline) }.into());
}

cancel_approval {
Expand All @@ -379,12 +380,26 @@ benchmarks_instance_pallet! {
let delegate: T::AccountId = account("delegate", 0, SEED);
let delegate_lookup = T::Lookup::unlookup(delegate.clone());
let origin = SystemOrigin::Signed(caller.clone()).into();
Nfts::<T, I>::approve_transfer(origin, collection, item, delegate_lookup.clone())?;
}: _(SystemOrigin::Signed(caller.clone()), collection, item, Some(delegate_lookup))
let deadline = T::BlockNumber::max_value();
Nfts::<T, I>::approve_transfer(origin, collection, item, delegate_lookup.clone(), Some(deadline))?;
}: _(SystemOrigin::Signed(caller.clone()), collection, item, delegate_lookup)
verify {
assert_last_event::<T, I>(Event::ApprovalCancelled { collection, item, owner: caller, delegate }.into());
}

clear_all_transfer_approvals {
let (collection, caller, _) = create_collection::<T, I>();
let (item, ..) = mint_item::<T, I>(0);
let delegate: T::AccountId = account("delegate", 0, SEED);
let delegate_lookup = T::Lookup::unlookup(delegate.clone());
let origin = SystemOrigin::Signed(caller.clone()).into();
let deadline = T::BlockNumber::max_value();
Nfts::<T, I>::approve_transfer(origin, collection, item, delegate_lookup.clone(), Some(deadline))?;
}: _(SystemOrigin::Signed(caller.clone()), collection, item)
verify {
assert_last_event::<T, I>(Event::AllApprovalsCancelled {collection, item, owner: caller}.into());
}

set_accept_ownership {
let caller: T::AccountId = whitelisted_caller();
T::Currency::make_free_balance_be(&caller, DepositBalanceOf::<T, I>::max_value());
Expand Down
13 changes: 12 additions & 1 deletion frame/nfts/src/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {
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
// would be possible, where the owner can approve his second account before making the
// transaction and then claiming the item back.
details.approvals.clear();

Item::<T, I>::insert(&collection, &item, &details);
ItemPriceOf::<T, I>::remove(&collection, &item);

Expand Down Expand Up @@ -168,7 +174,12 @@ impl<T: Config<I>, I: 'static> Pallet<T, I> {

let owner = owner.clone();
Account::<T, I>::insert((&owner, &collection, &item), ());
let details = ItemDetails { owner, approved: None, is_frozen: false, deposit };
let details = ItemDetails {
owner,
approvals: ApprovalsOf::<T, I>::default(),
is_frozen: false,
deposit,
};
Item::<T, I>::insert(&collection, &item, details);
Ok(())
},
Expand Down
Loading