{
  "$schema": "https://degreesofsatoshi.com/encyclopedia/schemas/article-v1.json",
  "schemaVersion": "1.0.0",
  "id": "documented-defi-exploits",
  "canonical": "https://degreesofsatoshi.com/encyclopedia/documented-defi-exploits/",
  "collection": "defi",
  "title": "Documented DeFi exploits: separating mechanism, scope and outcome",
  "description": "Read two primary incident records to distinguish an accounting failure from a compiler defect, keeping affected versions and recovery claims separate.",
  "aliases": [
    "DeFi hacks",
    "protocol incidents"
  ],
  "dates": {
    "published": "2026-10-02",
    "modified": "2026-10-02",
    "verified": "2026-10-02T15:08:18.373Z",
    "dataAsOf": null
  },
  "authorship": {
    "publisher": "Degrees of Satoshi editorial project",
    "process": "AI-assisted research and drafting with a separate automated source-verification pass; no external expert or named human review is implied."
  },
  "quickAnswer": {
    "text": "A useful exploit explanation identifies the failed rule, affected version and observed consequences. Euler’s March 2023 V1 incident involved a missing account-health check according to its team’s retrospective. Vyper’s 2023 advisory documents incorrectly allocated reentrancy locks in specific compiler versions, a different failure layer.",
    "claimId": "documented-defi-exploits-quick-answer",
    "sourceIds": [
      "euler",
      "vyper"
    ]
  },
  "keyFacts": [
    {
      "label": "Euler scope",
      "value": "The cited retrospective concerns the March 2023 Euler V1 incident.",
      "sourceIds": [
        "euler"
      ],
      "id": "euler-scope",
      "claimId": "documented-defi-exploits-fact-euler-scope"
    },
    {
      "label": "Vyper scope",
      "value": "Affected compiler versions are 0.2.15, 0.2.16 and 0.3.0.",
      "sourceIds": [
        "vyper"
      ],
      "id": "vyper-scope",
      "claimId": "documented-defi-exploits-fact-vyper-scope"
    },
    {
      "label": "Vyper fix",
      "value": "The advisory identifies 0.3.1 as the patched version for this defect.",
      "sourceIds": [
        "vyper"
      ],
      "id": "vyper-fix",
      "claimId": "documented-defi-exploits-fact-vyper-fix"
    }
  ],
  "prerequisites": [
    "defi-liquidations",
    "smart-contract-audits"
  ],
  "sections": [
    {
      "id": "euler-case",
      "heading": "Euler V1: a missing check in account accounting",
      "paragraphs": [
        "Euler Labs’ 10 January 2024 retrospective attributes the March 2023 exploit to a missing health check in donateToReserves. It describes how donating collateral could create an unhealthy account that was then self-liquidated for a bonus. This is the team’s primary account of the failure.",
        "That mechanism should not be summarized as proof that all loans or all later Euler versions contain the same issue. The source explicitly distinguishes V1 history from the rebuilt V2 system. Its recovery narrative is also a separate claim from explaining the original defect."
      ],
      "sourceIds": [
        "euler"
      ]
    },
    {
      "id": "vyper-case",
      "heading": "Vyper: the compiler changed the lock behavior",
      "paragraphs": [
        "The Vyper maintainers’ advisory says that named reentrancy locks were allocated separately across functions in versions 0.2.15, 0.2.16 and 0.3.0. Under the specified conditions, functions intended to share a lock could permit cross-function reentrancy.",
        "The advisory narrows the issue to a particular compiler defect, vulnerable versions and contract conditions; it does not say every Vyper contract was exploitable. Its listed patched release addresses this defect, not every possible future vulnerability."
      ],
      "sourceIds": [
        "vyper"
      ]
    },
    {
      "id": "interpretation",
      "heading": "Explain the defect before labeling the financing",
      "paragraphs": [
        "Flash borrowing can provide temporary capital, but a loan’s presence does not identify the rule that failed. The defect might instead concern accounting, an oracle, authority or generated code. Keeping these layers separate makes an incident useful for learning.",
        "A defensible incident record preserves date, chain, affected implementation, source provenance, mechanism and uncertainty. Loss valuations require a price date and recovery needs a separate ledger. This entry deliberately avoids combining historical dollar figures measured at different times into one loss statistic."
      ],
      "sourceIds": [
        "flash",
        "euler",
        "vyper"
      ]
    }
  ],
  "faq": [
    {
      "question": "Does a recovered loss mean the original exploit was harmless?",
      "answer": "No. Recovery is a later outcome and does not undo the original failure or establish that all affected users had the same timing or experience. It should be documented separately from the mechanism.",
      "sourceIds": [
        "euler"
      ]
    }
  ],
  "claims": [
    {
      "id": "documented-defi-exploits-quick-answer",
      "articleSlug": "documented-defi-exploits",
      "statement": "A useful exploit explanation identifies the failed rule, affected version and observed consequences. Euler’s March 2023 V1 incident involved a missing account-health check according to its team’s retrospective. Vyper’s 2023 advisory documents incorrectly allocated reentrancy locks in specific compiler versions, a different failure layer.",
      "sourceIds": [
        "source-3920ce4881048430",
        "source-73ae7cef2e3cab66"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-3920ce4881048430",
          "locator": "March 13th; WTF is the donateToReserves function?; The exploit in real-time"
        },
        {
          "sourceId": "source-73ae7cef2e3cab66",
          "locator": "Affected versions; Impact; Patches"
        }
      ],
      "scope": {
        "collection": "defi",
        "dataAsOf": null,
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T15:08:18.373Z",
        "reviewer": "automated independent verification",
        "notes": [
          "Read Euler’s January10,2024 V1 retrospective: missing donateToReserves health check and self-liquidation; preserved attribution to Euler’s account and distinction from laterV2.",
          "Read Vyper maintainer advisory GHSA-5824-cm3x-3c38, August5,2023: affected0.2.15/0.2.16/0.3.0, patched0.3.1, cross-function lock conditions. The entry does not claim every compiled contract was exploitable or a patch fixes all bugs.",
          "Historical loss valuations and later recoveries remain separate; no mixed-price dollar total or inferred attribution is fabricated."
        ]
      }
    },
    {
      "id": "documented-defi-exploits-fact-euler-scope",
      "articleSlug": "documented-defi-exploits",
      "statement": "Euler scope: The cited retrospective concerns the March 2023 Euler V1 incident.",
      "sourceIds": [
        "source-3920ce4881048430"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-3920ce4881048430",
          "locator": "March 13th; WTF is the donateToReserves function?; The exploit in real-time"
        }
      ],
      "scope": {
        "collection": "defi",
        "dataAsOf": null,
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T15:08:18.373Z",
        "reviewer": "automated independent verification",
        "notes": [
          "Read Euler’s January10,2024 V1 retrospective: missing donateToReserves health check and self-liquidation; preserved attribution to Euler’s account and distinction from laterV2.",
          "Read Vyper maintainer advisory GHSA-5824-cm3x-3c38, August5,2023: affected0.2.15/0.2.16/0.3.0, patched0.3.1, cross-function lock conditions. The entry does not claim every compiled contract was exploitable or a patch fixes all bugs.",
          "Historical loss valuations and later recoveries remain separate; no mixed-price dollar total or inferred attribution is fabricated."
        ]
      }
    },
    {
      "id": "documented-defi-exploits-fact-vyper-scope",
      "articleSlug": "documented-defi-exploits",
      "statement": "Vyper scope: Affected compiler versions are 0.2.15, 0.2.16 and 0.3.0.",
      "sourceIds": [
        "source-73ae7cef2e3cab66"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-73ae7cef2e3cab66",
          "locator": "Affected versions; Impact; Patches"
        }
      ],
      "scope": {
        "collection": "defi",
        "dataAsOf": null,
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T15:08:18.373Z",
        "reviewer": "automated independent verification",
        "notes": [
          "Read Euler’s January10,2024 V1 retrospective: missing donateToReserves health check and self-liquidation; preserved attribution to Euler’s account and distinction from laterV2.",
          "Read Vyper maintainer advisory GHSA-5824-cm3x-3c38, August5,2023: affected0.2.15/0.2.16/0.3.0, patched0.3.1, cross-function lock conditions. The entry does not claim every compiled contract was exploitable or a patch fixes all bugs.",
          "Historical loss valuations and later recoveries remain separate; no mixed-price dollar total or inferred attribution is fabricated."
        ]
      }
    },
    {
      "id": "documented-defi-exploits-fact-vyper-fix",
      "articleSlug": "documented-defi-exploits",
      "statement": "Vyper fix: The advisory identifies 0.3.1 as the patched version for this defect.",
      "sourceIds": [
        "source-73ae7cef2e3cab66"
      ],
      "sourceLocators": [
        {
          "sourceId": "source-73ae7cef2e3cab66",
          "locator": "Affected versions; Impact; Patches"
        }
      ],
      "scope": {
        "collection": "defi",
        "dataAsOf": null,
        "blockHeight": null
      },
      "qualification": "",
      "evidenceStatus": "documented",
      "verification": {
        "status": "verified",
        "method": "independent automated source review",
        "checkedAt": "2026-10-02T15:08:18.373Z",
        "reviewer": "automated independent verification",
        "notes": [
          "Read Euler’s January10,2024 V1 retrospective: missing donateToReserves health check and self-liquidation; preserved attribution to Euler’s account and distinction from laterV2.",
          "Read Vyper maintainer advisory GHSA-5824-cm3x-3c38, August5,2023: affected0.2.15/0.2.16/0.3.0, patched0.3.1, cross-function lock conditions. The entry does not claim every compiled contract was exploitable or a patch fixes all bugs.",
          "Historical loss valuations and later recoveries remain separate; no mixed-price dollar total or inferred attribution is fabricated."
        ]
      }
    }
  ],
  "sources": [
    {
      "id": "euler",
      "label": "Euler V1 exploit and recovery account",
      "publisher": "Euler Labs",
      "url": "https://www.euler.finance/blog/war-peace-behind-the-scenes-of-eulers-240m-exploit-recovery",
      "locator": "March 13th; WTF is the donateToReserves function?; The exploit in real-time",
      "note": "The team attributes the 2023 exploit to a missing health check and describes affected integrations.",
      "version": "2024-01-10 retrospective of March 2023",
      "checkedAt": "2026-10-02",
      "recordId": "source-3920ce4881048430",
      "contentSha256": null
    },
    {
      "id": "vyper",
      "label": "Incorrectly allocated named re-entrancy locks",
      "publisher": "Vyper maintainers",
      "url": "https://github.com/vyperlang/vyper/security/advisories/GHSA-5824-cm3x-3c38",
      "locator": "Affected versions; Impact; Patches",
      "note": "Vyper versions 0.2.15, 0.2.16 and 0.3.0 had cross-function reentrancy-lock defects.",
      "version": "GHSA-5824-cm3x-3c38; 2023-08-05",
      "checkedAt": "2026-10-02",
      "recordId": "source-73ae7cef2e3cab66",
      "contentSha256": null
    },
    {
      "id": "flash",
      "label": "Aave V3 flash loans",
      "publisher": "Aave",
      "url": "https://aave.com/docs/aave-v3/guides/flash-loans",
      "locator": "Overview; Execution Flow; Flash loan fee",
      "note": "Atomic repayment, receiver callbacks and distinct debt-opening options.",
      "version": "Aave V3",
      "checkedAt": "2026-10-02",
      "recordId": "source-f64306b50a0ea831",
      "contentSha256": null
    }
  ],
  "related": {
    "articles": [
      "flash-loans",
      "smart-contract-audits",
      "defi-composability"
    ],
    "dossiers": [],
    "wallets": []
  },
  "revisionHistory": [
    {
      "date": "2026-10-02",
      "kind": "published",
      "summary": "First publication after primary-source research and independent automated verification."
    }
  ],
  "citation": "Degrees of Satoshi editorial project. “Documented DeFi exploits: separating mechanism, scope and outcome.” Published 2026-10-02; updated 2026-10-02. https://degreesofsatoshi.com/encyclopedia/documented-defi-exploits/"
}
