Skip to content
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

[NPoS] Nomination pools: Allow funds to be used for democracy #454

Open
kianenigma opened this issue Aug 17, 2022 · 21 comments · May be fixed by #3905
Open

[NPoS] Nomination pools: Allow funds to be used for democracy #454

kianenigma opened this issue Aug 17, 2022 · 21 comments · May be fixed by #3905
Assignees
Labels
I5-enhancement An additional feature request.

Comments

@kianenigma
Copy link
Contributor

kianenigma commented Aug 17, 2022

Edited:

Nomination pool currently works by 1) moving the funds from delegator to pool account, and 2) stake from pool account.
What we really want though is, 1) delegate the funds from delegator to pool account, and 2) stake from pool account.

Delegate the funds would imply similar pool functions with a very important difference that instead of funds moving from delegator to pool account, the funds will be locked in delegator's account and can be used for participating in governance voting.

In #408, staking pallet will enable the functionality of delegation of funds to another account (such as pool account) which will enable nomination pools to achieve the delegate and stake strategy. By utilising the delegated funds as if they belong to the pool, the pool account gains the ability to stake these funds as a direct nominator.

@kianenigma
Copy link
Contributor Author

If this approach works, we should also make it workable for crowdloan funds.

@Ank4n Ank4n self-assigned this Mar 27, 2023
@kianenigma kianenigma changed the title Nomination pools: Allow funds to be used for democracy [NPoS] Nomination pools: Allow funds to be used for democracy Apr 27, 2023
@forgetso
Copy link

This is an important issue. Most people want the ease of use associated with nomination pools but are prevented from participating in proposal decisions as a result.

@juangirini juangirini transferred this issue from paritytech/substrate Aug 24, 2023
@the-right-joyce the-right-joyce added I5-enhancement An additional feature request. and removed J0-enhancement labels Aug 25, 2023
@forgetso
Copy link

Thanks for the update @kianenigma

@Ank4n
Copy link
Contributor

Ank4n commented Sep 7, 2023

Update: The rough plan is to achieve this in two steps:

  1. Delegation Primitive in staking: Refer issue [NPoS] Staking: Users can delegate their fund to a target which can nominate on their behalf. #408. This will expose a new DelegatedStakeInterface for NominationPool to use. Compared to StakingInterface that allows an account to be a direct nominator, DelegateStakingInterface allows an account (called delegator) to delegate its stake to another account (delegatee). In delegation based staking, the funds are locked in the delegator's account and gives the delegatee the right to use the funds for staking as if it is a direct nominator.

  2. NominationPool switches to use DelegatedStakeInterface: Once enabled for a runtime, this will allow new pool members to first delegate funds to the pool account and then stake. The delegated funds are frozen in user's account and can be used for governance. At this stage, for users whose funds are transferred to the pool account previously can invoke a migrate call that will transfer their share of stake in the pool to their account (tokens will stay frozen).

The first part is actively worked on in this branch. I am currently implementing a way to do a partial_withdraw of unlocking funds in a staking ledger (required for delegated staking) and then will move on to trying to use this with NominationPools pallet to validate the DelegatedStakeInterface makes sense. Both issues can be released in separate PRs though.

@michalisFr
Copy link

Since this is already being worked on, this is mostly for the sake of discussion, but let me post an alternative solution.

With the current way that pools work (funds being sent to the pool), pool members could opt in to delegate their funds in the pool to the pool (to keep things simple delegating is binary, either their whole stake or nothing). A new capital variable for the pool would need to be introduced that would keep track of the total delegated balance (from the members that have opted in). Then the pool (through its owner account) would be able to vote in referenda with this capital. The conviction should be limited to None, otherwise pool members may not be able to unbond.

Basically this wouldn't be a delegation per se, but an internal mechanism of pools that allows them to have a capital (not necessarily equal to the pool account's balance) with which the pool can vote in referenda.

Is what I'm describing possible? What would be the benefits and drawback compared to the solution you're working on @Ank4n?

Some pros of the solution you work on that I can think of:

  1. Funds remain in the user's account -> increased "sense" of security and similar experience to solo staking
  2. User can decide for themselves how to vote or delegate their vote
  3. Doesn't centralise voting power in the hands of pool operators (as my proposal does). But given that delegation is encouraged, I consider this more of a con than a pro (see my second point below).

Some pros of my proposed solution:

  1. Simpler implementation (I think)
  2. Users that join a pool some times do it as a simpler solution to staking, even if they can stake solo. These users are not likely to participate in governance. On the other hand, pool operators are likely to vote in referenda and if they carry the votes of their pool's members, this would lead to increased participation. In other words, it would be a simple way for pool members to delegate their votes, even simpler than the current delegation method.

@Ank4n
Copy link
Contributor

Ank4n commented Oct 12, 2023

