Arbitraje triangular en Uniswap v3

Intermedio5/7/2024, 10:38:35 AM
El arbitraje triangular sirve como estrategia en el trading de intercambio de criptomonedas, aprovechando las variaciones en los tipos de cambio dentro de un solo mercado o a través de múltiples mercados.

Implementado con intercambios multihop

El arbitraje triangular sirve como una estrategia en el comercio de intercambio de criptomonedas, aprovechando las variaciones en los tipos de cambio dentro de un solo mercado o a través de múltiples mercados. Este método consta de tres operaciones secuenciales: intercambiar una criptomoneda inicial por una segunda, la segunda por una tercera y, finalmente, la tercera criptomoneda por la inicial, todo con el objetivo de generar beneficios. Por lo tanto, el término "triangular" encapsula su proceso de tres pasos.

Imagen generada por AI

¿Cómo funciona?

En DEX, las oportunidades de arbitraje triangular suelen ser causadas por diferencias de liquidez en múltiples pools. Suelen ser de corta duración, durando solo unos pocos segundos o incluso menos, ya que el intercambio ajusta rápidamente cualquier discrepancia de precios. En consecuencia, se emplean algoritmos de trading automatizado equipados para ejecutar rápidamente operaciones con el fin de capitalizar estas diferencias fugaces. Para ayudar a entender el concepto, aquí viene un ejemplo:

La transacción triangular anterior comienza desde 01 — comprando 1 wBTC con $60,000 USDC, seguido por 02 — comprando 16 WETH con 1 wBTC y termina con 03 — vendiendo 16 WETH por $66,000 USDC. Al final del viaje, habríamos obtenido $6,000 USDC como ganancia.

Implementando con Intercambios Multihop en Uniswap v3

Hay dos estilos de intercambio de múltiples saltos disponibles en Uniswap v3: Entrada exacta y Salida exacta. Como sugieren sus nombres, el primero espera un token con la cantidad exacta como entrada del intercambio, y al final, un token con la cantidad se producirá a las tasas de cambio; El segundo espera una cantidad exacta especificada como salida, solo la cantidad suficiente de token como entrada puede cumplir el intercambio a las tasas de cambio.

Con la naturaleza comercial del arbitraje triangular, nos gustaría tomar un token con la cantidad exacta como entrada, intercambiarlo por otro cripto y luego intercambiarlo nuevamente por el token original para obtener ganancias, como deseamos.

dirección constante SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

dirección constante WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

dirección constante USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

