1,490 withdrawal messages. Replayed in sequence. Not by a stolen key. Not by a rogue validator. By a precision error hiding in plain sight.
The ICON Foundation just disclosed a replay attack that released 119,866,000 ICX and 531,600 bnUSD from its cross-chain bridge wallet. The final accounting: approximately 150.2 ETH and 31,204 USDC in confirmed losses. The rest โ tracked. Much of it recovered. Almost all of it lost because of a single mismatch between what the contract verified and what the contract checked.
The attack was not clever. It was inevitable.
In 2018, I audited the Bancor v1 codebase and found an integer overflow in the liquidity withdrawal function โ a defect that could have drained five percent of protocol reserves. Same species of bug. Different chain. Same verdict: code is law only when the math is flawless. This exploit is the textbook exhibit that when your uniqueness check and your signature verification cover different byte ranges, the contract is not a contract. It is a wish.
Context: The Bridge and Its Assumptions
ICON is a Layer-1 network. Its bridge architecture connects to external chains through relayers โ off-chain participants that forward messages between chains, including withdrawal requests. Every message is cryptographically signed. Every message must execute exactly once. The entire security model rests on two predicates:
- The signature authenticates the message.
- The uniqueness check prevents double execution.
In 2025, ICON introduced a change to standardize withdrawal messages to 32 bytes. The rationale was mundane: simplify cross-chain message handling, reduce ambiguity in parsing. Standardization intended to tighten verification. Instead, it fractured the boundary between the signed payload and the checked identifier.
Part of the serial number processing began flowing through float64 range logic instead of exact integer arithmetic. Float64 โ IEEE 754 double precision โ is an approximation. Beyond 2^53, it cannot represent every integer exactly. For a banking system, this is a rounding footnote. For a blockchain, this is the foundation collapsing.

The serial number logic sat at the intersection of two systems. One system wanted compatibility with float64-based parsing downstream. The other system required exact integer semantics for replay protection. ICON chose both. The contradiction went unnoticed.
Core: The Anatomy of a Precision Failure
The attack is now public. Let me reconstruct the exact path.
The standardization change split the withdrawal identifier into two components: high bits and low bits. The low 256 bits โ the cryptographically verified payload โ remained untouched by the signature and were validated correctly. The high bits โ the attacker-modifiable section โ passed through float64 range logic during the uniqueness check. These ranges were processed with floating-point semantics. Precision was lost. A range that should have been continuous became, in effect, a set of buckets where different integers could collide or, worse, be considered distinct when only a few bits had changed.
The signature covered the low bits. The uniqueness check inspected the high bits. Same message. Different ranges. No cryptographic link between what was protected and what was enforced.
The attacker modified the unsigned high bits of the withdrawal identifier. The signature did not change. The payload did not change. The verification passed cleanly. The uniqueness check saw a fresh identifier because the high bits differed from any prior submission. The contract authorized execution.
Then the attacker repeated the operation. Again. And again. And again.
1,490 times.
This is not an attack on elliptic curve cryptography. It is not a breakthrough in hash collision. It is an implementation defect so elementary that it belongs in a first-year auditing practicum. Math has no mercy. Precision loss in a type conversion is not a minor edge case; it is a systemic contradiction between what the code verifies and what the code executes. The gap between those two sets is the formal definition of a vulnerability.

