From my understanding after reading the code, I think nested/multi-level doesn't work.

Assuming we only use x1 conviction, given 3 accounts: A, B and C, A delegate to B, and B delegate to C. My operations order is:

  1. Call A delegate to B.
  2. Call B delegate to C.

And finally C's voting storage is:

  Direct: {
    votes: []
    delegations: {
      votes: 1
      capital: 1
    prior: [

So we can see delegations value of C is 1 not 2, which means A's delegation to B not apply to C. So I think nested delegation not work. There is also comment in substrate here which say 2nd level delegating is not supported.

But, from another stackexchange topic here and implementation of polkadot.js here, it seems that nested delegation works.

So I want to confirm:

  1. Does democracy/conviction-voting pallet support nested/multi-level delegation?
  2. If so, how does the code work?

1 Answer 1


You are right, nested/multi-level delegation is currently not supported in democracy and conviction-voting. The piece of code you referenced is one of the places where nested delegations would have been handled. However, it is currently not.

Regarding how it can be handled in theory - it would require some bit of bounded recursion and careful measuring so we could limit nesting to avoid the weight limit being exhausted when updating the nested delegation state.

  • I think it's fine substrate don't handle nested delegation, but we should correct fronted implementation and make users know it. I have another doubt, does nested delegation work in history runtime versions? I guess current polkadot/api implementation must have its reasons.
    – Leo
    Dec 19, 2022 at 9:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.