TLDR: A historic bug caused the Total Issuance tracking to deviate from the actual Issuance. I propose a whitelisted call to re-align them. The underlying issue has already been resolved.
There was an issue discovered 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 and #3707. The TI has not drifted further, but the same problem is present on Polkadot.
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 does both. The exact numbers were determined by running these commands against a Kusama archive RPC:
python3 check-ti-complete.py --url <RPC> block --trace 24407008
python3 check-ti-complete.py --url <RPC> block --trace 23780225
:::spoiler
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:
[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:
{"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.
The call to fix this is pallet-balances::force_adjust_total_issuance:
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:
A similar post and referendum for Polkadot will follow once it was executed correctly on Kusama.
Threshold