{
  "schema_version": "1.2",
  "scan_id": "9b89d3f5-7f3d-46b1-ba97-cf2fc1ff36c4",
  "status": "ok",
  "error": null,
  "input": {
    "kind": "source",
    "sha256": "ff14b03492f863e5ea87a17d00660a67c3f6b1e928ca7ea6a07d33c50249fdf1",
    "chain": null,
    "address": null,
    "contract_name": null,
    "compiler_version": "0.8.37",
    "compiler_version_source": "pragma",
    "files": [
      {
        "path": "swap_zero_min_out.sol",
        "sha256": "05706fbbe1aaf74b59ebd9297c3abc749d7d3f8db018a1c061d2a0119e6a28ad",
        "bytes": 1702,
        "lines": 55,
        "nsloc": 48
      }
    ],
    "nsloc": 48,
    "bytes": 1702
  },
  "findings": [
    {
      "id": "F-001",
      "detector": "swap-zero-min-out",
      "source": "custom",
      "title": "Swap or liquidation call with minimum output hard-coded to 0",
      "severity": "high",
      "confidence": "medium",
      "location": {
        "file": "swap_zero_min_out.sol",
        "start_line": 40,
        "end_line": 40
      },
      "file_line": "swap_zero_min_out.sol:40",
      "snippet": "        routerV2.swapExactTokensForTokens(amount, 0, path, address(this), deadline);",
      "description": "Harvester.harvest(uint256,uint256) (swap_zero_min_out.sol#36-41) passes 0 as `amountOutMin` (no slippage protection): routerV2.swapExactTokensForTokens(amount,0,path,address(this),deadline) (swap_zero_min_out.sol#40)",
      "explanation": "A call into a DEX router or pool passes the literal 0 as its minimum-output (slippage) argument, for example amountOutMin, amountOutMinimum, minAmountOut or min_dy. Without a slippage bound the swap accepts any price, so an MEV searcher can sandwich the transaction: move the price before it, let the contract swap at a terrible rate, and move it back afterwards, extracting most of the value. Calls that run automatically (harvests, compounding, liquidations, rebalances) are particularly exposed because anyone can trigger them at a chosen moment.",
      "recommendation": "Accept a caller-supplied minimum output, or derive one from a trusted oracle price minus a bounded slippage tolerance, and pass it to the swap.",
      "fingerprint": "0cd6ebd77544790a",
      "also_at": []
    },
    {
      "id": "F-002",
      "detector": "swap-zero-min-out",
      "source": "custom",
      "title": "Swap or liquidation call with minimum output hard-coded to 0",
      "severity": "high",
      "confidence": "medium",
      "location": {
        "file": "swap_zero_min_out.sol",
        "start_line": 44,
        "end_line": 53
      },
      "file_line": "swap_zero_min_out.sol:44",
      "snippet": "        return routerV3.exactInputSingle(ISwapRouter.ExactInputSingleParams({\n            tokenIn: reward,\n            tokenOut: want,\n            fee: 3000,\n            recipient: address(this),\n            deadline: deadline,",
      "description": "Harvester.harvestV3(uint256,uint256) (swap_zero_min_out.sol#43-54) passes 0 as `amountOutMinimum` (no slippage protection): routerV3.exactInputSingle(ISwapRouter.ExactInputSingleParams({tokenIn:reward,tokenOut:want,fee:3000,recipient:address(this),deadline:deadline,amountIn:amount,amountOutMinimum:0,sqrtPriceLimitX96:0})) (swap_zero_min_out.sol#44-53)",
      "explanation": "A call into a DEX router or pool passes the literal 0 as its minimum-output (slippage) argument, for example amountOutMin, amountOutMinimum, minAmountOut or min_dy. Without a slippage bound the swap accepts any price, so an MEV searcher can sandwich the transaction: move the price before it, let the contract swap at a terrible rate, and move it back afterwards, extracting most of the value. Calls that run automatically (harvests, compounding, liquidations, rebalances) are particularly exposed because anyone can trigger them at a chosen moment.",
      "recommendation": "Accept a caller-supplied minimum output, or derive one from a trusted oracle price minus a bounded slippage tolerance, and pass it to the swap.",
      "fingerprint": "afd1659f5dc0eaf0",
      "also_at": []
    }
  ],
  "stats": {
    "raw_results": 10,
    "dropped_informational": 5,
    "dropped_noisy": 2,
    "dropped_out_of_scope": 0,
    "dropped_dependencies": 0,
    "duplicates_removed": 1,
    "results_truncated": false,
    "findings": 2,
    "findings_by_severity": {
      "high": 2,
      "medium": 0,
      "low": 0,
      "info": 0
    },
    "detectors_run": 111,
    "custom_detectors_run": 9,
    "contracts": 3
  },
  "timing": {
    "fetch_ms": 0,
    "queue_ms": 0,
    "solc_install_ms": 0,
    "sandbox_ms": 903,
    "compile_ms": 99,
    "detectors_ms": 14,
    "total_ms": 973,
    "started_at": "2026-10-06T13:23:45.897Z",
    "finished_at": "2026-10-06T13:23:46.870Z"
  },
  "engine": {
    "scanner_version": "0.1.0",
    "slither_version": "0.11.6",
    "sandbox": {
      "user": "scanner",
      "network_isolated": true,
      "notes": [],
      "memory_cgroup": true,
      "memory_max_bytes": 1572864000
    },
    "options": {
      "include_informational": false,
      "include_noisy": false,
      "include_dependencies": false
    }
  },
  "disclaimer": "Automated scan, not an audit. Findings may be false positives; absence of findings does not mean the code is safe."
}
