Auditoría del contrato oficial de AutoRange
Revisión de seguridad línea por línea del contrato que custodia y opera los fondos en Arbitrum. Escrita para que se entienda sin conocimientos técnicos. Todo lo que dice acá se puede verificar por tu cuenta en el explorador de bloques (más abajo).
Contrato oficial AutoRange V1 · Red Arbitrum One · Auditoría interna de caja blanca asistida por IA (revisión línea por línea con Claude Sonnet 5 de Anthropic, con una segunda pasada independiente con Gemini 3.6 Flash de Google, más herramientas automatizadas estándar de la industria) · Septiembre 2026. Auditoría formal externa: en proceso de postulación al Uniswap Foundation Security Fund.
Resumen
En simpleEl contrato pasó una revisión de seguridad completa sin encontrar ninguna vulnerabilidad crítica, alta ni media. Los 9 hallazgos son todos de severidad baja o informativa, y ninguno permite que se pierdan o roben fondos.
Lo más importante, y es una propiedad de diseño del contrato, no una opinión: ninguna función del contrato tiene un campo de "destinatario". Todo lo que sale del contrato va a un solo lugar: tu propia billetera (si eres el dueño), o de vuelta a tu posición en Uniswap. No hay ninguna instrucción que un atacante, ni el propio agente que rebalancea, pueda usar para mandar tu dinero a otra dirección.
El agente que optimiza tu rango nunca puede sacar tu capital. En el peor caso imaginable (que le roben las llaves al agente), lo único que podría hacer es ejecutar rebalanceos a peor precio — un desgaste lento, acotado por el tope de rebalanceos que tú configuras, y que puedes cortar en cualquier momento pausando el vault y retirando. Nunca un vaciado.
Qué se auditó
En simpleTres contratos que trabajan juntos. Están desplegados en Arbitrum y su código fuente es público.
Guarda tu depósito, abre y mantiene tu posición en Uniswap V3, y aplica los límites que configuraste. Es el que custodia el dinero. Cada usuario tiene su propia copia.
0xB2294bcC9841Ec8E412ef15e2243dBF37c3099BAdirección de la implementación — cada vault es una copia liviana de esta
Crea un vault nuevo cada vez que alguien lo pide desde /create. También lleva un registro para poder comprobar que un vault es auténtico y no una copia falsa.
0x288B7d7cD81620977062aa6eEdA2a64D93386502Guarda parámetros comunes: comisión de rendimiento (10%), comisión de creación (0,1%), tope de depósito, y la dirección de la tesorería. No custodia fondos.
0xa618111f9627cDc00B0F2329509B0E1EBfAda0c5Desplegados en el bloque 502836514 de Arbitrum. El contrato oficial es un fork mecánico de la versión interna V9 (mismo código, sin cambios de lógica), que ya había pasado su propia revisión antes de este despliegue.
Cómo encajan los 3 contratos
En simplePiensa en una caja fuerte personal (tu vault), una máquina que fabrica cajas fuertes idénticas (la fábrica), y una hoja con las reglas de la casa pegada en la pared (la configuración). Tu dinero solo vive en tu caja.
- Tu dinero vive solo en tu vault. Nunca pasa por una billetera de la plataforma, ni por la fábrica, ni por la configuración.
- Tu vault lee la configuración, pero la configuración no toca tu vault. Si la plataforma cambia una comisión, tu vault la aplica de ahí en más — pero nadie puede mover tu capital desde ahí.
- El oráculo de Chainlink solo se usa para calcular cuánto gas reembolsarle al agente. Nunca decide cuánto puedes retirar ni cuánto vale tu posición para ti.
- La fábrica es un registro de autenticidad. Preguntándole
isVault(dirección)sabes si un vault es genuino o una copia falsa.
El ciclo de vida de tu vault
En simpleUn vault pasa por unos pocos estados bien definidos. En este cuadro: qué se puede hacer en cada uno, y quién lo puede hacer.
Lo que no cambia en ningún estado: siempre puedes retirar. Las funcioneswithdraw, withdrawAll, emergencyWithdrawPosition yrescuePosition no dependen de que el vault esté activo, ni de que el agente coopere, ni de que el vault esté pausado o no. Si hay algo tuyo adentro, lo puedes sacar.
El "techo/piso absoluto" es una protección opcional que configuras: si el precio cruza ese límite, el vault cierra la posición, convierte a stablecoin y se auto-pausa, dejando tu capital quieto hasta que decidas qué hacer.
Cómo se mueve tu dinero
En simpleCuatro momentos. En todos, el dinero se queda en tu vault o vuelve a tu billetera — nunca pasa por una billetera de la plataforma.
- 1Depositás. Transferís tu stablecoin (y opcionalmente el token volátil) a tu vault. El contrato la registra en tu saldo. Nadie más puede tocarla.
- 2Se abre la posición. El agente convierte parte a la proporción correcta y abre tu posición concentrada en Uniswap V3, con el rango que definiste. El NFT de la posición queda a nombre de tu vault.
- 3El agente rebalancea. Cuando el precio se sale de tu rango (o según tu período), el agente cierra y vuelve a abrir la posición centrada en el precio actual. El contrato verifica que el rango nuevo esté cerca del mercado y respeta tus topes.
- 4Retirás. Cuando quieras, con una firma. Podés sacar de la posición, de la reserva, del presupuesto de gas, o todo junto. Esta acción nunca depende del agente ni de que el vault esté activo.
Las únicas formas de que el dinero salga del contrato
En simpleEl código tiene exactamente estas rutas de salida. Cualquiera puede confirmarlo leyendo el contrato.
| Acción | Quién puede llamarla | A dónde va el dinero | Nota |
|---|---|---|---|
| withdraw / withdrawAll | Solo tú (owner) | Tu billetera | No requiere que el vault esté activo ni que el agente coopere. |
| emergencyWithdrawPosition | Solo tú (owner) | Tu billetera | Salida de emergencia. No hace ningún swap — no puede fallar por liquidez del pool. |
| rescuePosition | Solo tú (owner) | Tu billetera (el NFT de Uniswap crudo) | Último recurso: te devuelve la posición para manejarla tú mismo, salteando toda la lógica del vault. |
| rebalance / initPosition | El agente (operator) | A tu propia posición en Uniswap | No hay parámetro de destinatario. El dinero no puede ir a ningún otro lado. |
| comisiones | Automático, al cobrar/rebalancear | Tesorería de la plataforma y reembolso de gas al agente | Solo sobre rendimiento (10%) y creación (0,1%). Nunca sobre tu capital. |
¿Pueden robarte los fondos?
En simpleLa respuesta corta es no. Acá el detalle, por tipo de actor.
Un desconocido, sin haber participado nunca
No tiene ninguna función que pueda llamar sobre tu vault: todas revierten con "no eres el dueño" o "no eres el agente". No puede mover el NFT de tu posición (tu vault nunca le dio permiso a nadie). No puede volver a inicializar tu vault. Lo único que puede hacer con la fábrica es crearse un vault nuevo y vacío para él.
El agente de la plataforma, incluso con las llaves robadas
No puede transferir tu capital a ninguna dirección — no existe la función. Su techo real de daño es: la comisión de rendimiento (un % de las comisiones de Uniswap, lo fija la plataforma), el reembolso de gas honesto (limitado a ~3× el costo real y acotado al presupuesto de gas que cargaste), y un desgaste por deslizamiento en cada rebalanceo. Todo eso está acotado por el tope de rebalanceos que configuras, y puedes pausar el vault y retirar todoapenas notes algo raro. Nunca es "te vacían de un golpe".
La propia plataforma
La plataforma controla la configuración común. En el peor caso podría subir la comisión de rendimiento hasta el 100% y quedarse con el 100% de las comisiones de Uniswap futuras de todos los vaults. Nunca puede tocar tu capital ni las comisiones ya cobradas. Es un límite de confianza inherente al modelo (la plataforma opera el agente); tu principal siempre está fuera de su alcance.
¿Y si hay un bug que nadie encontró?
Para eso existe rescuePosition: te devuelve el NFT de tu posición crudo, salteando toda la matemática interna del vault. No depende del oráculo, ni del precio, ni de que el vault esté activo. Es la salida que sigue funcionando aunque algo más se rompa.
Cómo se hizo la auditoría
En simpleRevisión de caja blanca: con el código fuente completo a la vista, función por función.
13 categorías de revisión manual
Control de acceso, contabilidad, reentrancy, aritmética, manejo de oráculos, salidas de emergencia, y lecciones de las auditorías públicas de Uniswap V3/V4.
131 pruebas automatizadas
Con Foundry, contra una copia real de Arbitrum (y de Ethereum para un caso). 100% pasan.
Análisis estático (Slither)
Herramienta estándar de la industria sobre todo el repositorio.
Verificación simbólica (Halmos)
Prueba matemática, no una muestra: cubre todo el espacio de entradas posibles.
Simulación de despliegue on-chain
Despliegue y creación de vault en una copia local de Arbitrum antes del despliegue real.
Modelo de amenaza escrito
Documento dedicado que responde "¿se pueden robar fondos?" caso por caso.
La lógica del agente que opera fuera de la cadena (el "keeper") también se revisó en modo solo lectura: 10 observaciones, todas de severidad baja o informativa, ninguna con pérdida de fondos.
Modelos de IA y herramientas
La revisión de código línea por línea, la redacción de las 131 pruebas y el análisis de resultados los hizo Claude Sonnet 5 (Anthropic). Los contratos se revisaron además con Gemini 3.6 Flash (Google) como segundo modelo independiente — usar dos modelos de proveedores distintos reduce la chance de que un punto ciego de uno pase inadvertido. Todo bajo dirección y revisión del equipo de AutoRange, que definió el alcance y tomó las decisiones de despliegue y de aceptación de riesgo. Las herramientas automatizadas de abajo son independientes de cualquier modelo: sus resultados se pueden reproducir sin IA.
| Herramienta | Versión | Para qué |
|---|---|---|
| Claude Sonnet 5 (Anthropic) | claude-sonnet-5 | Revisión manual de caja blanca, autoría de las pruebas, redacción del modelo de amenaza y del informe. |
| Gemini 3.6 Flash (Google) | gemini-3.6-flash | Segunda revisión independiente del código de los contratos, para contrastar hallazgos. |
| Foundry (forge / anvil / cast) | forge 1.7.1 | Ejecutar las 131 pruebas contra una copia real de la cadena; simular el despliegue en local. |
| solc (compilador de Solidity) | 0.8.24 | Compilar el contrato; comparar byte a byte lo compilado contra lo desplegado on-chain. |
| Slither (Trail of Bits) | 0.11.4 | Análisis estático — detección automática de patrones de vulnerabilidad conocidos. |
| Halmos (a16z) + z3 | 0.1.13 | Ejecución simbólica — prueba matemática de propiedades sobre todo el espacio de entradas. |
| Arbiscan + Sourcify | — | Verificación pública del código fuente contra el bytecode desplegado. |
Todas las pruebas, una por una
En simpleQué se probó exactamente y qué dio cada prueba. Ninguna terminó en "pérdida de fondos".
Suites automatizadas
| Suite | Qué cubre | Resultado |
|---|---|---|
| Pruebas Foundry (6 archivos) | Comportamiento del contrato contra una copia real de Arbitrum y de Ethereum. | 131 / 131 pasan |
| · Configuración de plataforma | Constructor, los 11 ajustes solo-dueño, topes, traspaso de propiedad en 2 pasos. | 17 / 17 |
| · Superficie nueva del vault | Las funciones que la versión oficial estrenó o fusionó (pausa, techo/piso, agentes extra). | 28 / 28 |
| · Auditoría del vault (heredado) | Retiros de 4 baldes + polvo, salidas de emergencia, oráculo de gas, guardas de la fábrica, modelo de amenaza. | ~55 / ~55 |
| · Orientación invertida | El caso en que la stablecoin es el "token 0" del par (probado en Ethereum). | 7 / 7 |
| · Fidelidad de interfaces | Que las interfaces que usa el contrato coincidan con los contratos reales de Uniswap/Chainlink. | 6 / 6 |
| Análisis estático (Slither 0.11.4) | Todo el repositorio, severidad media o más. | 113 alertas, 0 reales (falsos positivos conocidos) |
| Verificación simbólica (Halmos 0.1.13) | 5 propiedades matemáticas de la contabilidad de comisiones. | 1 probada formalmente; 4 no terminan por un límite del resolvedor (división por 10.000), cubiertas por fuzz + prueba manual |
| Simulación de despliegue | Despliegue completo + creación de vault + las 4 funciones nuevas, en una copia local de Arbitrum. | OK |
Ejercicios dirigidos (Pruebas 1–11)
| # | Qué se probó | Resultado |
|---|---|---|
| 1 | Atomicidad del despliegue — que crear un vault y ponerlo en marcha ocurra en una sola transacción, sin ventana para que alguien se meta en el medio. | Confirmado. Además: la fábrica lee los datos de la pool de forma que un contrato malicioso no puede reentrar. |
| 2 | Ataque "sandwich" / MEV — medir cuánto se pierde si el agente manda un precio mínimo de 0 y un bot intenta aprovecharlo. | En una pool profunda: ~$17 de daño sobre un swap de ~$362, y el atacante pierde ~$2.850 en comisiones (no le conviene). Con el precio mínimo bien puesto, el ataque hace revertir la transacción — el rebalanceo falla entero, sin pérdida. |
| 3 | Resiliencia del oráculo de gas — qué pasa si Chainlink se cae, da un dato viejo, cero, negativo o una ronda incompleta; y qué pasa si lo manipulan a un precio absurdo (ETH = $50 mil millones). | Todo modo normal de fallo degrada el reembolso de gas a $0 sin bloquear ninguna función. Un feed manipulado solo puede vaciar el balde de gas, nunca el capital. Acá salió el hallazgo H (un dato imposible: fecha futura). |
| 4 | Configuración de plataforma completa — que solo el dueño pueda cambiar cada parámetro, que los topes de porcentaje se respeten, y que el traspaso de propiedad exija dos pasos. | 17 / 17. |
| 5 | Propagación de la configuración a vaults ya creados — verificar qué parámetros se leen en vivo y cuáles quedan fijos al crear el vault. | 6 / 6. Comprobado A/B: una plataforma comprometida puede cobrar comisiones de rendimiento futuras, nunca el capital. |
| 6 | Orientación invertida (stablecoin como token 0) — todo el espejo de la lógica de precios, techo y piso, probado en Ethereum donde USDC es el token 0. | 7 / 7. Techo y piso disparan en la dirección correcta, opuesta a Arbitrum. |
| 7 | Enfriamientos y topes — que el intervalo mínimo entre rebalanceos y el tope máximo se respeten, y que el 'forzar rebalanceo' de la plataforma tenga su propio contador y su propio enfriamiento. | 6 / 6. |
| 8 | Contabilidad de comisiones — que un retiro parcial pague capital puro al dueño, que una comisión de 0% funcione, que la comisión de creación se cobre bien en un depósito con token de terceros. | 4 / 4. |
| 9 | Fuzz (miles de entradas al azar) — que un retiro con 4 porcentajes cualesquiera nunca reviente y mantenga la contabilidad cerrada; que la comisión de creación en tramos dé lo mismo en 1 depósito o en 2. | Sin fallos. El redondeo siempre favorece al vault. |
| 10 | Desbordamientos, redondeo y decimales — que el redondeo del retiro nunca perjudique al vault; que un token volátil de 8 decimales (WBTC) se valúe bien. | Acá salió el hallazgo I (un desbordamiento teórico no alcanzable en una pool real). La salida de emergencia es inmune. |
| 11 | Invariante de solvencia + tokens hostiles + gas — re-chequear 'el saldo real ≥ la suma de todos los baldes' después de cada uno de 12 pasos que tocan TODAS las entradas de capital; probar un token de terceros reentrante / que miente / con comisión de transferencia; medir el gas del peor caso. | Sin hallazgos nuevos. La solvencia se mantiene en todo momento; el gas del peor caso queda muy por debajo del límite. |
Resultados y hallazgos
| Nivel | Cantidad | Qué significa |
|---|---|---|
| Crítico | 0 | Pérdida directa o robo de fondos. |
| Alto | 0 | Riesgo serio de fondos bajo condiciones plausibles. |
| Medio | 0 | Impacto acotado o difícil de explotar. |
| Bajo | 5 | Sin fondos en riesgo. Casos raros, autoinfligidos o desgaste acotado. |
| Informativo | 4 | Notas de estilo, mantenimiento o robustez. Sin impacto. |
Veredicto: sin vulnerabilidades críticas, altas ni medias.
Los hallazgos de bajo riesgo, en criollo
Baja · aceptada a propósito
Qué es:configuras un "deslizamiento máximo" para los swaps. Hoy el contratono verifica ese número por su cuenta: confía en el precio mínimo que el agente calcula para cada operación.
Por qué es de bajo riesgo: se midió en una pool real — un ataque cuesta centavos de daño y hace que el atacante pierda mucho más en comisiones. Está acotado por tu tope de rebalanceos, y puedes pausar y retirar en cualquier momento. Se aceptó de forma deliberada y documentada; se cerrará en una versión futura con una referencia de precio on-chain (TWAP).
Baja
Qué es: si un vault se financia 100% por el lado del token volátil y un rebalanceo intenta reinyectar un monto menor a $1, una resta interna del cálculo de comisión puede hacer que esatransacción falle.
Por qué es de bajo riesgo:la transacción es atómica — si falla, no se movió nada, no hay dinero perdido ni trabado. El agente reintenta en el ciclo siguiente con un monto válido. Se corregirá con una resta "saturante" en la próxima versión.
Baja
Qué es: el contrato usa un oráculo de Chainlink para saber el precio de ETH y reembolsarle el gas al agente. Si ese oráculo alguna vez reportara una fecha en el futuro, el reembolso de gas quedaría bloqueado.
Por qué es de bajo riesgo: un feed real de Chainlink nunca reporta una fecha futura — haría falta un oráculo comprometido, lo que sería un problema para medio DeFi, no solo para AutoRange. Y aunque pasara: tus retiros no dependen del oráculo, solo se pausaría el rebalanceo automático. Corrección de una línea prevista para la próxima versión.
Informativa
Qué es: un cálculo que alimenta un dato de un evento podría desbordarse si el precio del pool tomara un valor extremo (~13 órdenes de magnitud fuera de lo real).
Por qué no importa: una pool real de Uniswap no puede llegar a ese estado — la liquidez se agota mucho antes. Y la salida de emergencia (rescuePosition) no toca ese cálculo, así que siempre queda una vía de salida. Se endurecerá igual, por prolijidad.
Informativa
Validaciones de cordura que el contrato podría reforzar (rangos de configuración, orden techo/piso — ya con protección en la interfaz), el margen de tamaño del contrato, y a qué billetera del propio protocolo se acredita el reembolso de gas. Ninguna afecta la seguridad de tus fondos; todas son candidatas a la próxima versión.
Qué NO cubre esta auditoría
En simpleSomos explícitos con el alcance.
- No es una auditoría formal externa. Es una auto-auditoría de caja blanca rigurosa (metodología, pruebas y análisis de arriba). AutoRange está en proceso de postulación al Uniswap Foundation Security Fund para una auditoría externa.
- El agente fuera de cadena(el "keeper") tiene su propia revisión (solo lectura, 10 observaciones bajas/informativas). El contrato es la barrera de seguridad real: aunque el agente falle, no puede sacar tu capital.
- El contrato estándar de Celo es una base de código separada y no forma parte de esta revisión.
- Riesgos inherentes a proveer liquidez en Uniswap V3(pérdida divergente / "impermanent loss", movimientos de mercado) no son bugs de contrato y no los cubre ninguna auditoría — son parte de la estrategia.
Verifícalo tú mismo
En simpleNada de esto requiere confiar en nuestra palabra. El código está publicado y verificado en Arbiscan.
Contratos oficiales — Arbitrum One (chainId 42161)
Cómo comprobar que un vault es auténtico
- En la página de tu vault, mira el panel "Auditar este vault": compara en vivo las direcciones que reporta el contrato (pool, gestor de posiciones, router, configuración) contra las oficiales de acá.
- La fábrica oficial lleva un registro:
isVault(dirección)devuelvetruesolo para vaults que ella misma creó. Un clon falso dafalse. - El código fuente de la implementación está verificado en Arbiscan bajo el nombre AutoRangeVaultV1, licencia BSL 1.1.
Glosario
En simpleLos términos que aparecen en esta página.
- Vault (bóveda)
- Contrato que custodia tu depósito y opera tu posición. Cada usuario tiene el suyo.
- Sin custodia (non-custodial)
- Ni la plataforma ni el agente pueden mover tu dinero a su billetera. Solo tú.
- Owner / operator
- El dueño (tú: depositas, retiras, configuras) y el agente (solo rebalancea dentro de tus límites).
- Rebalancear
- Cerrar y volver a abrir la posición centrada en el precio actual, para que siga generando comisiones.
- Rango / posición concentrada
- En Uniswap V3, tu liquidez trabaja solo entre un precio mínimo y uno máximo que eliges.
- Deslizamiento (slippage)
- La diferencia entre el precio esperado de un swap y el que se ejecuta de verdad.
- Oráculo (Chainlink)
- Servicio externo que le dice al contrato un precio confiable (acá, ETH/USD, para calcular el gas).
- Fábrica / clon
- La fábrica produce copias livianas (clones) del mismo código de vault. Todos comparten la lógica; cada uno guarda su propio dinero.
- Invariante de solvencia
- Una regla que siempre tiene que cumplirse: el saldo real del contrato nunca es menor que la suma de lo que le debe a cada balde interno.
- Auditoría de caja blanca
- Revisión hecha con todo el código fuente a la vista, no solo probando desde afuera.
- Auditoría asistida por IA
- La revisión de código, las pruebas y el análisis los hizo un modelo de IA (Claude Sonnet 5), con el equipo humano dirigiendo el alcance y tomando las decisiones. Las herramientas automatizadas son independientes del modelo.
- Análisis estático
- Un programa que lee el código sin ejecutarlo y marca automáticamente patrones típicos de bugs. Acá: Slither.
- Foundry
- El conjunto de herramientas estándar para probar contratos: ejecuta miles de escenarios contra una copia real de la cadena.
- Reentrancy
- Un ataque clásico donde un contrato se llama a sí mismo a mitad de una operación. El contrato está protegido en todas las funciones que mueven fondos.
- Fuzz / verificación simbólica
- Fuzz: probar con miles de entradas al azar. Simbólica: una prueba matemática que cubre todaslas entradas posibles a la vez.
- Sandwich / MEV
- Un bot que rodea tu transacción con dos suyas para sacarte tajada del precio. Se mitiga con un precio mínimo bien puesto en cada swap.
- Severidad (crítico → informativo)
- Escala estándar. "Crítico" = pérdida de fondos; "informativo" = una nota sin impacto.
- TWAP
- Precio promedio ponderado por tiempo. Una referencia de precio resistente a manipulación de un bloque; candidato para reforzar el hallazgo A.
- BSL 1.1
- La licencia del código (Business Source License) — fuente pública, con restricciones de uso comercial que expiran con el tiempo. Es la misma que usa Uniswap.
Documento de la auditoría interna completa: contracts/audit/AUDIT_OFFICIAL_V1.md en el repositorio. Contratos verificables en Arbiscan — ver la sección Verifícalo tú mismo.
¿Dudas? Escríbenos.
