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

# Verify a round

> Checking a hand you played, and sharing the proof with anyone.

![The public verify page showing a round's commitment, revealed seed, the derived shoe and the three green checks.](https://mintcdn.com/aceup/9Or0tHJTM0oGeA8-/images/screens/verify.webp?fit=max\&auto=format\&n=9Or0tHJTM0oGeA8-\&q=85\&s=404cba63ae255388ba693774eb211aa9)

## From the app

**1. Open the round**

**History → the round**, or **Verify hand** straight from a result panel.

**2. Read the three values**

The round shows its **commitment**, the **revealed server seed**, your
**client seed** and the **nonce**.

**3. Check**

The page re-derives the shoe in your browser and reports:

```
HASH ✓ · SHOE ✓ · 312 CARDS MATCH ✓
```

All three have to pass. One failing is a failure.

## The public page

**[aceupgame.com/verify](https://aceupgame.com/verify/)** is a standalone
verifier that needs no login and no account at all.

It takes four values — the **commitment**, the **server seed**, the **client
seed** and the **nonce** — all of which the round screen in the app shows you.
Paste them in and it re-derives the shoe in your browser and reports whether the
hash and the cards match.

Because it needs nothing but those four values, you can hand them to anybody. A
person with no Ace Up account can check your hand on their own machine, and they
do not have to take our page's word for it either — the algorithm is below.

This is also what a group's `/fair` command links to.

## Verifying it by hand

You do not have to use our page. The algorithm is small enough to reimplement:

**1. Check the commitment**

```
SHA-256(serverSeed) == commitment
```

If this fails, the revealed seed is not the one that was committed to, and
nothing else matters.

**2. Rebuild the shoe**

Build a fresh six-deck shoe in the canonical order: deck-major, then suit,
then rank — 6 × 52 = 312 cards.

Then run an unbiased Fisher–Yates shuffle over it, drawing 32-bit values from
an **HMAC-SHA256 keystream** keyed on the server seed and taking the client
seed and nonce as its message.

"Unbiased" means rejection sampling: a value at or above
`floor(2³² / max) × max` is discarded and redrawn, so no card position is
even slightly favoured by the modulo.

**3. Compare**

Deal from the top of your shoe in the order the round shows, and compare
card for card.

## If a check fails

Report it through **/support** with the round number. A failing check is the one
bug class that matters most here, and it is treated that way.

Before you do, the two things that produce a false alarm:

* Comparing against a **different round's** seed. The nonce has to match.
* A round that is **still live**. The server seed is not published until the
  round settles — that is the whole point of the commitment.

## Related

> [card] [How the commitment works](https://aceup.mintlify.site/fair/overview.md)
>
> Commit, deal, reveal — in more detail.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.