Independent audit · Stock Tokens · ERC-8056
a token is not a share : the multiplier is 4.000000000
CRWD's totalSupply() reads 8.8874 tokens. Its uiMultiplier() is 4.000000000, so they count as 35.5497 shares. ASSAY reads both from Robinhood Chain and publishes only what re-fetches byte for byte.
Scroll to assay it
Live board · block 107542044 · 130/130 ✓ re-fetched · swept
How ASSAY checks one number, in five steps

01 Weigh
The supply, counted in tokens.
totalSupply() · 8.8874 tokens · 0x…2ced1000
Read from CRWD at block 107542133. Every balance on this token is counted the same way: in tokens, not shares.

02 Read the multiplier
The multiplier, from the same block.
uiMultiplier() · 4.000000000 · 0x…9d900000
Under ERC-8056 a corporate action changes this number and leaves every balance where it was. Skip it, and every share count read from CRWD is off by a factor of 4.000000000.

03 Strike
Stamped with its own bytes.
0x…9d900000 @ 107542133
Each value is published with the raw bytes it was decoded from and the block it was read at, so anyone can repeat the call and compare. A finding that arrives without them is withheld.

04 Divide
Each token counts as four shares.
8.8874 × 4.000000000 = 35.5497 share-equivalents
A screen that shows the balance as a share count shows 8.8874 where there are 35.5497. That gap is what ASSAY looks for.

05 Re-fetch
Checked again before it is published.
130 of 130 citations re-fetched from chain state and byte-compared before publication · swept at block 107542044
The verifier withheld nothing on this sweep. When it does, the wall lists each finding it held back, with the reason.
51 of 52 never read the multiplier.
Of the 64 addresses seen moving the 18 Stock Tokens whose multiplier is more than 0.2% from 1, 52 are contracts. 1 of the 52 we could read references uiMultiplier().
12
could be exposed
They hold at least $106,090 of these tokens with no uiMultiplier() in their logic and no pool or custody fingerprint. Read as share counts, their balances miss 1.23 share-equivalents.
15
never need it
10 AMM pools, 1 pool manager, 1 custody or executor wallet and 3 distributors hold at least $1,484,277. They keep reserves or custody and never report a share count, so going without the multiplier is not an exposure for them.
10 more are too small to hold valuation logic, and 14 held none of these tokens at the block. This shows a missing call, not a mistake, and no contract is named here. 3 findings that would name one are withheld from every public page. The named audit of any address, with its bytecode evidence, is the $0.25 call below.
check it free. pay for the full answer.
Free
Check a wallet
Paste any address. Your browser reads balanceOf() beside the share count for every Stock Token whose multiplier is not 1, straight from the chain. Nothing is signed or sent to ASSAY.
Free
The MCP verdict
Ask whether a position can be valued safely, or whether a contract reads the multiplier. You get the verdict and the reason, over MCP, with no key.
claude mcp add --transport http assay https://sonar.my.id/assay-mcp/mcp # SSE-only clients: claude mcp add --transport sse assay https://sonar.my.id/assay-mcp/sse$0.01
assay_true_position(symbol, holder)
One position at one block: the raw balance, uiMultiplier(), the share count and the token's decimals, with the feed price, its age and the USD value.
$0.25
assay_check_contract(address)
One contract, named: every holding it has of a Stock Token whose multiplier is not 1, the share-equivalents it leaves out, the USD held, and the eth_call citations behind each number.
Free
erc8056-guard on npm
The TypeScript helper for ERC8056Guard, an ownerless, view-only contract on Robinhood Chain that returns a holder's share count, or a refusal with its reason.
npm i erc8056-guard viem
Payment settles before the task runs, so check a symbol or an address with the free MCP first. Request bodies and the 402 flow are on the pricing page; the source is on GitHub.
every finding, with the bytes behind it.
65 findings on the board, 2 critical. 130 of 130 citations re-fetched and byte-compared. Every finding opens to its raw returns, the blocks they were read at, and the command that repeats each read.