Contabilidad de recompensas en Popsicle Finance
$20,7 M drenados del pool Sorbetto Fragola de Popsicle tras transferencias de participaciones engañar al contrato para deber recompensas iguales al TVL.
- Fecha
- Víctima
- Popsicle Finance
- Cadena(s)
- Estado
- Fondos robados
El 4 de agosto de 2021, la plataforma DeFi Popsicle Finance perdió aproximadamente $20,7 millones de su pool de liquidez Sorbetto Fragola. El atacante usó préstamos flash y una secuencia de transferencias de participaciones entre direcciones para engañar a la lógica de seguimiento de recompensas del contrato para que creyera que se le debían recompensas iguales al TVL completo del pool.
Qué ocurrió
Sorbetto Fragola era un gestor de liquidez activa de Uniswap v3 — los usuarios depositaban activos, recibían "participaciones" que representaban su posición de LP, y ganaban comisiones proporcionales a su participación. El pool rastreaba recompensas registrando, para cada dirección, el bloque en el que recibió participaciones por primera vez y aplicando la acumulación de comisiones desde ese bloque en adelante.
La falla fatal: el contrato no actualizaba el estado de seguimiento de recompensas cuando se transferían participaciones entre direcciones. Específicamente:
- Cuando el Usuario A transfería sus participaciones al Usuario B, el contrato registraba al Usuario B como elegible para recompensas desde el bloque 0 (el bloque inicial de despliegue del pool), no desde el bloque real de la transferencia.
- Las mismas participaciones podían ser transferidas múltiples veces a diferentes direcciones, y cada dirección receptora sería acreditada con recompensas como si hubiera mantenido esas participaciones desde el inicio del pool.
El ataque:
- Tomó prestados aproximadamente $30 M USDT y $32 M ETH en préstamo flash de varias fuentes.
- Depositó los activos prestados en Sorbetto Fragola, recibiendo participaciones de Sorbetto.
- Transfirió las participaciones a una secuencia de direcciones controladas por el atacante — cada transferencia registró al destinatario como "elegible para recompensas desde el bloque 0".
- Reclamó recompensas desde cada una de las direcciones controladas por el atacante — el contrato calculó la cuota de recompensa de cada dirección como si hubiera estado manteniendo el stake máximo desde el despliegue.
- Resultado neto: las recompensas reclamadas a través de todas las direcciones del atacante sumaron aproximadamente el TVL completo del pool.
- Retiró las recompensas como activos reales, reembolsó los préstamos flash, se marchó con ~$20,7 M.
Notablemente, el atacante tomó principalmente USDC y USDT (aproximadamente $10 M combinados) más varios otros activos. Los otros contratos de Popsicle no se vieron afectados — el bug era específico de la lógica de seguimiento de recompensas de Sorbetto Fragola.
Consecuencias
- Popsicle pausó Sorbetto Fragola y anunció un rediseño de la lógica de contabilidad de recompensas.
- El equipo publicó un post-mortem identificando la brecha de actualización de estado en transferencia de participaciones como la causa raíz.
- Un Sorbetto rediseñado con actualizaciones adecuadas de estado en transferencia de participaciones fue eventualmente lanzado, pero la posición de Popsicle en la categoría de gestión de liquidez activa no se recuperó.
- Sin recuperación pública de los fondos robados.
Por qué importa
Popsicle es el caso de libro de texto de por qué cada operación que muta estado en un sistema de seguimiento de recompensas debe actualizar cada variable de estado dependiente. La función transfer del contrato movía las participaciones sin tocar la marca de tiempo de elegibilidad de recompensa, dejando las dos piezas de estado inconsistentes — y la inconsistencia fue el exploit completo.
El patrón se repite en DeFi cada vez que un protocolo implementa seguimiento de comisiones/recompensas almacenando una marca de tiempo de "inicio de elegibilidad" que debería actualizarse en cada transferencia:
- Forks de MasterChef que no actualizan la deuda de recompensa en transferencias de participaciones.
- Contratos de staking que calculan recompensas basándose en un bloque de "primer depósito".
- Agregadores de rendimiento que agregan estado de usuario a través de lotes de depósito.
El patrón defensivo — actualizar todo el estado de deuda de recompensa en cada transferencia de participación, no solo en depósito/retiro — es ahora estándar en código moderno de seguimiento de recompensas. Los $20,7 M de Popsicle son uno de los casos fundacionales que lo hizo estándar.
También es notable que Certora posteriormente publicó un análisis de verificación formal mostrando que el bug habría sido capturado por su herramienta. La verificación formal de invariantes de seguimiento de recompensas se ha vuelto desde entonces más común en protocolos que manejan TVL significativo.
Fuentes y evidencia on-chain
- [01]halborn.comhttps://www.halborn.com/blog/post/explained-the-popsicle-finance-hack-august-2021
- [02]coindesk.comhttps://www.coindesk.com/markets/2021/08/04/popsicle-finance-loses-207m-in-cyberattack
- [03]theblock.cohttps://www.theblock.co/linked/113482/defi-platform-popsicle-finance-suffers-20-million-exploit