En anteriores entradas hemos comentado en qué consiste el arbitraje de criptomonedas y como se implementó una herramienta automatizada para desarrollar esta estrategia.
En otra entrada se mencionó como algunos individuos se aprovechan del desconocimiento de las personas en el mundo de las criptomonedas para robar. Al final de ésta, se mencionaba la posibilidad de implementar o no esta estrategia de trading en el mundo de la finanzas descentralizadas.
Antes de empezar a desarrollar esta herramienta es necesario conocer cómo funciona esta estrategia, un tema que quedó un poco en el aire. A grandes rasgos, la idea es aprovechar las características de los sistemas transaccionales de los mundos de finanzas descentralizados.
El las criptomonedas existe el concepto de transacción Igual que en los sistemas de bases de datos ACID. Las transacciones son un conjunto de operaciones que se perciben como una única operación, la cual es exitosa si todas suboperaciones lo son. Así, si una de las suboperaciones no se puede ejecutar con éxito se revierte al estado inicial del sistema.
¡Eso es fantástico! Supongamos que detectamos una oportunidad de arbitraje con un 0.25% de beneficio y una liquidez de medio millón de dólares. Eso significa que si ejecutamos la operación obtenemos 1250 dólares. El único problema es que no tenemos medio millón de dólares ¿o sí?
No, no los tenemos. Para poder estar operación de compra y venta de activos, podemos acudir a un banco y pedir prestados medio millón de dólares al 0.08% de interés y aún así obtenemos beneficio. Para que todo vaya bien solo tenemos que:
Pero… ¿qué pasa si nunca llego a ejecutar la operación de arbitraje porqué los precios ya han cambiado o no se ha reducido la liquidez? Nada: no puedes devolver el dinero prestado con sus intereses porqué no tienes ese dinero.
Como no puedes devolver el dinero prestado con sus intereses no se puede completar la transacción en la que solicitas el dinero, realizas tus operaciones y lo devuelves. Por tanto, es como si nunca lo hubieras pedido en primer lugar.
No voy a entrar en detalles de cómo se puede implementar un bot de arbitraje descentralizado, ya que como en todos los problemas existen infinitas soluciones. Todas ellas serán válidas siempre y que cumplan con los requerimientos, aunque algunas serán más o menos eficientes.
En las finanzas centralizadas tenemos unos exchanges conocidos como puede ser Binance o Coinbase y cada uno de ellos proporciona las herramientas para poder consultar información y ejecutar operaciones, como puede ser una API o un cliente con todas las operaciones ya implementadas.
En cambio, en las finanzas descentralizadas no hay ninguna entidad (de ahí que sea descentralizado). Los intercambios se realizan a través de smart contracts gracias al automatic market making (AMM). Esta técnica consigue regular el precio de un activo manteniendo una relación entre los dos activos que se intercambian, el valor de esta relación se determina cuando se crea ese mercado (o más bien el proveedor de liquidez).
Una vez entendemos cómo se realizan las operaciones en los exchanges descentralizados podemos plantearnos hacer un bot que haga estas operaciones. Como se ha mencionado, los exchanges descentralizados solo son un smart contract con funciones para realizar intercambios.
También tenemos que entender que hay distintos exchanges descentralizados pero la mayoría de ellos son forks de Uniswap, con lo cual, a nivel de implementación, tienen las mismas funciones (incluso con la misma signature). Así que para nosotros, realizar un intercambio en un exchange A o en el exchange B nos es igual y no nos lleva más trabajo.
A continuación solo debemos de investigar qué plataformas descentralizadas existen y qué monedas queremos intercambiar. Este trabajo lo podemos hacer manualmente ya que no existen infinitas plataformas ni infinitos tokens. Además, debemos tener en cuenta que queremos mercados con mucha liquidez, ya que vamos a pedir prestados medio millón de dólares.
Una vez tenemos todas las plataformas donde queremos hacer intercambios y los tokens que queremos intercambiar podemos construir un grafo como el de la figura 1.
Pero lo podemos complicar más, ya que añadir más tokens o más exchanges no nos supone ningún esfuerzo. Así podemos tener una versión con más itinerarios como el de la figura 2.
Para construir todas las combinaciones podemos realizar una suposición totalmente válida: todos los tokens existen en todas las plataformas. Con esta suposición se obtienen todas las combinaciones triviales entre plataformas. Por ejemplo, si tenemos 1 BUSD en PancakeSwap también lo tenemos en Biswap. Y aquí, a diferencia del arbitraje descentralizado, no necesitamos ninguna operación para tenerlo en las distintas plataformas.
¿Y qué pasa si un mercado no existe en una determinada plataforma? Nada, simplemente el propio smart contract de la plataforma nos indicará que cuando queremos intercambiar X cantidad del token A por el token B obtenemos 0 tokens B.
La consulta de los precios de los mercados no supone ningún problema. De hecho, solo tenemos que replicar la lógica que hacen las interfaces de usuario que hacen uso de estos smart contracts. Las páginas de los propios exchange realmente se conectan a un nodo de la cadena de bloques y realizan consultas sobre la funciones de los smart contracts. Aquellas funciones que solo leen y no provocan ningún cambio sobre el estado de la blockchain no necesitan ninguna transacción. En cambio, las operaciones (como puede ser la de intercambiar tokens) que provocan escrituras sobre la cadena de bloques sí que requieren de una transacción.
Vamos a recapitular lo que se ha hecho hasta ahora:
Para ejecutar las operaciones, primero tenemos que detectarlas, ¿no? Eso es bastante fácil porqué ya tenemos el grafo con todas las posibles combinaciones de operaciones, solo tenemos que recorrer el grafo y ejecutar aquellas operaciones que son rentables.
Al inicio se ha comentado que es necesario ejecutar todas las operaciones de manera atómica. Por el propio diseño de la blockchain (o de Binance Smart Chain) los usuarios solo pueden ejecutar una única operación. Eso no es ningún problema, ya que podemos delegar las operaciones que queremos ejecutar a un smart contract y éste sí lo puede hacer atómicamente.
Podemos diseñar un smart contract muy genérico y que funcione en distintas plataformas. Este smart contract tendrá una función que recibirá una lista y cada elemento indicará:
El código principal de esta función podría ser como el siguiente fragmento:
for (uint8 i = 0; i < routers.length; i++) { DEXRouter(routers[i]).swapExactTokensForTokens( amountsIn[i], amountsOut[i], paths[i], address(this), block.timestamp ); }
Un detalle que no se ha comentado es como pedimos prestado el dinero. Para pedir medio millón de dólares en un flash loan necesitamos encontrar una plataforma que permita hacerlo y luego la tendremos que integrar en nuestro smart contract.
El flujo final del programa será algo del estilo:
Como puedes comprobar, este proceso es bastante directo y sencillo.
Esta herramienta automática de trading se probó durante algunas semanas de enero de 2022 y se ejecutaron algunas operaciones. Los resultados de esas operaciones quedan fuera del alcance de esta entrada, ya que el objetivo era implementar un bot de arbitraje sobre una red descentralizada.
Ese objetivo principal se ha logrado y además se han adquirido nuevas habilidades durante el proceso:
Comentar que una vez se tiene la idea principal bien clara y cómo se quiere ejecutar, implementar una herramienta de este estilo no te debería llevar más de una semana de trabajo.
Bueno, voy pidiendo cita en el concesionario para comprar el Lamborghini. Es broma, mejor un eléctrico así lo podré aprovechar en el 2035.