Balancer hack: claim process

Recovering $9.4M From the Balancer Exploit: How Gnosis Chain Hard-Forked and How to Claim Your Funds


On November 3, 2025, a sophisticated attacker exploited a vulnerability in Balancer V2’s Composable Stable Pools, draining approximately $120–128 million across multiple chains — including roughly $9.4 million on Gnosis Chain.

In the weeks that followed, we coordinated an unprecedented two-phase response: first an emergency soft fork to freeze the stolen funds in place, then a hard fork on December 22, 2025 to transfer control of those funds to a DAO-controlled Safe multisig. All of the exploiter‑controlled funds on Gnosis Chain that could be recovered via the hard fork have been successfully secured.

This post serves two purposes: to provide a full account of what happened and how we responded, and to kick off the recovery claim process so affected users can reclaim recovered tokens.


Claiming Your Funds

We are now beginning the process of making the recovered funds available for claim to affected users, in line with the Recovery Claim Terms. Before the claim page goes live, we are publishing the full list of affected addresses and claimable amounts so that the community can review them and flag any discrepancies.

How It Works

  1. Review period (now): The CSV lists every affected address and the tokens they can recover. Please review the data and report any issues or questions in the comments of this post.
  2. Claim page: Once the review period concludes and the data is confirmed, a claim page will go live where affected users can connect their wallet and recover their tokens. The claim process is powered by Merkl, the same infrastructure Balancer is using for their own redistribution on other chains.
    UPDATE: The claims portal is now open: https://gnosis-balancer-claim.eth.link/.
  3. Optional donation: The claim page will include a donation slider. If you wish, you can donate a portion of your recovered funds to the teams who contributed to the recovery effort — the client teams, core contributors, and others who spent many stressful, sleepless nights making this possible. The slider defaults to 5% and is entirely optional. Any amount is appreciated, but there is absolutely no obligation.

Affected Addresses and Claimable Amounts

If your address appears in this list and you believe the amounts are incorrect, or if you believe your address should be listed but is not, please leave a comment below with details so we can investigate before the claim page goes live. The CSV can be found here.

Methodology

The CSV file was generated using the maxyz-xyz/balancer-upscale-exploit-shares repository, and allows everyone to independently confirm the content of the file. The Beefy team has already validated the output.


Full Technical Account

The rest of this post provides a comprehensive technical deep-dive into the exploit, our response, the hard fork implementation, and the community debate that accompanied one of the most consequential decisions in Gnosis Chain’s history.

Table of Contents

  1. The Balancer V2 Exploit
  2. The Vulnerability: Precision Loss in Composable Stable Pools
  3. The Attack Methodology
  4. Immediate Aftermath Across Chains
  5. Our Response: The Soft Fork
  6. The Hard Fork Decision
  7. Technical Specification of the Hard Fork
  8. Implementation Across Execution Clients
  9. Why This Approach and Not Another
  10. Community Debate: Immutability vs. Accountability
  11. Timeline of Events
  12. Conclusion

The Balancer V2 Exploit: November 3, 2025

Balancer is one of the oldest and most established decentralized exchange (DEX) and automated market maker (AMM) protocols in the DeFi ecosystem. At the time of the exploit, Balancer V2 had undergone 11 audits by four different security firms and was widely regarded as one of the most battle-tested protocols in DeFi.

The attack targeted Composable Stable Pools — a specialized pool type designed for trading assets that hold near-parity value to each other, such as USDC/USDT or WETH/stETH. These pools use StableMath, a variant of Curve’s invariant math, to offer minimal slippage for correlated assets.

The total damage across all chains exceeded $120 million, making it one of the largest DeFi exploits of 2025. White hat hackers were able to recover approximately $28 million, but the majority of the stolen funds initially remained under the attacker’s control.


The Vulnerability: Precision Loss in Composable Stable Pools

According to the post-incident analysis by the SlowMist security team, the vulnerability resided in the integer fixed-point arithmetic used to calculate scaling factors inside Composable Stable Pools.

Root Cause

