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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) 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 +0 -431
  9. package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.dbg.json +1 -1
  10. package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.json +0 -431
  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/IPPYLpOracle.sol/IPPYLpOracle.dbg.json +4 -0
  14. package/build/artifacts/contracts/interfaces/{IPPtLpOracle.sol/IPPtLpOracle.json → IPPYLpOracle.sol/IPPYLpOracle.json} +50 -2
  15. package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.dbg.json +4 -0
  16. package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.json +25 -0
  17. package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.dbg.json +4 -0
  18. package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.json +207 -0
  19. package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.dbg.json +4 -0
  20. package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.json +401 -0
  21. package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.dbg.json +1 -1
  22. package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.json +2 -2
  23. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.dbg.json +1 -1
  24. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.json +2 -2
  25. package/build/artifacts/contracts/oracles/PendleLpOracleLib.sol/PendleLpOracleLib.dbg.json +1 -1
  26. package/build/artifacts/contracts/oracles/PendleLpOracleLib.sol/PendleLpOracleLib.json +2 -2
  27. package/build/artifacts/contracts/oracles/PendlePYLpOracle.sol/PendlePYLpOracle.dbg.json +4 -0
  28. package/build/artifacts/contracts/oracles/PendlePYLpOracle.sol/PendlePYLpOracle.json +422 -0
  29. package/build/artifacts/contracts/oracles/PendlePYOracleLib.sol/PendlePYOracleLib.dbg.json +4 -0
  30. package/build/artifacts/contracts/oracles/{PendlePtOracleLib.sol/PendlePtOracleLib.json → PendlePYOracleLib.sol/PendlePYOracleLib.json} +4 -4
  31. package/build/artifacts/contracts/oracles/samples/BoringLpGlpOracle.sol/BoringLpGlpOracle.dbg.json +1 -1
  32. package/build/artifacts/contracts/oracles/samples/BoringLpGlpOracle.sol/BoringLpGlpOracle.json +2 -2
  33. package/build/artifacts/contracts/oracles/samples/BoringPYUsdChainlinkAssetOracle.sol/BoringPYUsdChainlinkAssetOracle.dbg.json +4 -0
  34. package/build/artifacts/contracts/oracles/samples/BoringPYUsdChainlinkAssetOracle.sol/BoringPYUsdChainlinkAssetOracle.json +183 -0
  35. package/build/artifacts/contracts/oracles/samples/BoringPYUsdChainlinkSYOracle.sol/BoringPYUsdChainlinkSYOracle.dbg.json +4 -0
  36. package/build/artifacts/contracts/oracles/samples/BoringPYUsdChainlinkSYOracle.sol/BoringPYUsdChainlinkSYOracle.json +183 -0
  37. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.dbg.json +1 -1
  38. package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.json +2 -2
  39. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.dbg.json +1 -1
  40. package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.json +2 -591
  41. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.dbg.json +1 -1
  42. package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.json +2 -2
  43. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.dbg.json +1 -1
  44. package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.json +2 -2
  45. package/build/artifacts/contracts/router/base/ActionBase.sol/ActionBase.dbg.json +1 -1
  46. package/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol +6 -1
  47. package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol +56 -0
  48. package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol +111 -0
  49. package/contracts/interfaces/IPActionMiscV3.sol +0 -38
  50. package/contracts/interfaces/IPGovernanceProxy.sol +14 -0
  51. package/contracts/interfaces/{IPPtLpOracle.sol → IPPYLpOracle.sol} +5 -1
  52. package/contracts/interfaces/IPPausingInterface.sol +8 -0
  53. package/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol +66 -0
  54. package/contracts/offchain-helpers/PendleGovernanceProxy.sol +84 -0
  55. package/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol +12 -4
  56. package/contracts/oracles/PendleLpOracleLib.sol +4 -4
  57. package/contracts/oracles/{PendlePtLpOracle.sol → PendlePYLpOracle.sol} +44 -16
  58. package/contracts/oracles/{PendlePtOracleLib.sol → PendlePYOracleLib.sol} +31 -1
  59. package/contracts/oracles/samples/BoringLpGlpOracle.sol +2 -2
  60. package/contracts/oracles/samples/{BoringPtUsdChainlinkOracle.sol → BoringPYUsdChainlinkAssetOracle.sol} +36 -12
  61. package/contracts/oracles/samples/BoringPYUsdChainlinkSYOracle.sol +102 -0
  62. package/contracts/router/ActionMiscV3.sol +36 -216
  63. package/contracts/router/ActionSwapYTV3.sol +85 -0
  64. package/contracts/router/base/ActionBase.sol +1 -106
  65. package/deployments/1-markets/EZETH-MAINNET-SEP2024.json +11 -0
  66. package/deployments/1-markets/PUFETH-MAINNET-SEP2024.json +11 -0
  67. package/deployments/1-markets/RSETH-MAINNET-SEP2024.json +11 -0
  68. package/deployments/1-markets/RSWETH-SWELL-STAKING-MAINNET-JUL2024.json +11 -0
  69. package/deployments/1-markets/SUSDE-MAINNET-SEP2024.json +13 -0
  70. package/deployments/1-markets/WEETH-MAINNET-SEP2024.json +11 -0
  71. package/deployments/42161-markets/EZETH-ARB-SEP2024.json +11 -0
  72. package/deployments/42161-markets/RSETH-ARBITRUM-SEP2024.json +11 -0
  73. package/deployments/42161-markets/SILO-PTEETH-ARBITRUM-JUNE2024.json +11 -0
  74. package/deployments/42161-markets/SILO-PTEZETH-ARBITRUM-JUNE2024.json +11 -0
  75. package/deployments/42161-markets/WEETH-ARB-SEP2024.json +11 -0
  76. package/deployments/56-markets/WEETH-BSC-SEP2024.json +11 -0
  77. package/package.json +1 -1
  78. package/typechain-types/ActionMiscV3.ts +16 -379
  79. package/typechain-types/BoringPYUsdChainlinkAssetOracle.ts +244 -0
  80. package/typechain-types/BoringPYUsdChainlinkSYOracle.ts +243 -0
  81. package/typechain-types/IPActionMiscV3.ts +16 -249
  82. package/typechain-types/IPAllActionV3.ts +0 -156
  83. package/typechain-types/IPGovernanceProxy.ts +142 -0
  84. package/typechain-types/IPPYLpOracle.ts +379 -0
  85. package/typechain-types/IPPausingInterface.ts +112 -0
  86. package/typechain-types/PendleGovernanceProxy.ts +603 -0
  87. package/typechain-types/PendlePYLpOracle.ts +612 -0
  88. package/typechain-types/factories/ActionAddRemoveLiqV3__factory.ts +1 -1
  89. package/typechain-types/factories/ActionMarketAuxStatic__factory.ts +1 -1
  90. package/typechain-types/factories/ActionMiscV3__factory.ts +1 -590
  91. package/typechain-types/factories/ActionSwapPTV3__factory.ts +1 -1
  92. package/typechain-types/factories/ActionSwapYTV3__factory.ts +1 -1
  93. package/typechain-types/factories/BoringLpGlpOracle__factory.ts +1 -1
  94. package/typechain-types/factories/BoringPYUsdChainlinkAssetOracle__factory.ts +269 -0
  95. package/typechain-types/factories/BoringPYUsdChainlinkSYOracle__factory.ts +267 -0
  96. package/typechain-types/factories/IPActionMiscV3__factory.ts +0 -431
  97. package/typechain-types/factories/IPAllActionV3__factory.ts +0 -431
  98. package/typechain-types/factories/IPGovernanceProxy__factory.ts +75 -0
  99. package/typechain-types/factories/IPPYLpOracle__factory.ts +214 -0
  100. package/typechain-types/factories/IPPausingInterface__factory.ts +40 -0
  101. package/typechain-types/factories/PendleERC20WithSupplyCapSY__factory.ts +1 -1
  102. package/typechain-types/factories/PendleGovernanceProxy__factory.ts +458 -0
  103. package/typechain-types/factories/PendlePYLpOracle__factory.ts +487 -0
  104. package/typechain-types/factories/PendlePoolDeployHelper__factory.ts +1 -1
  105. package/typechain-types/factories/PendleSwellRswETHStakingSY__factory.ts +1 -1
  106. package/typechain-types/hardhat.d.ts +63 -0
  107. package/typechain-types/index.ts +14 -0
  108. package/build/artifacts/contracts/interfaces/IPPtLpOracle.sol/IPPtLpOracle.dbg.json +0 -4
  109. package/build/artifacts/contracts/oracles/PendlePtLpOracle.sol/PendlePtLpOracle.dbg.json +0 -4
  110. package/build/artifacts/contracts/oracles/PendlePtLpOracle.sol/PendlePtLpOracle.json +0 -367
  111. package/build/artifacts/contracts/oracles/PendlePtOracleLib.sol/PendlePtOracleLib.dbg.json +0 -4
  112. package/build/artifacts/contracts/oracles/samples/BoringPtUsdChainlinkOracle.sol/BoringPtUsdChainlinkOracle.dbg.json +0 -4
  113. package/build/artifacts/contracts/oracles/samples/BoringPtUsdChainlinkOracle.sol/BoringPtUsdChainlinkOracle.json +0 -157
  114. /package/deployments/1-markets/{EZETH-JUNE2024.json → EZETH-APR2024.json} +0 -0
  115. /package/deployments/42161-markets/{RSETH-MAY2024.json → RSETH-JUNE2024.json} +0 -0
  116. /package/deployments/42161-markets/{WEETH-MAY2024.json → WEETH-JUNE2024.json} +0 -0
