@pendle/core-v2 3.0.0-beta-11 → 3.0.0-beta-12
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.
- package/contracts/LiquidityMining/CrossChainMsg/PendleMsgReceiveEndpointUpg.sol +5 -23
- package/contracts/LiquidityMining/CrossChainMsg/PendleMsgReceiverAppUpg.sol +2 -5
- package/contracts/LiquidityMining/CrossChainMsg/PendleMsgSendEndpointUpg.sol +6 -20
- package/contracts/LiquidityMining/CrossChainMsg/PendleMsgSenderAppUpg.sol +6 -27
- package/contracts/LiquidityMining/CrossChainMsg/libraries/ExcessivelySafeCall.sol +1 -2
- package/contracts/LiquidityMining/CrossChainMsg/libraries/LayerZeroHelper.sol +1 -1
- package/contracts/LiquidityMining/GaugeController/PendleGaugeControllerBaseUpg.sol +16 -17
- package/contracts/LiquidityMining/GaugeController/PendleGaugeControllerMainchainUpg.sol +6 -7
- package/contracts/LiquidityMining/GaugeController/PendleGaugeControllerSidechainUpg.sol +7 -8
- package/contracts/LiquidityMining/PendleMerkleDistributor.sol +2 -11
- package/contracts/LiquidityMining/VeDistributor/PendleFeeDistributor.sol +14 -37
- package/contracts/LiquidityMining/VeDistributor/PendleFeeDistributorV2.sol +19 -34
- package/contracts/LiquidityMining/VotingController/PendleVotingControllerUpg.sol +4 -14
- package/contracts/LiquidityMining/VotingController/VotingControllerStorageUpg.sol +4 -16
- package/contracts/LiquidityMining/VotingEscrow/VotingEscrowPendleMainchain.sol +11 -39
- package/contracts/LiquidityMining/VotingEscrow/VotingEscrowPendleSidechain.sol +3 -10
- package/contracts/LiquidityMining/VotingEscrow/VotingEscrowTokenBase.sol +1 -1
- package/contracts/LiquidityMining/libraries/VeBalanceLib.sol +5 -20
- package/contracts/LiquidityMining/libraries/VeHistoryLib.sol +1 -3
- package/contracts/core/Market/MarketMathCore.sol +12 -37
- package/contracts/core/Market/OracleLib.sol +6 -24
- package/contracts/core/Market/PendleExternalRewardDistributor.sol +4 -10
- package/contracts/core/Market/PendleGauge.sol +3 -9
- package/contracts/core/Market/PendleMarket.sol +14 -39
- package/contracts/core/Market/PendleMarketFactory.sol +14 -21
- package/contracts/core/Market/v2/PendleGaugeV2.sol +8 -24
- package/contracts/core/Market/v2/PendleMarketFactoryV2.sol +7 -27
- package/contracts/core/Market/v2/PendleMarketV2.sol +13 -36
- package/contracts/core/Market/v3/PendleMarketFactoryV3.sol +137 -0
- package/contracts/core/Market/v3/PendleMarketV3.sol +360 -0
- package/contracts/core/RewardManager/PendleLinearDistributor.sol +143 -0
- package/contracts/core/RewardManager/RewardManager.sol +14 -7
- package/contracts/core/RewardManager/RewardManagerAbstract.sol +5 -17
- package/contracts/core/StandardizedYield/SYBase.sol +10 -40
- package/contracts/core/StandardizedYield/SYBaseUpg.sol +197 -0
- package/contracts/core/StandardizedYield/SYBaseWithRewards.sol +9 -41
- package/contracts/core/StandardizedYield/SYBaseWithRewardsUpg.sol +88 -0
- package/contracts/core/StandardizedYield/SYUtils.sol +1 -4
- package/contracts/core/StandardizedYield/StEthHelper.sol +3 -9
- package/contracts/core/StandardizedYield/implementations/AaveV3/PendleAaveV3SY.sol +94 -0
- package/contracts/core/StandardizedYield/implementations/AaveV3/libraries/AaveAdapterLib.sol +19 -0
- package/contracts/core/StandardizedYield/implementations/AaveV3/libraries/WadRayMath.sol +126 -0
- package/contracts/core/StandardizedYield/implementations/Ankr/PendleAnkrBNBSY.sol +4 -12
- package/contracts/core/StandardizedYield/implementations/Ape/sAPE.sol +5 -19
- package/contracts/core/StandardizedYield/implementations/BalancerStable/AuraEthxBbAWethSY.sol +4 -14
- package/contracts/core/StandardizedYield/implementations/BalancerStable/AuraSwEthBbAWethSYV2.sol +4 -14
- package/contracts/core/StandardizedYield/implementations/BalancerStable/{PendleAuraWethVethSY.sol → AuraWethVethSYUpg.sol} +13 -20
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraBbAWethSwethSY.sol +3 -7
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraWethAnkrethSYV2.sol +12 -29
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraWethRocketEthSYV2.sol +12 -29
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraWethStafiEthSY.sol +12 -29
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraWethWstethSYV2.sol +14 -39
- package/contracts/core/StandardizedYield/implementations/BalancerStable/PendleAuraWstethAnkreth.sol +7 -28
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/ComposableStable/ComposableStableMath.sol +13 -30
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/ComposableStable/ComposableStablePreviewProxy.sol +1 -1
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/ComposableStable/ComposableStablePreviewV4.sol +50 -153
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/ComposableStable/ComposableStablePreviewV5.sol +50 -157
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/Linear/BbAPoolHelper.sol +4 -16
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/Linear/LinearMath.sol +6 -25
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/Linear/LinearPreview.sol +36 -34
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/MetaStable/MetaStableMath.sol +4 -13
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/MetaStable/MetaStablePreview.sol +20 -58
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/PendleAuraBalancerStableLPSYV2.sol +28 -79
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/PendleAuraBalancerStableLPSYV3Upg.sol +310 -0
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/StablePoolUserData.sol +1 -3
- package/contracts/core/StandardizedYield/implementations/BalancerStable/base/StablePreviewBase.sol +2 -6
- package/contracts/core/StandardizedYield/implementations/BenQi/PendleQiTokenHelper.sol +5 -13
- package/contracts/core/StandardizedYield/implementations/BenQi/PendleQiTokenSY.sol +9 -29
- package/contracts/core/StandardizedYield/implementations/CamelotV1Volatile/CamelotRewardHelper.sol +2 -8
- package/contracts/core/StandardizedYield/implementations/CamelotV1Volatile/CamelotV1VolatileCommon.sol +1 -5
- package/contracts/core/StandardizedYield/implementations/CamelotV1Volatile/CamelotV1VolatileLpHelper.sol +8 -19
- package/contracts/core/StandardizedYield/implementations/CamelotV1Volatile/CamelotV1VolatilePreview.sol +7 -25
- package/contracts/core/StandardizedYield/implementations/CamelotV1Volatile/PendleCamelotV1VolatileSY.sol +8 -27
- package/contracts/core/StandardizedYield/implementations/ChainlinkRelayer/PendleChainlinkReceiver.sol +2 -2
- package/contracts/core/StandardizedYield/implementations/ChainlinkRelayer/PendleChainlinkRelayer.sol +4 -9
- package/contracts/core/StandardizedYield/implementations/Convex/PendleCurveFraxUsdcSY.sol +3 -15
- package/contracts/core/StandardizedYield/implementations/Convex/PendleCurveUsdd3CrvSY.sol +5 -23
- package/contracts/core/StandardizedYield/implementations/Convex/base/Curve3CrvPoolHelper.sol +10 -40
- package/contracts/core/StandardizedYield/implementations/Convex/base/CurveFraxUsdcPoolHelper.sol +2 -8
- package/contracts/core/StandardizedYield/implementations/Convex/base/CurveUsdd3CrvPoolHelper.sol +2 -7
- package/contracts/core/StandardizedYield/implementations/Convex/base/PendleConvexLPSY.sol +5 -20
- package/contracts/core/StandardizedYield/implementations/Flux/FluxTokenLib.sol +6 -4
- package/contracts/core/StandardizedYield/implementations/Flux/PendleFluxLendingSY.sol +3 -11
- package/contracts/core/StandardizedYield/implementations/GLP/GLPPreviewHelper.sol +3 -9
- package/contracts/core/StandardizedYield/implementations/GLP/GMTokenPricingHelper.sol +115 -0
- package/contracts/core/StandardizedYield/implementations/GLP/PendleGMV2TokenSY.sol +134 -0
- package/contracts/core/StandardizedYield/implementations/GLP/PendleGlpSY.sol +5 -19
- package/contracts/core/StandardizedYield/implementations/HMX/HLPPricingHelper.sol +3 -4
- package/contracts/core/StandardizedYield/implementations/HMX/PendleHlpSY.sol +18 -25
- package/contracts/core/StandardizedYield/implementations/Kyber/KyberMathHelper.sol +425 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/KyberNftManagerBaseUpg.sol +438 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/PendleKyberElasticSYUpg.sol +155 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/FullMath.sol +123 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/LiqDeltaMath.sol +17 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/LiquidityMath.sol +74 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/MathConstants.sol +19 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/QtyDeltaMath.sol +103 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/QuadMath.sol +31 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/ReinvestmentMath.sol +26 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/SafeCast.sol +73 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/SwapMath.sol +272 -0
- package/contracts/core/StandardizedYield/implementations/Kyber/libraries/TickMath.sol +223 -0
- package/contracts/core/StandardizedYield/implementations/MUX/MlpPricingHelper.sol +26 -0
- package/contracts/core/StandardizedYield/implementations/MUX/PendleMlpSY.sol +195 -0
- package/contracts/core/StandardizedYield/implementations/MantleStakedEth/PendleMantleStakedEthSY.sol +12 -41
- package/contracts/core/StandardizedYield/implementations/MantleStakedEth/PendleOracleForSyProxy.sol +1 -1
- package/contracts/core/StandardizedYield/implementations/PendleArbitrumStakedEthSY.sol +13 -42
- package/contracts/core/StandardizedYield/implementations/PendleBridgedLSDSY.sol +4 -11
- package/contracts/core/StandardizedYield/implementations/PendleERC4626SY.sol +4 -16
- package/contracts/core/StandardizedYield/implementations/PendleEUSDSY.sol +3 -11
- package/contracts/core/StandardizedYield/implementations/PendleGdaiSY.sol +3 -11
- package/contracts/core/StandardizedYield/implementations/PendleLooksStakingSY.sol +5 -18
- package/contracts/core/StandardizedYield/implementations/PendleSfrxEthSY.sol +3 -7
- package/contracts/core/StandardizedYield/implementations/PendleStargateLPSY.sol +5 -18
- package/contracts/core/StandardizedYield/implementations/PendleWbEthSY.sol +3 -10
- package/contracts/core/StandardizedYield/implementations/PendleWstEthSY.sol +4 -12
- package/contracts/core/StandardizedYield/implementations/Silo/PendleSiloWithIncentiveSY.sol +157 -0
- package/contracts/core/StandardizedYield/implementations/Stader/PendleETHXSY.sol +4 -12
- package/contracts/core/StandardizedYield/implementations/Swell/PendleSwETH.sol +4 -12
- package/contracts/core/StandardizedYield/implementations/Thena/PendleThenaSY.sol +9 -29
- package/contracts/core/StandardizedYield/implementations/Thena/ThenaLpHelper.sol +3 -10
- package/contracts/core/StandardizedYield/implementations/Thena/ThenaMath.sol +9 -30
- package/contracts/core/StandardizedYield/implementations/Thena/ThenaPreview.sol +10 -40
- package/contracts/core/YieldContracts/InterestManagerYT.sol +6 -8
- package/contracts/core/YieldContracts/PendlePrincipalToken.sol +1 -1
- package/contracts/core/YieldContracts/PendleYieldContractFactory.sol +2 -3
- package/contracts/core/YieldContracts/PendleYieldToken.sol +17 -44
- package/contracts/core/YieldContractsV2/InterestManagerYTV2.sol +5 -14
- package/contracts/core/YieldContractsV2/PendlePrincipalTokenV2.sol +1 -1
- package/contracts/core/YieldContractsV2/PendleYieldContractFactoryV2.sol +2 -3
- package/contracts/core/YieldContractsV2/PendleYieldTokenV2.sol +13 -48
- package/contracts/core/erc20/PendleERC20.sol +2 -8
- package/contracts/core/erc20/PendleERC20Permit.sol +2 -6
- package/contracts/core/erc20/PendleERC20PermitUpg.sol +82 -0
- package/contracts/core/erc20/PendleERC20Upg.sol +334 -0
- package/contracts/core/libraries/ArrayLib.sol +7 -8
- package/contracts/core/libraries/BaseSplitCodeFactory.sol +1 -6
- package/contracts/core/libraries/Errors.sol +19 -1
- package/contracts/core/libraries/ExpiryUtilsLib.sol +3 -26
- package/contracts/core/libraries/StringLib.sol +5 -21
- package/contracts/core/libraries/TokenHelper.sol +3 -3
- package/contracts/core/libraries/math/LogExpMath.sol +1 -4
- package/contracts/core/libraries/math/PMath.sol +13 -15
- package/contracts/interfaces/AaveV3/IAaveV3AToken.sol +15 -0
- package/contracts/interfaces/AaveV3/IAaveV3Pool.sol +11 -0
- package/contracts/interfaces/Balancer/IComposableStable.sol +3 -4
- package/contracts/interfaces/Balancer/IERC4626LinearPool.sol +2 -10
- package/contracts/interfaces/Balancer/IMetaStablePool.sol +3 -11
- package/contracts/interfaces/Balancer/IVault.sol +3 -8
- package/contracts/interfaces/BinanceEth/IWBETH.sol +1 -1
- package/contracts/interfaces/Camelot/ICamelotNFTFactory.sol +1 -3
- package/contracts/interfaces/Camelot/ICamelotNFTHandler.sol +2 -10
- package/contracts/interfaces/Camelot/ICamelotNitroPool.sol +0 -1
- package/contracts/interfaces/Camelot/ICamelotNitroPoolFactory.sol +3 -12
- package/contracts/interfaces/Camelot/ICamelotPair.sol +5 -25
- package/contracts/interfaces/Camelot/ICamelotRouter.sol +1 -5
- package/contracts/interfaces/Camelot/IXGrail.sol +3 -11
- package/contracts/interfaces/ConvexCurve/IBooster.sol +1 -3
- package/contracts/interfaces/Curve/ICrvPool.sol +3 -12
- package/contracts/interfaces/Curve/ITriCrvPool.sol +2 -9
- package/contracts/interfaces/Flux/IFluxErc20.sol +1 -1
- package/contracts/interfaces/Flux/IFluxInterestRateModel.sol +1 -5
- package/contracts/interfaces/GMX/IGMXPriceHelper.sol +6 -0
- package/contracts/interfaces/GMX/IGMXVault.sol +2 -9
- package/contracts/interfaces/GMX/IRewardRouterV2.sol +1 -4
- package/contracts/interfaces/HMX/IHLPStaking.sol +1 -1
- package/contracts/interfaces/HMX/IHMXCalculator.sol +1 -1
- package/contracts/interfaces/HMX/IHMXCompounder.sol +1 -1
- package/contracts/interfaces/HMX/IHMXStaking.sol +1 -1
- package/contracts/interfaces/HMX/IHMXVester.sol +1 -1
- package/contracts/interfaces/IApeStaking.sol +3 -9
- package/contracts/interfaces/IBenQiInterestRateModel.sol +1 -5
- package/contracts/interfaces/IDiamondCut.sol +1 -5
- package/contracts/interfaces/IDiamondLoupe.sol +1 -3
- package/contracts/interfaces/ILayerZeroReceiver.sol +1 -6
- package/contracts/interfaces/IPActionAddRemoveLiqV3.sol +10 -2
- package/contracts/interfaces/IPActionInfoStatic.sol +4 -7
- package/contracts/interfaces/IPActionMarketAuxStatic.sol +5 -9
- package/contracts/interfaces/IPActionMarketCoreStatic.sol +118 -58
- package/contracts/interfaces/IPActionMintRedeemStatic.sol +38 -21
- package/contracts/interfaces/IPActionMiscV3.sol +51 -26
- package/contracts/interfaces/IPActionStorageStatic.sol +5 -1
- package/contracts/interfaces/IPAllActionTypeV3.sol +1 -0
- package/contracts/interfaces/IPBulkSeller.sol +49 -0
- package/contracts/interfaces/IPBulkSellerFactory.sol +12 -0
- package/contracts/interfaces/IPBulkSellerSYCallback.sol +6 -0
- package/contracts/interfaces/IPFeeDistributor.sol +1 -3
- package/contracts/interfaces/IPFeeDistributorV2.sol +8 -7
- package/contracts/interfaces/IPGaugeController.sol +2 -8
- package/contracts/interfaces/IPGaugeControllerMainchain.sol +1 -5
- package/contracts/interfaces/IPInterestManagerYT.sol +3 -3
- package/contracts/interfaces/IPInterestManagerYTV2.sol +1 -4
- package/contracts/interfaces/IPLimitRouter.sol +24 -19
- package/contracts/interfaces/IPLinearDistributor.sol +21 -0
- package/contracts/interfaces/IPMarket.sol +4 -17
- package/contracts/interfaces/IPMarketFactory.sol +2 -13
- package/contracts/interfaces/IPMarketFactoryV3.sol +24 -0
- package/contracts/interfaces/IPMarketV3.sol +8 -0
- package/contracts/interfaces/IPOffchainStorage.sol +11 -0
- package/contracts/interfaces/IPPriceFeed.sol +6 -0
- package/contracts/interfaces/IPPtOracle.sol +2 -9
- package/contracts/interfaces/IPRouterHelper.sol +11 -7
- package/contracts/interfaces/IPRouterStatic.sol +1 -3
- package/contracts/interfaces/IPVotingController.sol +7 -19
- package/contracts/interfaces/IPVotingEscrowMainchain.sol +2 -8
- package/contracts/interfaces/IPYieldToken.sol +2 -8
- package/contracts/interfaces/IPYieldTokenV2.sol +1 -6
- package/contracts/interfaces/IPendlePreviewHelper.sol +2 -8
- package/contracts/interfaces/IRewardManager.sol +1 -4
- package/contracts/interfaces/IStETH.sol +1 -4
- package/contracts/interfaces/IStandardizedYield.sol +9 -16
- package/contracts/interfaces/IStargateLP.sol +0 -3
- package/contracts/interfaces/IStargateRouter.sol +1 -5
- package/contracts/interfaces/Kyber/IKyberElasticFactory.sol +157 -0
- package/contracts/interfaces/Kyber/IKyberElasticPool.sol +101 -0
- package/contracts/interfaces/Kyber/IKyberElasticRouter.sol +98 -0
- package/contracts/interfaces/Kyber/IKyberLiquidityMining.sol +209 -0
- package/contracts/interfaces/Kyber/IKyberMathHelper.sol +28 -0
- package/contracts/interfaces/Kyber/IKyberPositionManager.sol +179 -0
- package/contracts/interfaces/Lybra/IEUSD.sol +1 -1
- package/contracts/interfaces/MUX/IMUXRewardRouter.sol +139 -0
- package/contracts/interfaces/Silo/ISilo.sol +298 -0
- package/contracts/interfaces/Silo/ISiloIncentiveController.sol +16 -0
- package/contracts/interfaces/Silo/ISiloLens.sol +6 -0
- package/contracts/interfaces/Stader/IStaderStakeManager.sol +2 -2
- package/contracts/interfaces/Thena/IThenaFactory.sol +1 -5
- package/contracts/interfaces/Thena/IThenaGaugeV2.sol +1 -2
- package/contracts/interfaces/Thena/IThenaPair.sol +3 -5
- package/contracts/limit/LimitMathCore.sol +69 -60
- package/contracts/limit/{PendleOrderMixin.sol → LimitRouterBase.sol} +96 -79
- package/contracts/limit/PendleLimitRouter.sol +9 -13
- package/contracts/offchain-helpers/AutomateReady.sol +17 -32
- package/contracts/offchain-helpers/BaseSplitCodeFactoryContract.sol +6 -3
- package/contracts/offchain-helpers/BoringLpSeller.sol +4 -17
- package/contracts/offchain-helpers/BoringPtSeller.sol +2 -7
- package/contracts/offchain-helpers/Broadcaster.sol +1 -1
- package/contracts/offchain-helpers/BytesLib.sol +26 -14
- package/contracts/offchain-helpers/EmptyUUPS.sol +0 -1
- package/contracts/offchain-helpers/LegacyNFTHelper.sol +4 -23
- package/contracts/offchain-helpers/LimitBackendHelper.sol +25 -16
- package/contracts/offchain-helpers/MarketExchangeRateLib.sol +2 -13
- package/contracts/offchain-helpers/Multicall2.sol +2 -7
- package/contracts/offchain-helpers/PendleMulticallV1.sol +7 -7
- package/contracts/offchain-helpers/PendleMulticallV2.sol +12 -13
- package/contracts/offchain-helpers/PendleOffchainStorage.sol +59 -0
- package/contracts/offchain-helpers/SimulateHelper.sol +6 -7
- package/contracts/offchain-helpers/errors/SDKErrorsDirectory.sol +15 -1
- package/contracts/oracles/PendleLpOracleLib.sol +9 -10
- package/contracts/oracles/PendlePtOracle.sol +8 -19
- package/contracts/oracles/PendlePtOracleLib.sol +8 -13
- package/contracts/oracles/samples/PendleLpGlpOracle.sol +6 -10
- package/contracts/oracles/samples/PendlePtGlpOracle.sol +6 -10
- package/contracts/oracles/samples/PendlePtUsdChainlinkOracle.sol +8 -15
- package/contracts/router/ActionAddRemoveLiqV3.sol +147 -52
- package/contracts/router/ActionCallbackV3.sol +11 -4
- package/contracts/router/ActionMiscV3.sol +43 -33
- package/contracts/router/ActionSwapPTV3.sol +18 -6
- package/contracts/router/ActionSwapYTV3.sol +42 -14
- package/contracts/router/PendleRouterHelper.sol +72 -40
- package/contracts/router/PendleRouterV3.sol +50 -50
- package/contracts/router/base/ActionBase.sol +86 -43
- package/contracts/router/base/CallbackHelper.sol +18 -20
- package/contracts/router/base/MarketApproxLib.sol +36 -32
- package/contracts/router/swap-aggregator/PendleSwap.sol +31 -7
- package/contracts/router/swap-aggregator/kyberswap/interfaces/IAggregationExecutorOptimistic.sol +63 -0
- package/contracts/router/swap-aggregator/kyberswap/interfaces/IExecutorHelper.sol +314 -0
- package/contracts/router/swap-aggregator/kyberswap/interfaces/IExecutorHelperL2.sol +560 -0
- package/contracts/router/swap-aggregator/kyberswap/{IMetaAggregationRouterV2.sol → interfaces/IMetaAggregationRouterV2.sol} +11 -6
- package/contracts/router/swap-aggregator/kyberswap/{KyberInputScalingHelper.sol → l1-contracts/InputScalingHelper.sol} +70 -19
- package/contracts/router/swap-aggregator/kyberswap/{ScalingDataLib.sol → l1-contracts/ScalingDataLib.sol} +111 -53
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/BytesHelper.sol +29 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/CalldataReader.sol +149 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/CalldataWriter.sol +118 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/Common.sol +42 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/DexScaler.sol +382 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/ExecutorReader.sol +61 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/InputScalingHelperL2.sol +329 -0
- package/contracts/router/swap-aggregator/kyberswap/l2-contracts/ScalingDataL2Lib.sol +173 -0
- package/contracts/router/swap-aggregator/oneinch/I1inchAggregationRouterV5.sol +4 -10
- package/contracts/router/swap-aggregator/oneinch/OneInchAggregationRouterHelper.sol +20 -14
- package/deployments/1-core.json +5 -2
- package/deployments/1-markets/EPENDLE-SEP2024.json +12 -0
- package/deployments/1-markets/SFRAX-MARCH2024.json +10 -0
- package/deployments/1-markets/SILO-CRVUSD-MARCH2024.json +10 -0
- package/deployments/10-core.json +6 -3
- package/deployments/42161-core.json +5 -2
- package/deployments/42161-markets/AAVE-USDC-JUNE2024.json +11 -0
- package/deployments/42161-markets/ARBSILO-USDC-FEB2024.json +10 -0
- package/deployments/42161-markets/GM-ARB-USDC-MARCH2024.json +10 -0
- package/deployments/42161-markets/KYBER-AXLWSTETH-WSTETH-MARCH2024.json +10 -0
- package/deployments/42161-markets/MLP-MARCH2024.json +10 -0
- package/deployments/42161-markets/WSTETH-ARBITRUM-MARCH2024.json +11 -0
- package/deployments/42161-markets/WSTETHSILO-ETH-MARCH2024.json +11 -0
- package/deployments/56-core.json +5 -2
- package/deployments/merkle-distribution/2023-10-26.json +7300 -0
- package/deployments/merkle-distribution/2023-11-30.json +7730 -0
- package/package.json +8 -8
- package/contracts/limit/helpers/ArgumentsDecoder.sol +0 -47
- package/contracts/limit/helpers/Permitable.sol +0 -48
- package/contracts/limit/helpers/RevertReasonParser.sol +0 -75
- package/contracts/offchain-helpers/ChainlinkRelayerGelato.sol +0 -37
- package/contracts/offchain-helpers/PtAndLpToAsset.sol +0 -62
- package/contracts/offchain-helpers/router-static/PendleRouterStatic.sol +0 -19
- package/contracts/offchain-helpers/router-static/base/ActionInfoStatic.sol +0 -112
- package/contracts/offchain-helpers/router-static/base/ActionLimitOrdersStatic.sol +0 -145
- package/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol +0 -171
- package/contracts/offchain-helpers/router-static/base/ActionMarketCoreStatic.sol +0 -582
- package/contracts/offchain-helpers/router-static/base/ActionMintRedeemStatic.sol +0 -116
- package/contracts/offchain-helpers/router-static/base/ActionStorageStatic.sol +0 -64
- package/contracts/offchain-helpers/router-static/base/ActionVePendleStatic.sol +0 -53
- package/contracts/offchain-helpers/router-static/base/StorageLayout.sol +0 -18
- package/contracts/router/swap-aggregator/kyberswap/IExecutorHelper.sol +0 -231
- package/deployments/1-markets/BALANCER-LP-AURA-VETH-WETH-SEP2024.json +0 -8
- /package/contracts/router/swap-aggregator/kyberswap/{IAggregationExecutor.sol → interfaces/IAggregationExecutor.sol} +0 -0
- /package/deployments/1-markets/{BALANCER-LP-AURA-BBAWETHSWETH-SEP-26-2024.json → deprecated/BALANCER-LP-AURA-BBAWETHSWETH-SEP-26-2024.json} +0 -0
- /package/deployments/1-markets/{BALANCER-LP-AURA-ETHX-BBAWETH-SEP-26-2024.json → deprecated/BALANCER-LP-AURA-ETHX-BBAWETH-SEP-26-2024.json} +0 -0
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
import "../../../interfaces/IPMarketV3.sol";
|
|
5
|
+
import "../../../interfaces/IPMarketFactoryV3.sol";
|
|
6
|
+
import "../../../interfaces/IPMarketSwapCallback.sol";
|
|
7
|
+
|
|
8
|
+
import "../../erc20/PendleERC20Permit.sol";
|
|
9
|
+
import "../PendleGauge.sol";
|
|
10
|
+
import "../OracleLib.sol";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
Invariance to maintain:
|
|
14
|
+
- Internal balances totalPt & totalSy not interfered by people transferring tokens in directly
|
|
15
|
+
- address(0) & address(this) should never have any rewards & activeBalance accounting done. This is
|
|
16
|
+
guaranteed by address(0) & address(this) check in each updateForTwo function
|
|
17
|
+
*/
|
|
18
|
+
contract PendleMarketV3 is PendleERC20Permit, PendleGauge, IPMarketV3 {
|
|
19
|
+
using PMath for uint256;
|
|
20
|
+
using PMath for int256;
|
|
21
|
+
using MarketMathCore for MarketState;
|
|
22
|
+
using SafeERC20 for IERC20;
|
|
23
|
+
using PYIndexLib for IPYieldToken;
|
|
24
|
+
using OracleLib for OracleLib.Observation[65535];
|
|
25
|
+
|
|
26
|
+
struct MarketStorage {
|
|
27
|
+
int128 totalPt;
|
|
28
|
+
int128 totalSy;
|
|
29
|
+
// 1 SLOT = 256 bits
|
|
30
|
+
uint96 lastLnImpliedRate;
|
|
31
|
+
uint16 observationIndex;
|
|
32
|
+
uint16 observationCardinality;
|
|
33
|
+
uint16 observationCardinalityNext;
|
|
34
|
+
// 1 SLOT = 144 bits
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
string private constant NAME = "Pendle Market";
|
|
38
|
+
string private constant SYMBOL = "PENDLE-LPT";
|
|
39
|
+
|
|
40
|
+
IPPrincipalToken internal immutable PT;
|
|
41
|
+
IStandardizedYield internal immutable SY;
|
|
42
|
+
IPYieldToken internal immutable YT;
|
|
43
|
+
|
|
44
|
+
address public immutable factory;
|
|
45
|
+
uint256 public immutable expiry;
|
|
46
|
+
|
|
47
|
+
int256 internal immutable scalarRoot;
|
|
48
|
+
int256 internal immutable initialAnchor;
|
|
49
|
+
uint80 internal immutable lnFeeRateRoot;
|
|
50
|
+
|
|
51
|
+
MarketStorage public _storage;
|
|
52
|
+
|
|
53
|
+
OracleLib.Observation[65535] public observations;
|
|
54
|
+
|
|
55
|
+
modifier notExpired() {
|
|
56
|
+
if (isExpired()) revert Errors.MarketExpired();
|
|
57
|
+
_;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
constructor(
|
|
61
|
+
address _PT,
|
|
62
|
+
int256 _scalarRoot,
|
|
63
|
+
int256 _initialAnchor,
|
|
64
|
+
uint80 _lnFeeRateRoot,
|
|
65
|
+
address _vePendle,
|
|
66
|
+
address _gaugeController
|
|
67
|
+
) PendleERC20Permit(NAME, SYMBOL, 18) PendleGauge(IPPrincipalToken(_PT).SY(), _vePendle, _gaugeController) {
|
|
68
|
+
PT = IPPrincipalToken(_PT);
|
|
69
|
+
SY = IStandardizedYield(PT.SY());
|
|
70
|
+
YT = IPYieldToken(PT.YT());
|
|
71
|
+
|
|
72
|
+
(_storage.observationCardinality, _storage.observationCardinalityNext) = observations.initialize(
|
|
73
|
+
uint32(block.timestamp)
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
if (_scalarRoot <= 0) revert Errors.MarketScalarRootBelowZero(_scalarRoot);
|
|
77
|
+
|
|
78
|
+
scalarRoot = _scalarRoot;
|
|
79
|
+
initialAnchor = _initialAnchor;
|
|
80
|
+
lnFeeRateRoot = _lnFeeRateRoot;
|
|
81
|
+
expiry = IPPrincipalToken(_PT).expiry();
|
|
82
|
+
factory = msg.sender;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @notice PendleMarket allows users to provide in PT & SY in exchange for LPs, which
|
|
87
|
+
* will grant LP holders more exchange fee over time
|
|
88
|
+
* @dev will mint as much LP as possible such that the corresponding SY and PT used do
|
|
89
|
+
* not exceed `netSyDesired` and `netPtDesired`, respectively
|
|
90
|
+
* @dev PT and SY should be transferred to this contract prior to calling
|
|
91
|
+
* @dev will revert if PT is expired
|
|
92
|
+
*/
|
|
93
|
+
function mint(
|
|
94
|
+
address receiver,
|
|
95
|
+
uint256 netSyDesired,
|
|
96
|
+
uint256 netPtDesired
|
|
97
|
+
) external nonReentrant notExpired returns (uint256 netLpOut, uint256 netSyUsed, uint256 netPtUsed) {
|
|
98
|
+
MarketState memory market = readState(msg.sender);
|
|
99
|
+
PYIndex index = YT.newIndex();
|
|
100
|
+
|
|
101
|
+
uint256 lpToReserve;
|
|
102
|
+
|
|
103
|
+
(lpToReserve, netLpOut, netSyUsed, netPtUsed) = market.addLiquidity(
|
|
104
|
+
netSyDesired,
|
|
105
|
+
netPtDesired,
|
|
106
|
+
block.timestamp
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// initializing the market
|
|
110
|
+
if (lpToReserve != 0) {
|
|
111
|
+
market.setInitialLnImpliedRate(index, initialAnchor, block.timestamp);
|
|
112
|
+
_mint(address(1), lpToReserve);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
_mint(receiver, netLpOut);
|
|
116
|
+
|
|
117
|
+
_writeState(market);
|
|
118
|
+
|
|
119
|
+
if (_selfBalance(SY) < market.totalSy.Uint())
|
|
120
|
+
revert Errors.MarketInsufficientSyReceived(_selfBalance(SY), market.totalSy.Uint());
|
|
121
|
+
if (_selfBalance(PT) < market.totalPt.Uint())
|
|
122
|
+
revert Errors.MarketInsufficientPtReceived(_selfBalance(PT), market.totalPt.Uint());
|
|
123
|
+
|
|
124
|
+
emit Mint(receiver, netLpOut, netSyUsed, netPtUsed);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @notice LP Holders can burn their LP to receive back SY & PT proportionally
|
|
129
|
+
* to their share of the market
|
|
130
|
+
*/
|
|
131
|
+
function burn(
|
|
132
|
+
address receiverSy,
|
|
133
|
+
address receiverPt,
|
|
134
|
+
uint256 netLpToBurn
|
|
135
|
+
) external nonReentrant returns (uint256 netSyOut, uint256 netPtOut) {
|
|
136
|
+
MarketState memory market = readState(msg.sender);
|
|
137
|
+
|
|
138
|
+
_burn(address(this), netLpToBurn);
|
|
139
|
+
|
|
140
|
+
(netSyOut, netPtOut) = market.removeLiquidity(netLpToBurn);
|
|
141
|
+
|
|
142
|
+
if (receiverSy != address(this)) IERC20(SY).safeTransfer(receiverSy, netSyOut);
|
|
143
|
+
if (receiverPt != address(this)) IERC20(PT).safeTransfer(receiverPt, netPtOut);
|
|
144
|
+
|
|
145
|
+
_writeState(market);
|
|
146
|
+
|
|
147
|
+
emit Burn(receiverSy, receiverPt, netLpToBurn, netSyOut, netPtOut);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @notice Pendle Market allows swaps between PT & SY it is holding. This function
|
|
152
|
+
* aims to swap an exact amount of PT to SY.
|
|
153
|
+
* @dev steps working of this contract
|
|
154
|
+
- The outcome amount of SY will be precomputed by MarketMathLib
|
|
155
|
+
- Release the calculated amount of SY to receiver
|
|
156
|
+
- Callback to msg.sender if data.length > 0
|
|
157
|
+
- Ensure exactPtIn amount of PT has been transferred to this address
|
|
158
|
+
* @dev will revert if PT is expired
|
|
159
|
+
* @param data bytes data to be sent in the callback (if any)
|
|
160
|
+
*/
|
|
161
|
+
function swapExactPtForSy(
|
|
162
|
+
address receiver,
|
|
163
|
+
uint256 exactPtIn,
|
|
164
|
+
bytes calldata data
|
|
165
|
+
) external nonReentrant notExpired returns (uint256 netSyOut, uint256 netSyFee) {
|
|
166
|
+
MarketState memory market = readState(msg.sender);
|
|
167
|
+
|
|
168
|
+
uint256 netSyToReserve;
|
|
169
|
+
(netSyOut, netSyFee, netSyToReserve) = market.swapExactPtForSy(YT.newIndex(), exactPtIn, block.timestamp);
|
|
170
|
+
|
|
171
|
+
if (receiver != address(this)) IERC20(SY).safeTransfer(receiver, netSyOut);
|
|
172
|
+
IERC20(SY).safeTransfer(market.treasury, netSyToReserve);
|
|
173
|
+
|
|
174
|
+
_writeState(market);
|
|
175
|
+
|
|
176
|
+
if (data.length > 0) {
|
|
177
|
+
IPMarketSwapCallback(msg.sender).swapCallback(exactPtIn.neg(), netSyOut.Int(), data);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (_selfBalance(PT) < market.totalPt.Uint())
|
|
181
|
+
revert Errors.MarketInsufficientPtReceived(_selfBalance(PT), market.totalPt.Uint());
|
|
182
|
+
|
|
183
|
+
emit Swap(msg.sender, receiver, exactPtIn.neg(), netSyOut.Int(), netSyFee, netSyToReserve);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* @notice Pendle Market allows swaps between PT & SY it is holding. This function
|
|
188
|
+
* aims to swap SY for an exact amount of PT.
|
|
189
|
+
* @dev steps working of this function
|
|
190
|
+
- The exact outcome amount of PT will be transferred to receiver
|
|
191
|
+
- Callback to msg.sender if data.length > 0
|
|
192
|
+
- Ensure the calculated required amount of SY is transferred to this address
|
|
193
|
+
* @dev will revert if PT is expired
|
|
194
|
+
* @param data bytes data to be sent in the callback (if any)
|
|
195
|
+
*/
|
|
196
|
+
function swapSyForExactPt(
|
|
197
|
+
address receiver,
|
|
198
|
+
uint256 exactPtOut,
|
|
199
|
+
bytes calldata data
|
|
200
|
+
) external nonReentrant notExpired returns (uint256 netSyIn, uint256 netSyFee) {
|
|
201
|
+
MarketState memory market = readState(msg.sender);
|
|
202
|
+
|
|
203
|
+
uint256 netSyToReserve;
|
|
204
|
+
(netSyIn, netSyFee, netSyToReserve) = market.swapSyForExactPt(YT.newIndex(), exactPtOut, block.timestamp);
|
|
205
|
+
|
|
206
|
+
if (receiver != address(this)) IERC20(PT).safeTransfer(receiver, exactPtOut);
|
|
207
|
+
IERC20(SY).safeTransfer(market.treasury, netSyToReserve);
|
|
208
|
+
|
|
209
|
+
_writeState(market);
|
|
210
|
+
|
|
211
|
+
if (data.length > 0) {
|
|
212
|
+
IPMarketSwapCallback(msg.sender).swapCallback(exactPtOut.Int(), netSyIn.neg(), data);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// have received enough SY
|
|
216
|
+
if (_selfBalance(SY) < market.totalSy.Uint())
|
|
217
|
+
revert Errors.MarketInsufficientSyReceived(_selfBalance(SY), market.totalSy.Uint());
|
|
218
|
+
|
|
219
|
+
emit Swap(msg.sender, receiver, exactPtOut.Int(), netSyIn.neg(), netSyFee, netSyToReserve);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/// @notice forces balances to match reserves
|
|
223
|
+
function skim() external nonReentrant {
|
|
224
|
+
MarketState memory market = readState(msg.sender);
|
|
225
|
+
uint256 excessPt = _selfBalance(PT) - market.totalPt.Uint();
|
|
226
|
+
uint256 excessSy = _selfBalance(SY) - market.totalSy.Uint();
|
|
227
|
+
if (excessPt != 0) IERC20(PT).safeTransfer(market.treasury, excessPt);
|
|
228
|
+
if (excessSy != 0) IERC20(SY).safeTransfer(market.treasury, excessSy);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* @notice redeems the user's reward
|
|
233
|
+
* @return amount of reward token redeemed, in the same order as `getRewardTokens()`
|
|
234
|
+
*/
|
|
235
|
+
function redeemRewards(address user) external nonReentrant returns (uint256[] memory) {
|
|
236
|
+
return _redeemRewards(user);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/// @notice returns the list of reward tokens
|
|
240
|
+
function getRewardTokens() external view returns (address[] memory) {
|
|
241
|
+
return _getRewardTokens();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/*///////////////////////////////////////////////////////////////
|
|
245
|
+
ORACLE
|
|
246
|
+
//////////////////////////////////////////////////////////////*/
|
|
247
|
+
|
|
248
|
+
function observe(uint32[] memory secondsAgos) external view returns (uint216[] memory lnImpliedRateCumulative) {
|
|
249
|
+
return
|
|
250
|
+
observations.observe(
|
|
251
|
+
uint32(block.timestamp),
|
|
252
|
+
secondsAgos,
|
|
253
|
+
_storage.lastLnImpliedRate,
|
|
254
|
+
_storage.observationIndex,
|
|
255
|
+
_storage.observationCardinality
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function increaseObservationsCardinalityNext(uint16 cardinalityNext) external nonReentrant {
|
|
260
|
+
uint16 cardinalityNextOld = _storage.observationCardinalityNext;
|
|
261
|
+
uint16 cardinalityNextNew = observations.grow(cardinalityNextOld, cardinalityNext);
|
|
262
|
+
if (cardinalityNextOld != cardinalityNextNew) {
|
|
263
|
+
_storage.observationCardinalityNext = cardinalityNextNew;
|
|
264
|
+
emit IncreaseObservationCardinalityNext(cardinalityNextOld, cardinalityNextNew);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/*///////////////////////////////////////////////////////////////
|
|
269
|
+
READ/WRITE STATES
|
|
270
|
+
//////////////////////////////////////////////////////////////*/
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @notice read the state of the market from storage into memory for gas-efficient manipulation
|
|
274
|
+
*/
|
|
275
|
+
function readState(address router) public view returns (MarketState memory market) {
|
|
276
|
+
market.totalPt = _storage.totalPt;
|
|
277
|
+
market.totalSy = _storage.totalSy;
|
|
278
|
+
market.totalLp = totalSupply().Int();
|
|
279
|
+
|
|
280
|
+
uint80 overriddenFee;
|
|
281
|
+
|
|
282
|
+
(market.treasury, overriddenFee, market.reserveFeePercent) = IPMarketFactoryV3(factory).getMarketConfig(
|
|
283
|
+
address(this),
|
|
284
|
+
router
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
market.lnFeeRateRoot = overriddenFee == 0 ? lnFeeRateRoot : overriddenFee;
|
|
288
|
+
market.scalarRoot = scalarRoot;
|
|
289
|
+
market.expiry = expiry;
|
|
290
|
+
|
|
291
|
+
market.lastLnImpliedRate = _storage.lastLnImpliedRate;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/// @notice write back the state of the market from memory to storage
|
|
295
|
+
function _writeState(MarketState memory market) internal {
|
|
296
|
+
uint96 lastLnImpliedRate96 = market.lastLnImpliedRate.Uint96();
|
|
297
|
+
int128 totalPt128 = market.totalPt.Int128();
|
|
298
|
+
int128 totalSy128 = market.totalSy.Int128();
|
|
299
|
+
|
|
300
|
+
(uint16 observationIndex, uint16 observationCardinality) = observations.write(
|
|
301
|
+
_storage.observationIndex,
|
|
302
|
+
uint32(block.timestamp),
|
|
303
|
+
_storage.lastLnImpliedRate,
|
|
304
|
+
_storage.observationCardinality,
|
|
305
|
+
_storage.observationCardinalityNext
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
_storage.totalPt = totalPt128;
|
|
309
|
+
_storage.totalSy = totalSy128;
|
|
310
|
+
_storage.lastLnImpliedRate = lastLnImpliedRate96;
|
|
311
|
+
_storage.observationIndex = observationIndex;
|
|
312
|
+
_storage.observationCardinality = observationCardinality;
|
|
313
|
+
|
|
314
|
+
emit UpdateImpliedRate(block.timestamp, market.lastLnImpliedRate);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function getNonOverrideLnFeeRateRoot() external view returns (uint80) {
|
|
318
|
+
return lnFeeRateRoot;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/*///////////////////////////////////////////////////////////////
|
|
322
|
+
TRIVIAL FUNCTIONS
|
|
323
|
+
//////////////////////////////////////////////////////////////*/
|
|
324
|
+
|
|
325
|
+
function readTokens() external view returns (IStandardizedYield _SY, IPPrincipalToken _PT, IPYieldToken _YT) {
|
|
326
|
+
_SY = SY;
|
|
327
|
+
_PT = PT;
|
|
328
|
+
_YT = YT;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function isExpired() public view returns (bool) {
|
|
332
|
+
return MiniHelpers.isCurrentlyExpired(expiry);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/*///////////////////////////////////////////////////////////////
|
|
336
|
+
PENDLE GAUGE - RELATED
|
|
337
|
+
//////////////////////////////////////////////////////////////*/
|
|
338
|
+
|
|
339
|
+
function _stakedBalance(address user) internal view override returns (uint256) {
|
|
340
|
+
return balanceOf(user);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function _totalStaked() internal view override returns (uint256) {
|
|
344
|
+
return totalSupply();
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// solhint-disable-next-line ordering
|
|
348
|
+
function _beforeTokenTransfer(
|
|
349
|
+
address from,
|
|
350
|
+
address to,
|
|
351
|
+
uint256 amount
|
|
352
|
+
) internal override(PendleERC20, PendleGauge) {
|
|
353
|
+
PendleGauge._beforeTokenTransfer(from, to, amount);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// solhint-disable-next-line ordering
|
|
357
|
+
function _afterTokenTransfer(address from, address to, uint256 amount) internal override(PendleERC20, PendleGauge) {
|
|
358
|
+
PendleGauge._afterTokenTransfer(from, to, amount);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
|
+
pragma solidity ^0.8.17;
|
|
3
|
+
|
|
4
|
+
import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
|
|
5
|
+
import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
|
|
6
|
+
import "../libraries/BoringOwnableUpgradeable.sol";
|
|
7
|
+
import "../libraries/TokenHelper.sol";
|
|
8
|
+
import "../libraries/math/PMath.sol";
|
|
9
|
+
import "../../interfaces/IPLinearDistributor.sol";
|
|
10
|
+
|
|
11
|
+
contract PendleLinearDistributor is UUPSUpgradeable, AccessControlUpgradeable, TokenHelper, IPLinearDistributor {
|
|
12
|
+
using PMath for uint128;
|
|
13
|
+
using PMath for uint192;
|
|
14
|
+
using PMath for uint256;
|
|
15
|
+
|
|
16
|
+
bytes32 public constant MAINTAINER = keccak256("MAINTAINER");
|
|
17
|
+
|
|
18
|
+
mapping(address => bool) internal isWhitelisted;
|
|
19
|
+
|
|
20
|
+
// [token, addr] => distribution
|
|
21
|
+
mapping(address => mapping(address => DistributionData)) public distributionDatas;
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
_disableInitializers();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
modifier onlyWhitelisted() {
|
|
28
|
+
require(isWhitelisted[msg.sender], "not whitelisted");
|
|
29
|
+
_;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function isMaintainer(address addr) public view returns (bool) {
|
|
33
|
+
return (hasRole(DEFAULT_ADMIN_ROLE, addr) || hasRole(MAINTAINER, addr));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
modifier onlyMaintainer() {
|
|
37
|
+
require(isMaintainer(msg.sender), "not maintainer");
|
|
38
|
+
_;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
modifier onlyAdmin() {
|
|
42
|
+
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "not admin");
|
|
43
|
+
_;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ----------------- core-logic ----------------------
|
|
47
|
+
|
|
48
|
+
function queueVestAndClaim(address token, uint256 amountVestToQueue) external onlyWhitelisted returns (uint256) {
|
|
49
|
+
require(amountVestToQueue > 0, "invalid amountVestToQueue");
|
|
50
|
+
|
|
51
|
+
uint256 amountOut = _getClaimableRewardAndUpdate(token, msg.sender, amountVestToQueue);
|
|
52
|
+
|
|
53
|
+
// dodging extreme case of amountOut = amountVestToQueue
|
|
54
|
+
if (amountOut > amountVestToQueue) {
|
|
55
|
+
_transferOut(token, msg.sender, amountOut - amountVestToQueue);
|
|
56
|
+
} else if (amountVestToQueue > amountOut) {
|
|
57
|
+
_transferIn(token, msg.sender, amountVestToQueue - amountOut);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
emit VestQueued(token, msg.sender, amountVestToQueue);
|
|
61
|
+
emit Claim(token, msg.sender, amountOut);
|
|
62
|
+
|
|
63
|
+
return amountOut;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function claim(address token) external returns (uint256) {
|
|
67
|
+
uint256 amountOut = _getClaimableRewardAndUpdate(token, msg.sender, 0);
|
|
68
|
+
if (amountOut > 0) {
|
|
69
|
+
_transferOut(token, msg.sender, amountOut);
|
|
70
|
+
}
|
|
71
|
+
emit Claim(token, msg.sender, amountOut);
|
|
72
|
+
return amountOut;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function applyVestRewards(
|
|
76
|
+
address[] memory tokens,
|
|
77
|
+
address[] memory addrs,
|
|
78
|
+
uint256[] memory durations
|
|
79
|
+
) external onlyMaintainer {
|
|
80
|
+
require(tokens.length == addrs.length, "invalid array length");
|
|
81
|
+
require(tokens.length == durations.length, "invalid array length");
|
|
82
|
+
|
|
83
|
+
for (uint256 i = 0; i < tokens.length; ++i) {
|
|
84
|
+
_applyVestReward(tokens[i], addrs[i], durations[i]);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function _applyVestReward(address token, address addr, uint256 duration) internal {
|
|
89
|
+
DistributionData memory data = _updateRewardView(token, addr);
|
|
90
|
+
|
|
91
|
+
uint256 amountVesting = data.unvestedReward;
|
|
92
|
+
if (amountVesting == 0) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
uint256 leftOver = data.rewardPerSec.mulDown((data.endTime - PMath.min(block.timestamp, data.endTime)));
|
|
97
|
+
uint256 undistrbutedReward = amountVesting + leftOver;
|
|
98
|
+
|
|
99
|
+
data.unvestedReward = 0;
|
|
100
|
+
data.endTime = (block.timestamp + duration).Uint32();
|
|
101
|
+
data.rewardPerSec = undistrbutedReward.divDown(duration).Uint192();
|
|
102
|
+
distributionDatas[token][addr] = data;
|
|
103
|
+
|
|
104
|
+
emit Vested(token, addr, amountVesting, duration);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// data.lastDistributedTime is guaranteed to be block.timestamp after calling this
|
|
108
|
+
function _getClaimableRewardAndUpdate(
|
|
109
|
+
address token,
|
|
110
|
+
address addr,
|
|
111
|
+
uint256 amountVestToQueue
|
|
112
|
+
) internal returns (uint256 amountOut) {
|
|
113
|
+
DistributionData memory data = _updateRewardView(token, addr);
|
|
114
|
+
amountOut = data.accruedReward;
|
|
115
|
+
|
|
116
|
+
data.accruedReward = 0;
|
|
117
|
+
data.unvestedReward += amountVestToQueue.Uint128();
|
|
118
|
+
|
|
119
|
+
distributionDatas[token][addr] = data;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function _updateRewardView(address token, address addr) internal view returns (DistributionData memory data) {
|
|
123
|
+
data = distributionDatas[token][addr];
|
|
124
|
+
uint256 distributeFrom = PMath.min(data.lastDistributedTime, data.endTime);
|
|
125
|
+
uint256 distributeTo = PMath.min(block.timestamp, data.endTime);
|
|
126
|
+
data.accruedReward += data.rewardPerSec.mulDown(distributeTo - distributeFrom).Uint128();
|
|
127
|
+
data.lastDistributedTime = block.timestamp.Uint32();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ----------------- governance-related --------------
|
|
131
|
+
|
|
132
|
+
function setWhitelisted(address addr, bool status) external onlyAdmin {
|
|
133
|
+
isWhitelisted[addr] = status;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function initialize() external initializer {
|
|
137
|
+
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ----------------- upgrade-related -----------------
|
|
141
|
+
|
|
142
|
+
function _authorizeUpgrade(address) internal override onlyAdmin {}
|
|
143
|
+
}
|
|
@@ -13,7 +13,6 @@ abstract contract RewardManager is RewardManagerAbstract {
|
|
|
13
13
|
|
|
14
14
|
mapping(address => RewardState) public rewardState;
|
|
15
15
|
|
|
16
|
-
|
|
17
16
|
function _updateRewardIndex()
|
|
18
17
|
internal
|
|
19
18
|
virtual
|
|
@@ -37,18 +36,26 @@ abstract contract RewardManager is RewardManagerAbstract {
|
|
|
37
36
|
address token = tokens[i];
|
|
38
37
|
|
|
39
38
|
// the entire token balance of the contract must be the rewards of the contract
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
|
|
40
|
+
RewardState memory _state = rewardState[token];
|
|
41
|
+
(uint256 lastBalance, uint256 index) = (_state.lastBalance, _state.index);
|
|
42
|
+
|
|
43
|
+
uint256 accrued = _selfBalance(tokens[i]) - lastBalance;
|
|
42
44
|
|
|
43
45
|
if (index == 0) index = INITIAL_REWARD_INDEX;
|
|
44
46
|
if (totalShares != 0) index += accrued.divDown(totalShares);
|
|
45
47
|
|
|
46
|
-
rewardState[token]
|
|
47
|
-
|
|
48
|
+
rewardState[token] = RewardState({
|
|
49
|
+
index: index.Uint128(),
|
|
50
|
+
lastBalance: (lastBalance + accrued).Uint128()
|
|
51
|
+
});
|
|
52
|
+
indexes[i] = index;
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
for (uint256 i = 0; i < tokens.length; i++) {
|
|
56
|
+
indexes[i] = rewardState[tokens[i]].index;
|
|
48
57
|
}
|
|
49
58
|
}
|
|
50
|
-
|
|
51
|
-
for (uint256 i = 0; i < tokens.length; i++) indexes[i] = rewardState[tokens[i]].index;
|
|
52
59
|
}
|
|
53
60
|
|
|
54
61
|
/// @dev this function doesn't need redeemExternal since redeemExternal is bundled in updateRewardIndex
|
|
@@ -36,18 +36,12 @@ abstract contract RewardManagerAbstract is IRewardManager, TokenHelper {
|
|
|
36
36
|
(address[] memory tokens, uint256[] memory indexes) = _updateRewardIndex();
|
|
37
37
|
if (tokens.length == 0) return;
|
|
38
38
|
|
|
39
|
-
if (user1 != address(0) && user1 != address(this))
|
|
40
|
-
|
|
41
|
-
if (user2 != address(0) && user2 != address(this))
|
|
42
|
-
_distributeRewardsPrivate(user2, tokens, indexes);
|
|
39
|
+
if (user1 != address(0) && user1 != address(this)) _distributeRewardsPrivate(user1, tokens, indexes);
|
|
40
|
+
if (user2 != address(0) && user2 != address(this)) _distributeRewardsPrivate(user2, tokens, indexes);
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
// should only be callable from `_updateAndDistributeRewardsForTwo` to guarantee user != address(0) && user != address(this)
|
|
46
|
-
function _distributeRewardsPrivate(
|
|
47
|
-
address user,
|
|
48
|
-
address[] memory tokens,
|
|
49
|
-
uint256[] memory indexes
|
|
50
|
-
) private {
|
|
44
|
+
function _distributeRewardsPrivate(address user, address[] memory tokens, uint256[] memory indexes) private {
|
|
51
45
|
assert(user != address(0) && user != address(this));
|
|
52
46
|
|
|
53
47
|
uint256 userShares = _rewardSharesUser(user);
|
|
@@ -67,17 +61,11 @@ abstract contract RewardManagerAbstract is IRewardManager, TokenHelper {
|
|
|
67
61
|
uint256 rewardDelta = userShares.mulDown(deltaIndex);
|
|
68
62
|
uint256 rewardAccrued = userReward[token][user].accrued + rewardDelta;
|
|
69
63
|
|
|
70
|
-
userReward[token][user] = UserReward({
|
|
71
|
-
index: index.Uint128(),
|
|
72
|
-
accrued: rewardAccrued.Uint128()
|
|
73
|
-
});
|
|
64
|
+
userReward[token][user] = UserReward({index: index.Uint128(), accrued: rewardAccrued.Uint128()});
|
|
74
65
|
}
|
|
75
66
|
}
|
|
76
67
|
|
|
77
|
-
function _updateRewardIndex()
|
|
78
|
-
internal
|
|
79
|
-
virtual
|
|
80
|
-
returns (address[] memory tokens, uint256[] memory indexes);
|
|
68
|
+
function _updateRewardIndex() internal virtual returns (address[] memory tokens, uint256[] memory indexes);
|
|
81
69
|
|
|
82
70
|
function _redeemExternalReward() internal virtual;
|
|
83
71
|
|