@pendle/core-v2 0.7.1-beta → 0.8.0-beta

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 (294) hide show
  1. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/AaveV3/PendleAaveV3SCY.sol/PendleAaveV3SCY.dbg.json +1 -1
  2. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/AaveV3/PendleAaveV3SCY.sol/PendleAaveV3SCY.json +33 -17
  3. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/AaveV3/WadRayMath.sol/WadRayMath.dbg.json +1 -1
  4. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/AaveV3/WadRayMath.sol/WadRayMath.json +2 -2
  5. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenHelper.sol/PendleQiTokenHelper.dbg.json +1 -1
  6. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenHelper.sol/PendleQiTokenHelper.json +2 -2
  7. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenSCY.sol/PendleQiTokenSCY.dbg.json +1 -1
  8. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenSCY.sol/PendleQiTokenSCY.json +33 -17
  9. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleERC4626SCY.sol/PendleERC4626SCY.dbg.json +1 -1
  10. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleERC4626SCY.sol/PendleERC4626SCY.json +33 -17
  11. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleWstEthSCY.sol/PendleWstEthSCY.dbg.json +1 -1
  12. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleWstEthSCY.sol/PendleWstEthSCY.json +33 -17
  13. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleYearnVaultScy.sol/PendleYearnVaultSCY.dbg.json +1 -1
  14. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleYearnVaultScy.sol/PendleYearnVaultSCY.json +33 -17
  15. package/build/artifacts/contracts/SuperComposableYield/base-implementations/SCYBase.sol/SCYBase.dbg.json +1 -1
  16. package/build/artifacts/contracts/SuperComposableYield/base-implementations/SCYBase.sol/SCYBase.json +31 -15
  17. package/build/artifacts/contracts/SuperComposableYield/base-implementations/SCYBaseWithRewards.sol/SCYBaseWithRewards.dbg.json +1 -1
  18. package/build/artifacts/contracts/SuperComposableYield/base-implementations/SCYBaseWithRewards.sol/SCYBaseWithRewards.json +31 -15
  19. package/build/artifacts/contracts/core/LiquidityMining/CelerAbstracts/CelerReceiverUpg.sol/CelerReceiverUpg.dbg.json +1 -1
  20. package/build/artifacts/contracts/core/LiquidityMining/CelerAbstracts/CelerSenderUpg.sol/CelerSenderUpg.dbg.json +1 -1
  21. package/build/artifacts/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerBaseUpg.sol/PendleGaugeControllerBaseUpg.dbg.json +1 -1
  22. package/build/artifacts/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerMainchain.sol/PendleGaugeControllerMainchainUpg.dbg.json +1 -1
  23. package/build/artifacts/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerMainchain.sol/PendleGaugeControllerMainchainUpg.json +2 -2
  24. package/build/artifacts/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerSidechain.sol/PendleGaugeControllerSidechainUpg.dbg.json +1 -1
  25. package/build/artifacts/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerSidechain.sol/PendleGaugeControllerSidechainUpg.json +2 -2
  26. package/build/artifacts/contracts/core/LiquidityMining/PendleGauge.sol/PendleGauge.dbg.json +1 -1
  27. package/build/artifacts/contracts/core/LiquidityMining/PendleGauge.sol/PendleGauge.json +0 -26
  28. package/build/artifacts/contracts/core/LiquidityMining/VotingController/PendleVotingControllerUpg.sol/PendleVotingControllerUpg.dbg.json +1 -1
  29. package/build/artifacts/contracts/core/LiquidityMining/VotingController/PendleVotingControllerUpg.sol/PendleVotingControllerUpg.json +2 -2
  30. package/build/artifacts/contracts/core/LiquidityMining/VotingController/VotingControllerStorageUpg.sol/VotingControllerStorageUpg.dbg.json +1 -1
  31. package/build/artifacts/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleMainchain.sol/VotingEscrowPendleMainchain.dbg.json +1 -1
  32. package/build/artifacts/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleMainchain.sol/VotingEscrowPendleMainchain.json +2 -2
  33. package/build/artifacts/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleSidechain.sol/VotingEscrowPendleSidechain.dbg.json +1 -1
  34. package/build/artifacts/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleSidechain.sol/VotingEscrowPendleSidechain.json +2 -2
  35. package/build/artifacts/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowTokenBase.sol/VotingEscrowTokenBase.dbg.json +1 -1
  36. package/build/artifacts/contracts/core/Market/PendleMarket.sol/PendleMarket.dbg.json +1 -1
  37. package/build/artifacts/contracts/core/Market/PendleMarket.sol/PendleMarket.json +125 -111
  38. package/build/artifacts/contracts/core/Market/PendleMarketFactory.sol/PendleMarketFactory.dbg.json +1 -1
  39. package/build/artifacts/contracts/core/Market/PendleMarketFactory.sol/PendleMarketFactory.json +2 -2
  40. package/build/artifacts/contracts/core/PendleERC20.sol/PendleERC20.dbg.json +1 -1
  41. package/build/artifacts/contracts/core/PendleERC20.sol/PendleERC20.json +2 -2
  42. package/build/artifacts/contracts/core/PendleERC20Permit.sol/PendleERC20Permit.dbg.json +1 -1
  43. package/build/artifacts/contracts/core/PendleERC20Permit.sol/PendleERC20Permit.json +2 -2
  44. package/build/artifacts/contracts/core/PendleRouter.sol/PendleRouter.dbg.json +1 -1
  45. package/build/artifacts/contracts/core/PendleRouter.sol/PendleRouter.json +2 -2
  46. package/build/artifacts/contracts/core/YieldContracts/InterestManagerYT.sol/InterestManagerYT.dbg.json +1 -1
  47. package/build/artifacts/contracts/core/YieldContracts/PendlePrincipalToken.sol/PendlePrincipalToken.dbg.json +1 -1
  48. package/build/artifacts/contracts/core/YieldContracts/PendlePrincipalToken.sol/PendlePrincipalToken.json +77 -2
  49. package/build/artifacts/contracts/core/YieldContracts/PendleYieldContractFactory.sol/PendleYieldContractFactory.dbg.json +1 -1
  50. package/build/artifacts/contracts/core/YieldContracts/PendleYieldContractFactory.sol/PendleYieldContractFactory.json +51 -20
  51. package/build/artifacts/contracts/core/YieldContracts/PendleYieldToken.sol/PendleYieldToken.dbg.json +1 -1
  52. package/build/artifacts/contracts/core/YieldContracts/PendleYieldToken.sol/PendleYieldToken.json +72 -93
  53. package/build/artifacts/contracts/core/actions/ActionCallback.sol/ActionCallback.dbg.json +1 -1
  54. package/build/artifacts/contracts/core/actions/ActionCallback.sol/ActionCallback.json +2 -2
  55. package/build/artifacts/contracts/core/actions/ActionCore.sol/ActionCore.dbg.json +1 -1
  56. package/build/artifacts/contracts/core/actions/ActionCore.sol/ActionCore.json +3 -3
  57. package/build/artifacts/contracts/core/actions/ActionYT.sol/ActionYT.dbg.json +1 -1
  58. package/build/artifacts/contracts/core/actions/ActionYT.sol/ActionYT.json +2 -2
  59. package/build/artifacts/contracts/core/actions/base/ActionSCYAndPTBase.sol/ActionSCYAndPTBase.dbg.json +1 -1
  60. package/build/artifacts/contracts/core/actions/base/ActionSCYAndPYBase.sol/ActionSCYAndPYBase.dbg.json +1 -1
  61. package/build/artifacts/contracts/core/actions/base/ActionSCYAndYTBase.sol/ActionSCYAndYTBase.dbg.json +1 -1
  62. package/build/artifacts/contracts/core/actions/base/CallbackHelper.sol/CallbackHelper.dbg.json +1 -1
  63. package/build/artifacts/contracts/interfaces/IAToken.sol/IAToken.dbg.json +1 -1
  64. package/build/artifacts/contracts/interfaces/IAavePool.sol/IAavePool.dbg.json +1 -1
  65. package/build/artifacts/contracts/interfaces/IAaveRewardsController.sol/IAaveRewardsController.dbg.json +1 -1
  66. package/build/artifacts/contracts/interfaces/IBenQiComptroller.sol/IBenQiComptroller.dbg.json +1 -1
  67. package/build/artifacts/contracts/interfaces/IBenQiInterestRateModel.sol/IBenQiInterestRateModel.dbg.json +1 -1
  68. package/build/artifacts/contracts/interfaces/ICelerMessageBus.sol/ICelerMessageBus.dbg.json +1 -1
  69. package/build/artifacts/contracts/interfaces/ICelerMessageReceiverApp.sol/ICelerMessageReceiverApp.dbg.json +1 -1
  70. package/build/artifacts/contracts/interfaces/IERC4626.sol/IERC4626.dbg.json +1 -1
  71. package/build/artifacts/contracts/interfaces/IJoePair.sol/IJoePair.dbg.json +1 -1
  72. package/build/artifacts/contracts/interfaces/IJoeRouter01.sol/IJoeRouter01.dbg.json +1 -1
  73. package/build/artifacts/contracts/interfaces/IJoeRouter02.sol/IJoeRouter02.dbg.json +1 -1
  74. package/build/artifacts/contracts/interfaces/IPActionCore.sol/IPActionCore.dbg.json +1 -1
  75. package/build/artifacts/contracts/interfaces/IPActionCore.sol/IPActionCore.json +1 -1
  76. package/build/artifacts/contracts/interfaces/IPActionYT.sol/IPActionYT.dbg.json +1 -1
  77. package/build/artifacts/contracts/interfaces/IPAllAction.sol/IPAllAction.dbg.json +1 -1
  78. package/build/artifacts/contracts/interfaces/IPAllAction.sol/IPAllAction.json +1 -1
  79. package/build/artifacts/contracts/interfaces/IPGaugeController.sol/IPGaugeController.dbg.json +1 -1
  80. package/build/artifacts/contracts/interfaces/IPGaugeControllerMainchain.sol/IPGaugeControllerMainchain.dbg.json +1 -1
  81. package/build/artifacts/contracts/interfaces/IPGovernanceManager.sol/IPGovernanceManager.dbg.json +1 -1
  82. package/build/artifacts/contracts/interfaces/IPInterestManagerYT.sol/IPInterestManagerYT.dbg.json +1 -1
  83. package/build/artifacts/contracts/interfaces/IPMarket.sol/IPMarket.dbg.json +1 -1
  84. package/build/artifacts/contracts/interfaces/IPMarket.sol/IPMarket.json +48 -83
  85. package/build/artifacts/contracts/interfaces/IPMarketFactory.sol/IPMarketFactory.dbg.json +1 -1
  86. package/build/artifacts/contracts/interfaces/IPMarketSwapCallback.sol/IPMarketSwapCallback.dbg.json +1 -1
  87. package/build/artifacts/contracts/interfaces/IPPermissionsV2Upg.sol/IPermissionsV2Upg.dbg.json +1 -1
  88. package/build/artifacts/contracts/interfaces/IPPrincipalToken.sol/IPPrincipalToken.dbg.json +1 -1
  89. package/build/artifacts/contracts/interfaces/IPRouterStatic.sol/IPRouterStatic.dbg.json +1 -1
  90. package/build/artifacts/contracts/interfaces/IPRouterStatic.sol/IPRouterStatic.json +20 -15
  91. package/build/artifacts/contracts/interfaces/IPVeToken.sol/IPVeToken.dbg.json +1 -1
  92. package/build/artifacts/contracts/interfaces/IPVotingController.sol/IPVotingController.dbg.json +1 -1
  93. package/build/artifacts/contracts/interfaces/IPVotingEscrow.sol/IPVotingEscrow.dbg.json +1 -1
  94. package/build/artifacts/contracts/interfaces/IPYieldContractFactory.sol/IPYieldContractFactory.dbg.json +1 -1
  95. package/build/artifacts/contracts/interfaces/IPYieldContractFactory.sol/IPYieldContractFactory.json +30 -4
  96. package/build/artifacts/contracts/interfaces/IPYieldToken.sol/IPYieldToken.dbg.json +1 -1
  97. package/build/artifacts/contracts/interfaces/IPYieldToken.sol/IPYieldToken.json +8 -92
  98. package/build/artifacts/contracts/interfaces/IQiAvax.sol/IQiAvax.dbg.json +1 -1
  99. package/build/artifacts/contracts/interfaces/IQiErc20.sol/IQiErc20.dbg.json +1 -1
  100. package/build/artifacts/contracts/interfaces/IQiToken.sol/IQiToken.dbg.json +1 -1
  101. package/build/artifacts/contracts/interfaces/IREDACTEDStaking.sol/IREDACTEDStaking.dbg.json +1 -1
  102. package/build/artifacts/contracts/interfaces/IRewardManager.sol/IRewardManager.dbg.json +1 -1
  103. package/build/artifacts/contracts/interfaces/ISuperComposableYield.sol/ISuperComposableYield.dbg.json +1 -1
  104. package/build/artifacts/contracts/interfaces/ISuperComposableYield.sol/ISuperComposableYield.json +31 -2
  105. package/build/artifacts/contracts/interfaces/IWETH.sol/IWETH.dbg.json +1 -1
  106. package/build/artifacts/contracts/interfaces/IWXBTRFLY.sol/IWXBTRFLY.dbg.json +1 -1
  107. package/build/artifacts/contracts/interfaces/IWstETH.sol/IWstETH.dbg.json +1 -1
  108. package/build/artifacts/contracts/interfaces/IYearnVault.sol/IYearnVault.dbg.json +1 -1
  109. package/build/artifacts/contracts/libraries/RewardManager.sol/RewardManager.dbg.json +1 -1
  110. package/build/artifacts/contracts/libraries/RewardManagerAbstract.sol/RewardManagerAbstract.dbg.json +1 -1
  111. package/build/artifacts/contracts/libraries/SCY/SCYIndex.sol/SCYIndexLib.dbg.json +1 -1
  112. package/build/artifacts/contracts/libraries/SCY/SCYIndex.sol/SCYIndexLib.json +2 -2
  113. package/build/artifacts/contracts/libraries/SCY/SCYUtils.sol/SCYUtils.dbg.json +1 -1
  114. package/build/artifacts/contracts/libraries/SCY/SCYUtils.sol/SCYUtils.json +2 -2
  115. package/build/artifacts/contracts/libraries/VeBalanceLib.sol/VeBalanceLib.dbg.json +1 -1
  116. package/build/artifacts/contracts/libraries/VeBalanceLib.sol/VeBalanceLib.json +2 -2
  117. package/build/artifacts/contracts/libraries/VeHistoryLib.sol/Checkpoints.dbg.json +1 -1
  118. package/build/artifacts/contracts/libraries/VeHistoryLib.sol/Checkpoints.json +2 -2
  119. package/build/artifacts/contracts/libraries/helpers/ArrayLib.sol/ArrayLib.dbg.json +1 -1
  120. package/build/artifacts/contracts/libraries/helpers/ArrayLib.sol/ArrayLib.json +2 -2
  121. package/build/artifacts/contracts/libraries/helpers/ExpiryUtilsLib.sol/ExpiryUtils.dbg.json +1 -1
  122. package/build/artifacts/contracts/libraries/helpers/ExpiryUtilsLib.sol/ExpiryUtils.json +2 -2
  123. package/build/artifacts/contracts/libraries/helpers/MiniHelpers.sol/MiniHelpers.dbg.json +1 -1
  124. package/build/artifacts/contracts/libraries/helpers/MiniHelpers.sol/MiniHelpers.json +2 -2
  125. package/build/artifacts/contracts/libraries/helpers/SSTORE2Deployer.sol/SSTORE2Deployer.dbg.json +1 -1
  126. package/build/artifacts/contracts/libraries/helpers/SSTORE2Deployer.sol/SSTORE2Deployer.json +2 -2
  127. package/build/artifacts/contracts/libraries/helpers/TokenHelper.sol/TokenHelper.dbg.json +1 -1
  128. package/build/artifacts/contracts/libraries/math/LogExpMath.sol/LogExpMath.dbg.json +1 -1
  129. package/build/artifacts/contracts/libraries/math/LogExpMath.sol/LogExpMath.json +2 -2
  130. package/build/artifacts/contracts/libraries/math/MarketApproxLib.sol/MarketApproxLib.dbg.json +1 -1
  131. package/build/artifacts/contracts/libraries/math/MarketApproxLib.sol/MarketApproxLib.json +2 -2
  132. package/build/artifacts/contracts/libraries/math/MarketMathCore.sol/MarketMathCore.dbg.json +1 -1
  133. package/build/artifacts/contracts/libraries/math/MarketMathCore.sol/MarketMathCore.json +2 -2
  134. package/build/artifacts/contracts/libraries/math/Math.sol/Math.dbg.json +1 -1
  135. package/build/artifacts/contracts/libraries/math/Math.sol/Math.json +2 -2
  136. package/build/artifacts/contracts/libraries/math/WeekMath.sol/WeekMath.dbg.json +1 -1
  137. package/build/artifacts/contracts/libraries/math/WeekMath.sol/WeekMath.json +2 -2
  138. package/build/artifacts/contracts/libraries/solmate/SSTORE2.sol/SSTORE2.dbg.json +1 -1
  139. package/build/artifacts/contracts/libraries/solmate/SSTORE2.sol/SSTORE2.json +2 -2
  140. package/build/artifacts/contracts/libraries/traderjoe/JoeLibrary.sol/JoeLibrary.dbg.json +1 -1
  141. package/build/artifacts/contracts/libraries/traderjoe/JoeLibrary.sol/JoeLibrary.json +2 -2
  142. package/build/artifacts/contracts/libraries/traderjoe/PendleJoeSwapHelperUpg.sol/PendleJoeSwapHelperUpg.dbg.json +1 -1
  143. package/build/artifacts/contracts/offchain-helpers/RouterStatic.sol/RouterStatic.dbg.json +1 -1
  144. package/build/artifacts/contracts/offchain-helpers/RouterStatic.sol/RouterStatic.json +166 -13
  145. package/build/artifacts/contracts/periphery/PendleGovernanceManager.sol/PendleGovernanceManager.dbg.json +1 -1
  146. package/build/artifacts/contracts/periphery/PendleGovernanceManager.sol/PendleGovernanceManager.json +2 -2
  147. package/build/artifacts/contracts/periphery/PermissionsV2Upg.sol/PermissionsV2Upg.dbg.json +1 -1
  148. package/contracts/SuperComposableYield/SCY-implementations/AaveV3/PendleAaveV3SCY.sol +16 -12
  149. package/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenHelper.sol +3 -3
  150. package/contracts/SuperComposableYield/SCY-implementations/BenQi/PendleQiTokenSCY.sol +20 -0
  151. package/contracts/SuperComposableYield/SCY-implementations/PendleERC4626SCY.sol +20 -0
  152. package/contracts/SuperComposableYield/SCY-implementations/PendleWstEthSCY.sol +20 -0
  153. package/contracts/SuperComposableYield/SCY-implementations/PendleYearnVaultScy.sol +29 -2
  154. package/contracts/SuperComposableYield/base-implementations/SCYBase.sol +63 -41
  155. package/contracts/SuperComposableYield/base-implementations/SCYBaseWithRewards.sol +0 -7
  156. package/contracts/core/LiquidityMining/GaugeController/PendleGaugeControllerBaseUpg.sol +1 -1
  157. package/contracts/core/LiquidityMining/PendleGauge.sol +24 -8
  158. package/contracts/core/LiquidityMining/VotingController/PendleVotingControllerUpg.sol +47 -96
  159. package/contracts/core/LiquidityMining/VotingController/VotingControllerStorageUpg.sol +86 -73
  160. package/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleMainchain.sol +17 -16
  161. package/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowPendleSidechain.sol +1 -1
  162. package/contracts/core/LiquidityMining/VotingEscrow/VotingEscrowTokenBase.sol +3 -4
  163. package/contracts/core/Market/PendleMarket.sol +32 -62
  164. package/contracts/core/PendleRouter.sol +1 -1
  165. package/contracts/core/YieldContracts/InterestManagerYT.sol +11 -8
  166. package/contracts/core/YieldContracts/PendlePrincipalToken.sol +3 -3
  167. package/contracts/core/YieldContracts/PendleYieldContractFactory.sol +18 -12
  168. package/contracts/core/YieldContracts/PendleYieldToken.sol +167 -140
  169. package/contracts/core/actions/ActionCallback.sol +11 -10
  170. package/contracts/core/actions/ActionCore.sol +84 -22
  171. package/contracts/core/actions/ActionYT.sol +33 -15
  172. package/contracts/core/actions/base/ActionSCYAndPTBase.sol +4 -15
  173. package/contracts/core/actions/base/ActionSCYAndPYBase.sol +20 -50
  174. package/contracts/core/actions/base/ActionSCYAndYTBase.sol +2 -12
  175. package/contracts/interfaces/IPActionCore.sol +72 -1
  176. package/contracts/interfaces/IPActionYT.sol +15 -0
  177. package/contracts/interfaces/IPMarket.sol +7 -26
  178. package/contracts/interfaces/IPRouterStatic.sol +67 -47
  179. package/contracts/interfaces/IPVeToken.sol +0 -2
  180. package/contracts/interfaces/IPVotingEscrow.sol +1 -1
  181. package/contracts/interfaces/IPYieldContractFactory.sol +6 -2
  182. package/contracts/interfaces/IPYieldToken.sol +21 -11
  183. package/contracts/interfaces/ISuperComposableYield.sol +22 -28
  184. package/contracts/interfaces/IYearnVault.sol +8 -0
  185. package/contracts/libraries/RewardManager.sol +9 -6
  186. package/contracts/libraries/RewardManagerAbstract.sol +6 -8
  187. package/contracts/libraries/SCY/SCYIndex.sol +10 -0
  188. package/contracts/libraries/VeBalanceLib.sol +0 -1
  189. package/contracts/libraries/helpers/ArrayLib.sol +11 -0
  190. package/contracts/libraries/helpers/TokenHelper.sol +6 -5
  191. package/contracts/libraries/math/MarketApproxLib.sol +91 -36
  192. package/contracts/libraries/math/Math.sol +2 -4
  193. package/contracts/offchain-helpers/RouterStatic.sol +144 -115
  194. package/deployments/43113-core.json +11 -9
  195. package/deployments/43113-markets/benqi-market-0xF3150c14F776c50C9D397054d38979c7B77FC41D.json +7 -0
  196. package/deployments/80001-core.json +10 -8
  197. package/deployments/80001-markets/benqi-market-0x150b6eb90Bf636eC0c4328d13d1e1d4adDBAF904.json +7 -0
  198. package/package.json +2 -2
  199. package/typechain-types/ActionCore.ts +8 -8
  200. package/typechain-types/CelerReceiver.ts +267 -0
  201. package/typechain-types/CelerSender.ts +164 -0
  202. package/typechain-types/IPActionCore.ts +8 -8
  203. package/typechain-types/IPAllAction.ts +8 -8
  204. package/typechain-types/IPMarket.ts +66 -109
  205. package/typechain-types/IPRouterStatic.ts +64 -41
  206. package/typechain-types/IPVotingEscrowController.ts +154 -0
  207. package/typechain-types/IPYieldContractFactory.ts +34 -0
  208. package/typechain-types/IPYieldToken.ts +12 -112
  209. package/typechain-types/ISuperComposableYield.ts +54 -10
  210. package/typechain-types/PendleAaveV3SCY.ts +54 -29
  211. package/typechain-types/PendleBtrflyScy.ts +56 -58
  212. package/typechain-types/PendleERC4626SCY.ts +54 -29
  213. package/typechain-types/PendleGauge.ts +0 -32
  214. package/typechain-types/PendleGaugeController.ts +282 -0
  215. package/typechain-types/PendleGaugeControllerMainchain.ts +346 -0
  216. package/typechain-types/PendleGaugeControllerSidechain.ts +460 -0
  217. package/typechain-types/PendleJoeLpSCY.ts +56 -58
  218. package/typechain-types/PendleMarket.ts +169 -140
  219. package/typechain-types/PendlePrincipalToken.ts +104 -0
  220. package/typechain-types/PendleQiTokenSCY.ts +54 -29
  221. package/typechain-types/PendleVotingController.ts +865 -0
  222. package/typechain-types/PendleWstEthSCY.ts +54 -29
  223. package/typechain-types/PendleYearnVaultSCY.ts +54 -29
  224. package/typechain-types/PendleYieldContractFactory.ts +66 -19
  225. package/typechain-types/PendleYieldToken.ts +122 -158
  226. package/typechain-types/RouterStatic.ts +297 -24
  227. package/typechain-types/SCYBase.ts +54 -29
  228. package/typechain-types/SCYBaseWithRewards.ts +54 -29
  229. package/typechain-types/VotingControllerStorage.ts +410 -0
  230. package/typechain-types/VotingEscrowController.ts +154 -0
  231. package/typechain-types/VotingEscrowToken.ts +335 -0
  232. package/typechain-types/factories/ActionCallback__factory.ts +1 -1
  233. package/typechain-types/factories/ActionCore__factory.ts +2 -2
  234. package/typechain-types/factories/ActionYT__factory.ts +1 -1
  235. package/typechain-types/factories/CelerReceiver__factory.ts +140 -0
  236. package/typechain-types/factories/CelerSender__factory.ts +67 -0
  237. package/typechain-types/factories/ERC20__factory.ts +1 -1
  238. package/typechain-types/factories/IPActionCore__factory.ts +1 -1
  239. package/typechain-types/factories/IPAllAction__factory.ts +1 -1
  240. package/typechain-types/factories/IPMarket__factory.ts +48 -83
  241. package/typechain-types/factories/IPRouterStatic__factory.ts +20 -15
  242. package/typechain-types/factories/IPVotingEscrowController__factory.ts +80 -0
  243. package/typechain-types/factories/IPYieldContractFactory__factory.ts +30 -4
  244. package/typechain-types/factories/IPYieldToken__factory.ts +6 -90
  245. package/typechain-types/factories/ISuperComposableYield__factory.ts +31 -2
  246. package/typechain-types/factories/PendleAaveV3SCY__factory.ts +32 -16
  247. package/typechain-types/factories/PendleBtrflyScy__factory.ts +52 -28
  248. package/typechain-types/factories/PendleERC20Permit__factory.ts +1 -1
  249. package/typechain-types/factories/PendleERC20__factory.ts +1 -1
  250. package/typechain-types/factories/PendleERC4626SCY__factory.ts +32 -16
  251. package/typechain-types/factories/PendleGaugeControllerMainchainUpg__factory.ts +1 -1
  252. package/typechain-types/factories/PendleGaugeControllerMainchain__factory.ts +269 -0
  253. package/typechain-types/factories/PendleGaugeControllerSidechainUpg__factory.ts +1 -1
  254. package/typechain-types/factories/PendleGaugeControllerSidechain__factory.ts +328 -0
  255. package/typechain-types/factories/PendleGaugeController__factory.ts +149 -0
  256. package/typechain-types/factories/PendleGauge__factory.ts +0 -26
  257. package/typechain-types/factories/PendleGovernanceManager__factory.ts +1 -1
  258. package/typechain-types/factories/PendleJoeLpSCY__factory.ts +34 -28
  259. package/typechain-types/factories/PendleMarketFactory__factory.ts +1 -1
  260. package/typechain-types/factories/PendleMarket__factory.ts +124 -110
  261. package/typechain-types/factories/PendlePrincipalToken__factory.ts +76 -1
  262. package/typechain-types/factories/PendleQiTokenHelper__factory.ts +1 -1
  263. package/typechain-types/factories/PendleQiTokenSCY__factory.ts +32 -16
  264. package/typechain-types/factories/PendleRouter__factory.ts +1 -1
  265. package/typechain-types/factories/PendleVotingControllerUpg__factory.ts +1 -1
  266. package/typechain-types/factories/PendleVotingController__factory.ts +584 -0
  267. package/typechain-types/factories/PendleWstEthSCY__factory.ts +32 -16
  268. package/typechain-types/factories/PendleYearnVaultSCY__factory.ts +32 -16
  269. package/typechain-types/factories/PendleYieldContractFactory__factory.ts +54 -19
  270. package/typechain-types/factories/PendleYieldToken__factory.ts +70 -91
  271. package/typechain-types/factories/RouterStatic__factory.ts +165 -12
  272. package/typechain-types/factories/SCYBaseWithRewards__factory.ts +31 -15
  273. package/typechain-types/factories/SCYBase__factory.ts +31 -15
  274. package/typechain-types/factories/VotingControllerStorage__factory.ts +298 -0
  275. package/typechain-types/factories/VotingEscrowController__factory.ts +80 -0
  276. package/typechain-types/factories/VotingEscrowPendleMainchain__factory.ts +1 -1
  277. package/typechain-types/factories/VotingEscrowPendleSidechain__factory.ts +1 -1
  278. package/typechain-types/factories/VotingEscrowToken__factory.ts +225 -0
  279. package/typechain-types/hardhat.d.ts +0 -27
  280. package/typechain-types/index.ts +0 -6
  281. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleBtrflySCY.sol/PendleBtrflyScy.dbg.json +0 -4
  282. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleBtrflySCY.sol/PendleBtrflyScy.json +0 -635
  283. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleJoeLpSCY.sol/PendleJoeLpSCY.dbg.json +0 -4
  284. package/build/artifacts/contracts/SuperComposableYield/SCY-implementations/PendleJoeLpSCY.sol/PendleJoeLpSCY.json +0 -653
  285. package/build/artifacts/contracts/interfaces/IPMarketAddRemoveCallback.sol/IPMarketAddRemoveCallback.dbg.json +0 -4
  286. package/build/artifacts/contracts/interfaces/IPMarketAddRemoveCallback.sol/IPMarketAddRemoveCallback.json +0 -67
  287. package/build/artifacts/contracts/libraries/solmate/Bytes32AddressLib.sol/Bytes32AddressLib.dbg.json +0 -4
  288. package/build/artifacts/contracts/libraries/solmate/Bytes32AddressLib.sol/Bytes32AddressLib.json +0 -10
  289. package/contracts/SuperComposableYield/SCY-implementations/PendleBtrflySCY.sol +0 -123
  290. package/contracts/SuperComposableYield/SCY-implementations/PendleJoeLpSCY.sol +0 -245
  291. package/contracts/interfaces/IPMarketAddRemoveCallback.sol +0 -18
  292. package/contracts/libraries/solmate/Bytes32AddressLib.sol +0 -14
  293. package/deployments/43113-markets/benqi-market.json +0 -7
  294. package/deployments/80001-markets/benqi-market.json +0 -7
