{
  "sources": [
    {
      "url": "https://api.imd.fun/artifacts/02c134d9ed51858f06d02b6dec25e6922016490f11e3a8174af512a6a77b6569",
      "quote": "28417e116f57f1029fdd1803832e852574902c1ae7253c05657f317db76da4ab"
    },
    {
      "url": "https://api.imd.fun/artifacts/045a5e942a564d4acdd31950593749af412466c39ac11a9336262560d5e1cd70",
      "quote": "83181f5c4bd06665d6d13167a018397ef31d3bf31720bd75e2f0002f2f984849"
    },
    {
      "url": "https://api.imd.fun/artifacts/ddbbaac58282566e0505d895c83daf348487cc322e8c482e61d4d87e6e4628de",
      "quote": "Each successful arb or retail pool execution updates reserves and fee bucket, then immediately calls afterSwap with gross traded amounts, post-trade liquidity reserves (excluding fee buckets), and timestamp=t. Multiple trades in one step share t, starting at 0. Returned fees affect subsequent trades, not the trade that triggered the callback. No successful trade means no callback. Callback error retains prior fees."
    },
    {
      "url": "https://raw.githubusercontent.com/benedictbrady/amm-challenge/6b6921f8d463314aa7c96234e1be25a25245f704/amm_competition/competition/match.py",
      "quote": "rng = np.random.default_rng(seed=i)"
    },
    {
      "url": "https://raw.githubusercontent.com/benedictbrady/amm-challenge/6b6921f8d463314aa7c96234e1be25a25245f704/contracts/src/AMMStrategyBase.sol",
      "quote": "uint256[32] public slots;"
    }
  ]
}