The Balancer V2 math library uses fixed-point integer arithmetic with 18 decimal places of precision (i.e., values are represented as integers scaled by 10^18). When computing swap outputs for very small amounts, the rounding behavior of integer division creates tiny but systematic discrepancies between the theoretical price and the actual computed result.

Under normal conditions these rounding errors are negligible — fractions of a wei. However, the attacker discovered that by carefully manipulating pool liquidity and executing precisely calibrated sequences of small swaps, these errors could be amplified and extracted as profit.

Key Technical Details

  • Affected pool type: Composable Stable Pools (CSPv6)
  • Root cause: Precision loss in fixed-point FixedPoint.mulDown() and FixedPoint.divDown() operations during scaling factor calculations
  • Attack vector: Batch swaps chaining multiple operations within a single transaction
  • Amplification mechanism: Repeated cycles of small swaps that compound rounding errors
  • Prerequisite: The attacker first drained pool liquidity to amplify the relative magnitude of precision errors in subsequent small-amount swaps

The Attack Methodology

The attacker executed a sophisticated multi-step strategy, repeated in cycles:

  1. Liquidity Drain: Swap BPT (Balancer Pool Tokens) for underlying liquidity tokens to reduce the pool’s reserves, making subsequent precision errors proportionally larger.

  2. Precision Setup: Perform preparatory swaps between liquidity tokens (e.g., osETH → WETH) to position balances at specific decimal boundaries.

  3. Error Accumulation: Execute carefully controlled small-amount swaps (e.g., osETH → WETH) that trigger precision loss in the rounding calculations, each time extracting a tiny excess output.

  4. Liquidity Restoration: Swap between liquidity tokens in the reverse direction (WETH → osETH) to restore enough liquidity for the next cycle.

  5. Amplification Loop: Repeat steps 2–4 many times to continuously compound the accumulated error.

  6. Extraction: Swap the liquidity tokens back into BPT to restore the pool to a superficially balanced state while pocketing the accumulated profit.

Through this methodology, the attacker pushed the system into settling a final amountOut that exceeded the true amountIn owed, generating substantial profit on each cycle.

Funding and Execution

SlowMist traced the attacker’s operations across multiple addresses and chains. Initial funds were routed through Tornado Cash, then through intermediate nodes and cross-chain gas.zip usage, before being assembled on Ethereum-based addresses. The attacker held prepared positions across multiple networks to exploit the same vulnerable pool type simultaneously.


Immediate Aftermath Across Chains

The response varied significantly across affected networks:

Chain Estimated Loss Response
Ethereum ~$80M+ CSPv6 pools paused, factory disabled, gauges killed. White hat recovery of ~$28M (including 5,041 osETH worth ~$19M).
Gnosis Chain ~$9.4M Emergency soft fork freezing attacker’s address, followed by hard fork. Monerium froze EURe balances. StakeWise froze osGNO (~$2M).
Arbitrum Significant No validator-level intervention possible.
Base, Polygon, others Various Limited recovery options.

Balancer offered a 20% bounty for the return of stolen funds to both white hats and the attacker. As of the time of the hard fork, this bounty remained unclaimed by the primary attacker.

The key differentiator for Gnosis Chain was that the funds remained on-chain in identifiable wallets and our validator set was coordinated enough to act.


Our Response: The Soft Fork

The Decision to Act

On November 5, 2025, two days after the exploit, we published the first update on the Gnosis Forum. The post outlined the situation and the options available:

“Our goal remains to get to a point where censorship — even at the validator level — is impossible. But, since validators do still have an ability to act, the question is how we use it. To stand aside because power can be abused or to act responsibly while we can?”

Why a Soft Fork First?

A hard fork would have required all ~340,000 validators to upgrade almost immediately, risking network disruption and penalizing smaller independent validators who might not be online 24/7. We chose a soft fork as the initial measure because:

  • It allowed voluntary adoption by validators without network disruption
  • Validators could adopt a client update that simply refused to attest to blocks that included transactions from the attacker’s address (0x506d1f9efe24f0d47853adca907eb8d62e3207) and deployed smart contracts
  • It preserved validator autonomy — each validator chose whether to participate
  • It bought time for the community to coordinate a broader response
  • It did not require consensus from all validators — only a majority (>50%) needed to adopt it

