Decodificando intercambios SCW

Con las carteras de contratos inteligentes (SCW), los intercambios siguen un camino muy diferente al de las carteras tradicionales de Ethereum/EVM. Esa diferencia puede ser confusa, especialmente cuando algo sale mal. Pero una vez que entiendes a los actores clave en el flujo —y cómo leer lo que ocurrió paso a paso en la app y en el explorador— las cosas empiezan a tener sentido.

Recorrámoslo juntos.


De un solo toque a la ejecución on-chain: qué sucede realmente

Cuando pulsas “Swap” en la app, se siente como una sola acción. En realidad, estás lanzando un proceso multicapa construido sobre la abstracción de cuentas de Ethereum (ERC-4337). Tu transacción no va directamente a la blockchain como con una cartera normal. En su lugar, toma un desvío:

  1. Construimos la ruta. Pedimos al motor de enrutamiento (como 1inch) que encuentre la mejor vía para tu intercambio y la simulamos para asegurar que funcione. Estimamos el gas, validamos que tienes los tokens y empaquetamos las instrucciones en un formato especial: un UserOperation.

  2. Un bundler interviene. Este es un actor fuera de la cadena responsable de enviar UserOperations a la blockchain. Revisa tu operación, se asegura de que sea válida y prepaga el gas por ti (se le reembolsa después).

  3. Tu UserOp entra en la blockchain a través del EntryPoint smart contract. Piensa en EntryPoint como la única puerta por la que pasan todas las transacciones SCW. EntryPoint ejecuta las comprobaciones finales y, si todo parece bien…

  4. EntryPoint le dice a tu Smart Contract Wallet (SCW) que ejecute el intercambio. Tu SCW llama al router (por ejemplo, 1inch), el router llama a los pools, los tokens se mueven y el resultado vuelve a aterrizar en tu cartera.

Así que, para resumir: tú pulsas swap → nosotros simulamos → el bundler envía → EntryPoint valida → tu SCW ejecuta.


Veamos un ejemplo real

Ahora que entendemos el flujo a alto nivel, veamos cómo se desarrolla esto en un intercambio real: primero en la app y luego on-chain:

Esto es lo que vemos:

  • Cambiamos 1 USDC por 0.765 KTA.

  • El intercambio se ejecutó en Base (fíjate en el icono de Base en los símbolos de las monedas).

  • Pagamos:

    • $0.03 de gas (en ETH)

    • 0.22% de tarifa de swap a goodcryptoX

    • 0.05% de tarifa de router a 1inch

  • La ruta fue simple: 100% a través de un pool de Uniswap v4.

  • Bundler: Alchemy (ver Paso 2 arriba para el resumen)

  • Los enlaces del explorador aparecen si la transacción llegó a la blockchain y fue registrada en el bloque (incluso si falla)

Bien hasta aquí. Ahora, hagamos clic en el enlace de BaseScan para ver cómo se ve esta transacción on-chain:

Nota sobre los enlaces del explorador: En las versiones más recientes de la aplicación, los enlaces del explorador ya abren tu Transacción AA (UserOp). Si eso es lo que ves (el campo "From" muestra la dirección de tu monedero), puedes pasar directamente a Paso 5 – página de detalles de la Transacción AA. Los pasos anteriores solo aplican si tu enlace apunta a la transacción externa del bundler (donde "From" NO es tu monedero). Aun así, es una lectura útil para entender mejor cómo funcionan las transacciones SCW

Desde: esta no es tu cartera — es el bundler de Alchemy. Eso es esperado, ya que el bundler envió la transacción.

Hacia: EntryPoint (v0.6.0). De nuevo, esperado — todas las transacciones SCW entran por aquí.

Transacciones internas: muestra flujos de tokens nativos (ETH en Base) dentro de la transacción. Esto es lo que vemos:

  • Nuestra cartera (…0A5) envió ETH a EntryPoint para la tarifa de gas.

  • EntryPoint reembolsó al bundler con el coste real del gas (ya que el bundler prepago el gas en tu nombre; ver Paso 2 arriba). Cualquier ETH sobrante permaneció en EntryPoint como tu depósito para futuras transacciones.

