BasketClaimDustSkipped

Event v468 → current New in v468 #152

Emitted when a root claim left some fund rows unsold because they were dust.

View events on chain
Useful for: stakersvalidatorsanalyticsdevelopers

The Big Picture

rows is a count, not an amount. forfeited_tao_est is an estimate at the pre-sale realizable quote, so it is the right scale for monitoring but not an exact accounting figure; the authoritative payment is the tao in BasketClaimed. Emitted only when at least one row was skipped, immediately before BasketClaimed. Source: pallets/subtensor/src/staking/claim_root.rs root_claim_for_hotkey_into at v468.

Why This Matters

Your claim skipped some of the smallest positions in the fund. What your share of them was worth stays in the fund rather than being sold at a loss to pay you.

Example Scenario

A claim on a fund with 40 holdings sells 37 and skips 3 whose whole value sits under the row floor. BasketClaimDustSkipped reports rows = 3 and forfeited_tao_est = 0.0006 TAO, and BasketClaimed reports the TAO actually paid.

Common Questions

Can I claim the skipped slices later?
No. The claim burned the whole entitlement, so those slices are forfeited to the other holders. That is why BasketClaimForfeitCapTao bounds how much one skipped slice may be worth.
Why estimate the forfeited amount rather than compute it?
The rows were never sold, so there is no execution price for them. The figure is quoted at the pre-sale realizable mark.

Use Cases

  • Explain why a claim paid less than a naive pro-rata calculation of fund NAV
  • Measure how much value the dust rules leave behind in aggregate
  • Audit whether the knobs are set too loosely for a given fund

How to Use This Event

  • → Pair with the BasketClaimed in the same extrinsic to get paid and forfeited together
  • → Sum forfeited_tao_est per hotkey to see which funds carry the most dust

From Chain Metadata

A root claim skipped `rows` dust rows of the fund: rows whose whole holding was worth less than `min(BasketClaimRowDustCapTao, BasketClaimRowDustBps × anchored NAV)`, or whose slice for this claimant was worth less than `BasketClaimSliceDustTao`, each worth at most `BasketClaimForfeitCapTao` for this claimant, all at the anchored (fast-EMA-capped) mark. Those rows were neither sold nor paid. The claim burned the whole entitlement, so the claimant's slices of those rows — about `forfeited_tao_est` at the pre-sale realizable quote — stay in the fund for the remaining holders.

Triggers

Preconditions

  • A root claim ran and at least one row matched a dust rule
  • For each such row the claimant slice was worth at most BasketClaimForfeitCapTao at the anchored mark

Effects

Postconditions

  • Those rows were neither sold nor paid; the fund still holds them
  • The claim burned the claimant's whole entitlement, so their slices of those rows stay with the remaining holders

Side Effects

  • Always accompanied by BasketClaimed, which reports the TAO actually paid

Event Data

#NameTypeDescription
0
hotkey
AccountId hotkey: Account address (32 bytes, SS58-encoded) (hex -> SS58)
1
coldkey
AccountId coldkey: Account address (32 bytes, SS58-encoded) (hex -> SS58)
2
rows
u32 rows (u32)
3
forfeited_tao_est
TaoBalance forfeited_tao_est: TAO amount in RAO (÷10⁹ for TAO)

Code Examples

import { createClient, Binary } from "polkadot-api";
import { getWsProvider } from "polkadot-api/ws";
import { sub } from "@polkadot-api/descriptors"; // generated by: npx papi add sub -w wss://entrypoint-finney.opentensor.ai:443

const client = createClient(getWsProvider("wss://entrypoint-finney.opentensor.ai:443"));
const api = client.getTypedApi(sub);

// Subscribe to BasketClaimDustSkipped events
client.finalizedBlock$.subscribe(async (block) => {
  const events = await api.event.SubtensorModule.BasketClaimDustSkipped.get(block.hash);
  for (const evt of events) {
    console.log("BasketClaimDustSkipped:", evt.payload);
  }
});

Runtime Info

View Source
Pallet Index
7
Event Index
152
First Version
v468
Current Version
v472