{
 "at": "2026-09-15",
 "rpc": "https://rpc.mainnet.chain.robinhood.com",
 "props": [
  {
   "n": 1,
   "pass": true,
   "why": ""
  },
  {
   "n": 2,
   "pass": true,
   "why": ""
  },
  {
   "n": 3,
   "pass": true,
   "why": ""
  },
  {
   "n": 4,
   "pass": true,
   "why": ""
  },
  {
   "n": 5,
   "pass": true,
   "why": ""
  },
  {
   "n": 6,
   "pass": true,
   "why": ""
  },
  {
   "n": 7,
   "pass": true,
   "why": ""
  },
  {
   "n": 8,
   "pass": true,
   "why": ""
  },
  {
   "n": 9,
   "pass": true,
   "why": ""
  },
  {
   "n": 10,
   "pass": true,
   "why": ""
  },
  {
   "n": 11,
   "pass": true,
   "why": ""
  },
  {
   "n": 12,
   "pass": true,
   "why": ""
  },
  {
   "n": 13,
   "pass": true,
   "why": ""
  },
  {
   "n": 14,
   "pass": true,
   "why": ""
  },
  {
   "n": 15,
   "pass": true,
   "why": ""
  },
  {
   "n": 16,
   "pass": true,
   "why": ""
  },
  {
   "n": 17,
   "pass": true,
   "why": ""
  },
  {
   "n": 18,
   "pass": true,
   "why": ""
  },
  {
   "n": 19,
   "pass": true,
   "why": ""
  },
  {
   "n": 20,
   "pass": true,
   "why": ""
  },
  {
   "n": 21,
   "pass": true,
   "why": ""
  },
  {
   "n": 22,
   "pass": true,
   "why": ""
  },
  {
   "n": 23,
   "pass": true,
   "why": ""
  },
  {
   "n": 24,
   "pass": true,
   "why": ""
  },
  {
   "n": 25,
   "pass": true,
   "why": ""
  },
  {
   "n": 26,
   "pass": true,
   "why": ""
  },
  {
   "n": 27,
   "pass": true,
   "why": ""
  },
  {
   "n": 28,
   "pass": true,
   "why": ""
  },
  {
   "n": 29,
   "pass": true,
   "why": ""
  },
  {
   "n": 30,
   "pass": true,
   "why": ""
  },
  {
   "n": 31,
   "pass": true,
   "why": ""
  },
  {
   "n": 32,
   "pass": true,
   "why": ""
  },
  {
   "n": 33,
   "pass": true,
   "why": ""
  },
  {
   "n": 34,
   "pass": true,
   "why": ""
  },
  {
   "n": 35,
   "pass": true,
   "why": ""
  },
  {
   "n": 36,
   "pass": true,
   "why": ""
  },
  {
   "n": 37,
   "pass": true,
   "why": ""
  },
  {
   "n": 38,
   "pass": true,
   "why": ""
  },
  {
   "n": 39,
   "pass": true,
   "why": ""
  }
 ],
 "sabotage": [
  {
   "name": "buyTo targets lambda instead of lambda net of the fee",
   "caught": true,
   "by": 3,
   "why": "the ask did not land on lambda: 101050525262631315657 vs 101000000000000000000"
  },
  {
   "name": "sellTo targets lambda instead of lambda grossed up by the fee",
   "caught": true,
   "by": 4,
   "why": "the bid did not land on lambda: 100697000000000000000 vs 101000000000000000000"
  },
  {
   "name": "the ask is marked DOWN by the fee",
   "caught": true,
   "by": 3,
   "why": "the ask did not land on lambda: 100899025250000000000 vs 101000000000000000000"
  },
  {
   "name": "the bid is marked UP by the fee",
   "caught": true,
   "by": 4,
   "why": "the bid did not land on lambda: 101608737949052775176 vs 101000000000000000000"
  },
  {
   "name": "a bracket is claimed when the pools merely touch",
   "caught": true,
   "by": 35,
   "why": "pools that merely touch produced a trade"
  },
  {
   "name": "one pool is allowed to arbitrage itself",
   "caught": false,
   "declared": "unreachable: for any pool, ask = spot/(1-fee) >= spot*(1-fee) = bid, so a one-pool book always has lo >= hi and `lo < hi` already refuses it. Property 5 and property 7 hold with or without the length check, which is what makes it redundant rather than untested."
  },
  {
   "name": "the bisection walks the wrong way",
   "caught": true,
   "by": 10,
   "why": "the sides do not balance: 164543506991443470139 vs 0"
  },
  {
   "name": "net adds the sold shares instead of subtracting them",
   "caught": true,
   "by": 8,
   "why": "the crossing is not inside the bracket"
  },
  {
   "name": "sqrt is off by a halving",
   "caught": true,
   "by": 2,
   "why": "buying did not raise the ask"
  },
  {
   "name": "reservesAt returns the reserves the wrong way round",
   "caught": true,
   "by": 2,
   "why": "buying did not raise the ask"
  },
  {
   "name": "the buyer is not charged the fee",
   "caught": true,
   "by": 1,
   "why": "x*y moved: 9999976430214155 vs 10000000000000000"
  },
  {
   "name": "the seller is not charged the fee",
   "caught": true,
   "by": 4,
   "why": "the bid did not land on lambda: 101002505149451574024 vs 101000000000000000000"
  },
  {
   "name": "profit is computed the wrong way round",
   "caught": true,
   "by": 20,
   "why": "raising the ceiling did not let it trade"
  },
  {
   "name": "the sell side is not trimmed to the buy side",
   "caught": true,
   "by": 37,
   "why": "proceeds were counted on shares that were never bought"
  },
  {
   "name": "the trade reports the larger of the two sides",
   "caught": false,
   "declared": "unreachable: the converged lambda is the low end of the bracket, where at least as many shares are sold as bought, and the trim then equalises them, so min and max are the same number. Property 39 measures that over three books."
  },
  {
   "name": "the fee ceiling is not applied",
   "caught": true,
   "by": 19,
   "why": "a pool above the 1% ceiling was traded"
  },
  {
   "name": "the router forgets its minimum output",
   "caught": true,
   "by": 29,
   "why": "the minimum output did not bite"
  },
  {
   "name": "the flash loan is not actually repaid",
   "caught": true,
   "by": 31,
   "why": "it reverted, but not because the loan was unpaid"
  },
  {
   "name": "the lender ceiling is not checked",
   "caught": true,
   "by": 26,
   "why": "a flash loan past the lender's balance went through"
  },
  {
   "name": "shares may be sold before they are bought",
   "caught": true,
   "by": 28,
   "why": "it reverted, but not because there were no shares"
  },
  {
   "name": "the minimum output is put on the FIRST leg instead of the last",
   "caught": true,
   "by": 38,
   "why": "a floor above the last leg's output did not bite"
  }
 ],
 "sizes": {
  "bytes": 20143,
  "initLimit": 49152,
  "ok": true
 },
 "pass": 39,
 "fail": 0,
 "caught": 19,
 "sabotages": 21,
 "missed": []
}