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.