Build more with QuickNode - New pricing plans and a free tier! Read the press release

Cómo realizar un Préstamo Flash en Aave

January 10, 2022

Introducción

Aave, anteriormente conocido como ETHLender, se ha catapultado hacia la delantera en el espacio DeFi. Aave fue el primero de todos en aparecer con la idea de los Prestamos Flash. Antes de los Préstamos Flash, tenías que tener otro activo como depósito de garantía para poder pedir otro activo. Por ejemplo, si yo quería pedir prestado un DAI yo hubiese tenido que depositar otra criptomoneda que excediera ese valor. Los préstamos flash han pulverizado esta idea, también abrió las puertas a nuevos sistemas de préstamos. Ellos hicieron esto permitiendo a los usuarios pedir prestado sin tener que poner nada como colateral. En este tutorial aprenderás cómo es esto posible y cómo puedes hacerlo tú mismo!

Sobre Aave

Extraido desde el Sitio web de Aave

Aave es un protocolo de liquidez de mercado descentralizado y sin ningún tipo de custodia donde los usuarios pueden participar como prestamistas o como tomadores de préstamos. Los depositantes proveen liquidez al mercado para tener una ganancia pasiva, mientras que quienes toman los préstamos tienen la posibilidad de pedir prestado en forma colateralizada o sin ningún tipo de colateral (liquidez de un solo bloque)
Mientras que todo esto es correcto, puede no tener mucho sentido si no estás familiarizado con toda la industria DeFi. Puedes llegar a ver a Aave como una especie de pseudo-banco descentralizado. En vez de que un banco central valide todas las transacciones, Aave tiene Smart Contracts que hacen todo esto en una forma automatizada. Los depositantes ponen sus tokens en Aave y empiezan a ganar intereses por su depósito. Los tomadores de préstamos hacen lo contrario. Ellos sacan el dinero de Aave y empezaran a acumular intereses por el monto prestado. Para poder hacer esto, tiene que sobre sobrecolaterizado.

Existe otro método para aquellos que no quieren depositar dinero en Aave y quieren tomar prestado. Este método es el préstamo Flash que mencionamos antes.

Sobre los préstamos flash

Los préstamos flash que mencionamos anteriormente es una nueva forma de pedir prestado activos en la blockchain. Inicialmente implementado por Aave, otros protocolos conocidos como dYdX rapidamente implementaron esta característica. Hay una propiedad que comparten todas las transacciones de Ethereum que hacen posible los Prestamos Flash, la atomicidad.

Una transacción es automática siempre que la serie de sus operaciones sea indivisible e irreducible. En un lenguaje más sencillo: Se efectúan todas las transacciones o no se efectúa ninguna. Nada a medias!. El préstamos Flash aprovecha la atomicidad para permitirle al usuario pedir prestado sin tener que poner un colateral. Hay dos consideraciones que deben de hacerse. Lo primero de todo, siempre que pidas prestado un préstamo en tipo Préstamo Flash, debes pagar una comisión del 0.09% del monto pedido. En segundo lugar, debes de pagar el préstamo en la misma transacción en que la has pedido. Mientras que esta característica es genial, también es lo que limita su uso. Los préstamos flash son usados generalmente para arbitrar precios entre dos activos.

Configuración de Remix

Por la simplicidad, vamos a utilizar Remix IDE

Es un IDE en el navegador, llamado así por sus términos en inglés Integrated Development Environment. Remix viene con la habilidad de poder escribir, debugear, hacer deploy y manipular Smart Contracts de Ethereum.

Cuando abres Remix en tu navegador, verás la siguiente pantalla:


No profundizaremos tanto en este IDE, el foco de esta guía son los Préstamos Flash.

Antes de empezar a escribir nuestro Smart Contract, tendremos que bajar una extensión para el navegador que nos permite interactuar con la blockchain de Ethereum. Hay varias herramientas que nos permiten esto pero la más popular es MetaMask.

Configuracion de MetaMask

Paso a paso de como instalar MetaMask

  1. Primero descarga la extension para tu navegador
  2. Acepta los términos y condiciones
  3. Crea una contraseña segura
  4. Escribe las palabras de seguridad de tu cuenta. Esto debe de hacerse en el mundo físico y no mantenerla en tu computadora.
