当前位置:网站首页>Analyse du contrat du modèle de taux composé

Analyse du contrat du modèle de taux composé

2022-06-11 07:23:00 33357

Texte original publié à https://github.com/33357/smartcontract-appsC'est une communauté chinoise,Analyse de l'architecture et de la mise en oeuvre des applications de contrats intelligents sur le marché.Bienvenue au projet Open Source Knowledge!

Compound RateModelAnalyse des contrats

RateModelLe contrat est utilisé pour calculer Compound Contrat pour le taux d'intérêt de prêt du jeton spécifié ci - dessus,L'analyse permet de connaître la méthode de calcul du taux d'intérêt d'emprunt..

Demo Code Warehouse:https://github.com/33357/compound-protocol

WhitePaperInterestRateModel.sol

Modèle de taux d'intérêt linéaire

Initialisation du contrat

  • Fonctions communes(Le contrat peut être invoqué à l'intérieur et à l'extérieur)
    • constructor
      • Aperçu du Code
        constructor(uint baseRatePerYear, uint multiplierPerYear) public {
                  
            baseRatePerBlock = baseRatePerYear.div(blocksPerYear);
            multiplierPerBlock = multiplierPerYear.div(blocksPerYear);
            emit NewInterestParams(baseRatePerBlock, multiplierPerBlock);
        }
        
      • Analyse des paramètres
        Fonctions constructor Dans le 2 - Oui.,Ginseng out 0 - Oui.,Les explications correspondantes sont les suivantes::
        constructor(
            uint baseRatePerYear, //  Taux de référence annuel 
            uint multiplierPerYear //  Multiplicateur de taux d'intérêt annuel 
        ) public {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Taux de référence du bloc  =  Taux de référence annuel  /  Nombre de blocs par an 
            baseRatePerBlock = baseRatePerYear.div(blocksPerYear);
            //  Multiplicateur de taux d'intérêt par bloc  =  Multiplicateur de taux d'intérêt annuel  /  Nombre de blocs par an 
            multiplierPerBlock = multiplierPerYear.div(blocksPerYear);
            // Déclencheur d'événements NewInterestParams
            emit NewInterestParams(baseRatePerBlock, multiplierPerBlock);
        }
        
      • Résumé
        Le contrat doit être conclu block Taux d'intérêt en unités de temps ,Il est donc nécessaire de baseRatePerYear Et multiplierPerYear Convertir en baseRatePerBlock Et multiplierPerBlock.Ici. blocksPerYear Pour 2102400, Est basé sur la moyenne 15Secondes Un block Calculé.

Taux de prêt des fonds

  • Fonctions communes(Le contrat peut être invoqué à l'intérieur et à l'extérieur)
    • utilizationRate
      • Aperçu du Code
        function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) {
                  
            if (borrows == 0) {
                  
                return 0;
            }
            return borrows.mul(1e18).div(cash.add(borrows).sub(reserves));
        }
        
      • Analyse des paramètres
        Fonctions utilizationRate Dans le 3 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        constructor(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves //  Total des jetons de réserve 
        ) public view returns (
            uint //  Taux de prêt des fonds 
        ){
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Si le nombre total de jetons prêtés est  0, Le taux de prêt des fonds est également de  0
            if (borrows == 0) {
                  
                return 0;
            }
            // borrows * 1e18 / (cash + borrows - reserves)
            return borrows.mul(1e18).div(cash.add(borrows).sub(reserves));
        }
        
      • Résumé
        utilizationRate Utilisé pour calculer les jetons Taux de prêt des fonds , Taux de prêt des fonds Est calculé comme suit: Taux de prêt des fonds = Nombre total de jetons prêtés / (Solde des jetons + Nombre total de jetons prêtés - Total des jetons de réserve ). En raison de l'utilisation d'entiers non signés Taux de prêt des fonds Il n'y a pas assez de précision. ,Il faut donc multiplier par 1e18, Étendre la plage de précision .

