FlashLoan Vulnerable Contract
Contrato educativo con 11 vulnerabilidades — auditado con AI Multi-Model (Gemini + Groq + DeepSeek)
C-01: Reentrancy en flashLoan()
La función realiza una llamada externa ANTES de actualizar el balance, permitiendo drenar todos los fondos del contrato mediante reentrancy.
function flashLoan(address borrower, uint256 amount) external {
uint256 balanceBefore = address(this).balance;
require(balanceBefore >= amount, "Insufficient liquidity");
(bool success,) = borrower.call{value: amount}(""); // ← Llamada externa
require(success, "Transfer failed");
uint256 balanceAfter = address(this).balance;
require(balanceAfter >= balanceBefore + fee, "Flash loan not repaid");
}C-02: Uso de tx.origin en onlyOwner
El modifier onlyOwner usa tx.origin en lugar de msg.sender, permitiendo ataques de phishing donde un contrato intermediario ejecuta acciones privilegiadas.
modifier onlyOwner() {
require(tx.origin == owner); // ← vulnerable
_;
}H-01: Unchecked Call en withdraw()
La función withdraw() no verifica el resultado de call(). Si falla, el owner no recibe los fondos pero el estado se actualiza igual.
function withdraw(uint256 amount) external onlyOwner {
owner.call{value: amount}(""); // ← no se verifica
}H-02: Sin límite de flash loan
No hay límite máximo. Un atacante puede tomar el 100% del balance en un solo flash loan.
H-03: Sin mecanismo de pausa
No hay circuito de emergencia. Si se detecta un ataque en curso, no hay forma de detener las operaciones.
Auditá tu proyecto con la misma tecnología
3 modelos de AI analizan tu contrato en busca de vulnerabilidades. Resultados en horas, no semanas.