Updated
This report is built for a wider screen. It is fully readable here, but tables and diagrams are easier to follow on tablet or desktop.
WEMIX$ Stablecoin Exploit -- Case File
Incident: July 26, 2026 at 09:17:28 UTC (18:17 KST) · Network: WEMIX3.0 Mainnet
Technical path: closed on explorers + official WEMIX blog (mint path, amounts, helpers, bridges, containment). Still open (attribution only): CEX legal name, attacker real-world identity. Those need Foundation / exchange KYC / law enforcement, not more chain math.
The Case in Brief
0xc921a66e30745f11f8c7a7870e95640607ae7ea2 linked; person unknown. Gas via exchange distribution (~$5).isWhitelist=0 on helpers). Router still proxy Ownable. H12 Proxy Admin residual remains open: see Open residual risk.Proxy Architecture
VAULT and Secondary Helper are EIP-1967 transparent proxies (identical 2,112-byte proxy bytecode). Mint logic lives in different implementations. Ownable lives in proxy storage. Shared Proxy Admin can upgrade either implementation.
WEMIX$ Token [isWhitelist on helper proxy addresses]
^ mint/burn
VAULT Proxy (2,112 B) Ownable=Router --> Impl A 0xbddd41457b55710fd0055b1cfbbc0b9be77a89c4 (16,443 B)
^ upgrade
Proxy Admin 0x465ea8f2dea0061dc177d4325ece33a0151af3f9 (nonce 1)
v upgrade
0x01fa Proxy (2,112 B) Ownable=Router --> Impl B 0x002ceee5624f60fee129549ffa6805a5ee49c759 (7,783 B)
Proxies: VAULT 0xd2947dbfdbdbb99702de6e46c63cb1968e21d95b · 0x01fa 0x01fa6cc8cd2f99b30e19d599fc002c3f2cac3d76 · Router 0xb6bdea4941f6fd4ea3918fac902494da100ac4d2. Earlier drafts incorrectly called the 2,112-byte code the full mint implementation.
Data sources (policy)
Primary (authoritative for this case file): chain explorers + official WEMIX blog.
Secondary (context only): reputed news when helpful for
parent-company context or public narrative : never replaces explorer or
official blog for numbers or mechanism.
Primary : chain explorers
- WEMIX explorer : WEMIX3.0 txs, WEMIX$, helpers, CCIP, balances
- Etherscan : Ethereum legs after bridge out
- BscScan : BNB Smart Chain legs
- Key txs: 0xfed2172a508d84f63b56acc7e3c30164930220004f808799998b8201fe7cefe0 · 0x5afa080282756fa24ce725ff0da2913e5d1eb5badcf83596f91257aad4f768e8 · 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] · 0x8e81fcc2d4a3baa0ee9044e0d7e36f59c9bba9c1
Primary : official WEMIX blog
- Regarding the WEMIX$ Security Issue and Ongoing Investigation (26 Jul 2026) : initial notice; ownership of a WEMIX$ contract may have been compromised
- Update on the WEMIX$ Security Issue and Response Measures (26-27 Jul 2026) : 18:17 UTC+9; ~5,225,525 WEMIX$ issued; 30,736 WEMIX + 724,198.27 USDC.e; ETH + BSC bridges; CEX deposits; freezes requested; services suspended
- Play Bridge Exploit and the Foundation's Responses (Mar 2025) : prior incident contrast only
Secondary : reputed news (optional cross-check)
- The Crypto Times : recaps official figures; parent Wemade / second-incident context
- Yahoo Finance : same official numbers; bridge/service suspension quotes
- Chosun Biz : Korean parent-company framing (Wemade, ~7.7bn KRW)
Alignment: Official blog amounts and timeline match explorer reconstruction. Official phrase “ownership of a WEMIX$-related contract was compromised” aligns with helper proxy Ownable takeover on explorers : not proof that the WEMIX$ token owner() key was stolen. Parent company: Wemade (Korean-listed gaming publisher; WEMIX / WEMIX PLAY ecosystem).
Hypotheses -- What We Investigated and Found
| # | Theory | Verdict | Why |
|---|---|---|---|
| H1 | Helper proxies left with callable initialize / reinitializer | PROVEN | VAULT and 0x01fa are EIP-1967 proxies (identical 2,112-byte proxy code; different implementations). See Architecture. Pre-exploit likely-name isWhitelist(VAULT/0x01fa)=1;
Router=0. Exploit emitted Initialized + OwnershipTransferred on both
proxies: attacker set Ownable in proxy storage via setup through the
proxy. Behavior confirmed on explorers. |
| H2 | The WEMIX$ owner private key was stolen | IMPRECISE | The WEMIX$ token's top-level owner key was never used (nonce 0, zero balance, not on the minter whitelist). But privileged access to helper contracts WAS taken through their unlocked setup function. News headlines saying "owner key breach" describe a real privilege compromise but attribute it to the wrong mechanism. It was a configuration error, not a key theft. Both "the token owner key was safe" and "privileged access was compromised" are true. |
| H3 | The attacker bypassed the daily conversion limit | TRUE but not the bug | WEMIX$ has a user-facing Module with a 3-per-day limit. The attacker never used the Module. They called the token directly through the helper contracts. The Module worked fine -- the attacker just ignored it. |
| H4 | Chainlink CCIP bridge was the attack entry point | NO | Zero CCIP calls in the exploit transaction. CCIP was only used to send money OUT to Ethereum after the exploit. It was the exit door, not the entry. |
| H5 | A recent network outage caused the exploit | NO | WEMIX had a block production halt on July 19, but it was a speed issue fixed the same day. No contract changes happened. WEMIX$ is not a proxy and cannot be upgraded. |
| H6 | A flash loan or MEV bot was used | NO | The attacker used their own money ($5 of gas from an exchange). No borrowed funds, no flash loan patterns in the logs. |
| H7 | Supply-chain / stolen-key reuse from Feb 2025 NILE leak | OPEN / SCOPED | Not July root cause (that is unlocked initialize). No public 2025 attacker addresses to compare. Promote only if key reuse or shared funding graph is proven. |
| H8 | Same actor or collusion with Feb 2025 | UNRESOLVABLE PUBLICLY | Needs disclosed 2025 attacker set or LE/KYC. Gas funder is exchange infrastructure, which weakens but does not refute off-chain collusion. |
| H9 | Breaker role was the exploit entry | NO (as root) | Attack used helper initialize + whitelist mint, not Breaker. Breaker remains an unmapped residual control surface (pause/emergency powers unknown without source). |
| H10 | Other residual isWhitelist minters still dangerous | CONTAINED (helpers) | VAULT and 0x01fa: isWhitelist was 1 pre-exploit, 0 now. Sample of related DEX/CCIP contracts also 0. Full historical mapping scan still ideal but not required for this incident path. |
| H11 | Attacker found helpers via on-chain recon (hunting), not insider tip | OPEN / PLAUSIBLE | For recon: Transfer watch + likely-name isWhitelist + EIP-1967 slot + initialize probe is trivial on a public chain.Against polished insider: 3 failed deploys, exchange-funded fresh EOA, Proxy Admin never used. Verdict: OPEN / PLAUSIBLE. Evidence weights toward independent recon; does not prove discovery method. Not a courtroom claim. |
| H12 | Proxy Admin key residual upgrade risk | OPEN residual risk | Shared admin 0x465ea8f2dea0061dc177d4325ece33a0151af3f9
(nonce 1, 0 WEMIX) can upgrade VAULT and 0x01fa implementations.
Impl/admin unchanged during exploit. isWhitelist fix is token-side; a
malicious upgrade could change helper logic. Recommendation: Foundation
confirm custody and rotate to multisig. Not evidence the key is lost or
stolen. |
The Numbers
Headlines citing $5.2M-$6.25M reflect mint face value or network impact. Realized outflow traced on explorers: about $724,198 USDC.e.
The Attacker
Attack Wallet
| Label | Attacker / Signer EOA |
| Address | 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] |
| First seen | Block 118,822,162 -- July 26, 08:52:59 UTC |
| Funded by | Gas Funder (exchange distribution)0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3 |
| Funding amount | 23.746 WEMIX (about $5, just for gas) |
| Final balance | 0.0 WEMIX (everything moved out) |
| Total transactions | 37 (nonces 0 through 36) |
| Identified by | Publicly flagged on July 26; verify on WEMIX explorer |
| Real-world identity | Attribution open (not a technical gap). Wallet is fully mapped on explorers. Gas came via exchange distribution, so someone had an exchange account, but explorers cannot name the person. Closes only with funding-CEX KYC or law enforcement. |
Threat profile (analytical, not identity)
Independent operator; on-chain behavior consistent with a solo actor. Analytical assessment of on-chain behavior; not attribution of a person.
- Setup: public recon path to unlocked proxy initialize is feasible
- Execution: Router debugged on mainnet (~3.4 min of failed deploys)
- Exit: CCIP then Rango; layered EOAs
- Mistakes: 4,500 WEMIX left dormant; 2nd exploit reverted
Where Did the Gas Money Come From?
| Step | Label | Address | Activity | What It Is |
|---|---|---|---|---|
| 0 | Upstream funder of hot wallet | 0x3d87aa740dc32481494904ab94679251d5dfe51e | nonce 0 at funding time | Fed the exchange hot wallet; chain starts at exchange infrastructure. |
| 1 | Exchange Hot Wallet | 0xf89d7b9c864f589bbf53a82105107622b35eaa40 | 123,344 transactions | Exchange hot wallet. Active since early in chain history. Sends to hundreds of addresses. |
| 2 | Gas Funder / Distribution | 0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3 | 1,885 transactions | Distribution wallet. Funnels money from the exchange to users. |
| 3 | Attacker / Signer EOA | 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] | 37 transactions | The attacker. Received $5 of gas, then struck 24 minutes later. |
Attack Timeline -- Every Step Verified On-Chain
0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3 | Amount: 23.746 WEMIX0xb6bdea4941f6fd4ea3918fac902494da100ac4d2 | 10,590 bytesattack() on itself. It
takes ownership of VAULT and 0x01fa (two helper contracts), then runs 9
cycles of: burn pool tokens, extract USDC, mint fresh tokens to refill.
Each cycle doubles the amount. Result: 723,294 USDC.e and 4.5M WEMIX$
extracted.0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 (still sitting there, never moved) and 30,252 to Forwarder 0x14c5d965804e6d7145e0a636d7409883aeba89f0 (who forwarded everything to Suspected CEX Sink 0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH], 407 nonces; legal exchange name unknown). Attacker wallet balance after all this: 0.0 WEMIX.Complete Money Flow -- Where Every Dollar Went
0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH]
| What | Our Trace | Foundation Report | Match? |
|---|---|---|---|
| WEMIX$ created (net) | 5,225,525.00 | ~5,225,525 | Exact |
| USDC.e from exploit tx | 723,294.49 | -- | -- |
| USDC.e from DEX swaps | 903.78 | -- | -- |
| USDC.e total | 724,198.27 | $724,198.27 | Exact Match |
| WEMIX sent (gross) | 34,752.32 | -- | -- |
| Minus CCIP fees | -72.78 | -- | -- |
| Minus gas for 32 txs | -3,944 | -- | -- |
| WEMIX net | ~30,736 | 30,736 WEMIX | Exact Match |
How The Exploit Worked (Plain English)
The Bug: Unlocked Setup Function
WEMIX$ does not let anyone mint new tokens. It has a whitelist of trusted helper contracts. VAULT and 0x01fa are EIP-1967 proxies with an unlocked setup path (see Architecture). Think of it as a vault door whose combination reset was still enabled: the attacker reset Ownable in proxy storage and used the already-authorized door.
The Proof: Whitelist Check
WEMIX$ has a function that checks if an address is an approved
minter. We tested it by calling it directly with different addresses.
The function selector is 0xc683630d, which public signature databases map to likely name isWhitelist(address). Behavior confirmed on explorers.
| Label | Address | Pre-exploit whitelist? | Latest (2026-07-29)? |
|---|---|---|---|
| VAULT (helper proxy) | 0xd2947dbfdbdbb99702de6e46c63cb1968e21d95b | YES (1) | NO (0) : revoked |
| Secondary Helper 0x01fa | 0x01fa6cc8cd2f99b30e19d599fc002c3f2cac3d76 | YES (1) | NO (0) : revoked |
| Exploit Router | 0xb6bdea4941f6fd4ea3918fac902494da100ac4d2 | NO | NO |
| Attacker / Signer EOA | 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] | NO | NO |
| WEMIX$ Owner (Foundation cold) | 0x7a907b9df3f4843522b905758c2f542c9c028e4d | NO | NO |
Key finding: The attacker's Router is NOT on the whitelist. It works through VAULT and 0x01fa. Both were approved by the Foundation at deployment. The attacker did not add them. The attacker took Ownable on the already-approved proxies by calling unlocked setup through them (Ownable state lives in proxy storage).
The Attack Path
- Router calls initialize / reinitializer on VAULT proxy -- Ownable in proxy storage becomes Router (DELEGATECALL into VAULT impl)
- Same on 0x01fa proxy -- Ownable becomes Router (different implementation behind the proxy)
- Router (as proxy Ownable) drives mint via VAULT -- VAULT address is on isWhitelist, so WEMIX$ allows the mint
- Router calls burn -- burns pool WEMIX$ to drain out USDC.e
- Repeat 9 times, doubling each cycle: 20K, 40K, 82K, 164K, 328K, 656K, 1.3M, 2.6M, 5.2M
Important Distinction
The 9 Mint/Burn Cycles -- How 5.2M Was Created
The attacker did not just mint 5.2M tokens in one shot. They ran a loop: burn existing pool WEMIX$ (pulling out USDC.e), then mint fresh WEMIX$ to refill the pool. Each cycle, the amount doubled.
| Cycle | Burned | Minted | Net added |
|---|---|---|---|
| 1 | 20,492 | 20,492 | ~0 |
| 2 | 20,492 | 40,984 | +20,492 |
| 3 | 40,984 | 81,969 | +40,985 |
| 4 | 81,969 | 163,938 | +81,969 |
| 5 | 163,938 | 327,876 | +163,938 |
| 6 | 327,876 | 655,752 | +327,876 |
| 7 | 655,752 | 1,311,504 | +655,752 |
| 8 | 1,311,504 | 2,623,008 | +1,311,504 |
| 9 | 2,623,008 | 5,246,017 | +2,623,009 |
| TOTAL | 5,246,017 | 10,471,542 | +5,225,525 |
Full Attacker Transaction Trace (All 37 Transactions)
Every single transaction the attacker made, in order. Nothing omitted.
Funding (1 transaction)
| Block | Time (UTC) | From | Amount |
|---|---|---|---|
| 118,822,162 | 08:52:59 | Gas Funder0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3 | 23.746 WEMIX |
Pre-Exploit: Deploy and Debug (Nonces 0-3)
| Nonce | Block | Time | Action |
|---|---|---|---|
| 0 | 118,823,430 | 09:14:07 | Deploy version 1 -- self-destructed |
| 1 | 118,823,430 | 09:14:07 | Call version 1 -- no-op (empty contract) |
| 2 | 118,823,520 | 09:15:37 | Deploy version 2 -- also failed |
| 3 | 118,823,608 | 09:17:05 | Deploy final Router (10,590 bytes) |
🔥 THE EXPLOIT (Nonce 4)
| Nonce | Block | Time | Action |
|---|---|---|---|
| 4 | 118,823,631 | 09:17:28 | Call attack() -- 9 mint/burn cycles -- extract 723,294 USDC.e + 4.5M WEMIX$ |
Mints: 9 events (10,471,542 WEMIX$ total) | Burns: 9 events (5,246,017 total) | Net new supply: +5,225,525
USDC.e to attacker: 723,294.49 | WEMIX$ to attacker: 4,500,366.27
Post-Exploit: Cash Out (Nonces 5-36, 32 transactions)
| Nonce | Block | Time | To | Value | Action |
|---|---|---|---|---|---|
| 5 | 118,823,651 | 09:17:48 | Router | 0 | REVERTED 2nd exploit failed |
| 6-7 | 118,823,721 | 09:18-19 | USDC.e | 0 | Approve USDC.e for bridge |
| 8 | 118,823,754 | 09:19:31 | CCIP | 6.72 | Bridge send #1 to Ethereum |
| 9-10 | 118,823,919 | 09:22 | USDC.e + V3 | 0 | Approve + Uniswap V3 swap |
| 11-21 | 118,824,055 | 09:24-09:43 | CCIP ×10 | ~6.5 each | Bridge sends #2-#11 to Ethereum (total fees: 72.78 WEMIX) |
| 22 | 118,826,166 | 09:59:43 | WEMIX$ | 0 | Transfer 107,811 WEMIX$ to DEX pair #1 |
| 23-27 | 118,826,171 | 09:59-10:00 | DEX pairs | 0 | DEX swaps + unwrap WWEMIX |
| 28-29 | 118,826,664 | 10:08 | CREATE ×2 | 0 | Deploy two swap helper contracts (4,519 bytes each) |
| 30 | 118,826,715 | 10:08:52 | WEMIX$ | 0 | Transfer 4,001,246 WEMIX$ to swap helper #2 |
| 31 | 118,826,740 | 10:09:17 | Helper #2 | 0 | Run two-hop swap (WEMIX$ to WEMIX to USDC.e) |
| 32-33 | 118,827,047 | 10:14 | USDC.e + V3 | 0 | Approve + final Uniswap V3 swap |
| 34 | 118,827,509 | 10:22:06 | Dormant Cash-Out0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 | 4,500 | Still dormant (nonce 0) |
| 35-36 | 118,829,265 | 10:51-10:58 | Forwarder0x14c5d965804e6d7145e0a636d7409883aeba89f0 | 30,252 | Forwarded to Suspected CEX Sink |
All Addresses and Who They Are
Grouped for readability. Full 40-hex addresses with explorer links. Analytical labels (for example, Suspected CEX sink) are not legal entity names unless an explorer tag or official WEMIX blog confirms them.
Core contracts 11
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| WEMIX$ Token | 0x8e81fcc2d4a3baa0ee9044e0d7e36f59c9bba9c1 | WEMIX | Contract (11,666 bytes) | Stablecoin. Minter whitelist. No external CALLs. Not upgradeable. |
| WEMIX$ Owner (Foundation cold key) | 0x7a907b9df3f4843522b905758c2f542c9c028e4d | WEMIX | EOA | Nonce 0, zero balance. Never used in exploit. |
| VAULT (helper proxy) | 0xd2947dbfdbdbb99702de6e46c63cb1968e21d95b | WEMIX | EIP-1967 proxy (2,112 bytes) | Proxy template. Ownable=Router. isWhitelist 1→0. Impl unchanged in exploit. |
| Secondary Helper proxy (0x01fa) | 0x01fa6cc8cd2f99b30e19d599fc002c3f2cac3d76 | WEMIX | EIP-1967 proxy (2,112 bytes) | Same proxy bytecode as VAULT; different implementation. Ownable=Router. isWhitelist 1→0. |
| VAULT implementation | 0xbddd41457b55710fd0055b1cfbbc0b9be77a89c4 | WEMIX | Implementation (16,443 bytes) | EIP-1967 impl slot for VAULT. Direct owner()=0 (state in proxy). |
| Secondary Helper implementation | 0x002ceee5624f60fee129549ffa6805a5ee49c759 | WEMIX | Implementation (7,783 bytes) | EIP-1967 impl slot for 0x01fa. Not identical to VAULT impl. |
| Shared Proxy Admin | 0x465ea8f2dea0061dc177d4325ece33a0151af3f9 | WEMIX | EOA (nonce 1) | EIP-1967 admin for both proxies. 0 balance. Residual upgrade surface (H12). Unlabeled. |
| VAULT Pre-Init Owner | 0xa57440b7059b250434c3f7ce07d74b60410a2e0a | WEMIX | EOA | Owner before exploit initialize; never called initialize(). |
| Secondary Helper Pre-Init Owner | 0x0fc69c692c5e9d1eea16b53e708cb8e583e3eb63 | WEMIX | EOA | Owner before exploit initialize; never called initialize(). |
| CCIP Bridge (WEMIX3.0) | 0x7798b795fde864f4cd1b124a38ba9619b7f8a442 | WEMIX | Contract (11,130 bytes) | 11 sends to Ethereum only (selector 5009297550715157269). |
| USDC.e Token (WEMIX3.0) | 0x44bb111010dfffb3695f9a1b66aa879976199e7b | WEMIX | Token | Stolen value on WEMIX3.0. |
Attacker path 8
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| Attacker / Signer EOA | 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] | WEMIX ETH | EOA | 37 txs WEMIX3.0; residual ETH on Ethereum. Wallet known; real-world person is attribution-open. |
| Gas Funder (exchange distribution) | 0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3 | WEMIX | EOA | 1,885 txs. Funded attacker with 23.746 WEMIX. |
| Exchange Hot Wallet (upstream) | 0xf89d7b9c864f589bbf53a82105107622b35eaa40 | WEMIX | EOA | 123,344 txs. Exchange infrastructure. |
| Upstream of Hot Wallet | 0x3d87aa740dc32481494904ab94679251d5dfe51e | WEMIX | EOA | Funded hot wallet; nonce 0 at that point. |
| Exploit Router | 0xb6bdea4941f6fd4ea3918fac902494da100ac4d2 | WEMIX | Contract (10,590 bytes) | attack(). owner()=Signer. Still Ownable of VAULT + 0x01fa proxies. |
| Dormant Cash-Out | 0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 | WEMIX | EOA | 4,500 WEMIX. Nonce 0. Potentially recoverable if frozen. |
| Forwarder Wallet | 0x14c5d965804e6d7145e0a636d7409883aeba89f0 | WEMIX | EOA | Forwarded 30,252 WEMIX to sink. Nonce 2. |
| Suspected CEX Sink (unnamed) | 0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH] | WEMIX ETH | EOA | 407 nonces; ~2,473 WEMIX dust. Multi-hop ETH convergence. Legal CEX name: attribution-open (Foundation/exchange/LE). |
DEX / infra (WEMIX3.0) 9
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| Swap Helper #1 (unused) | 0xc5eff51d9f4e58d841bec56ce998e06cd6f18854 | WEMIX | Contract (4,519 bytes) | Deployed, never used. Possible backup. |
| Swap Helper #2 | 0x7a9279fd5204651e2447734c0a2d8fb54373535e | WEMIX | Contract (4,519 bytes) | Two-hop swap; dumped ~4M WEMIX$. |
| DEX Router (WEMIX3.0) | 0x5937c7096b054564c6f17b7e61d9abf1256b0593 | WEMIX | Contract (17,047 bytes) | Received 723,244 USDC.e during exploit. Shared infra. |
| DEX Pool (WEMIX3.0) | 0x34d30e02dc98122ac25f602b68c76733f3a62db6 | WEMIX | Contract (31,705 bytes) | Received 953 USDC.e; held ~209.75 residual at prior audit. |
| USD Coin (bridged variant) | 0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d | WEMIX | Contract (7,544 bytes) | Swap target only. Not a WEMIX$ minter. |
| DEX Pair (in Router code) | 0x1d3fcfb4c3e687140c836415154d311c2679d5d5 | WEMIX | Pair / addr | Appears in 40+ USDC.e transfers during exploit. |
| DEX Pair #1 | 0x42cf1af7fa9c2b50855a47806706d623de73316b | WEMIX | UniV2 pair | Received 107,811 WEMIX$ dump. |
| DEX Pair #2 | 0x00caec2e118abc4c510440a8d1ac8565fec0180c | WEMIX | UniV2 pair | Received 391,307 WEMIX$ dump. |
| AMM Wrapper | 0xe4978230413e0b4779fc18977776e87e37655bbb | WEMIX | Contract (708 bytes) | 73 swap-accounting events in exploit tx. |
Ethereum exit 9
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| ETH USDC Release Cluster | 0xc373cb40513af4a9a128e6350f2b127f5d413e88 | ETH | EOA/cluster | Sent ~723,244 USDC to attacker on Ethereum post-CCIP. |
| ETH USDC→ETH swap contract | 0x225a38bc71102999dd13478bfabd7c4d53f2dc17 | ETH | Contract | USDC→ETH route on Ethereum (Etherscan). |
| ETH→BSC bridge contract (ETH) | 0x69460570c93f9de5e2edbc3052bf10125f0ca22d | ETH | Bridge contract | Bridge contract on Ethereum (Etherscan): RangoDiamond. 73.5 ETH to BSC. |
| ETH Intermediate #1 | 0x7353e299484668ac3b8c193139b8a136ff135eaa | ETH | EOA | Received 15 ETH from signer; forwarded toward sink/others. |
| ETH Intermediate #2 | 0x3a13920f7501aa6c58476b6d278d06f312d5d431 | ETH | EOA | 5 ETH path toward Arbitrum Inbox. |
| ETH Intermediate #3 | 0x8f3e7a7830b8886d5ae071d012ad4c007a74bbfd | ETH | EOA | Forwarded to Suspected CEX Sink. |
| Arbitrum Inbox | 0x4dbd4fc535ac27206064b68ffcf827b0a60bab3f | ETH | Bridge | Arbitrum Inbox contract (Etherscan label). |
| Post-Sink ETH Holder (2026-07-29) | 0xb7f23910577b033746a29e406106ffdb50951265 | ETH | EOA | Received ~21.71 ETH from Suspected CEX Sink; still holding. Unlabeled. |
| Post-Sink ETH Dust (2026-07-29) | 0xf0bf1b911f8e33058f3dda6284eff4842b08289d | ETH | EOA | Received ~1.05 ETH from Suspected CEX Sink. Unlabeled. |
BNB Smart Chain exit 6
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| BSC Hop Wallet | 0x2cf3ebd5997fa816ac57e796fea52325a374180b | BSC | EOA | Received Rango bridge; sent 139,550 USDT to 4 EOAs. |
| BSC-USD (USDT token) | 0x55d398326f99059ff775485246999027b3197955 | BSC | Token | BscScan-labeled Binance-Peg BSC-USD token used for hop-wallet cash-outs. Token name is an explorer label, not a claim that Binance received funds. |
| BSC USDT Recipient A (90k) | 0x7b0a97f369b11755f0ef84cf1a61c03d8f693eba | BSC | EOA | Unlabeled. First-seen 2026-07-26. 90,000 USDT total. |
| BSC USDT Recipient B (20k) | 0x8824e047921c699aa76b032a334107b057e2aeaa | BSC | EOA | Unlabeled. 20,000 USDT. |
| BSC USDT Recipient C (19.55k) | 0xf72c18c6b10659ff24b33d16b458b9802f5d9ace | BSC | EOA | Unlabeled. 19,550 USDT. |
| BSC USDT Recipient D (10k) | 0x3b1bf3403d537c92a3fbf9379891d7b9f766c071 | BSC | EOA | Unlabeled. 10,000 USDT. |
Key transactions 2
| Label | Full Address | Chain | Type | Key Fact |
|---|---|---|---|---|
| Funding Transaction | 0x5afa080282756fa24ce725ff0da2913e5d1eb5badcf83596f91257aad4f768e8 | WEMIX | Tx hash | Gas funder to attacker, 23.746 WEMIX. Open on WEMIX explorer |
| Exploit Transaction | 0xfed2172a508d84f63b56acc7e3c30164930220004f808799998b8201fe7cefe0 | WEMIX | Tx hash | 679 logs; 9 mint/burn cycles. Open on WEMIX explorer |
Gap Resolution
Technical (1 to 12, 14 to 15, 17): closed on explorers and/or official blog. Attribution (13, 16): open until Foundation, exchange, or LE names a venue or person. Residual ops risk (18 / H12): Proxy Admin upgrade surface; not the July 26 mint path.
| # | Question | Status | Answer |
|---|---|---|---|
| 1 | What is function 0xc683630d? | SOLVED | Public signature databases say isWhitelist(address). Pre-exploit: VAULT + Secondary Helper = 1. Latest (2026-07-29): both = 0 (revoked). Name should be independently verified. |
| 2 | What is CCIP function 0x96f4e9f9? | SOLVED | Public databases say ccipSend(...). The CCIP message receiver is the attacker's own address on Ethereum. |
| 3 | What is exploit function 0x9e5faafc? | SOLVED | Public databases say attack(). |
| 4 | What is swap helper function 0x7357f5d2? | SOLVED | Public databases say run(uint256,uint256). |
| 5 | Who is DEX Router 0x5937c7096b054564c6f17b7e61d9abf1256b0593? | SOLVED | DEX Router (17,047 bytes). Got 723K USDC.e. Shared infra, not attacker-controlled. |
| 6 | Who is DEX Pool 0x34d30e02dc98122ac25f602b68c76733f3a62db6? | SOLVED | DEX pool (31,705 bytes). Got 953 USDC.e; ~209.75 residual at audit. |
| 7 | What is USD Coin variant 0xe3f5a90f9cb311505cd691a46596599aa1a0ad7d? | SOLVED | Bridged "USD Coin". Not a WEMIX$ minter. Swap target only. |
| 8 | Who is DEX Pair 0x1d3fcfb4c3e687140c836415154d311c2679d5d5? | SOLVED | DEX pair address in Router; 40+ USDC.e transfers during exploit. |
| 9 | Why did the 2nd exploit (nonce 5) fail? | SOLVED | Double-setup protection. The helper contracts block calling the setup function twice. Failed at the first check. |
| 10 | Did the attacker use PLAY Bridge? | SOLVED | No. None of the 37 transactions touch the PLAY Bridge. |
| 11 | Is Dormant Cash-Out 0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 still holding funds? | SOLVED | Yes. 4,500 WEMIX, nonce 0 (live 2026-07-29). Potentially recoverable if frozen. |
| 12 | Did money go to BNB Chain? | SOLVED | Yes: second hop from Ethereum. Signer → ETH→BSC bridge contract 0x69460570c93f9de5e2edbc3052bf10125f0ca22d (73.5 ETH) → BSC hop 0x2cf3ebd5997fa816ac57e796fea52325a374180b → 139,550 USDT to four unlabeled EOAs. WEMIX3.0 CCIP was Ethereum-only; BNB is off WEMIX3.0. Verify on Etherscan + BscScan. |
| 13 | Which exchange got the money? | ATTRIBUTION OPEN | On-chain pattern closed; legal name open. Suspected CEX sink 0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH] (407 nonces; no public explorer name tag). Official blog: freezes requested, some venues froze addresses, names not published. To resolve: Foundation freeze list, exchange compliance reply, or LE disclosure. Do not invent a CEX name from nonce pattern alone. |
| 14 | What is function 0xae0ce498? | BEHAVIOR-CLOSED | Still returns 2. Not found in public function-signature databases (re-checked 2026-07-29). Constant config/role enum. Exact Solidity name needs source; low priority for the case. |
| 15 | Can helpers still mint? (containment) | SOLVED (token-side) | No via current helpers. isWhitelist(VAULT)=0 and isWhitelist(0x01fa)=0. Proxy Ownable still Router. totalSupply stable. See gap 18 for Proxy Admin upgrade residual. |
| 16 | Who is the attacker in real life? | ATTRIBUTION OPEN | Wallet identified; person unknown. Attacker EOA 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] fully mapped (37 nonces). Funding path is exchange infrastructure, not bare attacker infra. To resolve: KYC at the gas-funding exchange, or LE on freeze/deposit accounts. Explorers cannot close this. |
| 17 | Are VAULT / 0x01fa full implementations? | SOLVED | No. EIP-1967 transparent proxies (2,112-byte identical proxy code). Distinct impls: 0xbddd41457b55710fd0055b1cfbbc0b9be77a89c4 and 0x002ceee5624f60fee129549ffa6805a5ee49c759. Prior "full implementation" claim retracted. |
| 18 | Proxy Admin residual upgrade risk? (H12) | OPEN residual | Admin 0x465ea8f2dea0061dc177d4325ece33a0151af3f9 (nonce 1, 0 bal) can upgrade both proxies. Foundation should confirm custody / rotate to multisig. Not proof of compromise. Not the July 26 mint path. |
- CEX name: Ask WEMIX Foundation which exchanges confirmed freezes for sink
0xdb3ded7731c781224ec292e2163d9554c094fd7c, BSC USDT recipients, and related ETH addresses. Or wait for public explorer tags that name a venue. - Person: Formal request to the exchange that funded gas (upstream of
0x23df34d2d6556a227ddc12a6c6474cb7c6edb6b3) and/or exchanges that received deposits. Requires KYC cooperation or law enforcement. - Do not: Mark a legal CEX name or person from hop counts, dust balances, or news paraphrases alone.
Last Known Points of All Stolen Funds
| Asset | Amount | Last Known Location | Status |
|---|---|---|---|
| USDC → ETH | ~723,244 USDC | ETH: swap contract 0x225a38bc71102999dd13478bfabd7c4d53f2dc17 → ETH legs (Etherscan) | Then Rango → BSC (73.5 ETH) + other ETH dispersals (Arbitrum path, sink hops). |
| USDT (BSC) | 139,550 | 4 EOAs from BSC hop 0x2cf3ebd5997fa816ac57e796fea52325a374180b | Largest: 90k to 0x7b0a97f369b11755f0ef84cf1a61c03d8f693eba
(unlabeled). Four EOAs look fresh on exploit day; 19,550 is the
non-round remainder after 90k/20k/10k batches. Nested layers, not named
exchange deposits. |
| USDC.e | 953.78 | DEX Pool 0x34d30e02dc98122ac25f602b68c76733f3a62db6 | UniV3 residual path; ~209.75 noted at prior audit. |
| WEMIX | 4,500 | Dormant Cash-Out0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 | Still 4,500 (live). Recoverable if frozen. |
| WEMIX | 30,252 | Suspected CEX Sink0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH] | ~2,473 WEMIX dust still there. CEX name unknown. ETH outflows 2026-07-29. |
| WEMIX | ~3,944 | Spent as gas | Gone. Not recoverable. |
| WEMIX | 72.78 | Spent as CCIP bridge fees | Gone. Not recoverable. |
Moved off-chain (Ethereum/BNB): ~724,198 USDC.e total. Foundation says some frozen (general statement).
Spent on gas/fees: ~4,017 WEMIX. Gone.
Exploit Transaction: 679 Log Events
The exploit transaction produced 679 log events from 8 contracts. Here is every type:
| Event | Count | From | What It Means |
|---|---|---|---|
| Transfer | 450 | WEMIX$ (367), USDC.e (147) | Token movements. 9 from-zero (mints), 9 to-zero (burns), 258 other. |
| Approval | 73 | WEMIX$ | Approving DEX pools to spend tokens. |
| AMM wrapper event | 73 | AMM Wrapper 0xe4978230413e0b4779fc18977776e87e37655bbb (708 bytes) | Swap accounting. Records input, output, and fee. |
| Sync | 19 | 2 DEX pairs | Reserve updates after each swap. |
| Swap | 19 | 2 DEX pairs | Actual swap events. |
| Mint authorization | 9 | WEMIX$ | Records who minted, how much, and which cycle (1-9). |
| Burn authorization | 9 | WEMIX$ | Records who burned, how much, and which cycle. |
| VAULT action | 9 | VAULT | VAULT swap event with pool state data. |
| 0x01fa action | 9 | 0x01fa | Secondary helper action event. |
| OwnershipTransferred | 2 | VAULT, 0x01fa | Ownership moved from old owners to the attacker's Router. |
| Initialized | 2 | VAULT, 0x01fa | Confirms the setup function was called on both helpers. |
| Other setup | 5 | VAULT, 0x01fa | Additional setup events. |
Minted: 10,471,542 WEMIX$. Burned: 5,246,017 WEMIX$. Net new: +5,225,525 WEMIX$.
Open residual risk (H12)
Proxy Admin residual. Token-side mint is revoked (isWhitelist=0 for VAULT and 0x01fa). Ownable on both proxies is still Exploit Router
0xb6bdea4941f6fd4ea3918fac902494da100ac4d2.
Double-initialize blocked; totalSupply frozen at 19,765,366.
Shared Proxy Admin 0x465ea8f2dea0061dc177d4325ece33a0151af3f9
(nonce 1, 0 balance) can still upgrade either proxy implementation. That
is residual operational risk, not evidence the key is lost or stolen.
Recommendation: Foundation confirm custody and rotate to multisig. Details: gap 18, Architecture, Watch.
What to Monitor
Movement on these addresses is an investigative lead. Sink ETH outflows on 2026-07-29 show the sink cluster was still active post-exploit (not a frozen/lost wallet narrative). Status tags below are as of that observation window.
- BSC USDT recipients A-D (movement = lead): 0x7b0a97f369b11755f0ef84cf1a61c03d8f693eba (90k; WATCH), 0x8824e047921c699aa76b032a334107b057e2aeaa (20k; WATCH), 0xf72c18c6b10659ff24b33d16b458b9802f5d9ace (19.55k; WATCH), 0x3b1bf3403d537c92a3fbf9379891d7b9f766c071 (10k; WATCH)
- Post-sink ETH holders (received 2026-07-29): 0xb7f23910577b033746a29e406106ffdb50951265 HOLDING (~21.71 ETH); 0xf0bf1b911f8e33058f3dda6284eff4842b08289d HOLDING (~1.05 ETH). Further outs = active management.
- Dormant 0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 DORMANT (4,500 WEMIX; wake = attacker-controlled)
- Proxy Admin 0x465ea8f2dea0061dc177d4325ece33a0151af3f9 WATCH ANY TX (Foundation or unknown controller)
News Claims vs. What Actually Happened
| What News Said | Our Verdict | Evidence |
|---|---|---|
| "Owner key breach" (multiple outlets) | IMPRECISE | Privileged access WAS compromised (helper proxy Ownable taken via initialize). Configuration error, not WEMIX$ owner-key theft. Headlines describe the right problem with the wrong mechanism. |
| "5.23M WEMIX$ minted" (Foundation) | CORRECT (net) | Gross mint was 10.47M but 5.25M was burned in the same transaction. Net new supply: +5,225,525. Matches totalSupply() change exactly. |
| "10.47M minted" (third-party gross-mint headline) | MISLEADING | Correct gross number but ignores 5.25M burned in the same transaction. Net new supply is +5,225,525 (explorer totalSupply delta). |
| "$724,198.27 stolen" (Foundation) | EXACT MATCH | 723,294.49 (exploit) + 903.78 (DEX swaps) = 724,198.27. Reconciled to the dollar. |
| "30,736 WEMIX converted" (Foundation) | CORRECT (net) | Our trace: 34,752 WEMIX gross. Minus 72.78 CCIP fees and ~3,944 gas = ~30,736 net. |
| "Funds to Ethereum and BNB Chain" | CONFIRMED | CCIP → Ethereum on-chain. ETH → BNB via ETH→BSC bridge contract (73.5 ETH) → BSC hop + 139,550 USDT outs. Traced on Etherscan + BscScan. |
| "Some funds to centralized exchanges" | PATTERN CONFIRMED | Forwarder → Suspected CEX Sink 0xdb3ded7731c781224ec292e2163d9554c094fd7c [WEMIX] [ETH] (407 nonces). Legal exchange name not identified. |
| "CCIP was the breach vector" | NO | Zero CCIP calls in the exploit transaction. CCIP was the exit door, not the entry. |
| "Some exchanges froze addresses" | GENERAL STATEMENT | Official WEMIX update: freezes requested from exchanges and stablecoin issuers; some addresses reportedly frozen. Exchange legal names and amounts are not published on the official blog. Verify only via Foundation disclosures or explorer tags. |
| Separate July ~$724K "linked contract" incident | SAME EVENT | Outlets restating helper Ownable / linked-contract compromise as a second July loss are describing this same July 26 exploit. Official blog: ~5,225,525 WEMIX$ issued; 724,198.27 USDC.e + 30,736 WEMIX. Not a separate loss to add. |
February 2025 vs July 2026 Exploits
| February 2025 | July 2026 | |
|---|---|---|
| Target | Play Bridge Vault | WEMIX$ Stablecoin |
| How | Stolen auth key from developer repo | Unlocked contract setup function |
| Time to execute | ~2 months inside the system | 24 minutes from funding to exploit |
| Amount | 8.65M WEMIX (~$6.1M) | $724,198 USDC.e + 30,736 WEMIX |
| Pattern | 15 withdrawal attempts, 13 worked | 9 mint/burn cycles, one transaction |
| Disclosure delay | ~4 days | ~16 hours |
| Root cause | Key theft (operational) | Setup error (contract design) |
| Attacker known? | Not disclosed | Wallet identified, person unknown |
| Attacker overlap testable? | 2025 addresses not disclosed | 2026 wallet mapped; comparison blocked until 2025 set is public |
How to Verify These Claims Yourself
Every claim in this report can be checked by anyone with access to the WEMIX3.0 network. Here are the key checks:
| Claim | How to Check | Expected Result |
|---|---|---|
| WEMIX$ owner never sent a transaction | Check the transaction count (nonce) of 0x7a907b9df3f4843522b905758c2f542c9c028e4d | Nonce = 0 |
| WEMIX$ owner has zero balance | Check the WEMIX balance of WEMIX$ Owner 0x7a907b9df3f4843522b905758c2f542c9c028e4d | 0.0 |
| VAULT whitelist pre vs latest | Call 0xc683630d on WEMIX$ 0x8e81fcc2d4a3baa0ee9044e0d7e36f59c9bba9c1 with VAULT 0xd2947dbfdbdbb99702de6e46c63cb1968e21d95b at block 118823630 vs latest | pre=1, latest=0 (revoked) |
| Secondary Helper whitelist pre vs latest | Same with 0x01fa6cc8cd2f99b30e19d599fc002c3f2cac3d76 | pre=1, latest=0 (revoked) |
| Exploit Router is NOT an approved minter | isWhitelist(Router) on WEMIX$ | Returns 0 |
| WEMIX$ Owner is NOT an approved minter | isWhitelist(Owner) | Returns 0 |
| VAULT / 0x01fa proxy Ownable still Router | owner() 0x8da5cb5b on both proxies | Both return Exploit Router 0xb6bdea4941f6fd4ea3918fac902494da100ac4d2 |
| Pre-init owners (forensics) | owner() at block 118823630 | VAULT → 0xa57440b7059b250434c3f7ce07d74b60410a2e0a; Secondary Helper → 0x0fc69c692c5e9d1eea16b53e708cb8e583e3eb63 |
| Total supply changed by exactly 5,225,525 | Call totalSupply() (selector 0x18160ddd) on WEMIX$ at block 118823630 and block 118823631 | 14,539,841 before, 19,765,366 after, delta = +5,225,525 |
| Exploit transaction has 679 log events | Get the receipt for transaction 0xfed2172a508d84f63b56acc7e3c30164930220004f808799998b8201fe7cefe0 | 679 logs, status = success |
| All 11 CCIP sends went to Ethereum only | Nonces 8, 11-21 to CCIP Bridge 0x7798b795fde864f4cd1b124a38ba9619b7f8a442 | Chain selector 5009297550715157269 (Ethereum) |
| ETH→BNB via Rango | Ethereum: signer → ETH→BSC bridge contract 0x69460570c93f9de5e2edbc3052bf10125f0ca22d (73.5 ETH) | BSC hop 0x2cf3ebd5997fa816ac57e796fea52325a374180b |
| Attacker wallet is empty | Check the balance and nonce of 0xc921a66e30745f11f8c7a7870e95640607ae7ea2 [WEMIX] [ETH] | Balance = 0, nonce = 37 |
| VAULT is EIP-1967 proxy | eth_getStorageAt impl slot 0x360894a1... on VAULT | Impl = 0xbddd41457b55710fd0055b1cfbbc0b9be77a89c4 |
| 0x01fa is EIP-1967 proxy (different impl) | Same slot on 0x01fa | Impl = 0x002ceee5624f60fee129549ffa6805a5ee49c759 |
| Shared Proxy Admin | eth_getStorageAt admin slot 0xb5312768... on both | 0x465ea8f2dea0061dc177d4325ece33a0151af3f9; nonce 1 |
| Dormant wallet still holds 4,500 WEMIX | Check the balance of 0x2b723ed7ad47b060bf56ab0928596d7d024d26d5 | 4,500 WEMIX, nonce = 0 |
isWhitelist(address), attack(), ccipSend(), and run(uint256,uint256)
come from public signature databases. These databases match function
selectors (4-byte hashes) to known function signatures. Collisions are
possible. The behavior of each function was confirmed by direct testing,
but the exact names should be independently verified.