owned this note
owned this note
Published
Linked with GitHub
# Kusama: Fixing The Total Issuance
TLDR: A historic bug caused the Total Issuance tracking to deviate from the actual Issuance. I propose a [whitelisted call](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.ibp.network%2Fkusama#/extrinsics/decode/0x0409010bc197e4aa3b33) to re-align them. The underlying issue has already been resolved.
There was an [issue discovered](https://github.com/polkadot-fellows/runtimes/issues/147) on Kusama that the sum of all accounts' balances does not match the Total Issuance stored in `pallet-balances`. This is a serious issue, since third parties rely on its accuracy for tracking the total amount of existing tokens.
The underlying problem was fixed by [#1222](https://github.com/paritytech/polkadot-sdk/pull/1222) and [#3707](https://github.com/paritytech/polkadot-sdk/pull/3707). The TI has not drifted further, but the same problem is present on Polkadot.
## The Difference
First, it is necessary to measure the exact drift between the expected and the actual Total Issuance. This can be done by querying a node at a fixed block height. Two things have to be queried: all account entries and the TI variable from the balances pallet.
Conveniently, [this script](https://github.com/ggwpez/substrate-scripts/blob/master/check-ti-complete.py) does both. The exact numbers were determined by running these commands against a Kusama archive RPC:
```bash
python3 check-ti-complete.py --url <RPC> block --trace 24407008
python3 check-ti-complete.py --url <RPC> block --trace 23780225
```
:::spoiler
```bash
git clone https://github.com/ggwpez/substrate-scripts
# Setup local Python env
python3 -m venv venv
venv/bin/pip install substrate-interface
venv/bin/python3 check-ti-complete.py --url wss://rpc.ibp.network/kusama block 23780225 --trace
```
:::
Console output from both commands:
```pre
[24407008] The TotalIssuance is larger than the sum of all accounts TI. TI: 15,311,516.288236268 KSM, Sum: 15,311,459.956873074 KSM
[24407008] TI must be decreased by 15311516288236268206 - 15311459956873073389 = 56331363194817 (56.331363194817 KSM)
[23780225] The TotalIssuance is larger than the sum of all accounts TI. TI: 15,131,305.14570446 KSM, Sum: 15,131,248.814341264 KSM
[23780225] TI must be decreased by 15131305145704458736 - 15131248814341263919 = 56331363194817 (56.331363194817 KSM)
```
The JSON output in the file `blocks-ti.json` tells us the resulting numbers:
```json
{"block": 24407008, "sum": 15311459956873073389, "ti": 15311516288236268206, "runtime": "Parity Polkadot", "diff": 56331363194817}
{"block": 23780225, "sum": 15131248814341263919, "ti": 15131305145704458736, "runtime": "Parity Polkadot", "diff": 56331363194817}
```
This means that the difference is now stable since the last runtime upgrade that was 626,783 blocks ago.
The `diff` field shows shows the exact difference in planks: `56331363194817`. The TI is larger than the sum; we therefore need to *decrease* the TI by that amount.
## Referendum
The call to fix this is [pallet-balances::force_adjust_total_issuance](https://github.com/paritytech/polkadot-sdk/pull/3001):
```rust
fn force_adjust_total_issuance(
direction: AdjustmentDirection,
#[pallet::compact] delta: T::Balance,
)
```
`AdjustmentDirection` can be either `Increase` or `Decrease`. This can be used to correct the TI to be re-aligned with the actual sum of all accounts' balances.
The final call is [0x0409010bc197e4aa3b33](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frpc.ibp.network%2Fkusama#/extrinsics/decode/0x0409010bc197e4aa3b33):
![Screenshot 2024-08-09 at 17.07.56](https://hackmd.io/_uploads/S1dCg3X5R.png)
A similar post and referendum for Polkadot will follow once it was executed correctly on Kusama.