@pendle/core-v2 6.1.3 → 6.1.4-sweedtest

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 (147) hide show
  1. package/build/artifacts/contracts/LiquidityMining/GaugeController/PendleGaugeControllerBaseUpg.sol/PendleGaugeControllerBaseUpg.dbg.json +1 -1
  2. package/build/artifacts/contracts/LiquidityMining/GaugeController/PendleGaugeControllerMainchainUpg.sol/PendleGaugeControllerMainchainUpg.dbg.json +1 -1
  3. package/build/artifacts/contracts/LiquidityMining/GaugeController/PendleGaugeControllerSidechainUpg.sol/PendleGaugeControllerSidechainUpg.dbg.json +1 -1
  4. package/build/artifacts/contracts/core/Market/MarketMathCore.sol/MarketMathCore.dbg.json +1 -1
  5. package/build/artifacts/contracts/core/Market/PendleGauge.sol/PendleGauge.dbg.json +1 -1
  6. package/build/artifacts/contracts/core/Market/v3/PendleMarketFactoryV3.sol/PendleMarketFactoryV3.dbg.json +1 -1
  7. package/build/artifacts/contracts/core/Market/v3/PendleMarketV3.sol/PendleMarketV3.dbg.json +1 -1
  8. package/build/artifacts/contracts/core/StandardizedYield/PYIndex.sol/PYIndexLib.dbg.json +1 -1
  9. package/build/artifacts/contracts/core/YieldContracts/InterestManagerYT.sol/InterestManagerYT.dbg.json +1 -1
  10. package/build/artifacts/contracts/core/YieldContracts/PendlePrincipalToken.sol/PendlePrincipalToken.dbg.json +1 -1
  11. package/build/artifacts/contracts/core/YieldContracts/PendleYieldContractFactory.sol/PendleYieldContractFactory.dbg.json +1 -1
  12. package/build/artifacts/contracts/core/YieldContracts/PendleYieldToken.sol/PendleYieldToken.dbg.json +1 -1
  13. package/build/artifacts/contracts/core/erc20/PendleERC20.sol/PendleERC20.dbg.json +1 -1
  14. package/build/artifacts/contracts/core/erc20/PendleERC20Permit.sol/PendleERC20Permit.dbg.json +1 -1
  15. package/build/artifacts/contracts/cross-chain/FixedPricePTAMM.sol/FixedPricePTAMM.dbg.json +1 -1
  16. package/build/artifacts/contracts/cross-chain/FixedPricePTAMM.sol/FixedPricePTAMM.json +70 -2
  17. package/build/artifacts/contracts/interfaces/IMarketSweed.sol/IMarketSweed.dbg.json +4 -0
  18. package/build/artifacts/contracts/interfaces/IMarketSweed.sol/IMarketSweed.json +141 -0
  19. package/build/artifacts/contracts/interfaces/IPActionAddRemoveLiqV3.sol/IPActionAddRemoveLiqV3.dbg.json +1 -1
  20. package/build/artifacts/contracts/interfaces/IPActionCallbackV3.sol/IPActionCallbackV3.dbg.json +1 -1
  21. package/build/artifacts/contracts/interfaces/IPActionMarketAuxStatic.sol/IPActionMarketAuxStatic.dbg.json +1 -1
  22. package/build/artifacts/contracts/interfaces/IPActionMarketCoreStatic.sol/IPActionMarketCoreStatic.dbg.json +1 -1
  23. package/build/artifacts/contracts/interfaces/IPActionMiscV3.sol/IPActionMiscV3.dbg.json +1 -1
  24. package/build/artifacts/contracts/interfaces/IPActionSimple.sol/IPActionSimple.dbg.json +1 -1
  25. package/build/artifacts/contracts/interfaces/IPActionStorageStatic.sol/IPActionStorageStatic.dbg.json +1 -1
  26. package/build/artifacts/contracts/interfaces/IPActionStorageV4.sol/IPActionStorageV4.dbg.json +1 -1
  27. package/build/artifacts/contracts/interfaces/IPActionSwapPTV3.sol/IPActionSwapPTV3.dbg.json +1 -1
  28. package/build/artifacts/contracts/interfaces/IPActionSwapYTV3.sol/IPActionSwapYTV3.dbg.json +1 -1
  29. package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.dbg.json +1 -1
  30. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPActionAddRemoveLiqV3Events.dbg.json +1 -1
  31. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPActionMiscV3Events.dbg.json +1 -1
  32. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPActionStorageEvents.dbg.json +1 -1
  33. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPActionSwapPTV3Events.dbg.json +1 -1
  34. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPActionSwapYTV3Events.dbg.json +1 -1
  35. package/build/artifacts/contracts/interfaces/IPAllEventsV3.sol/IPAllEventsV3.dbg.json +1 -1
  36. package/build/artifacts/contracts/interfaces/IPFixedPricePTAMM.sol/IPFixedPricePTAMM.dbg.json +1 -1
  37. package/build/artifacts/contracts/interfaces/IPFixedPricePTAMM.sol/IPFixedPricePTAMM.json +68 -0
  38. package/build/artifacts/contracts/interfaces/IPFixedPricePTAMM.sol/IPFixedPricePTAMMSwapCallback.dbg.json +1 -1
  39. package/build/artifacts/contracts/interfaces/IPGauge.sol/IPGauge.dbg.json +1 -1
  40. package/build/artifacts/contracts/interfaces/IPLimitRouter.sol/IPLimitOrderType.dbg.json +1 -1
  41. package/build/artifacts/contracts/interfaces/IPLimitRouter.sol/IPLimitRouter.dbg.json +1 -1
  42. package/build/artifacts/contracts/interfaces/IPLimitRouter.sol/IPLimitRouterCallback.dbg.json +1 -1
  43. package/build/artifacts/contracts/interfaces/IPMarket.sol/IPMarket.dbg.json +1 -1
  44. package/build/artifacts/contracts/interfaces/IPMarketFactory.sol/IPMarketFactory.dbg.json +1 -1
  45. package/build/artifacts/contracts/interfaces/IPMarketFactoryV3.sol/IPMarketFactoryV3.dbg.json +1 -1
  46. package/build/artifacts/contracts/interfaces/IPMarketV3.sol/IPMarketV3.dbg.json +1 -1
  47. package/build/artifacts/contracts/interfaces/IPPYLpOracle.sol/IPPYLpOracle.dbg.json +1 -1
  48. package/build/artifacts/contracts/interfaces/IPPrincipalToken.sol/IPPrincipalToken.dbg.json +1 -1
  49. package/build/artifacts/contracts/interfaces/IPRouterStatic.sol/IPRouterStatic.dbg.json +1 -1
  50. package/build/artifacts/contracts/interfaces/IPYieldContractFactory.sol/IPYieldContractFactory.dbg.json +1 -1
  51. package/build/artifacts/contracts/limit/LimitMathCore.sol/LimitMathCore.dbg.json +1 -1
  52. package/build/artifacts/contracts/limit/LimitRouterBase.sol/LimitRouterBase.dbg.json +1 -1
  53. package/build/artifacts/contracts/offchain-helpers/BalanceReader.sol/BalanceReader.dbg.json +1 -1
  54. package/build/artifacts/contracts/offchain-helpers/ExpiredLpPtRedeemer.sol/ExpiredLpPtRedeemer.dbg.json +1 -1
  55. package/build/artifacts/contracts/offchain-helpers/ExpiredLpPtRedeemer.sol/ExpiredLpPtRedeemer.json +2 -2
  56. package/build/artifacts/contracts/offchain-helpers/LimitBackendHelperV2.sol/LimitBackendHelperV2.dbg.json +1 -1
  57. package/build/artifacts/contracts/offchain-helpers/MarketSweed.sol/MarketSweed.dbg.json +4 -0
  58. package/build/artifacts/contracts/offchain-helpers/MarketSweed.sol/MarketSweed.json +333 -0
  59. package/build/artifacts/contracts/offchain-helpers/PendleLPWrapper.sol/PendleLPWrapper.dbg.json +1 -1
  60. package/build/artifacts/contracts/offchain-helpers/PendleLPWrapperFactory.sol/PendleLPWrapperFactory.dbg.json +1 -1
  61. package/build/artifacts/contracts/offchain-helpers/deploy/PendleCommonPoolDeployHelperV2.sol/PendleCommonPoolDeployHelperV2.dbg.json +1 -1
  62. package/build/artifacts/contracts/offchain-helpers/deploy/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.dbg.json +1 -1
  63. package/build/artifacts/contracts/offchain-helpers/deploy/PendlePoolDeployHelperV2.sol/PendlePoolDeployHelperV2.dbg.json +1 -1
  64. package/build/artifacts/contracts/offchain-helpers/router-static/PendleRouterStatic.sol/PendleRouterStatic.dbg.json +1 -1
  65. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionInfoStatic.sol/ActionInfoStatic.dbg.json +1 -1
  66. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.dbg.json +1 -1
  67. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketCoreStatic.sol/ActionMarketCoreStatic.dbg.json +1 -1
  68. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMintRedeemStatic.sol/ActionMintRedeemStatic.dbg.json +1 -1
  69. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionStorageStatic.sol/ActionStorageStatic.dbg.json +1 -1
  70. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionVePendleStatic.sol/ActionVePendleStatic.dbg.json +1 -1
  71. package/build/artifacts/contracts/offchain-helpers/router-static/base/MarketApproxLibV1.sol/MarketApproxPtInLibV1.dbg.json +1 -1
  72. package/build/artifacts/contracts/offchain-helpers/router-static/base/MarketApproxLibV1.sol/MarketApproxPtOutLibV1.dbg.json +1 -1
  73. package/build/artifacts/contracts/offchain-helpers/router-static/base/StorageLayout.sol/StorageLayout.dbg.json +1 -1
  74. package/build/artifacts/contracts/oracles/PtYtLpOracle/PendleLpOracleLib.sol/PendleLpOracleLib.dbg.json +1 -1
  75. package/build/artifacts/contracts/oracles/PtYtLpOracle/PendlePYLpOracle.sol/PendlePYLpOracle.dbg.json +1 -1
  76. package/build/artifacts/contracts/oracles/PtYtLpOracle/PendlePYOracleLib.sol/PendlePYOracleLib.dbg.json +1 -1
  77. package/build/artifacts/contracts/oracles/PtYtLpOracle/chainlink/PendleChainlinkOracle.sol/PendleChainlinkOracle.dbg.json +1 -1
  78. package/build/artifacts/contracts/oracles/PtYtLpOracle/chainlink/PendleChainlinkOracleFactory.sol/PendleChainlinkOracleFactory.dbg.json +1 -1
  79. package/build/artifacts/contracts/oracles/PtYtLpOracle/chainlink/PendleChainlinkOracleWithQuote.sol/PendleChainlinkOracleWithQuote.dbg.json +1 -1
  80. package/build/artifacts/contracts/oracles/PtYtLpOracle/samples/BoringLpSeller.sol/BoringLpSeller.dbg.json +1 -1
  81. package/build/artifacts/contracts/oracles/PtYtLpOracle/samples/BoringPYUsdChainlinkAssetOracle.sol/BoringPYUsdChainlinkAssetOracle.dbg.json +1 -1
  82. package/build/artifacts/contracts/oracles/PtYtLpOracle/samples/BoringPYUsdChainlinkSYOracle.sol/BoringPYUsdChainlinkSYOracle.dbg.json +1 -1
  83. package/build/artifacts/contracts/oracles/PtYtLpOracle/samples/BoringPtSeller.sol/BoringPtSeller.dbg.json +1 -1
  84. package/build/artifacts/contracts/oracles/internal/PendleSparkLinearDiscountOracleFactory.sol/PendleSparkLinearDiscountOracleFactory.dbg.json +1 -1
  85. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.dbg.json +1 -1
  86. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.json +2 -13
  87. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.dbg.json +1 -1
  88. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.json +2 -13
  89. package/build/artifacts/contracts/router/ActionSimple.sol/ActionSimple.dbg.json +1 -1
  90. package/build/artifacts/contracts/router/ActionSimple.sol/ActionSimple.json +2 -13
  91. package/build/artifacts/contracts/router/ActionStorageV4.sol/ActionStorageV4.dbg.json +1 -1
  92. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.dbg.json +1 -1
  93. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.json +2 -13
  94. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.dbg.json +1 -1
  95. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.json +2 -13
  96. package/build/artifacts/contracts/router/PendleRouterV4.sol/PendleRouterV4.dbg.json +1 -1
  97. package/build/artifacts/contracts/router/Reflector.sol/Reflector.dbg.json +1 -1
  98. package/build/artifacts/contracts/router/base/ActionBase.sol/ActionBase.dbg.json +1 -1
  99. package/build/artifacts/contracts/router/base/ActionDelegateBase.sol/ActionDelegateBase.dbg.json +1 -1
  100. package/build/artifacts/contracts/router/base/ActionDelegateBase.sol/ActionDelegateBase.json +3 -15
  101. package/build/artifacts/contracts/router/base/CallbackHelper.sol/CallbackHelper.dbg.json +1 -1
  102. package/build/artifacts/contracts/router/math/ApproxStateLib.sol/ApproxStateLib.dbg.json +1 -1
  103. package/build/artifacts/contracts/router/math/MarketApproxEstimateLib.sol/MarketApproxEstimateLib.dbg.json +1 -1
  104. package/build/artifacts/contracts/router/math/MarketApproxLibOnchain.sol/MarketApproxPtInLibOnchain.dbg.json +1 -1
  105. package/build/artifacts/contracts/router/math/MarketApproxLibOnchain.sol/MarketApproxPtOutLibOnchain.dbg.json +1 -1
  106. package/build/artifacts/contracts/router/math/MarketApproxLibV2.sol/MarketApproxPtInLibV2.dbg.json +1 -1
  107. package/build/artifacts/contracts/router/math/MarketApproxLibV2.sol/MarketApproxPtOutLibV2.dbg.json +1 -1
  108. package/contracts/cross-chain/FixedPricePTAMM.sol +45 -3
  109. package/contracts/interfaces/IMarketSweed.sol +23 -0
  110. package/contracts/interfaces/IPFixedPricePTAMM.sol +14 -0
  111. package/contracts/offchain-helpers/MarketSweed.sol +239 -0
  112. package/contracts/router/ActionAddRemoveLiqV3.sol +0 -2
  113. package/contracts/router/ActionMiscV3.sol +0 -2
  114. package/contracts/router/ActionSimple.sol +0 -2
  115. package/contracts/router/ActionSwapPTV3.sol +0 -2
  116. package/contracts/router/ActionSwapYTV3.sol +0 -2
  117. package/contracts/router/base/ActionBase.sol +8 -16
  118. package/contracts/router/base/ActionDelegateBase.sol +0 -2
  119. package/package.json +1 -1
  120. package/typechain-types/FixedPricePTAMM.ts +98 -0
  121. package/typechain-types/IPFixedPricePTAMM.ts +98 -0
  122. package/typechain-types/IPReentrancyGuardUpg.ts +89 -0
  123. package/typechain-types/MarketSweed.ts +39 -0
  124. package/typechain-types/PendleERC20Upg.ts +21 -0
  125. package/typechain-types/PendleMarket.ts +82 -32
  126. package/typechain-types/PendleMarketFactoryUpg.ts +773 -0
  127. package/typechain-types/PendleMarketFactoryV3Upg.ts +760 -0
  128. package/typechain-types/PendleReentrancyGuardUpg.ts +100 -0
  129. package/typechain-types/PendleYieldContractFactoryUpg.ts +820 -0
  130. package/typechain-types/factories/ActionAddRemoveLiqV3__factory.ts +3 -19
  131. package/typechain-types/factories/ActionMiscV3__factory.ts +3 -19
  132. package/typechain-types/factories/ActionSimple__factory.ts +3 -19
  133. package/typechain-types/factories/ActionSwapPTV3__factory.ts +3 -19
  134. package/typechain-types/factories/ActionSwapYTV3__factory.ts +3 -19
  135. package/typechain-types/factories/ExpiredLpPtRedeemer__factory.ts +1 -1
  136. package/typechain-types/factories/FixedPricePTAMM__factory.ts +69 -1
  137. package/typechain-types/factories/IPFixedPricePTAMM__factory.ts +68 -0
  138. package/typechain-types/factories/IPReentrancyGuardUpg__factory.ts +43 -0
  139. package/typechain-types/factories/MarketSweed__factory.ts +76 -14
  140. package/typechain-types/factories/PendleERC20Upg__factory.ts +13 -0
  141. package/typechain-types/factories/PendleMarketFactoryUpg__factory.ts +732 -0
  142. package/typechain-types/factories/PendleMarketFactoryV3Upg__factory.ts +719 -0
  143. package/typechain-types/factories/PendleMarket__factory.ts +81 -27
  144. package/typechain-types/factories/PendleReentrancyGuardUpg__factory.ts +56 -0
  145. package/typechain-types/factories/PendleYieldContractFactoryUpg__factory.ts +692 -0
  146. package/typechain-types/hardhat.d.ts +18 -9
  147. package/typechain-types/index.ts +4 -2