Si los cuatro pasos anteriores se completaron, entonces estás listo para empezar a escribir tu primer Smart Contract.

El Smart Contract

Los Smart Contracts nos permiten leer y escribir información en la blockchain ejecutando programas deterministicos. Cuando se programa un Smart Contract para usarlo en Ethereum, usaremos un lenguaje de programación llamado Solidity. Los archivos de Solidity terminan con la extension .sol.

Puedes eliminar cualquier archivo que existe en tu Workspace cuando inicias por primera vez Remix.

Tendrás que crear varios archivos

  1. FlashLoan.sol
  2. FlashLoanReceiverBase.sol
  3. ILendingPoolAddressesProvider.sol
  4. IFlashLoanReceiver.sol
  5. ILendingPool.sol
  6. Withdrawable.sol
El siguiente bloque de código es la implementación de FlashLoan.sol

Este préstamo flash va a pedir prestado 1 DAI.

el smart contract

Copy
pragma solidity ^0.6.6;
import "./FlashLoanReceiverBase.sol";
import "./ILendingPoolAddressesProvider.sol";
import "./ILendingPool.sol";

contract FlashloanV1 is FlashLoanReceiverBaseV1 {

    constructor(address _addressProvider) FlashLoanReceiverBaseV1(_addressProvider) public{}

 /**
        Flash loan 1000000000000000000 wei (1 ether) worth of `_asset`
     */
 function flashloan(address _asset) public onlyOwner {
        bytes memory data = "";
        uint amount = 1 ether;

        ILendingPoolV1 lendingPool = ILendingPoolV1(addressesProvider.getLendingPool());
        lendingPool.flashLoan(address(this), _asset, amount, data);
    }

    /**
  This function is called after your contract has received the flash loaned amount
     */
    function executeOperation(
        address _reserve,
        uint256 _amount,
        uint256 _fee,
        bytes calldata _params
    )
        external
        override
    {
        require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance, was the flashLoan successful?");
       //
        // Your logic goes here.
        // !! Ensure that *this contract* has enough of `_reserve` funds to payback the `_fee` !!
        //

        uint totalDebt = _amount.add(_fee);
        transferFundsBackToPoolInternal(_reserve, totalDebt);
    }

}

Para resumir, empezamos por importar las dependencias que requerimos para ejecutar nuestro Préstamo Flash. Algunas de esas dependencias son llamados abstract contracts.

Un abstract contract tiene al menos una función que no está implementada. Puedes pensar esto como el plano de una casa, un constructor utiliza esté plano para construir una casa. Sin embargo, en nuestra analogía el plano es un abstract contract, tu eres el constructor y la casa es el contrato resultante de esa implementación.

En este caso, nuestro Préstamo Flash está utilizando un abstract contract llamado FlashLoanReceiverBaseV1. Provee la implementación necesaria de algunos detalles como el repago del Préstamo Flash.

