Method

The math is the product.

Wrong numbers are worse than no numbers. Every formula below is enforced in code and covered by tests.

Shares

shares(t) = raw × uiMultiplier(t) / 1e18

Everything is denominated in underlying shares — never raw tokens.

Basis per share

basisPerShare = acquisitionCostUsd / sharesAtAcquisition

When the multiplier changes, share count moves and basis-per-share adjusts automatically.

Disposal

gain = proceeds − sharesDisposed × basisPerShare(lot)

Proceeds = shares × consensus price at the event block.

Split vs distribution

Getting this backwards corrupts the whole report. Classification uses share ratio × price ratio:

Split

Shares up · price down proportionally

Example: multiplier ×2, price ÷2 → |shareRatio × priceRatio − 1| < 0.05. No income. Basis per share halves.

Distribution

Shares up · price roughly flat

Example: multiplier +1%, price unchanged → income row with its own line. Must appear in the export.

Anti-hallucination

If it's not in the context, you can't find the answer — say so. Flag the row. Do not guess.