@pendle/core-v2 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/LICENSE +100 -0
  2. package/contracts/SuperComposableYield/ISuperComposableYield.sol +68 -0
  3. package/contracts/SuperComposableYield/SCYUtils.sol +14 -0
  4. package/contracts/SuperComposableYield/implementations/RewardManager.sol +117 -0
  5. package/contracts/SuperComposableYield/implementations/SCYBase.sol +126 -0
  6. package/contracts/SuperComposableYield/implementations/SCYBaseWithRewards.sol +79 -0
  7. package/contracts/core/PendleBaseToken.sol +39 -0
  8. package/contracts/core/PendleMarket.sol +248 -0
  9. package/contracts/core/PendleMarketFactory.sol +60 -0
  10. package/contracts/core/PendleOwnershipToken.sol +44 -0
  11. package/contracts/core/PendleSCYImpl/AaveV3/PendleAaveV3SCY.sol +139 -0
  12. package/contracts/core/PendleSCYImpl/AaveV3/WadRayMath.sol +126 -0
  13. package/contracts/core/PendleSCYImpl/PendleBenQiErc20SCY.sol +127 -0
  14. package/contracts/core/PendleSCYImpl/PendleBtrflySCY.sol +125 -0
  15. package/contracts/core/PendleSCYImpl/PendleYearnVaultSCY.sol +115 -0
  16. package/contracts/core/PendleYieldContractFactory.sol +109 -0
  17. package/contracts/core/PendleYieldToken.sol +240 -0
  18. package/contracts/core/misc/BoringOwnable.sol +62 -0
  19. package/contracts/core/misc/BoringOwnableUpg.sol +64 -0
  20. package/contracts/core/misc/PendleJoeSwapHelperUpg.sol +82 -0
  21. package/contracts/core/router/PendleRouterCoreUpg.sol +219 -0
  22. package/contracts/core/router/PendleRouterProxy.sol +64 -0
  23. package/contracts/core/router/PendleRouterYTUpg.sol +134 -0
  24. package/contracts/core/router/base/PendleRouterOTBaseUpg.sol +218 -0
  25. package/contracts/core/router/base/PendleRouterSCYAndForgeBaseUpg.sol +141 -0
  26. package/contracts/core/router/base/PendleRouterYTBaseUpg.sol +212 -0
  27. package/contracts/interfaces/IAToken.sol +34 -0
  28. package/contracts/interfaces/IAavePool.sol +41 -0
  29. package/contracts/interfaces/IAaveRewardsController.sol +32 -0
  30. package/contracts/interfaces/IBenQiComptroller.sol +33 -0
  31. package/contracts/interfaces/IJoePair.sol +98 -0
  32. package/contracts/interfaces/IJoeRouter01.sol +162 -0
  33. package/contracts/interfaces/IPBaseToken.sol +9 -0
  34. package/contracts/interfaces/IPFlashCallBack.sol +10 -0
  35. package/contracts/interfaces/IPGovernanceManager.sol +28 -0
  36. package/contracts/interfaces/IPMarket.sol +57 -0
  37. package/contracts/interfaces/IPMarketAddRemoveCallback.sol +18 -0
  38. package/contracts/interfaces/IPMarketFactory.sol +8 -0
  39. package/contracts/interfaces/IPMarketSwapCallback.sol +10 -0
  40. package/contracts/interfaces/IPOwnershipToken.sol +15 -0
  41. package/contracts/interfaces/IPPermissionsV2.sol +28 -0
  42. package/contracts/interfaces/IPRouterCore.sol +108 -0
  43. package/contracts/interfaces/IPRouterYT.sol +47 -0
  44. package/contracts/interfaces/IPYieldContractFactory.sol +36 -0
  45. package/contracts/interfaces/IPYieldToken.sol +19 -0
  46. package/contracts/interfaces/IQiErc20.sol +35 -0
  47. package/contracts/interfaces/IQiToken.sol +29 -0
  48. package/contracts/interfaces/IREDACTEDStaking.sol +35 -0
  49. package/contracts/interfaces/IWETH.sol +34 -0
  50. package/contracts/interfaces/IWXBTRFLY.sol +37 -0
  51. package/contracts/interfaces/IYearnVault.sol +32 -0
  52. package/contracts/libraries/JoeLibrary.sol +121 -0
  53. package/contracts/libraries/SCYIndex.sol +55 -0
  54. package/contracts/libraries/helpers/ExpiryUtilsLib.sol +166 -0
  55. package/contracts/libraries/math/FixedPoint.sol +208 -0
  56. package/contracts/libraries/math/LogExpMath.sol +515 -0
  57. package/contracts/libraries/math/MarketApproxLib.sol +140 -0
  58. package/contracts/libraries/math/MarketMathLib.sol +606 -0
  59. package/contracts/periphery/PendleGovernanceManager.sol +36 -0
  60. package/contracts/periphery/PermissionsV2.sol +23 -0
  61. package/package.json +76 -0
  62. package/typechain-types/BoringOwnable.ts +194 -0
  63. package/typechain-types/BoringOwnableData.ts +100 -0
  64. package/typechain-types/BoringOwnableUpg.ts +194 -0
  65. package/typechain-types/BoringOwnableUpgData.ts +100 -0
  66. package/typechain-types/ERC1967UpgradeUpgradeable.ts +97 -0
  67. package/typechain-types/ERC20.ts +417 -0
  68. package/typechain-types/IAToken.ts +331 -0
  69. package/typechain-types/IAavePool.ts +192 -0
  70. package/typechain-types/IAaveRewardsController.ts +148 -0
  71. package/typechain-types/IBeaconUpgradeable.ts +87 -0
  72. package/typechain-types/IBenQiComptroller.ts +125 -0
  73. package/typechain-types/IERC1822ProxiableUpgradeable.ts +87 -0
  74. package/typechain-types/IERC20.ts +300 -0
  75. package/typechain-types/IERC20Metadata.ts +339 -0
  76. package/typechain-types/IJoePair.ts +888 -0
  77. package/typechain-types/IJoeRouter01.ts +1107 -0
  78. package/typechain-types/IPBaseToken.ts +365 -0
  79. package/typechain-types/IPFlashCallback.ts +115 -0
  80. package/typechain-types/IPGovernanceManager.ts +84 -0
  81. package/typechain-types/IPMarket.ts +701 -0
  82. package/typechain-types/IPMarketAddRemoveCallback.ts +169 -0
  83. package/typechain-types/IPMarketFactory.ts +109 -0
  84. package/typechain-types/IPMarketSwapCallback.ts +115 -0
  85. package/typechain-types/IPOwnershipToken.ts +488 -0
  86. package/typechain-types/IPRouterCore.ts +759 -0
  87. package/typechain-types/IPRouterYT.ts +405 -0
  88. package/typechain-types/IPYieldContractFactory.ts +192 -0
  89. package/typechain-types/IPYieldToken.ts +525 -0
  90. package/typechain-types/IPermissionsV2.ts +87 -0
  91. package/typechain-types/IQiErc20.ts +402 -0
  92. package/typechain-types/IQiToken.ts +327 -0
  93. package/typechain-types/IREDACTEDStaking.ts +216 -0
  94. package/typechain-types/ISuperComposableYield.ts +652 -0
  95. package/typechain-types/IWETH.ts +380 -0
  96. package/typechain-types/IWXBTRFLY.ts +254 -0
  97. package/typechain-types/IYearnVault.ts +152 -0
  98. package/typechain-types/PendleAaveV3SCY.ts +901 -0
  99. package/typechain-types/PendleBaseToken.ts +505 -0
  100. package/typechain-types/PendleBenQiErc20SCY.ts +914 -0
  101. package/typechain-types/PendleBtrflyScy.ts +794 -0
  102. package/typechain-types/PendleGovernanceManager.ts +187 -0
  103. package/typechain-types/PendleJoeSwapHelperUpg.ts +97 -0
  104. package/typechain-types/PendleMarket.ts +1008 -0
  105. package/typechain-types/PendleMarketFactory.ts +246 -0
  106. package/typechain-types/PendleOwnershipToken.ts +628 -0
  107. package/typechain-types/PendleRouterCoreUpg.ts +780 -0
  108. package/typechain-types/PendleRouterProxy.ts +417 -0
  109. package/typechain-types/PendleRouterSCYAndForgeBaseUpg.ts +98 -0
  110. package/typechain-types/PendleRouterYTBaseUpg.ts +134 -0
  111. package/typechain-types/PendleRouterYTUpg.ts +453 -0
  112. package/typechain-types/PendleYearnVaultScy.ts +784 -0
  113. package/typechain-types/PendleYieldContractFactory.ts +479 -0
  114. package/typechain-types/PendleYieldToken.ts +1030 -0
  115. package/typechain-types/PermissionsV2.ts +87 -0
  116. package/typechain-types/Proxy.ts +57 -0
  117. package/typechain-types/RewardManager.ts +172 -0
  118. package/typechain-types/SCYBase.ts +734 -0
  119. package/typechain-types/SCYBaseWithRewards.ts +819 -0
  120. package/typechain-types/UUPSUpgradeable.ts +197 -0
  121. package/typechain-types/common.ts +44 -0
  122. package/typechain-types/factories/BoringOwnableData__factory.ts +90 -0
  123. package/typechain-types/factories/BoringOwnableUpgData__factory.ts +94 -0
  124. package/typechain-types/factories/BoringOwnableUpg__factory.ts +139 -0
  125. package/typechain-types/factories/BoringOwnable__factory.ts +149 -0
  126. package/typechain-types/factories/ERC1967UpgradeUpgradeable__factory.ts +75 -0
  127. package/typechain-types/factories/ERC20__factory.ts +348 -0
  128. package/typechain-types/factories/IAToken__factory.ts +225 -0
  129. package/typechain-types/factories/IAavePool__factory.ts +99 -0
  130. package/typechain-types/factories/IAaveRewardsController__factory.ts +78 -0
  131. package/typechain-types/factories/IBeaconUpgradeable__factory.ts +39 -0
  132. package/typechain-types/factories/IBenQiComptroller__factory.ts +59 -0
  133. package/typechain-types/factories/IERC1822ProxiableUpgradeable__factory.ts +43 -0
  134. package/typechain-types/factories/IERC20Metadata__factory.ts +248 -0
  135. package/typechain-types/factories/IERC20__factory.ts +203 -0
  136. package/typechain-types/factories/IJoePair__factory.ts +674 -0
  137. package/typechain-types/factories/IJoeRouter01__factory.ts +772 -0
  138. package/typechain-types/factories/IPBaseToken__factory.ts +271 -0
  139. package/typechain-types/factories/IPFlashCallback__factory.ts +49 -0
  140. package/typechain-types/factories/IPGovernanceManager__factory.ts +39 -0
  141. package/typechain-types/factories/IPMarketAddRemoveCallback__factory.ts +86 -0
  142. package/typechain-types/factories/IPMarketFactory__factory.ts +58 -0
  143. package/typechain-types/factories/IPMarketSwapCallback__factory.ts +53 -0
  144. package/typechain-types/factories/IPMarket__factory.ts +559 -0
  145. package/typechain-types/factories/IPOwnershipToken__factory.ts +349 -0
  146. package/typechain-types/factories/IPRouterCore__factory.ts +516 -0
  147. package/typechain-types/factories/IPRouterYT__factory.ts +246 -0
  148. package/typechain-types/factories/IPYieldContractFactory__factory.ts +117 -0
  149. package/typechain-types/factories/IPYieldToken__factory.ts +383 -0
  150. package/typechain-types/factories/IPermissionsV2__factory.ts +39 -0
  151. package/typechain-types/factories/IQiErc20__factory.ts +270 -0
  152. package/typechain-types/factories/IQiToken__factory.ts +219 -0
  153. package/typechain-types/factories/IREDACTEDStaking__factory.ts +107 -0
  154. package/typechain-types/factories/ISuperComposableYield__factory.ts +438 -0
  155. package/typechain-types/factories/IWETH__factory.ts +261 -0
  156. package/typechain-types/factories/IWXBTRFLY__factory.ts +131 -0
  157. package/typechain-types/factories/IYearnVault__factory.ts +74 -0
  158. package/typechain-types/factories/PendleAaveV3SCY__factory.ts +727 -0
  159. package/typechain-types/factories/PendleBaseToken__factory.ts +386 -0
  160. package/typechain-types/factories/PendleBenQiErc20SCY__factory.ts +753 -0
  161. package/typechain-types/factories/PendleBtrflyScy__factory.ts +652 -0
  162. package/typechain-types/factories/PendleGovernanceManager__factory.ts +149 -0
  163. package/typechain-types/factories/PendleJoeSwapHelperUpg__factory.ts +56 -0
  164. package/typechain-types/factories/PendleMarketFactory__factory.ts +207 -0
  165. package/typechain-types/factories/PendleMarket__factory.ts +891 -0
  166. package/typechain-types/factories/PendleOwnershipToken__factory.ts +565 -0
  167. package/typechain-types/factories/PendleRouterCoreUpg__factory.ts +620 -0
  168. package/typechain-types/factories/PendleRouterProxy__factory.ts +316 -0
  169. package/typechain-types/factories/PendleRouterSCYAndForgeBaseUpg__factory.ts +56 -0
  170. package/typechain-types/factories/PendleRouterYTBaseUpg__factory.ts +66 -0
  171. package/typechain-types/factories/PendleRouterYTUpg__factory.ts +363 -0
  172. package/typechain-types/factories/PendleYearnVaultScy__factory.ts +630 -0
  173. package/typechain-types/factories/PendleYieldContractFactory__factory.ts +368 -0
  174. package/typechain-types/factories/PendleYieldToken__factory.ts +814 -0
  175. package/typechain-types/factories/PermissionsV2__factory.ts +36 -0
  176. package/typechain-types/factories/Proxy__factory.ts +28 -0
  177. package/typechain-types/factories/RewardManager__factory.ts +89 -0
  178. package/typechain-types/factories/SCYBaseWithRewards__factory.ts +535 -0
  179. package/typechain-types/factories/SCYBase__factory.ts +479 -0
  180. package/typechain-types/factories/UUPSUpgradeable__factory.ts +115 -0
  181. package/typechain-types/hardhat.d.ts +564 -0
  182. package/typechain-types/index.ts +122 -0