@@ -0,0 +1,239 @@
1
+ // SPDX-License-Identifier: MIT
2
+
3
+ pragma solidity ^0.8.17;
4
+
5
+ import "../interfaces/IPMarket.sol";
6
+ import "../router/math/MarketApproxLibOnchain.sol";
7
+ import "../router/base/ActionBase.sol";
8
+ import "../interfaces/IMarketSweed.sol";
9
+
10
+ contract MarketSweed is ActionBase, IMarketSweed {
11
+ using PMath for uint256;
12
+ using PMath for int256;
13
+ using PYIndexLib for PYIndex;
14
+ using MarketMathCore for MarketState;
15
+ using PYIndexLib for IPYieldToken;
16
+
17
+ address public immutable router;
18
+
19
+ struct MarketTokens {
20
+ IStandardizedYield SY;
21
+ IPPrincipalToken PT;
22
+ IPYieldToken YT;
23
+ }
24
+
25
+ constructor(address _router) {
26
+ router = _router;
27
+ }
28
+
29
+ function seedAtImpliedRate(
30
+ address receiver,
31
+ address market,
32
+ uint256 minLpOut,
33
+ uint256 minYtOut,
34
+ TokenInput calldata input,
35
+ ApproxSweedParams calldata sweedParams
36
+ ) external payable returns (uint256 netLpOut, uint256 netYtOut, int256 guessedAmountPtToSwap) {
37
+ MarketTokens memory tokens;
38
+ (tokens.SY, tokens.PT, tokens.YT) = IPMarket(market).readTokens();
39
+
40
+ _mintSyFromToken(address(this), address(tokens.SY), 1, input);
41
+
42
+ uint256 netPtOut;
43
+ (netPtOut, netYtOut, guessedAmountPtToSwap) = _swap(receiver, market, tokens, sweedParams);
44
+
45
+ uint256 netYtFromSeed;
46
+ (netLpOut, netYtFromSeed, ) = _seed(receiver, market, tokens.SY, tokens.YT, _selfBalance(tokens.SY), netPtOut);
47
+ netYtOut += netYtFromSeed;
48
+
49
+ if (netLpOut < minLpOut) revert("Slippage: INSUFFICIENT_LP_OUT");
50
+ if (netYtOut < minYtOut) revert("Slippage: INSUFFICIENT_YT_OUT");
51
+ }
52
+
53
+ function mintPYFromToken__noCall(
54
+ address YT,
55
+ TokenInput calldata input
56
+ ) external payable returns (uint256 netPYOut) {
57
+ address SY = IPYieldToken(YT).SY();
58
+ _mintSyFromToken(YT, SY, 1, input);
59
+ netPYOut = IPYieldToken(YT).mintPY(msg.sender, msg.sender);
60
+ }
61
+
62
+ function _seed(
63
+ address receiver,
64
+ address market,
65
+ IStandardizedYield SY,
66
+ IPYieldToken YT,
67
+ uint256 netSyIn,
68
+ uint256 netPtIn
69
+ ) internal returns (uint256 netLpOut, uint256 netYtOut, uint256 netSyMintPy) {
70
+ MarketState memory state = _readMarket(market);
71
+
72
+ uint256 netSyDual = 0;
73
+ if (netPtIn > 0) {
74
+ /** Add dual SY + PT */
75
+ uint256 netPtDual;
76
+ (, , netSyDual, netPtDual) = _readMarket(market).addLiquidity(netSyIn, netPtIn, block.timestamp);
77
+ if (netPtIn > netPtDual || netSyDual == netSyIn) {
78
+ revert("MS: Bought too much PT");
79
+ }
80
+ netSyIn -= netSyDual;
81
+ _transferOut(YT.PT(), market, netPtDual);
82
+ }
83
+
84
+ PYIndex pyIndex = YT.newIndex();
85
+ netSyMintPy =
86
+ (netSyIn * state.totalPt.Uint()) /
87
+ (state.totalPt.Uint() + pyIndex.syToAsset(state.totalSy.Uint()));
88
+
89
+ uint256 netSyAddLiquidity = netSyIn - netSyMintPy;
90
+
91
+ // transfer SY to mint PY
92
+ _transferOut(address(SY), address(YT), netSyMintPy);
93
+
94
+ // PT goes to market, YT goes to receiver
95
+ netYtOut = YT.mintPY(market, receiver);
96
+
97
+ // the rest of SY goes to market
98
+ _transferOut(address(SY), market, netSyAddLiquidity + netSyDual);
99
+
100
+ (netLpOut, , ) = IPMarket(market).mint(receiver, netSyAddLiquidity, netYtOut);
101
+ }
102
+
103
+ function _swap(
104
+ address receiver,
105
+ address market,
106
+ MarketTokens memory tokens,
107
+ ApproxSweedParams memory sweedParams
108
+ ) internal returns (uint256 amountPtToAccount, uint256 amountYTToAccount, int256 guessedSwap) {
109
+ PYIndex index = _getPYIndex(market);
110
+ MarketState memory state = _readMarket(market);
111
+ MarketPreCompute memory comp = state.getMarketPreCompute(index, block.timestamp);
112
+
113
+ if (state.lastLnImpliedRate > sweedParams.targetLnImpliedRate) {
114
+ // Normalize maxPtToSwap
115
+ sweedParams.maxPtToSwap = PMath.min(
116
+ sweedParams.maxPtToSwap,
117
+ MarketApproxPtOutLibOnchain.calcMaxPtOut(comp, state.totalPt)
118
+ );
119
+
120
+ int256 amountSyToAccount;
121
+
122
+ (guessedSwap, amountSyToAccount) = _calcAmountPtToBuy(state, index, sweedParams);
123
+ amountPtToAccount = guessedSwap.Uint();
124
+
125
+ _transferOut(address(tokens.SY), market, amountSyToAccount.abs());
126
+ IPMarket(market).swapSyForExactPt(address(this), guessedSwap.abs(), EMPTY_BYTES);
127
+ } else {
128
+ // Normalize maxPtToSwap
129
+ sweedParams.maxPtToSwap = PMath.min(
130
+ sweedParams.maxPtToSwap,
131
+ MarketApproxPtInLibOnchain.calcSoftMaxPtIn(state, comp)
132
+ );
133
+
134
+ guessedSwap = _calcAmountPtToSell(state, index, sweedParams);
135
+
136
+ uint256 amountPtToSell = guessedSwap.abs();
137
+ amountYTToAccount = amountPtToSell;
138
+
139
+ _transferOut(address(tokens.SY), address(tokens.YT), index.assetToSyUp(amountPtToSell));
140
+ uint256 amountPYOut = tokens.YT.mintPY(market, receiver);
141
+
142
+ assert(amountPYOut >= amountPtToSell);
143
+
144
+ // this amount of SY will be used to add liquidity in later step
145
+ IPMarket(market).swapExactPtForSy(address(this), amountPtToSell, EMPTY_BYTES);
146
+ }
147
+ }
148
+
149
+ function _calcAmountPtToBuy(
150
+ MarketState memory state,
151
+ PYIndex index,
152
+ ApproxSweedParams memory sweedParams
153
+ ) internal view returns (int256 amountPtToSwapToAccount, int256 amountSyToAccount) {
154
+ int256 refAmt = sweedParams.maxPtToSwap.Int();
155
+ int256 accPtToAccount = 0;
156
+
157
+ for (uint256 iter = 0; iter < sweedParams.maxIteration; ++iter) {
158
+ int256 guess;
159
+ if (iter == 0 && _isValidGuessOffchain(sweedParams, true)) {
160
+ guess = sweedParams.guessOffchain;
161
+ } else {
162
+ refAmt /= 2;
163
+ guess = accPtToAccount + refAmt;
164
+ }
165
+
166
+ MarketState memory localState = _deepCopy(state);
167
+
168
+ // // Will not revert. maxPtToBuy should already be normalized
169
+ (int256 localAmountSyToAccount, , ) = localState.executeTradeCore(index, guess, block.timestamp);
170
+
171
+ if (PMath.isAApproxB(localState.lastLnImpliedRate, sweedParams.targetLnImpliedRate, sweedParams.eps)) {
172
+ return (guess, localAmountSyToAccount);
173
+ }
174
+
175
+ if (localState.lastLnImpliedRate > sweedParams.targetLnImpliedRate) {
176
+ accPtToAccount += refAmt;
177
+ }
178
+ }
179
+ revert("_calcAmountPtToBuy: failed");
180
+ }
181
+
182
+ function _calcAmountPtToSell(
183
+ MarketState memory state,
184
+ PYIndex index,
185
+ ApproxSweedParams memory sweedParams
186
+ ) internal view returns (int256 amountPtToSwapToAccount) {
187
+ int256 refAmt = sweedParams.maxPtToSwap.Int();
188
+ int256 accPtToAccount = 0;
189
+
190
+ for (uint256 iter = 0; iter < sweedParams.maxIteration; ++iter) {
191
+ int256 guess;
192
+ if (iter == 0 && _isValidGuessOffchain(sweedParams, false)) {
193
+ guess = sweedParams.guessOffchain;
194
+ } else {
195
+ refAmt /= 2;
196
+ guess = accPtToAccount - refAmt;
197
+ }
198
+
199
+ MarketState memory localState = _deepCopy(state);
200
+
201
+ // Will not revert. maxPtToSell should already be normalized
202
+ localState.executeTradeCore(index, guess, block.timestamp);
203
+
204
+ if (PMath.isAApproxB(localState.lastLnImpliedRate, sweedParams.targetLnImpliedRate, sweedParams.eps)) {
205
+ return guess;
206
+ }
207
+
208
+ if (localState.lastLnImpliedRate < sweedParams.targetLnImpliedRate) {
209
+ accPtToAccount -= refAmt;
210
+ }
211
+ }
212
+ revert("_calcAmountPtToSell: failed");
213
+ }
214
+
215
+ function _getPYIndex(address market) internal returns (PYIndex) {
216
+ (, , IPYieldToken YT) = IPMarket(market).readTokens();
217
+ return PYIndex.wrap(YT.pyIndexCurrent());
218
+ }
219
+
220
+ function _deepCopy(MarketState memory state) internal pure returns (MarketState memory copiedState) {
221
+ copiedState.totalPt = state.totalPt;
222
+ copiedState.totalSy = state.totalSy;
223
+ copiedState.totalLp = state.totalLp;
224
+ copiedState.treasury = state.treasury;
225
+
226
+ copiedState.scalarRoot = state.scalarRoot;
227
+ copiedState.expiry = state.expiry;
228
+
229
+ copiedState.lnFeeRateRoot = state.lnFeeRateRoot;
230
+ copiedState.reserveFeePercent = state.reserveFeePercent;
231
+ copiedState.lastLnImpliedRate = state.lastLnImpliedRate;
232
+ }
233
+
234
+ function _isValidGuessOffchain(ApproxSweedParams memory sweedParams, bool isBuyingPt) internal pure returns (bool) {
235
+ if (sweedParams.guessOffchain == 0) return false;
236
+ if (isBuyingPt != (sweedParams.guessOffchain > 0)) return false;
237
+ return sweedParams.guessOffchain.abs() <= sweedParams.maxPtToSwap;
238
+ }
239
+ }
@@ -15,8 +15,6 @@ contract ActionAddRemoveLiqV3 is IPActionAddRemoveLiqV3, ActionBase, ActionDeleg
15
15
  using PYIndexLib for IPYieldToken;
