Attacker: Unknown EOA 0x6e523866424220b3cb2cab88ba2195cfa5636b12 had taken over the Yapeswap DAO's control of the YapeFactory (0x46adc1c052fafd590f56c42e379d7d16622835a2). In this tx it used that control to pull the Yearn-farmed reserves of the first six Yapeswap pairs out of real Yearn vaults and into fake "vaults" its own contracts deployed.
Loss: About $22.0k reached the attacker contract 0x327bf6dfc38a79393f78866c705193c39b04be01 in this tx: 1,613 DAI, 1,607 USDC, 7,705 USDT, 4.205 WETH and 0.0141 WBTC. Counting the follow-up batch 0xf6af7db8… and the sweep 0x0eeaa8fd…, the attacker contract took in about $39.7k, which all ended up as 10.52 ETH in the attacker EOA. The losers are Yapeswap liquidity providers.
Root cause: an attacker-passed DAO timelock proposal ran a factory admin setter (a2e74af6) naming the attacker EOA. The EOA then set the factory's operator, registry and feeTo. The pairs' public updateRegistry() copied the attacker's fake registry with no validation, and rebalance() deposited reserves into whatever vault that registry returned.
| Transaction hash | 0x4c741568cc12b23b382db409b0a38a4cfb6c708904f0c2ce7bad2e4fa7179e1e↗ |
| Block | 26266653 |
| Timestamp | 2026-10-25 02:19:23 UTC |
| From | 0x6e523866424220b3cb2cab88ba2195cfa5636b12↗Attacker / governance proposer / tx senderExploiterUnknown EOA (attacker) |
| To | 0x327bf6dfc38a79393f78866c705193c39b04be01↗Attack contract, new factory operator and feetoExploiterAttacker contract (unverified), Unverified attack contract; loops over factory pairs, hijacks their registry/ratio and triggers rebalance into fake vaults. |
| Addresses | Token | TokenID | Balance | Value in USD | Total Value in USD |
|---|---|---|---|---|---|
Zero Address (mint/burn) 0x0000000000000000000000000000000000000000↗ | yvUSDS-1 | - | +2,546.2064 | $8.60M | $9.08M |
| yvUSDC-1 | - | +1,307.0516 | $359.66K | ||
| yvWETH-1 | - | +3.5007 | $116.57K | ||
| YVWETH | - | +3.273 | $7.39K | ||
| USDS | - | +2,838.4127 | $2.84K | ||
| DAI | - | -2,838.4127 | -$2.84K | ||
| YVUSDC | - | +1,230.3343 | $1.46K | ||
| ymv-USDT | - | +6,938.2254 | unpriced | ||
| ymv-WBTC | - | +0.002368 | unpriced | ||
| ysDAI | - | +1,197.0491 | unpriced | ||
| ysUSDC | - | +0.3403 | unpriced | ||
| ysUSDS | - | +2,823.9117 | unpriced | ||
| YVDAI | - | +1,185.4861 | unpriced | ||
| yvDAI-1 | - | +1,289.6604 | unpriced | ||
| yvUSDC | - | +831.9758 | unpriced | ||
| YVUSDT | - | +6,122.7315 | unpriced | ||
| yvUSDT-1 | - | +6,425.8182 | unpriced | ||
| YVWBTC | - | +0.01276 | unpriced | ||
| yvWBTC-1 | - | +0.01129 | unpriced | ||
0x39c0aec5738ed939876245224afc7e09c8480a52↗ysUSDC | yvUSDS-1 | - | -1,316.0404 | -$4.44M | -$4.44M |
0xaedf7d5f3112552e110e5f9d08c9997adce0b78d↗ysDAI | yvUSDS-1 | - | -1,230.1661 | -$4.15M | -$4.15M |
0xd5aadcd054a00eff71bcb922cddc70752fa2bc68↗Unlabeled | yvUSDC-1 | - | -1,307.0516 | -$359.66K | -$359.66K |
0x85907b1af27fd04a5efabc0fb7162f8690a6b82f↗Unlabeled | yvWETH-1 | - | -3.5007 | -$116.57K | -$116.57K |
0x327bf6dfc38a79393f78866c705193c39b04be01↗Attack contract, new factory operator and feetoExploiterAttacker contract (unverified) | WETH | - | +4.2051 | $9.77K | $21.82K |
| USDT | - | +7,705.3059 | $7.70K | ||
| DAI | - | +1,613.2446 | $1.61K | ||
| USDC | - | +1,607.411 | $1.61K | ||
| WBTC | - | +0.01409 | $1.14K | ||
0xc56413869c6cdf96496f2b1ef801fedbdfa7ddb0↗yvWETH-1 | WETH | - | -3.698 | -$8.59K | -$8.59K |
0xe3b43be5ab96629493f948229efbee2c0787ed25↗Unlabeled | YVWETH | - | -2.5578 | -$5.77K | -$7.32K |
| WETH | - | -0.3824 | -$888.26 | ||
| USDT | - | -661.8186 | -$660.99 | ||
| YVUSDT | - | -6,122.7315 | unpriced | ||
0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb↗Morpho Blue | USDT | - | -7,043.4873 | -$7.03K | -$7.23K |
| WBTC | - | -0.002369 | -$191.06 | ||
0x4e41488c19cd35eb4de3083fc3e204854c75c86a↗Unlabeled | USDS | - | -2,838.4127 | -$2.84K | -$2.84K |
0x37305b1cd40574e4c5ce33f8e8306be057fd7341↗Unlabeled | USDC | - | -1,467.0711 | -$1.47K | -$1.47K |
0xf6e72db5454dd049d0788e411b06cfaf16853042↗Unlabeled | DAI | - | +1,467.0711 | $1.47K | $1.47K |
0x0415af9f90a1f774edc426047d945b474417c0aa↗Victim pairVictimYapePair WBTC/WETH | YVWETH | - | -0.3701 | -$835.19 | -$1.07K |
| WETH | - | -0.0667 | -$154.94 | ||
| WBTC | - | -0.001019 | -$82.19 | ||
| YVWBTC | - | -0.01276 | unpriced | ||
0x36822d0b11f4594380181ce6e76bd4986d46c389↗Unlabeled | YVUSDC | - | -873.1975 | -$1.04K | -$1.04K |
| USDC | - | +0.000593 | $0.0006 | ||
0x8e5b9d85c8bbd309f571dba0c82ddacaca897805↗Unlabeled | YVUSDC | - | -351.3279 | -$418.08 | -$849.53 |
| YVWETH | - | -0.1508 | -$340.29 | ||
| WETH | - | -0.02281 | -$53.00 | ||
| USDC | - | -38.1725 | -$38.17 | ||
0x751f0cc6115410a3ee9ec92d08f46ff6da98b708↗yvWBTC-1 | WBTC | - | -0.008928 | -$720.04 | -$720.04 |
| ymv-WBTC | - | -0.002368 | unpriced | ||
0xec5ed926ed8cfe13dae06ed5649d0c497f2216b6↗Victim pairYapePair (WETH pair) | YVWETH | - | -0.1944 | -$438.72 | -$555.49 |
| WETH | - | -0.02915 | -$67.72 | ||
| DAI | - | -49.0748 | -$49.05 | ||
| YVDAI | - | -440.1309 | unpriced | ||
0x23c1653e9e13eefe2e1b5954bfef00a2db0483b6↗Victim pair (lp reserves drained to fake vaults)VictimYapePair DAI/USDC | USDC | - | -102.168 | -$102.15 | -$210.87 |
| DAI | - | -101.8649 | -$101.81 | ||
| YVUSDC | - | -5.8088 | -$6.91 | ||
| YVDAI | - | -745.3553 | unpriced | ||
| yvUSDC | - | -831.9758 | unpriced | ||
0xa696a63cc78dffa1a63e9e50587c197387ff6c7e↗Yearn WBTC vault | WBTC | - | -0.001776 | -$143.22 | -$143.22 |
0x028ec7330ff87667b6dfb0d94b954c820195336c↗DAI-1 yVault (v3) | DAI | - | -90.9632 | -$90.91 | -$90.91 |
| ysDAI | - | -1,197.0491 | unpriced | ||
0x670120d4833633466c7db4b515c53fa8c5b33b97↗Unlabeled | WETH | - | -0.006007 | -$13.95 | -$13.95 |
0xbe53a109b494e5c9f97b9cd39fe969be68bf6204↗USDC-1 yVault (v3) | USDC | - | -0.000052 | -$0.0001 | -$0.0001 |
| ysUSDC | - | -0.3403 | unpriced | ||
0x182863131f9a4630ff9e27830d945b1413e347e8↗USDS-1 yVault | ysUSDS | - | -2,823.9117 | unpriced | - |
0xa7496763f035e73ec6b56f4c86312cc1874a01e3↗Unlabeled | yvDAI-1 | - | -1,289.6604 | unpriced | - |
0xe5e2baf96198c56380ddd5e992d7d1ada0e989c0↗Unlabeled | ymv-USDT | - | +0.008363 | unpriced | - |
0x310b7ea7475a0b449cfd73be81522f1b88efafaa↗yvUSDT-1 | ymv-USDT | - | -6,938.2338 | unpriced | - |
0xe07d1e27d93eda41ab091fc91a2026df41763b56↗Unlabeled | yvUSDT-1 | - | -6,425.8182 | unpriced | - |
0x8b64692c42ac08a7275aff3e2cc59e7401c471d5↗Unlabeled | yvWBTC-1 | - | -0.01129 | unpriced | - |
createLockUntil in the Yapeswap Voting Escrow (0x4b9500be…), called delegate, and called proposeTx(target=YapeFactory…) on governance/timelock contract 0x5d35809b…. A second call to 0x5d35809b… followed on 10-17 (selector bccd99e6, not decoded), schedule on 10-24, and execute at 02:15:47 on 10-25. The executed payload was YapeFactory a2e74af6(0x6e523866…): an admin setter handing the factory to the attacker EOA.setOperator(0x327b…), setRegistry(0xc620…) and setFeeTo(0x327b…).updateRegistry() (pair slot 0x11 changed from the real Yearn registry 0x50c1a2ea… to 0xc620…), then setFarmingRatio as operator (max ratio 8000→10000), then rebalance().rebalance withdrew the pair's yvDAI, yvUSDC, yvWBTC and yvWETH positions from genuine Yearn v2 and v3 vaults and deposited the assets into the fake vaults returned by latestVault(). Fees went to feeTo, which is the attacker contract.This is a governance takeover turned into an asset redirect. The DAO's authority over the factory was captured with a recently bought and locked governance-token position. It was then used to point every pair's yield-farming at attacker-controlled sinks, so LP-owned reserves left through the protocol's own rebalance path.
File: contracts/core/YapePair.sol
Function: updateRegistry() / rebalance() (factory admin set via DAO timelock)
Vulnerability class: access-control (governance capture drove privileged factory setters)
Broken invariant: Yapeswap assumed the factory registry and operator could only be changed by a broad, durably-aligned DAO majority, and that the registry always lists genuine Yearn vaults. The attacker bought and locked VISION, passed its own timelock proposal making itself factory admin, and installed a fake registry that the pairs trusted blindly.
Mechanism: YapePair.sol L57-58, function updateRegistry() public { _registry = IYapeFactory(factory).registry(); }, is callable by anyone and copies the registry unvalidated. L61 setFarmingRatio(...) external onlyOperator admitted the attacker contract once it was the factory operator. rebalance() (L81) then withdrew from real Yearn vaults and deposited into the fake registry's latestVault().
The attacker EOA is 11.5 days old with 6 txs, funded by unlabelled 0x003106de…. The factory deployer is labelled 0xmayflower.eth (warehouse flag: Tornado Cash recipient); it is not linked to the attacker in the evidence.
Yapeswap assumed its factory registry and operator could only be changed by a broad, durably-aligned DAO majority, and that the registry always lists genuine Yearn vaults. The attacker bought and locked VISION days before, passed its own timelock proposal making its EOA factory admin, installed a fake registry and itself as operator, and every pair's public updateRegistry() adopted the registry unchecked.
YapePair.sol L57-58: `function updateRegistry() public { _registry = IYapeFactory(factory).registry(); }`, with no validation of the registry the factory returns; rebalance() then deposits into registry.latestVault().0x23c1653e9e13eefe2e1b5954bfef00a2db0483b6↗ | VictimcontractYapePair DAI/USDC, LP reserves redirected |
0x0415af9f90a1f774edc426047d945b474417c0aa↗ | VictimcontractYapePair WBTC/WETH |
0x46adc1c052fafd590f56c42e379d7d16622835a2↗ | VictimcontractYapeFactory whose admin was captured |
0x6e523866424220b3cb2cab88ba2195cfa5636b12↗ | Attackerwalletproposer, new factory admin, final ETH holder |
0x327bf6dfc38a79393f78866c705193c39b04be01↗ | Attackercontractattack contract, factory operator and feeTo |
0xc620ca5b2a63cdb792d462898010d2be4421b5a7↗ | Attackercontractfake registry |
0x6e523866424220b3cb2cab88ba2195cfa5636b12↗ | Attacker / governance proposer / tx senderExploiterUnknown EOA (attacker) |
0x327bf6dfc38a79393f78866c705193c39b04be01↗ | Attack contract, new factory operator and feetoExploiterAttacker contract (unverified), Unverified attack contract; loops over factory pairs, hijacks their registry/ratio and triggers rebalance into fake vaults. |
0xc620ca5b2a63cdb792d462898010d2be4421b5a7↗ | Malicious registry installed in factory and pairsExploiterFake Yearn registry (attacker-deployed), Attacker registry that proxies numVaults to Yearn but returns attacker vaults from latestVault(). |
0x46adc1c052fafd590f56c42e379d7d16622835a2↗ | Victim admin surface (operator/registry/feeto hijacked)VictimYapeFactory, Factory whose registry/operator/feeTo the attacker controlled; read by pairs for registry() and operator(). |
0x23c1653e9e13eefe2e1b5954bfef00a2db0483b6↗ | Victim pair (lp reserves drained to fake vaults)VictimYapePair DAI/USDC, Uniswap-v2-style pair that farms reserves in Yearn; its registry was swapped and its reserves were moved to fake vaults. |
0x0415af9f90a1f774edc426047d945b474417c0aa↗ | Victim pairVictimYapePair WBTC/WETH, Pair whose yvWBTC/yvWETH positions were withdrawn and redeposited into attacker vaults. |
0x5ec9e34b7bdce9f79e538c0e318a30c6a184fd10↗ | Sink for pair daiFake DAI vault (attacker-deployed), Attacker-deployed stub vault receiving pair DAI via deposit(). |
0x27a8ab7bec76a6ccc929c3f24e4640b5978a3ebb↗ | Sink for pair usdcFake USDC vault (attacker-deployed), Attacker-deployed stub vault receiving pair USDC. |
0xde161e9e2b6e94ac9ea86357cadfaa02dc38501a↗ | Sink for pair wethFake WETH vault (attacker-deployed), Attacker-deployed stub vault receiving pair WETH. |
0x6f88eca5e7922ec0a0ed16f8d9199f68e0120d9c↗ | Sink for pair wbtcFake WBTC vault (attacker-deployed), Attacker-deployed stub vault receiving pair WBTC. |
0xec5ed926ed8cfe13dae06ed5649d0c497f2216b6↗ | Victim pairYapePair (WETH pair), Another Yapeswap pair rebalanced into the fake WETH vault. |
0x5d35809b5558fbd8efa18ae1b202db1973b95ddb↗ | Executed attacker proposalYapeswap DAO governance/timelock (unidentified contract) |
0x4b9500be3f3896fa4ae391244965740d9a59f1d6↗ | Voting power sourceYapeswap DAO Voting Escrow Lock |
0x757bc268bd50da88b2d0cf1966652b18e56ca803↗ | Governance token bought by attackerYapeswap DAO Vision Token |
0xd8965d4fabfa616110ac8737c74f5e4948c6d952↗ | Yapefactory deployer (context only)0xmayflower.eth |
0xda816459f1ab5631232fe5e97a05bbbb94970c95↗ | Yearn yvDAI, Genuine Yearn v2 DAI vault the pair withdrew from. |
0x5f18c75abdae578b483e5f43f12a39cf75b973a9↗ | Yearn USDC yVault, Genuine Yearn v2 USDC vault the pair withdrew from. |
0xa696a63cc78dffa1a63e9e50587c197387ff6c7e↗ | Yearn WBTC vault, Genuine Yearn WBTC vault withdrawn via router strategy to WBTC-1 v3 and Morpho. |
0xa258c4606ca8206d8aa700ce2143d7db854d168c↗ | Yearn WETH vault, Genuine Yearn WETH vault withdrawn by the pair. |
0x028ec7330ff87667b6dfb0d94b954c820195336c↗ | DAI-1 yVault (v3), Yearn v3 vault redeemed by the v2 router strategy to free DAI. |
0xbe53a109b494e5c9f97b9cd39fe969be68bf6204↗ | USDC-1 yVault (v3), Yearn v3 vault redeemed to free USDC. |
0x182863131f9a4630ff9e27830d945b1413e347e8↗ | USDS-1 yVault, Yearn v3 USDS vault unwound by USDS farmer strategies. |
0xe060b80438771f13078048c3b0d930efeca6e622↗ | Grove USDS Compounder, Yearn strategy that withdrew USDS from Sky StakingRewards. |
0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48↗ | USDC, Token moved from Yearn to the pair to the fake vault. |
0x6b175474e89094c44da98b954eedeac495271d0f↗ | DAI, Token moved from Yearn to the pair to the fake vault. |
0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2↗ | WETH, Token moved from Yearn to the pair to the fake vault. |
0x2260fac5e5542a773aa44fbcfedf7c193bc2c599↗ | WBTC, Token moved from Yearn/Morpho to the pair to the fake vault. |
0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb↗ | Morpho Blue, Lending market withdrawn from to free WBTC for the Yearn redemption. |
Zero Address (mint/burn)0x0000000000000000000000000000000000000000↗ | Zero Address (mint/burn) |
0x39c0aec5738ed939876245224afc7e09c8480a52↗ | ysUSDC |
0xaedf7d5f3112552e110e5f9d08c9997adce0b78d↗ | ysDAI |
0xd5aadcd054a00eff71bcb922cddc70752fa2bc68↗ | Unknown contract |
0x85907b1af27fd04a5efabc0fb7162f8690a6b82f↗ | Unknown contract |
0xc56413869c6cdf96496f2b1ef801fedbdfa7ddb0↗ | yvWETH-1 |
0xe3b43be5ab96629493f948229efbee2c0787ed25↗ | Unknown contract |
0x4e41488c19cd35eb4de3083fc3e204854c75c86a↗ | Unknown contract |
0x37305b1cd40574e4c5ce33f8e8306be057fd7341↗ | Unknown contract |
0xf6e72db5454dd049d0788e411b06cfaf16853042↗ | Unknown contract |
0x36822d0b11f4594380181ce6e76bd4986d46c389↗ | Unknown contract |
0x8e5b9d85c8bbd309f571dba0c82ddacaca897805↗ | Unknown contract |
0x751f0cc6115410a3ee9ec92d08f46ff6da98b708↗ | yvWBTC-1 |
0x670120d4833633466c7db4b515c53fa8c5b33b97↗ | Unknown contract |
0xa7496763f035e73ec6b56f4c86312cc1874a01e3↗ | Unknown contract |
0xe5e2baf96198c56380ddd5e992d7d1ada0e989c0↗ | Unknown contract |
0x310b7ea7475a0b449cfd73be81522f1b88efafaa↗ | yvUSDT-1 |
0xe07d1e27d93eda41ab091fc91a2026df41763b56↗ | Unknown contract |
0x8b64692c42ac08a7275aff3e2cc59e7401c471d5↗ | Unknown contract |