SNARKeling Treasure Hunt

First Flight #59
Beginner FriendlyGameFiFoundry
100 EXP
Submission Details
Impact: high
Likelihood: high

Duplicate treasure hashes in circuit means only 9 unique treasures exist

Author Revealed upon completion

Root + Impact

Description

The ALLOWED_TREASURE_HASHES array in circuits/src/main.nr lines 55-66
is supposed to contain 10 UNIQUE treasure hashes, but index 8 and index 9
are identical:

global ALLOWED_TREASURE_HASHES: [Field; 10] = [
1505662313093145631275418581390771847921541863527840230091007112166041775502,
-7876059170207639417138377068663245559360606207000570753582208706879316183353,
-5602859741022561807370900516277986970516538128871954257532197637239594541050,
2256689276847399345359792277406644462014723416398290212952821205940959307205,
10311210168613568792124008431580767227982446451742366771285792060556636004770,
-5697637861416433807484703347699404695743570043365849280798663758395067508,
-2009295789879562882359281321158573810642695913475210803991480097462832104806,
8931814952839857299896840311953754931787080333405300398787637512717059406908,
-961435057317293580094826482786572873533235701183329831124091847635547871092, // Index 8
-961435057317293580094826482786572873533235701183329831124091847635547871092 // Index 9 DUPLICATE!
];

Confirmed in test file circuits/src/tests.nr line 30:

let treasures: [Field; 10] = [1, 2, 3, 4, 5, 6, 7, 8, 10, 10];
// ^^ ^^ Both are treasure 10 (same secret)

Treasures[8] and Treasures[9] have identical secret values, meaning
the circuit only has 9 unique treasures despite being designed for 10.

Risk

Likelihood:

  • This is a deployment-time configuration error, present from launch

  • Any participant can generate a valid proof for the duplicate secret

Impact:

  • Only 9 unique treasures exist in the circuit instead of 10

  • 100 ETH is allocated for 10 treasures but only 9 unique ones exist

  • One treasure secret can be used to claim twice, breaking hunt fairness

  • Hunt integrity is compromised — participants cannot trust the design

Proof of Concept

The duplicate is confirmed in two separate files:

  • ALLOWED_TREASURE_HASHES[8] and ALLOWED_TREASURE_HASHES[9] in main.nr are byte-for-byte identical

  • treasures[8] = 10 and treasures[9] = 10 in tests.nr confirm both use the same secret value

Both point to the same secret, creating only 9 unique treasures instead of 10.

Recommended Mitigation

A new unique 10th treasure secret must be generated and the duplicate
replaced. The circuit must then be recompiled to update the verifier.

  1. Generate a new unique 10th treasure secret

  2. Compute its Pedersen hash

  3. Replace duplicate at line 65: ALLOWED_TREASURE_HASHES[9] = NEW_UNIQUE_HASH

  4. Recompile: ./circuits/scripts/build.sh

  5. Regenerate Verifier.sol

  6. Verify all 10 hashes are now unique

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!