16
16
  using PYIndexLib for PYIndex;
17
17
 
18
- constructor(address _dustReceiver) ActionDelegateBase(_dustReceiver) {}
19
-
20
18
  // ------------------ ADD LIQUIDITY DUAL ------------------
21
19
 
22
20
  /// @notice For details on the parameters (input, guessPtSwapToSy, limit, etc.), please refer to IPAllActionTypeV3.
@@ -8,8 +8,6 @@ import "../interfaces/IPReflector.sol";
8
8
  contract ActionMiscV3 is IPActionMiscV3, ActionBase {
9
9
  uint256 private constant NOT_FOUND = type(uint256).max;
10
10
 
11
- constructor(address _dustReceiver) ActionBase(_dustReceiver) {}
12
-
13
11
  function mintSyFromToken(
14
12
  address receiver,
15
13
  address SY,
@@ -24,8 +24,6 @@ contract ActionSimple is ActionBase, IPActionSimple {
24
24
  using PYIndexLib for PYIndex;
25
25
  using PMath for uint256;
26
26
 
27
- constructor(address _dustReceiver) ActionBase(_dustReceiver) {}
28
-
29
27
  // ------------------ SWAP TOKEN FOR PT ------------------
30
28
  /// @notice This function is for internal router use only and should not be called directly.
31
29
  /// @dev Use swapExactTokenForPt from the main router instead.
@@ -8,8 +8,6 @@ import {ActionDelegateBase} from "./base/ActionDelegateBase.sol";
8
8
  contract ActionSwapPTV3 is IPActionSwapPTV3, ActionBase, ActionDelegateBase {
9
9
  using PMath for uint256;
10
10
 
11
- constructor(address _dustReceiver) ActionDelegateBase(_dustReceiver) {}
12
-
13
11
  // ------------------ SWAP TOKEN FOR PT ------------------
14
12
  /// @notice For details on the parameters (input, guessPtSwapToSy, limit, etc.), please refer to IPAllActionTypeV3.
15
13
  function swapExactTokenForPt(
@@ -12,8 +12,6 @@ contract ActionSwapYTV3 is CallbackHelper, IPActionSwapYTV3, ActionBase, ActionD
12
12
  using MarketApproxPtOutLibV2 for MarketState;
13
13
  using PYIndexLib for IPYieldToken;
14
14
 
15
- constructor(address _dustReceiver) ActionDelegateBase(_dustReceiver) {}
16
-
17
15
  // ------------------ SWAP TOKEN FOR YT ------------------
18
16
 
19
17
  /// @notice For details on the parameters (input, guessPtSwapToSy, limit, etc.), please refer to IPAllActionTypeV3.
@@ -19,11 +19,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
19
19
  using PYIndexLib for PYIndex;
20
20
 
21
21
  bytes internal constant EMPTY_BYTES = abi.encode();
22
- address internal immutable DUST_RECEIVER;
23
-
24
- constructor(address _dustReceiver) {
25
- DUST_RECEIVER = _dustReceiver;
26
- }
27
22
 
28
23
  // ----------------- MINT REDEEM SY PY -----------------
29
24
 
@@ -163,10 +158,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
163
158
  return IPMarket(market).readState(address(this));
164
159
  }
165
160
 
166
- function _sweepDust(address token) internal {
167
- _transferOut(token, DUST_RECEIVER, _selfBalance(token));
168
- }
169
-
170
161
  // ----------------- PT SWAP -----------------
171
162
 
172
163
  function _entry_swapExactPtForSy(address market, LimitOrderData calldata limit) internal view returns (address) {
@@ -193,6 +184,8 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
193
184
  (netPtLeft, netSyOut, netSyFee, doMarketOrder) = _fillLimit(receiver, PT, netPtLeft, limit);
194
185
  if (doMarketOrder) {
195
186
  _transferOut(address(PT), market, netPtLeft);
187
+ } else {
188
+ _transferOut(address(PT), receiver, netPtLeft);
196
189
  }
197
190
  }
198
191
 
@@ -207,8 +200,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
207
200
  netSyFee += netSyFeeMarket;
208
201
  }
209
202
 
210
- _sweepDust(address(PT));
211
-
212
203
  if (netSyOut < minSyOut) revert("Slippage: INSUFFICIENT_SY_OUT");
213
204
  }
214
205
 
@@ -236,6 +227,8 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
236
227
  (netSyLeft, netPtOut, netSyFee, doMarketOrder) = _fillLimit(receiver, SY, netSyLeft, limit);
237
228
  if (doMarketOrder) {
238
229
  _transferOut(address(SY), market, netSyLeft);
230
+ } else {
231
+ _transferOut(address(SY), receiver, netSyLeft);
239
232
  }
240
233
  }
241
234
 
@@ -253,8 +246,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
253
246
  netSyFee += netSyFeeMarket;
254
247
  }
