@pendle/core-v2 4.5.1-beta-1 → 4.5.1-beta-3

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 (104) hide show
  1. package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol/PendleERC20WithSupplyCapSY.dbg.json +1 -1
  2. package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol/PendleERC20WithSupplyCapSY.json +2 -2
  3. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol/PendleSwellRswETHStakingSY.dbg.json +4 -0
  4. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol/PendleSwellRswETHStakingSY.json +1049 -0
  5. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol/PendleSwellStakingERC20SY.dbg.json +4 -0
  6. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol/PendleSwellStakingERC20SY.json +1039 -0
  7. package/build/artifacts/contracts/interfaces/IPActionMiscV3.sol/IPActionMiscV3.dbg.json +1 -1
  8. package/build/artifacts/contracts/interfaces/IPActionMiscV3.sol/IPActionMiscV3.json +805 -80
  9. package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.dbg.json +1 -1
  10. package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.json +958 -233
  11. package/build/artifacts/contracts/interfaces/IPGovernanceProxy.sol/IPGovernanceProxy.dbg.json +4 -0
  12. package/build/artifacts/contracts/interfaces/IPGovernanceProxy.sol/IPGovernanceProxy.json +60 -0
  13. package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.dbg.json +4 -0
  14. package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.json +25 -0
  15. package/build/artifacts/contracts/interfaces/IPPtLpOracle.sol/IPPtLpOracle.dbg.json +1 -1
  16. package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.dbg.json +4 -0
  17. package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.json +207 -0
  18. package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.dbg.json +4 -0
  19. package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.json +401 -0
  20. package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.dbg.json +1 -1
  21. package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.json +2 -2
  22. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.dbg.json +1 -1
  23. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.json +2 -2
  24. package/build/artifacts/contracts/oracles/PendleLpOracleLib.sol/PendleLpOracleLib.dbg.json +1 -1
  25. package/build/artifacts/contracts/oracles/PendlePtLpOracle.sol/PendlePtLpOracle.dbg.json +1 -1
  26. package/build/artifacts/contracts/oracles/PendlePtOracleLib.sol/PendlePtOracleLib.dbg.json +1 -1
  27. package/build/artifacts/contracts/oracles/samples/BoringLpGlpOracle.sol/BoringLpGlpOracle.dbg.json +1 -1
  28. package/build/artifacts/contracts/oracles/samples/BoringPtUsdChainlinkOracle.sol/BoringPtUsdChainlinkOracle.dbg.json +1 -1
  29. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.dbg.json +1 -1
  30. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.json +2 -2
  31. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.dbg.json +1 -1
  32. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.json +707 -140
  33. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.dbg.json +1 -1
  34. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.json +2 -2
  35. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.dbg.json +1 -1
  36. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.json +2 -2
  37. package/build/artifacts/contracts/router/Reflector.sol/Reflector.dbg.json +4 -0
  38. package/build/artifacts/contracts/router/Reflector.sol/Reflector.json +39 -0
  39. package/build/artifacts/contracts/router/base/ActionBase.sol/ActionBase.dbg.json +1 -1
  40. package/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol +6 -1
  41. package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol +56 -0
  42. package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol +111 -0
  43. package/contracts/interfaces/IPActionMiscV3.sol +85 -25
  44. package/contracts/interfaces/IPGovernanceProxy.sol +14 -0
  45. package/contracts/interfaces/IPPausingInterface.sol +8 -0
  46. package/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol +66 -0
  47. package/contracts/offchain-helpers/PendleGovernanceProxy.sol +84 -0
  48. package/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol +12 -4
  49. package/contracts/router/ActionMiscV3.sol +140 -167
  50. package/contracts/router/Reflector.sol +61 -0
  51. package/contracts/router/base/ActionBase.sol +0 -16
  52. package/deployments/1-markets/EZETH-MAINNET-SEP2024.json +11 -0
  53. package/deployments/1-markets/PUFETH-MAINNET-SEP2024.json +11 -0
  54. package/deployments/1-markets/RSETH-MAINNET-SEP2024.json +11 -0
  55. package/deployments/1-markets/RSWETH-SWELL-STAKING-MAINNET-JUL2024.json +11 -0
  56. package/deployments/1-markets/SUSDE-MAINNET-SEP2024.json +13 -0
  57. package/deployments/1-markets/UNIETH-MAINNET-SEP2024.json +13 -0
  58. package/deployments/1-markets/WEETH-MAINNET-SEP2024.json +11 -0
  59. package/deployments/42161-core.json +1 -1
  60. package/deployments/42161-markets/EZETH-ARB-SEP2024.json +11 -0
  61. package/deployments/42161-markets/RSETH-ARBITRUM-SEP2024.json +11 -0
  62. package/deployments/42161-markets/SILO-PTEETH-ARBITRUM-JUNE2024.json +11 -0
  63. package/deployments/42161-markets/SILO-PTEZETH-ARBITRUM-JUNE2024.json +11 -0
  64. package/deployments/42161-markets/WEETH-ARB-SEP2024.json +11 -0
  65. package/deployments/56-markets/WEETH-BSC-SEP2024.json +11 -0
  66. package/package.json +2 -2
  67. package/typechain-types/ActionMiscV3.ts +358 -120
  68. package/typechain-types/BoringPYUsdChainlinkAssetOracle.ts +244 -0
  69. package/typechain-types/BoringPYUsdChainlinkSYOracle.ts +243 -0
  70. package/typechain-types/IPActionMiscV3.ts +408 -40
  71. package/typechain-types/IPAllActionV3.ts +408 -40
  72. package/typechain-types/IPGovernanceProxy.ts +142 -0
  73. package/typechain-types/IPPYLpOracle.ts +379 -0
  74. package/typechain-types/IPPausingInterface.ts +112 -0
  75. package/typechain-types/IPossibleSupplyCapInterface.ts +142 -0
  76. package/typechain-types/PendleGovernanceProxy.ts +603 -0
  77. package/typechain-types/PendlePYLpOracle.ts +612 -0
  78. package/typechain-types/Reflector.ts +98 -0
  79. package/typechain-types/SupplyCapReader.ts +105 -0
  80. package/typechain-types/factories/ActionAddRemoveLiqV3__factory.ts +1 -1
  81. package/typechain-types/factories/ActionMarketAuxStatic__factory.ts +1 -1
  82. package/typechain-types/factories/ActionMiscV3__factory.ts +705 -138
  83. package/typechain-types/factories/ActionSwapPTV3__factory.ts +1 -1
  84. package/typechain-types/factories/ActionSwapYTV3__factory.ts +1 -1
  85. package/typechain-types/factories/BoringPYUsdChainlinkAssetOracle__factory.ts +269 -0
  86. package/typechain-types/factories/BoringPYUsdChainlinkSYOracle__factory.ts +267 -0
  87. package/typechain-types/factories/IPActionMiscV3__factory.ts +805 -80
  88. package/typechain-types/factories/IPAllActionV3__factory.ts +958 -233
  89. package/typechain-types/factories/IPGovernanceProxy__factory.ts +75 -0
  90. package/typechain-types/factories/IPPYLpOracle__factory.ts +214 -0
  91. package/typechain-types/factories/IPPausingInterface__factory.ts +40 -0
  92. package/typechain-types/factories/IPossibleSupplyCapInterface__factory.ts +82 -0
  93. package/typechain-types/factories/PendleERC20WithSupplyCapSY__factory.ts +1 -1
  94. package/typechain-types/factories/PendleGovernanceProxy__factory.ts +458 -0
  95. package/typechain-types/factories/PendlePYLpOracle__factory.ts +487 -0
  96. package/typechain-types/factories/PendlePoolDeployHelper__factory.ts +1 -1
  97. package/typechain-types/factories/PendleSwellRswETHStakingSY__factory.ts +1 -1
  98. package/typechain-types/factories/Reflector__factory.ts +89 -0
  99. package/typechain-types/factories/SupplyCapReader__factory.ts +88 -0
  100. package/typechain-types/hardhat.d.ts +54 -0
  101. package/typechain-types/index.ts +12 -0
  102. /package/deployments/1-markets/{EZETH-JUNE2024.json → EZETH-APR2024.json} +0 -0
  103. /package/deployments/42161-markets/{RSETH-MAY2024.json → RSETH-JUNE2024.json} +0 -0
  104. /package/deployments/42161-markets/{WEETH-MAY2024.json → WEETH-JUNE2024.json} +0 -0
