-
Notifications
You must be signed in to change notification settings - Fork 720
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Staking] Currency <> Fungible migration #5501
base: master
Are you sure you want to change the base?
Conversation
balance hold checks both frozen and reserved wip: around 25 tests failing check Holds instead of locks 20 tests failing fmt 11 fails 4 fails 2 failing 1 fail all tests pass but pending a hygiene check of code fix compile minor refactor remove T::Currency calls from asset mod
…staking-migrate-currency-to-fungible-2
All GitHub workflows were cancelled due to failure one of the required jobs. |
All GitHub workflows were cancelled due to failure one of the required jobs. |
@@ -38,9 +38,9 @@ pub fn config_endowed(extra_endowed: Vec<AccountId>) -> RuntimeGenesisConfig { | |||
(alice(), 111 * DOLLARS), | |||
(bob(), 100 * DOLLARS), | |||
(charlie(), 100_000_000 * DOLLARS), | |||
(dave(), 111 * DOLLARS), | |||
(dave(), 112 * DOLLARS), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bumping up the balance by ED for stakers here. With this PR, we require at least ED to be left free in the staking account.
@@ -77,7 +79,7 @@ frame_support::construct_runtime!( | |||
} | |||
); | |||
|
|||
pub(crate) type AccountId = u64; | |||
pub(crate) type AccountId = u128; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
with u64, pool pot accounts have collisions.
.chain(validators_range.clone().map(|x| (x, 7 + 100))) | ||
.chain(nominators_range.clone().map(|x| (x, 7 + 100))) | ||
// give stakers enough balance for stake, ed and fast unstake deposit. | ||
.chain(validators_range.clone().map(|x| (x, 7 + 1 + 100))) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
providing additional ED to stakers.
// account endowed + some funds rescinded from issuance. | ||
assert_eq!(System::<T>::read_events_for_pallet::<pallet_balances::Event<T>>().len(), 2 * (n + 1) as usize + 3); | ||
// deposit to reporter + reporter account endowed. | ||
assert_eq!(System::<T>::read_events_for_pallet::<pallet_balances::Event<T>>().len(), 2); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
changes in which events are emitted is due to moving from Currency
to Fungibles
trait.
(21, self.balance_factor * 1000), | ||
(31, self.balance_factor * 500), | ||
(41, self.balance_factor * 1000), | ||
(11, self.balance_factor * 1500), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
minting some extra balance into stakers so they always have at least ED as free balance.
// Get rid of the extra consumer we used to have with OldCurrency. | ||
frame_system::Pallet::<T>::dec_consumers(&stash); | ||
|
||
Self::deposit_event(Event::<T>::CurrencyMigrated { stash: stash.clone(), force_withdraw }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this event suppossed to notify of how much funds were migrated?
Because by looking at the if-else above it looks like it's more like funds_still_locked_in_old_currency.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if I understand funds_still_locked_in_old_currency
? Once we get here, there should be nothing locked with old currency.
The event is meant to notify clients that the given account has migrated to new currency along with the information if their ledger has reduced by some balance because of this operation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understood that the "else" condition is when someone has more funds locked for staking than in their free balance thus we cannot "hold" as much as is needed so we go just for as much as possible.
Regarding funds_still_locked_in_old_currency
, I called it so because in if
zero value is returned and in else
it's the difference between staked and free balance and since the free balance will be held then the result is what's left to unlock and move to hold.
Is my reasoning correct?
@@ -89,13 +93,27 @@ pub mod pallet { | |||
|
|||
#[pallet::config(with_default)] | |||
pub trait Config: frame_system::Config { | |||
/// The old trait for staking balance. Deprecated and only used for migrating old ledgers. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shouldn't the pallet be annotated with deprecated then?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not pallet but yeah may be config item can be annotated as deprecated (if its possible).
/// | ||
/// Does not include the current stake. | ||
pub fn free_to_stake<T: Config>(who: &T::AccountId) -> BalanceOf<T> { | ||
// since we want to be able to use frozen funds for staking, we force the reduction. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The note was related to the usage of Fortitude::Force
. Any funds that is locked or frozen (such as for governance or vesting) should still be usable for staking.
let _ = T::Currency::set_balance(who, value - staked_balance + ed); | ||
} else { | ||
// else reduce the staked balance. | ||
update_stake::<T>(who, value).expect("can remove from what is staked"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
update_stake::<T>(who, value).expect("can remove from what is staked"); | |
update_stake::<T>(who, value).expect("cannot remove from what is staked"); |
#[test] | ||
fn ledger_update_creates_hold() { | ||
ExtBuilder::default().has_stakers(true).build_and_execute(|| { | ||
// GIVEN alice who is a nominator with old currency |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
// GIVEN alice who is a nominator with old currency | |
// GIVEN alice who is a nominator with new currency |
Migrate staking currency from
traits::LockableCurrency
totraits::fungible::holds
.Resolves part of #226.
Changes
Nomination Pool
TransferStake is now incompatible with fungible migration as old pools were not meant to have additional ED. Since they are anyways deprecated, removed its usage from all test runtimes.
Staking
Currency
becomes of typeFungible
whileOldCurrency
is theLockableCurrency
used before.migrate_currency()
releases the oldlock
along with some housekeeping.Delegated Staking
The pallet does not add provider for agents anymore.
TODO: check again if unclaimed withdrawals would be affected by this.
Migration stats (needs update)
Polkadot
Total accounts that can be migrated: 59564
Accounts failing to migrate: 0
Accounts with some stake force withdrawn: 59
Total force withdrawal: 29591.26 DOT
Kusama
Total accounts that can be migrated: 26311
Accounts failing to migrate: 0
Accounts with some stake force withdrawn: 48
Total force withdrawal: 1036.05 KSM
Full logs here.
Note about locks (freeze) vs holds
With locks or freezes, staking could use total balance of an account. But with holds, the account needs to be left with at least Existential Deposit in free balance. This would also affect nomination pools which till now has been able to stake all funds contributed to it. An alternate version of this PR is #5658 where staking pallet does not add any provider, but means pools and delegated-staking pallet has to provide for these accounts and makes the end to end logic (of provider and consumer ref) lot less intuitive and prone to bug.
This PR now introduces requirement for stakers to maintain ED in their free balance. This helps with removing the bug prone incrementing and decrementing of consumers and providers.
TODO
Call::restore_ledger
be removed? @gpestanamigrate_currency
.Followup