Transferencias ERC-20: muestra los movimientos reales de tokens:

Nuestra cartera no envió USDC directamente. En su lugar, el contrato del token USDC (…2A8) procesó y despachó las transferencias. Esto es normal: en cadenas EVM, las transferencias de tokens las gestiona el propio contrato del token después de recibir una instrucción de tu cartera de contrato inteligente.

  1. El contrato USDC dividió nuestro 1 USDC en tres transferencias:

    • 0.0022 USDC a la cartera de tarifas de nuestro protocolo (…608A)

    • 0.0005 USDC a la cartera de tarifas de 1inch (…1DE5)

    • Los 0.9973 USDC restantes al router de Uniswap v4 (…Universal Router)

  2. El router de Uniswap v4 lo pasó al Pool Manager de Uniswap v4 (contrato único que maneja todos los pools v4).

  3. El Pool Manager ejecutó el intercambio: USDC entró → KTA salió.

  4. El KTA fue enrutado de vuelta a través del Aggregation Router de 1inch, que lo remitió a nuestra cartera (…0A5).


🧩 Cómo descifrar una transacción SCW fallida

Ahora que entendemos cómo funcionan los swaps con carteras de contratos inteligentes (SCW) —y hemos recorrido una operación exitosa— usemos las mismas herramientas para descifrar una que falló.

Usaremos otro caso real: un swap de ETH → token en Ethereum que falló dentro del contrato EntryPoint porque no había suficiente ETH para cubrir tanto el swap como la tarifa de gas.

Vale, ves “Error” como el estado de tu swap en la app o recibes una notificación push de que tu swap falló. ¿Qué haces?


Paso 1 — Revisa los detalles del pedido en goodcryptoX

Esto es lo que ves en este caso:

Usando el marco que desarrollamos antes, notas rápidamente:

  • El estado del swap es Error (¿falló?)

  • No se muestra ningún mensaje de error (eso es inusual)

  • Hay tarifa de gas (¿llegó a la blockchain?)

  • Se muestra una ruta (¿la simulación fue bien?)

  • Hay enlaces a exploradores de blockchain (¡puedo comprobar la tx en la blockchain!).

Comprobemos tu intuición:

  • El Error el estado significa que el swap falló

  • Debería haber tanto un mensaje de error legible por humanos (traducido desde el crudo) como el crudo. La ausencia de un mensaje de error definitivamente indica que ocurrió algo inusual

  • La tarifa de gas, en efecto, significa que la transacción llegó a la blockchain y se produjo alguna actividad on-chain (que consumió gas)

  • La ruta confirma que la simulación de la transacción pasó y resultó en un camino claro hacia la ejecución

  • Los enlaces del explorador confirman que la transacción llegó a la blockchain —incluso si falló. Definitivamente deberíamos abrir uno de ellos e investigar más


Paso 2 – Abre la transacción en el explorador de la blockchain

Nota sobre los enlaces del explorador: En las versiones más recientes de la aplicación, los enlaces del explorador ya abren tu Transacción AA (UserOp). Si eso es lo que ves (el campo "From" muestra la dirección de tu monedero), puedes pasar directamente a Paso 5 – página de detalles de la Transacción AA. Los pasos anteriores solo aplican si tu enlace apunta a la transacción externa del bundler (donde "From" NO es tu monedero). Aun así, es una lectura útil para entender mejor cómo funcionan las transacciones SCW

Tocas el enlace de Etherscan para ver qué pasó:

A primera vista, las cosas se vuelven aún más confusas:

  • El estado dice ✅ Éxito — espera, ¿qué?!

  • Pero ya sabemos que el swap no se completó

  • Bajo el campo “To” (EntryPoint), hay un pequeño mensaje amarillo:

    Aunque uno o más errores ocurrieron [execution reverted] Ejecución de Contrato Completada