@@ -0,0 +1,127 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ pragma solidity 0.8.9;
3
+ pragma abicoder v2;
4
+ import "../../SuperComposableYield/implementations/SCYBaseWithRewards.sol";
5
+ import "../../interfaces/IQiErc20.sol";
6
+ import "../../interfaces/IBenQiComptroller.sol";
7
+ import "../../interfaces/IWETH.sol";
8
+
9
+ contract PendleBenQiErc20SCY is SCYBaseWithRewards {
10
+ using SafeERC20 for IERC20;
11
+
12
+ address public immutable underlying;
13
+ address public immutable QI;
14
+ address public immutable WAVAX;
15
+ address public immutable comptroller;
16
+ address public immutable qiToken;
17
+
18
+ uint256 public lastScyIndex;
19
+
20
+ constructor(
21
+ string memory _name,
22
+ string memory _symbol,
23
+ uint8 __scydecimals,
24
+ uint8 __assetDecimals,
25
+ address _underlying,
26
+ address _qiToken,
27
+ address _comptroller,
28
+ address _QI,
29
+ address _WAVAX
30
+ ) SCYBaseWithRewards(_name, _symbol, __scydecimals, __assetDecimals) {
31
+ underlying = _underlying;
32
+ qiToken = _qiToken;
33
+ QI = _QI;
34
+ WAVAX = _WAVAX;
35
+ comptroller = _comptroller;
36
+ IERC20(underlying).safeIncreaseAllowance(qiToken, type(uint256).max);
37
+ }
38
+
39
+ // solhint-disable no-empty-blocks
40
+ receive() external payable {}
41
+
42
+ /*///////////////////////////////////////////////////////////////
43
+ DEPOSIT/REDEEM USING BASE TOKENS
44
+ //////////////////////////////////////////////////////////////*/
45
+
46
+ function _deposit(address token, uint256 amountBase)
47
+ internal
48
+ virtual
49
+ override
50
+ returns (uint256 amountScyOut)
51
+ {
52
+ // qiToken -> scy is 1:1
53
+ if (token == qiToken) {
54
+ amountScyOut = amountBase;
55
+ } else {
56
+ IQiErc20(qiToken).mint(amountBase);
57
+ _afterSendToken(underlying);
58
+ amountScyOut = _afterReceiveToken(qiToken);
59
+ }
60
+ }
61
+
62
+ function _redeem(address token, uint256 amountScy)
63
+ internal
64
+ virtual
65
+ override
66
+ returns (uint256 amountBaseOut)
67
+ {
68
+ if (token == qiToken) {
69
+ amountBaseOut = amountScy;
70
+ } else {
71
+ // must be underlying
72
+ IQiErc20(qiToken).redeem(amountScy);
73
+ _afterSendToken(qiToken);
74
+ amountBaseOut = _afterReceiveToken(underlying);
75
+ }
76
+ }
77
+
78
+ /*///////////////////////////////////////////////////////////////
79
+ SCY-INDEX
80
+ //////////////////////////////////////////////////////////////*/
81
+
82
+ function scyIndexCurrent() public virtual override returns (uint256 res) {
83
+ res = FixedPoint.max(lastScyIndex, IQiToken(qiToken).exchangeRateCurrent());
84
+ lastScyIndex = res;
85
+ return res;
86
+ }
87
+
88
+ function scyIndexStored() public view override returns (uint256 res) {
89
+ res = lastScyIndex;
90
+ }
91
+
92
+ function getRewardTokens() public view override returns (address[] memory res) {
93
+ res = new address[](2);
94
+ res[0] = QI;
95
+ res[1] = WAVAX;
96
+ }
97
+
98
+ /*///////////////////////////////////////////////////////////////
99
+ MISC FUNCTIONS FOR METADATA
100
+ //////////////////////////////////////////////////////////////*/
101
+
102
+ function getBaseTokens() public view virtual override returns (address[] memory res) {
103
+ res = new address[](2);
104
+ res[0] = qiToken;
105
+ res[1] = underlying;
106
+ }
107
+
108
+ function isValidBaseToken(address token) public view virtual override returns (bool res) {
109
+ res = (token == underlying || token == qiToken);
110
+ }
111
+
112
+ /*///////////////////////////////////////////////////////////////
113
+ REWARDS-RELATED
114
+ //////////////////////////////////////////////////////////////*/
115
+
116
+ function _redeemExternalReward() internal override {
117
+ address[] memory holders = new address[](1);
118
+ address[] memory qiTokens = new address[](1);
119
+ holders[0] = address(this);
120
+ qiTokens[0] = qiToken;
121
+
122
+ IBenQiComptroller(comptroller).claimReward(0, holders, qiTokens, false, true);
123
+ IBenQiComptroller(comptroller).claimReward(1, holders, qiTokens, false, true);
124
+
125
+ if (address(this).balance != 0) IWETH(WAVAX).deposit{ value: address(this).balance };
126
+ }
127
+ }
@@ -0,0 +1,125 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ pragma solidity 0.8.9;
3
+ pragma abicoder v2;
4
+ import "../../SuperComposableYield/implementations/SCYBase.sol";
5
+ import "../../interfaces/IWXBTRFLY.sol";
6
+ import "../../interfaces/IREDACTEDStaking.sol";
7
+
8
+ contract PendleBtrflyScy is SCYBase {
9
+ using SafeERC20 for IERC20;
10
+
11
+ address public immutable BTRFLY;
12
+ address public immutable xBTRFLY;
13
+ address public immutable wxBTRFLY;
14
+
15
+ uint256 public lastScyIndex;
16
+
17
+ constructor(
18
+ string memory _name,
19
+ string memory _symbol,
20
+ uint8 __scydecimals,
21
+ uint8 __assetDecimals,
22
+ address _BTRFLY,
23
+ address _xBTRFLY,
24
+ address _wxBTRFLY
25
+ ) SCYBase(_name, _symbol, __scydecimals, __assetDecimals) {
26
+ BTRFLY = _BTRFLY;
27
+ xBTRFLY = _xBTRFLY;
28
+ wxBTRFLY = _wxBTRFLY;
29
+ IERC20(BTRFLY).safeIncreaseAllowance(wxBTRFLY, type(uint256).max);
30
+ IERC20(xBTRFLY).safeIncreaseAllowance(wxBTRFLY, type(uint256).max);
31
+ }
32
+
33
+ /*///////////////////////////////////////////////////////////////
34
+ DEPOSIT/REDEEM USING BASE TOKENS
35
+ //////////////////////////////////////////////////////////////*/
36
+ function _deposit(address token, uint256 amountBase)
37
+ internal
38
+ virtual
39
+ override
40
+ returns (uint256 amountScyOut)
41
+ {
42
+ if (token == BTRFLY) {
43
+ amountScyOut = IWXBTRFLY(wxBTRFLY).wrapFromBTRFLY(amountBase);
44
+ _afterSendToken(BTRFLY);
45
+ } else if (token == xBTRFLY) {
46
+ amountScyOut = IWXBTRFLY(wxBTRFLY).wrapFromxBTRFLY(amountBase);
47
+ _afterSendToken(xBTRFLY);
48
+ } else {
49
+ // 1 wxBTRFLY = 1 SCY
50
+ amountScyOut = amountBase;
51
+ }
52
+ }
53
+
54
+ function _redeem(address token, uint256 amountScy)
55
+ internal
56
+ virtual
57
+ override
58
+ returns (uint256 amountBaseOut)
59
+ {
60
+ if (token == BTRFLY) {
61
+ amountBaseOut = IWXBTRFLY(wxBTRFLY).unwrapToBTRFLY(amountScy);
62
+ _afterSendToken(wxBTRFLY);
63
+ } else if (token == xBTRFLY) {
64
+ amountBaseOut = IWXBTRFLY(wxBTRFLY).unwrapToxBTRFLY(amountScy);
65
+ _afterSendToken(wxBTRFLY);
66
+ } else {
67
+ // 1 wxBTRFLY = 1 SCY
68
+ amountBaseOut = amountScy;
69
+ }
70
+ }
71
+
72
+ /*///////////////////////////////////////////////////////////////
73
+ SCY-INDEX
74
+ //////////////////////////////////////////////////////////////*/
75
+
76
+ function scyIndexCurrent() public virtual override returns (uint256 res) {
77
+ res = FixedPoint.max(lastScyIndex, IWXBTRFLY(wxBTRFLY).xBTRFLYValue(FixedPoint.ONE));
78
+ lastScyIndex = res;
79
+ return res;
80
+ }
81
+
82
+ function scyIndexStored() public view override returns (uint256 res) {
83
+ res = lastScyIndex;
84
+ }
85
+
86
+ /*///////////////////////////////////////////////////////////////
87
+ MISC FUNCTIONS FOR METADATA
88
+ //////////////////////////////////////////////////////////////*/
89
+
90
+ function getBaseTokens() public view virtual override returns (address[] memory res) {
91
+ res = new address[](3);
92
+ res[0] = BTRFLY;
93
+ res[1] = xBTRFLY;
94
+ res[2] = wxBTRFLY;
95
+ }
96
+
97
+ function isValidBaseToken(address token) public view virtual override returns (bool res) {
98
+ res = (token == BTRFLY || token == xBTRFLY || token == wxBTRFLY);
99
+ }
100
+
101
+ /*///////////////////////////////////////////////////////////////
102
+ REWARDS-RELATED
103
+ //////////////////////////////////////////////////////////////*/
104
+
105
+ //solhint-disable-next-line no-empty-blocks
106
+ function redeemReward(address user, address receiver)
107
+ public
108
+ virtual
109
+ override
110
+ returns (uint256[] memory)
111
+ {}
112
+
113
+ //solhint-disable-next-line no-empty-blocks
114
+ function updateGlobalReward() public virtual override {}
115
+
116
+ //solhint-disable-next-line no-empty-blocks
117
+ function updateUserReward(address user) public virtual override {}
118
+
119
+ function getRewardTokens() public view virtual returns (address[] memory res) {
120
+ res = new address[](0);
121
+ }
122
+
123
+ //solhint-disable-next-line no-empty-blocks
124
+ function _redeemExternalReward() internal virtual {}
125
+ }
@@ -0,0 +1,115 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ pragma solidity 0.8.9;
3
+ pragma abicoder v2;
4
+ import "../../SuperComposableYield/implementations/SCYBase.sol";
5
+ import "../../interfaces/IYearnVault.sol";
6
+
7
+ contract PendleYearnVaultScy is SCYBase {
8
+ using SafeERC20 for IERC20;
9
+
10
+ address public immutable underlying;
11
+ address public immutable yvToken;
12
+
13
+ uint256 public lastScyIndex;
14
+
15
+ constructor(
16
+ string memory _name,
17
+ string memory _symbol,
18
+ uint8 __scydecimals,
19
+ uint8 __assetDecimals,
20
+ address _underlying,
21
+ address _yvToken
22
+ ) SCYBase(_name, _symbol, __scydecimals, __assetDecimals) {
23
+ yvToken = _yvToken;
24
+ underlying = _underlying;
25
+ IERC20(underlying).safeIncreaseAllowance(yvToken, type(uint256).max);
26
+ }
27
+
28
+ /*///////////////////////////////////////////////////////////////
29
+ DEPOSIT/REDEEM USING BASE TOKENS
30
+ //////////////////////////////////////////////////////////////*/
31
+
32
+ function _deposit(address token, uint256 amountBase)
33
+ internal
34
+ virtual
35
+ override
36
+ returns (uint256 amountScyOut)
37
+ {
38
+ if (token == yvToken) {
39
+ amountScyOut = amountBase;
40
+ } else {
41
+ // must be underlying
42
+ IYearnVault(yvToken).deposit(amountBase);
43
+ _afterSendToken(underlying);
44
+ amountScyOut = _afterReceiveToken(yvToken);
45
+ }
46
+ }
47
+
48
+ function _redeem(address token, uint256 amountScy)
49
+ internal
50
+ virtual
51
+ override
52
+ returns (uint256 amountBaseOut)
53
+ {
54
+ if (token == yvToken) {
55
+ amountBaseOut = amountScy;
56
+ } else {
57
+ // must be underlying
58
+ IYearnVault(yvToken).withdraw(amountScy);
59
+ _afterSendToken(yvToken);
60
+ amountBaseOut = _afterReceiveToken(underlying);
61
+ }
62
+ }
63
+
64
+ /*///////////////////////////////////////////////////////////////
65
+ SCY-INDEX
66
+ //////////////////////////////////////////////////////////////*/
67
+
68
+ function scyIndexCurrent() public virtual override returns (uint256 res) {
69
+ res = FixedPoint.max(lastScyIndex, IYearnVault(yvToken).pricePerShare());
70
+ lastScyIndex = res;
71
+ return res;
72
+ }
73
+
74
+ function scyIndexStored() public view override returns (uint256 res) {
75
+ res = lastScyIndex;
76
+ }
77
+
78
+ /*///////////////////////////////////////////////////////////////
79
+ MISC FUNCTIONS FOR METADATA
80
+ //////////////////////////////////////////////////////////////*/
81
+
82
+ function getBaseTokens() public view virtual override returns (address[] memory res) {
83
+ res = new address[](1);
84
+ res[0] = underlying;
85
+ }
86
+
87
+ function isValidBaseToken(address token) public view virtual override returns (bool res) {
88
+ res = (token == underlying);
89
+ }
90
+
91
+ /*///////////////////////////////////////////////////////////////
92
+ REWARDS-RELATED
93
+ //////////////////////////////////////////////////////////////*/
94
+
95
+ //solhint-disable-next-line no-empty-blocks
96
+ function redeemReward(address user, address receiver)
97
+ public
98
+ virtual
99
+ override
100
+ returns (uint256[] memory)
101
+ {}
102
+
103
+ //solhint-disable-next-line no-empty-blocks
104
+ function updateGlobalReward() public virtual override {}
105
+
106
+ //solhint-disable-next-line no-empty-blocks
107
+ function updateUserReward(address user) public virtual override {}
108
+
109
+ function getRewardTokens() public view virtual returns (address[] memory res) {
110
+ res = new address[](0);
111
+ }
112
+
113
+ //solhint-disable-next-line no-empty-blocks
114
+ function _redeemExternalReward() internal virtual {}
115
+ }
@@ -0,0 +1,109 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ /*
3
+ * MIT License
4
+ * ===========
5
+ *
6
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ * of this software and associated documentation files (the "Software"), to deal
8
+ * in the Software without restriction, including without limitation the rights
9
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ * copies of the Software, and to permit persons to whom the Software is
11
+ * furnished to do so, subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be included in all
14
+ * copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ */
23
+
24
+ pragma solidity 0.8.9;
25
+
26
+ import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
27
+ import "openzeppelin-solidity/contracts/utils/structs/EnumerableSet.sol";
28
+ import "../libraries/helpers/ExpiryUtilsLib.sol";
29
+ import "./misc/BoringOwnable.sol";
30
+ import "../interfaces/IPYieldContractFactory.sol";
31
+
32
+ import "./PendleOwnershipToken.sol";
33
+ import "./PendleYieldToken.sol";
34
+
35
+ contract PendleYieldContractFactory is BoringOwnable, IPYieldContractFactory {
36
+ using ExpiryUtils for string;
37
+
38
+ string public constant OT_PREFIX = "OT";
39
+ string public constant YT_PREFIX = "YT";
40
+
41
+ uint256 public expiryDivisor;
42
+ uint256 public interestFeeRate;
43
+ address public treasury;
44
+
45
+ // SCY => expiry => address
46
+ mapping(address => mapping(uint256 => address)) public getOT;
47
+ mapping(address => mapping(uint256 => address)) public getYT;
48
+
49
+ constructor(
50
+ uint256 _expiryDivisor,
51
+ uint256 _interestFeeRate,
52
+ address _treasury
53
+ ) BoringOwnable(msg.sender) {
54
+ expiryDivisor = _expiryDivisor;
55
+ interestFeeRate = _interestFeeRate;
56
+ treasury = _treasury;
57
+ }
58
+
59
+ function createYieldContract(address SCY, uint256 expiry)
60
+ external
61
+ returns (address OT, address YT)
62
+ {
63
+ require(expiry % expiryDivisor == 0, "must be multiple of divisor");
64
+
65
+ require(getOT[SCY][expiry] == address(0), "OT_EXISTED");
66
+
67
+ ISuperComposableYield _SCY = ISuperComposableYield(SCY);
68
+
69
+ uint8 assetDecimals = _SCY.assetDecimals();
70
+
71
+ OT = address(
72
+ new PendleOwnershipToken(
73
+ SCY,
74
+ OT_PREFIX.concat(_SCY.name(), expiry, " "),
75
+ OT_PREFIX.concat(_SCY.symbol(), expiry, "-"),
76
+ assetDecimals,
77
+ expiry
78
+ )
79
+ );
80
+
81
+ YT = address(
82
+ new PendleYieldToken(
83
+ SCY,
84
+ OT,
85
+ YT_PREFIX.concat(_SCY.name(), expiry, " "),
86
+ YT_PREFIX.concat(_SCY.symbol(), expiry, "-"),
87
+ assetDecimals,
88
+ expiry
89
+ )
90
+ );
91
+
92
+ IPOwnershipToken(OT).initialize(YT);
93
+
94
+ getOT[SCY][expiry] = OT;
95
+ getYT[SCY][expiry] = YT;
96
+ }
97
+
98
+ function setExpiryDivisor(uint256 newExpiryDivisor) external onlyOwner {
99
+ expiryDivisor = newExpiryDivisor;
100
+ }
101
+
102
+ function setInterestFeeRate(uint256 newInterestFeeRate) external onlyOwner {
103
+ interestFeeRate = newInterestFeeRate;
104
+ }
105
+
106
+ function setTreasury(address newTreasury) external onlyOwner {
107
+ treasury = newTreasury;
108
+ }
109
+ }