@@ -13,20 +13,17 @@ import "../../interfaces/IPYieldContractFactory.sol";
13
13
  import "../../libraries/SCY/SCYUtils.sol";
14
14
  import "../../libraries/helpers/MiniHelpers.sol";
15
15
  import "../../libraries/RewardManagerAbstract.sol";
16
- import "../PendleERC20.sol";
16
+ import "../PendleERC20Permit.sol";
17
17
  import "./InterestManagerYT.sol";
18
18
 
19
- /*
20
- With YT yielding more SCYs overtime, which is allowed to be redeemed by users, the reward distribution should
21
- be based on the amount of SCYs that their YT currently represent, plus with their dueInterest.
22
-
23
- It has been proven and tested that totalScyRedeemable will not change over time, unless users redeem their interest or redeemPY.
24
-
25
- Due to this, it is required to update users' accruedReward STRICTLY BEFORE redeeming their interest.
19
+ /**
20
+ Invariances to maintain:
21
+ - address(0) & address(this) should never have any rewards & activeBalance accounting done. This is
22
+ guaranteed by address(0) & address(this) check in each updateForTwo function
26
23
  */
27
24
  contract PendleYieldToken is
28
25
  IPYieldToken,
29
- PendleERC20,
26
+ PendleERC20Permit,
30
27
  RewardManagerAbstract,