A Critical Property: Zero Chain Modification

A crucial and often misunderstood aspect of the soft fork is that it did not modify the chain state in any way. No blocks were rewritten, no transactions were reversed, no balances were altered. The soft fork was purely a block production policy: validators running the soft-fork client simply refused to attest to blocks that included the attacker’s transactions. The chain’s history, state, and rules remained completely untouched.

This means the soft fork was fully and trivially reversible at any moment. If a majority of validators had decided to stop running the soft-fork client and revert to standard software, everything would have gone back to normal — as if nothing had ever happened. The attacker’s funds would have been unfrozen, and the attacker could have moved them freely. There was no lasting mark on the chain from the soft fork itself; it existed only as a collective, voluntary, real-time decision by validators about which transactions to include in new blocks.

This property is what made the soft fork an appropriate emergency measure: it bought time without committing the chain to anything irreversible, preserving the community’s ability to deliberate on next steps with full optionality.

Implementation

The soft fork was coordinated discreetly to avoid alerting the attacker. Once over 50% of validators had adopted the soft-fork client, we publicly announced the measure. Bridge governors also temporarily halted bridge activity to prevent the attacker from moving funds off-chain.

Martin Köppelmann, co-founder of Gnosis, stated:

“What triggered me to try to get the soft-fork done was indeed protecting users. What described as ‘Low-risk DeFi’ is what Gnosis has focused on in the last couple of years. And I cannot: 1) promote users / ‘normal people’ our products 2) if something happens not do anything I can to try to fix it.”


The Hard Fork Decision

While the soft fork successfully froze the stolen funds, it was inherently fragile and temporary. Because it made no modifications to the chain whatsoever — it was purely a voluntary validator policy — it could evaporate at any moment if validator participation dropped below the required threshold:

  • It required ongoing, active cooperation from a majority of validators; if they stopped running the soft-fork client, the freeze would vanish instantly and the attacker would regain full access to the funds
  • Any future client updates could inadvertently break the censorship rule if validators upgraded without the soft-fork patch
  • The funds could not be redistributed to victims — only prevented from moving
  • The longer the soft fork persisted, the higher the risk of the freeze breaking

On December 12, 2025, we announced on the governance forum that execution client releases for a hard fork were ready:

“Since then contributors, validators and other stakeholders have been working on a hard fork intended to create a technical path for the potential return of stolen funds. Gnosis Chain rules are baked into the code the validators run. The last step is the crucial one: a majority of validators must adopt the new binaries in order for the hard fork to succeed.”

The hard fork was set to activate at 16:11:40 UTC on December 22, 2025 (Unix timestamp 1766419900). Node operators were given 10 days to decide whether they wanted to update or not.


Technical Specification of the Hard Fork

The hard fork was formally specified in the gnosischain/specs repository.

Core Mechanism: Irregular State Transition

The hard fork introduced an irregular state transition — a one-time modification to the chain state that occurs outside of normal EVM execution. The specification defines:

“Introduce an irregular state transition on Gnosis Chain to replace the code of the Balancer V2 attacker’s externally owned account (EOA) with a restricted forwarding contract. This enables coordinated recovery and subsequent redistribution of funds taken in the Balancer V2 exploit of November 3, 2025.”

What Happens at Fork Time

During block processing of the first block whose timestamp crosses BALANCER_HARDFORK_TIMESTAMP, and before the system calls of EIP-4788 (beacon root) and EIP-2935 (historical block hashes), the bytecode of the attacker’s account MUST be set to the rescue contract bytecode.

No other account fields (balance, nonce, storage) are modified.

Parameters

Constant Value
BALANCER_HARDFORK_TIMESTAMP 1766419900 (Dec 22, 2025 16:11:40 UTC)
BALANCER_ATTACKER_ADDRESS 0x506d1f9efe24f0d47853adca907eb8d89ae03207
BALANCER_RESCUE_ADDRESS 0x7Be579238a6a621601Eae2c346cDA54d68F7dfee
BALANCER_RESCUE_BYTECODE (see below)

