El protocolo Compound V3 mide el interés a escala de segundos. El frontend de Compound V3 escala el número a años para que sea más fácil de entender para los usuarios. Cuando revisamos los parámetros de tasas de interés para Compound V3 en Etherscan, vemos los siguientes parámetros para los prestatarios. En la siguiente sección, corroboraremos estos parámetros con lo que vemos en el frontend de Compound USDC Ethereum.
Este artículo es un recorrido por Solidity que explica línea por línea cómo la utilización determina las tasas de interés.

Requisitos previos
Asumimos que ya has leído nuestro artículo sobre cómo se determinan las tasas de interés en cripto.
Cambios principales respecto a Compound V2
En Compound V2 (y Aave V3), las tasas de interés de suministro son las tasas de interés de préstamo multiplicadas por la utilización. En Compound V3, la tasa de interés de suministro es directamente una función de la utilización y no tiene en cuenta la tasa de préstamo. La tasa de préstamo sigue su propia curva de tasas de interés.
Nombres de variables para los componentes del modelo de tasas de interés
Lo que Aave V3 llama la “utilización óptima”, Compound V3 lo llama el “kink”.
La variable borrowPerSecondInterestRateBase es la “intersección” (“intercept”) y actualmente tiene un valor de 317097919. Nuestro objetivo en esta sección es mostrar que esta intersección es equivalente al 1% de APY. Es decir, cuando la utilización es cero, los prestatarios pagan un 1% de interés (según los parámetros actuales, los cuales pueden ser modificados por la gobernanza).

Hay 31,536,000 segundos por año (SECONDS_PER_YEAR), sin tener en cuenta los años bisiestos y otras peculiaridades del calendario gregoriano. Si multiplicamos 31536000 (SECONDS_PER_YEAR) por 317097919 (borrowInterestRatePerSecond) obtenemos (aproximadamente) 0.01e18 (1e16). En una escala donde 1 es 1e18, esto se traduce en una tasa de interés de préstamo del 1%.
De hecho, podemos verificar esto observando el mercado de Compound para USDC en Ethereum.
Si pasas el cursor sobre el “Interest Rate Model” para varios niveles de utilización, puedes ver cuál es el interés esperado de suministro y de préstamo. El frontend no permite pasar el cursor sobre un 0% de utilización. Sin embargo, puedes ver que el interés cambia aproximadamente un 0.03% por cada 1% de cambio en la utilización, por lo que el interés esperado al 0% de utilización será del 1%. Mira la animación a continuación.
Por lo tanto, podemos ver que la intersección en y es efectivamente del 1% por año.
Esto es cierto al momento de escribir este artículo y puede ser diferente para otros activos base en otras layer 2.
En la animación anterior, vemos que el “Earn APR” esperado (lo que ganan los prestamistas) es del 0% al 0% de utilización. Esto coincide con lo que vemos en Etherscan. El parámetro de la intersección en y para las tasas de interés de suministro se llama supplyPerSecondInterestRateBase. Según el gráfico y Etherscan, la intersección es cero.

¿Cómo sabemos que 0.01e18 se traduce al 1%?
En el ejemplo anterior, dedujimos que 0.01e18 se traduce en un interés del 1%. Recorreremos la base de código para mostrar cómo se deriva esto. Requerirá cinco pasos.
Paso 1: Introduciendo FACTOR_SCALE = 1e18
En la línea 57 de CometCore.sol, vemos que Compound utiliza un FACTOR_SCALE de 1e18 (recuadro azul en la captura de pantalla a continuación).
También vemos la constante SECONDS_PER_YEAR (recuadro rojo) a la que aludimos en la sección anterior.

Paso 2: La utilización se mide en FACTOR_SCALE (1e18)
Veamos la función getUtilization() en Comet.sol.

En este punto, no sabemos qué escala utilizan totalSupply_ y totalBorrow_ (recuadro azul y recuadro verde), pero es razonable asumir que están utilizando la misma escala (cantidad de decimales) y, por lo tanto, sus escalas se anularán (return de la línea 464). Dado que el numerador se multiplica por FACTOR_SCALE, (recuadro rojo) el porcentaje de utilización se medirá con 18 decimales.
Ahora comparemos el valor actual de getUtilization() en Etherscan con lo que muestra la aplicación de Compound

