Self-audit on sepolia

Attack logs

Self-audit on sepolia

Every row below is one line of the table "What is checked, and how" in docs/security/threat-model.md, in order.

Hearth XAUt self-audit on sepolia, 2026-09-05T16:59:44.790Z
vault 0x77f701101d66FbD522A3bFdC2c00DB09a4F57daE, pool 0x9a2888aca42c707A3BC0D561FdF6ff8Abfda5201, asset 0xe4FcF848739845BC81Dee1d5352cf3844F0a60C7
period 1, 5 savers, bracket 2^34, tier liquidity 0 XAUt
Every row below is one line of the table "What is checked, and how" in docs/security/threat-model.md, in order.

Row 1. A stranger cannot read a saver's principal, winnings, weight and credit
  NOT RUN: no awarded draw holds a weight for the saver at account index 2 yet

Row 2. The pool's exact total time-weighted balance is not obtainable
  the pool's aggregate lives in storage slot 6 of the vault as 0x37c82e5c57bee96c763d6633ee35d0d376d0a4fc37ff0000000000aa36a70600, a euint128 with no getter
  slot 7 holds the matching total balance handle and slot 8 its timestamp, 2026-09-05T16:40:24.000Z, which is what identifies the three words
  a fresh wallet 0x2B1Dab8331C808934D75Fc7565DE3A89431b22f7 asks for it: NotEntitledError: the access control list does not allow 0x2B1Dab8331C808934D75Fc7565DE3A89431b22f7 to decrypt 0x37c82e5c57bee96c763d6633ee35d0d376d0a4fc37ff0000000000aa36a70600 on 0x77f701101d66FbD522A3bFdC2c00DB09a4F57daE
  the deployer and owner 0xd57D8F8A615F35133D8121e58F4ed778A4F612E9 asks for it: NotEntitledError: the access control list does not allow 0xd57D8F8A615F35133D8121e58F4ed778A4F612E9 to decrypt 0x37c82e5c57bee96c763d6633ee35d0d376d0a4fc37ff0000000000aa36a70600 on 0x77f701101d66FbD522A3bFdC2c00DB09a4F57daE
  the balance handle in slot 7 is 0x68f77036c4de4566ed6e80a3d32029fc72946e9bf5ff0000000000aa36a70500
  only 0 awarded draw is on chain, so the bracket difference has nothing to compare against yet
  PASS: the aggregate handle refused both a random wallet and the owner; the bracket difference needs two awarded draws and this pool has 0

Row 3. A flash deposit earns almost nothing
  NOT RUN: the deposit has to land a fixed number of seconds before a period ends, which needs the local clock

Row 4. Fake savers cannot stall a draw
  NOT RUN: registering 25 addresses and running the whole walk against them is a local-only expense

Row 5. Nobody can choose who is evaluated
  NOT RUN: no awarded draw with an unfinished walk exists on this network right now

Row 6. A late close is refused and the draw costs nothing
  NOT RUN: letting a close deadline pass without closing needs the local clock

Row 7. A missed award loses nothing
  NOT RUN: letting a whole evaluation window pass before awarding needs the local clock

Row 8. A reverting yield source does not stop the clock
  NOT RUN: pointing the pool at a broken source needs the owner key and a deploy, so it is kept to the local chain

Row 9. An over-subscribed tier clamps rather than overpaying
  NOT RUN: forcing more winners than a tier can fund needs the local clock to walk the published bracket down first

Row 10. An award proof cannot be replayed against another draw
  NOT RUN: no draw has been awarded on this network yet, so there is no proof to steal

Row 11. Nobody withdraws more than they own
  covered by the property test "keeps every balance, remainder and carry accounted for under a random sequence of actions" in test/Invariants.ts
  NOT RUN: a property test over a random sequence of actions belongs in the suite, not in a live run

Row 12. Money is conserved
  covered by the same property test in test/Invariants.ts, and the payout share is covered by "pays each saver a share of the prizes that tracks their share of the pool" in test/Fairness.ts
  NOT RUN: a property test over a random sequence of actions belongs in the suite, not in a live run

12 rows in 11.4s: 1 PASS, 0 FAIL, 11 NOT RUN
  NOT RUN row 1   A stranger cannot read a saver's principal, winnings, weight and credit
  PASS    row 2   The pool's exact total time-weighted balance is not obtainable
  NOT RUN row 3   A flash deposit earns almost nothing
  NOT RUN row 4   Fake savers cannot stall a draw
  NOT RUN row 5   Nobody can choose who is evaluated
  NOT RUN row 6   A late close is refused and the draw costs nothing
  NOT RUN row 7   A missed award loses nothing
  NOT RUN row 8   A reverting yield source does not stop the clock
  NOT RUN row 9   An over-subscribed tier clamps rather than overpaying
  NOT RUN row 10  An award proof cannot be replayed against another draw
  NOT RUN row 11  Nobody withdraws more than they own
  NOT RUN row 12  Money is conserved