Privacy public chain Iron Fish will terminate the network’s remaining support, confirming a 2019 Merkle tree inflation bug
Privacy public chain Iron Fish posted on the X platform on October 30, 2026, saying it would terminate all remaining support for the Iron Fish network later that day. The team said it recently detected abnormal activity in wIRON and the ChainPort cross-chain bridge. After investigating with ChainPort and reviewing logs, it confirmed that the root cause was an inflation bug in the Iron Fish blockchain itself, not the cross-chain bridge.
The bug can be traced back to a submission in an implementation of the Merkle tree in early 2019. At the time, a developer implemented a standard Merkle tree, but due to a subtle difference in how the note nullifier (a mechanism that allows users to spend their funds) was calculated, an attacker was able to use the same note multiple times. The attacker then used this bug to aggregate multiple notes and complete the transfer of funds through the ChainPort cross-chain bridge. The team pointed out that although this code path was within the scope of both internal and external audits, the bug was not discovered. Iron Fish has submitted a patch and attached a detailed postmortem report (the relevant PR includes the postmortem), and will then close and archive the Iron Fish code repository.
Iron Fish said in its statement that software that cannot be upgraded immediately (which most projects in the crypto space are) is in an extremely vulnerable position; the ability to discover and exploit complex code bugs is increasingly becoming commoditized. The team thanked the community and wished the crypto industry would find a way forward. The postmortem on GitHub further explains that in the old implementation, an empty right branch was filled by copying the left branch, causing the same note to be able to produce a valid proof and a different nullifier at different positions, thereby bypassing the double-spend check; the fix only applies to a new chain started from a new genesis block and is incompatible with the existing mainnet history.
Original sources:
Title: Iron Fish official X platform announcement
Publisher: Iron Fish (@ironfishcrypto)
Date published: 2026-10-30
URL: https://x.com/ironfishcrypto/status/2116278010802586090
Nature of source: original post by a party concerned
Verification status: the full original post was read for this report, verification date 2026-10-31
Supporting content: termination of remaining support, discovery of abnormal activity, confirmation of the inflation bug in cooperation with ChainPort, tracing back to a 2019 Merkle tree submission, duplicate spending caused by differences in nullifier calculation, transfer through the bridge, audit failure to detect it, submission of a patch and archiving after the postmortem, and the statement on software that cannot be upgraded immediately and the commoditization of bug discovery.Title: Merkle note position alias postmortem
Publisher: Iron Fish (GitHub repository)
Date published: 2026-10-30 (relevant commit)
URL: https://github.com/iron-fish/ironfish/blob/master/docs/merkle-note-position-alias-postmortem.md
Nature of source: official document
Verification status: the full text was read for this report, verification date 2026-10-31
Supporting content: technical details of the bug mechanism (empty right branch copied, causing positional aliasing and different nullifiers), the fix only applying to a new chain, and comparisons with Zcash-related design details.
ABAB AI Insight
Iron Fish is a Layer-1 network centered on private transactions, using a note commitment and nullifier mechanism similar to Zcash Sapling to hide amounts and transacting parties. Its Merkle tree is used to prove that a note exists in the commitment tree, while the nullifier serves as a public identifier to prevent the same note from being spent twice. The Merkle tree implementation from early 2019 chose a padding method of “copying the left branch when the right branch is empty,” and this rule was carried over into later production code. Because nullifier calculation depends on the note’s private position in the tree, once an attacker controlled the spending authority of their own note, they could construct proofs with different paths that produce the same root but different nullifiers, thereby spending the same note multiple times and creating excess output.
ChainPort, as the cross-chain exit for wIRON, became the channel through which the attacker transferred the results out of the native chain. After discovering abnormal wIRON issuance on Base, the team worked with the bridge side and ultimately identified the root cause as the native chain rather than the bridge itself. The GitHub postmortem makes clear that the fix changed the consensus root calculation rule, so it only applies to a new chain started from a new genesis block; the history of the existing mainnet and testnet cannot be made compatible through a simple upgrade. This is consistent with the upgrade constraints faced by most early privacy or custom-consensus chains: once state accumulates under the old rule, a rule change constitutes a hard fork and is difficult to make backward-compatible.
Compared with related circuit issues disclosed in Zcash pools such as Orchard, this incident in Iron Fish was a defect in the interaction between the tree padding rule and nullifier position binding, rather than a direct allowance to spend someone else’s note. The audit covered the code path but did not catch this aliasing case, reflecting the difficulty of verifying cross-component invariants in privacy proof systems, such as root binding, positional uniqueness, and nullifier uniqueness. Iron Fish chose to terminate support and archive the repository rather than attempt to forcibly upgrade the existing chain, meaning users holding native IRON or wIRON through the bridge must handle the remaining assets and bridge positions themselves, and there is no further maintenance path from the team.
For privacy public chains, such incidents highlight the risks of long-running complex cryptographic implementations in environments where immediate upgrades are not possible. Improvements in bug discovery capability, including model-assisted methods, make subtle differences in historical code easier to exploit, while bridges amplify the propagation of native-chain inflation to other chains. One indicator to watch is the actual redemption and supply adjustment situation of the relevant bridge and wrapped asset, as well as whether projects with similarly non-upgradeable privacy or custom tree implementations conduct targeted reviews.
ABAB News · Laws of cognition
Auditing code paths does not mean capturing cross-component positional aliasing invariants.
Once consensus rules that cannot be upgraded immediately accumulate history, a fix becomes incompatible with the old chain.
Bridge exits turn native-chain inflation into a cross-chain transferable supply imbalance.