1

I recently had to transfer all the funds of an account A to an account B. To do so, I used extrinsic balances.transferAll(B, false) where the second argument is the keepAlive flag (see documentation) and signed with the key of A.

After a successful extrinsic submission, the account A still exists with an existential deposit (see screenshot below).

enter image description here

I was expecting that with no keep alive, the account's balances would just reach 0.

Am I missing something?

2
  • 1
    Some pallet seems to depent on that account to be alive, since it has a consumer ref. Is it maybe used as Proxy etc? Otherwise please post the on-chain address. Can also do this privately for investigation purpose only [email protected]. Commented Mar 15 at 11:17
  • 1
    No proxy here. What we did is transfer some tokens with vesting (vesting.vestedTransfer(...)) to A, then cancel the vesting (vesting.forceRemoveVestingSchedule(...)) and transfer funds back to B. I sent an e-mail with real data. Thanks!
    – GDethier
    Commented Mar 17 at 6:44

1 Answer 1

2

There was a bug in the currency module on how it handled consumer references.
These references can keep an account alive to ensure that other pallets that depend on it dont suddenly break since the account disappeared.

In your case the issue came the vested transfer. The vestedTransfer created two consumer references for the account instead of one. Then the forceRemoveVestingSchedule only removed one of those references instead of both. Now the account cannot be reaped anymore.

It was fixed in #1976, but all chains who ran into the issue prior to this will have a messed up storage. We are working on fixing this, but currently the scope of the issue is still unclear.

Your Answer

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

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