El modelo de utilización de Compound/Aave y la mecánica de liquidaciones automáticas
contract JumpRateModel { uint256 public immutable baseRatePerYear; uint256 public immutable multiplierPerYear; uint256 public immutable jumpMultiplierPerYear; uint256 public immutable kink; function getBorrowRate(uint256 utilization) public view returns (uint256 rate) { if (utilization <= kink) { // Zona normal: tasa baja y lineal rate = baseRatePerYear + multiplierPerYear * utilization / 1e18; } else { // Zona de estrés: tasa sube agresivamente uint256 normalRate = baseRatePerYear + multiplierPerYear * kink / 1e18; uint256 excessUtil = utilization - kink; rate = normalRate + jumpMultiplierPerYear * excessUtil / 1e18; } } function liquidate( address borrower, uint256 repayAmount ) external { require(healthFactor(borrower) < 1e18, "Healthy"); // Close factor: máximo 50% de la deuda por liquidación uint256 maxRepay = debts[borrower] * CLOSE_FACTOR / 100; require(repayAmount <= maxRepay); // Liquidator paga la deuda y recibe colateral + bonus uint256 collateralToSeize = repayAmount * (100 + LIQUIDATION_BONUS) / 100 / ethPrice; collateral[borrower] -= collateralToSeize; collateral[msg.sender] += collateralToSeize; debts[borrower] -= repayAmount; USDC.transferFrom(msg.sender, address(this), repayAmount); } }