Skip to content
Snippets Groups Projects
  • Ankan's avatar
    [Staking] Currency <> Fungible migration (#5501) · f5673cf2
    Ankan authored
    Migrate staking currency from `traits::LockableCurrency` to
    `traits::fungible::holds`.
    
    Resolves part of https://github.com/paritytech/polkadot-sdk/issues/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
    - Config: `Currency` becomes of type `Fungible` while `OldCurrency` is
    the `LockableCurrency` used before.
    - Lazy migration of accounts. Any ledger update will create a new hold
    with no extra reads/writes. A permissionless extrinsic
    `migrate_currency()` releases the old `lock` along with some
    housekeeping.
    - Staking now requires ED to be left free. It also adds no consumer to
    staking accounts.
    - If hold cannot be applied to all stake, the un-holdable part is force
    withdrawn from the ledger.
    
    ### Delegated Staking
    The pallet does not add provider for agents anymore.
    
    ## Migration stats
    ### Polkadot
    Total accounts that can be migrated: 59564
    Accounts failing to migrate: 0
    Accounts with stake force withdrawn greater than ED: 59
    Total force withdrawal: 29591.26 DOT
    
    ### Kusama
    Total accounts that can be migrated: 26311
    Accounts failing to migrate: 0
    Accounts with stake force withdrawn greater than ED: 48
    Total force withdrawal: 1036.05 KSM
    
    
    [Full logs here](https://hackmd.io/@ak0n/BklDuFra0).
    
    ## 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
    https://github.com/paritytech/polkadot-sdk/pull/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
    - [x] Test: Vesting + governance locked funds can be staked.
    - [ ] can `Call::restore_ledger` be removed? @gpestana 
    - [x] Ensure unclaimed withdrawals is not affected by no provider for
    pool accounts.
    - [x] Investigate kusama accounts with balance between 0 and ED.
    - [x] Permissionless call to release lock.
    - [x] Migration of consumer (dec) and provider (inc) for direct stakers.
    - [x] force unstake if hold cannot be applied to all stake.
    - [x] Fix try state checks (it thinks nothing is staked for unmigrated
    ledgers).
    - [x] Bench `migrate_currency`.
    - [x] Virtual Staker migration test.
    - [x] Ensure total issuance is upto date when minting rewards.
    
    ## Followup
    - https://github.com/paritytech/polkadot-sdk/issues/5742
    
    ---------
    
    Co-authored-by: command-bot <>
    Unverified
    f5673cf2
Code owners
Assign users and groups as approvers for specific file changes. Learn more.