Analicemos el código línea por línea:

  • 1: Primero se debe definir la versión del compilador. En este caso es la versión 0.6.6.

  • 2 - 4: Importamos las dependencias del contrato.

  • 6: El contrato FlashLoanV1 hereda desde el contrato FlashLoanReceriverBaseV1.

  • 8: Pasamos la dirección de uno de los proveedores de Aave. En este caso estamos pasando la dirección del Lending Pool de DAI.

  • 13: Definimos una función llamada flashLoan. Recibe una dirección del activo que queremos hacer un préstamo flash, en este caso, es DAI.

  • 14: No hay necesidad de pasarle ningún tipo de información para el préstamos flash, por lo tanto, pasamos un texto vacío.

  • 15: Definimos el número de DAI (en términos de wei, que es, 10^18) que queremos pedir prestado.

  • 16: Iniciamos la interfaz LendingPool que es ILendingPoolV1 proveído por Aave.

  • 17: Finalmente, invocamos a nuestra función flashLoan. La función recibe 4 argumentos principales. Primero pasamos la dirección que recibirá el préstamo. En este caso, es nuestro propio contrato. Segundo, la dirección del activo, en este caso, es la dirección de DAI en la red Kovan. Tercero, pasamos el monto, será de un 1 ether (o 10^18 en unidades wei). Último pero no menos importante, pasamos el valor de la información, en este caso, una cadena de texto vacía.

  • 24-31: A continuación, definimos la segunda función, llamada executeOperation. En donde utilizamos el préstamos flash. Es llamada internamente luego de que la función flashLoan es ejecutada exitosamente. Recibe 4 parámetros principales, los cuales son:

    1. La dirección de reserva donde vamos a devolver el préstamo.
    2. El monto del activo
    3. Las comisiones que cobra el protocolo.
    4. Parámetros adicionales que utiliza la función internamente.

  • 33: Verifica si hemos recibido el monto apropiado del préstamo, si no es así, emitirá un mensaje de error.

  • 34: Este punto es donde tu implementas lógica para cualquier caso de uso arbitrario.

  • 40: Agregamos las comisiones junto al monto prestado utilizando una función llamada add proveída por la librería SafeMath.

  • 41: Al final, pagamos toda la deuda o monto del préstamo de vuelta al prestamista.

Lanzando el contrato

  1. Primero, abre MetaMask y selecciona la red Kovan Test Network.
  1. Utiliza los siguientes gist para definir las dependencias del contrato de préstamo flash. Haz clic en cada link y pega el código en el archivo correspondiente que creaste antes.


  2. a. ILendingPool
    e. Withdrawable



3. Selecciona la pestaña Solidity Compiler. Selecciona el compilador 0.6.6 y haz clic en Compile FlashLoan.sol.


4. Deberías de ver algunas advertencias pero ningún error.

5. Ahora, tenemos todo configurado para lanzar el contrato en la red Kovan. Selecciona la pestaña Deploy & Run Transactions. En las opciones de Environment cambia desde Javascript VM a Injected Web3. Esto debería abrir Metamask pidiendo permiso.



6. Asegúrate que en el campo "CONTRACT" está seleccionado Flashloan.sol. También, pon la dirección del LendingPool en el campo de texto que está junto al botón de Deploy. En este caso será 0x506B0B2CF20FAA8f38a4E2B524EE43e1f4458Cc5. Luego haz clic en Deploy. Debería de abrirse MetaMask.

Nota: Una lista de todos los contratos deployados puede ser encontrada aquí. Allí puedes encontrar las direcciones de los Lending Pools soportados por Aave. Las direcciones son diferentes para cada token, el procedimiento restante sigue siendo el mismo.

7. Haz click en Confirm. Luego de hacer eso, deberías de ver una notificación de éxito de MetaMask. Ahora tiene que haber un Deployed Contract en el panel de la izquierda.

Financiando el préstamo flash


En la parte de Deployed Contracts puedes copiar la dirección del contrato en la red. Volveremos a este paso luego; mientras tanto necesitamos agregar DAI a nuestro contrato de préstamo rápido (Flash Loan). Esto es porque un Flash Loan necesita fondos en el contrato para poderse ejecutar. Para ello, puedes ir directamente a este link y obtener algunos DAI (asegurate de estar conectado al mercado Aave que tiene una pequeña K en la esquina superior derecha). Haz click en el faucet, pega tu dirección de MetaMask y espera por la confirmación.


Luego de la confirmación, agregaremos DAI a nuestra billetera de MetaMask. Para ello, abre MetaMask, clic en "Add Token" abajo del todo. En el campo "Token Contract Address" coloca 0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD. Es la dirección del contrato de DAI en la red Kovan. Luego haz click en "Next", debería de mostrar el monto de DAI que has obtenido del faucet antes.



A continuación, haz clic en DAI y en "Send", debería de abrir una ventana similar a la siguiente imagen:



Ingresa la dirección de nuestro contrato de préstamo rápido, el que obtuvimos anteriormente. Ingresa el monto que queremos enviarle, en nuestro caso, vamos a enviar 10 DAI. Luego haz clic en "Next", luego en "Confirm". Has enviado exitosamente 10 DAI a tu contrato de préstamo rápido.

Ejecutando el Préstamo Flash

