- 1. Qué valora una bóveda de dos activos y dónde faltaba la comprobación
- 2. Las 77 bóvedas afectadas, cadena por cadena
- 3. El bucle de dos transacciones y los 135 ejecutores
- 4. Siete horas y treinta y dos minutos hasta el primer aviso
- 5. Quién absorbe la pérdida
- 6. 665.429 dólares en un año de 2.420 millones
- 7. Qué se puede retirar después del 9 de noviembre
- 8. La comprobación que faltaba
La bóveda USDC/USDT0 de ACryptoS en Polygon tenía 4,958349 USDC y 72.825,21 USDT0 justo antes del primer depósito que abrió la explotación del 8 de noviembre. Entraron 10 USDC. Salieron 9,989999 USDC y 48.634,255398 USDT0. La secuencia está reproducida en una bifurcación del bloque 96940861 que el propio proyecto publicó en su post-mortem, y la pieza que la hace posible no es una manipulación de precios ni un oráculo roto: es una lista con un solo elemento donde el contrato esperaba dos.
ACryptoS opera desde 2020 como agregador de rendimiento sobre posiciones de liquidez concentrada: bóvedas que depositan en UniswapV3, SushiswapV3, PancakeSwap v3 y Biswap v3, reparten acciones entre los depositantes y cobran una comisión por retirada. El 8 de noviembre, a las 17:17 UTC, la cuenta del proyecto en X publicó el anuncio que cerraba seis años de operación: “We’ve deployed an emergency fix: deposits are disabled and withdrawals remain open. We no longer have the resources to maintain ACryptoS, so it is now deprecated. Please withdraw ASAP.” (@acryptosdao, 8 de noviembre de 2026).
ACryptoS vaults were exploited. We’ve deployed an emergency fix: deposits are disabled and withdrawals remain open. We no longer have the resources to maintain ACryptoS, so it is now deprecated. Please withdraw ASAP.
— ACryptoS.com ⚔️ (@acryptosdao) November 8, 2026
El hilo de X es la declaración pública, pero el documento que permite auditar la cifra es otro: el post-mortem técnico que el equipo publicó en su documentación, con ventanas horarias por cadena, direcciones de los atacantes, flujos de fondos y una prueba de bifurcación. Ahí se fija el estado actual en dos frases: “Every affected vault has rejected deposits since 16:40 UTC on Nov 8, and that is verified on-chain. Withdrawals remain open.” Y después: “ACryptoS is being deprecated. No fix or re-opening of deposits is planned.”
Qué valora una bóveda de dos activos y dónde faltaba la comprobación
Una bóveda de liquidez concentrada no guarda un solo token. Guarda una posición en un par —por ejemplo USDC y USDT0— y emite acciones cuyo valor se calcula dividiendo todo lo que hay dentro entre el número de acciones en circulación. Si esa división se hace con un solo activo, el resultado no es una aproximación: es otro número.
La función de entrada, depositMulti(uint256[] amounts, uint256 minShares), recibe un array con una cantidad por cada token de la bóveda. La de salida, withdrawMulti(shares, false, [0, 0]), quema acciones y paga al titular una porción proporcional de ambos activos. El error que documenta el equipo es una omisión entre esas dos: depositMulti no comprobaba que el array tuviera una entrada por cada token.
Con un array de un solo elemento pasan dos cosas a la vez. La primera es correcta: el depósito se valora usando solo token0, que es lo que corresponde a un depósito de un único token. La segunda no lo es: el patrimonio que ya tenía la bóveda también se valora usando solo token0, e ignora todo lo que había en token1. Si la posición estaba fuera de rango y casi todo el valor estaba en token1, la bóveda parecía casi vacía. Un depósito pequeño valía entonces una fracción enorme de ese “casi vacío” y acuñaba la mayor parte de las acciones.
La prueba de bifurcación del propio equipo mide el efecto. Con la bóveda en 4,958349 USDC y 72.825,21 USDT0, un depósito de 10 USDC con el array de un elemento generó 118.644.929.973 acciones, el 66,84% del suministro, y la acuñación coincide exactamente con la transacción en cadena. El mismo depósito con el array correcto de dos elementos habría generado 8.087.968 acciones, el 0,01%. La diferencia es de unas 6.684 veces más acciones por el mismo dinero. La retirada inmediata pagó después 9,989999 USDC y 48.634,255398 USDT0, con la comisión de retirada del 0,1% cobrada en acciones.
El equipo descarta la explicación más cómoda: “Pool prices were not manipulated. The flaw had been present since these vaults were first deployed; no recent upgrade introduced it.” No hubo una actualización defectuosa que introdujera el fallo ni un precio de pool torcido. La bóveda estuvo mal desde el primer día, en toda la familia de contratos, y nadie lo había comprobado.
Las 77 bóvedas afectadas, cadena por cadena
El post-mortem desglosa el impacto con precios del 8 de noviembre hacia las 17:00 UTC (ETH a 2.226 dólares, BTC a 75.662, BNB a 695, OP a 0,10 y XSGD a 0,78). La tabla completa, sin recortes, es esta:
| Cadena | Bóvedas golpeadas | Ventana de explotación (UTC) | Extraído |
|---|---|---|---|
| Arbitrum | 28 de 40 | 02:02 – 15:53 | 230.213 USD |
| BSC | 12 de 33 | 04:22 – 16:19 | 190.845 USD |
| Polygon | 11 de 16 | 05:45 – 15:38 | 134.686 USD |
| Base | 13 de 18 | 07:02 – 15:11 | 69.813 USD |
| Optimism | 13 de 16 | 07:31 – 16:22 | 39.871 USD |
| Linea | 0 de 3 | — | 0 USD |
| Total | 77 de 126 | ≈ 665.429 USD |
Leída en proporciones, la tabla dice algo distinto a la jerarquía por dólares. El 61,1% de las 126 bóvedas fue golpeado, y el porcentaje de bóvedas alcanzadas por cadena no sigue el tamaño de la cadena: Optimism perdió 13 de 16 (81,3%), Base 13 de 18 (72,2%), Arbitrum 28 de 40 (70%) y Polygon 11 de 16 (68,8%), mientras BSC, con más bóvedas atacadas en términos absolutos después de Arbitrum, solo perdió 12 de 33 (36,4%). Linea, con tres bóvedas, no registró ninguna. La media por bóveda afectada fue de 8.642 dólares, una cifra que mezcla bóvedas grandes con posiciones casi vacías.