Reference Implementation (Pseudocode)

def process_block(parent_header, block, state):
    if (
        parent_header.timestamp < BALANCER_HARDFORK_TIMESTAMP
        and block.header.timestamp >= BALANCER_HARDFORK_TIMESTAMP
    ):
        state.account(BALANCER_ATTACKER_ADDRESS).bytecode = BALANCER_RESCUE_BYTECODE

    # ... continue with regular block processing, including EIP-4788 and EIP-2935.

The Rescue Contract (HardcodedForwarder)

The bytecode injected into the attacker’s account is a minimal Solidity contract with a single hardcoded owner:

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.30;

contract HardcodedForwarder {
    /// BALANCER_RESCUE_ADDRESS
    address public constant owner = 0x7Be579238a6a621601Eae2c346cDA54d68F7dfee;

    modifier onlyOwner() {
        require(msg.sender == owner, "not owner");
        _;
    }

    function execute(
        address target,
        uint256 value,
        bytes calldata data
    ) external onlyOwner returns (bytes memory result) {
        require(target != address(0), "zero target");
        require(target.code.length > 0, "not a contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);

        if (!success) {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(returndata, 0x20), returndata_size)
                }
            } else {
                revert("call failed");
            }
        }

        return returndata;
    }

    receive() external payable {}
}

Key design properties:

  • Single immutable owner: The BALANCER_RESCUE_ADDRESS (0x7Be579238a6a621601Eae2c346cDA54d68F7dfee) is hardcoded as a constant — it cannot be changed.
  • Forward-only to contracts: The execute function can only call non-zero contract addresses, preventing direct ETH transfers to EOAs.
  • No state of its own: The contract holds no storage, minimizing the attack surface.
  • EIP-3607 enforcement: Because the attacker’s account now has bytecode, EIP-3607 prevents any transaction originating from this address from being included in blocks, even though the attacker still holds the private key. This is because EIP-3607 rejects transactions from accounts that have non-empty code.

The BALANCER_RESCUE_ADDRESS was configured as a Gnosis Safe multisig with the same signer set as other DAO Safes. Initially deployed with a single signer for shadow fork testing, the signers were updated on December 15, 2025 to match the DAO’s multisig configuration before the fork went live.


Implementation Across Execution Clients

The hard fork required implementation across all four execution layer (EL) clients supported on Gnosis Chain. The work was completed by the respective client teams in coordination with our core developers over the course of approximately 6 weeks.

Nethermind — v1.35.8

  • Release: v1.35.8 (December 19, 2025)
  • Commit: c066aee
  • Notes: The release also included optimized getProofs RPC endpoints and build-time signing of release artifacts. The Balancer hardfork support was integrated into Nethermind’s Gnosis Chain configuration, with the irregular state transition being applied at the specified timestamp. Nethermind holds the supermajority client position on Gnosis Chain.

Erigon — v3.3.2

  • Release: v3.3.2 “Rocky Romp” (December 13, 2025)
  • PR: #18282 “Balancer cherry picks”, cherry-picked from #18122
  • Merge commit: 7d0dd4f
  • Key commits:
    • a6c5ba0 — Set fork time
    • dfaf16c — “Balancer HF: support code rewrite” (by yperbasis and mh0lt)
    • 92fe7e0 — Censoring in state_transition
    • e4ce76e — Add sender/authority censoring to txpool
    • e25c0aa — Add override.balancer flag
    • 4664f24 — Override CensoringSchedule
    • 37ec713 — Use *big.Int for BalancerTime so that it feeds into the fork ID
  • Contributors: mh0lt, yperbasis, AskAlexSharov
  • Notes: Erigon’s implementation notably includes the censoring logic in both the state transition and the transaction pool. The override.balancer flag allows operators to explicitly opt in or out.

