X thread: x.com/provablyfairorgFull report: provablyfair.org/insights/betfury-com-investigationData + scripts: github.com/ProvablyFair-org/betfury-investigation
TL;DR We placed
240,000 live bets on BetFury's Originals (Limbo, Dice, Plinko). Two findings:
1. Their "Provably Fair" implementation does not let a player verify anything about how results are generated. It fails 6 of 7 requirements of a real provably fair system; the 7th is only partially met.
2. In our tests, Limbo returned
97.33% against the
99.02% its own bet panel encodes — a house edge ~2.7x the advertised rate. Dice (99.39%) and Plinko (99.01%), measured the same way at the same time on the same account, were consistent with their advertised math.
Every number below is recomputable from the raw data in the repo. No dependencies, Node.js only, ~15 minutes.
1. The "provably fair" system verifies nothing about fairness BetFury publishes a hash and later reveals a "random seed". The seed format is:
<result>_<random padding>
Limbo: 1.91_XiLQkYQZxcwNxF -> result 1.91x
Dice: 52_FcqvWBAQrkwQbZ -> roll 52
(Those are literally rows 1 of the published datasets — check them yourself.)
The "seed" already contains the finished result. The verifier hashes the answer to confirm the answer didn't change. There is no client seed, no nonce, no published derivation formula, and no way to replay a bet. Nothing upstream of the finished result — no draw, no formula, no odds — is ever shown.
A commitment to a finished result proves non-alteration. It does not prove the result was generated from the odds shown to players. That distinction is the whole point of provable fairness, and it is missing.
2. So we measured what the games actually pay With no formula to audit, the only remaining check is statistical: fixed stake (0.001 USDT), fixed n = 60,000 per game declared before the first bet (pre-commitment manifests are in the repo, timestamped before each game's first round), single account, no bonuses. Money RTP = paid / staked.
Game Bets Measured RTP Advertised Result
Limbo 60,000 97.33% 99.02% -1.69 pts
Plinko 60,000 99.01% 99.02% consistent
Dice 60,000 99.39% 99.02% consistent (control)
Limbo's win rate at the 1.10x target was
88.478% against the
90.01818% win chance BetFury's own panel displayed — 924 missing wins in 60,000 bets.
The controls matter: the same rig, same account, same session that finds Limbo short finds Dice and Plinko on target. The instrument reads honest games as honest.
3. The instant-bust rate nearly doubled The most player-visible symptom is the 1.00x instant bust: the round is over before it even starts, and whatever your target, you lose.
Under the standard Limbo model, P(1.00x) = 1 - R/1.01. At the advertised R = 0.9902 that is 1.96% — one bust in 51 bets. Note what that formula means: the bust rate tracks the gap between R and 1.01, so every point of RTP removed reappears almost one-for-one as additional instant-bust probability.
Run Target Instant busts Rate Frequency
Exploratory (60,000) 2.00x 2,072 3.45% 1 in 29
Confirmatory (60,000) 1.10x 2,130 3.55% 1 in 28
Advertised model any ~1,176 1.96% 1 in 51
954 extra instant losses in the confirmatory capture alone. Two captures at two different targets show the same excess — and the bust probability doesn't depend on the target under the model, which is exactly why both runs land on the same number while the advertised model predicts half of it.
4. Why this is not variance All three games have the same 60,000-bet sample but very different sampling variance — and Limbo's low-variance setting (win ~9 bets in 10, fixed 1.10x payout) should have been by far the tightest of the three.
Game 1-sigma swing Actual difference Result
Dice +/-0.404 pts +0.373 +0.92 sigma (normal)
Plinko +/-0.609 pts -0.012 -0.02 sigma (normal)
Limbo +/-0.135 pts -1.694 12.58 sigma BELOW
Dice and Plinko landed inside an ordinary wobble. Limbo missed by more than 12 times its normal swing. The exact one-sided binomial probability of a result this low under the displayed odds is ~4.1e-35, and all twelve 5,000-bet blocks came in under 98% — the deficit is constant across the capture, not a streak.
Conclusion: the shortfall is systematic, not sampling variation.
Reproduce it yourself Every instrumented round carries BetFury's own hash. SHA256(seed) matches on all 180,000 rounds — the results are BetFury's, not typed up.
git clone https://github.com/ProvablyFair-org/betfury-investigation
node scripts/verify.mjs # re-hash all 180,000 rounds against BetFury's hashes
node scripts/analyze.mjs # RTP, CIs, distribution + independence checks
node scripts/exploratory.mjs # the corroborating 60k run at 2.00x
If you don't trust our capture, run the scripts on a fresh capture of your own and see whether the shortfall reproduces. That is the test that settles it.
What BetFury should do Commit to a seed, not a result (publish SHA256(serverSeed) pre-bet, reveal on rotation); support client seeds; publish seeds, nonces and the derivation formula so every bet can be replayed; certify the RNG and payout logic actually running in production rather than a lab sample; and investigate whether Limbo's live configuration differed from its displayed odds — and if so, correct it and review affected play.
The full report covers methodology, confidence intervals, the model fit and the open questions in detail. We will publicly update the report and this thread if BetFury answers with reproducible evidence. Happy to answer questions or run any additional check on the data that someone here suggests.