This class covers cases where a protocol models SPL Token, Token-2022, mint/vault relationships, ATAs (Associated Token Accounts), wSOL/native SOL, transfer fees, delegates, freeze authority, or net-vs-gross accounting incorrectly.
A typical real-world shape is a rebalance or vault flow that checks the mint but not the token-account owner, authority, vault binding, or token program. The account looks right locally, yet value moves to the wrong role in the protocol.
Typical forms:
- An instruction updates internal accounting but does not perform the actual token transfer.
- A vault, mint, or collateral id is not bound to the expected strategy or market.
- wSOL/SOL conversion creates a DoS, rent, or close-account edge case.
- A standard Token-2022 transfer fee or a protocol-level host fee makes the gross amount differ from the net amount actually received.
- Incorrect mint validation allows creation of a pool, pair, or position with the wrong token.
- Fee owner, vault authority, or token account owner is checked in the wrong place or not checked completely.
How to check it:
- Build a token matrix for every instruction: mint, token account, vault, authority, token program, decimals, extension policy, and expected owner.
- Validate not only token_account.mint, but also the relationship vault -> mint -> strategy/market/config.
- For Token-2022, explicitly list supported and forbidden extensions.
- Test gross-vs-net transfer behavior: protocol fee, host fee, transfer fee, withheld amount, and extension-specific behavior.
- Test wSOL/native SOL paths separately: create ATA, sync native, close account, and rent receiver.
- For every transfer, compare before/after balances against internal accounting.
- For every fee account, validate mint, token program, owner, authority, and binding to the expected strategy, market, or config.