@@ -79,16 +79,18 @@ contract ActionMiscV3 is IPActionMiscV3, ActionBase {
79
79
  address[] calldata yts,
80
80
  address[] calldata markets
81
81
  ) external {
82
- for (uint256 i = 0; i < sys.length; ++i) {
83
- IStandardizedYield(sys[i]).claimRewards(user);
84
- }
85
-
86
- for (uint256 i = 0; i < yts.length; ++i) {
87
- IPYieldToken(yts[i]).redeemDueInterestAndRewards(user, true, true);
88
- }
89
-
90
- for (uint256 i = 0; i < markets.length; ++i) {
91
- IPMarket(markets[i]).redeemRewards(user);
82
+ unchecked {
83
+ for (uint256 i = 0; i < sys.length; ++i) {
84
+ IStandardizedYield(sys[i]).claimRewards(user);
85
+ }
86
+
87
+ for (uint256 i = 0; i < yts.length; ++i) {
88
+ IPYieldToken(yts[i]).redeemDueInterestAndRewards(user, true, true);
89
+ }
90
+
91
+ for (uint256 i = 0; i < markets.length; ++i) {
92
+ IPMarket(markets[i]).redeemRewards(user);
93
+ }
92
94
  }
93
95
  }
94
96
 
@@ -116,222 +118,40 @@ contract ActionMiscV3 is IPActionMiscV3, ActionBase {
116
118
  netTokenOut = IStandardizedYield(SY).redeem(receiver, netSyInterm, tokenRedeemSy, minTokenOut, true);
117
119
  }
118
120
 
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,
140
- 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;
159
- }
160
-
161
- function exitMultiplePreExpiry(
162
- address receiver,
163
- address market,
164
- uint256 netPtIn,
165
- uint256 netYtIn,
166
- uint256 netLpIn,
167
- TokenOutput calldata output,
168
- 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
- );
211
- }
212
-
213
- function exitMultiplePreExpiryInner(
214
- address receiver,
215
- address market,
216
- uint256 netPtIn,
217
- uint256 netYtIn,
218
- uint256 netLpIn,
219
- TokenOutput calldata output,
220
- 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);
261
- }
262
-
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(
266
- address receiver,
267
- address market,
268
- uint256 netPtIn,
269
- uint256 netLpIn,
270
- 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;
291
-
292
- if (netLpIn > 0) {
293
- _transferFrom(IERC20(market), msg.sender, market, netLpIn);
294
- (netSyFromRemove, netPtFromRemove) = IPMarket(market).burn(address(SY), address(YT), netLpIn);
295
- }
296
-
297
- if (netPtIn > 0) {
298
- _transferFrom(PT, msg.sender, address(YT), netPtIn);
299
- }
300
-
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
- );
319
- }
320
-
321
121
  // ----------------- MISC FUNCTIONS -----------------
