Hook
On August 24, an attacker drained $8.5 million from Term Finance—68% of its total value locked (TVL)—by exploiting a governance mechanism that was supposed to protect users. The protocol ran on Yearn V3, a battle-tested framework. Yet, the attack vector was not in Yearn's code. It was in a custom layer that Term Finance had bolted on top. The attacker then converted USDC to DAI. This detail is not random. It tells me they were thinking about blacklist risks, not just profit. The question is: how did a 7-day timelock become a paperweight?
Context
Term Finance is a fixed-rate lending protocol built on Yearn V3's strategy vault architecture. Before the attack, its TVL hovered around $12.45 million—tiny compared to Aave or Compound. The governance model relied on a 7-day timelock and a liquidity provider (LP) veto mechanism. The idea was straightforward: any proposal must wait seven days before execution, and LPs could vote to block malicious proposals. In theory, this gives the community a window to react. In practice, it failed. Yearn confirmed that the vulnerability was exclusive to Term's custom governance layer. Standard Yearn vaults remained untouched.
Core
Let me dissect the technical failure. A timelock is a smart contract that queues function calls and enforces a delay before execution. It is a standard pattern—OpenZeppelin's TimelockController has been used for years. The security assumption is that if a malicious proposal is queued, stakeholders have time to exit or intervene. But a timelock only protects the execution path that goes through it. If an attacker can call a privileged function directly—bypassing the timelock—the delay is irrelevant.
Based on my audit experience, most governance bypasses fall into one of three categories: 1. Access control errors: The timelock is not the only address with admin rights. A contract may have a setAdmin function that can be called by an old owner or a multisig that was never revoked. 2. Delegatecall exploits: A proposal can execute a delegatecall to a contract that modifies the caller's storage. If the attacker controls the target contract, they can overwrite the timelock's own storage or self-destruct it. 3. Reentrancy in the timelock: Some implementations allow nested calls during the queue or execution phase, enabling an attacker to execute a second proposal before the first one's delay expires.
Term Finance did not disclose the exact vector, but the subtraction of the timelock's effectiveness suggests a direct call bypass. The LP veto mechanism also failed. This implies that either the veto function had a logic flaw (e.g., it could be called only after the timelock expired, or the attacker could front-run the veto) or the attacker controlled enough LP tokens to outweigh the veto. The latter is less likely given the protocol's small TVL—a whale could have easily accumulated enough LP tokens.
I have seen this pattern before. In 2020, I audited a yield aggregator that added a custom claim function on top of an existing vault. The logic was simple: allow users to claim rewards after a timelock. But the claim function was not gated by the timelock—it was a separate public function. The attacker called it directly, draining the reward pool. The timelock was never triggered. Term Finance's mistake is a textbook example of the same error: custom code introduces untested state transitions.
Contrarian
The industry narrative is that timelocks are a safety net. They are not. They are a delay mechanism, not a prevention mechanism. The real protection comes from who can call the timelock and what functions are gated. If the timelock is the only address with admin rights, it works. But if the protocol has a separate owner() or manager() that can be changed via a proposal, the timelock is cosmetic. The attack on Term Finance reveals a blind spot: protocols often assume that a 7-day window is enough to detect and respond to malicious proposals. That assumption is invalid if the attacker can execute without waiting.
Another contrarian point: the conversion of USDC to DAI is not just a profit move. USDC is blacklistable by Circle. DAI is not. The attacker likely wanted to avoid the risk of having their funds frozen. This shows that sophisticated attackers account for off-chain risks as well as on-chain logic. It also means that stablecoin centralization is a double-edged sword—it can protect users, but it also creates a target for attackers to evade.
Takeaway
Term Finance's downfall is a forecast for the next wave of DeFi attacks. As protocols build on top of established frameworks like Yearn V3, they will inevitably add custom governance layers. Each custom function is a new attack surface. The industry's response should not be more timelocks, but standardized, audited governance modules that enforce the principle of least privilege. Until then, audits are promises, not guarantees. Yield is a function of risk, not just time. And liquidity is just trust with a price tag.