Dominion SILV hack: $3 million of silver tokens sold for $238,000.
It began a little after midnight UTC on 11 September, with a wallet paying off its loans and moving the collateral to an address with no history. Six hours later the multisigs had new members. Four hours after that, one of the old keys was moving money again, and by the afternoon Dominion was freezing accounts. We traced each step on-chain, including the part that crossed to Ethereum.
01 · The loan that closed after midnight
A new wallet, and a price that would not hold
At 00:23 UTC on 11 September, a Solana wallet paid off a loan. It had borrowed dollars on Loopscale, a lending market, against a stack of SILV tokens. In one transaction it pulled the tokens back out, sold them and cleared the debt. People close loans like that every day.
Six minutes later the same wallet did it again. This time the freed tokens went to an address that had never made a transaction, and about 10 minutes after that the new address started selling. SILV had spent the evening at about $63. By 01:00 UTC it was changing hands for less than half of that.
SILV comes from Dominion, a company that sells silver as a crypto token and says each one is a troy ounce of physical silver in a vault. The wallet with the loan was one of the five signers on Dominion's treasury.
What followed was a multisig compromise. The treasury moved only when three of its five keys agreed, and whoever was behind this held three. Bitquery indexes every transfer and trade on Solana, so we rebuilt the night from the ledger, reading every approval, swap and bridge deposit and checking each figure a second way. The ledger shows how the treasury was emptied, what the tokens fetched, a fight over the keys, and a second visit hours after the team took them back. The stolen wallets were still exposed when we finished, so balances here are a snapshot taken at 15:36 UTC.
02 · What SILV is
A silver token with a treasury and two sets of keys
Dominion launched SILV on Solana in August, and most of the supply was minted between 13 and 16 August. The token's own metadata says it is "backed one to one by physical silver", with each token standing for one troy ounce "held in allocated, audited vault storage". On DEXes it traded close to the price Dominion's program charged for a new token, about $63 on the evening of 10 September.
Dominion's own program kept it there. It mints new SILV for anyone who pays USDC at the silver price plus a fee, and buys SILV back for USDC at close to the same price. When the DEX price drifts, traders mint or redeem and pocket the gap, and the price comes back into line.
The company also kept a large stock of SILV in a treasury vault. On the night of the hack that vault held 45% of all the SILV there was.
Two Squads multisigs sat on top of all this. A multisig is a wallet that moves only when enough of its keys sign. The first controlled the treasury and the switches that turn minting and redemptions on and off. The second held three powers over the token itself. Through a Token-2022 feature called a permanent delegate it could move SILV out of any holder's account. It could also freeze any account, and replace the code of Dominion's mint program. Both multisigs needed three signatures out of five, and both had the same five signers.
| Power over SILV | Who could use it |
|---|---|
| Move the treasury's tokens | Treasury multisig, 3 of 5 signatures |
| Switch minting or redemptions | Treasury multisig, 3 of 5 signatures |
| Move SILV out of any account | Authority multisig, 3 of 5 signatures |
| Freeze any SILV account | Authority multisig, 3 of 5 signatures |
| Replace the mint program | Authority multisig, 3 of 5 signatures |
| Mint new SILV | Only the program, for USDC at the silver price |
03 · Three keys that signed as one
What the signing record shows
A multisig with five signers and a threshold of three is built to survive the loss of two keys. That only works if the keys live in different places.
The signing record suggests three of these did not. From 26 August, every payment out of the treasury was started, approved and executed by the same three keys, each inside a minute. Four days earlier the rhythm was different. Another signer started two treasury transactions, and the approvals needed to pass them came 101 minutes and 25 minutes later.
| Treasury transaction | Who signed, and how long it took |
|---|---|
| 22 August, 13:32 UTC | Started by 2Lp91FyJ in three separate steps, passed 1 hour 41 minutes later |
| 22 August, 17:59 UTC | Started by 2Lp91FyJ in three separate steps, passed 25 minutes later |
| 26 August | The three keys, start to finish in 56 seconds |
| 31 August | The three keys, 33 seconds |
| 3 September | The three keys, 38 seconds |
| 8 September | The three keys, 33 seconds |
| 10 September | The three keys, 35 seconds |
The three keys also rolled the create, propose and approve steps into a single transaction, the way software wallets and scripts sign. One of the two signers the attacker never held signed each step on its own, seconds apart, which is how signing on a hardware wallet usually looks. Where the keys were stored is not on the chain. For two weeks before the hack, though, three of them acted as a unit, which fits keys kept together and within reach of a single break-in.
04 · Paying off the loans
The first hour, and 11 wallets
The attack began with debt. Several of the stolen wallets had borrowed USDC on Loopscale with SILV as collateral, and collateral stays locked until the loan is repaid. So the attacker repaid the loans, in the biggest case by selling part of the SILV inside the same transaction, and kept the rest.
Within an hour, SILV collateral had come out of loans in four wallets. Clearing the first wallet's loans alone meant handing more than $81,000 back to lenders.
| Time (UTC) | What happened |
|---|---|
| 00:23:28 | A stolen signer wallet repays a Loopscale loan by selling its SILV collateral. Transaction |
| 00:29:38 | The first stolen SILV reaches a new wallet, in its first transaction ever. Transaction |
| 00:39:55 | That wallet starts selling |
| 00:44:56 | SOL starts being swept out of the stolen wallets |
| 01:08:35 | A second attacker wallet makes its first transaction |
| 01:24:34 | The first SOL goes into Chainflip, bound for Ethereum. Transaction |
| 01:50:24 | Proposal 45 empties the treasury. Transaction |
| 02:02:56 | The lowest trade of the day, at $0.339. Transaction |
| 02:20:32 | The first redemption at the silver price |
| 03:43:48 | A new signer, almost certainly the attacker's, joins the authority multisig. Transaction |
| 03:44:54 | The team's first move on-chain. Transaction |
| 03:48:29 | Redemptions switched off. Transaction |
| 03:56:23 | Minting switched off. Transaction |
| 03:57:38 | The attacker's last sale of the night |
| 05:24:58 | A vote to remove a clean signer reaches 2 of the 3 approvals it needs. Transaction |
| 06:19:24 | The last stolen keys are removed from both multisigs. Transaction |
| 10:51:39 | A stolen wallet repays its loan and the attacker takes 279.95 SILV. Transaction |
| 13:37:27 | Dominion starts freezing SILV accounts. Transaction |
| 13:50:20 | The attacker moves 1,923.50 SOL to a new wallet and starts feeding it into Chainflip. Transaction |
SOL was being swept out at the same time. Ten wallets were emptied down to exactly 890,880 lamports each, about 9 cents, and every sweep went to the attacker's first wallet. The same odd leftover every time looks like one script working through a list of keys.
Leaving out its own two new wallets, the attacker signed for at least 11. The oldest first moved in February 2024 and the newest in June 2026. Four were created within 25 minutes of each other on 26 February 2026, and one of those four was sent 1,500 SILV straight from Dominion's treasury in August. Any of them can be traced the same way through the Bitquery MCP.
05 · One proposal
The treasury, in two minutes
The treasury was guarded by the same three keys, so nothing had to be broken to reach it. At 01:48 UTC one of them created proposal 45, a plain transfer of every SILV in the vault. A second key approved it about a minute later and a third 49 seconds after that. It executed 8 seconds later.
Half an hour later the attacker used the same three keys again, this time to take 5 SOL out of each multisig's vault. One of those vaults belonged to the multisig with power over the token itself.
06 · Silver sold for pennies
Half the supply, into pools built for a quiet market
Selling that much SILV at once was never going to fetch the silver price. The pools were sized for everyday trading, and each sale pushed the price down for the next.
The attacker sold anyway, in dozens of swaps a few seconds apart. Its second wallet got rid of about 43,100 SILV that night, the treasury's tokens among them, at an average of $3.34.
Six minutes after the treasury drain, a wallet with no transfers to or from any attacker wallet opened a new SILV pool. The attacker sold into it, and one trade there printed the lowest price of the day, 2,457 SILV for 8.39 SOL.
Dominion's program was still buying SILV back at the silver price, so traders bought cheap tokens on DEXes and redeemed each one for about $63 of USDC. The window stayed open until the team switched redemptions off, and it cost the reserve little.
| The redemption window | Value |
|---|---|
| First and last redemption | 02:20:32 and 03:48:25 UTC |
| Redemptions | 105 |
| Paid out of the reserve | $5,178.13 |
| Left in the reserve after | $121,748.46 |
| Median DEX price meanwhile | $25.11 |
No new SILV was minted after 00:06 UTC, and neither the permanent delegate nor the freeze power was used that night. The chart shows 5-minute medians of every SILV trade over $10 on Solana, from Bitquery's Solana DEX data.
07 · The fight for the keys
Two sides, signing with the same keys
At 03:42 UTC one of the stolen keys proposed adding a sixth signer to the second multisig, the one with power over the token. The new key had never been used, and the three stolen keys passed the change a minute later. Nobody has ever signed with that key, and the team removed it less than two hours later, so it was almost certainly the attacker's.
About a minute after that change went through, the team made its first move on-chain. One of the clean signers started a proposal to switch off redemptions.
Within a minute, a stolen key filed a proposal to remove one clean signer and tried to remove the other. The second attempt failed because the key had run out of SOL to pay rent. Another stolen key sent it 0.02 SOL 36 seconds later, and the proposal went in on the next try. If both removals had passed, every signer left would have been a key the attacker held.
Less than a minute after filing that proposal, the same stolen key signed the team's proposal to switch off redemptions. It signed the one that switched off minting 8 minutes later. Only one clean key signed either of them, so the other two signatures came from stolen keys, and the simplest reading is that the team held copies of those keys too. Until the rotation was done, both sides could sign with the same keys.
The closest call came at 05:24 UTC. One stolen key gave the vote to remove a clean signer its second approval, one short of passing. The same key had created the team's rescue proposal 30 seconds earlier. The chain cannot tell us whether that was the attacker racing the team or a misclick in the Squads app. Less than 3 minutes later the rescue proposal passed, and under Squads rules a change of members voids every proposal filed before it.
By 06:19 UTC the stolen keys were gone from both multisigs. Two new keys took their place, and neither was made after the hack. One first appeared on the evening of 10 September. The other has been active since September 2025.
It could have gone further. For 5 hours after the attack began, the attacker held enough keys to pass anything on the multisig that can move any holder's SILV and rewrite the mint program. Beyond adding a signer and filing votes against the team, it used that power once, to take 5 SOL.
08 · Where the money went
Two trips through Chainflip
The attacker sold almost everything for SOL. The SILV sold to clear loans went for USDC, and nearly all of those dollars went to the lenders.
Twice before 02:10 UTC, the first attacker wallet sent SOL to a hop wallet, which passed it into Chainflip, a network that swaps coins across chains, with a request for ether in return. We decoded both swap instructions. They name the same Ethereum address, and Chainflip's vault paid it 9.25 ETH.
That wallet has received and sent ether since May 2026, and it took two Chainflip payouts on its first day, 16 May. Its last outgoing transaction was on the evening of 10 September, under two hours before the attack began, and the 9.25 ETH has not moved. For anyone chasing the money, that older history is the best lead in the case. The attacker behind the Aquifer hack also left its haul sitting on Ethereum.
The rest of the SOL sat still until 13:45 UTC. Then the attacker moved all of it. The first wallet sent about 1,900 SOL to a new address, which passed it into Chainflip in 5 chunks, most of about 400 SOL. Each chunk went to a one-time deposit address that Chainflip's own agent key emptied within minutes, the same key that collected the first overnight deposit. The second wallet sent 249 SOL through a hop wallet in a direct swap to a different Ethereum address.
Chainflip paid that address 9.83 ETH. The address already held about 214 ETH and has taken ether from several sources since August. Whether it belongs to the attacker or to a service the attacker paid, the chain alone does not say. Where the deposit-address swaps paid out lives on Chainflip's own chain. By 15:36 UTC all but a fraction of one SOL of the attacker's haul had gone through Chainflip. The whole trail can be followed with the Bitquery MCP.
Look-alike addresses sent the attacker's wallets dust within a minute of several of these moves, the setup for address poisoning.
09 · Back at 10:51
Rotating the signers left the wallets exposed
Dominion's update on X said the team had full control again. For the multisigs, that was true. The stolen wallets were a different matter, because a wallet with one key cannot be rotated and anyone holding a copy of the key keeps it.
At 10:34 UTC, one of the keys the team had removed from the multisigs that morning sent 0.03 SOL to another stolen wallet, enough to pay fees. That wallet repaid its Loopscale loan 17 minutes later, withdrew 279.95 SILV of collateral and sent it to the attacker's second wallet. About a minute and a half after that, the SILV was sold for 74.61 SOL.
Any position still held by one of the 11 wallets is exposed the same way. The safe assumption is that all of them are burned.
10 · The freeze
Dominion uses the token's own powers
At 13:37 UTC Dominion's authority multisig began freezing SILV accounts, using the power that sat idle through the attack. The three keys that approved it are the new and clean signers the team now holds. A first wave froze about 1,800 accounts in under three minutes. A second wave, about half an hour later, froze about 1,000 more. Among them were the SILV vaults of the two biggest pools, and trading in both stopped within a second.
A third of all SILV now sits in frozen accounts, and all but a handful of them belong to wallets that received SILV after the attack began. The freeze did not reach every such wallet. About 490 others that also got SILV after the attack began still held about 29,900 SILV, and 60 more transactions sat in batches the team had already approved. The frozen accounts can be listed with token holder data.
| The freeze | Value |
|---|---|
| First and last freeze | 13:37:27 and 14:22:33 UTC |
| Accounts frozen | 2,823, with 2,819 still frozen at 15:36 UTC |
| In each wave | 1,805 from 13:37:27, 1,018 from 14:15 |
| Got SILV after 00:23 | The owners of all but 4 frozen accounts |
| SILV in frozen accounts | 31,078.51, or 33% of the supply |
| Pools frozen | Meteora SILV/SOL and Orca SILV/USDC, both last traded at 14:17 |
| Approved by | iMxHnYid, 2FndD1W9 and 2Lp91FyJ |
| Permanent delegate | 0.000001 SILV moved to the treasury at 14:58:48. Transaction |
At 14:58 the multisig used the permanent delegate for the first time. It thawed one frozen account and moved one millionth of a SILV out of it into Dominion's treasury, the smallest amount the token can move, then left the account unfrozen. The same power reaches every frozen account. What Dominion plans to do with it is not on the chain.
11 · What the team said, and what the chain shows
Dominion's update, line by line
Dominion posted an update on X, signed by its founder, after the attack. Most of it is about next steps. The lines that describe what happened and when can be checked against the chain.
| Line in the update | What the chain shows |
|---|---|
| When it started | "At approximately 01:00 UTC today, a number of Dominion wallets were compromised" Doesn't match the chain. The first hostile transaction ran at 00:23:28 UTC, and the first stolen tokens reached an attacker wallet at 00:29:38. |
| When the team acted | "We identified the issue at 04:00 UTC and acted immediately" Partly. The team's first transaction ran at 03:44:54, 3 hours 21 minutes after the first hostile one. Redemptions were off at 03:48:29 and minting at 03:56:23. |
| Liquidity | "Pulled liquidity" Can't be checked on-chain. We cannot identify every team wallet. None of the wallets we can identify removed liquidity from the two biggest SILV pools. |
| The affected wallets | "Secured the affected wallets" Partly. Both multisigs had new signers by 06:19:24. Two stolen wallets with a single key each were used again at 10:34 and 10:51. |
| The new keys | "Replaced every compromised wallet with fresh devices and new hardware wallets" Partly. Neither new signer key was created after the hack. Devices do not show up on a chain. |
| Control | "We now have full control again" Doesn't match the chain. True of both multisigs. At 10:51 the attacker withdrew collateral from a Loopscale loan held by one of the stolen wallets. |
| SEAL 911 | "We're working with SEAL 911 on the investigation" Can't be checked on-chain. Nothing on a chain records this. |
| The repeg | "Begin the repeg within the next few hours" Not yet. Between 14:35 and 15:35 UTC SILV traded around $22, against $63.59 the evening before. |
A team fighting an attacker in the middle of the night can get a time wrong, and nothing here says anything about intent.
12 · What the chain cannot tell us
The limits of the record
How the keys were taken is not on any chain, and neither is whether the person using them sat inside the company or outside it. We say attacker for whoever held the stolen keys. As with the LootBot drain, the ledger shows keys being used and says nothing about where they leaked from.
We cannot say who clicked the approval at 05:24 UTC. Nor can we prove who owns every side wallet. One was funded straight from Dominion's treasury, and three more were created within 25 minutes of it, which links them without proving who controls them.
Nor can it tell us what Dominion will do with the frozen tokens. The permanent delegate has moved one millionth of a SILV so far. If it moves more, the chain will show where it goes.
13 · Method
How we checked it
We rebuilt the attack from raw Solana transactions and checked every figure a second way before using it.
| What could go wrong | How we handled it |
|---|---|
| Missed token transfers | A wallet's own history misses tokens sent to its token accounts, so We also pulled every token account the wallets own. That is how the 10:51 transfer surfaced. |
| Repeated or missing fills | Trade data can repeat or skip fills. Prices are 5-minute medians of trades over $10. Token amounts come only from transfers and balance changes. |
| Misread approvals | Every proposal, approval, rejection and change of members was read from the Squads accounts themselves. |
| One data source | Solana data came from two RPC providers and Bitquery's transfer index. The Ethereum payouts were confirmed in Bitquery's Ethereum data, Blockscout and a public node. |
| The wrong wallets | A wallet counts only where the attacker's own transactions show control: signing for it, sweeping it, or receiving stolen tokens and selling them. |
| A live attack | Balances, freezes and flows were checked at 15:36 UTC. Prices run to 15:35 UTC. |
| Who was frozen | Every freeze was read from the authority vault's transactions, then each account's owner, balance and state from the chain. Wallets that got SILV after 00:23 come from Bitquery's Solana transfers index. |
| Chainflip hops | A hop counts as a Chainflip deposit only where Chainflip's agent key swept it or its swap instruction decodes. |
| The SOL price | Dollar figures use $99.20 per SOL, inside Kraken's hourly range for the night. |
14 · The record
Addresses and transactions behind the story
Every address below can be followed onward with the Bitquery MCP.
| Role | Address or transaction |
|---|---|
| Attacker's first wallet | BmgpLv…rrkZ |
| Attacker's second wallet | Ge2GYH…AH7g |
| Hop wallet into Chainflip | GfvdsA…Cn1Y |
| Ethereum wallet paid 9.25 ETH | 0x8b34…daaf |
| New wallet, 13:50 | 6QAoKp…qvtF |
| Second Ethereum address | 0xd137…eeff |
| Signer the attacker added | EHQZBu…mSfY |
| Stolen multisig signers | 8kTSi3…WmpM, EkDhR6…7V56, EHVcpE…KGux |
| Other stolen wallets | 8Ysc7c…ksqY, Dt8opL…LNws, BZsVSQ…Nxw1 |
| Treasury multisig, vault | 9BwMVm…5VtU, 65g5nN…qPPS |
| Authority multisig, vault | BjbtdE…XLAi, FqFNXC…vzZ3 |
| SILV token | SiLVFM…B35L |
| Treasury drain, proposal 45 | 65EeDk…iJWE |
| Chainflip deposits | 5c4PpE…WxLu, 5ki24E…d7wn |
| Ethereum payouts | 0x9118…1da8, 0x4e28…9d64 |
| The return visit | 5yH72U…tvz7, AZKYWe…oqJ6 |
| Direct swap, and its payout | 2vDGBp…SjmM, 0x110f…9903 |
| Freeze and delegate transfer | 2hEWue…r5Sk, 2RhaQF…KJco |
Ask these questions in plain English
Every figure above came from queries anyone can run. The Bitquery MCP server puts the same Solana and Ethereum data behind an AI assistant, so you can ask which keys approved a multisig proposal, where a wallet's SOL went, which accounts a token froze, or what it traded at minute by minute, without writing the query yourself.