---
# System prepended metadata

title: Inspect Ledger state & recover plans
tags: [staking]

---

### Inspect Ledger state & recover plans

- Controller: `15bt67qghz8hJxCUPgAXmzVxUBHLpPN41RVm2nwMFyLWByVE`
- Stash: `14kwUJW6rtjTVW3RusMecvTfDqjEMAt8W159jAGBJqPrwwvC`

**Timeline**

1. Stash `14kw` was bonded with controller `15bt` 
    - `Bonded(14kw) = 15bt`
    - `Ledger(15bt) = ledger { stash = 14kw }`
2. at block #19824629, the ledger became "double-bonded" due to `15bt` calling bond (https://polkadot.subscan.io/extrinsic/19824629-2)
    - `Bonded(14kw) = 15bt`
    - `Bonded(15bt) = 15bt`
    - `Ledger(15bt) = ledger { stash = 15bt }` ❌ overwrote ledger from `14kw`
3. controller `15bt` registered for `fast_unstake`
4. at block #19915659, `fast_unstake` took place, `kill_ledger` was successful.
    - `Bonded(14kw) = 15bt`
    - `Ledger(14kw) = None` (this should not have happened, but did due to double-bonding of `15bt`)
    - `Bonded(15bt) = None` (expected due to kill)
    - `Ledger(15bt) = None` (expected due to kill)

```
// Polkadot state @ #19968049 (19 March)

// controller is expected
Bonded(stash) = 15bt67qghz8hJxCUPgAXmzVxUBHLpPN41RVm2nwMFyLWByVE

// controller is not a stash
Bonded(controller) = None

// None ledger
Ledger(controller) = None

// no ledger associated with stash
Ledger(stash) = None

// stash with staking lock
balances.locks(stash)
[
  {
    id: staking 
    amount: 42,606,076,773,049
    reasons: All
  }
]

// controller without
balances.locks(controller)
[]

```

**What did the stash and controller do recently?**
- **Stash**:
    - last activity: `bond_extra` ~870 days ago.
- **Controller**:
    - `nominate`, `bond_extra`, `nominate`, calls, successful
    - ❓❓❓ trying to call a few times `unbond` which failed
    - `fast_unstake` registered successfully at block `#19915630`
        - fast unstake for `15bt67qghz8hJxCUPgAXmzVxUBHLpPN41RVm2nwMFyLWByVE` was successful at block #19915659 https://polkadot.subscan.io/block/19915659?tab=event&event=19915659-55



```
Option 1:
- enforce controller deprecation (simplest)

Option 2:
- enforce controller deprecations IFF is necessary

if B is not bonded
- set controller as B
- otherwise set controller as stash

Option 3:
- don't enforce by moving locked funds to old ledger
(B, B) ❌


- Remove the nomiantions/payee etc (only reset the ledger stuff)


---
(A, B) // good/old state forever
(B, B)

nominate(B) -> Ledger(Bb)

// stash
bond_extra()

(A, B) A.amount/lock = 10
(B, B) B.amount/lock = 11

bond_extra(A, 15)

Bb.stash --> lock and amount updated (B)

(A, B) A.amount/lock = 10
(B, B) B.amount/lock = 26


maybe_total ();

// ignore
bond()
payout_staker()
set_controller()

```