Volvemos a Remix. Debajo de nuestro contrato hay otro campo de texto llamado flashloan. Este campo toma una dirección de un contrato del activo que queremos usar. En nuestro caso es la dirección del contrato de DAI en la red de pruebas de Kovan, la cual es 0xFf795577d9AC8bD7D90Ee22b6C1703490b6512FD. Con este campo llenado correctamente, puedes darle clic al botón transact más abajo.



Luego de hacer clic, aparecerá una ventana de MetaMask para aprobar la transacción. Confirma la transacción y deberias de ver un mensaje de éxito. En la terminal de Remix deberás de poder ver una URL. Haz clic en esa URL y serás redireccionado hacia Etherscan.


Debajo de Token Transferred, deberías de poder ver tres transacciones diferentes.


  1. La flecha roja nos muestra la transferencia de 1 DAI desde el LendingPool hacia nuestro contrato.
  2. La flecha naranja nos indica el pago de 1 DAI junto con las comisiones de vuelta al LendingPool.
  3. La flecha azul nos muestra el interés generado en DAI, el cual es una utilidad separada.

Conclusión

Hemos sido capaces de escribir satisfactoriamente nuestro Smart Contract para un Flash Loan (préstamo rápido). Hemos sido capaces de pedir prestado DAI, pagar las comisiones del flash loan y luego hacer el repago del monto prestado, todo en una sola transacción. ¡Pediste prestado dinero sin ningún tipo de colateral!

Suscribete a nuestro newsletter para más artículos y guías en Ethereum. Si tienes algún tipo de comentario, se libre de comentarlos en nuestro Twitter. Siempre puedes hablar con nosotros en nuestro servidor de Discord, puedes encontrar algunos de los más geniales desarrolladores :)

Related articles 12

How to Interact with Uniswap using Javascript
Apr 12, 2022

Uniswap is one of the most discussed and important projects in the DeFi space. It’s a pretty popular project for many reasons - in this guide, we will learn how to interact with the Uniswap smart contracts using a JavaScript library called

Continue reading
How to setup a Chainlink node
Apr 12, 2022

Smart-contracts are the heart and soul of all the development happening on the Ethereum blockchain, and as more and more people develop on Ethereum, smart contracts are becoming more complex.Sometimes a smart contract wants information about the real world, like...

Continue reading
How to Access Bitcoin Mempool
Apr 12, 2022

Bitcoin is the father of blockchain technology. With Bitcoin started a new era of blockchain and decentralization. Bitcoin enabled everyone to make the peer-to-peer transactions they enjoy today; this guide will teach you how to get these transactions from the Bitcoin...

Continue reading
How to Make a Flash Loan using Aave
Dec 27, 2021

Aave, previously known as ETHLender, has catapulted to the forefront of the DeFi space. Aave was the first in the space to come up with the idea of a Flash Loan. Before flash loans, you would have to stake an over-collateralized...

Continue reading
Interacting with 0x API using JavaScript
Mar 23, 2022

We have seen tremendous growth in trade volume in DEXs. With many of these coming to the market, it is tough to decide which DEX to choose when you want to swap your token for another. That's where 0x and its APIs come into the picture. It helps us to fetch the DEX with...

Continue reading
How to access Ethereum Mempool
Apr 12, 2022

On Ethereum, when a transaction is sent, before being added to a block, it resides in what is called a Mempool. To receive information about this transaction, the Mempool must be queried. This guide will demonstrate how to query a node’s mempool using QuickNode Ethereum...

Continue reading
How to Listen For Newly Minted Tokens on PancakeSwap
Apr 12, 2022

Hello reader! Today we will be diving into details about making a bot that buys newly minted tokens on the PancakeSwap DEX. Today may be your first time making a trading bot or using the BSC network, and that is okay! By the time you have read through and completed this...

Continue reading
How to Swap Tokens on Uniswap with Ethers.js
Apr 12, 2022

Not all users interact via the front-end UI when trading tokens on a decentralized exchange. Some users (or entities) trade programmatically via a smart contract or server-side scripts. This guide will demonstrate how to swap tokens on Uniswap using Javascript and the...

Continue reading