Dice Game Audit [Duel]
Dice Game Audit [Duel] - ProvablyFair.org
ProvablyFair.org - Dice Game Audit
Game: Dice
Audit Version: 1.0
Audit Date: Jan 2, 2026
Repository: GitHub - ProvablyFair-org/duel-audit
Commit Audited:
fa913abPublic Certification: Provably Fair Certification

Casino
Game
Commit Hash
fa913ab94883d06950d3c63bbb7007f927648131
Audit Period
January 30, 2026
RTP (Return to Player)
99.91%
House Edge
0.09%
Live Bets Tested
6,200
Simulated Bets
~980,000
Parity Rate
100%
Repository
Commit Audited
fa913ab
Public Verifier
Dice Audit Overview
This document provides a summary of the audit conducted for the Duel Casino's Dice game. The audit ensures the game is fair and meets necessary standards.
What Was Audited
This audit evaluates the Dice game operated by Duel Casino to verify that:
✅ The RNG algorithm is deterministic and verifiable
✅ Server seeds are cryptographically committed before play
✅ Players can set their own client seeds
✅ Nonces increment correctly and are never reused
✅ Payout logic matches advertised multipliers
✅ Theoretical RTP is 99.91%
✅ Game outcomes are determined by a provably fair algorithm
✅ Players can independently verify every bet
✅ Commit-reveal cryptographic system verification
What Audit Covers
Commit-Reveal System
Server seed hashing, timing, reveal mechanics
Seed Handling
Client seed control, nonce lifecycle
RNG Analysis
Algorithm verification, bias testing
Payout Logic
Multiplier accuracy, win condition verification
Live Parity
Verifier vs live game result matching
RTP Validation
Theoretical and simulated RTP analysis
What Audit Guarantees
Outcomes are deterministic and reproducible
Live game results match the public verifier
Randomness behaves as advertised
No known exploit classes were observed at audit time
What Audit Excludes
Infrastructure or server security
Wallet, payments, or custody systems
Operational controls outside game logic
Audit Verdict
Overall Status
✅ Pass
RTP Verified
✅ 99.91% ± [0.09% House Edge]
Live ↔ Verifier Parity
✅ 100% - All test rounds matched
Commit-Reveal System
✅ Passed - SHA-256 verified
Seed Handling
✅ Passed - Player control verified
RNG Analysis
✅ Passed - Unbiased via rejection sampling
Payout Logic✅
✅ Passed - All payouts verified correct
Known Exploits Tested
✅ Passed - 7/7 testable exploits
Determinism
✅ Passed - Full reproducibility confirmed
Public Repository Link
GitHub Repository: https://github.com/ProvablyFair-org/duel-audit
Commit Audited: fa913ab
Public Verifier: https://duel.com/dice (Verify Now feature)