La utilización actual de 904869679838357231 se traduce en un 90.49% al dividirse por FACTOR_SCALE (y redondearse a dos decimales). Efectivamente, está utilizando 18 decimales.
Las funciones presentValueSupply y presentValueBorrow no son términos con los que esperemos que el lector esté familiarizado todavía, pero pueden considerarse como el valor en dólares del capital total disponible para prestar y el total de dólares prestados, respectivamente.
Paso 3: La utilización óptima, o kink, se encuentra en el rango [0-1e18]
En nuestro artículo sobre Tasas de interés en DeFi, notamos que los modelos populares de tasas de interés son funciones definidas a trozos con una noción de utilización “óptima”. Compound V3 se refiere a esto como el “kink”: cuando las tasas de interés comienzan a subir más bruscamente. Estos dos términos diferentes se refieren exactamente al mismo concepto.
Al momento de escribir este artículo, la utilización óptima para USDC en Ethereum es del 93%, como se muestra a continuación.

Debido a que la utilización se mide con un número de coma fija de 18 decimales, borrowKink y supplyKink también se miden con números de coma fija de 18 decimales. La función de tasa de interés compara ambos directamente, como veremos en una próxima sección.
Paso 4: mulFactor()
Los programadores familiarizados con mulDivDown de otras bibliotecas de coma fija tendrán facilidad para entender esta función.
Toma dos números de coma fija y los multiplica para producir otro número de coma fija. La función se muestra a continuación

Dado que estamos multiplicando dos números con 18 decimales entre sí, necesitamos dividir por FACTOR_SCALE para evitar tener un resultado de 36 decimales.
Simplemente piensa en la función como “multiplica dos números de 18 decimales entre sí y devuelve un número de 18 decimales que representa su producto”.
Paso 5: getSupplyRate() devuelve números decimales en la escala del factor
Ahora estamos listos para ver que Compound V3 utiliza una escala de 1e18 para medir las tasas de interés.
Compound utiliza una función lineal a trozos, como discutimos en nuestro artículo sobre tasas de interés. A continuación se muestra la función getSupplyRate(), que devuelve la tasa de interés actual ganada por los prestamistas, determinada por la tasa de utilización actual. Sabemos que mulFactor(...) devuelve números en FACTOR_SCALE (18 decimales). Por lo tanto, sabemos que supplyPerSecondInterestRate (círculo amarillo) también debe ser un número en FACTOR_SCALE o estaríamos sumando números con decimales desalineados. Por consiguiente, la función getSupplyRate() devuelve decimales en FACTOR_SCALE.

La función getBorrowRate se comporta de la misma manera, por lo que no la incluiremos aquí.
Los parámetros de la curva —las intersecciones, las pendientes y el kink— pueden ser ajustados en su totalidad por la gobernanza.
Calculando tasas de interés hipotéticas
Para calcular las tasas de interés como función de la utilización, el usuario puede obtener la utilización actual usando getUtilization() e insertarla en getSupplyRate() y getBorrowRate().
contract GetCurrentRatesComet {
function getRates(IComet comet)
external
returns (uint64, uint64) {
uint64 private constant SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
uint256 utilization = comet.getUtilization();
// these are 18 decimal fixed point numbers
// measuring interest per second
uint64 supplyRate = comet.getSupplyRate();
uint64 borrowRate = comet.getBorrowRate();
// return them as APR
return (supplyRate * SECONDS_PER_YEAR,
borrowRate * SECONDS_PER_YEAR);
}
}
Acumulación de intereses
Solo hemos mostrado cómo Compound calcula las tasas de interés en un momento específico. En un artículo posterior mostraremos cómo compone y acumula intereses.
Resumen
La unidad de tiempo para las tasas de interés son los segundos. Se miden con una precisión de 18 decimales. La utilización también se mide con una precisión de 18 decimales.
Aprende más con RareSkills
Por favor, consulta nuestro Blockchain Bootcamp para aprender más.
Publicado originalmente el 4 de enero de 2024