dirección constante DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contrato MultiHopSwap { usando SafeERC20 para IERC20;ISwapRouter02 privado constante ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 privado constante MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;function swapExactInputMultiHop(uint256 amountIn) externo {   IERC20(USDC).safeApprove(dirección(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(dirección(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(dirección(ROUTER), MAX_INT);   bytes memory path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memory params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: dirección(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

Los enrutadores juegan un papel crucial en facilitar la provisión de liquidez. Dado que son sin estado y no mantienen saldos de tokens, los enrutadores pueden ser reemplazados de forma segura. Por esta razón, los enrutadores tienen números de versión, comenzando en 01. En nuestra implementación, utilizamos Router02 en 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45en la red principal.

SafeERC20 es una capa de protección construida alrededor de las transacciones ERC20, asegurando una interacción segura con tokens ERC20 dentro de nuestro contrato. A diferencia de las funciones ERC20 regulares, SafeERC20 mejora la seguridad verificando los valores booleanos de retorno de las operaciones ERC20. Si alguna operación falla, la transacción se revierte, minimizando los riesgos. Además, SafeERC20 se adapta a tokens ERC20 no estándar que carecen de valores booleanos de retorno, proporcionando flexibilidad y robustez en la gestión de tokens. Al aprobar la cantidad máxima, permitimos que Router02 transfiera tokens en nuestro nombre. Sin hacerlo, esperaría ver un mensaje de error STF en el que STF significa que la ejecución se revierte por la aserción require en la función TransferHelper.safeTransferFrom.

A continuación, veremos cómo se define un camino triangular:

bytes memoria ruta = abi.encodePacked(USDC, uint24(3000),

                                WETH, uint24(3000),                                DAI,  uint24(3000),                                USDC) ;

A través de abi.encodePacked, Solidity empaqueta estrechamente múltiples valores sin agregar ningún relleno. Concatena los datos binarios brutos de cada parámetro. No es difícil entender que los parámetros secuencializaron los intercambios con comisiones entre los pares de criptomonedas. El camino comienza desde USDC y se detiene en USDC esperando una ganancia. Luego, se envuelve con ExactInputParams con otros parámetros obligatorios y se alimenta en el enrutador para intercambios multi-hop.

Pruebas

Utilizamos la misma técnica porforking mainnet con impersonación. Una vez que se verifique que se hayan acreditado 10 USDC al contrato, se pueden activar intercambios multi-hop como se indica a continuación:

it("realiza intercambio de múltiples saltos", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo actual de USDC = ${balance}`);console.log(`Intercambiando ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo actual de USDC = ${balance}`);expect(balance).not.equal(0);});

El resultado de la prueba debería lucir como a continuación:

Saldo USDC de ballena: 170961218210457n

Inicio de suplantación.

Impersonation completed.

Saldo actual de USDC = 100000000

Intercambiando 100 USDC

Saldo actual de USDC = 91677417

Después de saltar a través de los aros, perdimos dinero — Obviamente, el camino con tasas al contado no estaba a nuestro favor, pero tienes la idea de cómo se debe hacer el arbitraje triangular usando intercambios de múltiples saltos en Uniswap v3.

Préstamo flash financiado arbitraje triangular

¿No te he dichola fuente de financiamiento más poderosa en el ecosistema DeFi es Flash loan? No necesitará mucha creatividad para que construyas una estrategia de trading de arbitraje triangular financiada con préstamos Flash utilizando tanto préstamos Flash como intercambios multihop que enseñé. Una lógica combinada puede ser explicada por el diagrama de secuencia actualizado como se muestra a continuación:

Diagrama de secuencia para arbitraje triangular financiado por préstamo Flash en Uniswap v3 (Se ignoraron algunas operaciones para simplificar)

Echa un vistazo a mi código fuente tanto para Flash loan como para intercambios Multihop implementados en Uniswap v3 — https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, digiera el diagrama de secuencia y haga su propia tarea para completar los contratos inteligentes combinados.

Consideraciones de rentabilidad

Lo primero que queremos ver es el camino que comprende la secuencia de los 3 intercambios: Para ser rentables, deben ser los 3 pares correctos de cripto a las tasas correctas. Para encontrar toda esta corrección, necesitas desarrollar un programa que permuta pares comerciables en el patrón de arbitraje triangular y simula los intercambios para comprobar la rentabilidad. La obtención de tasas de la cadena de bloques puede ser lenta y ralentizará aún más el proceso si hay demasiados caminos esperando a ser verificados para la rentabilidad. Puede que quieras reducir la lista de caminos triangulares calculando la Ganancia y Pérdida basándote en los precios superficiales proporcionados por los puntos finales de precios de GraphQL de un DEX si los hay.aquí viene Uniswap v3’s) , ya que las API de GraphQL son mucho más rápidas que blockchain para proporcionar datos de cotización. Una vez que se hayan preseleccionado las rutas, ejecútelas con cotizaciones recuperadas de la cadena para un cálculo más preciso de Ganancias y Pérdidas.

Impulsando tu inversión con un préstamo Flashpuede extender aún más la ganancia — pedir prestados tokens a bajo interés e invertirlos con una estrategia rentable siempre será una buena idea. Teóricamente, siempre y cuando la ganancia bruta sea suficiente para cubrir los honorarios del préstamo Flash y de intercambio, la estrategia de arbitraje triangular se considerará rentable. Un truco crítico para proteger tus ganancias y mitigar el riesgo comercial general es tener una lógica en tu contrato comercial para fallar la transacción de préstamo flash si falla la verificación de rentabilidad bruta, ya que cuando la transacción falla, todas las operaciones se desharán y no necesitarás soportar la pérdida e incluso los honorarios de la transacción. Esta pieza de lógica funcionará como un guardián general para evitar el deslizamiento o movimiento de tipo de cambio que no nos beneficie.

Dicho esto, independientemente del éxito o fracaso de la transacción, las comisiones por gas son algo de lo que nunca puedes escapar y podrían ser la causa principal de que pierdas dinero en el arbitraje triangular. Siempre evalúa las comisiones por gas para la transacción de tu estrategia y tenlo en cuenta en el cálculo de rentabilidad neta. Por favor, consulta los casos de prueba de estimación de comisiones por gas en mi código fuente.

Descargo de responsabilidad:

  1. Este artículo está reimpreso de [Scripts de criptomonedas], Todos los derechos de autor pertenecen al autor original [Aaron Li]. Si hay objeciones a esta reimpresión, por favor contacte al Gate Learnequipo, y lo resolverán rápidamente.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo son únicamente las del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas son realizadas por el equipo de Gate Learn. A menos que se mencione, está prohibido copiar, distribuir o plagiar los artículos traducidos.

Arbitraje triangular en Uniswap v3

Intermedio5/7/2024, 10:38:35 AM
El arbitraje triangular sirve como estrategia en el trading de intercambio de criptomonedas, aprovechando las variaciones en los tipos de cambio dentro de un solo mercado o a través de múltiples mercados.

Implementado con intercambios multihop

El arbitraje triangular sirve como una estrategia en el comercio de intercambio de criptomonedas, aprovechando las variaciones en los tipos de cambio dentro de un solo mercado o a través de múltiples mercados. Este método consta de tres operaciones secuenciales: intercambiar una criptomoneda inicial por una segunda, la segunda por una tercera y, finalmente, la tercera criptomoneda por la inicial, todo con el objetivo de generar beneficios. Por lo tanto, el término "triangular" encapsula su proceso de tres pasos.

Imagen generada por AI

¿Cómo funciona?

En DEX, las oportunidades de arbitraje triangular suelen ser causadas por diferencias de liquidez en múltiples pools. Suelen ser de corta duración, durando solo unos pocos segundos o incluso menos, ya que el intercambio ajusta rápidamente cualquier discrepancia de precios. En consecuencia, se emplean algoritmos de trading automatizado equipados para ejecutar rápidamente operaciones con el fin de capitalizar estas diferencias fugaces. Para ayudar a entender el concepto, aquí viene un ejemplo:

La transacción triangular anterior comienza desde 01 — comprando 1 wBTC con $60,000 USDC, seguido por 02 — comprando 16 WETH con 1 wBTC y termina con 03 — vendiendo 16 WETH por $66,000 USDC. Al final del viaje, habríamos obtenido $6,000 USDC como ganancia.

Implementando con Intercambios Multihop en Uniswap v3

Hay dos estilos de intercambio de múltiples saltos disponibles en Uniswap v3: Entrada exacta y Salida exacta. Como sugieren sus nombres, el primero espera un token con la cantidad exacta como entrada del intercambio, y al final, un token con la cantidad se producirá a las tasas de cambio; El segundo espera una cantidad exacta especificada como salida, solo la cantidad suficiente de token como entrada puede cumplir el intercambio a las tasas de cambio.

Con la naturaleza comercial del arbitraje triangular, nos gustaría tomar un token con la cantidad exacta como entrada, intercambiarlo por otro cripto y luego intercambiarlo nuevamente por el token original para obtener ganancias, como deseamos.

dirección constante SWAP_ROUTER_02 = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;

dirección constante WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

dirección constante USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;

dirección constante DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;

contrato MultiHopSwap { usando SafeERC20 para IERC20;ISwapRouter02 privado constante ROUTER = ISwapRouter02(SWAP_ROUTER_02);uint256 privado constante MAX_INT =   115792089237316195423570985008687907853269984665640564039457584007913129639935;function swapExactInputMultiHop(uint256 amountIn) externo {   IERC20(USDC).safeApprove(dirección(ROUTER), MAX_INT);   IERC20(WETH).safeApprove(dirección(ROUTER), MAX_INT);   IERC20(DAI).safeApprove(dirección(ROUTER), MAX_INT);   bytes memory path =       abi.encodePacked(USDC, uint24(3000), WETH, uint24(3000), DAI, uint24(3000), USDC) ;   ISwapRouter02.ExactInputParams memory params = ISwapRouter02       .ExactInputParams({       path: path,       recipient: dirección(this),       amountIn: amountIn,       amountOutMinimum: 1   });   ROUTER.exactInput(params); }}

Los enrutadores juegan un papel crucial en facilitar la provisión de liquidez. Dado que son sin estado y no mantienen saldos de tokens, los enrutadores pueden ser reemplazados de forma segura. Por esta razón, los enrutadores tienen números de versión, comenzando en 01. En nuestra implementación, utilizamos Router02 en 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45en la red principal.

SafeERC20 es una capa de protección construida alrededor de las transacciones ERC20, asegurando una interacción segura con tokens ERC20 dentro de nuestro contrato. A diferencia de las funciones ERC20 regulares, SafeERC20 mejora la seguridad verificando los valores booleanos de retorno de las operaciones ERC20. Si alguna operación falla, la transacción se revierte, minimizando los riesgos. Además, SafeERC20 se adapta a tokens ERC20 no estándar que carecen de valores booleanos de retorno, proporcionando flexibilidad y robustez en la gestión de tokens. Al aprobar la cantidad máxima, permitimos que Router02 transfiera tokens en nuestro nombre. Sin hacerlo, esperaría ver un mensaje de error STF en el que STF significa que la ejecución se revierte por la aserción require en la función TransferHelper.safeTransferFrom.

A continuación, veremos cómo se define un camino triangular:

bytes memoria ruta = abi.encodePacked(USDC, uint24(3000),

                                WETH, uint24(3000),                                DAI,  uint24(3000),                                USDC) ;

A través de abi.encodePacked, Solidity empaqueta estrechamente múltiples valores sin agregar ningún relleno. Concatena los datos binarios brutos de cada parámetro. No es difícil entender que los parámetros secuencializaron los intercambios con comisiones entre los pares de criptomonedas. El camino comienza desde USDC y se detiene en USDC esperando una ganancia. Luego, se envuelve con ExactInputParams con otros parámetros obligatorios y se alimenta en el enrutador para intercambios multi-hop.

Pruebas

Utilizamos la misma técnica porforking mainnet con impersonación. Una vez que se verifique que se hayan acreditado 10 USDC al contrato, se pueden activar intercambios multi-hop como se indica a continuación:

it("realiza intercambio de múltiples saltos", async () => {balance = await swap.tokenBalance(USDC);console.log(`Saldo actual de USDC = ${balance}`);console.log(`Intercambiando ${initialFundingHuman} USDC`);const tx = await swap.swapExactInputMultiHop(ethers.parseUnits(initialFundingHuman, DECIMALS));receipt = await tx.wait();balance = await swap.tokenBalance(USDC);console.log(`Saldo actual de USDC = ${balance}`);expect(balance).not.equal(0);});

El resultado de la prueba debería lucir como a continuación:

Saldo USDC de ballena: 170961218210457n

Inicio de suplantación.

Impersonation completed.

Saldo actual de USDC = 100000000

Intercambiando 100 USDC

Saldo actual de USDC = 91677417

Después de saltar a través de los aros, perdimos dinero — Obviamente, el camino con tasas al contado no estaba a nuestro favor, pero tienes la idea de cómo se debe hacer el arbitraje triangular usando intercambios de múltiples saltos en Uniswap v3.

Préstamo flash financiado arbitraje triangular

¿No te he dichola fuente de financiamiento más poderosa en el ecosistema DeFi es Flash loan? No necesitará mucha creatividad para que construyas una estrategia de trading de arbitraje triangular financiada con préstamos Flash utilizando tanto préstamos Flash como intercambios multihop que enseñé. Una lógica combinada puede ser explicada por el diagrama de secuencia actualizado como se muestra a continuación:

Diagrama de secuencia para arbitraje triangular financiado por préstamo Flash en Uniswap v3 (Se ignoraron algunas operaciones para simplificar)

Echa un vistazo a mi código fuente tanto para Flash loan como para intercambios Multihop implementados en Uniswap v3 — https://medium.com/cryptocurrency-scripts/flash-loan-on-uniswap-v3-84bca2bfe255, digiera el diagrama de secuencia y haga su propia tarea para completar los contratos inteligentes combinados.

Consideraciones de rentabilidad

Lo primero que queremos ver es el camino que comprende la secuencia de los 3 intercambios: Para ser rentables, deben ser los 3 pares correctos de cripto a las tasas correctas. Para encontrar toda esta corrección, necesitas desarrollar un programa que permuta pares comerciables en el patrón de arbitraje triangular y simula los intercambios para comprobar la rentabilidad. La obtención de tasas de la cadena de bloques puede ser lenta y ralentizará aún más el proceso si hay demasiados caminos esperando a ser verificados para la rentabilidad. Puede que quieras reducir la lista de caminos triangulares calculando la Ganancia y Pérdida basándote en los precios superficiales proporcionados por los puntos finales de precios de GraphQL de un DEX si los hay.aquí viene Uniswap v3’s) , ya que las API de GraphQL son mucho más rápidas que blockchain para proporcionar datos de cotización. Una vez que se hayan preseleccionado las rutas, ejecútelas con cotizaciones recuperadas de la cadena para un cálculo más preciso de Ganancias y Pérdidas.

Impulsando tu inversión con un préstamo Flashpuede extender aún más la ganancia — pedir prestados tokens a bajo interés e invertirlos con una estrategia rentable siempre será una buena idea. Teóricamente, siempre y cuando la ganancia bruta sea suficiente para cubrir los honorarios del préstamo Flash y de intercambio, la estrategia de arbitraje triangular se considerará rentable. Un truco crítico para proteger tus ganancias y mitigar el riesgo comercial general es tener una lógica en tu contrato comercial para fallar la transacción de préstamo flash si falla la verificación de rentabilidad bruta, ya que cuando la transacción falla, todas las operaciones se desharán y no necesitarás soportar la pérdida e incluso los honorarios de la transacción. Esta pieza de lógica funcionará como un guardián general para evitar el deslizamiento o movimiento de tipo de cambio que no nos beneficie.

Dicho esto, independientemente del éxito o fracaso de la transacción, las comisiones por gas son algo de lo que nunca puedes escapar y podrían ser la causa principal de que pierdas dinero en el arbitraje triangular. Siempre evalúa las comisiones por gas para la transacción de tu estrategia y tenlo en cuenta en el cálculo de rentabilidad neta. Por favor, consulta los casos de prueba de estimación de comisiones por gas en mi código fuente.

Descargo de responsabilidad:

  1. Este artículo está reimpreso de [Scripts de criptomonedas], Todos los derechos de autor pertenecen al autor original [Aaron Li]. Si hay objeciones a esta reimpresión, por favor contacte al Gate Learnequipo, y lo resolverán rápidamente.
  2. Descargo de responsabilidad: Las opiniones expresadas en este artículo son únicamente las del autor y no constituyen ningún consejo de inversión.
  3. Las traducciones del artículo a otros idiomas son realizadas por el equipo de Gate Learn. A menos que se mencione, está prohibido copiar, distribuir o plagiar los artículos traducidos.
Bắt đầu giao dịch
Đăng ký và giao dịch để nhận phần thưởng USDTEST trị giá
$100
$5500