当前位置:网站首页>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
FonctionsconstructorDans 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 conclublockTaux d'intérêt en unités de temps ,Il est donc nécessaire debaseRatePerYearEtmultiplierPerYearConvertir enbaseRatePerBlockEtmultiplierPerBlock.Ici.blocksPerYearPour2102400, Est basé sur la moyenne15SecondesUnblockCalculé.
- Aperçu du Code
- constructor
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
FonctionsutilizationRateDans 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é
utilizationRateUtilisé pour calculer les jetonsTaux de prêt des fonds,Taux de prêt des fondsEst 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ésTaux de prêt des fondsIl n'y a pas assez de précision. ,Il faut donc multiplier par1e18, Étendre la plage de précision .
- Aperçu du Code
- utilizationRate
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
FonctionsgetBorrowRateDans 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é
getBorrowRateUtilisé pour calculer les jetonsTaux d'intérêt des prêts en bloc,Taux d'intérêt des prêts en blocEst 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 queTaux de prêt des fondsÉtendre la plage de précision ,Il faut diviser par1e18Obtenir la valeur réelle .
- Aperçu du Code
- 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
FonctionsgetSupplyRateDans 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é
getSupplyRateUtilisé pour calculer les jetonsTaux d'intérêt du gage de bloc,Taux d'intérêt du gage de blocEst 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 queTaux de prêt des fondsÉtendre la plage de précision ,Il faut diviser par1e18Obtenir la valeur réelle .
- Aperçu du Code
- getBorrowRate
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
FonctionsconstructorDans 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'inflexionQueModèle de taux d'intérêt linéaireBeaucoup.Multiplicateur de taux d'intérêt annuel au point d'inflexionEtTaux de prêt du Fonds d'inflexionCes deux paramètres.
- Aperçu du Code
- 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
FonctionsupdateJumpRateModelInternalDans 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'inflexionCalcul intermédiaireMultiplicateur de taux d'intérêt par blocHeure,Méthodes etModèle de taux d'intérêt linéaireC'est différent:Taux de prêt du Fonds d'inflexionPlus haut.,Multiplicateur de taux d'intérêt par blocPlus 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. )
- Aperçu du Code
- constructor
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
FonctionsutilizationRateDans 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'inflexionCalcul intermédiaireTaux de prêt des fondsEtModèle de taux d'intérêt linéaireMême chose..
- Aperçu du Code
- utilizationRate
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
FonctionsgetBorrowRateInternalDans 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'inflexionCalcul intermédiaireTaux d'intérêt des prêts en blocLa formule est divisée en deux parties :InTaux de prêt des fondsInférieur àTaux de prêt du Fonds d'inflexionHeure,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;InTaux de prêt des fondsSupérieur àTaux de prêt du Fonds d'inflexionHeure,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.
- Aperçu du Code
- 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
FonctionsgetSupplyRateDans 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'inflexionCalcul intermédiaireTaux d'intérêt du nantissement de fondsEtModèle de taux d'intérêt linéaireMême chose..
- Aperçu du Code
- getBorrowRate
边栏推荐
- Regular Expression Matching
- mybaits-puls 在xml文件中写sql语句 会报错 Invalid bound statement (not found):
- @JsonProperty注解
- [STL source code analysis] summary notes (5): a good helper for understanding iterators --list
- Leetcode-141. Linked List Cycle
- Leetcode-104. Maximum Depth of Binary Tree
- 如果要存 IP 地址,用什么数据类型比较好?99%人都会答错!
- Atomicinteger atomic operation class
- 【CF#693 (Div. 3)】B. Fair Division
- 【LeetCode】-- 17. Letter combination of telephone number
猜你喜欢

JVM learning record (VII) -- class loading process and parental delegation model
![[STL source code analysis] summary notes (10): hashtable exploration](/img/31/a77ac380dbd0f85957bd1df1b906f5.jpg)
[STL source code analysis] summary notes (10): hashtable exploration

QT 基于QScrollArea的界面嵌套移动

The difference between arrow function and ordinary function

教育专家王中泽老师多年经验分享:家庭教育不是附庸品

Gobang interface of mobile console (C language)

Modular notes

10 advanced concepts that must be understood in learning SQL

Directrix of ellipse
![[并发进阶]——线程池总结](/img/69/dc8146dafc30f8a8efa012b67aa05c.png)
[并发进阶]——线程池总结
随机推荐
农房一体脚本的心得记录
MS office level II wrong question record [4]
Notes on learning Es5 and ES6
Server parameter adjustment record
【CF#654 (Div. 2)】A. Magical Sticks
Education expert wangzhongze solves students' problems with one move
The difference between arrow function and ordinary function
2022 low voltage electrician operation certificate test question simulation test platform operation
Multi thread review summary parsing volatile keyword
Interview question 02.06 Palindrome linked list
Leetcode-104. Maximum Depth of Binary Tree
一、SQLServer2008安裝(帶密碼)、創建數據庫、C#窗體項目測試
[STL source code analysis] summary notes (12): functors and adapters
Modular notes
生物序列智能分析平台blog(1)
Bat (batch processing) processing special symbols (exclamation point, percent sign), etc
Software testing weekly (issue 75): only when you look down, can you see your true self.
Smart pointer (simple version)
Atom, the top stream editor, will leave the historical stage on December 15
P5431 [template] multiplicative inverse 2