@michalisFr Sorry for the late response (i am in a retreat currently), but sounds a decent idea. Especially if we make it even simpler and allow all pool funds to be used in governance by the pool operator. A pool can signal at the time of creation whether the pool funds will be used for governance. The only con I see is that delegators can't independently vote on a referenda but that may not necessarily be a bad thing.

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/retail-nominators-the-foundation-of-dot-demand-until-polkadots-next-chapter/4252/16

@michalisFr
Copy link

@michalisFr Sorry for the late response (i am in a retreat currently), but sounds a decent idea. Especially if we make it even simpler and allow all pool funds to be used in governance by the pool operator. A pool can signal at the time of creation whether the pool funds will be used for governance. The only con I see is that delegators can't independently vote on a referenda but that may not necessarily be a bad thing.

Hey @Ank4n! No worries. Thanks for the response.

This is indeed an even simpler solution. How would you handle existing pools and members though? If this was to be allowed for existing pools (as it should IMO), some members might disagree with their pool's decision, but leaving a pool is not easy.

Anyway, these are implementation details. I don't want to take up more of your time with this. Unless you're actually thinking of going with this model over the one you're already working on :)

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/frame-monthly-update/4628/1

@muddlebee
Copy link
Contributor

hey @Ank4n any estimated timeline for this? I'm a community mod at Polkadot discord, we are getting frequent queries about when this will be live.

@Ank4n
Copy link
Contributor

Ank4n commented Jan 19, 2024

hey @Ank4n any estimated timeline for this? I'm a community mod at Polkadot discord, we are getting frequent queries about when this will be live.

Hey @muddlebee, unfortunately this turned out to be a much bigger change and we had some back and forth on how we want to implement this without adding regression to current staking logic. But there is progress on it in this PR and seems to be the approach we are settling on. My current target is to get this to Westend in Q1 but for Kusama and Polkadot, I would say Q2 (with audit).

@Ank4n
Copy link
Contributor

Ank4n commented Jan 19, 2024

Update: Moved it to Q1 2024 in the roadmap.

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/monthly-governance-incentive-referendum-1-buffet/5764/2

@sourabhniyogi
Copy link

sourabhniyogi commented Jan 20, 2024

hey @Ank4n any estimated timeline for this? I'm a community mod at Polkadot discord, we are getting frequent queries about when this will be live.

Hey @muddlebee, unfortunately this turned out to be a much bigger change and we had some back and forth on how we want to implement this without adding regression to current staking logic. But there is progress on it in this PR and seems to be the approach we are settling on. My current target is to get this to Westend in Q1 but for Kusama and Polkadot, I would say Q2 (with audit).

@Ank4n In your Q1 2024 delivery (exciting, thank you for moving it up!), can you explain what exactly will be locked by a pool operator who votes on referenda with a certain level of convictionVoting, if pool funds can be used for governance?

@Ank4n
Copy link
Contributor

Ank4n commented Jan 31, 2024

hey @Ank4n any estimated timeline for this? I'm a community mod at Polkadot discord, we are getting frequent queries about when this will be live.

Hey @muddlebee, unfortunately this turned out to be a much bigger change and we had some back and forth on how we want to implement this without adding regression to current staking logic. But there is progress on it in this PR and seems to be the approach we are settling on. My current target is to get this to Westend in Q1 but for Kusama and Polkadot, I would say Q2 (with audit).

@Ank4n In your Q1 2024 delivery (exciting, thank you for moving it up!), can you explain what exactly will be locked by a pool operator who votes on referenda with a certain level of convictionVoting, if pool funds can be used for governance?

I am not sure if I understood the question. Once this is live, funds contributed to nomination pool would be held (reserved) in user's own account instead of being transferred to the pool's account. Any pallet such as pallet-conviction-voting that looks at total balance and uses freezes (locks) would be able to reuse these held funds. Did that answer your question?

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/decentralized-voices-program-luke-schoen/6111/6

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/opengov-improvements-on-the-technical-level/6578/3

@bkchr
Copy link
Member

bkchr commented Mar 4, 2024

@Ank4n @gpestana can someone of you give an update on the status of this issue?

@Ank4n
Copy link
Contributor

Ank4n commented Mar 4, 2024

PR here #2680. Its very close to being ready.

github-merge-queue bot pushed a commit that referenced this issue Apr 20, 2024
This is the first PR in preparation for
#454.

## Follow ups:
- #3904.
- #3905.

Overall changes are documented here (lot more visual 😍):
https://hackmd.io/@ak0n/454-np-governance

[Maybe followup](#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](#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: #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.
@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/paritytech-update-for-april/7646/1

@Polkadot-Forum
Copy link

This issue has been mentioned on Polkadot Forum. There might be relevant details there:

https://forum.polkadot.network/t/paritytech-update-for-april-2024/7646/2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
I5-enhancement An additional feature request.
Projects
Status: ⌛️ Sometime-soon
Status: In Development
Status: Draft
Status: Backlog
Development

Successfully merging a pull request may close this issue.

9 participants