> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hoodshot.games/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify Any Bet, in the UI or by Hand

> Every bet has a verify button, a shareable proof page, and a fully manual verification path that needs no HoodShot software.

## In the app

Every bet everywhere has a **verify** button: the result panel, My Bets, All Bets, your profile, anyone's profile. Shared tickets link to `hoodshot.games/v/<bet id>`, a standalone proof page:

<Frame>
  <img src="https://mintcdn.com/hood-shot/fKdfI1DUtYgcna3K/images/verify-page.jpg?fit=max&auto=format&n=fKdfI1DUtYgcna3K&q=85&s=97818c4118e6d9a99f9974b703fa0ae4" alt="The verification page" width="1145" height="1400" data-path="images/verify-page.jpg" />
</Frame>

The page reads everything from the chain, never from our servers, and re-runs the math in your browser: it rebuilds the digest from the bet's own terms, pulls the signature out of the settle transaction's calldata, verifies it against the contract's RSA public key, hashes it into H, and replays the game rule. All checks green means the payout followed from arithmetic nobody could steer.

Inside any game's **Verify** tab you can pick from your own bets, enter any bet id, or paste a digest and have the tool find the bet whose terms hash to exactly that value:

<Frame>
  <img src="https://mintcdn.com/hood-shot/fKdfI1DUtYgcna3K/images/verify-overlay.jpg?fit=max&auto=format&n=fKdfI1DUtYgcna3K&q=85&s=5913c70270dc679f25c2de01f921ec3f" alt="The in-game verify tool" width="1079" height="1400" data-path="images/verify-overlay.jpg" />
</Frame>

A bet that has not settled yet is not a failure: the page shows its locked terms and already-decided outcome, with only the settle step pending.

## By hand

No HoodShot software required, just Foundry's `cast` and Python.

```bash theme={null}
C=0xB0d213833612E5557Ad68F4Dcc96d024B5B74Fb7
RPC=https://rpc.mainnet.chain.robinhood.com
ID=5

# 1. the digest the contract fixed at placement
cast call $C "betDigest(uint256)(bytes32)" $ID --rpc-url $RPC

# 2. the signature, from the settle transaction's calldata
cast tx <SETTLE_TX_HASH> input --rpc-url $RPC

# 3. the RSA public key
cast call $C "modulus()(bytes)" --rpc-url $RPC
```

```python theme={null}
# 4. sig^65537 mod n must unwrap to padding around your digest
sig, n = int(SIG_HEX, 16), int(MODULUS_HEX, 16)
em = pow(sig, 65537, n).to_bytes(256, "big")
assert em[-32:].hex() == DIGEST_HEX.replace("0x", "")

# 5. H, then the outcome rule
from eth_utils import keccak
H = int.from_bytes(keccak(bytes.fromhex(SIG_HEX.replace("0x", ""))), "big")
# coinflip: H & 1 (0 = heads) | dice: H % 6 + 1 | plinko: one bit per row
```

Compare H with the `h` in the bet's `Settled` event and the outcome with what was paid. A match means the result never had a second possibility.