Taux d'intérêt des fonds

  • Fonctions communes(Le contrat peut être invoqué à l'intérieur et à l'extérieur)
    • getBorrowRate
      • Aperçu du Code
        function getBorrowRate(uint cash, uint borrows, uint reserves) public view returns (uint) {
                  
            uint ur = utilizationRate(cash, borrows, reserves);
            return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
        }
        
      • Analyse des paramètres
        Fonctions getBorrowRate Dans le 3 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        function getBorrowRate(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves //  Total des jetons de réserve 
        ) public view returns (
            uint //  Taux d'intérêt des prêts en bloc 
        ) {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Calculer le taux de prêt du Fonds 
            uint ur = utilizationRate(cash, borrows, reserves);
            // ur * multiplierPerBlock / 1e18 + baseRatePerBlock
            return ur.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
        }
        
      • Résumé
        getBorrowRate Utilisé pour calculer les jetons Taux d'intérêt des prêts en bloc , Taux d'intérêt des prêts en bloc Est calculé comme suit: Taux d'intérêt des prêts en bloc = Taux de prêt des fonds * Multiplicateur de taux d'intérêt par bloc + Taux de référence du bloc .Parce que Taux de prêt des fonds Étendre la plage de précision ,Il faut diviser par 1e18 Obtenir la valeur réelle .
    • getSupplyRate
      • Aperçu du Code
        function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) public view returns (uint) {
                  
            uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa);
            uint borrowRate = getBorrowRate(cash, borrows, reserves);
            uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18);
            return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18);
        }
        
      • Analyse des paramètres
        Fonctions getSupplyRate Dans le 4 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        getSupplyRate(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves, //  Total des jetons de réserve 
            uint reserveFactorMantissa //  Taux de réserve 
        ) public view returns (
            uint //  Taux d'intérêt du gage de bloc 
        ) {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            // 1 - reserveFactorMantissa
            uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa);
            //  Obtenir le taux d'intérêt du prêt  borrowRate
            uint borrowRate = getBorrowRate(cash, borrows, reserves);
            // borrowRate * (1 - reserveFactorMantissa)
            uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18);
            // utilizationRate * borrowRate * (1 - reserveFactorMantissa)
            return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18);
        }
        
      • Résumé
        getSupplyRate Utilisé pour calculer les jetons Taux d'intérêt du gage de bloc , Taux d'intérêt du gage de bloc Est calculé comme suit: Taux d'intérêt du gage de bloc = Taux de prêt des fonds * Taux d'intérêt des emprunts * (1 - Taux de réserve ) = Taux d'intérêt des emprunts * Taux de prêt des fonds * (1 - Taux de réserve ).Parce que Taux de prêt des fonds Étendre la plage de précision ,Il faut diviser par 1e18 Obtenir la valeur réelle .

BaseJumpRateModelV2.sol

Modèle de taux d'intérêt d'inflexion