31
28
  InterestManagerYT
32
29
  {
@@ -34,10 +31,11 @@ contract PendleYieldToken is
34
31
  using SafeERC20 for IERC20;
35
32
  using ArrayLib for uint256[];
36
33
 
37
- struct AfterExpiryData {
38
- bool isFinalized;
34
+ struct PostExpiryData {
39
35
  uint128 firstScyIndex;
40
- uint256[] firstRewardIndexes;
36
+ uint128 totalScyInterestForTreasury;
37
+ mapping(address => uint256) firstRewardIndex;
38
+ mapping(address => uint256) userRewardOwed;
41
39
  }
42
40
 
43
41
  address public immutable SCY;
@@ -48,9 +46,10 @@ contract PendleYieldToken is
48
46
  uint128 public scyReserve;
49
47
  uint128 internal _scyIndexStored;
50
48
 
51
- AfterExpiryData public afterExpiry;
49
+ PostExpiryData public postExpiry;
52
50
 
53
- modifier updateScyReserve() {
51
+ modifier updateData() {
52
+ if (isExpired()) _setPostExpiryData();
54
53
  _;
55
54
  _updateScyReserve();
56
55
  }
@@ -62,7 +61,7 @@ contract PendleYieldToken is
62
61
  string memory _symbol,
63
62
  uint8 __decimals,
64
63
  uint256 _expiry
65
- ) PendleERC20(_name, _symbol, __decimals) {
64
+ ) PendleERC20Permit(_name, _symbol, __decimals) {
66
65
  SCY = _SCY;
67
66
  PT = _PT;
68
67
  expiry = _expiry;
@@ -73,7 +72,7 @@ contract PendleYieldToken is
73
72
  function mintPY(address receiverPT, address receiverYT)
74
73
  external
75
74
  nonReentrant
76
- updateScyReserve
75
+ updateData
77
76
  returns (uint256 amountPYOut)
78
77
  {
79
78
  require(!isExpired(), "yield contract expired");
@@ -85,114 +84,109 @@ contract PendleYieldToken is
85
84
  _mint(receiverYT, amountPYOut);
86
85
 
87
86
  IPPrincipalToken(PT).mintByYT(receiverPT, amountPYOut);
88
-
89
- emit Mint(msg.sender, receiverPT, receiverYT, amountPYOut);
90
87
  }
91
88
 
92
89
  /// @dev this function converts PY tokens into scy, but interests & rewards are not redeemed at the same time
93
90
  function redeemPY(address receiver)
94
91
  external
95
92
  nonReentrant
96
- updateScyReserve
93
+ updateData
97
94
  returns (uint256 amountScyOut)
98
95
  {
99
96
  address[] memory receivers = new address[](1);
100
97
  uint256[] memory amounts = new uint256[](1);
101
- (receivers[0], amounts[0]) = (receiver, type(uint256).max);
98
+ (receivers[0], amounts[0]) = (receiver, _getAmountPYToRedeem());
102
99
 
103
- (amountScyOut, ) = _redeemPY(receivers, amounts);
100
+ uint256[] memory amountScyOuts;
101
+ amountScyOuts = _redeemPY(receivers, amounts);
104
102
 
105
- emit Redeem(msg.sender, receiver, amountScyOut);
103
+ amountScyOut = amountScyOuts[0];
106
104
  }
107
105
 
108
106
  /// @dev this function limit how much each receiver will receive. For example, if the totalOut is 100,
109
107
  /// and the max are 50 30 INF, the first receiver will receive 50, the second will receive 30, and the third will receive 20.
110
108
  /// @dev intended to mostly be used by Pendle router
111
- function redeemPY(address[] memory receivers, uint256[] memory maxAmountScyOuts)
109
+ function redeemPYMulti(address[] calldata receivers, uint256[] calldata amountPYToRedeems)
112
110
  external
113
111
  nonReentrant
114
- updateScyReserve
115
- returns (uint256 totalAmountScyOut)
112
+ updateData
113
+ returns (uint256[] memory amountScyOuts)
116
114
  {
117
- (totalAmountScyOut, ) = _redeemPY(receivers, maxAmountScyOuts);
115
+ require(receivers.length == amountPYToRedeems.length, "not same length");
116
+ require(receivers.length != 0, "empty array");
117
+ amountScyOuts = _redeemPY(receivers, amountPYToRedeems);
118
118
  }
119
119
 
120
120
  /**
121
- * @dev _updateAndDistributeRewards must be called before every distributeInterest
122
- */
123
- function redeemDueInterestAndRewards(address user)
124
- external
125
- nonReentrant
126
- updateScyReserve
127
- returns (uint256 interestOut, uint256[] memory rewardsOut)
128
- {
121
+ * @dev With YT yielding interest in the form of SCY, which is redeemable by users, the reward
122
+ distribution should be based on the amount of SCYs that their YT currently represent, plus their
123
+ dueInterest. It has been proven and tested that _rewardSharesUser will not change over time,
124
+ unless users redeem their dueInterest or redeemPY. Due to this, it is required to update users'
125
+ accruedReward STRICTLY BEFORE transferring out their interest.
126
+ */
127
+ function redeemDueInterestAndRewards(
128
+ address user,
129
+ bool redeemInterest,
130
+ bool redeemRewards
131
+ ) external nonReentrant updateData returns (uint256 interestOut, uint256[] memory rewardsOut) {
132
+ require(redeemInterest || redeemRewards, "nothing to redeem");
133
+
134
+ // if redeemRewards == true, this line must be here for obvious reason
135
+ // if redeemInterest == true, this line must be here because of the reason above
129
136
  _updateAndDistributeRewards(user);
130
- _distributeInterest(user);
131
- rewardsOut = _doTransferOutRewards(user, user);
132
- interestOut = _doTransferOutInterest(user, SCY, factory);
133
137
 
134
- emit RedeemRewards(user, rewardsOut);
135
- emit RedeemInterest(user, interestOut);
138
+ if (redeemRewards) {
139
+ rewardsOut = _doTransferOutRewards(user, user);
140
+ emit RedeemRewards(user, rewardsOut);
141
+ } else {
142
+ address[] memory tokens = getRewardTokens();
143
+ rewardsOut = new uint256[](tokens.length);
144
+ }
145
+
146
+ if (redeemInterest) {
147
+ _distributeInterest(user);
148
+ interestOut = _doTransferOutInterest(user, SCY, factory);
149
+ emit RedeemInterest(user, interestOut);
150
+ } else {
151
+ interestOut = 0;
152
+ }
136
153
  }
137
154
 
138
- /**
139
- * @dev as mentioned in doc, _updateAndDistributeRewards should be placed strictly before every _distributeInterest
140
- */
141
- function redeemDueInterest(address user)
155
+ function redeemInterestAndRewardsPostExpiryForTreasury()
142
156
  external
143
157
  nonReentrant
144
- updateScyReserve
145
- returns (uint256 interestOut)
158
+ updateData
159
+ returns (uint256 interestOut, uint256[] memory rewardsOut)
146
160
  {
147
- _updateAndDistributeRewards(user); /// strictly required, see above for explanation
148
- _distributeInterest(user);
161
+ require(isExpired(), "not expired");
149
162
 
150
- interestOut = _doTransferOutInterest(user, SCY, factory);
163
+ address treasury = IPYieldContractFactory(factory).treasury();
151
164
 
152
- emit RedeemInterest(user, interestOut);
153
- }
165
+ address[] memory tokens = getRewardTokens();
166
+ rewardsOut = new uint256[](tokens.length);
154
167
 
155
- /// @dev no updateScyReserve since this function doesn't change the SCY reserve
156
- function redeemDueRewards(address user)
157
- external
158
- nonReentrant
159
- returns (uint256[] memory rewardsOut)
160
- {
161
- _updateAndDistributeRewards(user);
162
- rewardsOut = _doTransferOutRewards(user, user);
163
- emit RedeemRewards(user, rewardsOut);
164
- }
168
+ _redeemExternalReward();
165
169
 
166
- /// @dev this function will only redeem rewards to the treasury, hence
167
- /// no need to guard it with onlyGovernance
168
- /// @dev no updateScyReserve since this function doesn't change the SCY reserve
169
- function redeemRewardsAfterExpiryForTreasury()
170
- external
171
- nonReentrant
172
- returns (uint256[] memory rewardsOut)
173
- {
174
- require(isExpired(), "not expired");
175
- address[] memory rewardTokens = _getRewardTokens();
176
- uint256[] memory preBalances = _selfBalances(rewardTokens);
170
+ for (uint256 i = 0; i < tokens.length; i++) {
171
+ rewardsOut[i] = _selfBalance(tokens[i]) - postExpiry.userRewardOwed[tokens[i]];
172
+ }
177
173
 
178
- _redeemExternalReward();
174
+ _transferOut(tokens, treasury, rewardsOut);
179
175
 
180
- rewardsOut = _selfBalances(rewardTokens).sub(preBalances);
181
- _transferOut(rewardTokens, IPYieldContractFactory(factory).treasury(), rewardsOut);
176
+ interestOut = postExpiry.totalScyInterestForTreasury;
177
+ postExpiry.totalScyInterestForTreasury = 0;
178
+ _transferOut(SCY, treasury, interestOut);
182
179
  }
183
180
 
184
- /// @notice can be called by anyone to lock in all the indexes
185
- function finalizeAfterExpiryData() public {
186
- if (!isExpired() || afterExpiry.isFinalized) return;
187
- afterExpiry.isFinalized = true;
188
- afterExpiry.firstScyIndex = scyIndexCurrent().Uint128();
189
- (, afterExpiry.firstRewardIndexes) = _updateRewardIndex();
181
+ function rewardIndexesCurrent() external override returns (uint256[] memory) {
182
+ return ISuperComposableYield(SCY).rewardIndexesCurrent();
190
183
  }
191
184
 
192
185
  /// @dev maximize the current rate with the previous rate to guarantee non-decreasing rate
193
186
  function scyIndexCurrent() public returns (uint256 currentIndex) {
194
187
  currentIndex = Math.max(ISuperComposableYield(SCY).exchangeRate(), _scyIndexStored);
195
188
  _scyIndexStored = currentIndex.Uint128();
189
+ emit NewInterestIndex(currentIndex);
196
190
  }
197
191
 
198
192
  function scyIndexStored() public view returns (uint256) {
@@ -203,22 +197,30 @@ contract PendleYieldToken is
203
197
  return MiniHelpers.isCurrentlyExpired(expiry);
204
198
  }
205
199
 
206
- function _redeemPY(address[] memory receivers, uint256[] memory maxAmountScyOuts)
200
+ function _redeemPY(address[] memory receivers, uint256[] memory amountPYToRedeems)
207
201
  internal
208
- returns (uint256 totalScyToReceivers, uint256 scyInterestAfterExpiry)
202
+ returns (uint256[] memory amountScyOuts)
209
203
  {
210
- uint256 amountPYToRedeem = _getAmountPYToRedeem();
211
- IPPrincipalToken(PT).burnByYT(address(this), amountPYToRedeem);
212
- if (!isExpired()) _burn(address(this), amountPYToRedeem);
213
-
214
- (totalScyToReceivers, scyInterestAfterExpiry) = _calcScyRedeemableFromPY(amountPYToRedeem);
215
-
216
- if (scyInterestAfterExpiry != 0) {
217
- address treasury = IPYieldContractFactory(factory).treasury();
218
- _transferOut(SCY, treasury, scyInterestAfterExpiry);
204
+ uint256 totalAmountPYToRedeem = amountPYToRedeems.sum();
205
+ IPPrincipalToken(PT).burnByYT(address(this), totalAmountPYToRedeem);
206
+ if (!isExpired()) _burn(address(this), totalAmountPYToRedeem);
207
+
208
+ uint256 index = scyIndexCurrent();
209
+ uint256 totalScyInterestPostExpiry;
210
+ amountScyOuts = new uint256[](receivers.length);
211
+
212
+ for (uint256 i = 0; i < receivers.length; i++) {
213
+ uint256 scyInterestPostExpiry;
214
+ (amountScyOuts[i], scyInterestPostExpiry) = _calcScyRedeemableFromPY(
215
+ amountPYToRedeems[i],
216
+ index
217
+ );
218
+ _transferOut(SCY, receivers[i], amountScyOuts[i]);
219
+ totalScyInterestPostExpiry += scyInterestPostExpiry;
220
+ }
221
+ if (totalScyInterestPostExpiry != 0) {
222
+ postExpiry.totalScyInterestForTreasury += totalScyInterestPostExpiry.Uint128();
219
223
  }
220
-
221
- _transferOutMaxMulti(SCY, totalScyToReceivers, receivers, maxAmountScyOuts);
222
224
  }
223
225
 
224
226
  function _calcPYToMint(uint256 amountScy) internal returns (uint256 amountPY) {
@@ -228,44 +230,59 @@ contract PendleYieldToken is
228
230
 
229
231
  function _calcScyRedeemableFromPY(uint256 amountPY)
230
232
  internal
231
- returns (uint256 scyToUser, uint256 scyInterestAfterExpiry)
233
+ returns (uint256 scyToUser, uint256 scyInterestPostExpiry)
232
234
  {
235
+ return _calcScyRedeemableFromPY(amountPY, scyIndexCurrent());
236
+ }
237
+
238
+ function _calcScyRedeemableFromPY(uint256 amountPY, uint256 indexCurrent)
239
+ internal
240
+ view
241
+ returns (uint256 scyToUser, uint256 scyInterestPostExpiry)
242
+ {
243
+ scyToUser = SCYUtils.assetToScy(indexCurrent, amountPY);
233
244
  if (isExpired()) {
234
- finalizeAfterExpiryData();
235
- uint256 totalScyRedeemable = SCYUtils.assetToScy(afterExpiry.firstScyIndex, amountPY);
236
- scyToUser = SCYUtils.assetToScy(scyIndexCurrent(), amountPY);
237
- scyInterestAfterExpiry = totalScyRedeemable - scyToUser;
238
- } else {
239
- scyToUser = SCYUtils.assetToScy(scyIndexCurrent(), amountPY);
245
+ uint256 totalScyRedeemable = SCYUtils.assetToScy(postExpiry.firstScyIndex, amountPY);
246
+ scyInterestPostExpiry = totalScyRedeemable - scyToUser;
240
247
  }
241
248
  }
242
249
 
243
250
  function _getAmountPYToRedeem() internal view returns (uint256) {
244
- if (!isExpired())
245
- return Math.min(IERC20(PT).balanceOf(address(this)), balanceOf(address(this)));
246
- else return IERC20(PT).balanceOf(address(this));
251
+ if (!isExpired()) return Math.min(_selfBalance(PT), balanceOf(address(this)));
252
+ else return _selfBalance(PT);
247
253
  }
248
254
 
249
255
  function _updateScyReserve() internal virtual {
250
- scyReserve = IERC20(SCY).balanceOf(address(this)).Uint128();
256
+ scyReserve = _selfBalance(SCY).Uint128();
251
257
  }
252
258
 
253
259
  function _getFloatingScyAmount() internal view returns (uint256 amount) {
254
- amount = IERC20(SCY).balanceOf(address(this)) - scyReserve;
260
+ amount = _selfBalance(SCY) - scyReserve;
255
261
  require(amount > 0, "RECEIVE_ZERO");
256
262
  }
257
263
 
264
+ function _setPostExpiryData() internal {
265
+ PostExpiryData storage local = postExpiry;
266
+ if (local.firstScyIndex != 0) return; // already set
267
+
268
+ _redeemExternalReward(); // do a final redeem. All the future reward income will belong to the treasury
269
+
270
+ local.firstScyIndex = scyIndexCurrent().Uint128();
271
+ address[] memory rewardTokens = ISuperComposableYield(SCY).getRewardTokens();
272
+ uint256[] memory rewardIndexes = ISuperComposableYield(SCY).rewardIndexesCurrent();
273
+ for (uint256 i = 0; i < rewardTokens.length; i++) {
274
+ local.firstRewardIndex[rewardTokens[i]] = rewardIndexes[i];
275
+ local.userRewardOwed[rewardTokens[i]] = _selfBalance(rewardTokens[i]);
276
+ }
277
+ }
278
+
258
279
  /*///////////////////////////////////////////////////////////////
259
280
  INTEREST-RELATED
260
281
  //////////////////////////////////////////////////////////////*/
261
282
 
262
283
  function _getInterestIndex() internal virtual override returns (uint256 index) {
263
- if (isExpired()) {
264
- finalizeAfterExpiryData();
265
- index = afterExpiry.firstScyIndex;
266
- } else {
267
- index = scyIndexCurrent();
268
- }
284
+ if (isExpired()) index = postExpiry.firstScyIndex;
285
+ else index = scyIndexCurrent();
269
286
  }
270
287
 
271
288
  function _YTbalance(address user) internal view override returns (uint256) {
@@ -276,27 +293,49 @@ contract PendleYieldToken is
276
293
  REWARDS-RELATED
277
294
  //////////////////////////////////////////////////////////////*/
278
295
 
296
+ function getRewardTokens() public view returns (address[] memory) {
297
+ return ISuperComposableYield(SCY).getRewardTokens();
298
+ }
299
+
279
300
  function _doTransferOutRewards(address user, address receiver)
280
301
  internal
281
302
  virtual
282
303
  override
283
304
  returns (uint256[] memory rewardAmounts)
284
305
  {
285
- _redeemExternalReward();
306
+ address[] memory tokens = getRewardTokens();
286
307
 
287
- address[] memory tokens = _getRewardTokens();
288
- rewardAmounts = new uint256[](tokens.length);
289
- for (uint256 i = 0; i < tokens.length; i++) {
290
- rewardAmounts[i] = userReward[tokens[i]][user].accrued;
291
- if (rewardAmounts[i] != 0) {
292
- userReward[tokens[i]][user].accrued = 0;
293
- _transferOut(tokens[i], receiver, rewardAmounts[i]);
294
- }
308
+ if (isExpired()) {
309
+ // post-expiry, all incoming rewards will go to the treasury
310
+ // hence, we can save users one _redeemExternal here
311
+ for (uint256 i = 0; i < tokens.length; i++)
312
+ postExpiry.userRewardOwed[tokens[i]] -= userReward[tokens[i]][user].accrued;
313
+ rewardAmounts = __doTransferOutRewardsLocal(tokens, user, receiver);
314
+ } else {
315
+ _redeemExternalReward();
316
+ rewardAmounts = __doTransferOutRewardsLocal(tokens, user, receiver);
295
317
  }
296
318
  }
297
319
 
298
- function getRewardTokens() external view returns (address[] memory) {
299
- return _getRewardTokens();
320
+ function __doTransferOutRewardsLocal(
321
+ address[] memory tokens,
322
+ address user,
323
+ address receiver
324
+ ) internal returns (uint256[] memory rewardAmounts) {
325
+ address treasury = IPYieldContractFactory(factory).treasury();
326
+ uint256 feeRate = IPYieldContractFactory(factory).rewardFeeRate();
327
+
328
+ rewardAmounts = new uint256[](tokens.length);
329
+ for (uint256 i = 0; i < tokens.length; i++) {
330
+ uint256 rewardPreFee = userReward[tokens[i]][user].accrued;
331
+ userReward[tokens[i]][user].accrued = 0;
332
+
333
+ uint256 feeAmount = rewardPreFee.mulDown(feeRate);
334
+ rewardAmounts[i] = rewardPreFee - feeAmount;
335
+
336
+ _transferOut(tokens[i], treasury, feeAmount);
337
+ _transferOut(tokens[i], receiver, rewardAmounts[i]);
338
+ }
300
339
  }
301
340
 
302
341
  function _redeemExternalReward() internal virtual override {
@@ -310,40 +349,28 @@ contract PendleYieldToken is
310
349
  return SCYUtils.assetToScy(index, balanceOf(user)) + userInterest[user].accrued;
311
350
  }
312
351
 
313
- function _rewardSharesTotal() internal view virtual override returns (uint256) {
314
- return scyReserve;
315
- }
316
-
317
- function _getRewardTokens() internal view override returns (address[] memory) {
318
- return ISuperComposableYield(SCY).getRewardTokens();
319
- }
320
-
321
352
  function _updateRewardIndex()
322
353
  internal
323
354
  override
324
355
  returns (address[] memory tokens, uint256[] memory indexes)
325
356
  {
326
- tokens = _getRewardTokens();
357
+ tokens = getRewardTokens();
327
358
  if (isExpired()) {
328
- finalizeAfterExpiryData();
329
- // padding to handle the very extreme case of SCY adding reward tokens after expiry
330
- indexes = afterExpiry.firstRewardIndexes.padZeroRight(tokens.length);
359
+ indexes = new uint256[](tokens.length);
360
+ for (uint256 i = 0; i < tokens.length; i++)
361
+ indexes[i] = postExpiry.firstRewardIndex[tokens[i]];
331
362
  } else {
332
- indexes = rewardIndexesCurrent();
363
+ indexes = ISuperComposableYield(SCY).rewardIndexesCurrent();
333
364
  }
334
365
  }
335
366
 
336
- function rewardIndexesCurrent() public override returns (uint256[] memory) {
337
- return ISuperComposableYield(SCY).rewardIndexesCurrent();
338
- }
339
-
340
367
  //solhint-disable-next-line ordering
341
368
  function _beforeTokenTransfer(
342
369
  address from,
343
370
  address to,
344
371
  uint256
345
372
  ) internal override {
346
- _distributeInterestForTwo(from, to);
347
373
  _updateAndDistributeRewardsForTwo(from, to);
374
+ _distributeInterestForTwo(from, to);
348
375
  }
349
376
  }
@@ -3,7 +3,6 @@ pragma solidity 0.8.15;
3
3
 
4
4
  import "../../interfaces/IPMarketFactory.sol";
5
5
  import "../../interfaces/IPMarket.sol";
6
- import "../../interfaces/IPMarketAddRemoveCallback.sol";
7
6
  import "../../interfaces/IPMarketSwapCallback.sol";
8
7
  import "../../libraries/SCY/SCYUtils.sol";
9
8
  import "../../libraries/math/MarketApproxLib.sol";
@@ -116,24 +115,26 @@ contract ActionCallback is IPMarketSwapCallback, CallbackHelper {
116
115
  /// @dev refer to _swapExactYtForScy or _swapYtForExactScy
117
116
  function _callbackSwapYtForScy(
118
117
  address market,
119
- int256, /*ptToAccount*/
118
+ int256 ptToAccount,
120
119
  int256 scyToAccount,
121
120
  bytes calldata data
122
121
  ) internal {
123
122
  (address receiver, uint256 minScyOut) = _decodeSwapYtForScy(data);
124
- (, , IPYieldToken YT) = IPMarket(market).readTokens();
123
+ (ISuperComposableYield SCY, , IPYieldToken YT) = IPMarket(market).readTokens();
124
+ SCYIndex scyIndex = SCY.newIndex();
125
125
 
126
126
  uint256 scyOwed = scyToAccount.neg().Uint();
127
127
 
128
128
  address[] memory receivers = new address[](2);
129
- uint256[] memory amounts = new uint256[](2);
130
-
131
- (receivers[0], amounts[0]) = (market, scyOwed);
132
- (receivers[1], amounts[1]) = (receiver, type(uint256).max);
129
+ uint256[] memory amountPYToRedeems = new uint256[](2);
133
130
 
134
- uint256 totalScyRedeemed = YT.redeemPY(receivers, amounts);
135
- uint256 netScyOut = totalScyRedeemed - scyOwed;
131
+ (receivers[0], amountPYToRedeems[0]) = (market, scyIndex.scyToAssetUp(scyOwed));
132
+ (receivers[1], amountPYToRedeems[1]) = (
133
+ receiver,
134
+ ptToAccount.Uint() - amountPYToRedeems[0]
135
+ );
136
136
 
137
- require(netScyOut >= minScyOut, "insufficient SCY out");
137
+ uint256[] memory amountScyOuts = YT.redeemPYMulti(receivers, amountPYToRedeems);
138
+ require(amountScyOuts[1] >= minScyOut, "insufficient SCY out");
138
139
  }
139
140
  }