@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
@@ -59,98 +59,90 @@ contract PendleVotingControllerUpg is
59
59
  //////////////////////////////////////////////////////////////*/
60
60
 
61
61
  /**
62
- * @notice set a new voting weight for the target pool
63
- * @dev pre-condition:
64
- - pool must have been added before
65
- - the vePENDLE position must still be active
66
62
  * @dev state changes expected:
67
63
  - update weekData (if any)
68
- - update poolInfo, userData to reflect the new vote
69
- - add 1 check point for both the unvote & new vote
64
+ - update poolData, userData to reflect the new vote
65
+ - add 1 check point for each of pools
70
66
  * @dev vePENDLE position not expired is a must, else bias - t*slope < 0 & it will be
71
67
  negative weight
72
68
  */
73
- function vote(address pool, uint64 weight) external {
69
+ function vote(address[] calldata pools, uint64[] calldata weights) external {
74
70
  address user = msg.sender;
75
71
 
76
- require(weight != 0, "zero weight");
77
- require(_isPoolVotable(pool), "invalid pool");
78
- require(!vePendle.isPositionExpired(user), "user position expired");
72
+ require(weights.length == pools.length, "invaid array length");
73
+ require(vePendle.balanceOf(user) > 0, "zero vependle balance");
79
74
 
80
- updatePoolVotes(pool);
81
- _unvote(user, pool, false);
82
- _vote(user, pool, weight);
83
- }
75
+ UserData storage uData = userData[user];
84
76
 
85
- /**
86
- * @notice remove the vote from the current pool
87
- * @dev no pre-condition as opposed to vote since this function is to clear the vote
88
- * @dev allow removing vote from a non-votable pool BY not requiring pool to be votable
89
- * @dev state changes expected:
90
- - update weekData (if any)
91
- - update poolInfo, userData to reflect the new vote
92
- - add 1 check point for the unvote
93
- */
94
- function unvote(address pool) external {
95
- if (_isPoolVotable(pool)) {
96
- updatePoolVotes(pool);
77
+ for (uint256 i = 0; i < pools.length; ++i) {
78
+ if (_isPoolActive(pools[i])) applyPoolSlopeChanges(pools[i]);
79
+ }
80
+
81
+ for (uint256 i = 0; i < pools.length; ++i) {
82
+ if (uData.voteForPools[pools[i]].weight <= weights[i])
83
+ _modifyVoteWeight(user, pools[i], weights[i]);
84
+ }
85
+
86
+ for (uint256 i = 0; i < pools.length; ++i) {
87
+ if (uData.voteForPools[pools[i]].weight > weights[i])
88
+ _modifyVoteWeight(user, pools[i], weights[i]);
97
89
  }
98
- _unvote(msg.sender, pool, true);
99
90
  }
100
91
 
101
92
  /**
102
93
  * @notice Process all the slopeChanges that haven't been processed & update these data into
103
- poolInfo
104
- * @dev pre-condition: the pool must be votable
94
+ poolData
95
+ * @dev pre-condition: the pool must be active
105
96
  * @dev state changes expected:
106
97
  - update weekData
107
- - update poolInfo
98
+ - update poolData
108
99
  */
109
- function updatePoolVotes(address pool) public {
110
- require(_isPoolVotable(pool), "invalid pool");
100
+ function applyPoolSlopeChanges(address pool) public {
101
+ require(_isPoolActive(pool), "invalid pool");
111
102
 
112
- uint128 wTime = poolInfo[pool].lastUpdated;
103
+ uint128 wTime = poolData[pool].lastSlopeChangeAppliedAt;
113
104
  uint128 currentWeekStart = WeekMath.getCurrentWeekStart();
114
105
 
115
106
  // no state changes are expected
116
107
  if (wTime >= currentWeekStart) return;
117
108
 
118
- VeBalance memory currentVote = poolInfo[pool].vote;
109
+ VeBalance memory currentVote = poolData[pool].totalVote;
119
110
  while (wTime < currentWeekStart) {
120
111
  wTime += WEEK;
121
- currentVote = currentVote.sub(poolInfo[pool].slopeChanges[wTime], wTime);
112
+ currentVote = currentVote.sub(poolData[pool].slopeChanges[wTime], wTime);
122
113
  _setFinalPoolVoteForWeek(pool, wTime, currentVote.getValueAt(wTime));
123
114
  }
124
115
 
125
- _setNewVotePoolInfo(pool, currentVote, wTime);
116
+ _setNewVotePoolData(pool, currentVote, wTime);
126
117
  }
127
118
 
128
119
  /**
129
120
  * @notice finalize the voting results of all pools, up to the current epoch
130
121
  * @dev state changes expected:
131
- - weekData, poolInfo is updated for all pools in allPools
122
+ - weekData, poolData is updated for all pools in allActivePools
132
123
  - isEpochFinalized is set to true for all epochs since the last time until now
133
- * @dev this function might take a lot of gas, but can be mitigated by calling updatePoolVotes
124
+ * @dev this function might take a lot of gas, but can be mitigated by calling applyPoolSlopeChanges
134
125
  separately, hence reduce the number of states to be updated
135
126
  */
136
127
  function finalizeEpoch() public {
137
- uint256 length = allPools.length();
128
+ uint256 length = allActivePools.length();
138
129
  for (uint256 i = 0; i < length; ++i) {
139
- updatePoolVotes(allPools.at(i));
130
+ applyPoolSlopeChanges(allActivePools.at(i));
140
131
  }
141
132
  _setAllPastEpochsAsFinalized();
142
133
  }
143
134
 
144
135
  /**
145
136
  * @notice broadcast the voting results of the current week to the chain with chainId. Can be
146
- called by anyone
137
+ called by anyone. It's intentional to allow the same results to be broadcasted multiple
138
+ times. The receiver should be able to filter these duplicated messages
147
139
  * @dev pre-condition: the epoch must have already been finalized by finalizeEpoch
148
140
  * @dev state changes expected:
149
141
  - the gaugeController receives the new pendle allocation
150
142
  */
151
143
  function broadcastResults(uint64 chainId) external payable {
152
144
  uint128 wTime = WeekMath.getCurrentWeekStart();
153
- require(isEpochFinalized[wTime], "epoch not finalized");
145
+ require(weekData[wTime].isEpochFinalized, "epoch not finalized");
154
146
  _broadcastResults(chainId, wTime, pendlePerSec);
155
147
  }
156
148
 
@@ -163,11 +155,13 @@ contract PendleVotingControllerUpg is
163
155
  * @dev pre-condition: pool must not have been added before
164
156
  * @dev assumption: chainId is valid, pool does exist on the chain (guaranteed by gov)
165
157
  * @dev state changes expected:
166
- - add to allPools & chainPools
167
- - set params in poolInfo
158
+ - add to allActivePools & chainPools
159
+ - set params in poolData
168
160
  */
169
161
  function addPool(uint64 chainId, address pool) external onlyGovernance {
170
- require(!_isPoolVotable(pool), "pool already added");
162
+ require(!_isPoolActive(pool), "pool already added");
163
+ require(!allRemovedPools.contains(pool), "not allowed to add a removed pool");
164
+
171
165
  _addPool(chainId, pool);
172
166
  emit AddPool(chainId, pool);
173
167
  }
@@ -177,14 +171,15 @@ contract PendleVotingControllerUpg is
177
171
  * @dev pre-condition: pool must have been added before
178
172
  * @dev state changes expected:
179
173
  - update weekData (if any)
180
- - remove from allPools & chainPools
181
- - clear info in poolInfo
174
+ - remove from allActivePools & chainPools
175
+ - clear data in poolData
182
176
  */
183
177
  function removePool(address pool) external onlyGovernance {
184
- require(_isPoolVotable(pool), "invalid pool");
185
- uint64 chainId = poolInfo[pool].chainId;
178
+ require(_isPoolActive(pool), "invalid pool");
179
+
180
+ uint64 chainId = poolData[pool].chainId;
186
181
 
187
- updatePoolVotes(pool);
182
+ applyPoolSlopeChanges(pool);
188
183
  _removePool(pool);
189
184
 
190
185
  emit RemovePool(chainId, pool);
@@ -222,7 +217,7 @@ contract PendleVotingControllerUpg is
222
217
 
223
218
  /**
224
219
  * @notice broadcast voting results of the timestamp to chainId
225
- * @dev assumption: the epoch is already finalized, lastUpdated of all pools >= currentWeekTimestamp
220
+ * @dev assumption: the epoch is already finalized, lastSlopeChangeAppliedAt of all pools >= currentWeekTimestamp
226
221
  * @dev state changes expected:
227
222
  - the gaugeController receives the new pendle allocation
228
223
  */
@@ -260,51 +255,6 @@ contract PendleVotingControllerUpg is
260
255
  emit BroadcastResults(chainId, wTime, totalPendlePerSec);
261
256
  }
262
257
 
263
- /**
264
- * @notice remove the vote from the current pool
265
- * @dev state changes expected:
266
- - vote in poolInfo is cleared if the vote is still valid
267
- - update UserData to remove the vote weight
268
- - add a check-point if required
269
- */
270
- function _unvote(
271
- address user,
272
- address pool,
273
- bool doCreateCheckpoint
274
- ) internal {
275
- VeBalance memory oldUVote = userData[user].voteForPools[pool].vote;
276
- if (_isPoolVotable(pool) && _isVoteActive(oldUVote)) {
277
- _subtractVotePoolInfo(pool, oldUVote);
278
- }
279
- _unsetVoteUserData(user, pool);
280
-
281
- if (doCreateCheckpoint) {
282
- _addUserPoolCheckpoint(user, pool, VeBalance(0, 0));
283
- }
284
- emit Unvote(user, pool, oldUVote);
285
- }
286
-
287
- /**
288
- * @notice remove the vote from the current pool
289
- * @dev there must not be any current vote on this pool by the user
290
- * @dev state changes expected:
291
- - vote in poolInfo is added
292
- - update UserData to set the new vote weight
293
- - add a check-point
294
- */
295
- function _vote(
296
- address user,
297
- address pool,
298
- uint64 weight
299
- ) internal {
300
- VeBalance memory votingPower = _getVotingPowerByWeight(user, weight);
301
- _addVotePoolInfo(pool, votingPower);
302
- _setVoteUserData(user, pool, weight, votingPower);
303
- _addUserPoolCheckpoint(user, pool, votingPower);
304
-
305
- emit Vote(user, pool, weight, votingPower);
306
- }
307
-
308
258
  /**
309
259
  * @notice return the corresponding voting power of an user given the weight. Basically his voting power
310
260
  will be vePendle * weight / USER_VOTE_MAX_WEIGHT
@@ -314,6 +264,7 @@ contract PendleVotingControllerUpg is
314
264
  internal
315
265
  view
316
266
  virtual
267
+ override
317
268
  returns (VeBalance memory res)
318
269
  {
319
270
  uint128 amount;
@@ -17,25 +17,26 @@ abstract contract VotingControllerStorageUpg {
17
17
  using EnumerableSet for EnumerableSet.AddressSet;
18
18
  using Checkpoints for Checkpoints.History;
19
19
 
20
- struct PoolInfo {
20
+ struct PoolData {
21
21
  uint64 chainId;
22
- uint128 lastUpdated;
23
- VeBalance vote;
22
+ uint128 lastSlopeChangeAppliedAt;
23
+ VeBalance totalVote;
24
24
  // wTime => slopeChange value
25
25
  mapping(uint128 => uint128) slopeChanges;
26
26
  }
27
27
 
28
- struct UserPoolInfo {
28
+ struct UserPoolData {
29
29
  uint64 weight;
30
30
  VeBalance vote;
31
31
  }
32
32
 
33
33
  struct UserData {
34
34
  uint64 totalVotedWeight;
35
- mapping(address => UserPoolInfo) voteForPools;
35
+ mapping(address => UserPoolData) voteForPools;
36
36
  }
37
37
 
38
38
  struct WeekData {
39
+ bool isEpochFinalized;
39
40
  uint128 totalVotes;
40
41
  mapping(address => uint128) poolVotes;
41
42
  }
@@ -47,27 +48,26 @@ abstract contract VotingControllerStorageUpg {
47
48
 
48
49
  IPVeToken public immutable vePendle;
49
50
 
51
+ uint128 public immutable deployedWTime;
52
+
50
53
  uint128 public pendlePerSec;
51
54
 
52
- uint128 public immutable deployedWTime; // divisible by WEEK
55
+ EnumerableSet.AddressSet internal allActivePools;
53
56
 
54
- EnumerableSet.AddressSet internal allPools;
57
+ EnumerableSet.AddressSet internal allRemovedPools;
55
58
 
56
59
  // [chainId] => [pool]
57
60
  mapping(uint64 => EnumerableSet.AddressSet) internal chainPools;
58
61
 
59
- // [poolAddress] -> PoolInfo
60
- mapping(address => PoolInfo) public poolInfo;
62
+ // [poolAddress] -> PoolData
63
+ mapping(address => PoolData) public poolData;
61
64
 
62
65
  // [wTime] => WeekData
63
66
  mapping(uint128 => WeekData) public weekData;
64
67
 
65
- // user voting info
68
+ // user voting data
66
69
  mapping(address => UserData) public userData;
67
70
 
68
- // wTime => bool
69
- mapping(uint128 => bool) public isEpochFinalized;
70
-
71
71
  // [user][pool] => checkpoint
72
72
  mapping(address => mapping(address => Checkpoints.History)) internal userPoolHistory;
73
73
 
@@ -83,8 +83,19 @@ abstract contract VotingControllerStorageUpg {
83
83
  //////////////////////////////////////////////////////////////*/
84
84
 
85
85
  /// @dev trivial view function
86
- function getAllPools() external view returns (address[] memory) {
87
- return allPools.values();
86
+ function getAllAcitvePools() external view returns (address[] memory) {
87
+ return allActivePools.values();
88
+ }
89
+
90
+ /// @dev trivial view function
91
+ function getAllRemovedPools(uint256 start, uint256 end)
92
+ external
93
+ view
94
+ returns (uint256 lengthOfRemovedPools, address[] memory arr)
95
+ {
96
+ arr = new address[](end - start + 1);
97
+ for (uint256 i = start; i <= end; i++) arr[i] = allRemovedPools.at(i);
98
+ lengthOfRemovedPools = allRemovedPools.length();
88
99
  }
89
100
 
90
101
  /// @dev trivial view function
@@ -96,7 +107,7 @@ abstract contract VotingControllerStorageUpg {
96
107
  function getUserPoolVote(address user, address pool)
97
108
  external
98
109
  view
99
- returns (UserPoolInfo memory)
110
+ returns (UserPoolData memory)
100
111
  {
101
112
  return userData[user].voteForPools[pool];
102
113
  }
@@ -119,26 +130,30 @@ abstract contract VotingControllerStorageUpg {
119
130
 
120
131
  /**
121
132
  * @dev expected behavior:
122
- - add to allPools, chainPools
123
- - set params in poolInfo
133
+ - add to allActivePools, chainPools
134
+ - set params in poolData
124
135
  */
125
136
  function _addPool(uint64 chainId, address pool) internal {
126
- poolInfo[pool].chainId = chainId;
127
- poolInfo[pool].lastUpdated = WeekMath.getCurrentWeekStart();
128
- require(chainPools[chainId].add(pool), "IE: chainPools duplicated");
129
- require(allPools.add(pool), "IE: allPools duplicated");
137
+ require(chainPools[chainId].add(pool), "IE");
138
+ require(allActivePools.add(pool), "IE");
139
+
140
+ poolData[pool].chainId = chainId;
141
+ poolData[pool].lastSlopeChangeAppliedAt = WeekMath.getCurrentWeekStart();
130
142
  }
131
143
 
132
144
  /**
133
145
  * @dev expected behavior:
134
- - remove from allPools, chainPools
135
- - clear all params in poolInfo
146
+ - remove from allActivePool, chainPools
147
+ - add to allRemovedPools
148
+ - clear all params in poolData
136
149
  */
137
150
  function _removePool(address pool) internal {
138
- uint64 chainId = poolInfo[pool].chainId;
139
- require(chainPools[chainId].remove(pool), "IE: chainPools removal failed");
140
- require(allPools.remove(pool), "IE: allPools removal failed");
141
- delete poolInfo[pool];
151
+ uint64 chainId = poolData[pool].chainId;
152
+ require(chainPools[chainId].remove(pool), "IE");
153
+ require(allActivePools.remove(pool), "IE");
154
+ require(allRemovedPools.add(pool), "IE");
155
+
156
+ delete poolData[pool];
142
157
  }
143
158
 
144
159
  /**
@@ -154,70 +169,62 @@ abstract contract VotingControllerStorageUpg {
154
169
  weekData[wTime].poolVotes[pool] = vote;
155
170
  }
156
171
 
157
- function _setNewVotePoolInfo(
172
+ function _setNewVotePoolData(
158
173
  address pool,
159
174
  VeBalance memory vote,
160
175
  uint128 wTime
161
176
  ) internal {
162
- poolInfo[pool].vote = vote;
163
- poolInfo[pool].lastUpdated = wTime;
164
- }
165
-
166
- /// @dev only applicable for current pool, hence no changes for weekData
167
- function _subtractVotePoolInfo(address pool, VeBalance memory vote) internal {
168
- PoolInfo storage pInfo = poolInfo[pool];
169
- pInfo.vote = poolInfo[pool].vote.sub(vote);
170
- pInfo.slopeChanges[vote.getExpiry()] -= vote.slope;
171
- }
172
-
173
- /// @dev only applicable for current pool, hence no changes for weekData
174
- function _addVotePoolInfo(address pool, VeBalance memory vote) internal {
175
- PoolInfo storage pInfo = poolInfo[pool];
176
- pInfo.vote = poolInfo[pool].vote.add(vote);
177
- pInfo.slopeChanges[vote.getExpiry()] += vote.slope;
177
+ poolData[pool].totalVote = vote;
178
+ poolData[pool].lastSlopeChangeAppliedAt = wTime;
178
179
  }
179
180
 
180
- function _unsetVoteUserData(address user, address pool) internal {
181
- UserData storage uData = userData[user];
182
- uData.totalVotedWeight -= uData.voteForPools[pool].weight;
183
- delete uData.voteForPools[pool];
184
- }
185
-
186
- /// @dev assumption: uData.voteForPools[pool] hasn't been set before
187
- /// @dev post-condition: totalVotedWeight <= USER_VOTE_MAX_WEIGHT
188
- function _setVoteUserData(
181
+ function _modifyVoteWeight(
189
182
  address user,
190
183
  address pool,
191
- uint64 weight,
192
- VeBalance memory vote
193
- ) internal {
184
+ uint64 weight
185
+ ) internal returns (VeBalance memory newVote) {
194
186
  UserData storage uData = userData[user];
195
- uData.totalVotedWeight += weight;
196
- require(uData.totalVotedWeight <= USER_VOTE_MAX_WEIGHT, "exceeded max weight");
187
+ PoolData storage pData = poolData[pool];
188
+
189
+ VeBalance memory oldVote = uData.voteForPools[pool].vote;
190
+
191
+ // REMOVE OLD VOTE
192
+ if (oldVote.bias != 0) {
193
+ if (_isPoolActive(pool) && _isVoteActive(oldVote)) {
194
+ pData.totalVote = pData.totalVote.sub(oldVote);
195
+ pData.slopeChanges[oldVote.getExpiry()] -= oldVote.slope;
196
+ }
197
+ uData.totalVotedWeight -= uData.voteForPools[pool].weight;
198
+ delete uData.voteForPools[pool];
199
+ }
197
200
 
198
- uData.voteForPools[pool] = UserPoolInfo({ weight: weight, vote: vote });
199
- }
201
+ // ADD NEW VOTE
202
+ if (weight != 0) {
203
+ require(_isPoolActive(pool), "pool not active");
200
204
 
201
- /// @dev post-condition: timestamp is in increasing order (for binary search)
202
- function _addUserPoolCheckpoint(
203
- address user,
204
- address pool,
205
- VeBalance memory vote
206
- ) internal {
207
- userPoolHistory[user][pool].push(vote);
205
+ newVote = _getVotingPowerByWeight(user, weight);
206
+
207
+ pData.totalVote = pData.totalVote.add(newVote);
208
+ pData.slopeChanges[newVote.getExpiry()] += newVote.slope;
209
+
210
+ uData.voteForPools[pool] = UserPoolData(weight, newVote);
211
+ uData.totalVotedWeight += weight;
212
+ require(uData.totalVotedWeight <= USER_VOTE_MAX_WEIGHT, "exceeded max weight");
213
+ }
214
+
215
+ userPoolHistory[user][pool].push(newVote);
208
216
  }
209
217
 
210
218
  function _setAllPastEpochsAsFinalized() internal {
211
219
  uint128 wTime = WeekMath.getCurrentWeekStart();
212
- while (wTime >= deployedWTime && isEpochFinalized[wTime] == false) {
213
- isEpochFinalized[wTime] = true;
220
+ while (wTime >= deployedWTime && weekData[wTime].isEpochFinalized == false) {
221
+ weekData[wTime].isEpochFinalized = true;
214
222
  wTime -= WEEK;
215
223
  }
216
224
  }
217
225
 
218
- /// @notice check if a pool is votable on by checking the lastUpdated time
219
- function _isPoolVotable(address pool) internal view returns (bool) {
220
- return poolInfo[pool].lastUpdated != 0;
226
+ function _isPoolActive(address pool) internal view returns (bool) {
227
+ return allActivePools.contains(pool);
221
228
  }
222
229
 
223
230
  /// @notice check if a vote still counts by checking if the vote is not (x,0) (in case the
@@ -225,4 +232,10 @@ abstract contract VotingControllerStorageUpg {
225
232
  function _isVoteActive(VeBalance memory vote) internal view returns (bool) {
226
233
  return vote.slope != 0 && !MiniHelpers.isCurrentlyExpired(vote.getExpiry());
227
234
  }
235
+
236
+ function _getVotingPowerByWeight(address user, uint64 weight)
237
+ internal
238
+ view
239
+ virtual
240
+ returns (VeBalance memory res);
228
241
  }
@@ -52,7 +52,7 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
52
52
  * @dev expected state changes:
53
53
  - a new lock with amount = amountToPull + amountExpired, expiry = expiry is created for msg.sender in positionData
54
54
  - pendle is taken in if necessary
55
- - _totalSupply, lastSupplyUpdatedAt, slopeChanges, totalSupplyAt is updated
55
+ - _totalSupply, lastSlopeChangeAppliedAt, slopeChanges, totalSupplyAt is updated
56
56
  - a checkpoint is added
57
57
  * @dev broadcast is not bundled since it can be done anytime after
58
58
  */
@@ -87,13 +87,14 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
87
87
  * @dev expected state changes:
88
88
  - positionData is cleared
89
89
  - pendle is transferred out
90
- - _totalSupply, lastSupplyUpdatedAt, slopeChanges, totalSupplyAt all doesn't need to be updated
91
- since these data will automatically hold true when _updateTotalSupply() is called
90
+ - _totalSupply, lastSlopeChangeAppliedAt, slopeChanges, totalSupplyAt all doesn't need to be updated
91
+ since these data will automatically hold true when _applySlopeChange() is called
92
92
  - no checkpoint is added
93
93
  * @dev broadcast is not bundled since it can be done anytime after
94
94
  */
95
- function withdraw(address user) external returns (uint128 amount) {
96
- require(isPositionExpired(user), "position not expired");
95
+ function withdraw() external returns (uint128 amount) {
96
+ address user = msg.sender;
97
+ require(_isPositionExpired(user), "position not expired");
97
98
  amount = positionData[user].amount;
98
99
 
99
100
  require(amount > 0, "zero position");
@@ -108,10 +109,10 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
108
109
  /**
109
110
  * @notice update & return the current totalSupply
110
111
  * @dev state changes expected:
111
- - _totalSupply & lastSupplyUpdatedAt is updated
112
+ - _totalSupply & lastSlopeChangeAppliedAt is updated
112
113
  */
113
114
  function totalSupplyCurrent() external virtual override returns (uint128) {
114
- (VeBalance memory supply, ) = _updateTotalSupply();
115
+ (VeBalance memory supply, ) = _applySlopeChange();
115
116
  return supply.getCurrentValue();
116
117
  }
117
118
 
@@ -146,7 +147,7 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
146
147
  * @dev expected state changes:
147
148
  - a new lock with the amount & expiry increase accordingly
148
149
  - pendle is taken in if necessary
149
- - _totalSupply, lastSupplyUpdatedAt, slopeChanges, totalSupplyAt is updated
150
+ - _totalSupply, lastSlopeChangeAppliedAt, slopeChanges, totalSupplyAt is updated
150
151
  - a checkpoint is added
151
152
  */
152
153
  function _increasePosition(
@@ -156,7 +157,7 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
156
157
  ) internal returns (uint128) {
157
158
  LockedPosition memory oldPosition = positionData[user];
158
159
 
159
- (VeBalance memory newSupply, ) = _updateTotalSupply();
160
+ (VeBalance memory newSupply, ) = _applySlopeChange();
160
161
 
161
162
  if (!MiniHelpers.isCurrentlyExpired(oldPosition.expiry)) {
162
163
  // remove old position not yet expired
@@ -185,11 +186,11 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
185
186
  * @notice update the totalSupply, processing all slope changes of past weeks. At the same time, set the finalized
186
187
  totalSupplyAt
187
188
  * @dev state changes expected:
188
- - _totalSupply, lastSupplyUpdatedAt, totalSupplyAt is updated
189
+ - _totalSupply, lastSlopeChangeAppliedAt, totalSupplyAt is updated
189
190
  */
190
- function _updateTotalSupply() internal returns (VeBalance memory, uint128) {
191
+ function _applySlopeChange() internal returns (VeBalance memory, uint128) {
191
192
  VeBalance memory supply = _totalSupply;
192
- uint128 wTime = lastSupplyUpdatedAt;
193
+ uint128 wTime = lastSlopeChangeAppliedAt;
193
194
  uint128 currentWeekStart = WeekMath.getCurrentWeekStart();
194
195
 
195
196
  if (wTime >= currentWeekStart) {
@@ -203,16 +204,16 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
203
204
  }
204
205
 
205
206
  _totalSupply = supply;
206
- lastSupplyUpdatedAt = wTime;
207
+ lastSlopeChangeAppliedAt = wTime;
207
208
 
208
- return (supply, lastSupplyUpdatedAt);
209
+ return (supply, lastSlopeChangeAppliedAt);
209
210
  }
210
211
 
211
212
  /// @notice broadcast position to all chains in chainIds
212
213
  function _broadcastPosition(address user, uint256[] calldata chainIds) public payable {
213
214
  require(chainIds.length != 0, "empty chainIds");
214
215
 
215
- (VeBalance memory supply, uint256 wTime) = _updateTotalSupply();
216
+ (VeBalance memory supply, uint256 wTime) = _applySlopeChange();
216
217
 
217
218
  bytes memory userData = (
218
219
  user == address(0) ? EMPTY_BYTES : abi.encode(user, positionData[user])
@@ -230,7 +231,7 @@ contract VotingEscrowPendleMainchain is IPVotingEscrow, VotingEscrowTokenBase, C
230
231
  }
231
232
 
232
233
  function _afterAddSidechainContract(address, uint256 chainId) internal virtual override {
233
- (VeBalance memory supply, uint256 wTime) = _updateTotalSupply();
234
+ (VeBalance memory supply, uint256 wTime) = _applySlopeChange();
234
235
  _broadcast(chainId, wTime, supply, EMPTY_BYTES);
235
236
  }
236
237
 
@@ -58,7 +58,7 @@ contract VotingEscrowPendleSidechain is VotingEscrowTokenBase, CelerReceiverUpg
58
58
 
59
59
  function _setNewTotalSupply(uint128 wTime, VeBalance memory supply) internal {
60
60
  assert(wTime == WeekMath.getWeekStartTimestamp(wTime));
61
- lastSupplyUpdatedAt = wTime;
61
+ lastSlopeChangeAppliedAt = wTime;
62
62
  _totalSupply = supply;
63
63
  emit SetNewTotalSupply(supply);
64
64
  }
@@ -27,16 +27,15 @@ abstract contract VotingEscrowTokenBase is IPVeToken {
27
27
  uint128 public constant MAX_LOCK_TIME = 104 weeks;
28
28
 
29
29
  VeBalance internal _totalSupply;
30
- uint128 public lastSupplyUpdatedAt;
30
+ uint128 public lastSlopeChangeAppliedAt;
31
31
 
32
32
  mapping(address => LockedPosition) public positionData;
33
33
 
34
34
  constructor() {
35
- lastSupplyUpdatedAt = WeekMath.getCurrentWeekStart();
35
+ lastSlopeChangeAppliedAt = WeekMath.getCurrentWeekStart();
36
36
  }
37
37
 
38
38
  function balanceOf(address user) public view virtual returns (uint128) {
39
- if (isPositionExpired(user)) return 0;
40
39
  return positionData[user].convertToVeBalance().getCurrentValue();
41
40
  }
42
41
 
@@ -46,7 +45,7 @@ abstract contract VotingEscrowTokenBase is IPVeToken {
46
45
 
47
46
  function totalSupplyCurrent() external virtual returns (uint128);
48
47
 
49
- function isPositionExpired(address user) public view returns (bool) {
48
+ function _isPositionExpired(address user) internal view returns (bool) {
50
49
  return MiniHelpers.isCurrentlyExpired(positionData[user].expiry);
51
50
  }
52
51
  }