Entonces, ¿qué está pasando realmente aquí?

Recuerda el flujo de transacción SCW que cubrimos antes:

  • el bundler empaqueta tu swap en un UserOperation (un paquete de datos con la lógica de tu swap)

  • luego lo envía al contrato inteligente EntryPoint

  • EntryPoint lo valida (comprobando tu saldo, firma y nonce)

  • si todo está correcto, ejecuta tu intención — llamando a routers, pools y moviendo tokens.

Desde la perspectiva de la blockchain, sin embargo, todo esto solo parece “el bundler envía datos a EntryPoint”.

En términos SCW, este paso se llama la transacción externa.

Y esa transacción sí tuvo éxito: los datos fueron entregados y EntryPoint comenzó a ejecutar su lógica interna. De ahí el ✅ Éxito en la parte superior.


Pero el explorador, siendo cortés, aún te hace saber que algo falló dentro de EntryPoint con esa pequeña nota amarilla. Para el explorador, ese fallo interno no es suficiente para marcar la transacción como fallida.

Ahora, otro detalle salta a la vista en la pestaña Overview:

  • Aproximadamente $6 valor en ETH fue enviado desde tu cartera a EntryPoint (el prefondo de gas).

  • Solo $2.3 valor en ETH fue reembolsado al bundler.

  • Y la tarifa de transacción que se muestra en la parte superior es aún menor — alrededor de $2.15.

A primera vista, estos números no parecen cuadrar. Desgranémoslo primero antes de continuar con la investigación


Paso 3 – Entender la discrepancia del gas

Aquí tienes el desglose:

  • SCW → EntryPoint (~$6): Este es el prefondo de gas. EntryPoint siempre recoge más de lo necesario para asegurarse de que tu UserOp pueda ejecutarse.

  • EntryPoint → Bundler (~$2.3): Este es el reembolso real del gas. Es la cantidad real que pagaste por este intento fallido.

  • Tarifa de Transacción (~$2.15): Esto es lo que el bundler gastó para enviar tu UserOp a EntryPoint. Es menor porque el propio EntryPoint usó gas adicional mientras validaba y reembolsaba al bundler; ese coste extra se te cargó a ti.

Regla general:

👉 Tu coste real de gas siempre es el reembolso EntryPoint ➜ Bundler (no la “Tarifa de Transacción” que se muestra arriba)

Y la diferencia entre lo que prefondaste ($6) y lo que se reembolsó ($2.3) no desapareció. Permaneció en EntryPoint como tu depósito, que se aplicará automáticamente a tu próxima transacción.


Paso 4 – Revisa la pestaña AA Transactions

En el explorador, ves una pestaña AA Transactions (AA = Account Abstraction). Aquí es donde vive la actividad de las carteras de contratos inteligentes, ya que las SCW funcionan sobre Account Abstraction (ERC-4337).

Cambiemos a esa pestaña desde Overview:

Aquí finalmente ves nuestra UserOperation listada como una entrada separada dentro de la transacción externa del bundler:

  • El campo "From" ahora muestra la dirección de nuestra cartera, confirmando que esta es nuestra operación.

  • Hay un AA Txn Hash separado, diferente del hash de la transacción externa. ¿Por qué?

    • El Txn Hash externo pertenece a la transacción Bundler->EntryPoint que contenía tu UserOp (y podría haber incluido múltiples UserOps de varios usuarios).

    • El AA Txn Hash es el identificador único para tu UserOperation dentro de ese paquete.

Esta es la idea clave del agrupamiento:

  • Un bundler puede empaquetar muchas UserOps en una sola transacción.

  • Cada UserOp obtiene su propio AA Txn Hash, para que pueda ser rastreada por separado dentro del paquete.

  • En nuestro caso, dado que esta es una transacción antigua (hace más de 400 días), las SCW todavía eran raras y el paquete contenía solo nuestra UserOp —por eso la pestaña muestra “AA Transactions (1).” En transacciones más recientes, a menudo verás múltiples UserOps agrupadas en un mismo paquete.