Reth (Gnosis) — v1.0.0

  • Release: v1.0.0 (December 12, 2025)
  • Commit: 159a354
  • Key PRs:
  • Contributor: debjit-bw
  • Notes: This was a major release for reth_gnosis, marking its v1.0.0. It also introduced pre-merge history support via ERA file imports and migrated state files to Cloudflare R2. Important: Upgrading to v1.0.0 from any previous version required a full database resync. Built on upstream paradigmxyz/reth v1.9.3, including Fusaka-ready logic.

Geth (Gnosis) — v1.16.7-gc.9

  • Release: v1.16.7-gc.9 (December 14, 2025)
  • Commit: 40d619f
  • Repository: gnosischain/go-ethereum
  • Notes: The Gnosis fork of go-ethereum (Geth). This release included the Balancer hardfork support specific to Gnosis Chain’s configuration.

Consensus Layer Clients

For completeness, the consensus layer (CL) clients also required updates, though the core fork logic resides in the EL:

Client Version
Nimbus v25.11.1
Lighthouse v8.0.1
Teku v25.11.1
Lodestar v1.37.0

The Formal Spec

The full formal specification is available in the gnosischain/specs repository:


Why This Approach and Not Another

Several alternative approaches were considered or discussed. Understanding why we chose the bytecode-replacement approach illuminates the constraints and trade-offs involved.

Why not a simple balance transfer (state override)?

A direct balance transfer (debiting the attacker’s account and crediting victims) would have been more invasive. The stolen funds were not simply native xDAI sitting in the attacker’s EOA — they existed as various ERC-20 token balances (Balancer V2 account balances, EURe, etc.) held in smart contracts where the attacker’s address was the authorized party. Simply moving ETH/xDAI balances would not recover these tokens.

The bytecode replacement approach is more surgical: it doesn’t touch the attacker’s balance, nonce, or storage. Instead, it gives the DAO-controlled rescue address the ability to execute arbitrary calls as the attacker, which means it can interact with the Balancer Vault and other contracts to properly withdraw and redistribute all token types.

Why not revert the transactions (chain rollback)?

A chain rollback (reverting to a state before the exploit) was never seriously considered. Unlike the 2016 Ethereum DAO fork, the Balancer exploit had been live for weeks before the hard fork. Reverting weeks of chain history would have invalidated thousands of legitimate transactions and would have been catastrophic for the ecosystem.

Why not just let the DAO reimburse victims?

Some community members suggested the DAO should simply cover the losses from its treasury. As we responded:

“I cannot understand how anyone could expect the DAO to reimburse anyone for Balancer getting hacked? So a protocol deployed on Gnosis gets hacked for $10m, and you expect Gnosis DAO to lose $10m, whether they had $0 or $10m in Balancer, and everyone else walks out whole? Why?”

Additionally, the DAO’s exposure to the hack was reportedly less than 2% of its holdings — the primary motivation was protecting retail users who had deposited in what was marketed as “low-risk DeFi.”

Why not wait for a governance framework first?

Several community members argued the hard fork should be delayed until a formal governance framework for such interventions was established. We explained the urgency:

“There is another critical downside: the soft fork is inherently fragile. Every day the hardfork is delayed, chances of recovering any funds diminish significantly, especially when new client versions are released, as people tend to update to those. If we delay this until after New Years, I give a non-insignificant chance of wasting all our efforts for the past 1.5 months and losing all the funds.”

Why bytecode replacement specifically?

The choice to replace the attacker’s account bytecode rather than modifying balances directly was motivated by:

  1. Minimal state change: Only the account’s code field is modified. Balance, nonce, and storage remain unchanged.
  2. EIP-3607 compliance: Once the account has code, the attacker can no longer send transactions from it — the private key becomes useless for transaction signing.
  3. Flexibility: The rescue contract allows the DAO to execute arbitrary calls as the attacker, enabling interaction with any contract where the attacker has permissions or balances.
  4. Auditability: All rescue operations happen as normal on-chain transactions, fully visible and verifiable.
  5. Preservation of history: No historical blocks or transactions are modified. The chain’s history remains fully intact and immutable.
9 Likes

Why We Acted