Dos matices del documento importan para cualquier comparación posterior. Los valores en dólares usan precios de ese día y no incluyen unas 19.400 unidades de ACS tomadas de la bóveda ACS/WBNB en BSC, que el equipo decidió no valorar. Y la cifra total no es una estimación externa: sale de clasificar los depósitos uno por uno, decodificando su calldata.
El bucle de dos transacciones y los 135 ejecutores
El ataque no necesitó un contrato complejo. Cada ronda son dos transacciones separadas por uno o dos minutos:
1. approve(token0) y luego depositMulti([cantidad pequeña de token0], 0), que acuña la mayor parte de las acciones de la bóveda.
2. withdrawMulti(allShares, false, [0, 0]), que devuelve el depósito y se lleva casi todo el token1 restante, menos la comisión del 0,1% en acciones.
Cada ronda retira una fracción constante de lo que queda, así que la segunda ronda vale menos que la primera pero sigue siendo rentable. En la primera bóveda de Polygon, las rondas sucesivas se llevaron el 67%, el 67% y el 90% de lo que iba quedando. Multiplicado por bóvedas y por cadenas, el resultado fue de 135 direcciones distintas operando entre las 02:02 y las 16:22 UTC.
El equipo clasificó unas 1.000 operaciones decodificando la longitud del array de cantidades, y contabilizó otras 220 que pasaron por contratos atacantes o por billeteras delegadas con EIP-7702. Esa distinción no es un tecnicismo: EIP-7702 permite que una cuenta normal ejecute código de contrato, de modo que el mismo patrón podía replicarse desde direcciones que parecían de usuario final. Desde las 09:30 aparecieron copias: más de 100 direcciones, muchas de ellas billeteras EIP-7702, ejecutando rondas idénticas de un solo uso en todas las cadenas. Una sola dirección, 0xcafe3438…, completó 162 rondas. Otras 28 direcciones golpearon tres cadenas o más con el mismo patrón, por 243.000 dólares entre todas, lo que el documento interpreta como un script compartido.
Siete horas y treinta y dos minutos hasta el primer aviso
La cronología del post-mortem es la parte incómoda. El primer depósito de la explotación ocurrió a las 02:02 UTC en Arbitrum, después de que la dirección 0x5dc8…f322 recibiera 12,98 ETH a través de una orden cross-chain de Mayan Swift a las 01:50. El primer aviso al proyecto llegó por Telegram a las 09:34. Entre ambos puntos hay 452 minutos, siete horas y media, con los depósitos abiertos.
| Hora (UTC, 8 nov) | Evento |
|---|---|
| 01:50 | La dirección 0x5dc8…f322 se financia con 12,98 ETH en Arbitrum vía Mayan Swift |
| 02:02 | Primer depósito de la explotación, bóveda WBTC/WETH-500 en Arbitrum |
| 04:22 | Primer ataque en BSC (BTCB/WBNB-500) |
| 05:45 | Primer ataque en Polygon (USDC/USDT0-100) |
| 07:02 / 07:31 | Primeros ataques en Base y Optimism |
| 09:34 | Primer aviso al proyecto por Telegram |
| 14:19 | Se notifica al desarrollador |
| 15:38:58 | Se actualiza el beacon de Polygon; el último ataque en esa cadena había sido 12 segundos antes |
| 16:38 – 16:40 | Se cierran las 126 bóvedas en las 11 beacons de la familia |
La respuesta, una vez que el desarrollador estuvo dentro, fue rápida: “Once the developer was notified, the first chain was closed in 80 minutes and all chains within 2h21m, with one beacon upgrade per vault family.” Cada cadena se probó primero en una bifurcación de mainnet y cada actualización se verificó en cadena después. El arreglo además deja cada bóveda en pausa automática en su siguiente transacción, de modo que la liquidez restante sale de las pools.
La ventana completa de explotación duró 860 minutos, catorce horas y veinte. Repartido en partes iguales, el ritmo medio sería de unos 46.400 dólares por hora, pero esa media es aritmética y no describe el ataque: el documento muestra que el grueso se concentró entre el primer hallazgo y la llegada de las copias, y no publica una serie temporal de importes. Lo que sí se puede afirmar es que la detección tardó más que la contención: 452 minutos para que alguien avisara, 80 para cerrar la primera cadena después del aviso.
Quién absorbe la pérdida
Las bóvedas no tenían un fondo de reserva que cubriera el hueco. El post-mortem lo dice sin rodeos: “The losses fall on honest depositors in each vault. They were diluted by the over-minted shares, and their tokens were paid out to the exploiters.” Quien tenía acciones vio cómo su parte del total caía porque el suministro se infló, y los activos que respaldaban esas acciones salieron hacia las direcciones atacantes. No es un robo de los fondos del protocolo: es una transferencia de valor entre depositantes y atacantes, con el contrato como intermediario involuntario.
El rastro de los fondos está documentado dirección por dirección. La primera, 0x5dc8df8d…, extrajo 139.500 dólares y los movió por Mayan, Squid, Relay y el OFT de USDe en LayerZero. La segunda, 0x648508c5…, extrajo 111.800 dólares en Polygon, convirtió 72.019 USDT0, 13.178 XSGD, 12,9 WETH y 831 DAI a WETH y envió 51,85 WETH a Ethereum por Across; conserva 50,82 WETH, unos 113.000 dólares, en la misma dirección. Otras dos siguen con saldo: 116,5 WBNB (unos 81.000 dólares) y 78,2 WBNB (unos 54.000). En stablecoins congelables, el documento calcula que queda menos de 1.000 dólares en total; el resto se convirtió a ETH, WETH o WBNB, o cruzó de cadena.
Ese detalle cambia la lectura del incidente. Un fallo de contabilidad de acciones no se arregla congelando un token: los activos ya están en la cadena equivocada, en el activo equivocado y, en buena parte, fuera del alcance de cualquier emisor. El precedente de los vaults de TRON de THORChain que Tether congeló brevemente sirve de contraste: esa palanca existe, pero depende del emisor y de que el activo siga siendo la stablecoin original, no WETH envuelto en otra red. Por eso el documento identifica a Mayan, Across, Squid/Axelar, Relay y LayerZero/Ethena como los puntos donde tendría que presentarse una solicitud de congelación o de rastreo, y pide vigilar las tres billeteras que todavía tienen WETH o WBNB.
665.429 dólares en un año de 2.420 millones
La magnitud del incidente se entiende mejor fuera de ACryptoS. El registro público de DefiLlama Hacks contabiliza 337 incidentes en lo que va de 2026 por 8.779 millones de dólares, una cifra que incluye los 6.360 millones del exchange centralizado Binance del 29 de octubre. Sin ese evento, el total del año queda en 2.419 millones, y los 665.429 dólares de ACryptoS representan el 0,0275%. El incidente mediano de 2026, según el mismo registro, es de 403.000 dólares: ACryptoS está 1,65 veces por encima de esa mediana y muy lejos de los casos de nueve cifras.
En su propia categoría, la historia es más específica. DefiLlama clasifica el caso como “Input Validation”, la misma clase que agrupa 21 incidentes de 2026 por 20,55 millones de dólares; ACryptoS explica el 3,24% de esa suma. No es un fallo exótico: es una validación de entrada ausente, el tipo de error que un test de invariantes encuentra en minutos y que una auditoría de código puede pasar por alto si solo revisa las rutas que ya funcionan.
Hay una objeción razonable: 665.000 dólares es una cifra menor para un mercado que ha visto pérdidas de miles de millones, y podría argumentarse que el cierre de ACryptoS sobrerreacciona a un incidente pequeño. La respuesta del documento no es económica sino operativa: “We no longer have the resources to maintain ACryptoS”. El tamaño del robo no decidió el final del proyecto; la capacidad de sostenerlo, sí. Con el 61,1% de las bóvedas comprometidas y un fallo presente desde el despliegue en toda la familia de contratos, no había una versión parcial del producto que rescatar. Lo que el post-mortem no ofrece es una lectura de mercado: ACS no aparece valorado en el documento y no hay una cifra de capitalización que permita medir el efecto en el token.
Qué se puede retirar después del 9 de noviembre
Los retiros siguen abiertos, los depósitos no. Para el depositante la pregunta práctica es cuánto queda dentro de cada bóveda, y ahí el documento solo da un caso resuelto. El 9 de noviembre, un atacante que todavía controlaba el 99,99% de la bóveda DAI/USDbC-500 en Base empezó a vaciarla; el equipo actualizó la bóveda, quemó las acciones del atacante y las acciones de comisión de más que se habían acuñado después del ataque. El suministro volvió a su nivel previo a la explotación, se perdieron unos 1.800 USDbC antes de la quema y el saldo restante quedó disponible: “The remaining 6,187 USDbC is withdrawable pro rata by the original depositors.”
Fuera de ese caso, el post-mortem no publica el saldo recuperable de las otras 76 bóvedas, y esa ausencia es la información más importante para quien tenía fondos: la cifra de 665.429 dólares mide lo extraído, no lo que queda. El equipo también ofreció en el hilo de X una recompensa “whitehat” del 10% a quien devuelva los fondos, sin acciones adicionales, una fórmula habitual en incidentes de este tamaño que rara vez recupera el total.
La comprobación que faltaba
La lección técnica cabe en una línea de código: antes de calcular acciones, el contrato debía verificar que el array de cantidades tuviera exactamente una entrada por token, y rechazar el resto. En una bóveda de dos activos, depositMulti([x]) y depositMulti([x, 0]) tienen que producir el mismo resultado o ninguna de las dos debe ejecutarse; en ACryptoS producían 66,84% y 0,01% del suministro con el mismo depósito.
El método del post-mortem también sirve como plantilla de verificación: reproducir el bloque anterior al primer depósito en una bifurcación, ejecutar la llamada del atacante y comparar la acuñación con la transacción real. Esa prueba se hizo con la bóveda de Polygon y confirmó 118.644.929.973 acciones, un número idéntico al de la cadena. Para cualquier bóveda multi-activo, el test que habría evitado el incidente es el mismo que ahora lo documenta: no preguntar si el camino feliz funciona, sino qué pasa cuando la entrada llega incompleta. El interés por medir ese riesgo desde fuera también creció: las evaluaciones de riesgo para bóvedas de préstamos DeFi que lanzó S&P Global en octubre cubren otro segmento, el del crédito, pero parten del mismo supuesto de que la contabilidad interna de una bóveda merece una revisión independiente.
Fuente primaria: post-mortem de ACryptoS y anuncio del proyecto en X. Datos de incidentes: DefiLlama Hacks. Verificación en cadena de la actualización del 9 de noviembre: Basescan. Este artículo no constituye asesoramiento financiero.