Fixes in Assets Pallet (#9059)

* upper bound witness with refund

* simple test

* track approvals

* dont allow approvals when asset is frozen

* destroy returns approval deposit

* update `NonTransfer` proxies

* cargo run --release --features=runtime-benchmarks --manifest-path=bin/node/cli/Cargo.toml -- benchmark --chain=dev --steps=50 --repeat=20 --pallet=pallet_assets --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --output=./frame/assets/src/weights.rs --template=./.maintain/frame-weight-template.hbs

Co-authored-by: Parity Bot <admin@parity.io>
This commit is contained in:
Shawn Tabrizi
2021-06-12 15:59:56 +01:00
committed by GitHub
parent 5dec6e5c81
commit 517fd6149a
4 changed files with 194 additions and 83 deletions
+75 -1
View File
@@ -37,19 +37,47 @@ fn basic_minting_should_work() {
#[test]
fn approval_lifecycle_works() {
new_test_ext().execute_with(|| {
// can't approve non-existent token
assert_noop!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50), Error::<Test>::Unknown);
// so we create it :)
assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
assert_ok!(Assets::mint(Origin::signed(1), 0, 1, 100));
Balances::make_free_balance_be(&1, 1);
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_eq!(Balances::reserved_balance(&1), 1);
assert_ok!(Assets::transfer_approved(Origin::signed(2), 0, 1, 3, 40));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_ok!(Assets::cancel_approval(Origin::signed(1), 0, 2));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 0);
assert_eq!(Assets::balance(0, 1), 60);
assert_eq!(Assets::balance(0, 3), 40);
assert_eq!(Balances::reserved_balance(&1), 0);
});
}
#[test]
fn transfer_approved_all_funds() {
new_test_ext().execute_with(|| {
// can't approve non-existent token
assert_noop!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50), Error::<Test>::Unknown);
// so we create it :)
assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
assert_ok!(Assets::mint(Origin::signed(1), 0, 1, 100));
Balances::make_free_balance_be(&1, 1);
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_eq!(Balances::reserved_balance(&1), 1);
// transfer the full amount, which should trigger auto-cleanup
assert_ok!(Assets::transfer_approved(Origin::signed(2), 0, 1, 3, 50));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 0);
assert_eq!(Assets::balance(0, 1), 50);
assert_eq!(Assets::balance(0, 3), 50);
assert_eq!(Balances::reserved_balance(&1), 0);
});
}
#[test]
fn approval_deposits_work() {
new_test_ext().execute_with(|| {
@@ -102,10 +130,13 @@ fn cancel_approval_works() {
assert_ok!(Assets::mint(Origin::signed(1), 0, 1, 100));
Balances::make_free_balance_be(&1, 1);
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_noop!(Assets::cancel_approval(Origin::signed(1), 1, 2), Error::<Test>::Unknown);
assert_noop!(Assets::cancel_approval(Origin::signed(2), 0, 2), Error::<Test>::Unknown);
assert_noop!(Assets::cancel_approval(Origin::signed(1), 0, 3), Error::<Test>::Unknown);
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_ok!(Assets::cancel_approval(Origin::signed(1), 0, 2));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 0);
assert_noop!(Assets::cancel_approval(Origin::signed(1), 0, 2), Error::<Test>::Unknown);
});
}
@@ -117,12 +148,15 @@ fn force_cancel_approval_works() {
assert_ok!(Assets::mint(Origin::signed(1), 0, 1, 100));
Balances::make_free_balance_be(&1, 1);
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
let e = Error::<Test>::NoPermission;
assert_noop!(Assets::force_cancel_approval(Origin::signed(2), 0, 1, 2), e);
assert_noop!(Assets::force_cancel_approval(Origin::signed(1), 1, 1, 2), Error::<Test>::Unknown);
assert_noop!(Assets::force_cancel_approval(Origin::signed(1), 0, 2, 2), Error::<Test>::Unknown);
assert_noop!(Assets::force_cancel_approval(Origin::signed(1), 0, 1, 3), Error::<Test>::Unknown);
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 1);
assert_ok!(Assets::force_cancel_approval(Origin::signed(1), 0, 1, 2));
assert_eq!(Asset::<Test>::get(0).unwrap().approvals, 0);
assert_noop!(Assets::force_cancel_approval(Origin::signed(1), 0, 1, 2), Error::<Test>::Unknown);
});
}
@@ -180,9 +214,35 @@ fn destroy_with_bad_witness_should_not_work() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&1, 100);
assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
let w = Asset::<Test>::get(0).unwrap().destroy_witness();
let mut w = Asset::<Test>::get(0).unwrap().destroy_witness();
assert_ok!(Assets::mint(Origin::signed(1), 0, 10, 100));
// witness too low
assert_noop!(Assets::destroy(Origin::signed(1), 0, w), Error::<Test>::BadWitness);
// witness too high is okay though
w.accounts += 2;
w.sufficients += 2;
assert_ok!(Assets::destroy(Origin::signed(1), 0, w));
});
}
#[test]
fn destroy_should_refund_approvals() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&1, 100);
assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
assert_ok!(Assets::mint(Origin::signed(1), 0, 10, 100));
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 3, 50));
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 4, 50));
assert_eq!(Balances::reserved_balance(&1), 3);
let w = Asset::<Test>::get(0).unwrap().destroy_witness();
assert_ok!(Assets::destroy(Origin::signed(1), 0, w));
assert_eq!(Balances::reserved_balance(&1), 0);
// all approvals are removed
assert!(Approvals::<Test>::iter().count().is_zero())
});
}
@@ -306,6 +366,20 @@ fn transferring_frozen_asset_should_not_work() {
});
}
#[test]
fn approve_transfer_frozen_asset_should_not_work() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&1, 100);
assert_ok!(Assets::force_create(Origin::root(), 0, 1, true, 1));
assert_ok!(Assets::mint(Origin::signed(1), 0, 1, 100));
assert_eq!(Assets::balance(0, 1), 100);
assert_ok!(Assets::freeze_asset(Origin::signed(1), 0));
assert_noop!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50), Error::<Test>::Frozen);
assert_ok!(Assets::thaw_asset(Origin::signed(1), 0));
assert_ok!(Assets::approve_transfer(Origin::signed(1), 0, 2, 50));
});
}
#[test]
fn origin_guards_should_work() {
new_test_ext().execute_with(|| {