255
248
 
256
- _sweepDust(address(SY));
257
-
258
249
  if (netPtOut < minPtOut) revert("Slippage: INSUFFICIENT_PT_OUT");
259
250
  }
260
251
 
@@ -284,6 +275,8 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
284
275
  (netYtLeft, netSyOut, netSyFee, doMarketOrder) = _fillLimit(receiver, YT, netYtLeft, limit);
285
276
  if (doMarketOrder) {
286
277
  _transferOut(address(YT), address(YT), netYtLeft);
278
+ } else {
279
+ _transferOut(address(YT), receiver, netYtLeft);
287
280
  }
288
281
  }
289
282
 
@@ -301,8 +294,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
301
294
  netSyOut += SY.balanceOf(receiver) - preSyBalance;
302
295
  }
303
296
 
304
- _sweepDust(address(YT));
305
-
306
297
  if (netSyOut < minSyOut) revert("Slippage: INSUFFICIENT_SY_OUT");
307
298
  }
308
299
 
@@ -331,6 +322,8 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
331
322
  (netSyLeft, netYtOut, netSyFee, doMarketOrder) = _fillLimit(receiver, SY, netSyLeft, limit);
332
323
  if (doMarketOrder) {
333
324
  _transferOut(address(SY), address(YT), netSyLeft);
325
+ } else {
326
+ _transferOut(address(SY), receiver, netSyLeft);
334
327
  }
