The Singularity Finance DynaVault Hack
The dynBaseUSDCv3 vault on Base was drained after an admin set a Uniswap fee tier that does not exist. The team blamed the attacker.
On 25 April 2026 the dynBaseUSDCv3 vault on Base was drained of 413,132 USDC. Three months earlier, someone at Singularity Finance had pointed its oracle at a Uniswap V3 fee tier that does not exist. The vault could no longer see the value of its assets. An attacker then used a 100,000 USDC flash loan to buy almost all its shares and redeem them against everything inside. It was not a clever attack.
The team described it once, in Telegram, as an attacker manipulating an oracle with a flash loan. The X version is deleted. A post-mortem promised the next day still does not exist nearly four months on, both dates given for it have passed, and the team has not said whether anyone will be reimbursed. That is a long time to say nothing about money taken from users.
I am writing this down because the project has not. Every event below can be checked against the chain or the sources at the end, and I will extend it as things happen.
Timeline
13 September to 17 December 2025. Fee tier 42 first appears in two transactions, then in twenty-four more routes and another fourteen. The initial configuration had used real tiers. By the end of the year the oracle carries 40 routes that cannot return a price.
19 January 2026, 06:37 UTC. Someone at Singularity Finance registers six yield-token routes against USDC on the vault’s oracle, one setUniV3fee transaction per token inside a minute, all at tier 42. No such tier exists. Every lookup returns nothing, nothing reverts, and nobody notices for three months.
25 April 2026, 22:48 UTC. The dynBaseUSDCv3 vault is drained. With a 100,000 USDC flash loan from Morpho Blue, the attacker mints 99.9% of the shares against a vault priced at about $100, redeems them against the assets it actually holds, repays the loan and leaves with 413,132.022315 USDC.
26 April 2026. The team announces the exploit in Telegram, attributes it to an attacker who “used a flashloan on Morpho to manipulate oracle price”, promises a post-mortem and disables deposits and withdrawals on every other DynaVault. Its X post is later deleted.
27 April 2026. DefimonAlerts and DarkNavy independently publish the mechanism: the invalid fee tier set in January, the dead price path, the flash loan, the exact amount taken.
May to July 2026. The team privately concedes that the oracle “was the cause of the exploit” but will not confirm it publicly. It says the post-mortem must wait while it is “strengthening the oracles” because publishing could “expose other areas to risk”, then cites its lean team. By July it refuses to discuss the chain evidence at all: “I’ve answered the exploit questions in the past, will not debate your interpretation of how it happened for various reasons.”
18 and 19 July 2026. The team deploys a new oracle stack and repoints every vault to it. A new Uniswap V3 oracle finally uses tiers that exist. Along the way dynBaseWETHv2 spends five minutes pointed at the USDC oracle before a second transaction corrects it. The old oracle and its 46 dead routes remain. None of this is announced.
20 to 22 July 2026. The governance account switches the permission check off on every vault. Withdrawals resume for the first time since the exploit. People whose money had been locked since April can withdraw it, and nobody tells them.
24 July 2026. A new vault, dynBaseUSDCv4, begins accruing fees. It is the only one still running in permissioned mode, and its whitelist is granted the same morning: thirteen wallets, plus the team’s own accounts.
29 July 2026. The drained dynBaseUSDCv3 vault, holding $101, is still minting management-fee shares to the team’s fee wallet.
30 and 31 July 2026. Asked about the reopening, the team gives four different accounts and says it withheld the announcement until the post-mortem. It promises that for early next week, the first date given in three months.
2 August 2026. In the project’s unofficial price channel, a user asks when the vaults will open again. They have been open for thirteen days. The team confirms the reopening there, repeats the post-mortem for early this week, and adds a condition: a replacement vault has to be ready for the drained one.
10 August 2026. Both promised dates have passed. There is no post-mortem, reopening announcement or answer to any question.
14 August 2026. The team drops the dates and waits for “the Eng team to give the green light”. My four questions are forwarded again rather than answered. Meanwhile, the dApp lists six new DynaVaults in beta on three new chains. The engineers who cannot sign off the post-mortem have found time to ship a multi-chain expansion.
15 August 2026. The team moves governance on both USDC vault managers to a Gnosis Safe with two owners and a threshold of one. The guardian and oracle admin roles remain where they were. This is not announced either.
21 August 2026. Asked again the same questions, still no answers. Team now says a third-party investigator has to approve the post-mortem alongside the engineering team, the first outside party mentioned since April.
The Exploit
dynBaseUSDCv3 holds six yield-bearing tokens rather than USDC, so its oracle has to price each one. A Uniswap V3 pool is identified by two tokens and a fee tier. Singularity Finance set that tier to 42.
Base has six enabled tiers: 100, 200, 400, 500, 3000 and 10000. Anything else returns no pool. The oracle did not reject that result, its fallback route held no liquidity, and totalAssets() reported only the idle USDC in the contract: about $100 for a vault holding several hundred thousand.
The vault mints ERC-4626 shares against that number, so a hundred thousand dollars bought effectively the entire supply. Redemption never consults the oracle and hands back a proportional slice of what the vault actually holds. The gap between those two numbers was the exploit. The flash loan was only the capital.
The oracle’s history rules out a one-off typo. Every route set after the initial configuration, 46 across four months and four base assets, carries fee tier 42. Nobody mistypes the same number 46 times. Whatever it meant, each call disabled the path it claimed to configure. For PUSDCHY, even a real tier would not have helped: no Uniswap V3 route against USDC existed at all.
Decentralization Theater
The address that set fee tier 42 is an ordinary account with no contract code. It held governance until 15 August, and still holds guardian and the oracle admin role. setUniV3fee takes any uint24 and never checks it against the six tiers that exist. One private key could freeze every DynaVault, reopen them and blind them to their own assets.
Governance has since moved to a Safe, but it has two owners and needs only one signature. The guardian and ORACLE_ADMIN roles did not move. One person can still call setUniV3fee alone, exactly as someone did in January.
The wallet that collects the management and the performance fee is a Safe with three owners and a threshold of two. Two signatures to move the revenue. One to move governance. None to set a fee tier on the oracle that prices the vault.
Those fees are charged in shares, not cash, and that Safe has never redeemed one. The exploit diluted its stake in the drained vault to about a dollar. The accrual continues on every vault that is left, including the empty one.
The only DynaVault documentation is two Medium posts from 2023, which the team still points to. They say a vault “hinges on Strategies, which are separate smart contracts associated with each vault”, that deposits “are distributed to one or more strategy contracts”, and that executing them “is often automated and performed by a designated Keeper”, after a technical audit and a community vote. Neither dynBaseUSDCv3 nor dynBaseUSDCv4 has a strategy registered, no community vote was ever done for any DynaVault. The caller of swapAndReport() supplies the entire trade, and one ordinary account sent 273 of v3’s 323 swaps and 134 of v4’s first 139. The vault trades when someone at Singularity Finance tells it to. The current Singularity Finance docs never mention the DynaVaults that are live and holding money. They describe a future L2 instead.
Asked what makes the vaults automated, the team answered:
SFI has automated on-chain execution (one ex. being SwapAndReport that moves assets and updates the vault accounting), though yes, they are not yet autonomous nor do we claim they are. Source
swapAndReport() executes a trade a person already decided on. “Not yet autonomous” is the first time the team has said it. What the docs describe was never deployed, and what is deployed is documented nowhere.
The Excuses
Three arguments have carried the silence. None of them stands up.
The first is that the funds are gone. That answers whether the stolen USDC will return, not whether the project will cover its users from its own resources. Gnosis Pay and Hinkal were exploited in the same window, could not recover the stolen money and made their users whole anyway.
The second is that publishing could expose other areas to risk. The invalid tier, missing validation, flash-loan path and amount taken were public within two days. The replacement oracles went onchain on 18 July and every vault moved to them the next day. Whatever has delayed the post-mortem since then, it is not the oracles.
The third is that this was a high-risk vault. A risk label describes the external positions a vault uses. It says nothing about the team misconfiguring its own price feed. Nor did it isolate the risk: the four USDC vaults used the same oracle, every vault shares one router registry whatever its asset, and routes against WETH, cbBTC and EURC also carried tier 42. I repeatedly asked the team to document what its risk tiers meant before the exploit. It never did.
The Silent Reopening
The team announced the freeze. It never announced the reopening. Anyone who checked in May, found withdrawals disabled and concluded their money was stuck had no reason to check again.
Asked about it, the team gave four accounts. The first said whitelisted wallets were testing the oracles. The only role granted around reopening went to the team’s own zapper; no outside wallet was whitelisted. The governance account then removed the permission check for every holder. The second pointed instead to dynBaseUSDCv4, a new vault that postdates the exploit and held none of the frozen funds. That same answer said its whitelist had nothing to do with reopening the other vaults.
The third account dropped the whitelist and cited beta testing and fixes. The fourth said the closed-source frontend had blocked withdrawals until off-chain fixes went live. I cannot verify that. It also does not change what the contracts did: the team replaced the oracle on 18 and 19 July, then let every holder withdraw from 20 July. In a self-custodial protocol the contracts hold the money and decide who may move it. The app is a convenience.
The reason for the silence sits in that same V4 message:
Yes, we’ve delayed the announcement about the reopening of the other Vaults a bit, as we intend to make it on the same day we share the exploit postmortem […]. Source
A bit is a month so far.
On 2 August a user asked when the vaults would reopen. They had been open for thirteen days. The team confirmed it there, promised an announcement that week and added another condition: the replacement USDC vault had to be ready. It had been live since 24 July. Neither condition affected the other vaults, whose depositors could already withdraw.
Like the shared oracle, this reaches everyone rather than only the dynBaseUSDCv3 depositors. A project that will not tell its users when their own funds become withdrawable again has a communication problem that has nothing to do with an attacker.
The Unanswered Questions
I have asked all four in Telegram, most more than once. None has an answer.
- Was the fee tier set on 19 January the cause? The independent analyses, the chain and a private reply in May all say yes. The team has never confirmed it publicly, and its announcement blaming the attacker stands uncorrected.
- Why was the fee tier set to
42, and by whom? Someone entered a value that does not exist on Uniswap V3 46 times over four months, and nobody caught it. - When will the post-mortem be published? Both dates given, 31 July and 2 August, passed. On 14 August an engineering sign-off with no date attached replaced them.
- Will affected accounts be reimbursed from project funds or from the collected fees? Yes or no. Asked since April, answered neither way.
Why I Care
I have been around the SingularityNET ecosystem for years. Everything I did in it assumed these projects would work. The ASI token migration had no good public view, so I built tools around it, including a Dune dashboard I ran at my own cost. Singularity Finance appealed to me too. Automated onchain vault strategies are a genuinely good idea. I put money into the DynaVaults.
The products were almost entirely undocumented, and still are. So I pushed the team with concrete suggestions to explain what they had built. I also built dynafriend, because I wanted a better UI for the DynaVaults, and left it public for anyone to use. None of that was adversarial. It came from the same place these questions do.
Then one of the DynaVaults I was in was drained. I lost a substantial amount. The questions carried on in the same spirit. The reception did not. Communities around projects like this treat questions as attacks and file them under “FUD”.
They are not attacks. Transparency is what lets people trust a project. Asking is only what is left when there is none. A team that publishes its own post-mortem, names its own mistake and says what depositors can expect comes out with more credibility than it had before. The ones that go quiet end up with none. That option is still open here.
References
- Exploit transaction:
0x00b949bc…9f8d3732 - The
setUniV3fee(…, 42)config transactions, one per token, 19 Jan 2026, here thePUSDCHYroute:0x2df0be7a…a8dbe150 - Vault
dynBaseUSDCv3:0x67b93f66…35e14dcd - Oracle, abandoned 19 July 2026:
0x73b8c192…c319e89f - The replacement oracle stack, 18 July 2026: new UniswapV3Oracle, new USDC reference oracle, the drained vault’s repointing
- Vault
dynBaseUSDCv4and its whitelist:0x4C1fa73E…3bfE26 - Guardian, oracle admin and the account that set fee 42:
0xcd231d4b…b8db - Governance since 15 August 2026, a Safe with two owners and a threshold of one:
0x5bfc34fb…7599ff, handed over on the dynBaseUSDCv3 manager and the dynBaseUSDCv4 manager - The management account that executes the swaps:
0x4dd226…17CF0 - The reopening, one transaction per vault, here dynBaseUSDCv2 on 20 July 2026:
0x5df40ab0…70179c24 - Fee wallet, a Gnosis Safe:
0x03301480…860C6 - Attacker fund flow: debank
- Technical analysis: DarkNavy, DefimonAlerts
- The original exploit announcement, Telegram: t.me/Singularity_Fi/262366
- The reopening confirmed in the unofficial price channel, 2 August 2026: t.me/SFIprice/18484
- Singularity Finance on X: @Singularity_Fi
- My unanswered questions to Ben Goertzel, 6 June 2026: one, two
- My DynaVault dashboard: dynafriend
- Comparable incidents: Gnosis Pay post-mortem, Hinkal
Last updated: