Why Smart Contract Exploits Keep Happening
The blunt answer is that most smart contract platforms inherited their security model from general-purpose computing rather than designing one from scratch for financial applications. The Ethereum Virtual Machine (EVM), which underlies Ethereum, Polygon, Avalanche's C-Chain, BNB Chain, and dozens of other networks, was designed for Turing-complete programmability first. Security constraints were layered on top, through coding conventions, auditor guidelines, and frameworks like OpenZeppelin, rather than baked into the execution environment itself.
That approach works reasonably well when developers follow every best practice perfectly. The problem is that they frequently don't. Solidity's account-based model with global mutable state allows an external call to re-enter a contract mid-execution, a property that has been exploited in dozens of high-profile incidents since the original DAO hack in 2016. Integer overflows were a default behavior in early Solidity until SafeMath libraries became standard practice in 2018 and the compiler added built-in checks in Solidity 0.8.0. Each of these fixes required the entire developer ecosystem to change behavior. Many contracts deployed before the fixes remain exploitable.
Algorand's design team, working from a protocol-first perspective informed by Silvio Micali's cryptographic background and the lessons learned from years of EVM exploits, built an execution environment that constrains the dangerous surface area from the start. The AVM is not Turing-complete in the same way the EVM is, by design. That design choice eliminates entire categories of bugs.
Reentrancy: Structurally Impossible in AVM
Reentrancy is the vulnerability class that produced the $60 million DAO hack in 2016, the Cream Finance double-borrow attack in 2021, and numerous smaller exploits through 2025. The mechanism is straightforward: a malicious contract calls a victim contract, the victim contract sends funds to the malicious contract before updating its internal state, and the malicious contract immediately calls back into the victim before the first call finishes. The victim's state still shows the full balance, so the attacker withdraws repeatedly until the contract is empty.
On Ethereum, this is possible because external calls (including ETH transfers) can trigger arbitrary code execution in the recipient. A developer who writes send funds, then update balance instead of update balance, then send funds has written a vulnerable contract. This ordering mistake has appeared in audited, production code repeatedly because the EVM offers no guardrail against it.
The AVM executes differently. Algorand smart contracts (written in TEAL or compiled from Python via PyTeal or the Algorand Python SDK) do not have recursive external call semantics in the same sense. Inner transactions, which allow a smart contract to trigger other on-chain actions, are handled sequentially and within bounded scope. A contract cannot be re-entered mid-execution through an inner transaction because the AVM processes the call stack in a strictly ordered, non-recursive manner. The execution model physically prevents the interleaving that reentrancy requires.
This is not a coding convention or an auditor recommendation. It is a property of the runtime. A developer writing Algorand smart contracts cannot introduce reentrancy even if they try, because the AVM does not support the execution pattern that reentrancy exploits.
Integer Overflow: Bounded by Design
Integer overflow vulnerabilities on EVM chains historically worked because arithmetic in Solidity used to wrap silently: if you added 1 to the maximum value of a uint256, you got 0 rather than an error. The BeautyChain (BEC) exploit in 2018 used an overflow in a multiplication to mint essentially unlimited tokens. The BatchOverflow vulnerability class affected hundreds of ERC-20 tokens. Even after Solidity 0.8.0 introduced built-in overflow checks, the enormous installed base of pre-0.8 contracts remains unpatched.
The AVM's opcode set handles arithmetic with deterministic, bounded behavior. The AVM uses 64-bit unsigned integer arithmetic for most operations, with overflow behavior that is defined and predictable. More relevantly, AVM programs are small (there are strict size limits on contract code), stack-based (the execution trace is linear and auditable), and versioned (AVM bytecode includes a version number, so older behavior cannot silently persist into newer contracts without an explicit upgrade).
The PyTeal and Algorand Python SDK compilers add another layer: they abstract the raw opcodes behind higher-level constructs that handle edge cases correctly by default. A developer writing arithmetic in Algorand Python gets safe integer handling without needing to remember to import a library or audit their multiplication order.
Flash Loan Attacks: Why Atomic Groups Change the Equation
Flash loans were invented by Aave in 2020 as a legitimate DeFi primitive: borrow any amount of assets, use them within a single transaction, repay before the transaction closes. No collateral required. The problem is that the same atomic borrowing power gives attackers the ability to temporarily control massive amounts of capital and use that capital to manipulate oracle prices, drain liquidity pools, or exploit governance systems, all within a single block.
The Cetus exploit in May 2025, which cost approximately $223 million, combined a flash loan with a flawed liquidity math overflow. The Balancer v2 attack in late 2025, costing roughly $120 million, used a flash loan alongside access control failures. Flash loans amplify every other vulnerability because they give an attacker near-unlimited capital with zero upfront cost.
Algorand does not have flash loans as a protocol primitive. More fundamentally, Algorand's atomic transaction groups work differently from EVM atomicity. On Algorand, a group of up to 16 transactions is bundled and submitted together, executing atomically: either all succeed or all fail. This is genuinely useful for legitimate multi-step operations (a simultaneous payment and asset transfer, for instance), but it cannot be extended to borrow-use-repay within a single execution because the transaction group model does not allow arbitrary looping or recursive calls back into a liquidity pool to return borrowed capital.
This means the entire flash loan attack surface, which has been responsible for a substantial portion of DeFi losses since 2020, simply does not exist on Algorand in the same form. An attacker who wants to manipulate an Algorand-based price oracle needs to own the capital they are using, which changes the economics of the attack entirely. Large-scale manipulation becomes expensive rather than free.
Access Control: Protocol-Level Primitives vs. Custom Code
Access control failures are consistently the top category in the OWASP Smart Contract Top 10. On EVM chains, access control is largely the developer's responsibility: checking msg.sender, managing role mappings, ensuring initialization functions can only be called once. Audits catch many of these, but the attack surface is significant because the same primitives (Ownable, AccessControl) are reimplemented in custom form across thousands of contracts.
Algorand provides several protocol-level access control primitives that reduce the custom-code surface area:
- Asset freeze and clawback: Algorand Standard Assets natively support a freeze address and a clawback address set at issuance. The freeze address can freeze an asset in a specific wallet; the clawback address can retrieve assets without the holder's signature. These are not smart contracts. They are protocol rules. A token issuer does not need to write or audit a custom freeze function because the behavior is defined at the protocol level and cannot be accidentally bypassed.
- Rekeying: An Algorand account can delegate its spending authority to another key (the authorized address) without changing its on-chain address. This means institutional custody operators can rotate signing keys as a routine security practice without disrupting the on-chain identity associated with an address. On EVM chains, key rotation at the account level typically requires migrating assets to a new address, which is operationally complex and error-prone.
- Smart signatures (LogicSigs): Rather than deploying a stateful contract to gate a specific spending condition, Algorand allows spending conditions to be expressed as stateless programs attached to a transaction. A payment that should only go to a specific recipient, or only within a certain time window, can be expressed as a LogicSig that the AVM verifies atomically with the transaction. No state to corrupt, no initialization function to forget, no upgradeable proxy to misconfigure.
The practical effect is that developers building on Algorand start with a set of native guardrails that cover a large portion of the access control use cases where EVM developers have to write, test, and audit custom code.
The AVM's Execution Bounds: Why Constraint Is a Feature
One objection to Algorand's security model is that it is less expressive than the EVM. This is true in a narrow sense. AVM programs have hard limits on size, opcode budget, and stack depth. You cannot write an AVM program that loops indefinitely. You cannot write contracts that make unbounded external calls. The AVM is not fully Turing-complete in practical terms.
This matters for security. Turing-completeness means any computation is expressible, including arbitrary re-entrant call graphs, unbounded loops, and complex recursive state mutations. These are exactly the patterns that produce the hardest-to-audit vulnerabilities. The EVM's expressive power is also its attack surface.
The AVM's constraints force smart contract programs to be small, bounded, and analyzable. AVM programs can be (and increasingly are) formally verified with tools like the Algorand-specific audit frameworks and external security firms that specialize in TEAL review. Formal verification of an EVM contract is possible but significantly harder because the state space is larger and the execution paths are more numerous. Constraining the execution model makes security proofs tractable.
The tradeoff is real. Some complex DeFi applications that are natural on Ethereum require more creative architecture on Algorand, splitting logic across multiple contracts or using application calls within atomic groups. But for the financial application use cases where security matters most (asset issuance, custody, payments, lending protocols), the AVM's bounded model is a meaningful advantage.
What AVM Cannot Protect Against
Honest analysis requires naming the limits. The AVM's architectural safeguards do not eliminate all smart contract risk on Algorand.
Business logic bugs remain the developer's problem. If a contract correctly executes incorrect logic (for example, distributing rewards in the wrong proportion, or allowing an unauthorized withdrawal path due to a flawed conditional), no runtime environment can catch that. OWASP's 2026 Smart Contract Top 10 lists business logic errors as the second-ranked category, right behind access control. The AVM prevents the structural vulnerabilities; it cannot prevent the developer from getting the math wrong.
Oracle manipulation is partially mitigated (no flash loans) but not eliminated. An attacker with sufficient on-chain capital can still attempt to move prices in thin liquidity pools over multiple blocks. Algorand-based DeFi protocols that use on-chain price feeds still need to use time-weighted average prices (TWAPs) or off-chain oracle integrations to resist manipulation.
Upgrade proxy risks apply in a different form. Algorand contracts can be made upgradeable through the approval program update mechanism. An upgradeable contract that has its manager key compromised can have its logic replaced. Developers who want immutable contracts should set the update permission to a null key at deployment; the protocol supports this, but it requires a conscious choice.
Key Takeaway
Reentrancy: Structurally impossible. The AVM's sequential, non-recursive execution model does not support the interleaving that reentrancy requires.
Integer overflow: Bounded by design. AVM arithmetic has defined behavior; the compiler toolchain handles edge cases correctly by default.
Flash loan attacks: No protocol-level flash loan primitive. Atomic groups cannot be extended to borrow-use-repay within a single execution, eliminating the main flash loan attack surface.
Access control: Protocol-level freeze, clawback, rekeying, and LogicSig primitives reduce the custom code surface where EVM developers introduce bugs.
What remains: Business logic errors, oracle manipulation (on thin liquidity), and upgrade key compromise. These require good developer practice, not just a better runtime.
The Bigger Picture: Security Through Design, Not Convention
The core difference between Algorand's security story and Ethereum's is where the work happens. On Ethereum, the burden falls on developers to avoid a long list of known vulnerability patterns, on auditors to catch the ones developers miss, and on the broader ecosystem to update conventions after each major exploit. That model has produced billions of dollars in losses and shows no sign of improving, because the underlying execution environment has not changed.
On Algorand, a significant portion of the most common and costly vulnerability classes are either eliminated or bounded at the virtual machine level. This does not mean Algorand contracts are automatically safe. It means that developers building on Algorand start several steps ahead on the security baseline, and auditors reviewing Algorand contracts have a smaller surface area to cover. For financial applications, where a single contract bug can cost users millions, that structural advantage compounds over time.
As DeFi matures and institutional capital continues moving on-chain, the demand for execution environments with provable security properties rather than best-practice conventions will grow. The AVM's design is well-positioned for that shift.
| Vulnerability Class | EVM (Ethereum/Solidity) | Algorand AVM |
|---|---|---|
| Reentrancy | Possible; requires manual guards (ReentrancyGuard) | Structurally impossible by execution model |
| Integer overflow | Fixed in Solidity 0.8+; pre-0.8 contracts remain exposed | Defined arithmetic behavior; compiler handles edge cases |
| Flash loan attacks | Major attack surface; borrow-use-repay in one tx | No protocol flash loans; atomic groups cannot replicate pattern |
| Access control failures | Developer-managed; requires custom code + audit | Protocol-level freeze, clawback, rekeying primitives |
| Formal verification | Possible but state space is large | Bounded programs make verification tractable |
| Business logic bugs | Developer responsibility | Developer responsibility |
| Oracle manipulation | Flash-loan amplified; requires TWAP defenses | No flash loans; still requires TWAP on thin pools |