Actualites·7 min de lecture·Par Solingo

Biggest Smart Contract Hacks of 2025-2026 — Lessons Learned

Over $800M stolen in DeFi hacks in 2025-2026. Analyze the biggest exploits, understand what went wrong, and learn how to protect your contracts from similar attacks.

# Biggest Smart Contract Hacks of 2025-2026 — Lessons Learned

Despite advances in security tooling, 2025-2026 saw $823 million stolen in DeFi hacks. Some exploits were novel, others were embarrassingly simple. Here's a breakdown of the biggest incidents and the critical lessons every developer must internalize.

The Hacks

1. ChainBridge Exploit — $187M (May 2025)

What happened:

ChainBridge, a cross-chain bridge, suffered a reentrancy attack on their withdrawal logic. The attacker drained liquidity pools across 4 chains.

Technical details:

// Vulnerable code (simplified)

function withdraw(uint256 amount, address token) external {

require(balances[msg.sender][token] >= amount, "Insufficient balance");

// VULNERABLE: External call before state update

IERC20(token).transfer(msg.sender, amount);

// State update AFTER external call

balances[msg.sender][token] -= amount;

}

The attacker created a malicious ERC20 token with a transfer function that called withdraw again, draining the contract before the balance was updated.

The fix:

function withdraw(uint256 amount, address token) external {

require(balances[msg.sender][token] >= amount, "Insufficient balance");

// Update state BEFORE external call (Checks-Effects-Interactions)

balances[msg.sender][token] -= amount;

// External call last

IERC20(token).transfer(msg.sender, amount);

}

Lesson learned:

Always follow the Checks-Effects-Interactions pattern. Update state before making external calls. This is DeFi 101, yet bridges still get it wrong.

Better yet, use OpenZeppelin's ReentrancyGuard:

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract SecureBridge is ReentrancyGuard {

function withdraw(uint256 amount, address token) external nonReentrant {

// Safe even with external calls

}

}

2. OmniLend Flash Loan Attack — $142M (August 2025)

What happened:

OmniLend, a lending protocol, used a manipulable price oracle. An attacker used a flash loan to manipulate the price, borrowed max collateral, and never repaid.

