• Ankan's avatar
    Allow privileged virtual bond in Staking pallet (#3889) · e504c41a
    Ankan authored
    This is the first PR in preparation for
    https://github.com/paritytech/polkadot-sdk/issues/454.
    
    ## Follow ups:
    - https://github.com/paritytech/polkadot-sdk/pull/3904.
    - https://github.com/paritytech/polkadot-sdk/pull/3905.
    
    Overall changes are documented here (lot more visual 😍):
    https://hackmd.io/@ak0n/454-np-governance
    
    [Maybe followup](https://github.com/paritytech/polkadot-sdk/issues/4217)
    with migration of storage item `VirtualStakers` as a bool or enum in
    `Ledger`.
    
    ## Context
    We want to achieve a way for a user (`Delegator`) to delegate their
    funds to another account (`Agent`). Delegate implies the funds are
    locked in delegator account itself. Agent can act on behalf of delegator
    to stake directly on Staking pallet.
    
    The delegation feature is added to Staking via another pallet
    `delegated-staking` worked on
    [here](https://github.com/paritytech/polkadot-sdk/pull/3904).
    
    ## Introduces:
    ### StakingUnchecked Trait
    As the name implies, this trait allows unchecked (non-locked) mutation
    of staking ledger. These apis are only meant to be used by other pallets
    in the runtime and should not be exposed directly to user code path.
    Also related: https://github.com/paritytech/polkadot-sdk/issues/3888.
    
    ### Virtual Bond
    Allows other pallets to stake via staking pallet while managing the
    locks on these accounts themselves. Introduces another storage
    `VirtualStakers` that whitelist these accounts.
    
    We also restrict virtual stakers to set reward account as themselves.
    Since the account has no locks, we cannot support compounding of
    rewards. Conservatively, we require them to set a separate account
    different from the staker. Since these are code managed, it should be
    easy for another pallet to redistribute reward and rebond them.
    
    ### Slashes
    Since there is no actual lock maintained by staking-pallet for virtual
    stakers, this pallet does not apply any slashes. It is then important
    for pallets managing virtual stakers to listen to slashing events and
    apply necessary slashes.
    e504c41a