@@ -3,6 +3,7 @@ pragma solidity ^0.8.17;
3
3
 
4
4
  import "./base/ActionBase.sol";
5
5
  import "../interfaces/IPActionMiscV3.sol";
6
+ import "./Reflector.sol";
6
7
 
7
8
  contract ActionMiscV3 is IPActionMiscV3, ActionBase {
8
9
  function mintSyFromToken(
@@ -116,206 +117,149 @@ contract ActionMiscV3 is IPActionMiscV3, ActionBase {
116
117
  netTokenOut = IStandardizedYield(SY).redeem(receiver, netSyInterm, tokenRedeemSy, minTokenOut, true);
117
118
  }
118
119
 
119
- event ExitMultiplePreExpiry(
120
- address indexed caller,
121
- address indexed market,
122
- address indexed token,
123
- address receiver,
124
- uint256 netLpToRemove,
125
- uint256 netPtFromRemove,
126
- uint256 netSyFromRemove,
127
- uint256 netPyRedeem,
128
- uint256 netSyFromRedeem,
129
- uint256 netPtSwap,
130
- uint256 netYtSwap,
131
- uint256 netSyFromSwap,
132
- uint256 netSyFee,
133
- uint256 netTokenOut
134
- );
135
-
136
- event ExitMultiplePostExpiry(
137
- address indexed caller,
138
- address indexed market,
139
- address indexed token,
120
+ // double check event orders
121
+
122
+ function exitPreExpToToken(
140
123
  address receiver,
141
- uint256 netLpToRemove,
142
- uint256 netPtFromRemove, //
143
- uint256 netSyFromRemove, //
144
- uint256 netPtRedeem,
145
- uint256 netSyFromRedeem, //
146
- uint256 netTokenOut //
147
- );
148
-
149
- // TODO: need to allow exit to SY as well
150
-
151
- struct ExitMultipleParams {
152
- address receiver;
153
- address market;
154
- uint256 netPtIn;
155
- uint256 netYtIn;
156
- uint256 netLpIn;
157
- TokenOutput output;
158
- LimitOrderData limit;
124
+ address market,
125
+ uint256 netPtIn,
126
+ uint256 netYtIn,
127
+ uint256 netLpIn,
128
+ TokenOutput calldata output,
129
+ LimitOrderData calldata limit
130
+ ) external returns (uint256 totalTokenOut, ExitPreExpReturnParams memory params) {
131
+ IStandardizedYield SY;
132
+
133
+ (SY, params) = _exitPreExpToSy(true, address(0), market, netPtIn, netYtIn, netLpIn, limit);
134
+ totalTokenOut = _redeemSyToToken(receiver, address(SY), params.totalSyOut, output, false);
135
+
136
+ emit ExitPreExpToToken(msg.sender, market, output.tokenOut, receiver, netLpIn, totalTokenOut, params);
159
137
  }
160
138
 
161
- function exitMultiplePreExpiry(
139
+ function exitPreExpToSy(
162
140
  address receiver,
163
141
  address market,
164
142
  uint256 netPtIn,
165
143
  uint256 netYtIn,
166
144
  uint256 netLpIn,
167
- TokenOutput calldata output,
145
+ uint256 minSyOut,
168
146
  LimitOrderData calldata limit
169
- )
170
- external
171
- returns (
172
- uint256 netTokenOut,
173
- uint256 netPtFromRemove,
174
- uint256 netSyFromRemove,
175
- uint256 netPyRedeem,
176
- uint256 netSyFromRedeem,
177
- uint256 netPtSwap,
178
- uint256 netYtSwap,
179
- uint256 netSyFromSwap,
180
- uint256 netSyFee
181
- )
182
- {
183
- (
184
- netTokenOut,
185
- netPtFromRemove,
186
- netSyFromRemove,
187
- netPyRedeem,
188
- netSyFromRedeem,
189
- netPtSwap,
190
- netYtSwap,
191
- netSyFromSwap,
192
- netSyFee
193
- ) = exitMultiplePreExpiryInner(receiver, market, netPtIn, netYtIn, netLpIn, output, limit);
194
-
195
- emit ExitMultiplePreExpiry(
196
- msg.sender,
197
- market,
198
- output.tokenOut,
199
- receiver,
200
- netLpIn,
201
- netPtFromRemove,
202
- netSyFromRemove,
203
- netPyRedeem,
204
- netSyFromRedeem,
205
- netPtSwap,
206
- netYtSwap,
207
- netSyFromSwap,
208
- netSyFee,
209
- netTokenOut
210
- );
147
+ ) external returns (ExitPreExpReturnParams memory params) {
148
+ (, params) = _exitPreExpToSy(false, receiver, market, netPtIn, netYtIn, netLpIn, limit);
149
+ require(params.totalSyOut >= minSyOut, "Slippage: INSUFFICIENT_SY_OUT");
150
+
151
+ emit ExitPreExpToSy(msg.sender, market, receiver, netLpIn, params);
211
152
  }
212
153
 
213
- function exitMultiplePreExpiryInner(
154
+ function _exitPreExpToSy(
155
+ bool setReceiverToSy,
214
156
  address receiver,
215
157
  address market,
216
158
  uint256 netPtIn,
217
159
  uint256 netYtIn,
218
160
  uint256 netLpIn,
219
- TokenOutput calldata output,
220
161
  LimitOrderData calldata limit
221
- )
222
- internal
223
- returns (
224
- uint256 netTokenOut,
225
- uint256 netPtFromRemove,
226
- uint256 netSyFromRemove,
227
- uint256 netPyRedeem,
228
- uint256 netSyFromRedeem,
229
- uint256 netPtSwap,
230
- uint256 netYtSwap,
231
- uint256 netSyFromSwap,
232
- uint256 netSyFee
233
- )
234
- {
235
- // (IStandardizedYield SY, IPPrincipalToken PT, IPYieldToken YT) = IPMarket(market).readTokens();
236
- // if (netLpIn > 0) {
237
- // _transferFrom(IERC20(market), msg.sender, market, netLpIn);
238
- // (netSyFromRemove, netPtFromRemove) = IPMarket(market).burn(address(SY), address(this), netLpIn);
239
- // }
240
- // if (netPtIn > 0) {
241
- // _transferIn(address(PT), address(this), netPtIn);
242
- // }
243
- // netPyRedeem = PMath.min(netPtFromRemove + netPtIn, netYtIn);
244
- // if (netPyRedeem > 0) {
245
- // _transferOut(address(PT), address(YT), netPyRedeem);
246
- // _transferFrom(YT, msg.sender, address(YT), netPyRedeem);
247
- // netSyFromRedeem = IPYieldToken(YT).redeemPY(address(SY));
248
- // }
249
- // netPtSwap = netPtFromRemove + netPtIn - netPyRedeem;
250
- // netYtSwap = netYtIn - netPyRedeem;
251
- // if (netPtSwap > 0) {
252
- // address ptEntry = _entry_swapExactPtForSy(market, limit);
253
- // if (ptEntry != address(this)) _transferOut(address(PT), ptEntry, netPtSwap);
254
- // (netSyFromSwap, netSyFee) = _swapExactPtForSy(address(SY), market, netPtSwap, 0, limit);
255
- // } else if (netYtSwap > 0) {
256
- // _transferFrom(YT, msg.sender, _entry_swapExactYtForSy(YT, limit), netYtSwap);
257
- // (netSyFromSwap, netSyFee) = _swapExactYtForSy(address(SY), market, SY, YT, netYtSwap, 0, limit);
258
- // }
259
- // uint256 netSyRedeem = netSyFromRemove + netSyFromRedeem + netSyFromSwap;
260
- // netTokenOut = _redeemSyToToken(receiver, address(SY), netSyRedeem, output, false);
162
+ ) internal returns (IStandardizedYield SY, ExitPreExpReturnParams memory p) {
163
+ IPPrincipalToken PT;
164
+ IPYieldToken YT;
165
+ (SY, PT, YT) = IPMarket(market).readTokens();
166
+
167
+ if (setReceiverToSy) receiver = address(SY);
168
+
169
+ if (netLpIn > 0) {
170
+ _transferFrom(IERC20(market), msg.sender, market, netLpIn);
171
+ (p.netSyFromRemove, p.netPtFromRemove) = IPMarket(market).burn(receiver, address(this), netLpIn);
172
+ }
173
+
174
+ if (netPtIn > 0) {
175
+ _transferIn(address(PT), msg.sender, netPtIn);
176
+ }
177
+
178
+ p.netPyRedeem = PMath.min(p.netPtFromRemove + netPtIn, netYtIn);
179
+
180
+ if (p.netPyRedeem > 0) {
181
+ _transferOut(address(PT), address(YT), p.netPyRedeem);
182
+ _transferFrom(YT, msg.sender, address(YT), p.netPyRedeem);
183
+ p.netSyFromRedeem = IPYieldToken(YT).redeemPY(receiver);
184
+ }
185
+
186
+ p.netPtSwap = p.netPtFromRemove + netPtIn - p.netPyRedeem;
187
+ p.netYtSwap = netYtIn - p.netPyRedeem;
188
+
189
+ if (p.netPtSwap > 0) {
190
+ address ptEntry = _entry_swapExactPtForSy(market, limit);
191
+ if (ptEntry != address(this)) _transferOut(address(PT), ptEntry, p.netPtSwap);
192
+ (p.netSyFromSwap, p.netSyFee) = _swapExactPtForSy(receiver, market, p.netPtSwap, 0, limit);
193
+ } else if (p.netYtSwap > 0) {
194
+ _transferFrom(YT, msg.sender, _entry_swapExactYtForSy(YT, limit), p.netYtSwap);
195
+ (p.netSyFromSwap, p.netSyFee) = _swapExactYtForSy(receiver, market, SY, YT, p.netYtSwap, 0, limit);
196
+ }
197
+
198
+ p.totalSyOut = p.netSyFromRemove + p.netSyFromRedeem + p.netSyFromSwap;
261
199
  }
262
200
 
263
- // TODO: is netSyInterm necessary? can we return more?
264
- // TODO: compare interface against existing functions, to see if it makes sense
265
- function exitMultiplePostExpiry(
201
+ function exitPostExpToToken(
266
202
  address receiver,
267
203
  address market,
268
204
  uint256 netPtIn,
269
205
  uint256 netLpIn,
270
206
  TokenOutput calldata output
271
- )
272
- external
273
- returns (
274
- uint256 netTokenOut,
275
- uint256 netPtFromRemove,
276
- uint256 netSyFromRemove,
277
- uint256 netPtRedeem,
278
- uint256 netSyFromRedeem
279
- )
280
- {
281
- // * (done) maybe shouldn't reuse functions because of conflicting events
282
- // * (KIV) expose all inner workings variables
283
- // also: should match events with existing events
284
- // events, no matter what is emitted, can be parsed dynamically on BE. Say if only PT is exited, it can be parsed
285
- // as swapExact
286
-
287
- (IStandardizedYield SY, IPPrincipalToken PT, IPYieldToken YT) = IPMarket(market).readTokens();
288
-
289
- // uint256 netPtFromRemove;
290
- // uint256 netSyFromRemove;
207
+ ) external returns (uint256 totalTokenOut, ExitPostExpReturnParams memory params) {
208
+ IStandardizedYield SY;
209
+
210
+ (SY, params) = _exitPostExpToSy(receiver, market, netPtIn, netLpIn);
211
+ totalTokenOut = _redeemSyToToken(receiver, address(SY), params.totalSyOut, output, false);
212
+
213
+ emit ExitPostExpToToken(msg.sender, market, output.tokenOut, receiver, netLpIn, totalTokenOut, params);
214
+ }
215
+
216
+ function exitPostExpToSy(
217
+ address receiver,
218
+ address market,
219
+ uint256 netPtIn,
220
+ uint256 netLpIn,
221
+ uint256 minSyOut
222
+ ) external returns (ExitPostExpReturnParams memory params) {
223
+ (, params) = _exitPostExpToSy(receiver, market, netPtIn, netLpIn);
224
+ require(params.totalSyOut >= minSyOut, "Slippage: INSUFFICIENT_SY_OUT");
225
+
226
+ emit ExitPostExpToSy(msg.sender, market, receiver, netLpIn, params);
227
+ }
228
+
229
+ function _exitPostExpToSy(
230
+ address receiver,
231
+ address market,
232
+ uint256 netPtIn,
233
+ uint256 netLpIn
234
+ ) internal returns (IStandardizedYield SY, ExitPostExpReturnParams memory p) {
235
+ IPPrincipalToken PT;
236
+ IPYieldToken YT;
237
+ (SY, PT, YT) = IPMarket(market).readTokens();
291
238
 
292
239
  if (netLpIn > 0) {
293
240
  _transferFrom(IERC20(market), msg.sender, market, netLpIn);
294
- (netSyFromRemove, netPtFromRemove) = IPMarket(market).burn(address(SY), address(YT), netLpIn);
241
+ (p.netSyFromRemove, p.netPtFromRemove) = IPMarket(market).burn(receiver, address(YT), netLpIn);
295
242
  }
296
243
 
297
244
  if (netPtIn > 0) {
298
245
  _transferFrom(PT, msg.sender, address(YT), netPtIn);
299
246
  }
300
247
 
301
- netPtRedeem = netPtFromRemove + netPtIn;
302
- netSyFromRedeem = IPYieldToken(YT).redeemPY(address(SY));
303
-
304
- uint256 netSyRedeem = netSyFromRemove + netSyFromRedeem;
305
- netTokenOut = _redeemSyToToken(receiver, address(SY), netSyRedeem, output, false);
306
-
307
- emit ExitMultiplePostExpiry(
308
- msg.sender,
309
- market,
310
- output.tokenOut,
311
- receiver,
312
- netLpIn,
313
- netPtFromRemove,
314
- netSyFromRemove,
315
- netPtRedeem,
316
- netSyFromRedeem,
317
- netTokenOut
318
- );
248
+ p.netPtRedeem = p.netPtFromRemove + netPtIn;
249
+ p.netSyFromRedeem = IPYieldToken(YT).redeemPY(receiver);
250
+
251
+ p.totalSyOut = p.netSyFromRemove + p.netSyFromRedeem;
252
+ }
253
+
254
+ function multicallAlpha(
255
+ address payable reflector,
256
+ bytes calldata selfCall,
257
+ bytes calldata reflectCall
258
+ ) external payable returns (bytes memory selfRes, bytes memory reflectRes) {
259
+ (, selfRes) = _delegateToSelf(selfCall, false);
260
+ reflectRes = _callToReflector(reflector, reflectCall);
261
+
262
+ // ? We don't need to check balance here, can trust SDK?
319
263
  }
320
264
 
321
265
  // ----------------- MISC FUNCTIONS -----------------
@@ -339,4 +283,33 @@ contract ActionMiscV3 is IPActionMiscV3, ActionBase {
339
283
  (bool success, bytes memory result) = target.delegatecall(data);
340
284
  revert Errors.SimulationResults(success, result);
341
285
  }
286
+
287
+ function _delegateToSelf(
288
+ bytes memory data,
289
+ bool allowFailure
290
+ ) internal returns (bool success, bytes memory result) {
291
+ (success, result) = address(this).delegatecall(data);
292
+
293
+ if (!success && !allowFailure) {
294
+ assembly {
295
+ // We use Yul's revert() to bubble up errors from the target contract.
296
+ revert(add(32, result), mload(result))
297
+ }
298
+ }
299
+ }
300
+
301
+ function _callToReflector(address payable reflector, bytes memory data) internal returns (bytes memory result) {
302
+ // TODO: should we allow arbitrary passing?
303
+ // TODO: is the payable necessary?
304
+
305
+ bool success;
306
+ (success, result) = Reflector(reflector).reflect(data);
307
+
308
+ if (!success) {
309
+ assembly {
310
+ // We use Yul's revert() to bubble up errors from the target contract.
311
+ revert(add(32, result), mload(result))
312
+ }
313
+ }
314
+ }
342
315
  }
@@ -0,0 +1,61 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ pragma solidity ^0.8.17;
3
+
4
+ import "../interfaces/IPAllActionV3.sol";
5
+ import "../core/libraries/TokenHelper.sol";
6
+
7
+ contract Reflector is TokenHelper {
8
+ using SafeERC20 for IERC20;
9
+
10
+ mapping(address => bool) internal approved;
11
+
12
+ receive() external payable {}
13
+
14
+ function reflect(bytes calldata inputData) external returns (bool success, bytes memory result) {
15
+ (uint256 value, bytes memory newCalldata) = _process1(inputData);
16
+ (success, result) = msg.sender.call{value: value}(newCalldata);
17
+ }
18
+
19
+ function _process1(bytes calldata inputData) internal returns (uint256 value, bytes memory newCalldata) {
20
+ bytes4 selector = bytes4(inputData[:4]);
21
+ bytes calldata data = inputData[4:];
22
+
23
+ // TODO: can we do nicer here?
24
+ if (selector == IPActionAddRemoveLiqV3.addLiquiditySingleToken.selector) {
25
+ (
26
+ address v1,
27
+ address v2,
28
+ uint256 v3,
29
+ ApproxParams memory v4,
30
+ TokenInput memory v5,
31
+ LimitOrderData memory v6
32
+ ) = abi.decode(data, (address, address, uint256, ApproxParams, TokenInput, LimitOrderData));
33
+
34
+ value = _process2(v5);
35
+ newCalldata = abi.encodeWithSelector(selector, v1, v2, v3, v4, v5, v6);
36
+ _safeApproveInf(v5.tokenIn, msg.sender);
37
+ } else if (selector == IPActionAddRemoveLiqV3.addLiquiditySingleTokenKeepYt.selector) {
38
+ (address v1, address v2, uint256 v3, uint256 v4, TokenInput memory v5) = abi.decode(
39
+ data,
40
+ (address, address, uint256, uint256, TokenInput)
41
+ );
42
+
43
+ value = _process2(v5);
44
+ newCalldata = abi.encodeWithSelector(selector, v1, v2, v3, v4, v5);
45
+ } else {
46
+ revert("UNSUPPORTED_SELECTOR");
47
+ }
48
+ }
49
+
50
+ function _process2(TokenInput memory inp) internal returns (uint256 ethValue) {
51
+ assert(inp.swapData.swapType == SwapType.NONE);
52
+
53
+ inp.netTokenIn = _selfBalance(inp.tokenIn);
54
+ ethValue = inp.tokenIn == NATIVE ? inp.netTokenIn : 0;
55
+
56
+ if (inp.tokenIn != NATIVE && !approved[inp.tokenIn]) {
57
+ IERC20(inp.tokenIn).safeApprove(msg.sender, type(uint256).max);
58
+ approved[inp.tokenIn] = true;
59
+ }
60
+ }
61
+ }
@@ -373,20 +373,4 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
373
373
  function _isEmptyLimit(LimitOrderData calldata a) internal pure returns (bool) {
374
374
  return a.normalFills.length == 0 && a.flashFills.length == 0;
375
375
  }
376
-
377
- // ----------------- DELEGATE CALL -----------------
378
-
379
- function _delegateToSelf(
380
- bytes memory data,
381
- bool allowFailure
382
- ) internal returns (bool success, bytes memory result) {
383
- (success, result) = address(this).delegatecall(data);
384
-
385
- if (!success && !allowFailure) {
386
- assembly {
387
- // We use Yul's revert() to bubble up errors from the target contract.
388
- revert(add(32, result), mload(result))
389
- }
390
- }
391
- }
392
376
  }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY ezETH",
3
+ "SY": "0x22E12A50e3ca49FB183074235cB1db84Fe4C716D",
4
+ "YT": "0x1623F1A991584A6b69baBbdbffD26E2B46485465",
5
+ "PT": "0x248241244356D18f63d0c16082996839ecB0C7bF",
6
+ "market": "0xcDBD5ff3E03b6828Db9C32e2131A60ABA5137901",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7728447732000000000",
9
+ "initAnchor": "1116672357000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY pufETH",
3
+ "SY": "0x253008ba4aE2f3E6488DC998a5321D4EB1a0c905",
4
+ "YT": "0x1a65eB80a2ac3ea6E41D456DdD6E9cC5728BEf7C",
5
+ "PT": "0xd4e75971eAF78a8d93D96df530f1FFf5f9F53288",
6
+ "market": "0xA54FC268101c8b97DE19eF3141d34751a11996B2",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7770558179000000000",
9
+ "initAnchor": "1110275954000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY rsETH",
3
+ "SY": "0x730A5E2AcEbccAA5e9095723B3CB862739DA793c",
4
+ "YT": "0xE653E4048620E546AFff02D3689678896d22e236",
5
+ "PT": "0x7bAf258049cc8B9A78097723dc19a8b103D4098F",
6
+ "market": "0x6b4740722e46048874d84306B2877600ABCea3Ae",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7770558179000000000",
9
+ "initAnchor": "1110275954000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY rswETH",
3
+ "SY": "0x4f3A7a07A968B67F1f9692b70242f10E665d38Ad",
4
+ "YT": "0xf0E4244Ca93Ac36752DA5939Afd9CB73B0637b06",
5
+ "PT": "0x0a0E172511114456EC63A85FF32E45C5e0E27D63",
6
+ "market": "0x1e0c2e41f3165ff6B8a660092f63E10BC0EebE26",
7
+ "expiry": 1721865600,
8
+ "scalarRoot": "8113474588000000000",
9
+ "initAnchor": "1061316437000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "SUSDE-MAINNET-SEP2024",
3
+ "SY": "0x4139cDC6345aFFbaC0692b43bed4D059Df3e6d65",
4
+ "YT": "0xdc02b77a3986da62C7A78FED73949C9767850809",
5
+ "PT": "0x6c9f097e044506712B58EAC670c9a5fd4BCceF13",
6
+ "market": "0xd1D7D99764f8a52Aff007b7831cc02748b2013b5",
7
+ "expiry": 1727308800,
8
+ "lnFeeRateRoot": "2995508979000000",
9
+ "scalarRoot": "8580934398000000000",
10
+ "initAnchor": "1120006408000000000",
11
+ "doCacheIndexSameBlock": true,
12
+ "deployTxHash": "0x467c0c15148778d0b99a1d9f3bd7406fd0c58d8a6e3284a57a50e55ae0160165"
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "UNIETH-MAINNET-SEP2024",
3
+ "SY": "0xc430dB19339A3051192233B4c49f9aB3DC6D16b7",
4
+ "YT": "0xdF74bA4436478969A54eCB352093312fE97EBAa5",
5
+ "PT": "0x15fA86404BFbA8b46684552F792558128bFB6418",
6
+ "market": "0xBaE2Df4DfCd0c613018D6056A40077F2d1eFf28A",
7
+ "expiry": 1727308800,
8
+ "lnFeeRateRoot": "2995508979000000",
9
+ "scalarRoot": "7770558179000000000",
10
+ "initAnchor": "1110275954000000000",
11
+ "doCacheIndexSameBlock": true,
12
+ "deployTxHash": "0x4e509feb8502bee0c719c1a9eb2c73c9e1b070fc8424e1f4f31618bdc764a560"
13
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY weETH",
3
+ "SY": "0xAC0047886a985071476a1186bE89222659970d65",
4
+ "YT": "0xA54Df645A042D24121a737dAA89a57EbF8E0b71c",
5
+ "PT": "0x1c085195437738d73d75DC64bC5A3E098b7f93b1",
6
+ "market": "0xC8eDd52D0502Aa8b4D5C77361D4B3D300e8fC81c",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7728447732000000000",
9
+ "initAnchor": "1116672357000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -19,7 +19,7 @@
19
19
  "PENDLE": "0x0c880f6761F1af8d9Aa9C466984b80DAb9a8c9e8",
20
20
  "yieldContractFactory": "0x28dE02Ac3c3F5ef427e55c321F73fDc7F192e8E4",
21
21
  "marketFactory": "0xf5a7De2D276dbda3EEf1b62A9E718EFf4d29dDC8",
22
- "router": "0x888888888889758F76e7103c6CbF23ABbF58F946",
22
+ "router": "0xaBbCC1E99687b2d5B6db8bC5dD8904B142Eaf04b",
23
23
  "routerStatic": "0xAdB09F65bd90d19e3148D9ccb693F3161C6DB3E8",
24
24
  "pendleSwap": "0x63a45E0B2686F7be77Bb85735c35704D1046459a",
25
25
  "routerHelper": "0x462206b11d185ef6F64B41D344325401C37EC335",
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY ezETH",
3
+ "SY": "0x0dE802e3D6Cc9145A150bBDc8da9F988a98c5202",
4
+ "YT": "0xE58AfaA6E2abF9A9F243D5A55Bd5447628c4D811",
5
+ "PT": "0x2CCFce9bE49465CC6f947b5F6aC9383673733Da9",
6
+ "market": "0x35f3dB08a6e9cB4391348b0B404F493E7ae264c0",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7728447732000000000",
9
+ "initAnchor": "1116672357000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY rsETH",
3
+ "SY": "0xf176fB51F4eB826136a54FDc71C50fCd2202E272",
4
+ "YT": "0x2FDc424946AA72D42E2F897447d7c335E64845F0",
5
+ "PT": "0x30c98c0139B62290E26aC2a2158AC341Dcaf1333",
6
+ "market": "0x1d38d4204159aA5e767aFbA8f76BE22117De61E5",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7770558179000000000",
9
+ "initAnchor": "1110275954000000000",
10
+ "lnFeeRateRoot": "29999550000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY sETH-pteETHSilo",
3
+ "SY": "0xd0c4351a18F40b96b6446Da3A191496DF36d60F9",
4
+ "YT": "0x7Cfb81E9c9402D48c6F3161204a21800b210BAeA",
5
+ "PT": "0x2D5405688f253D741a9F1090DD90D8A285CF5C79",
6
+ "market": "0x6aBE9Ac2df48490693BdB9d66Fa898fc9cD7cc36",
7
+ "expiry": 1719446400,
8
+ "scalarRoot": "10324763686000000000",
9
+ "initAnchor": "1041846750000000000",
10
+ "lnFeeRateRoot": "499875041000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY sETH-ptezETHSilo",
3
+ "SY": "0x8242F81F7B06C1e67bC80DFD2B2716f58bD46651",
4
+ "YT": "0x8138E8cAC470Dc963437b055834B54D56d6d6a29",
5
+ "PT": "0xd7e810aEd2988B8A7eA0187d55C939110b178521",
6
+ "market": "0xCf602767e9c82194DaF58EB67a3169d60DbAaC62",
7
+ "expiry": 1719446400,
8
+ "scalarRoot": "10324763686000000000",
9
+ "initAnchor": "1041846750000000000",
10
+ "lnFeeRateRoot": "499875041000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY weETH",
3
+ "SY": "0xa6C895EB332E91c5b3D00B7baeEAae478cc502DA",
4
+ "YT": "0xfB2A7AC0372C2425c273932f8d438518402A873E",
5
+ "PT": "0xb8b0a120F6A68Dd06209619F62429fB1a8e92feC",
6
+ "market": "0xf9F9779d8fF604732EBA9AD345E6A27EF5c2a9d6",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7728447732000000000",
9
+ "initAnchor": "1116672357000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "SY weETH",
3
+ "SY": "0x56b70AC3a6Ae850F6AEE67591d1bB86895Ba211E",
4
+ "YT": "0xBf1E6E67cE2Bd8da1ea7342354126b59B46d4000",
5
+ "PT": "0x0E8Ba474FCB6581059C61c328a21CFa285C7Cee7",
6
+ "market": "0x27255F9aFF1868A8eFB1182471F4De2121946Fd0",
7
+ "expiry": 1727308800,
8
+ "scalarRoot": "7728447732000000000",
9
+ "initAnchor": "1116672357000000000",
10
+ "lnFeeRateRoot": "2995508979000000"
11
+ }
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": "4.5.1-beta-1",
5
+ "version": "4.5.1-beta-3",
6
6
  "homepage": "https://pendle.finance",
7
7
  "keywords": [
8
8
  "pendle",
@@ -49,4 +49,4 @@
49
49
  "@openzeppelin/contracts": "4.9.3",
50
50
  "@openzeppelin/contracts-upgradeable": "4.9.3"
51
51
  }
52
- }
52
+ }