322
122
 
323
123
  function boostMarkets(address[] memory markets) external {
324
- for (uint256 i = 0; i < markets.length; i++) {
124
+ for (uint256 i = 0; i < markets.length; ) {
325
125
  IPMarket(markets[i]).transferFrom(msg.sender, markets[i], 0);
126
+ unchecked {
127
+ i++;
128
+ }
326
129
  }
327
130
  }
328
131
 
329
132
  function multicall(Call3[] calldata calls) external payable returns (Result[] memory res) {
330
133
  uint256 length = calls.length;
331
134
  res = new Result[](length);
332
- for (uint256 i = 0; i < length; i++) {
333
- (bool success, bytes memory result) = _delegateToSelf(calls[i].callData, calls[i].allowFailure);
334
- res[i] = Result(success, result);
135
+ Call3 calldata call;
136
+ for (uint256 i = 0; i < length; ) {
137
+ call = calls[i];
138
+
139
+ // delegatecall to itself, it turns allowing invoking functions from other actions
140
+ (bool success, bytes memory result) = address(this).delegatecall(call.callData);
141
+
142
+ if (!success && !call.allowFailure) {
143
+ assembly {
144
+ // We use Yul's revert() to bubble up errors from the target contract.
145
+ revert(add(32, result), mload(result))
146
+ }
147
+ }
148
+
149
+ res[i].success = success;
150
+ res[i].returnData = result;
151
+
152
+ unchecked {
153
+ ++i;
154
+ }
335
155
  }
336
156
  }
337
157
 
@@ -52,6 +52,51 @@ contract ActionSwapYTV3 is CallbackHelper, IPActionSwapYTV3, ActionBase {
52
52
  emit SwapYtAndSy(msg.sender, market, receiver, netYtOut.Int(), exactSyIn.neg());
53
53
  }
54
54
 
55
+ function _entry_swapExactSyForYt(IPYieldToken YT, LimitOrderData calldata limit) internal view returns (address) {
56
+ return !_isEmptyLimit(limit) ? address(this) : address(YT);
57
+ }
58
+
59
+ function _swapExactSyForYt(
60
+ address receiver,
61
+ address market,
62
+ IStandardizedYield SY,
63
+ IPYieldToken YT,
64
+ uint256 exactSyIn,
65
+ uint256 minYtOut,
66
+ ApproxParams calldata guessYtOut,
67
+ LimitOrderData calldata limit
68
+ ) internal returns (uint256 netYtOut, uint256 netSyFee) {
69
+ uint256 netSyLeft = exactSyIn;
70
+ bool doMarketOrder = true;
71
+
72
+ if (!_isEmptyLimit(limit)) {
73
+ (netSyLeft, netYtOut, netSyFee, doMarketOrder) = _fillLimit(receiver, SY, netSyLeft, limit);
74
+ if (doMarketOrder) {
75
+ _transferOut(address(SY), address(YT), netSyLeft);
76
+ }
77
+ }
78
+
79
+ if (doMarketOrder) {
80
+ (uint256 netYtOutMarket, ) = _readMarket(market).approxSwapExactSyForYt(
81
+ YT.newIndex(),
82
+ netSyLeft,
83
+ block.timestamp,
84
+ guessYtOut
85
+ );
86
+
87
+ (, uint256 netSyFeeMarket) = IPMarket(market).swapExactPtForSy(
88
+ address(YT),
89
+ netYtOutMarket, // exactPtIn = netYtOut
90
+ _encodeSwapExactSyForYt(receiver, YT)
91
+ );
92
+
93
+ netYtOut += netYtOutMarket;
94
+ netSyFee += netSyFeeMarket;
95
+ }
96
+
97
+ if (netYtOut < minYtOut) revert("Slippage: INSUFFICIENT_YT_OUT");
98
+ }
99
+
55
100
  // ------------------ SWAP TOKEN FOR TOKEN ------------------
56
101
 
57
102
  function swapExactYtForToken(
@@ -93,6 +138,46 @@ contract ActionSwapYTV3 is CallbackHelper, IPActionSwapYTV3, ActionBase {
93
138
  emit SwapYtAndSy(msg.sender, market, receiver, exactYtIn.neg(), netSyOut.Int());
94
139
  }
95
140
 
141
+ function _entry_swapExactYtForSy(IPYieldToken YT, LimitOrderData calldata limit) internal view returns (address) {
142
+ return !_isEmptyLimit(limit) ? address(this) : address(YT);
143
+ }
144
+
145
+ function _swapExactYtForSy(
146
+ address receiver,
147
+ address market,
148
+ IStandardizedYield SY,
149
+ IPYieldToken YT,
150
+ uint256 exactYtIn,
151
+ uint256 minSyOut,
152
+ LimitOrderData calldata limit
153
+ ) internal returns (uint256 netSyOut, uint256 netSyFee) {
154
+ uint256 netYtLeft = exactYtIn;
155
+ bool doMarketOrder = true;
156
+
157
+ if (!_isEmptyLimit(limit)) {
158
+ (netYtLeft, netSyOut, netSyFee, doMarketOrder) = _fillLimit(receiver, YT, netYtLeft, limit);
159
+ if (doMarketOrder) {
160
+ _transferOut(address(YT), address(YT), netYtLeft);
161
+ }
162
+ }
163
+
164
+ if (doMarketOrder) {
165
+ uint256 preSyBalance = SY.balanceOf(receiver);
166
+
167
+ (, uint256 netSyFeeMarket) = IPMarket(market).swapSyForExactPt(
168
+ address(YT),
169
+ netYtLeft, // exactPtOut = netYtLeft
170
+ _encodeSwapYtForSy(receiver, YT)
171
+ );
172
+
173
+ // avoid stack issue
174
+ netSyFee += netSyFeeMarket;
175
+ netSyOut += SY.balanceOf(receiver) - preSyBalance;
176
+ }
177
+
178
+ if (netSyOut < minSyOut) revert("Slippage: INSUFFICIENT_SY_OUT");
179
+ }
180
+
96
181
  // ------------------ SWAP PT FOR YT ------------------
97
182
 
98
183
  function swapExactPtForYt(
@@ -10,10 +10,8 @@ import "../../router/base/MarketApproxLib.sol";
10
10
 
11
11
  import "../../core/libraries/Errors.sol";
12
12
  import "../swap-aggregator/IPSwapAggregator.sol";
13
- import "./CallbackHelper.sol";
14
13
 
15
- abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
16
- using MarketApproxPtInLib for MarketState;
14
+ abstract contract ActionBase is TokenHelper, IPLimitOrderType {
17
15
  using MarketApproxPtOutLib for MarketState;
18
16
  using PMath for uint256;
19
17
  using PYIndexLib for IPYieldToken;
@@ -238,93 +236,6 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
238
236
  if (netPtOut < minPtOut) revert("Slippage: INSUFFICIENT_PT_OUT");
239
237
  }
240
238
 
241
- // ----------------- YT SWAP -----------------
242
-
243
- function _entry_swapExactYtForSy(IPYieldToken YT, LimitOrderData calldata limit) internal view returns (address) {
244
- return !_isEmptyLimit(limit) ? address(this) : address(YT);
245
- }
246
-
247
- function _swapExactYtForSy(
248
- address receiver,
249
- address market,
250
- IStandardizedYield SY,
251
- IPYieldToken YT,
252
- uint256 exactYtIn,
253
- uint256 minSyOut,
254
- LimitOrderData calldata limit
255
- ) internal returns (uint256 netSyOut, uint256 netSyFee) {
256
- uint256 netYtLeft = exactYtIn;
257
- bool doMarketOrder = true;
258
-
259
- if (!_isEmptyLimit(limit)) {
260
- (netYtLeft, netSyOut, netSyFee, doMarketOrder) = _fillLimit(receiver, YT, netYtLeft, limit);
261
- if (doMarketOrder) {
262
- _transferOut(address(YT), address(YT), netYtLeft);
263
- }
264
- }
265
-
266
- if (doMarketOrder) {
267
- uint256 preSyBalance = SY.balanceOf(receiver);
268
-
269
- (, uint256 netSyFeeMarket) = IPMarket(market).swapSyForExactPt(
270
- address(YT),
271
- netYtLeft, // exactPtOut = netYtLeft
272
- _encodeSwapYtForSy(receiver, YT)
273
- );
274
-
275
- // avoid stack issue
276
- netSyFee += netSyFeeMarket;
277
- netSyOut += SY.balanceOf(receiver) - preSyBalance;
278
- }
279
-
280
- if (netSyOut < minSyOut) revert("Slippage: INSUFFICIENT_SY_OUT");
281
- }
282
-
283
- function _entry_swapExactSyForYt(IPYieldToken YT, LimitOrderData calldata limit) internal view returns (address) {
284
- return !_isEmptyLimit(limit) ? address(this) : address(YT);
285
- }
286
-
287
- function _swapExactSyForYt(
288
- address receiver,
289
- address market,
290
- IStandardizedYield SY,
291
- IPYieldToken YT,
292
- uint256 exactSyIn,
293
- uint256 minYtOut,
294
- ApproxParams calldata guessYtOut,
295
- LimitOrderData calldata limit
296
- ) internal returns (uint256 netYtOut, uint256 netSyFee) {
297
- uint256 netSyLeft = exactSyIn;
298
- bool doMarketOrder = true;
299
-
300
- if (!_isEmptyLimit(limit)) {
301
- (netSyLeft, netYtOut, netSyFee, doMarketOrder) = _fillLimit(receiver, SY, netSyLeft, limit);
302
- if (doMarketOrder) {
303
- _transferOut(address(SY), address(YT), netSyLeft);
304
- }
305
- }
306
-
307
- if (doMarketOrder) {
308
- (uint256 netYtOutMarket, ) = _readMarket(market).approxSwapExactSyForYt(
309
- YT.newIndex(),
310
- netSyLeft,
311
- block.timestamp,
312
- guessYtOut
313
- );
314
-
315
- (, uint256 netSyFeeMarket) = IPMarket(market).swapExactPtForSy(
316
- address(YT),
317
- netYtOutMarket, // exactPtIn = netYtOut
318
- _encodeSwapExactSyForYt(receiver, YT)
319
- );
320
-
321
- netYtOut += netYtOutMarket;
322
- netSyFee += netSyFeeMarket;
323
- }
324
-
325
- if (netYtOut < minYtOut) revert("Slippage: INSUFFICIENT_YT_OUT");
326
- }
327
-
328
239
  // ----------------- LIMIT ORDERS -----------------
329
240
  function _fillLimit(
330
241
  address receiver,
@@ -373,20 +284,4 @@ abstract contract ActionBase is TokenHelper, CallbackHelper, IPLimitOrderType {
373
284
  function _isEmptyLimit(LimitOrderData calldata a) internal pure returns (bool) {
374
285
  return a.normalFills.length == 0 && a.flashFills.length == 0;
375
286
  }
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
287
  }
@@ -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,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
+ }
@@ -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-oracle-beta",
6
6
  "homepage": "https://pendle.finance",
7
7
  "keywords": [
8
8
  "pendle",