🌟 assert

Purpose:

Example:

uint public balance;

function deposit(uint _amount) public {
    balance += _amount;

    // critical invariant check
    assert(balance >= _amount); // balance cannot possibly go below amount after adding
}

👉 If assert fails, something is horribly wrong — logic bug, overflow (pre-Solidity 0.8), etc.

Use assert sparingly, for impossible-to-fail conditions.


🌟 require

Purpose:

Example:

function deposit(uint _amount) public {
    require(_amount > 0, "Amount must be positive");
    require(balance + _amount >= balance, "Overflow"); // precondition check

    balance += _amount;
}