## `Call::recover_ledger` runthrough
### Polkadot
Before: `🔬 #ledgers: 64957, #bonded: 64960, #payee: 64960`
After (+3 ledgers): `🔬 #ledgers: 64960, #bonded: 64960, #payee: 64960`
#### Before
```
A. Duplicate controller found:
- 12gmcL9eej9jRBFT26vZLF4b7aAe4P9aEYHGHFzJdmf5arPi
stash 1: 13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq
stash 2: 12gmcL9eej9jRBFT26vZLF4b7aAe4P9aEYHGHFzJdmf5arPi
⚙️ ⚙️ ⚙️ is_validator controller: false | stash1 false | stash 2: false
Bonded(13Sv) = 12gmcL9eej9jRBFT26vZLF4b7aAe4P9aEYHGHFzJdmf5arPi
Bonded(12gm) = 12gmcL9eej9jRBFT26vZLF4b7aAe4P9aEYHGHFzJdmf5arPi
Ledger(12gm)
- stash: 12gmcL9eej9jRBFT26vZLF4b7aAe4P9aEYHGHFzJdmf5arPi
- total: 202,834,441,098,796
Lock(13Sv) = 201,151,395,706,325 ( != ledger.total, ledger was overwritten) ❌
Lock(12gm) = 202,834,441,098,796 (== ledger.total) ✅
Overwritten stash called `bond_extra` ~18 days ago
- https://polkadot.subscan.io/extrinsic/19802439-11
Thus, the Lock(13Sv) is most likely being overwritten from the double-bonded ledger
➡️ fix is to recover the overwritten ledger with `total` overwritting (to the correct value pre- bond_extra, which needs checking)
---
⚫ None ledgers (# 2)
B. None ledger: 14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC
Bonded(14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC) = 15bt
Ledger(14kw) = None
Bonded(15bt) = None
Ledger(15bt) = None
Lock(15bt) = []
Lock(14kw) = 42,606,076,773,049
Timeline:
- 15bt and 14kw were double-bonded/corrupted
- 15bt called fast-unstake
- 15bt killed (all) but also killed 14kw ledger
➡️ fix is to recover the ledger of 14kw, with total == lock and set controller as same as stash (14kw)
Note: this is the case where the user lost the stash keys :(
---
C. None ledger: 138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K
Bonded(138f) = 138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K
Ledger(138f) = None
Lock(138f) = 85,298,193,934,808
➡️ fix is to recover the ledger
```
#### Recovery
**A. stash `13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq`**
```
Call::recover_ledger(
- stash: 13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq;
- maybe_controller: None;
- maybe_total: Some(VALUE_TO_RESET);
```
✅ result:
```
Bonded(13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq) =13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq
Ledger(13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq) =
{
stash: 13SvkXXNbFJ74pHDrkEnUw6AE8TVkLRRkUm2CMXsQtd4ibwq
total: VALUE_TO_RESET
active: VALUE_TO_RESET
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: VALUE_TO_RESET,
reasons: All
}
]
```
**B. stash `14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC`**
```
Call::recover_ledger(
- stash: 14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC;
- maybe_controller: None;
- maybe_total: None;
```
✅ result:
```
Bonded(14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC) =14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC
Ledger(14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC) =
{
stash: 14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC
total: 42,606,076,773,049
active: 42,606,076,773,049
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: 42,606,076,773,049
reasons: All
}
]
```
**C. stash `138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K`**
```
Call::recover_ledger(
- stash: 138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K;
- maybe_controller: None;
- maybe_total: None;
```
✅ result:
```
Bonded(138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K) =138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K
Ledger(138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K) =
{
stash: 138fZsNu67JFtiiWc1eWK2Ev5jCYT6ZirZM288tf99CUHk8K
total: 85,298,193,934,808
active: 85,298,193,934,808
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: 85,298,193,934,808
reasons: All
}
]
```
---
### Kusama
Before: `🔬 #ledgers: 23949, #bonded: 23952, #payee: 23952`
After (+3 ledgers): `🔬 #ledgers: 23952, #bonded: 23952, #payee: 23952` ✅
#### Before
```
A. Duplicate controller found:
- EVe3hL6XumVKNyrjrjqK5LHNSETvM4djs25wMi9nYr5VMqv
stash 1: EVe3hL6XumVKNyrjrjqK5LHNSETvM4djs25wMi9nYr5VMqv
stash 2: ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa
⚙️ ⚙️ ⚙️ is_validator controller: false | stash1 false | stash 2: false
Bonded(EVe3) = EVe3
Bonded(ESGs) = EVe3
Ledger(EVe3)
- stash: EVe3
- total: 14,109,485,037,456
Lock(EVe3) = 14,109,485,037,456 (== ledger.total) ✅
Lock(ESGs) = 3,696,202,520 ( != ledger.total, ledger was overwritten) ❌
➡️ fix is to recover the overwritten ledger
---
B. Duplicate controller found: [⭐⭐ ENCOINTER]
- EyXct79ZDWdQfcSgJTG5texKM9wJj3quyh1ugPDVSkSt3Xm
stash 1: DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui
stash 2: EyXct79ZDWdQfcSgJTG5texKM9wJj3quyh1ugPDVSkSt3Xm
⚙️ ⚙️ ⚙️ is_validator controller: false | stash1 false | stash 2: false
Bonded(DggT) = EyXct79ZDWdQfcSgJTG5texKM9wJj3quyh1ugPDVSkSt3Xm
Bonded(EyXc) = EyXct79ZDWdQfcSgJTG5texKM9wJj3quyh1ugPDVSkSt3Xm
Ledger(EyXc)
- stash: EyXc
- total: 2,000,000,000,000,000
Lock(EyXc) = 2,000,000,000,000,000 (== ledger.total) ✅
Lock(DggT) = 187,908,199,001 ( != ledger.total, ledger was overwritten) ❌
➡️ fix is to recover the overwritten ledger
---
C. Duplicate controller found:
- E7o2xM99q6ckmFbKJmmmvVyKzs1FDEbLZHjKbPy7mMG9KKt
stash 1: E7o2xM99q6ckmFbKJmmmvVyKzs1FDEbLZHjKbPy7mMG9KKt
stash 2: Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP
⚙️ ⚙️ ⚙️ is_validator controller: false | stash1 false | stash 2: false
Bonded(E7o2) = E7o2xM99q6ckmFbKJmmmvVyKzs1FDEbLZHjKbPy7mMG9KKt
Bonded(Du2L) = E7o2xM99q6ckmFbKJmmmvVyKzs1FDEbLZHjKbPy7mMG9KKt
Ledger(E7o2)
- stash: E7o2xM99q6ckmFbKJmmmvVyKzs1FDEbLZHjKbPy7mMG9KKt
- total: 552,295,023,913,771
Lock(E7o2) = 552,295,023,913,771 (== ledger.total) ✅
Lock(Du2L) = 741,524,914 (!= ledger.total, ledger was overwritten) ❌)
➡️ fix is to recover the overwritten ledger
```
#### Recovery
**A. stash `ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa`**
```
Call::recover_ledger(
- stash: ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa;
- maybe_controller: None;
- maybe_total: None;
```
✅ result:
```
Bonded(ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa) =ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa
Ledger(ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa) =
{
stash: ESGsxFePah1qb96ooTU4QJMxMKUG7NZvgTig3eJxP9f3wLa
total: 3,696,202,520
active: 3,696,202,520
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: 3,696,202,520
reasons: All
}
]
```
**B. stash `DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui`**
```
Call::recover_ledger(
- stash: DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui;
- maybe_controller: None;
- maybe_total: None;
```
✅ result:
```
Bonded(DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui) =DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui
Ledger(DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui) =
{
stash: DggTJdwWEbPS4gERc3SRQL4heQufMeayrZGDpjHNC1iEiui
total: 187,908,199,001
active: 187,908,199,001
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: 187,908,199,001
reasons: All
}
]
```
**C. stash `Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP`**
```
Call::recover_ledger(
- stash: Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP;
- maybe_controller: None;
- maybe_total: None;
```
✅ result:
```
Bonded(Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP) =Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP
Ledger(Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP) =
{
stash: Du2LiHk1D1kAoaQ8wsx5jiNEG5CNRQEg6xME5iYtGkeQAJP
total: 741,524,914
active: 741,524,914
unlocking: []
claimedRewards: []
}
locks:
[
{
id: staking
amount: 741,524,914
reasons: All
}
]
```
---
### Westend
Done and all ledgers recovered: https://westend.subscan.io/extrinsic/20458970-2
#### Before
🔬 #ledgers: 72603, #bonded: 72619, #payee: 72619
```
1. 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh
State (`none` ledger):
- bonded(5CFP) = 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh
- ledger(5CFP) = None
- balances.lock(5CFP) = 20,732,640,296,960,147
Recovery:
- Call::recover_ledger(5CFP..., None, None)
✅ After:
- bonded(5CFP) = 5CFPcUJgYgWryPaV1aYjSbTpbTLu42V32Ytw1L9rfoMAsfGh
- ledger(5CFP) = Ledger { stash = 5CFP, total = lock}
- balances.lock(5CFP) = 20,732,640,296,960,147
2. 5DK1EDwKSiQJuAJbWK8svfzkj8t6gPrunXCg8rL4a4H5PCG9
3. 5HpG9w8EBLe5XCrbczpwq5TSXvedjrBGCwqxK1iQ7qUsSWFc
4. 5CXxXba5twWpf7B5QCShgBqRQe3TRE94MNxK6rBby3a8B5k9
5. 5H8ZSkv3S3NC2CCF1WKfVgLVNny7i4wcMYmdav5pKQRVUZF9
6. 5Gsg9yfCkUXweu4MyxZVpy1FLsSchUNxoGbgaHMWo8WyRKeB
7. 5GYaYNVq6e855t5hVCyk4Wuqssaf6ADTrvdPZ3QXyHvFXTip
8. 5H3JG7b6qe8aw3gbxwh9RHHYhAYV1xVGewTrZZ6DyD5J2Qdm
9. 5Fn49c7yTSAgWHPpnFdayAsuL6r6ds3Nt2aLMrDR9Mf8kkbY
State (`none` ledger):
- bonded(5Fn4) = 5Fn49c7yTSAgWHPpnFdayAsuL6r6ds3Nt2aLMrDR9Mf8kkbY
- ledger(5Fn4) = None
- balances.lock(5CFP) = 76,299,994,717
Recovery:
- Call::recover_ledger(5Fn4..., None, None)
✅ After:
- bonded(5Fn4) = 5Fn49c7yTSAgWHPpnFdayAsuL6r6ds3Nt2aLMrDR9Mf8kkbY
- ledger(5Fn4) = Ledger { stash = 5Fn4, total = lock}
- balances.lock(5Fn4) = 76,299,994,717
10. 5ECojuB4PjT3Eax31qcDiemTggLEo634rfoXJFnifwqLt9F4
11. 5EemzKmDp7PPdvZfbvUvMxNYu53BJu5JKiQ62K4pbP6Gq4Gy
12. 5FxYHzDaLWGf51PDVVWBT4zXUKic4qSckroWubzvCjSxYp5d
13. 5FHsWyUn7TfZaSj5si7B5kWQSkkomatoac2mVYvCTGMfCY2c
14. 5Hf1qHZKPy3ivCqVn5xpr3H4RKngRH8Y11y5DNSN6JWvT4vh
15. 5Dz1NcSj69gRQadnerRpL1N5GXM3THYXSHHrhrTANiMQfDYe
16. 5DMRLRZqoFyN4sD6HULehBHGrY9QrXjYUSmTKjtWdwXojkGd
State (`none` ledger):
- bonded(5DMR) = 5DMRLRZqoFyN4sD6HULehBHGrY9QrXjYUSmTKjtWdwXojkGd
- ledger(5DMR) = None
- balances.lock(5CFP) = 20,000,000,000
Recovery:
- Call::recover_ledger(5DMR..., None, None)
✅ After:
- bonded(5DMR) = 5DMRLRZqoFyN4sD6HULehBHGrY9QrXjYUSmTKjtWdwXojkGd
- ledger(5DMR) = Ledger { stash = 5DMR, total = lock}
- balances.lock(5DMR) = 20,000,000,000
```
#### Recovery