There were a total of 344 wallets affected by an upstream exploit on Balancer that involved over 5% of Gnosis TVL at the time of the attack.

Gnosis DAO provides a backbone of liquidity for the network and accounted for the majority of the affected funds, representing less than 2% of the total DAO treasury. But, beyond the DAO’s own exposure, over 340 individual wallets were impacted. Choosing collectively not to protect users would be in direct conflict with our mission of mainstream adoption and low-risk DeFi.

To remove any future question, we have begun work on a clear and objective framework for when and how the network intervenes in the event of any future exploit. The next stage of that will be published in coming days and we look forward to discussing it with you.


Community Debate: Immutability vs. Accountability

The hard fork triggered one of the most substantive governance debates in Gnosis Chain’s history, playing out primarily on the Gnosis Forum across 40+ posts. We believe it is important to present both sides transparently.

Arguments in Favor

Lefteris Karapetsas (founder of Rotki, privacy-focused portfolio tracker):

“This has nothing to do with abstract debates on decentralization. When a clearly identified exploit of this scale on an established protocol occurs, and when the chain has the technical and social ability to remediate it, choosing not to act is not neutrality. It’s rather a decision to let the consequences stand. […] A chain that cannot correct an exploit when it has the tools to do so is not ‘more decentralized’, it is simply less accountable.”

Joseph Schiarizzi (Ethereum builder, on X):

“Anyone who criticizes this is wrong. Taking a stand and fighting back is the right thing to do.”

Serenita (Luca) — a major validator operator with delegated stake — supported the fork while calling for a governance framework:

“We are currently not aware of broad discontent about this rescue operation, and therefore plan to support it with the intent to return hacked funds to their owners.”

Arguments Against / Concerns

MichaelRealT (RealT protocol team) raised the precedent problem:

“Are we going to perform a hard fork for every wallet hack or anything else? Won’t this lower the quality of applications, which will assume that a hard fork is possible in case of a hack? […] To accept a hard fork, you need a strict framework that no one can deviate from, a framework applied by the DAO for the DAO itself, not for the needs of a group of people.”

TheVoidFreak articulated the immutability erosion risk:

“If the only learning is: The blockchain is actually not immutable as there only needs to be a consensus of less than 60 people to overwrite the blockchain state and it would be done fast as long as these people see it fit. Then this would be the worst possible learning from this incident.”

NolanV raised concerns about unequal treatment, pointing to a previous incident involving the same Balancer EURe/sDAI pool where an oracle misconfiguration caused hundreds of thousands of euros in losses to LPs, but no intervention was made:

“When it’s your own money that’s lost, you act much more quickly than when it’s the money of dozens of individuals. I’m not criticizing your intervention. […] What I’m criticizing is the double standard.”

NolanV also challenged the decentralization assumptions, presenting data suggesting the effective number of independent validators was far lower than the headline ~340,000 figure, with perhaps only 100–300 truly independent operators.

Augus urged caution on a philosophical level:

“Don’t set the precedent. ‘Recovery method frameworks’ can corrupt. If you show you can do something, eventually you will be compelled to do it — and it might not be a noble cause like ‘user asset recovery’ but instead censorship/theft.”

kokialgo questioned the process:

“I do not feel confident about executing a hard fork while notifying all validators only 10 days in advance. It feels rushed, even though I know you have been working extremely hard since the hack to find the best possible solution.”

The DeFi Ignas Perspective

Prominent DeFi analyst Ignas supported the fork but echoed the moral hazard concern:

“What if a team member or somebody influential gets hacked, then he would push for a fork? But if some users without power get into trouble, the team might not intervene as they aren’t affected. This creates a serious moral hazard.”

The Resulting Framework Discussion

In response to community concerns, we acknowledged the need for a formal governance framework. A separate forum thread, “A Framework for the Future”, was opened to develop principles governing when and how such interventions should be considered in the future. The general consensus emerging from the debate was:

  1. The default is no intervention.
  2. Any exceptions must be justified against clear and pre-aligned criteria.
  3. These should be defined in the security framework that is currently in discussion.
  4. Our longer term goal is to make interventions progressively harder and eventually impossible.

