## `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