mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 07:01:05 +00:00
Deprecate Currency; introduce holds and freezing into fungible traits (#12951)
* First reworking of fungibles API * New API and docs * More fungible::* API improvements * New ref-counting logic for old API * Missing files * Fixes * Use the new transfer logic * Use fungibles for the dispatchables * Use shelve/restore names * Locking works with total balance. * repotting and removal * Separate Holds from Reserves * Introduce freezes * Missing files * Tests for freezing * Fix hold+freeze combo * More tests * Fee-free dispatchable for upgrading accounts * Benchmarks and a few fixes * Another test * Docs and refactor to avoid blanket impls * Repot * Fit out ItemOf fully * Add events to Balanced traits * Introduced events into Hold traits * Fix Assets pallet tests * Assets benchmarks pass * Missing files and fixes * Fixes * Fixes * Benchmarks fixes * Fix balance benchmarks * Formatting * Expose fungible sub modules * Move NIS to fungible API * Fix broken impl and add test * Fix tests * API for `transfer_and_hold` * Use composite APIs * Formatting * Upgraded event * Fixes * Fixes * Fixes * Fixes * Repot tests and some fixed * Fix some bits * Fix dust tests * Rename `set_balance` - `Balances::set_balance` becomes `Balances::force_set_balance` - `Unbalanced::set_balance` becomes `Unbalances::write_balance` * becomes * Move dust handling to fungibles API * Formatting * Fixes and more refactoring * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Fixes * Use reducible_balance for better correctness on fees * Reducing hold to zero should remove entry. * Add test * Docs * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungibles/regular.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> * Docs * Docs * Docs * Fix NIS benchmarks * Doc comment * Remove post_mutation * Fix some tests * Fix some grumbles * Enumify bool args to fungible(s) functions * Fix up assets and balances * Formatting * Fix contracts * Fix tests & benchmarks build * Typify minted boolean arg * Typify on_hold boolean arg; renames * Fix numerous tests * Fix dependency issue * Privatize dangerous API mutate_account * Fix contracts (@alext - please check this commit) * Remove println * Fix tests for contracts * Fix broken rename * Fix broken rename * Fix broken rename * Docs * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * remove from_ref_time * Update frame/executive/src/lib.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/executive/src/lib.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Reenable test * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/currency.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/lottery/src/tests.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/mod.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/freeze.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungible/regular.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Update frame/support/src/traits/tokens/fungibles/hold.rs Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> * Rename UnwantedRemoval to UnwantedAccountRemoval * Docs * Formatting * Update frame/balances/src/lib.rs Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> * Update primitives/runtime/src/lib.rs Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> * handle_raw_dust oes nothing * Formatting * Fixes * Grumble * Fixes * Add test * Add test * Tests for reducible_balance * Fixes * Fix Salary * Fixes * Disable broken test * Disable nicely * Fixes * Fixes * Fixes * Rename some events * Fix nomination pools breakage * Add compatibility stub for transfer tx * Reinstate a safely compatible version of Balances set_balance * Fixes * Grumble * Update frame/nis/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * ".git/.scripts/commands/bench/bench.sh" pallet dev pallet_balances * disable flakey tests * Update frame/balances/src/lib.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Grumbles * Grumble --------- Co-authored-by: Muharem Ismailov <ismailov.m.h@gmail.com> Co-authored-by: Alexander Theißen <alex.theissen@me.com> Co-authored-by: Anthony Alaribe <anthonyalaribe@gmail.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: command-bot <>
This commit is contained in:
@@ -89,6 +89,10 @@ impl pallet_balances::Config for Test {
|
||||
type ExistentialDeposit = ConstU64<1>;
|
||||
type AccountStore = System;
|
||||
type WeightInfo = ();
|
||||
type FreezeIdentifier = ();
|
||||
type MaxFreezes = ();
|
||||
type HoldIdentifier = ();
|
||||
type MaxHolds = ();
|
||||
}
|
||||
|
||||
parameter_types! {
|
||||
|
||||
@@ -23,8 +23,7 @@ use mock::{
|
||||
new_test_ext, run_to_block, Balances, BalancesCall, Lottery, RuntimeCall, RuntimeOrigin,
|
||||
SystemCall, Test,
|
||||
};
|
||||
use pallet_balances::Error as BalancesError;
|
||||
use sp_runtime::traits::BadOrigin;
|
||||
use sp_runtime::{traits::BadOrigin, TokenError};
|
||||
|
||||
#[test]
|
||||
fn initial_state() {
|
||||
@@ -45,7 +44,7 @@ fn basic_end_to_end_works() {
|
||||
let delay = 5;
|
||||
let calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
];
|
||||
|
||||
// Set calls for the lottery
|
||||
@@ -56,7 +55,10 @@ fn basic_end_to_end_works() {
|
||||
assert!(crate::Lottery::<Test>::get().is_some());
|
||||
|
||||
assert_eq!(Balances::free_balance(&1), 100);
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 20 }));
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 2,
|
||||
value: 20,
|
||||
}));
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(1), call.clone()));
|
||||
// 20 from the transfer, 10 from buying a ticket
|
||||
assert_eq!(Balances::free_balance(&1), 100 - 20 - 10);
|
||||
@@ -129,7 +131,7 @@ fn set_calls_works() {
|
||||
|
||||
let calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
];
|
||||
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls));
|
||||
@@ -137,7 +139,7 @@ fn set_calls_works() {
|
||||
|
||||
let too_many_calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
RuntimeCall::System(SystemCall::remark { remark: vec![] }),
|
||||
];
|
||||
|
||||
@@ -157,7 +159,7 @@ fn call_to_indices_works() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
];
|
||||
let indices = Lottery::calls_to_indices(&calls).unwrap().into_inner();
|
||||
// Only comparing the length since it is otherwise dependant on the API
|
||||
@@ -166,7 +168,7 @@ fn call_to_indices_works() {
|
||||
|
||||
let too_many_calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
RuntimeCall::System(SystemCall::remark { remark: vec![] }),
|
||||
];
|
||||
assert_noop!(Lottery::calls_to_indices(&too_many_calls), Error::<Test>::TooManyCalls);
|
||||
@@ -203,7 +205,10 @@ fn buy_ticket_works_as_simple_passthrough() {
|
||||
// as a simple passthrough to the real call.
|
||||
new_test_ext().execute_with(|| {
|
||||
// No lottery set up
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 20 }));
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 2,
|
||||
value: 20,
|
||||
}));
|
||||
// This is just a basic transfer then
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(1), call.clone()));
|
||||
assert_eq!(Balances::free_balance(&1), 100 - 20);
|
||||
@@ -212,7 +217,7 @@ fn buy_ticket_works_as_simple_passthrough() {
|
||||
// Lottery is set up, but too expensive to enter, so `do_buy_ticket` fails.
|
||||
let calls = vec![
|
||||
RuntimeCall::Balances(BalancesCall::force_transfer { source: 0, dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls));
|
||||
|
||||
@@ -223,11 +228,13 @@ fn buy_ticket_works_as_simple_passthrough() {
|
||||
assert_eq!(TicketsCount::<Test>::get(), 0);
|
||||
|
||||
// If call would fail, the whole thing still fails the same
|
||||
let fail_call =
|
||||
Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 1000 }));
|
||||
let fail_call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 2,
|
||||
value: 1000,
|
||||
}));
|
||||
assert_noop!(
|
||||
Lottery::buy_ticket(RuntimeOrigin::signed(1), fail_call),
|
||||
BalancesError::<Test, _>::InsufficientBalance,
|
||||
ArithmeticError::Underflow,
|
||||
);
|
||||
|
||||
let bad_origin_call = Box::new(RuntimeCall::Balances(BalancesCall::force_transfer {
|
||||
@@ -243,8 +250,10 @@ fn buy_ticket_works_as_simple_passthrough() {
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(2), remark_call));
|
||||
assert_eq!(TicketsCount::<Test>::get(), 0);
|
||||
|
||||
let successful_call =
|
||||
Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 1 }));
|
||||
let successful_call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 2,
|
||||
value: 1,
|
||||
}));
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(2), successful_call));
|
||||
assert_eq!(TicketsCount::<Test>::get(), 1);
|
||||
});
|
||||
@@ -256,12 +265,15 @@ fn buy_ticket_works() {
|
||||
// Set calls for the lottery.
|
||||
let calls = vec![
|
||||
RuntimeCall::System(SystemCall::remark { remark: vec![] }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 }),
|
||||
RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 }),
|
||||
];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls));
|
||||
|
||||
// Can't buy ticket before start
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 1 }));
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 2,
|
||||
value: 1,
|
||||
}));
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(1), call.clone()));
|
||||
assert_eq!(TicketsCount::<Test>::get(), 0);
|
||||
|
||||
@@ -274,7 +286,10 @@ fn buy_ticket_works() {
|
||||
assert_eq!(TicketsCount::<Test>::get(), 1);
|
||||
|
||||
// Can't buy another of the same ticket (even if call is slightly changed)
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer { dest: 3, value: 30 }));
|
||||
let call = Box::new(RuntimeCall::Balances(BalancesCall::transfer_allow_death {
|
||||
dest: 3,
|
||||
value: 30,
|
||||
}));
|
||||
assert_ok!(Lottery::buy_ticket(RuntimeOrigin::signed(1), call));
|
||||
assert_eq!(TicketsCount::<Test>::get(), 1);
|
||||
|
||||
@@ -302,7 +317,8 @@ fn buy_ticket_works() {
|
||||
#[test]
|
||||
fn do_buy_ticket_already_participating() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 1, 10, 10, false));
|
||||
|
||||
@@ -317,7 +333,8 @@ fn do_buy_ticket_already_participating() {
|
||||
#[test]
|
||||
fn buy_ticket_already_participating() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 1, 10, 10, false));
|
||||
|
||||
@@ -337,7 +354,8 @@ fn buy_ticket_already_participating() {
|
||||
#[test]
|
||||
fn buy_ticket_insufficient_balance() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
// Price set to 100.
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 100, 10, 10, false));
|
||||
@@ -352,16 +370,14 @@ fn buy_ticket_insufficient_balance() {
|
||||
#[test]
|
||||
fn do_buy_ticket_insufficient_balance() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
// Price set to 101.
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 101, 10, 10, false));
|
||||
|
||||
// Buying fails with InsufficientBalance.
|
||||
assert_noop!(
|
||||
Lottery::do_buy_ticket(&1, &calls[0]),
|
||||
BalancesError::<Test, _>::InsufficientBalance
|
||||
);
|
||||
assert_noop!(Lottery::do_buy_ticket(&1, &calls[0]), TokenError::FundsUnavailable,);
|
||||
assert!(TicketsCount::<Test>::get().is_zero());
|
||||
});
|
||||
}
|
||||
@@ -369,13 +385,13 @@ fn do_buy_ticket_insufficient_balance() {
|
||||
#[test]
|
||||
fn do_buy_ticket_keep_alive() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
// Price set to 100.
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 100, 10, 10, false));
|
||||
|
||||
// Buying fails with KeepAlive.
|
||||
assert_noop!(Lottery::do_buy_ticket(&1, &calls[0]), BalancesError::<Test, _>::KeepAlive);
|
||||
assert_noop!(Lottery::do_buy_ticket(&1, &calls[0]), TokenError::NotExpendable);
|
||||
assert!(TicketsCount::<Test>::get().is_zero());
|
||||
});
|
||||
}
|
||||
@@ -421,7 +437,8 @@ fn choose_ticket_trivial_cases() {
|
||||
#[test]
|
||||
fn choose_account_one_participant() {
|
||||
new_test_ext().execute_with(|| {
|
||||
let calls = vec![RuntimeCall::Balances(BalancesCall::transfer { dest: 0, value: 0 })];
|
||||
let calls =
|
||||
vec![RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest: 0, value: 0 })];
|
||||
assert_ok!(Lottery::set_calls(RuntimeOrigin::root(), calls.clone()));
|
||||
assert_ok!(Lottery::start_lottery(RuntimeOrigin::root(), 10, 10, 10, false));
|
||||
let call = Box::new(calls[0].clone());
|
||||
|
||||
Reference in New Issue
Block a user