Initialisation du contrat

  • Fonctions internes( Ne peut être invoqué que dans le cadre d'un contrat )
    • constructor
      • Aperçu du Code
        constructor(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_, address owner_) internal {
                  
            owner = owner_;
            updateJumpRateModelInternal(baseRatePerYear,  multiplierPerYear, jumpMultiplierPerYear, kink_);
        }
        
      • Analyse des paramètres
        Fonctions constructor Dans le 5 - Oui.,Ginseng out 0 - Oui.,Les explications correspondantes sont les suivantes::
        constructor(
            uint baseRatePerYear, //  Taux de référence annuel 
            uint multiplierPerYear //  Multiplicateur de taux d'intérêt annuel 
            uint jumpMultiplierPerYear, //  Multiplicateur de taux d'intérêt annuel au point d'inflexion 
            uint kink_, //  Taux de prêt du Fonds d'inflexion 
            address owner_ // Propriétaire
        ) internal {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Propriétaire de l'enregistrement 
            owner = owner_;
            //  Mettre à jour les paramètres du modèle de taux d'intérêt d'inflexion 
            updateJumpRateModelInternal(baseRatePerYear,  multiplierPerYear, jumpMultiplierPerYear, kink_);
        }
        
      • Résumé
        Modèle de taux d'intérêt d'inflexion Que Modèle de taux d'intérêt linéaire Beaucoup. Multiplicateur de taux d'intérêt annuel au point d'inflexion Et Taux de prêt du Fonds d'inflexion Ces deux paramètres.
    • updateJumpRateModelInternal
      • Aperçu du Code
        function updateJumpRateModelInternal(uint baseRatePerYear, uint multiplierPerYear, uint jumpMultiplierPerYear, uint kink_) internal {
                  
            baseRatePerBlock = baseRatePerYear.div(blocksPerYear);
            multiplierPerBlock = (multiplierPerYear.mul(1e18)).div(blocksPerYear.mul(kink_));
            jumpMultiplierPerBlock = jumpMultiplierPerYear.div(blocksPerYear);
            kink = kink_;
            emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink);
        }
        
      • Analyse des paramètres
        Fonctions updateJumpRateModelInternal Dans le 4 - Oui.,Ginseng out 0 - Oui.,Les explications correspondantes sont les suivantes::
        function updateJumpRateModelInternal(
            uint baseRatePerYear, //  Taux de référence annuel 
            uint multiplierPerYear //  Multiplicateur de taux d'intérêt annuel 
            uint jumpMultiplierPerYear, //  Multiplicateur de taux d'intérêt annuel au point d'inflexion 
            uint kink_, //  Taux de prêt du Fonds d'inflexion 
        ) internal {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Taux de référence du bloc  =  Taux de référence annuel  /  Nombre de blocs par an 
            baseRatePerBlock = baseRatePerYear.div(blocksPerYear);
            //  Multiplicateur de taux d'intérêt par bloc  =  Taux de référence annuel  / ( Nombre de blocs par an  *  Taux de prêt du Fonds d'inflexion )
            multiplierPerBlock = (multiplierPerYear.mul(1e18)).div(blocksPerYear.mul(kink_));
            //  Multiplicateur de taux d'intérêt du bloc d'inflexion  =  Multiplicateur de taux d'intérêt annuel au point d'inflexion  /  Nombre de blocs par an 
            jumpMultiplierPerBlock = jumpMultiplierPerYear.div(blocksPerYear);
            //  Enregistrer le taux de prêt du Fonds d'inflexion 
            kink = kink_;
            // Déclencheur d'événements NewInterestParams
            emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink);
        }
        
      • Résumé
        Modèle de taux d'intérêt d'inflexion Calcul intermédiaire Multiplicateur de taux d'intérêt par bloc Heure,Méthodes et Modèle de taux d'intérêt linéaire C'est différent: Taux de prêt du Fonds d'inflexion Plus haut., Multiplicateur de taux d'intérêt par bloc Plus bas., Le but n'est pas clair pour moi. .( Peut - être que plus le taux de prêt du Fonds d'inflexion est élevé, plus la profondeur du marché des jetons est grande. , Le multiplicateur de taux d'intérêt de bloc peut être fixé plus bas , On peut en discuter. )

Taux de prêt des fonds

  • Fonctions communes(Le contrat peut être invoqué à l'intérieur et à l'extérieur)
    • utilizationRate
      • Aperçu du Code
        function utilizationRate(uint cash, uint borrows, uint reserves) public pure returns (uint) {
                  
            if (borrows == 0) {
                  
                return 0;
            }
            return borrows.mul(1e18).div(cash.add(borrows).sub(reserves));
        }
        
      • Analyse des paramètres
        Fonctions utilizationRate Dans le 3 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        constructor(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves //  Total des jetons de réserve 
        ) public view returns (
            uint //  Taux de prêt des fonds 
        ){
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            //  Si le nombre total de jetons prêtés est  0, Le taux de prêt des fonds est également de  0
            if (borrows == 0) {
                  
                return 0;
            }
            //  Taux de prêt des fonds  = borrows * 1e18 / (cash + borrows - reserves)
            return borrows.mul(1e18).div(cash.add(borrows).sub(reserves));
        }
        
      • Résumé
        Modèle de taux d'intérêt d'inflexion Calcul intermédiaire Taux de prêt des fonds Et Modèle de taux d'intérêt linéaire Même chose..