En esta vista, también notarás un (!) junto a tu AA Txn Hash — confirmación de que tu swap no se ejecutó.

El siguiente paso es hacer clic en el AA Txn Hash. Eso abre la página dedicada a la UserOperation, donde verás los detalles completos de nuestro intento de swap — tarifa, transferencias y dónde falló.


Paso 5 – Abre la página de detalles de la AA Transaction

Al hacer clic en el AA Txn Hash te lleva a la página de detalles dedicada a tu UserOperation:

Aquí finalmente puedes ver nuestro intento real de swap claramente expuesto:

  • Estado: x Fallo (esta vez sin ambigüedad)

  • Desde: la dirección de tu cartera de contrato inteligente

  • Tarifa de AA Transaction: ~0.00231 ETH ($2.31). Este es el coste real de gas que pagaste — el reembolso enviado al bundler.

  • Transacción interna: una transferencia de ~0.00145 ETH ($6.36) desde tu SCW a EntryPoint (prefondo de gas). No ocurrieron otras transferencias, lo que confirma que el swap en sí nunca se ejecutó.

  • Bundle Txn Hash: mostrado también, enlazando de vuelta a la transacción externa del bundler.

Esta página finalmente coincide con tu intuición: esta es la transacción real — la UserOperation que representó tu intento de swap.

Eso casi concluye nuestra investigación. Pero ya que hemos llegado hasta aquí, hagamos también clic en Internal Txns.


Paso 6 – Revisa la pestaña Internal Transactions

Cambia a la pestaña Internal Txns dentro de la vista de AA Transaction:

Aquí ves las acciones paso a paso que EntryPoint intentó realizar en tu nombre:

  1. ✅ Transferencia desde tu SCW → EntryPoint (~0.00145 ETH, ~$6.36) = prefondo de gas. Esto tuvo éxito.

  2. ❌ Ejecutar desde tu SCW → Uniswap Universal Router (~0.002 ETH) = intento de swap. Esto falló.

Este desglose explica la falla:

  • Enviaste con éxito ETH a EntryPoint como prefondo de gas.

  • Pero cuando EntryPoint intentó reenviar ETH a Uniswap para el swap, el intento falló.

Para el desglose más detallado, abre la pestaña Logs.


Paso 7 – Inspecciona la pestaña Logs

Haz clic en Logs (3):

Aquí encontrarás tres eventos clave:

  • Deposited → confirma que tu prefondo de gas fue recibido por EntryPoint.

  • BeforeExecution → muestra que EntryPoint comenzó a procesar tu UserOperation.

  • UserOperationEvent success: False — el registro on-chain canónico de que tu UserOp falló.


Qué ocurrió realmente (uniéndolo todo)

Este tipo de fallo es específico de swaps con SCW en EVMs donde la entrada es el token nativo (ETH, BNB, MATIC…).

  • La brecha: ni el bundler ni EntryPoint verifican si tienes suficiente token nativo para cubrir tanto el prefondo de gas como el swap juntos. Solo lo comprueban por separado — “¿suficiente para el gas?” y “¿suficiente para el swap?”. Por eso la simulación pasó.

  • Hemos creado un mecanismo de seguridad en la app para estos casos, te advertimos en la interfaz que el gas podría ser insuficiente. Pero como la simulación parecía correcta, aún podías continuar.

  • Una vez que confirmaste, el bundler envió tu UserOperation a EntryPoint.

  • EntryPoint retiró aproximadamente $6 en ETH como prefondo.

  • Cuando intentó ejecutar el swap, no quedó suficiente ETH para cubrir tanto el swap y como el prefondo al mismo tiempo.

  • La llamada de swap revirtió dentro de EntryPoint.

  • Aun así pagaste ~ $2.3 en gas (el reembolso al bundler).

  • Los ~ $3.7 no usados permanecieron en EntryPoint como tu depósito, para ser usados automáticamente en tu próxima transacción.

Última actualización