@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.
- package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol/PendleERC20WithSupplyCapSY.dbg.json +1 -1
- package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol/PendleERC20WithSupplyCapSY.json +2 -2
- package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol/PendleSwellRswETHStakingSY.dbg.json +4 -0
- package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol/PendleSwellRswETHStakingSY.json +1049 -0
- package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol/PendleSwellStakingERC20SY.dbg.json +4 -0
- package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol/PendleSwellStakingERC20SY.json +1039 -0
- package/build/artifacts/contracts/interfaces/IPActionMiscV3.sol/IPActionMiscV3.dbg.json +1 -1
- package/build/artifacts/contracts/interfaces/IPActionMiscV3.sol/IPActionMiscV3.json +805 -80
- package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.dbg.json +1 -1
- package/build/artifacts/contracts/interfaces/IPAllActionV3.sol/IPAllActionV3.json +958 -233
- package/build/artifacts/contracts/interfaces/IPGovernanceProxy.sol/IPGovernanceProxy.dbg.json +4 -0
- package/build/artifacts/contracts/interfaces/IPGovernanceProxy.sol/IPGovernanceProxy.json +60 -0
- package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.dbg.json +4 -0
- package/build/artifacts/contracts/interfaces/IPPausingInterface.sol/IPPausingInterface.json +25 -0
- package/build/artifacts/contracts/interfaces/IPPtLpOracle.sol/IPPtLpOracle.dbg.json +1 -1
- package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.dbg.json +4 -0
- package/build/artifacts/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol/ISwellSimpleStakingERC20.json +207 -0
- package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.dbg.json +4 -0
- package/build/artifacts/contracts/offchain-helpers/PendleGovernanceProxy.sol/PendleGovernanceProxy.json +401 -0
- package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.dbg.json +1 -1
- package/build/artifacts/contracts/offchain-helpers/PendlePoolDeployHelper.sol/PendlePoolDeployHelper.json +2 -2
- package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.dbg.json +1 -1
- package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.json +2 -2
- package/build/artifacts/contracts/oracles/PendleLpOracleLib.sol/PendleLpOracleLib.dbg.json +1 -1
- package/build/artifacts/contracts/oracles/PendlePtLpOracle.sol/PendlePtLpOracle.dbg.json +1 -1
- package/build/artifacts/contracts/oracles/PendlePtOracleLib.sol/PendlePtOracleLib.dbg.json +1 -1
- package/build/artifacts/contracts/oracles/samples/BoringLpGlpOracle.sol/BoringLpGlpOracle.dbg.json +1 -1
- package/build/artifacts/contracts/oracles/samples/BoringPtUsdChainlinkOracle.sol/BoringPtUsdChainlinkOracle.dbg.json +1 -1
- package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.dbg.json +1 -1
- package/build/artifacts/contracts/router/ActionAddRemoveLiqV3.sol/ActionAddRemoveLiqV3.json +2 -2
- package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.dbg.json +1 -1
- package/build/artifacts/contracts/router/ActionMiscV3.sol/ActionMiscV3.json +707 -140
- package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.dbg.json +1 -1
- package/build/artifacts/contracts/router/ActionSwapPTV3.sol/ActionSwapPTV3.json +2 -2
- package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.dbg.json +1 -1
- package/build/artifacts/contracts/router/ActionSwapYTV3.sol/ActionSwapYTV3.json +2 -2
- package/build/artifacts/contracts/router/Reflector.sol/Reflector.dbg.json +4 -0
- package/build/artifacts/contracts/router/Reflector.sol/Reflector.json +39 -0
- package/build/artifacts/contracts/router/base/ActionBase.sol/ActionBase.dbg.json +1 -1
- package/contracts/core/StandardizedYield/implementations/PendleERC20WithSupplyCapSY.sol +6 -1
- package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellRswETHStakingSY.sol +56 -0
- package/contracts/core/StandardizedYield/implementations/Swell/PendleSwellStakingERC20SY.sol +111 -0
- package/contracts/interfaces/IPActionMiscV3.sol +85 -25
- package/contracts/interfaces/IPGovernanceProxy.sol +14 -0
- package/contracts/interfaces/IPPausingInterface.sol +8 -0
- package/contracts/interfaces/Swell/ISwellSimpleStakingERC20.sol +66 -0
- package/contracts/offchain-helpers/PendleGovernanceProxy.sol +84 -0
- package/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol +12 -4
- package/contracts/router/ActionMiscV3.sol +140 -167
- package/contracts/router/Reflector.sol +61 -0
- package/contracts/router/base/ActionBase.sol +0 -16
- package/deployments/1-markets/EZETH-MAINNET-SEP2024.json +11 -0
- package/deployments/1-markets/PUFETH-MAINNET-SEP2024.json +11 -0
- package/deployments/1-markets/RSETH-MAINNET-SEP2024.json +11 -0
- package/deployments/1-markets/RSWETH-SWELL-STAKING-MAINNET-JUL2024.json +11 -0
- package/deployments/1-markets/SUSDE-MAINNET-SEP2024.json +13 -0
- package/deployments/1-markets/UNIETH-MAINNET-SEP2024.json +13 -0
- package/deployments/1-markets/WEETH-MAINNET-SEP2024.json +11 -0
- package/deployments/42161-core.json +1 -1
- package/deployments/42161-markets/EZETH-ARB-SEP2024.json +11 -0
- package/deployments/42161-markets/RSETH-ARBITRUM-SEP2024.json +11 -0
- package/deployments/42161-markets/SILO-PTEETH-ARBITRUM-JUNE2024.json +11 -0
- package/deployments/42161-markets/SILO-PTEZETH-ARBITRUM-JUNE2024.json +11 -0
- package/deployments/42161-markets/WEETH-ARB-SEP2024.json +11 -0
- package/deployments/56-markets/WEETH-BSC-SEP2024.json +11 -0
- package/package.json +2 -2
- package/typechain-types/ActionMiscV3.ts +358 -120
- package/typechain-types/BoringPYUsdChainlinkAssetOracle.ts +244 -0
- package/typechain-types/BoringPYUsdChainlinkSYOracle.ts +243 -0
- package/typechain-types/IPActionMiscV3.ts +408 -40
- package/typechain-types/IPAllActionV3.ts +408 -40
- package/typechain-types/IPGovernanceProxy.ts +142 -0
- package/typechain-types/IPPYLpOracle.ts +379 -0
- package/typechain-types/IPPausingInterface.ts +112 -0
- package/typechain-types/IPossibleSupplyCapInterface.ts +142 -0
- package/typechain-types/PendleGovernanceProxy.ts +603 -0
- package/typechain-types/PendlePYLpOracle.ts +612 -0
- package/typechain-types/Reflector.ts +98 -0
- package/typechain-types/SupplyCapReader.ts +105 -0
- package/typechain-types/factories/ActionAddRemoveLiqV3__factory.ts +1 -1
- package/typechain-types/factories/ActionMarketAuxStatic__factory.ts +1 -1
- package/typechain-types/factories/ActionMiscV3__factory.ts +705 -138
- package/typechain-types/factories/ActionSwapPTV3__factory.ts +1 -1
- package/typechain-types/factories/ActionSwapYTV3__factory.ts +1 -1
- package/typechain-types/factories/BoringPYUsdChainlinkAssetOracle__factory.ts +269 -0
- package/typechain-types/factories/BoringPYUsdChainlinkSYOracle__factory.ts +267 -0
- package/typechain-types/factories/IPActionMiscV3__factory.ts +805 -80
- package/typechain-types/factories/IPAllActionV3__factory.ts +958 -233
- package/typechain-types/factories/IPGovernanceProxy__factory.ts +75 -0
- package/typechain-types/factories/IPPYLpOracle__factory.ts +214 -0
- package/typechain-types/factories/IPPausingInterface__factory.ts +40 -0
- package/typechain-types/factories/IPossibleSupplyCapInterface__factory.ts +82 -0
- package/typechain-types/factories/PendleERC20WithSupplyCapSY__factory.ts +1 -1
- package/typechain-types/factories/PendleGovernanceProxy__factory.ts +458 -0
- package/typechain-types/factories/PendlePYLpOracle__factory.ts +487 -0
- package/typechain-types/factories/PendlePoolDeployHelper__factory.ts +1 -1
- package/typechain-types/factories/PendleSwellRswETHStakingSY__factory.ts +1 -1
- package/typechain-types/factories/Reflector__factory.ts +89 -0
- package/typechain-types/factories/SupplyCapReader__factory.ts +88 -0
- package/typechain-types/hardhat.d.ts +54 -0
- package/typechain-types/index.ts +12 -0
- /package/deployments/1-markets/{EZETH-JUNE2024.json → EZETH-APR2024.json} +0 -0
- /package/deployments/42161-markets/{RSETH-MAY2024.json → RSETH-JUNE2024.json} +0 -0
- /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
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
142
|
-
uint256
|
|
143
|
-
uint256
|
|
144
|
-
uint256
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
|
139
|
+
function exitPreExpToSy(
|
|
162
140
|
address receiver,
|
|
163
141
|
address market,
|
|
164
142
|
uint256 netPtIn,
|
|
165
143
|
uint256 netYtIn,
|
|
166
144
|
uint256 netLpIn,
|
|
167
|
-
|
|
145
|
+
uint256 minSyOut,
|
|
168
146
|
LimitOrderData calldata limit
|
|
169
|
-
)
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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
|
|
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
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
(
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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(
|
|
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(
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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": "
|
|
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-
|
|
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
|
+
}
|