Taux d'intérêt des fonds

  • Fonctions internes( Ne peut être invoqué qu'à l'intérieur du contrat )
    • getBorrowRate
      • Aperçu du Code
        function getBorrowRateInternal(uint cash, uint borrows, uint reserves) internal view returns (uint) {
                  
            uint util = utilizationRate(cash, borrows, reserves);
            if (util <= kink) {
                  
                return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
            } else {
                  
                uint normalRate = kink.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
                uint excessUtil = util.sub(kink);
                return excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(normalRate);
            }
        }
        
      • Analyse des paramètres
        Fonctions getBorrowRateInternal Dans le 3 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        function getBorrowRate(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves //  Total des jetons de réserve 
        ) internal view returns (
            uint //  Taux d'intérêt des prêts en bloc 
        ) {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        {
                  
            //  Obtenir le taux de prêt du Fonds  util
            uint util = utilizationRate(cash, borrows, reserves);
            // Si util < kink
            if (util <= kink) {
                  
                // return util * multiplierPerBlock + baseRatePerBlock
                return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
            } else {
                  
                //  Taux de prêt du bloc avant le point d'inflexion  = kink * multiplierPerBlock + baseRatePerBlock
                uint normalRate = kink.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
                //  Taux de prêt des fonds au - delà du point d'inflexion  = util - kink
                uint excessUtil = util.sub(kink);
                //  Taux d'intérêt des prêts en bloc  = (util - kink) * jumpMultiplierPerBlock + kink * multiplierPerBlock + baseRatePerBlock
                return excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(normalRate);
            }
        }
        
      • Résumé
        Modèle de taux d'intérêt d'inflexion Calcul intermédiaire Taux d'intérêt des prêts en bloc La formule est divisée en deux parties :In Taux de prêt des fonds Inférieur à Taux de prêt du Fonds d'inflexion Heure,La formule de calcul est:: Taux d'intérêt des prêts en bloc = Taux de prêt des fonds * Multiplicateur de taux d'intérêt par bloc + Taux de référence du bloc ;In Taux de prêt des fonds Supérieur à Taux de prêt du Fonds d'inflexion Heure,La formule de calcul est:: Taux d'intérêt des prêts en bloc = ( Taux de prêt des fonds - Taux de prêt du Fonds d'inflexion ) * Multiplicateur de taux d'intérêt du bloc d'inflexion + Taux de prêt du Fonds d'inflexion * Multiplicateur de taux d'intérêt par bloc + Taux de référence du bloc .
    • getSupplyRate
      • Aperçu du Code
        function getSupplyRate(uint cash, uint borrows, uint reserves, uint reserveFactorMantissa) public view returns (uint) {
                  
            uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa);
            uint borrowRate = getBorrowRateInternal(cash, borrows, reserves);
            uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18);
            return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18);
        }
        
      • Analyse des paramètres
        Fonctions getSupplyRate Dans le 4 - Oui.,Ginseng out 1 - Oui.,Les explications correspondantes sont les suivantes::
        getSupplyRate(
            uint cash, // Solde des jetons
            uint borrows, //  Nombre total de jetons prêtés par l'utilisateur 
            uint reserves, //  Total des jetons de réserve 
            uint reserveFactorMantissa //  Taux de réserve 
        ) public view returns (
            uint //  Taux d'intérêt du gage de bloc 
        ) {
                  
            ...
        }
        
      • Analyse de la mise en oeuvre
        ...
        {
                  
            // 1 - reserveFactorMantissa
            uint oneMinusReserveFactor = uint(1e18).sub(reserveFactorMantissa);
            //  Obtenir le taux d'intérêt du prêt  borrowRate
            uint borrowRate = getBorrowRateInternal(cash, borrows, reserves);
            // rateToPool = borrowRate * (1 - reserveFactorMantissa)
            uint rateToPool = borrowRate.mul(oneMinusReserveFactor).div(1e18);
            //  Taux d'intérêt du gage de bloc  = utilizationRate * borrowRate * (1 - reserveFactorMantissa)
            return utilizationRate(cash, borrows, reserves).mul(rateToPool).div(1e18);
        }
        
      • Résumé
        Modèle de taux d'intérêt d'inflexion Calcul intermédiaire Taux d'intérêt du nantissement de fonds Et Modèle de taux d'intérêt linéaire Même chose..
原网站

版权声明
本文为[33357]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/162/202206110721573325.html