Bueno, me han pedido por el fedachat que explique un poco como hice mi dinero en las cryptos desde el punto de vista de programador, así que allá va.
Para quien no sepa que es el MEV, más o menos lo teneis explicado aquí:
https://ethereum.org/en/developers/docs/mev/
De lo que voy a hablar aquí, voy a presuponer que el que lo lea entiende el mundo crypto.
Qué conocimientos tenía antes de empezar en esto? No sabía ni escribir en solidity, que es el lenguaje de programación de los contratos inteligentes (smart contracts), pero bueno, tenía unas bases sólidas de programación, así que no fue muy complicado.
Empecé primero por lo más básico, el arbitraje y empecé en la red de BSC, ya que la red de ETH tiene un coste alto de deployment de contratos inteligentes y no sabía exactamente si esto iba a ser rentable.
Los primeros días, empecé a investigar como funcionaba Pancakeswap (un fork de Uniswap). Es una tónica muy normal que el código de los smart contracts sea público, ya que la gente los tiene que utilizar para mover sus tokens y nadie puede fiarse de hacerlo bajo algo que no tiene el código público, pues no sabes si puedes acabar llamando a una función de un smart contract que haga que el dueño del smart contract se quede con tus tokens.
En pancakeswap, todo iba por pares, por ejemplo, me lo invento, el par CAKE-BNB y el par CAKE-BUSD. Si movías dinero en CAKE-BNB, se creaba una oportunidad de arbitrage sobre el par CAKE-BUSD y el par BNB-BUSD. Todo esto se podía ampliar a muchos pares, a muchos saltos, por lo que lo primero que hice fue conectarme a un nodo público de la red BSC, empecé a preguntarle por el estado de los pares y mediante una búsqueda usando un algoritmo DFS, intentar buscar el camino más rentable para hacer el arbitrage. Creé un smart contract al que le pasaba el camino que mi algoritmo había localizado y que hiciera el trade. Si salía positivo, me lo quedaba, si salía negativo, cancelaba el trade (y perdía las fees). El bot lo programé en C# usando la librería NEthereum, al fin y al cabo, es el lenguaje con el que estaba trabajando en ese momento.
Mi primera prueba resultó ser un fracaso, era lenta, había bots mucho más rápidos que el mío. Me dije, voy a crearme un nodo de BSC en casa, para no tener límites de llamadas. La cosa fue mejor, ganaba algunos trades, pero al final no le veía mucho sentido al tema y decidí apagarlo, pues el gasto de fees y el gasto propio del nodo (un nodo de BSC necesita un disco NVME y espacio) lo veía inviable.
Seguí investigando y encontré una posibilidad de MEV en otra página, que se llamaba alpha homora. Básicamente pagaban un reward al usuario que llamara a su smart contract por unos motivos que no vienen al caso ahora. Dicho y hecho, me creé un bot que calculara cuando era rentable llamar al smart contract y bum, empezó a funcionar. Muy poco, pero era el único que estaba ahí. No tardó mucho en aparecer otro bot y fue entonces cuando descubrí el front running.
El front running consiste en estudiar la mempool de un nodo y si aparece una transacción que te interesa enviar antes que la otra, envías la tuya con algo más de gas que la anterior. Empecé a front runnear al otro bot y no tardó ni 2 días en darse cuenta que lo estaba haciendo, cuando él empezó a front runnearme. Al final, entramos en una guerra tan absurda de front runneo que dejó de ser rentable y me cansé, me cansé antes que él.
Me había picado el tema, así que seguí informándome sobre la mempool, sobre MEV y leí este artículo que fue el que me hizo interesarme por todo esto:
https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest
Ethereum llevaba trabajando mucho tiempo, no me veía capaz de entrar en el MEV allí (todavía), pero BSC acababa de nacer como quien dice y sin tener ni puta idea, pensé que quizás era una red demasiado joven para que la gente hubiera caído que aquí se podía hacer algo.
Y fue entonces cuando conocí la plataforma de Venus en BSC. Una plataforma de préstamos, que permite que los usuario liquiden y por esas liquidaciones se lleven un dinero. Investigué de nuevo el código, resultó que era un fork de Compound de ETH, el cual tenía mucha información de como se hacían liquidaciones (manuales). Básicamente pagas lo que el usuario debe a la plataforma y te da el token de colateral. Supongamos que el usuario había puesto como colateral 1 ETH y había pedido prestado 500 USDT, si el precio del ETH caía por debajo de un umbral, lo prestado superaba a lo colaterizado, por lo que yo pagaba 500 USDT y a lo mejor la plataforma me daba 0,4 ETH, que en valor era más que 500 USDT. Tenía el problema que iba a necesitar pasta, así que fue cuando aprendí lo que era un flashloan.
Un flashloan básicamente es que en la misma transacción, Pancakeswap te deja pedir un token y devolverlo pagando % muy bajo de interés, mucho más bajo que el interés de repagar yo el préstamo de un usuario. Mi siguiente problema era descubrir que usuarios estaban por debajo del límite de préstamos, fue entonces cuando descubrí este github:
https://github.com/haydenshively/Compound-Liquidation-Bot
Que me abría bastante el camino para no ir a ciegas. Lo primero que necesitaba era conocer los usuarios y su estado de colaterización, lo cual, venus no me proporcionaba, pero investigando el código de compound en github, me di cuenta que cada llamada a su smart contract para pedir prestado o poner colaterizado creaba un evento.
Mediante la llamada eth_getLogs y usando la librería de NEthereum, que por entonces me seguía acompañando, ya que seguía programando en C#, creé un indexador para que en una pequeña base de datos me pusiera las cuentas que existían en la plataforma de Venus. Simplemente tenía que consultarlas cada bloque y si estaban para ser liquidadas, llamaba a mi función del smart contract que hacía un flashloan, liquidaba la posición y devolvía el flashloan. Dicho y hecho, tras varias pruebas infructuosas (perdiendo dinero porque crear un smart contract cuesta gas, lo cual es pasta), conseguí crear una primera versión que funcionaba. A las pocas horas, liquidé una operación y gané dinero, más de lo que me pensaba, 2 cifras. Me di cuenta que existían otros bots que hacían lo mismo, así que empecé a estudiarlos y a frontrunnearlos (eran bots demasiado simples, no se daban cuenta de que los frontrunneaba) y empecé a hacer dinero, liquidaciones de 2, 3 cifras.
No me quedé parado, dije, si existe una plataforma en BSC como Venus, deben existir otras iguales. Y me puse a leer y encontré otras, más pequeñas, pero que los bots ni conocían. Y empecé a pensar, y si me voy de BSC y entro en redes más pequeñas? Y me fui a HECO, a Fantom, a Polygon, a AVAX, etc.. En HECO fue cuando me di cuenta que iba en serio, frontrunee a un usuario normal sin bot en una operación de liquidación de 5 cifras. Flipé. Empecé a liquidar en todas las redes posibles, monté varios ordenadores en casa para montar nodos de las redes, monté ordenadores en la nube haciendo lo mismo y tenía un ejército de bots liquidando sin parar en todas los sitios posibles. Ya pasaba de buscar arbitrajes, que son las operaciones que más bots tienen, decidí buscar los códigos de cualquier sitio que fomentara el liquidar y liquidaba todo lo posible. He llegado a seguir hasta 100 smart contracts a la vez. Un bot indexando a los usuario y otro liquidando.
No voy a mentir, hice mucho dinero en esta época, lo suficiente para poder vivir el resto de mi vida bien. Pero al final, como todo, apareció la competencia. Peleas de front running y me di cuenta que había bots que si los frontrunneaba no funcionaba, no entendía que pasaba....
Y lo comprendí, los bots ponían sus transacciones justo en el momento en el que el precio cambiaba (para explicar esto tendríamos que hablar de oracles y demás, pero es un coñazo) con el mismo gas que el cambio de precio y si yo ponía más gas, enviaba la transacción antes del cambio de precio y todo se jodía. Tenía que hacer lo mismo y ese es el momento actual.
Empecé a necesitar velocidad, poner la transacción justo cuando el oracle actualiza un precio se ha convertido en la guerra actual. Esto ha hecho que durante el último año haya tenido que hacer muchos cambios. Hay sitios, donde no consigo ganar casi nunca ya, otros donde a veces. He cambiado de lenguaje de programación ya que C# se me hacía lento y he pasado a GO, próximamente pasaré a rust o c++ para probar. He puesto varios nodos estratégicamente colocados por el mundo, ya que la propagación de una transacción en la mempool de un nodo a otro se hace por p2p y mi nodo en casa en España ya no era suficiente.
He modificado el código de los nodos para hacerlos lo más eficientes posibles, los nodos suelen estar escritos en go, por ejemplo el oficial de BSC es este:
https://github.com/bnb-chain/bsc y si tengo varios, cada uno que necesita mínimo 1 TB de NVME SSD y 64 GB de RAM, si tengo que tener varios servidores por el mundo, pues se me hacía muy caro.
Los he reescrito para adaptarlos a mis necesidades de velocidad y aún así, hay redes como la de avalanche en las que no soy capaz de competir contra un bot que hace cada año millones de dólares o en BSC, donde a duras penas puedo hacer algo.
Actualmente sigo por diversión, por la emoción y por mejorar como optimización de todo, red, código, ciclos de computación, gestión de memoria, etc. pero si hoy hubiera empezado, no habría seguido. Me ha ayudado a aprender nuevos lenguajes, a optimizar el código al máximo, a buscar cuellos de botella, y toda esa mierda.
Ah, y por último, todo esto está democratizado en la red de Ethereum. Allí, antes de generar un bloque, lo ordenan según pidan los botters de MEV y estos pagan una comisión al minero (ahora validador). El que más comisión pague, se inserta su transacción. Creo que tarde o temprano, redes como BSC acabarán siendo así.
Cualquier duda, me la podeis preguntar sin problema.