---
title: Iron Fish ends support for its network after an inflation bug let note holders spend the same note twice and exit through the ChainPort bridge | ctxsec
url: https://ctxsec.com/items/iron-fish-merkle-note-position-alias-inflation-bug-network-shutdown
description: "Iron Fish says abnormal wIRON activity on the ChainPort bridge traced to an inflation bug. Its postmortem says the Merkle tree padded empty right branches by copying the left one, so a holder could prove one note at a second position, get a different nullifier and spend it again. The fix only works for a new chain."
status: "official (Iron Fish on X, Oct 30; fix commit and draft postmortem in the iron-fish/ironfish repo); losses not stated in the primary sources we read"
published: 2026-10-31
---

> Iron Fish says abnormal wIRON activity on the ChainPort bridge traced to an inflation bug. Its postmortem says the Merkle tree padded empty right branches by copying the left one, so a holder could prove one note at a second position, get a different nullifier and spend it again. The fix only works for a new chain.

[← Cybersecurity News](/news) · [markdown](/items/iron-fish-merkle-note-position-alias-inflation-bug-network-shutdown.md)

official (Iron Fish on X, Oct 30; fix commit and draft postmortem in the iron-fish/ironfish repo); losses not stated in the primary sources we read

2026-10-31

### Iron Fish ends support for its network after an inflation bug let note holders spend the same note twice and exit through the ChainPort bridge

Privacy blockchain **Iron Fish** posted on **Oct 30** that it is ending all remaining support for the network. It says it saw abnormal activity involving **wIRON** and the **ChainPort** bridge a few days earlier and, after reviewing ChainPort's logs with them, found the cause was an inflation bug.

The team's draft postmortem (committed Oct 30) explains the flaw:

- The note commitment tree filled a missing right branch with a copy of its left branch, `H(left, left)`. Swapping the two equal inputs leaves the root unchanged but changes the hidden position bit in the spend proof.
- The position feeds the note's public **nullifier**, so the same note proved at an aliased position produced a different nullifier, and the duplicate-spend check didn't catch it.
- Only someone holding the note's spending key could do this. It didn't let attackers spend other users' notes, but it let a holder spend their own note more than once and create value that didn't exist.
- The fix pads with a fixed empty value instead. It changes consensus roots, so it only applies to **a new chain with a new genesis**; the existing mainnet history can't be made compatible.

The postmortem says tying specific on-chain events or amounts to this bug still needs separate forensic work. Dollar figures circulating on X weren't in the primary sources we read, so we've left them out.

The lesson for anyone auditing ZK systems: check that every private witness value, such as a Merkle position, is actually bound by the public data the verifier checks.

Sources: [Iron Fish on X (Oct 30)](https://x.com/ironfishcrypto/status/2116278010802586090) · [Iron Fish postmortem: Merkle note position alias (draft)](https://github.com/iron-fish/ironfish/blob/master/docs/merkle-note-position-alias-postmortem.md) · [Fix commit c5c3c22 (#5762)](https://github.com/iron-fish/ironfish/commit/c5c3c22bfc)