The deeper problem is not the bug. The deeper problem is the audit.
In November 2025, a relay audit was completed for ICON. Nine findings were disclosed. None flagged the serial number mismatch. The affected migration contract source code was likely outside the audit's coverage scope entirely. The foundation paid for a review. The review examined a different attack surface. The vulnerability sat in un-audited code, waiting for someone who noticed the gap.
From my 2022 work modeling the Terra/Luna death spiral mechanics, the lesson I carried forward was structural fragility masked by narrative confidence. Three weeks before the collapse, my models showed deaths-spiral conditions that did not require a black swan event โ only a yield drop below market rates. Here, the same pattern repeats: a fragility that the dominant narrative โ "audited, therefore safe" โ refuses to quantify. Audits are point-in-time inspections of a scoped surface. They are not proofs. They are not guarantees. They are, at best, evidence that a specific list of known failure modes did not appear in a specific code snapshot.
This event adds a new entry to that list: range mismatch between uniqueness enforcement and signature coverage. It is a class of bug that standard audit checklists โ reentrancy, overflow, access control โ do not systematically hunt.
The operational timeline reveals the next layer of risk.
At 02:44, the attacker began dispersing ICX to multiple exchanges. The monitoring system detected the abnormal withdrawals within seven minutes. The foundation paused contract execution after 105 minutes.
Seven minutes to detect. Ninety-eight additional minutes for the attacker to move funds. Those ninety-eight minutes define the loss envelope. The detection mechanism worked โ credit where due โ but time-to-pause is the security metric that matters. At a hundred and five minutes, the attacker had already established positions across multiple exchange deposit addresses. Some of that dispersion likely converted to realized value before freezing took effect.
The foundation's own disclosure notes that "the amount of funds held by exchanges may still be adjusted." Translated: the net loss number is provisional. More losses may surface as exchange reconciliation completes.
Three exchanges โ Bitvavo, Bitget, and KuCoin โ suspended ICX deposits and withdrawals. Liquidity was removed. Price discovery fractured. When exchanges freeze the rails, the market cannot fully express its reaction. That is a protective mechanism. It is also a tell: centralized venues now function as the de facto emergency brake for decentralized security failures.
The Tokenomic Shock Absorber
Now the uncomfortable part โ the accounting.
The released sum โ 119,866,000 ICX and 531,600 bnUSD โ came from the ICON Foundation's treasury holdings. The foundation states that user deposits, balances, and positions were unaffected. If accurate, the protocol's custody model held. No user assets were compromised. The net loss is small next to the gross volume released.

But "small" is not "zero." And the narrative damage is not denominated in dollars. The treasury now carries a line item: "losses from replay attack." That line item is permanent. It will appear in every future risk assessment, every future audit, every future partnership discussion. Rug pulls are just bad code โ and this was not a deliberate rug. It was a defect that walked like one.
Could the losses have been worse? Yes. Had the attacker exploited the same gap across additional bridge-facing functions โ or moved toward deeper liquidity faster โ the damage would have compounded. Precision loss bugs scale linearly with attack surface. This one was capped by the specific geography of the vulnerable code path. Surviving by spatial luck is not a security strategy.
Contrarian: What the Bulls Got Right
I will now defend the other side. It deserves a fair accounting.
The ICON response had a functional spine. The monitoring system flagged anomalous withdrawal behavior in seven minutes. The foundation froze execution in 105. Most released assets were tracked on-chain. A substantial portion was recovered. User funds were never touched.
For a Layer-1 project under live attack, these are not trivial outcomes. In crypto, multi-billion-dollar hacks with zero recovery attempts happen every cycle. By the industry's degraded baseline, this response was disciplined. The net economic loss is immaterial for a treasury of this scale. The attack did not break the fund accounting. It did not violate the user custody model. It exploited a single boundary condition in a migration contract โ not the consensus layer, not the relayer's cryptographic primitives, not the validator set.
This matters. When I say "high yield, high graveyard," I am describing projects where the yield is the product and the graveyard is the destination. ICON is not that. This is a security event layered on top of a functioning network โ disappointing, financially painful, but not structurally existential.
However โ and this is the bridge to the verdict โ the bulls cannot claim a clean bill of health. "Safu" narratives are cheap. They point to recovery, speed, and a narrow blast radius. They cannot point to a process that prevents the next float64 surprise. The audit missed it. The test suite missed it. The code review missed it. The only reason the market knows about this bug is because an attacker found it first.
That is the uncomfortable symmetry of security economics: the person who finds the bug first sets the price.
Takeaway
The ICON replay attack is a tempest inside a precision error. It is also a warning that extends far beyond one Layer-1 project: the audit scope is the load-bearing wall of every cross-chain security model, and this wall had a missing brick. Until uniqueness-check ranges are fuzz-tested against signed ranges across every standardized message format, this class of bug will return. The remediation ICON publishes will be telling. If it includes formal verification of message serialization and differential testing against float64 conversion paths, there is a path forward. If it is another scoped audit with another checklist, the lesson was not learned.
The industry does not need more trust. It needs a stack that does not depend on trust. My rule has always been simple: trust, but verify โ no. I verify the stack first. Then I decide whether trust is even necessary. Math has no mercy. Neither should your due diligence.