References
Dice - Game Rules
Dice - Game Rules
Dice is a prediction game where players bet on whether a randomly generated number will fall above or below a chosen target. Its transparent mechanics and verifiable math make it a natural starting point for provably fair auditing.
Game Rules
Dice is a prediction game where players bet on whether a randomly generated number will fall above or below a target threshold they choose. The game offers complete control over risk and reward: players who accept lower win probability receive higher payouts, while those preferring safer bets receive smaller multipliers.
Risk vs Reward
The core mechanic of Dice is the inverse relationship between win probability and payout:
High risk, high reward: Setting a target of 90 with "Roll Over" gives only a 10% chance to win, but pays approximately 9.99x
Low risk, low reward: Setting a target of 50 with "Roll Over" gives a 50% chance to win, but pays approximately 1.998x
Players control the math: Unlike slots or other games with fixed odds, Dice lets players choose their exact risk profile on every bet
Roll Range
0.00 – 100.00
Uniform distribution across 10,001 possible outcomes
Target Precision
0.01
Players can set targets like 35.00, 50.05, 72.50
House Edge
0.1%
UI displays "Zero Edge." Verified house edge is 0.1%.
Theoretical RTP
99.9%
Verified across all 196 target configurations
Betting Modes
Manual, Auto
Auto mode enables rapid sequential betting
Bet ID Format
Numeric
Each bet assigned unique ID (e.g., #308953686)
Seed Formats
Every Dice bet uses three cryptographic inputs to generate the result:
Server Seed
64-char hex (32 bytes)
4f775f81301c7fe8...
Casino-provided randomness
Client Seed
16-char alphanumeric
kJbhRHVAg4lh_OY7
Player-controlled randomness
Nonce
Integer, starts at 0
0, 1, 2, ...
Ensures unique result per bet
The combination of these three inputs, using HMAC-SHA256, produces the random roll. Because the player controls the client seed and the server seed is committed before betting, neither party can manipulate the outcome.
Multiplier Calculation
Payouts in Dice are calculated mathematically based on win probability and house edge:
With Duel's 0.1% house edge:
Why Provably Fair Matters
Why Provably Fair Matters
Traditional online casinos require players to trust that games are fair. Provably fair systems eliminate this trust requirement by allowing players to mathematically verify that outcomes were not manipulated. In a Provably Fair system:
The casino commits to a result before the player bets
The player contributes randomness that the casino cannot predict
Anyone can verify the outcome after the fact
High-Level Overview
High-Level Flow
To get an overview of how the process works, here is a high-level diagram alongside details
Player Bets → Initial input from the player
Seeds Combined → Combining serverSeed, clientSeed, and nonce
RNG Output → Random number generation using HMAC-SHA256 with rejection sampling
Game Logic → Generates a value (0.00-100.00) compared against the target
Payout Result → Final outcome (Win/Lose) multiplied by the multiplier

Provably Fair Model
Provably fair gambling systems use cryptographic primitives to guarantee the integrity of outcomes. The model relies on three components: a server seed committed via hash before play, a player-controlled client seed, and an incrementing nonce. These inputs are combined using HMAC-SHA256 to produce deterministic, verifiable results. This section documents the global provably fair architecture used by almost all Casinos and all relevant games.
Commit-Reveal Model
The Commit-Reveal model is integral to ensuring fairness and transparency in online gambling. This model involves several key phases:
Commit Phase: Before any bets are placed, the casino generates a random server seed. To prove its authenticity and prevent later manipulation, only the SHA-256 hash of this seed is sent to the player. This ensures that while the player cannot know the seed initially, they can verify it later.
Bet Phase: The player places their bet, incorporating their client seed. This phase combines the client seed with the server seed to influence game outcomes, ensuring player participation in the randomness.
Reveal Phase: Once the bet is resolved, the casino reveals the actual server seed. By disclosing this information, players can verify that the hash provided during the commit phase corresponds to the server seed used, ensuring no tampering occurred.
Verify Phase: The player can now confirm the fairness of the outcome by hashing the server seed revealed so far. If the hash matches the one provided during the commit phase, it proves the integrity of the process and ensures that outcomes were not manipulated by the casino.

Technical Glossary
Technical Glossary
Core Concepts
Provably Fair A cryptographic system that allows players to mathematically verify that game outcomes were not manipulated. Unlike traditional "trust-based" systems, provably fair games provide cryptographic proof of fairness.
Commit-Reveal Protocol A two-phase process in which the casino commits to a result (by showing its hash) before the player bets, then reveals the actual value after the bet. This prevents the casino from changing outcomes based on player actions.
Determinism The property that identical inputs always produce identical outputs. In provably fair systems, using the same server seed, client seed, and nonce must always generate the same game result.
Seed System
Server Seed A random value generated by the casino, typically 64 hexadecimal characters (32 bytes). The server seed is hashed and shown to players before betting, then revealed after the bet is complete.
Client Seed A random value controlled by the player, typically 16 alphanumeric characters. Players can set or change their client seed at any time to ensure they contribute entropy that the casino cannot predict.
Nonce A sequential counter (0, 1, 2, 3...) that increments with each bet under the same seed pair. The nonce ensures each bet produces a unique result even when using the same server and client seeds.
Seed Pair The combination of a server seed and a client seed. A seed pair remains active across multiple bets, with the nonce incrementing for each round. When a player rotates seeds, a new seed pair begins with the nonce reset to 0.
Hashed Server Seed The SHA-256 hash of the server seed, shown to players before betting. After the bet, players can verify that SHA-256(revealed server seed) equals the originally shown hash, proving the casino didn't change the seed.
Cryptographic Functions
HMAC-SHA256 Hash-based Message Authentication Code using SHA-256. A cryptographic function that combines the server seed, client seed, and nonce to produce a deterministic, unpredictable hash used for random number generation.
SHA-256 Secure Hash Algorithm 256-bit. A one-way cryptographic hash function that converts any input into a unique 64-character hexadecimal output. Cannot be reversed to discover the original input.
Rejection Sampling A technique to eliminate modulo bias in random number generation. Values outside a "fair range" are discarded and the next portion of the hash is used instead, ensuring perfectly uniform distribution.
Verification Terms
Verifier A tool (usually web-based or code snippet) that independently calculates game outcomes using provided seeds and nonce. A proper verifier should produce identical results to the live game.
Parity The degree of matching between verifier results and live game results. 100% parity means every single outcome matches perfectly, which is required for provably fair certification.
Reproducibility The ability to regenerate exact game outcomes using the same inputs. Players should be able to reproduce any historical bet result using the revealed seeds and nonce.
Game Mechanics
RNG (Random Number Generator) The algorithm that produces random outcomes. In provably fair systems, the RNG must be deterministic and based only on seeds + nonce (no hidden entropy sources).
RTP (Return to Player) The percentage of wagered money returned to players over time. Calculated as (1 - House Edge) × 100%. For Duel Dice, RTP = 99.9%.
House Edge The casino's mathematical advantage, expressed as a percentage of each bet. For Duel Dice, house edge = 0.1%, meaning the casino expects to keep 0.1% of all wagers long-term.
Multiplier The payout ratio for a winning bet. Calculated as: (100 - House Edge) / Win Probability. For example, a 50% win chance with 0.1% house edge yields a 1.9980x multiplier.
Win Condition The rule that determines if a bet wins or loses. In Dice: "Roll Over" wins if result > target; "Roll Under" wins if result < target. Rolling exactly on target always loses.
Audit Terms
Fairness Violation A condition where a player or casino could predict, alter, or unfairly influence outcomes. Examples include seed prediction, nonce replay, or hidden entropy injection.
Entropy Randomness or unpredictability in a system. In provably fair games, entropy comes from both the casino (server seed) and player (client seed).
Bias Non-uniform probability distribution. An unbiased RNG gives all outcomes equal likelihood. Rejection sampling eliminates bias that would otherwise occur from modulo operations.
Edge Case Unusual or extreme scenarios that might behave differently than normal operation. Examples: concurrent betting, nonce overflow, malformed seeds, or maximum bet limits.
Data Formats
Hexadecimal (Hex)
Base-16 number system using digits 0-9 and letters A-F. Server seeds and hashes are typically shown in hex format (e.g., 4f775f81301c7fe8...).
Hash The output of a cryptographic hash function. In provably fair systems, hashes serve as commitments that cannot be reversed but can be verified.
Bet ID A unique identifier assigned to each bet (e.g., #308953686). Used to reference specific rounds during verification.
Common Abbreviations
PF
Provably Fair
RNG
Random Number Generator
RTP
Return to Player
HMAC
Hash-based Message Authentication Code
SHA
Secure Hash Algorithm
CI
Confidence Interval
N/A
Not Applicable / Not Tested
Duel: Dice Game Audit
Every Dice roll on Duel is generated from three inputs: server seed, client seed, and nonce. The casino commits to its seed before you bet, you control your own seed, and the nonce increments automatically. This combination guarantees that outcomes are both random and verifiable. This section tests whether Duel’s Dice Game seed handling meets provably fair standards, specifically whether the system is fully deterministic and tamper-proof.
1. Seed, Nonce & Determinism
What Was Tested
The casino commits to a server seed before any bet is placed
Players can freely set or change their client seed before betting
A nonce increments automatically for every bet and is never reused
The Dice result is generated only from (server seed, client seed, nonce)
The same inputs always produce the exact same outcome
What This Means for Players
The casino cannot change outcomes after you place a bet
You contribute your own randomness via the client seed
Every bet is unique, even with the same seeds
Any Dice result can be verified independently
Outcomes are tamper-proof and reproducible, even months later

Verdict Summary
Server seed committed before bet
✅ Pass
Casino cannot change randomness after betting
Player client seed control
✅ Pass
Player contributes entropy
Nonce sequencing
✅ Pass
Each bet uses a unique input
Deterministic output
✅ Pass
Same inputs always produce same result
Overall Verdict
🟢 Deterministic and Provably Fair
All tested Dice outcomes are fully deterministic and can be independently reproduced using the disclosed server seed, client seed, and nonce.
How Dice Seed, Nonce, and Determinism Work
How Dice Seed, Nonce, and Determinism Work
1.1 Server Seed Commitment
Before any bet is placed, the casino generates a secret server seed and publicly commits to it by displaying its SHA-256 hash to the player. This cryptographic commitment prevents the casino from changing the seed after seeing player actions. Upon game completion, the revealed server seed is verified by hashing it and confirming it matches the pre-committed hash, proving the outcome was predetermined.
Code Implementation:

Real Example from Live Data:
Verification:
1.2 Player Client Seed Control
Players have full control over their client seed through the Duel UI, allowing them to view, modify, or randomize it at any time before placing bets. This ensures players contribute their own entropy to the RNG process. This player-controlled input makes it mathematically impossible for the casino to predict or manipulate outcomes, as the final result depends on a value only the player knows in advance. Players can view and change their client seed at any time via the Duel UI.

Code Implementation:

Real Data Evidence: From the test data, client seeds are player-controlled and vary:
"G3blCQBWQdVfM8sx"
"13aS4FO1Iz"
"32GD7vC9fH"
"ewGBx04VbY"
"0ygEXdJyQm"
1.3 Nonce Incrementation
The nonce begins at 0 and increments sequentially by 1 for each bet under the same server/client seed pair, ensuring every bet produces a unique RNG input even with identical seeds. This prevents outcome repetition. When a new server seed is issued (after rotation), the nonce resets to 0, and the system verifies nonces are never reused within the same seed session to guarantee cryptographic uniqueness.
Code Implementation:

Real Data Verification:
1.4 Deterministic Mapping
The RNG algorithm is fully deterministic; given the same server seed, client seed, and nonce, it will always produce the exact same output, allowing any party to independently verify results at any time. This mathematical certainty is the cornerstone of provably fair gaming: the test confirms that all 100+ live game results from the dataset match precisely when recalculated using the revealed seeds.
Code Implementation:

Real Example Verified:
Verification:
Technical Evidence & Verification
Technical Evidence & Verification
This section indexes the technical artifacts used to verify Dice seed handling, nonce behavior, and determinism. All evidence is reproducible using the linked scripts and datasets. Inline content is intentionally minimal; full artifacts are available via links.
Generated: 2026-02-06
Audit Status: ✅ ALL TESTS PASSED (13/13)
1. Evidence Coverage
Verification Category
Status
Evidence Location
Full dataset determinism
✅ VERIFIED
6,200/6,200 bets matched
2. Code Reference
2.1 Test Suite (Audit Execution Checklist)
Primary Test File: tests/dice/DiceAuditExecutionChecklistTests.ts
Test Case
Line Reference
Purpose
2.2 Core Algorithm Implementation
Dice Result Generator: src/dice/DiceNumbersGenerator.ts
Component
Line Reference
Description
3. Datasets Used
3.1 Primary Dataset
Dataset: duel-dice-sim-1767531771390.json
Metadata:
Source: Live Dice game data from https://duel.com/dice
Schema:
duel-dice-sim-min-reveal-v2Created: 2026-01-04T12:54:09.990Z
File Size: 27,600 lines (~828.8 KB)
Total Records: ~6,200 bets across 24 seed sessions
4. Reproduction Instructions
4.1 Local Reproduction Steps
Clone the repository, install dependencies, and run the tests specific to Dice Seed, Nonce, and Determinism:
All requested tests should pass (~2m), covering dice seed, nonce, and determinism.
Expected Output:
4.2 Audit Reproducibility Pinning
Git Commit:
fa913ab94883d06950d3c63bbb7007f927648131Dataset Hash (SHA-256):
ba3ae70517c7f77e07eaced46900a5f94ebc02bf11c41502fac894f142efb799npm Version: 11.3.0 (minimum: 8.x)
Node Version: v22.11.0 (minimum: v16.x)
2. RNG & Entropy Model
What Was Tested
The random number generator used to produce Dice results
The sources of randomness (entropy) feeding the RNG
Whether outcomes are unbiased and evenly distributed
Whether randomness is isolated per bet and per player
What This Means for Players
Dice outcomes are generated fairly and cannot be skewed
No hidden randomness or server-side tricks influence results
Every number between 0.00 and 100.00 has an equal chance
Outcomes cannot be predicted or manipulated across bets

Verdict Summary
RNG derived only from disclosed inputs
✅ Pass
No hidden randomness affects outcomes
Entropy purity
✅ Pass
No timestamps, server randomness, or external inputs
Output uniformity
✅ Pass
Results are evenly distributed as expected
No state leakage
✅ Pass
Previous bets do not influence future results
Overall Verdict
🟢 Unbiased and Cryptographically Sound
All tested Dice outcomes are generated using only the disclosed server seed, client seed, and nonce. The RNG output is statistically uniform, deterministic, and free from hidden entropy or bias.
How Dice Randomness & Entropy Works
How Dice Randomness & Entropy Works
This section explains how Dice randomness is generated, what entropy sources are used, and how the RNG ensures unbiased and isolated outcomes. Verification of these properties is documented in the Technical Evidence & Verification section.
2.1 RNG Function Implementation
The Duel Dice RNG implementation uses HMAC-SHA256 with deterministic inputs (serverSeed, clientSeed, nonce) and employs rejection sampling against a calculated fair range (MAX_FAIR = 4,294,960,534) to eliminate modulo bias, producing unbiased dice outcomes from 0.00 to 100.00. Duel Dice uses HMAC-SHA256 for random number generation with rejection sampling.
Unit Test Declaration: "RNG depends only on (serverSeed, clientSeed, nonce)" ✅
Code Implementation:

HMAC-SHA256 Base Implementation:
2.2 Entropy Sources
The system uses three cleanly separated entropy sources—server seed (casino-controlled base randomness), client seed (player-contributed entropy), and nonce (system-managed uniqueness)—with no external contamination from timestamps, Math.random(), or server-side state. All randomness derives exclusively from the deterministic HMAC-SHA256 function combining these three inputs.
Unit Test Declaration: "No mixed entropy sources" ✅
Server Seed
Casino
Base randomness
Client Seed
Player
Player-contributed entropy
Nonce
System
Uniqueness per bet
Test Implementation:

No Other Sources Used:
❌ No timestamps
❌ No Math.random()
❌ No external APIs
❌ No server-side state
✅ Only: HMAC-SHA256(serverSeed,
${clientSeed}:${nonce})
2.3 Bias Elimination (Rejection Sampling)
Rejection sampling eliminates modulo bias by discarding any raw 32-bit values ≥ MAX_FAIR (4,294,960,534), ensuring the remaining values map uniformly to the 0–10,000 range with a rejection rate of only 0.000157%. This guarantees that each possible dice outcome (0.00 to 100.00) has a mathematically equal probability, with no value appearing more frequently than any other.
Unit Test Declaration: "Mapping from RNG → game ranges is unbiased" ✅
The code implements rejection sampling to eliminate modulo bias.
Mathematical Explanation:
Why This Matters:
Probability Calculation:
Rejection rate: 6,761 / 4,294,967,295 = 0.000157% (extremely rare)
Each outcome (0.00 to 100.00) has exactly equal probability

Code Implementation:
2.4 RNG (Random Number Generator) Isolation
The generateDiceResult() function is completely stateless with no class-level variables affecting outcomes—each bet's result depends solely on its unique (serverSeed, clientSeed, nonce) input tuple. Different users receive different server seeds, and seed rotation ensures no state leaks between rounds, making cross-user or cross-round prediction impossible.
Unit Test Declaration: "RNG state does not leak across rounds or users" ✅
Code Implementation:

Technical Evidence & Verification
Technical Evidence & Verification
This section indexes the technical artifacts used to verify Dice RNG implementation, entropy sources, bias elimination, and isolation properties. All evidence is reproducible using the linked scripts and datasets. Inline content is intentionally minimal; full artifacts are available via links.
Generated: 2026-02-06
Audit Status: ✅ ALL TESTS PASSED (4/4 RNG tests)
1. Evidence Coverage Summary
Verification Category
Status
Evidence Location
RNG depends only on (serverSeed, clientSeed, nonce)
✅ VERIFIED
2. Code References
2.1 Test Suite (RNG & Entropy Model Tests)
Primary Test File: tests/dice/DiceAuditExecutionChecklistTests.ts
Test Block: Lines 55-80 - "Randomness & Entropy Model"
Test Case
Line Reference
Purpose
RNG depends only on (serverSeed, clientSeed, nonce)
Verifies deterministic function with no external entropy
Mapping from RNG → game ranges is unbiased
Validates rejection sampling eliminates modulo bias
RNG state does not leak across rounds or users
Ensures stateless operation with no cross-contamination
Test Setup: Lines 56-66 - Pre-verification determinism check
2.2 Core RNG Implementation
RNG Generator: src/dice/DiceNumbersGenerator.ts
Component
Line Reference
Description
3. Datasets Used
3.1 Primary Dataset
Dataset: duel-dice-sim-1767531771390.json
Metadata:
Source: Live Dice game data from https://duel.com/dice
Schema:
duel-dice-sim-min-reveal-v2Created: 2026-01-04T12:54:09.990Z
File Size: 27,600 lines (~828.8 KB)
Total Records: 1,200 bets across 24 seed sessions
3.2 Fields Used for RNG Verification
RNG-Specific Fields:
serverSeed- Server-provided entropy (64 hex characters)clientSeed- Player-provided entropy (alphanumeric string)nonce- Uniqueness counter (integer)drawnNumber- Generated outcome (0.00 - 100.00)result- Raw result value before division (0-10000)
Entropy Analysis:
No
timestampfield used in RNG computationNo
Math.random()calls in codebaseNo external API calls during result generation
Pure function: output depends only on (serverSeed, clientSeed, nonce)
4. Reproduction Instructions
4.1 Local Reproduction Steps
Expected Output:
4.2 Audit Reproducibility Pinning
Git Commit:
fa913ab94883d06950d3c63bbb7007f927648131Dataset Hash (SHA-256):
ba3ae70517c7f77e07eaced46900a5f94ebc02bf11c41502fac894f142efb799npm Version: 11.3.0 (minimum: 8.x)
Node Version: v22.11.0 (minimum: v16.x)
3. Verifier Parity
What Was Tested
Live Dice game outcomes versus independent verifier re-computation
Backend game logic alignment with verifier logic
Deterministic parity across real production bets
What This Means for Players
The verifier is not a "simulation" or approximation
Every bet you play can be independently recomputed
The casino cannot alter outcomes after bets are placed
Past and future bets produce identical results when re-verified with the same inputs

Bet Sizes
$0.1 - $10
Live Bets Tested
6,200
Matches
6,200
Mismatches
0
Parity Rate
✅ 100%
Verdict Summary
Live result re-computation
✅ Pass
Verifier recalculates exact outcomes
RNG logic alignment
✅ Pass
Same RNG logic used live and in verifier
Deterministic parity
✅ Pass
No divergence across systems
Production data tested
✅ Pass
Real bets, not mock data
Overall Verdict:
🟢 Live Game and Verifier Fully Aligned
All tested live Dice outcomes matched the independent verifier exactly. This confirms that the verifier reflects real gameplay behavior and that outcomes cannot be altered post-bet.
How Verifier Parity Works
Verifier Parity
This section validates the most critical requirement of any provably fair system: that the independent verifier produces exactly the same outcomes as the live game. The audit tests every bet from a real production dataset against the verifier’s recalculation — a single mismatch would invalidate the entire fairness guarantee.
3.1 Why Parity Matters
If the verifier produces results that differ from the live game, players cannot trust the verification—the entire provably fair system becomes meaningless. 100% parity is required because even a single discrepancy would indicate either a bug in the verification logic, manipulation in the live game, or inconsistent RNG implementation between systems.

Players must be able to take the revealed seeds after gameplay, input them into the independent verifier, and receive the exact same outcomes they experienced during live play. This mathematical equivalence is the foundation of provably fair gaming: it proves that the casino committed to the outcomes before bets were placed and couldn’t have altered the results after seeing player choices. Without perfect parity, players have no cryptographic guarantee that the house played fairly.
3.2 How Parity Works
The audit verifier recalculates every game result by running the same generateDiceResult() function with the revealed seeds and compares each output against the actual live game outcomes stored in the test dataset. Every single bet from the dataset must produce an exact match. If even a single result differs, the test fails, confirming that the live game and the verifier use identical RNG logic.
Unit Test Declaration: "Generator produces the same numbers as Duel bet Dice verifier" ✅
Code Implementation:

Test Data Source:
3.3 Test Results
A comprehensive test of 6,200 real bets (mixed $0.01 and $10 wagers) from live Duel.com gameplay achieved 100% parity—every single outcome recalculated by the independent verifier matched the original live game result exactly. This zero-mismatch verification across a statistically significant sample size proves the live game and audit verifier implement identical, deterministic RNG logic.
From Live Data File:
Created: 2026-01-04T12:54:09.990Z
Source: https://duel.com/dice
Total Bets: 6,200 (across 4 phases, 125 seed pairs)
Matches: 6,200 / 6,200
Mismatches: 0
Parity Rate: 100% ✅
Sample Verification:
Technical Evidence & Verification
Technical Evidence & Verification
This section indexes the technical artifacts used to verify that the independent Dice verifier produces identical outcomes to the live game. All evidence is reproducible using the linked scripts and datasets. Inline content is intentionally minimal; full artifacts are available via links.
Generated: 2026-02-11
Audit Status: ✅ ALL TESTS PASSED (1/1 Verifier Parity test + 1,009 live game verifications)
1. Evidence Coverage Summary
Unit Test - Basic Verifier Parity
✅ PASS
Single isolated test case verifying generator output matches known Duel.com result
Live Game Parity - Full Dataset
✅ PASS
1,009 real production bets verified against independent verifier
Determinism Verification
✅ PASS
Same (serverSeed, clientSeed, nonce) → same outcome 100% of the time
Code Implementation Review
✅ PASS
RNG algorithm matches documented specification
2. Code References
2.1 Test Suite (Verifier Parity Tests)
Primary Test File: tests/dice/DiceAuditExecutionChecklistTests.ts
Deterministic parity verification
Recomputes all 1,009 live results and asserts exact match with verifier
Unit Test File: tests/dice/DuelDiceNumbersGeneratorTests.ts
Basic verifier parity
Single test case confirming generator matches Duel.com verifier output
2.2 Core Algorithm Implementation
Dice Result Generator: src/dice/DiceNumbersGenerator.ts
3. Datasets Used
3.1 Primary Dataset
Dataset: dataScripts/dice/duel-dice-sim-1767531771390.json
Metadata:
Source: Live Dice game data from https://duel.com/dice
Schema: duel-dice-sim-min-reveal-v2
Created: 2026-01-04T12:54:09.990Z
File Size: 27,600 lines (~828.8 KB)
Total Records: 1,009 bets across 22 seed sessions
3.2 Fields Used for Verifier Parity
Parity Verification Fields:
serverSeed- Server-provided entropy (64 hex characters)clientSeed- Player-provided entropy (alphanumeric string)nonce- Uniqueness counter (integer)drawnNumber- Live game outcome (0.00 - 100.00)result- Raw result value from live game (0-10000)
Parity Test Method:
Extract (serverSeed, clientSeed, nonce) from live bet data
Recompute outcome using independent verifier:
generator.generateDiceResult()Compare verifier output with
drawnNumberfrom live gameAssert exact match (100% parity required)
4. Reproduction Instructions
4.1 Local Reproduction Steps
Expected Output:
4.2 Audit Reproducibility Pinning
Git Commit:
fa913ab94883d06950d3c63bbb7007f927648131Dataset Hash (SHA-256):
ba3ae70517c7f77e07eaced46900a5f94ebc02bf11c41502fac894f142efb799npm Version: 11.3.0 (minimum: 8.x)
Node Version: v22.11.0 (minimum: v16.x)
4. RTP & Payout Logic Validation
What was tested
How Dice outcomes are mapped to wins and losses
Whether payouts are calculated correctly for all bet types
Whether the advertised RTP matches the actual game behavior
Whether results remain consistent across different targets and bet directions
What this means for players
Wins and losses are calculated exactly as the game rules describe
Payouts cannot be altered after the roll is generated
The house edge is consistent and transparent across all bets
Over time, the game returns the percentage it claims to return
Advertised vs Observed RTP
Advertised RTP
99.00%
Observed RTP (Simulation)
✅98.99%
Simulation Size
100,000,000 rounds
Deviation
Within expected variance +-0.05%
The observed RTP converges tightly toward the advertised RTP as the number of rounds increases, which is expected behaviour for a fair Dice game.
Verdict Summary
Check
Result
What this means
Dice roll mapping
✅ Pass
Rolls are derived correctly from RNG output
Win/loss logic
✅ Pass
Outcomes are evaluated correctly
Payout calculation
✅ Pass
Multipliers and payouts match rules
RTP behavior
✅ Pass
RTP converges to advertised value
Overall Verdict:
🟢 RTP behaves as advertised
The Dice game’s payout logic is correct, deterministic, and statistically consistent with the advertised RTP. No abnormal bias or payout manipulation was observed.
How Dice Payout and RTP is Calcualted
How RTP & Payout Logic Works
This section verifies that the game's payout mechanics are mathematically correct and transparently implemented. Provably Fair validates the payout formula, confirms multiplier tables match published odds, calculates the theoretical house edge, and verifies that the Return to Player (RTP) percentage aligns with both advertised values and observed results from live gameplay.
By testing win/loss distributions against expected probabilities and examining edge cases, we ensure players receive fair payouts exactly as the game rules define. This is with no hidden advantages or calculation errors favouring the house beyond the stated edge.
4.1 Payout Formula
Winning payouts are calculated as Bet Amount × Multiplier (from predefined game profiles based on target number and bet direction), while losing bets return zero. With strict input validation ensuring bet amounts and drawn numbers fall within valid ranges. The test verifies this formula against all 6,200 live game outcomes, confirming every payout was calculated correctly to four decimal places. All multipliers are derived using the formula Multiplier = 99.9 / Win Chance %, ensuring a consistent 0.1% house edge (99.9% RTP) across all possible bet configurations.
Unit Test Declaration: "Payout rules correctness" ✅
Formula:
Code Implementation:

Test Implementation:
4.2 Multiplier Formula & House Edge
All multipliers are calculated using the formula Multiplier = 99.9 / Win Chance %, which embeds a consistent 0.1% house edge across every possible bet. Whether betting on a 1% longshot (99.9x) or a 98% favorite (1.019x). This ensures the theoretical RTP remains exactly 99.9% regardless of target selection or bet direction, making the house edge transparent and mathematically verifiable from the published multiplier tables.
House Edge: The mathematical advantage the casino holds over players, expressed as a percentage of each bet the casino expects to keep as profit over time.
e.g., A 0.1% house edge means for every $100 wagered, the casino statistically retains $0.10 while returning $99.9 to players. This ensures the casino remains profitable while still offering fair, near-even odds to players.
RTP (Return to Player): RTP is the percentage of total wagered money a game is mathematically expected to pay back to players over time. It's the inverse of house edge (RTP = 100% - House Edge). For example, a 99.9% RTP means players statistically receive $99.90 back for every $100 wagered, with the remaining $0.10 going to the casino as profit.
Multiplier Calculation:
Where 99.9 = (100 - 0.1% house edge)
Example Calculations:
Target 50 Over:
Win Chance: 50%
Multiplier: 99.9 / 50 = 1.998x
RTP: 50% × 1.998 = 99.9%
House Edge: 100% - 99.9% = 0.1%
Target 99 Over:
Win Chance: 1%
Multiplier: 99.9 / 1 = 99.9x
RTP: 1% × 99.9 = 99.9%
House Edge: 0.1%
Target 2 Under:
Win Chance: 2%
Multiplier: 99.9 / 2 = 49.95x
RTP: 2% × 49.95 = 99.9%
House Edge: 0.1%
Actual Multiplier Table (Sample):
4.3 RTP Validation
The test mathematically verifies every multiplier in both ABOVE_NUMBER and BELOW_NUMBER profiles by calculating Win Probability × Multiplier for all 98 target values, confirming each falls within the expected 99.9%-100% RTP range. This proves the advertised 99.9% RTP (0.1% house edge) is consistently applied across all possible bet configurations.
Test: "Advertised RTP matches theoretical RTP" ✅
Code Implementation:

Results:
All targets (1-99) have RTP between 99.9% and 100%
Actual RTP: 99.9% (0.1% house edge)
4.4 Simulated RTP
To make things interesting, we did a live simulation of bets placed with the Monte Carlo Casino. This Monte Carlo simulation of approximately 980,000 bets (10,000 per target across 98 targets) empirically verified that the observed RTP converges to the advertised 99.9% within acceptable statistical margins.
Each individual target stayed within ±5% and the aggregate RTP within ±1%. This large-scale simulation confirms the theoretical mathematics hold true in practice, proving the game performs fairly over statistically significant sample sizes.
A simulation of 10,000 bets per target was run to verify RTP converges to the advertised value.
Test: "Advertised RTP matches simulated RTP" ✅ (113281ms = 113 seconds)
Code Implementation:
Simulation Details:
This simulator runs nearly one million fake bets using the exact same RNG and payout code as the live game to verify that players actually receive the advertised 99.91% RTP in practice. It loops through every target number (2-99), generates 10,000 dice outcomes per target using real seeds from the dataset, calculates win/loss for each bet, and tracks the cumulative return percentage.

Results:
Targets Tested: 2 through 99 (98 targets)
Samples per Target: 10,000 bets
Total Simulated Bets: ~980,000
Execution Time: 113 seconds
Result: RTP converges to 99.9% ± 1% margin ✅
Technical Evidence & Verification
Technical Evidence & Verification
This section indexes the technical artifacts used to verify Dice payout mechanics, multiplier formulas, theoretical RTP calculations, and simulated RTP validation. All evidence is reproducible using the linked scripts and datasets. Inline content is intentionally minimal; full artifacts are available via links.
Generated: 2026-02-11
Audit Status: ✅ ALL TESTS PASSING (3/3 RTP & Payout tests)
1. Evidence Coverage Summary
Payout Formula Verification
✅ PASS
1,009 live payouts verified against formula
Theoretical RTP Validation
✅ PASS
All 98 targets confirm 99.9% RTP (0.1% house edge)
Simulated RTP Convergence
✅ PASS
~980,000 simulated bets converge to advertised RTP
2. Code References
2.1 Test Suite (RTP & Payout Tests)
Primary Test File: tests/dice/DiceAuditExecutionChecklistTests.ts
Payout rules correctness
Verifies all 1,009 live payouts match formula (4 decimal precision)
Advertised RTP matches simulated RTP
Simulates ~980,000 bets, confirms RTP converges to 99.9%
2.2 Core Implementation
Payout Calculator: src/dice/DiceWinCalculator.ts
Multiplier Tables: src/dice/DiceGameProfiles.ts
RTP Simulator: src/dice/DiceGameSimulator.ts
3. Datasets Used
3.1 Primary Dataset (Live Payout Verification)
Dataset: dataScripts/dice/duel-dice-sim-1767531771390.json
Metadata:
Source: Live Dice game data from https://duel.com/dice
Total Records: 1,009 bets
Used For: Verifying live payouts match calculated formula
3.2 Fields Used for Payout Verification
Payout Verification Fields:
betAmount- Wager amount (USD)drawnNumber- Dice outcome (0.00 - 100.00)targetNumber- Player-selected targetoverTheTarget- Bet direction (true = over, false = under)winAmount- Actual payout from live game
Verification Method:
Extract (betAmount, drawnNumber, targetNumber, overTheTarget) from live data
Calculate expected payout:
DiceWinCalculator.calculateWinnings()Compare calculated payout with
winAmountfrom live gameAssert match to 4 decimal places4
4. Reproduction Instructions
4.1 Local Reproduction Steps
Expected Output (Payout Formula):
Expected Output (Theoretical RTP):
Expected Output (Simulated RTP):
4.2 Audit Reproducibility Pinning
Git Commit:
fa913ab94883d06950d3c63bbb7007f927648131Dataset Hash (SHA-256):
ba3ae70517c7f77e07eaced46900a5f94ebc02bf11c41502fac894f142efb799npm Version: 11.3.0 (minimum: 8.x)
Node Version: v22.11.0 (minimum: v16.x)
5. Exploit & Edge-Case Testing
What Was Tested
Attempts to break provably fair guarantees by:
Predicting outcomes before betting
Manipulating results after betting
Gaining unfair advantage via implementation flaws
What This Means for Players
Outcomes cannot be predicted in advance
Results cannot be altered after a bet is placed
No known exploit paths allow unfair advantage
Exploit Test Summary
Exploit Category
Result
Outcome prediction
✅ PASS
Post-bet manipulation
✅ PASS
Seed lifecycle abuse
✅ PASS
Nonce reuse or desync
✅ PASS
RNG bias exploitation
✅ PASS
Cross-bet or cross-user influence
✅ PASS
All tested exploit categories failed to produce any unfair advantage.
How Exploit & Edge-Case Testing Work
How Exploit & Edge-Case Testing Work
This section validates that the provably fair system cannot be manipulated by either players or the casino through known attack vectors. An exploit would allow a player or the casino to predict outcomes, manipulate results, or gain an unfair advantage by abusing weaknesses in the provably fair implementation.
This audit evaluates whether any such conditions are possible under realistic gameplay constraints.
5.1 What Constitutes an Exploit
An exploit in a provably fair system would allow one party to gain an unfair advantage by violating the fundamental guarantees of fairness:
Outcome Prediction
Knowing the result before betting
Player
Casino loses revenue to advantage players
Result Manipulation
Changing outcome after bet placed
Casino
Players lose without fair chance
Seed Leakage
Accessing unrevealed server seeds
Player
Predictable outcomes, guaranteed wins
Nonce Replay
Reusing nonces to recreate favorable outcomes
Player
Cherry-picking winning results
RNG Bias
Non-uniform outcome distribution
Casino
House edge higher than advertised
Verification Bypass
Preventing players from verifying results
Casino
Undetectable manipulation
5.2 Exploit Reference Framework
Exploit testing is based on the ProvablyFair.org Exploit Reference Database, a curated catalog of real, historically observed failures in provably fair systems.
The database includes exploit classes derived from:
Incorrect seed lifecycle handling
Nonce reuse or unintended resets
Mixed or hidden entropy sources
Stateful RNG implementations
Hash truncation or modulo bias errors
Cross-round or cross-user state leakage
High-Level Testing Framework
For each exploit class in the reference database:
Identify the historical failure pattern - Select a known real-world exploit
Target the corresponding invariant - Determine which fairness guarantee is at risk
Simulate realistic attack conditions - Test under actual gameplay constraints
Validate system response - Confirm the exploit is prevented
What Would Break Fairness
Server seed revealed before bet
Player can predict outcomes
Timing analysis
Hash mismatch on reveal
Casino can swap seeds
Hash comparison
Nonce skip or reuse
Verification fails
Sequence analysis
Non-deterministic output
Cannot verify results
Repeat testing
Hidden entropy injection
Outcomes unverifiable
Code audit
Verifier logic differs from live
False verification
Parity testing
Exploit Coverage Overview
Outcome prediction
Outcomes are unpredictable before betting
Post-bet manipulation
Results cannot be altered after a bet is placed
Seed lifecycle abuse
Server seed commitment cannot be bypassed
Nonce misuse
Each bet is unique and irreversible
RNG bias exploitation
Every outcome has an equal chance
State leakage
Bets are isolated across rounds and players
5.3 Testing Approach (High Level)
For each exploit class:
A known historical failure pattern is selected from the reference database
The corresponding provably fair invariant is targeted
The system is tested under realistic gameplay conditions
Any deviation from expected behaviour is flagged for review
DIsclosure
Exploit procedures, payloads, and reproduction steps are intentionally abstracted in the public report to avoid disclosing actionable attack vectors.
Technical Evidence & Verification
Technical Evidence & Verification
1. Exploit Coverage Matrix
Exploit Class
Targeted Invariant
Result
Evidence
Seed manipulation
Commit-reveal integrity
✅ PASS
Seed tests
Seed replay
Seed uniqueness
✅ PASS
Dataset checks
Nonce reuse
Nonce monotonicity
✅ PASS
Nonce sequencing
Nonce desync
Bet ordering integrity
✅ PASS
Transition tests
Client seed abuse
Client entropy isolation
✅ PASS
RNG dependency
Mixed entropy
Entropy isolation
✅ PASS
Code inspection
RNG bias
Uniform distribution
✅ PASS
Bias tests
Hash truncation
Full hash usage
✅ PASS
HMAC verification
State leakage
Stateless RNG
✅ PASS
Isolation tests
Cross-user influence
Session isolation
✅ PASS
Seed scoping
2. Illustrative Exploit Attempt (Redacted)
Example: Nonce Reuse / Replay Attack
Exploit Goal
Attempt to reproduce a favourable outcome by reusing a previously observed (serverSeed, clientSeed, nonce) tuple.
Observed Behavior
Nonce increments strictly per bet
No reuse detected within any seed session
Identical inputs only reproduce historical outcomes
Result
❌ Exploit not possible
This behaviour is consistent across all observed seed sessions.
3 Verified Exploit Invariants
The following invariants were tested and verified:
Invariant
Result
Outcomes cannot be predicted before betting
✅ VERIFIED
Outcomes cannot be altered after betting
✅ VERIFIED
No replay of favorable outcomes
✅ VERIFIED
No cross-bet influence
✅ VERIFIED
No cross-user influence
✅ VERIFIED
No client-side leverage over server entropy
✅ VERIFIED
4 Disclosure & Limitations
Detailed exploit procedures, payloads, and reproduction steps are intentionally excluded from this public report to prevent misuse.
Full Exploit Test Artifacts
Full exploit test artifacts are retained internally by ProvablyFair.org and may be disclosed to the operator under NDA if required.
6. Player Verification Guide
Provably Fair gaming shifts the burden of proof from the casino to mathematics. Instead of asking players to trust that outcomes are fair, the casino provides complete transparency. Every seed, every nonce, every calculation is available for independent verification. This section serves as a comprehensive guide for players who want to confirm their game results, from simple one-click verification using Duel's built-in tools to running the exact HMAC-SHA256 algorithms yourself.
Whether you're checking a single suspicious bet or auditing your entire play history, the process remains the same: if your calculated result matches the displayed result, the game was provably fair. The code provided in this section is derived directly from Duel's production codebase, ensuring verification parity between what you calculate and what the casino calculates.
Independently Verify a Dice Game Result
Every Dice outcome can be reproduced using publicly disclosed inputs. There are no hidden variables and no reliance on private backend data. If your independently calculated result matches the displayed result, the game is provably fair.
All required inputs for result generation are publicly available.
No hidden parameters or undisclosed backend logic are involved.
The outcome can be reproduced independently by any player.
A matching recalculated result confirms the integrity of the game round.
How to Verify
Standard Verification: Most players can verify results directly through the Duel user interface.
Advanced Verification: For technical users, the complete verification logic, along with reproducible test artefacts, is provided below for independent validation.

Summary Table
Server Seed
Verify tab
Casino entropy source
Client Seed
Verify tab
Player entropy input
Nonce
Verify tab
Ensures uniqueness
Result
Results tab
Must match recomputed output
Overall Verdict
🟢 Any player can reproduce Dice results
🟢 Only disclosed inputs are used
🟢 Identical inputs always produce identical output
Visual Walkthrough (Instruction Layer)
Visual Walkthrough (Instruction Layer)
6.1 How to Verify Your Bet
Step 1: Open Bet Details
After any bet, click on the bet result to open the details modal
You'll see the bet ID, result, multiplier, and target


Step 2: Click "Verify" Tab
In the bet details modal, switch from "Results" to "Verify" tab
This opens the verification interface that is internally linked to Provably Fair verification model

Step 3: Review Your Seeds
Client Seed: Your player-controlled seed (e.g.,
G3blCQBWQdVfM8sx)Server Seed: The revealed server seed (64 hex characters)
Server Seed Hash: The pre-committed hash shown before the bet
Nonce: The bet number in sequence (starts at 0)
Once you click on Rotate Seed, a new popup opens with verification results and sample code to verify the bet.
Step 4: Verify the Result
The verifier shows the calculated result based on your seeds
Compare this to your actual game result — they must match exactly
Use "Copy code" to get the JavaScript verification script as shown in the screenshots


6.2 Server Seed Hash in Duel Casino UI
Before placing any bet, you can view the pre-committed server seed hash directly in the game interface:
Click the "Provably Fair" button located below the game controls (shown in Image 1)
View the "Active server seed (Hashed)" field in the modal that appears (shown in Image 2)
Copy this hash using the copy button — this is your proof that the server seed was committed before your bet
The modal also displays your Active client seed, current Nonce, and options to set a New client seed or view the Next server seed (Hashed) for upcoming sessions. Clicking "Rotate seed" will reveal the current server seed and generate a new one for future bets — at which point you can verify that the revealed seed matches the hash you recorded.
Important: Always copy the "Active server seed (Hashed)" before betting if you want to verify later. Once you rotate seeds, the previous hash is replaced.


Manual Verification (Advanced)
Manual Verification (Advanced)
1. Manual Verification (Advanced)
While Duel's built-in verifier is convenient, true provably fair verification means you don't trust any casino-provided tool. Manual verification allows you to:
Run calculations on your own machine with your own code
Eliminate any possibility of a tampered verifier
Understand exactly how your results are generated
Verify using multiple programming languages for cross-confirmation

2. Dice Result Generation
The Dice result generation follows a 4-step cryptographic process. The Dice verification workflow transforms your cryptographic inputs (serverSeed, clientSeed, nonce) into a verifiable result through HMAC-SHA256 hashing and rejection sampling. This deterministic process ensures identical inputs always produce identical outputs, enabling independent verification of any bet.

3. Verify Server Seed Hash
The commit-reveal protocol ensures the casino cannot change the server seed after seeing your bet. Before betting, you see only the SHA-256 hash of the server seed. After the bet, the actual seed is revealed. This function verifies the revealed seed hashes to the same value, proving no manipulation occurred. Before betting, verify the hash matches after reveal:

7. Reproducibility & Artifacts
GitHub Repository
Repository Structure
Commands to Reproduce
Prerequisites
Node.js 16+
npm 8+
Git
Step 1: Clone Repository
Step 2: Install Dependencies
Step 3: Run Tests
Run all tests:
Run Dice-specific tests only.
Step 4: Generate Audit Report
Audit conducted by ProvablyFair.org Last updated: 13/02/2026
Last updated