Timeline of Events

Date Event
November 3, 2025 Balancer V2 exploit occurs. ~$120-128M drained across multiple chains, ~$9.4M on Gnosis Chain.
November 3, 2025 Monerium freezes compromised EURe balances. StakeWise explores freezing osGNO. Bridge governors halt bridge activity.
November 3–5, 2025 The soft-fork was developed with the help of client teams and core developers.
November 5, 2025 at 1:30pm UTC The emergency soft fork was discreetly coordinated with validators.
November 5, 2025 at ~5:00pm UTC An issue with the soft fork was disclosed
November 7, 2025 at 1:30pm UTC A new soft fork was deployed by a majority of validators.
November–December 2025 6 weeks of hard fork development across all 4 EL client teams, extensive shadow fork testing.
December 8, 2025 Hard fork specification PR (specs#87).
December 12, 2025 Hard fork announced on Gnosis Forum. Reth v1.0.0 and Erigon v3.3.2 released.
December 13, 2025 Community debate heats up on forum.
December 14, 2025 Geth v1.16.7-gc.9 released.
December 15, 2025 Spec PR merged. Rescue Safe multisig signers updated to match DAO configuration.
December 19, 2025 Nethermind v1.35.8 released.
December 22, 2025 Hard fork activates at 16:11:40 UTC. Attacker’s EOA code replaced with HardcodedForwarder. Funds now under DAO control.
December 23, 2025 Successful hard fork execution confirmed. Remaining node operators urged to update.

Conclusion

The Balancer recovery hard fork represents a unique case study in blockchain governance, emergency response, and the tension between pragmatism and principle.

On the technical level, the approach was deliberately minimal: an irregular state transition that avoided rewriting history, preserved the chain’s integrity, and used existing EVM mechanisms (EIP-3607) to neutralize the attacker’s key. The implementation across four independent execution clients in six weeks was a significant engineering effort.

On the governance level, the episode exposed real tensions within our community. The decision was ultimately made by validator consensus: each operator chose whether to upgrade. We take the community’s call for a formal governance framework seriously, and work on that front is underway. We also urge GNO holders to stake with smaller node operators or privately, instead of delegating huge amounts of GNO to a few big ones.

On the philosophical level, the debate mirrors a recurring question in blockchain governance: when — if ever — should a community use its collective power to override the outcome of code execution? Our answer was pragmatic: act now to protect users, and formalize the rules for next time.

We believe that in due course, validators should not be able to censor transactions and the underlying network infrastructure should be actually blind. We commit to working towards this future, but in the meantime encourage a community discussion on how and when the community should wield this power it still has when acting in concert.

With the hard fork behind us and the claim process now underway, we are focused on returning every recovered token to the people it belongs to. If your address is in the CSV above, please review the amounts carefully and let us know if anything looks off. The claim page will go live once the community review is complete.


References

Client Releases

Client Version Repository Release
Nethermind v1.35.8 NethermindEth/nethermind Release
Erigon v3.3.2 erigontech/erigon Release
Reth v1.0.0 gnosischain/reth_gnosis Release
Geth v1.16.7-gc.9 gnosischain/go-ethereum Release
10 Likes

Hello thanks for all the effort.
Could you please clarify which CSV we shall refer? I see two differente csv (one is_filtered) with different values in the columns of _usd.

Please refer to shares_gnosis_filtered.csv. In this file, you’ll find:

  • The user column, which is the address that can claim the token
  • The token column, which is the token to claim
  • The user_amount_recovered column, which is the precise amount of token recovered for the user
  • The user_amount_recovered_usd column is an estimate of the USD value at the time of generating the file (not necessarily accurate right now)

The other columns add some context, but shouldn’t be necessary for most checks.

1 Like

So is the file balancer-upscale-exploit-shares/output/shares_gnosis.csv at 3e175c62f9fdc9fb70c029c789b998611e5e93f5 · maxyz-xyz/balancer-upscale-exploit-shares · GitHub wrong?
Here the amount in user_shares_usd Is a diffent value, which is next to my expectation while the _filtered one shows a lower usd value. I’m a little bit confused; but I have some screenshot to share. Can I write somewhere?

1 Like

Hey thanks a lot for your work.

Checked the people I know who used the pool and the amount of the pool token looks correct for the hack day. The aura/shares user share that is.

The rest does not make much sense. The receovered USD value seems quite lower than expected. Close to half. And since the pool is ther sDAI/EURE and the only token I see there as token to claim is sDAI seems like the EURe part is somehow not there?

What about the Monerium/EURe hacked tokens for that pool?

2 Likes

Same in my case. the Beefy share is correct, but the value of recovered USD is very lower, considering it was sDAI-Eure. So I’m still confused on how the recovered_usd have been calculated from the beefy share… while if I take the first shared CSV (not the filtered one) I see coherence between user_shares and user_shares_usd field.

1 Like

Thanks @filoozom. Just confirming on Beefy’s behalf that we’ve reviewed and validated the data against our own internal vault share data for the sDAI-EURe, WETH-wstETH and stEUR-EURe pools. We’re happy that the shares of our users in these pools are properly reflected in the data.

This doesn’t extend to questioning the total amount of funds recovered (as raised in the comments above), but rather is just to ensure that Beefy user shares are properly reflected.

We’ll also notify our users to pay attention and provide feedback to this forum topic :pray:

Hi jack, I think the beefy share value is correct. What some of us don’t understand (also in some telegram channels) is how the value of beefy share (e.g. Moo Aura Gnosis sDAI-EURe) has been calculated in USD, since there is a notable difference respect of usd value reported in beefy (pool reference for instance: Beefy) before the hack, thanks a lot to all for your effort and the professional way you have manage this event on gnosis and beefy side.

2 Likes

Hi,
I was in the sDAI-EURe pool and my address is in the list (shares_gnosis_filtered.csv). However, it only includes the recovered sDAI amount. The EURe is missing. In fact, I don’t see EURe anywhere in the table.
I now see that in shares_gnosis.csv, the user_shares_usd seems to be correct (including the value of the EURe) but this table doesn’t include tokens.

1 Like

USD amount is wrong by almost a factor 2 in EURe-stEUR (beefy vault).
Would be much better if you could show the composition of those LPs in the token units (something like 5000 EURe - 3450 stEUR).
Same issue for sDAI-EURe.

2 Likes

I verified some user_shares and it looks correct, as mentioned by others, this just seems to refer to the sDAI part of the sDAI-EURe pool. Maybe because EURe was frozen by Monerium? Will we be able to also claim the EURe in some way?

2 Likes

From what I was able to gather my wallet gets the 188.33946 tokens linked to the stEUR-EURe pool. But I see no mention of the other gnosis pool sDAI-EURe I had more money in which was 7,654.9862 tokens. Do I get those back too?

Hi everyone, sorry for the late reply! As a few of you have noticed: we were missing the EURe tokens in the recovery file. This was an oversight on my part, and happened because we recovered the EURe quite a bit later than the other tokens, after the other processes were already quite advanced. Apologies!

Here’s the correct file. We’ll delay the release of the claim UI for one more week so that the community can confirm this new version.

I’m not sure what happened to the user_amount_recovered_usd before. I checked a couple of values in the new version that seemed right, but in any case this is not used during the claim process and is only there as indication.

Please validate this file carefully again, thanks!

7 Likes

Thanks this one is easier to read but it also doesn’t contain the 7,654.9862 tokens I lost in the sDAI-EURe pool. Do I need to give my wallet address to verify maybe?

1 Like

You can DM me or hop on our Discord server.

1 Like

Heads up: the search on the GitHub page might not always work. In that case, I’d suggest to download the file and open it in Excel. @Bippy’s funds are confirmed to be present :slightly_smiling_face:

4 Likes

I can confirm everything is fine on my side.

1 Like

Looks good now, thanks!

1 Like

I can see my Wallet, is the transfer automatic, or do we need to fill something out, or validate something?