1. Introducción (Sumario)

El módulo Flash permite a cualquiera acuñar DAI hasta un límite establecido por la Gobernanza de Maker, con la condición de que se devuelva dicho monto con una tarifa en la misma transacción. Esto permite a cualquier sujeto explotar las oportunidades de arbitraje en el espacio DeFi sin comprometer un capital inicial.Flash provee muchos beneficios al ecosistema del DAI incluyendo, pero no limitando:

2. Detalles del Contrato

Glosario (Flash)

3. Conceptos y Mecanismos Claves

Uso

Dado que el módulo Flash se ajusta a la especificación ERC3156, se puede usar la implementación del prestatario de referencia de la especificación:

pragma solidity ^0.8.0;

import "./interfaces/IERC20.sol";
import "./interfaces/IERC3156FlashBorrower.sol";
import "./interfaces/IERC3156FlashLender.sol";

contract FlashBorrower is IERC3156FlashBorrower {
    enum Action {NORMAL, OTHER}

    IERC3156FlashLender lender;

    constructor (
        IERC3156FlashLender lender_
    ) public {
        lender = lender_;
    }

    /// @dev ERC-3156 llamada de la función de préstamo rápido (Flash loan)
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external override returns (bytes32) {
        require(
            msg.sender == address(lender),
            "FlashBorrower: Untrusted lender"
        );
        require(
            initiator == address(this),
            "FlashBorrower: Untrusted loan initiator"
        );
        (Action action) = abi.decode(data, (Action));
        if (action == Action.NORMAL) {
            require(IERC20(token).balanceOf(address(this)) >= amount);
            // hacer un comercio rentable aquí
            IERC20(token).transfer(initiator, amount + fee);
        } else if (action == Action.OTHER) {
            // hacer otro
        }
        return keccak256("ERC3156FlashBorrower.onFlashLoan");
    }

    /// @dev iniciar un flash loan
    function flashBorrow(
        address token,
        uint256 amount
    ) public {
        bytes memory data = abi.encode(Action.NORMAL);
        uint256 _allowance = IERC20(token).allowance(address(this), address(lender));
        uint256 _fee = lender.flashFee(token, amount);
        uint256 _repayment = amount + _fee;
        IERC20(token).approve(address(lender), _allowance + _repayment);
        lender.flashLoan(this, token, amount, data);
    }
}

DAI del Vat

Puede ser que los usuarios estén interesados en mover DAI en los saldos internos del vat. En lugar de desperdiciar gas acuñando/quemando DAI del ERC20, puedes usar la función de acuñamiento flash de DAI del vat para hacerlo más rápido.