Attack flow:

  • Flash loan 100,000 ETH from Aave
  • Swap 50,000 ETH for OMNI token on Uniswap (pumps OMNI price)
  • Deposit 50,000 ETH as collateral in OmniLend
  • Borrow max USDC based on inflated OMNI price
  • Swap OMNI back to ETH (price crashes)
  • Repay Aave flash loan
  • Profit: $142M in USDC
  • The vulnerable oracle:

    // VULNERABLE: Single DEX as price source
    

    function getPrice() external view returns (uint256) {

    (uint112 reserve0, uint112 reserve1,) = uniswapPair.getReserves();

    return (reserve1 * 1e18) / reserve0; // Trivially manipulable

    }

    The fix:

    Use time-weighted average price (TWAP) or multiple oracle sources:

    import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
    
    

    contract SecureOracle {

    AggregatorV3Interface internal priceFeed;

    constructor(address _priceFeed) {

    priceFeed = AggregatorV3Interface(_priceFeed);

    }

    function getPrice() external view returns (uint256) {

    (, int256 price,,,) = priceFeed.latestRoundData();

    require(price > 0, "Invalid price");

    return uint256(price);

    }

    }

    Lesson learned:

    Never use spot prices from a single DEX. Use Chainlink, Pyth, or TWAP oracles. If you must use DEX prices, combine multiple sources and add sanity checks.

    3. FlexDAO Governance Takeover — $95M (November 2025)

    What happened:

    FlexDAO's governance contract had a flaw: voting power snapshot was taken AFTER proposal creation, not when votes were cast. An attacker:

  • Created a proposal to drain treasury
  • Flash loaned governance tokens
  • Voted with flash-loaned tokens
  • Returned tokens (same transaction)
  • Proposal passed with "majority" vote
  • Executed proposal 2 days later
  • Vulnerable governance logic:

    // VULNERABLE: Snapshot taken at proposal creation
    

    function propose(address target, bytes calldata data) external returns (uint256) {

    uint256 proposalId = proposalCount++;

    proposals[proposalId] = Proposal({

    target: target,

    data: data,

    votesFor: 0,

    votesAgainst: 0,

    snapshot: block.number // Snapshot is NOW

    });

    return proposalId;

    }

    function vote(uint256 proposalId, bool support) external {

    uint256 votes = token.balanceOf(msg.sender); // No snapshot check!

    if (support) {

    proposals[proposalId].votesFor += votes;

    } else {

    proposals[proposalId].votesAgainst += votes;

    }

    }

    The fix:

    function vote(uint256 proposalId, bool support) external {
    

    Proposal storage proposal = proposals[proposalId];

    // Use balance at snapshot block

    uint256 votes = token.balanceOfAt(msg.sender, proposal.snapshot);

    require(votes > 0, "No voting power at snapshot");

    // Rest of voting logic...

    }

    Lesson learned:

    Governance is complex. Use battle-tested frameworks like OpenZeppelin Governor. Don't roll your own governance unless you're prepared for extensive audits.

    4. SynthSwap Price Manipulation — $78M (January 2026)

    What happened:

    SynthSwap, a synthetic asset DEX, calculated prices using reserves after every trade. An attacker sandwiched large trades to profit from slippage.

    Attack:

  • Frontrun large buy order (buy before victim)
  • Victim's trade executes (pushes price up)
  • Backrun (sell at inflated price)
  • Profit from victim's slippage
  • Vulnerable AMM logic:

    function swap(uint256 amountIn, address tokenIn, address tokenOut) external {
    

    // Calculate output based on current reserves (vulnerable to sandwich)

    uint256 amountOut = getAmountOut(amountIn, reserveIn, reserveOut);

    // Execute swap

    IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn);

    IERC20(tokenOut).transfer(msg.sender, amountOut);

    // Update reserves

    reserveIn += amountIn;

    reserveOut -= amountOut;

    }

    The fix:

    Implement slippage protection:

    function swap(
    

    uint256 amountIn,

    uint256 minAmountOut, // User-specified minimum

    address tokenIn,

    address tokenOut

    ) external {

    uint256 amountOut = getAmountOut(amountIn, reserveIn, reserveOut);

    require(amountOut >= minAmountOut, "Slippage too high");

    // Rest of swap logic...

    }

    Lesson learned:

    All DEX trades must have slippage protection. Users should specify minAmountOut. Frontends should calculate this automatically (e.g., 0.5% slippage tolerance).

    5. MultiChain Bridge Validator Compromise — $64M (March 2026)

    What happened:

    MultiChain's bridge used a 3-of-5 multisig for validation. Attackers compromised 3 validator keys through phishing and drained the bridge.

    Not a smart contract bug — this was operational security failure.

    Lesson learned:

    • Use hardware wallets for validator keys
    • Implement timelock delays (e.g., 24h delay for large withdrawals)
    • Monitor for unusual activity
    • Use threshold signatures with key rotation
    // Timelock for large withdrawals
    

    uint256 constant LARGE_WITHDRAWAL = 100_000e18; // $100k

    uint256 constant TIMELOCK_DELAY = 24 hours;

    function requestWithdrawal(uint256 amount) external {

    if (amount > LARGE_WITHDRAWAL) {

    pendingWithdrawals[msg.sender] = Withdrawal({

    amount: amount,

    timestamp: block.timestamp

    });

    } else {

    _executeWithdrawal(msg.sender, amount);

    }

    }

    function executeWithdrawal() external {

    Withdrawal memory w = pendingWithdrawals[msg.sender];

    require(block.timestamp >= w.timestamp + TIMELOCK_DELAY, "Timelock active");

    _executeWithdrawal(msg.sender, w.amount);

    }

    Common Patterns in Hacks

    1. Reentrancy (ChainBridge)

    Root cause: External calls before state updates

    Prevention:

    • Use ReentrancyGuard
    • Follow Checks-Effects-Interactions
    • Consider using transient storage (Solidity 0.8.28+) for reentrancy flags

    2. Oracle Manipulation (OmniLend, SynthSwap)

    Root cause: Reliance on manipulable price sources

    Prevention:

    • Use Chainlink or other decentralized oracles
    • Implement TWAP for DEX prices
    • Sanity checks (max price deviation per block)

    3. Access Control (FlexDAO)

    Root cause: Flash loan attacks on governance/voting

    Prevention:

    • Snapshot voting power BEFORE proposal creation
    • Use OpenZeppelin Governor
    • Add proposal delays (can't execute immediately after passing)

    4. Operational Security (MultiChain)

    Root cause: Compromised validator keys

    Prevention:

    • Hardware wallets + cold storage
    • Timelocks for large operations
    • Monitoring + alerting
    • Regular key rotation

    Security Checklist

    Before deploying to mainnet, verify:

    • [ ] Reentrancy protection on all external calls
    • [ ] Oracle sources are manipulation-resistant
    • [ ] Access control follows principle of least privilege
    • [ ] Timelocks for critical operations
    • [ ] Slippage protection for all trades
    • [ ] Governance uses snapshot voting
    • [ ] Pausability for emergency situations
    • [ ] Upgrade mechanism is secure (if using proxies)
    • [ ] Audited by reputable firm (Trail of Bits, OpenZeppelin, etc.)
    • [ ] Bug bounty program live before mainnet
    • [ ] Formal verification for critical logic (if budget allows)

    Resources for Secure Development

    Tools:

    • Foundry — Testing framework with built-in fuzzing

    Learning:

    • Ethernaut — Interactive security challenges

    Audit Firms:

    • Trail of Bits
    • OpenZeppelin
    • Consensys Diligence
    • Spearbit
    • Code4rena (competitive audits)

    Conclusion

    $823 million stolen. Thousands of users affected. Most vulnerabilities were preventable.

    The DeFi security landscape is unforgiving. One mistake can drain a protocol in minutes. But the patterns are known:

    • Follow Checks-Effects-Interactions
    • Use battle-tested oracles
    • Protect against flash loan attacks
    • Implement timelocks and monitoring

    Security is not optional. It's the foundation. Build on it, or watch your protocol join this list in 2027.

    Prêt à mettre en pratique ?

    Applique ces concepts avec des exercices interactifs sur Solingo.

    Commencer gratuitement