Skip to content

Client-Side Verification

Any device can independently verify any draw using public data. No trust in the coordinator required.

Verification Pipeline

  1. Fetch the round's manifest data and block hashes
  2. Rebuild the Merkle tree from operator manifests
  3. Verify the Merkle root matches the on-chain anchor
  4. Derive the draw seed from the block hashes
  5. Compute the winner index
  6. Confirm the winner matches the settlement proof

Fetching Round Data

typescript
const round = await fetch(
  "https://api.ultimalotto.com/api/public/rounds/42"
).then((r) => r.json());

The response includes fullManifestHash, effectiveManifestHash, drawSeed, winnerIndex, winningOperatorId, and related fields.

Verification URL

Each round has a deterministic verification URL:

https://verify.ultimalotto.com/round/{id}

The payload is a self-contained JSON including all chain data, manifests, randomness, anchors, and settlement info.

Compact Format

For sharing (e.g., QR codes, social media):

UL1:{roundId}:{seedPrefix}:{manifestPrefix}

Example: UL1:42:abcdef12:fedcba09