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:
line
en unidades rad
.Flash
una vez finalizada la transacción. Esta tarifa es transferida a vow
al final de un acuñamiento (mint
) exitoso. Codeado como toll
en unidades wad
.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);
}
}
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.