335
328
  }
336
329
 
@@ -351,7 +344,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
351
344
  netYtOut += netYtOutMarket;
352
345
  netSyFee += netSyFeeMarket;
353
346
  }
354
- _sweepDust(address(SY));
355
347
 
356
348
  if (netYtOut < minYtOut) revert("Slippage: INSUFFICIENT_YT_OUT");
357
349
  }
@@ -6,8 +6,6 @@ import {IPActionSimple} from "../../interfaces/IPActionSimple.sol";
6
6
  import {ApproxParams, TokenInput, LimitOrderData} from "../../interfaces/IPAllActionTypeV3.sol";
7
7
 
8
8
  contract ActionDelegateBase is ActionBase {
9
- constructor(address _dustReceiver) ActionBase(_dustReceiver) {}
10
-
11
9
  function delegateToAddLiquiditySinglePtSimple(
12
10
  address receiver,
13
11
  address market,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@pendle/core-v2",
3
3
  "description": "Core smart contracts of Pendle Protocol.",
4
4
  "license": "BUSL-1.1",
5
- "version": "6.1.3",
5
+ "version": "6.1.4-sweedtest",
6
6
  "homepage": "https://pendle.finance",
7
7
  "keywords": [
8
8
  "pendle",
@@ -39,6 +39,8 @@ export interface FixedPricePTAMMInterface extends utils.Interface {
39
39
  "setPriceOracle(address,address,address,uint256)": FunctionFragment;
40
40
  "swapExactPtForToken(address,address,uint256,address,bytes)": FunctionFragment;
41
41
  "swapPtForExactToken(address,address,address,uint256,bytes)": FunctionFragment;
42
+ "transferInThenSwapExactPtForToken(address,address,uint256,address)": FunctionFragment;
43
+ "transferInThenSwapPtForExactToken(address,address,address,uint256)": FunctionFragment;
42
44
  "transferOwnership(address,bool,bool)": FunctionFragment;
43
45
  "upgradeTo(address)": FunctionFragment;
44
46
  "upgradeToAndCall(address,bytes)": FunctionFragment;
@@ -90,6 +92,14 @@ export interface FixedPricePTAMMInterface extends utils.Interface {
90
92
  functionFragment: "swapPtForExactToken",
91
93
  values: [string, string, string, BigNumberish, BytesLike]
92
94
  ): string;
95
+ encodeFunctionData(
96
+ functionFragment: "transferInThenSwapExactPtForToken",
97
+ values: [string, string, BigNumberish, string]
98
+ ): string;
99
+ encodeFunctionData(
100
+ functionFragment: "transferInThenSwapPtForExactToken",
101
+ values: [string, string, string, BigNumberish]
102
+ ): string;
93
103
  encodeFunctionData(
94
104
  functionFragment: "transferOwnership",
95
105
  values: [string, boolean, boolean]
@@ -140,6 +150,14 @@ export interface FixedPricePTAMMInterface extends utils.Interface {
140
150
  functionFragment: "swapPtForExactToken",
141
151
  data: BytesLike
142
152
  ): Result;
153
+ decodeFunctionResult(
154
+ functionFragment: "transferInThenSwapExactPtForToken",
155
+ data: BytesLike
156
+ ): Result;
157
+ decodeFunctionResult(
158
+ functionFragment: "transferInThenSwapPtForExactToken",
159
+ data: BytesLike
160
+ ): Result;
143
161
  decodeFunctionResult(
144
162
  functionFragment: "transferOwnership",
145
163
  data: BytesLike
@@ -337,6 +355,22 @@ export interface FixedPricePTAMM extends BaseContract {
337
355
  overrides?: Overrides & { from?: string | Promise<string> }
338
356
  ): Promise<ContractTransaction>;
339
357
 
358
+ transferInThenSwapExactPtForToken(
359
+ receiver: string,
360
+ PT: string,
361
+ exactPtIn: BigNumberish,
362
+ token: string,
363
+ overrides?: Overrides & { from?: string | Promise<string> }
364
+ ): Promise<ContractTransaction>;
365
+
366
+ transferInThenSwapPtForExactToken(
367
+ receiver: string,
368
+ PT: string,
369
+ token: string,
370
+ exactTokenOut: BigNumberish,
371
+ overrides?: Overrides & { from?: string | Promise<string> }
372
+ ): Promise<ContractTransaction>;
373
+
340
374
  transferOwnership(
341
375
  newOwner: string,
342
376
  direct: boolean,
@@ -429,6 +463,22 @@ export interface FixedPricePTAMM extends BaseContract {
429
463
  overrides?: Overrides & { from?: string | Promise<string> }
430
464
  ): Promise<ContractTransaction>;
431
465
 
466
+ transferInThenSwapExactPtForToken(
467
+ receiver: string,
468
+ PT: string,
469
+ exactPtIn: BigNumberish,
470
+ token: string,
471
+ overrides?: Overrides & { from?: string | Promise<string> }
472
+ ): Promise<ContractTransaction>;
473
+
474
+ transferInThenSwapPtForExactToken(
475
+ receiver: string,
476
+ PT: string,
477
+ token: string,
478
+ exactTokenOut: BigNumberish,
479
+ overrides?: Overrides & { from?: string | Promise<string> }
480
+ ): Promise<ContractTransaction>;
481
+
432
482
  transferOwnership(
433
483
  newOwner: string,
434
484
  direct: boolean,
@@ -516,6 +566,22 @@ export interface FixedPricePTAMM extends BaseContract {
516
566
  overrides?: CallOverrides
517
567
  ): Promise<BigNumber>;
518
568
 
569
+ transferInThenSwapExactPtForToken(
570
+ receiver: string,
571
+ PT: string,
572
+ exactPtIn: BigNumberish,
573
+ token: string,
574
+ overrides?: CallOverrides
575
+ ): Promise<BigNumber>;
576
+
577
+ transferInThenSwapPtForExactToken(
578
+ receiver: string,
579
+ PT: string,
580
+ token: string,
581
+ exactTokenOut: BigNumberish,
582
+ overrides?: CallOverrides
583
+ ): Promise<BigNumber>;
584
+
519
585
  transferOwnership(
520
586
  newOwner: string,
521
587
  direct: boolean,
@@ -680,6 +746,22 @@ export interface FixedPricePTAMM extends BaseContract {
680
746
  overrides?: Overrides & { from?: string | Promise<string> }
681
747
  ): Promise<BigNumber>;
682
748
 
749
+ transferInThenSwapExactPtForToken(
750
+ receiver: string,
751
+ PT: string,
752
+ exactPtIn: BigNumberish,
753
+ token: string,
754
+ overrides?: Overrides & { from?: string | Promise<string> }
755
+ ): Promise<BigNumber>;
756
+
757
+ transferInThenSwapPtForExactToken(
758
+ receiver: string,
759
+ PT: string,
760
+ token: string,
761
+ exactTokenOut: BigNumberish,
762
+ overrides?: Overrides & { from?: string | Promise<string> }
763
+ ): Promise<BigNumber>;
764
+
683
765
  transferOwnership(
684
766
  newOwner: string,
685
767
  direct: boolean,
@@ -773,6 +855,22 @@ export interface FixedPricePTAMM extends BaseContract {
773
855
  overrides?: Overrides & { from?: string | Promise<string> }
774
856
  ): Promise<PopulatedTransaction>;
775
857
 
858
+ transferInThenSwapExactPtForToken(
859
+ receiver: string,
860
+ PT: string,
861
+ exactPtIn: BigNumberish,
862
+ token: string,
863
+ overrides?: Overrides & { from?: string | Promise<string> }
864
+ ): Promise<PopulatedTransaction>;
865
+
866
+ transferInThenSwapPtForExactToken(
867
+ receiver: string,
868
+ PT: string,
869
+ token: string,
870
+ exactTokenOut: BigNumberish,
871
+ overrides?: Overrides & { from?: string | Promise<string> }
872
+ ): Promise<PopulatedTransaction>;
873
+
776
874
  transferOwnership(
777
875
  newOwner: string,
778
876
  direct: boolean,