@pendle/core-v2 4.0.6 → 4.1.0

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/AaveV3/PendleAaveV3SY.sol/PendleAaveV3SY.dbg.json +1 -1
  2. package/build/artifacts/contracts/core/StandardizedYield/implementations/AaveV3/PendleAaveV3SY.sol/PendleAaveV3SY.json +2 -2
  3. package/build/artifacts/contracts/core/StandardizedYield/implementations/EtherFi/PendleWEEthSY.sol/PendleWEEthSY.dbg.json +1 -1
  4. package/build/artifacts/contracts/core/StandardizedYield/implementations/EtherFi/PendleWEEthSY.sol/PendleWEEthSY.json +2 -2
  5. package/build/artifacts/contracts/core/StandardizedYield/implementations/KelpDAO/PendleRsETHSY.sol/PendleRsETHSY.dbg.json +1 -1
  6. package/build/artifacts/contracts/core/StandardizedYield/implementations/KelpDAO/PendleRsETHSY.sol/PendleRsETHSY.json +20 -2
  7. package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleL2LRTSY.sol/PendleL2LRTSY.dbg.json +4 -0
  8. package/build/artifacts/contracts/core/StandardizedYield/implementations/PendleL2LRTSY.sol/PendleL2LRTSY.json +1054 -0
  9. package/build/artifacts/contracts/core/StandardizedYield/implementations/Renzo/PendleEzETHSY.sol/PendleEzETHSY.dbg.json +4 -0
  10. package/build/artifacts/contracts/core/StandardizedYield/implementations/Renzo/PendleEzETHSY.sol/PendleEzETHSY.json +1141 -0
  11. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleRswETHSY.sol/PendleRswETHSY.dbg.json +4 -0
  12. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleRswETHSY.sol/PendleRswETHSY.json +1044 -0
  13. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwETH.sol/SwETHSY.dbg.json +1 -1
  14. package/build/artifacts/contracts/core/StandardizedYield/implementations/Swell/PendleSwETH.sol/SwETHSY.json +2 -2
  15. package/build/artifacts/contracts/interfaces/IPActionMarketCoreStatic.sol/IPActionMarketCoreStatic.dbg.json +1 -1
  16. package/build/artifacts/contracts/interfaces/IPActionMarketCoreStatic.sol/IPActionMarketCoreStatic.json +0 -45
  17. package/build/artifacts/contracts/interfaces/IPActionMintRedeemStatic.sol/IPActionMintRedeemStatic.dbg.json +1 -1
  18. package/build/artifacts/contracts/interfaces/IPActionMintRedeemStatic.sol/IPActionMintRedeemStatic.json +0 -69
  19. package/build/artifacts/contracts/interfaces/IPActionStorageStatic.sol/IPActionStorageStatic.dbg.json +1 -1
  20. package/build/artifacts/contracts/interfaces/IPActionStorageStatic.sol/IPActionStorageStatic.json +0 -26
  21. package/build/artifacts/contracts/interfaces/IPRouterStatic.sol/IPRouterStatic.dbg.json +1 -1
  22. package/build/artifacts/contracts/interfaces/IPRouterStatic.sol/IPRouterStatic.json +0 -140
  23. package/build/artifacts/contracts/interfaces/Renzo/IRenzoOracle.sol/IRenzoOracle.dbg.json +4 -0
  24. package/build/artifacts/contracts/interfaces/Renzo/IRenzoOracle.sol/IRenzoOracle.json +64 -0
  25. package/build/artifacts/contracts/interfaces/Renzo/IRenzoRestakeManager.sol/IRenzoRestakeManager.dbg.json +4 -0
  26. package/build/artifacts/contracts/interfaces/Renzo/IRenzoRestakeManager.sol/IRenzoRestakeManager.json +102 -0
  27. package/build/artifacts/contracts/interfaces/Swell/IRswETH.sol/IRswETH.dbg.json +4 -0
  28. package/build/artifacts/contracts/interfaces/Swell/IRswETH.sol/IRswETH.json +44 -0
  29. package/build/artifacts/contracts/interfaces/Swell/ISwETH.sol/ISwETH.dbg.json +4 -0
  30. package/build/artifacts/contracts/interfaces/{ISwETH.sol → Swell/ISwETH.sol}/ISwETH.json +8 -8
  31. package/build/artifacts/contracts/offchain-helpers/router-static/PendleRouterStatic.sol/PendleRouterStatic.dbg.json +4 -0
  32. package/build/artifacts/contracts/offchain-helpers/router-static/PendleRouterStatic.sol/PendleRouterStatic.json +30 -0
  33. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionInfoStatic.sol/ActionInfoStatic.dbg.json +4 -0
  34. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionInfoStatic.sol/ActionInfoStatic.json +307 -0
  35. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.dbg.json +4 -0
  36. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol/ActionMarketAuxStatic.json +409 -0
  37. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketCoreStatic.sol/ActionMarketCoreStatic.dbg.json +4 -0
  38. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMarketCoreStatic.sol/ActionMarketCoreStatic.json +1352 -0
  39. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMintRedeemStatic.sol/ActionMintRedeemStatic.dbg.json +4 -0
  40. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionMintRedeemStatic.sol/ActionMintRedeemStatic.json +247 -0
  41. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionStorageStatic.sol/ActionStorageStatic.dbg.json +4 -0
  42. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionStorageStatic.sol/ActionStorageStatic.json +202 -0
  43. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionVePendleStatic.sol/ActionVePendleStatic.dbg.json +4 -0
  44. package/build/artifacts/contracts/offchain-helpers/router-static/base/ActionVePendleStatic.sol/ActionVePendleStatic.json +93 -0
  45. package/build/artifacts/contracts/offchain-helpers/router-static/base/StorageLayout.sol/StorageLayout.dbg.json +4 -0
  46. package/build/artifacts/contracts/offchain-helpers/router-static/base/StorageLayout.sol/StorageLayout.json +10 -0
  47. package/build/artifacts/contracts/oracles/PendleRedStoneRateOracle.sol/PendleRedStoneRateOracle.dbg.json +4 -0
  48. package/build/artifacts/contracts/oracles/PendleRedStoneRateOracle.sol/PendleRedStoneRateOracle.json +66 -0
  49. package/contracts/core/StandardizedYield/implementations/AaveV3/PendleAaveV3SY.sol +1 -1
  50. package/contracts/core/StandardizedYield/implementations/EtherFi/PendleWEEthSY.sol +1 -1
  51. package/contracts/core/StandardizedYield/implementations/KelpDAO/PendleRsETHSY.sol +18 -9
  52. package/contracts/core/StandardizedYield/implementations/PendleL2LRTSY.sol +93 -0
  53. package/contracts/core/StandardizedYield/implementations/Renzo/PendleEzETHSY.sol +139 -0
  54. package/contracts/core/StandardizedYield/implementations/Swell/PendleRswETHSY.sol +101 -0
  55. package/contracts/core/StandardizedYield/implementations/Swell/PendleSwETH.sol +1 -1
  56. package/contracts/interfaces/IPActionMarketCoreStatic.sol +8 -17
  57. package/contracts/interfaces/IPActionMintRedeemStatic.sol +4 -16
  58. package/contracts/interfaces/IPActionStorageStatic.sol +0 -4
  59. package/contracts/interfaces/Renzo/IRenzoOracle.sol +8 -0
  60. package/contracts/interfaces/Renzo/IRenzoRestakeManager.sol +14 -0
  61. package/contracts/interfaces/Swell/IRswETH.sol +10 -0
  62. package/contracts/interfaces/{ISwETH.sol → Swell/ISwETH.sol} +2 -2
  63. package/contracts/offchain-helpers/router-static/PendleRouterStatic.sol +19 -0
  64. package/contracts/offchain-helpers/router-static/base/ActionInfoStatic.sol +109 -0
  65. package/contracts/offchain-helpers/router-static/base/ActionMarketAuxStatic.sol +182 -0
  66. package/contracts/offchain-helpers/router-static/base/ActionMarketCoreStatic.sol +672 -0
  67. package/contracts/offchain-helpers/router-static/base/ActionMintRedeemStatic.sol +116 -0
  68. package/contracts/offchain-helpers/router-static/base/ActionStorageStatic.sol +64 -0
  69. package/contracts/offchain-helpers/router-static/base/ActionVePendleStatic.sol +55 -0
  70. package/contracts/offchain-helpers/router-static/base/StorageLayout.sol +20 -0
  71. package/contracts/oracles/PendleRedStoneRateOracle.sol +23 -0
  72. package/deployments/1-markets/EZETH-JUNE2024.json +11 -0
  73. package/deployments/1-markets/RSETH-KELP-JUNE2024.json +11 -0
  74. package/deployments/42161-markets/RSETH-APR2024-ARBITRUM.json +11 -0
  75. package/deployments/42161-markets/WEETH-APR2024.json +11 -0
  76. package/deployments/merkle-distribution/2024-01-25.json +9615 -0
  77. package/package.json +1 -1
  78. package/typechain-types/IPActionMarketCoreStatic.ts +18 -63
  79. package/typechain-types/IPActionMintRedeemStatic.ts +10 -102
  80. package/typechain-types/IPActionStorageStatic.ts +0 -55
  81. package/typechain-types/IPRouterStatic.ts +28 -220
  82. package/typechain-types/IRenzoOracle.ts +152 -0
  83. package/typechain-types/IRenzoRestakeManager.ts +219 -0
  84. package/typechain-types/IRswETH.ts +138 -0
  85. package/typechain-types/ISwETH.ts +24 -9
  86. package/typechain-types/PendleEzETHSY.ts +1471 -0
  87. package/typechain-types/PendleL2LRTSY.ts +1323 -0
  88. package/typechain-types/PendleRedStoneRateOracle.ts +113 -0
  89. package/typechain-types/PendleRsETHSY.ts +21 -0
  90. package/typechain-types/PendleRswETHSY.ts +1294 -0
  91. package/typechain-types/factories/ActionInfoStatic__factory.ts +1 -1
  92. package/typechain-types/factories/ActionMarketAuxStatic__factory.ts +1 -1
  93. package/typechain-types/factories/ActionMarketCoreStatic__factory.ts +1 -1
  94. package/typechain-types/factories/ActionMintRedeemStatic__factory.ts +1 -1
  95. package/typechain-types/factories/ActionStorageStatic__factory.ts +1 -1
  96. package/typechain-types/factories/ActionVePendleStatic__factory.ts +1 -1
  97. package/typechain-types/factories/IPActionMarketCoreStatic__factory.ts +0 -45
  98. package/typechain-types/factories/IPActionMintRedeemStatic__factory.ts +0 -69
  99. package/typechain-types/factories/IPActionStorageStatic__factory.ts +0 -26
  100. package/typechain-types/factories/IPRouterStatic__factory.ts +0 -140
  101. package/typechain-types/factories/IRenzoOracle__factory.ts +76 -0
  102. package/typechain-types/factories/IRenzoRestakeManager__factory.ts +121 -0
  103. package/typechain-types/factories/IRswETH__factory.ts +56 -0
  104. package/typechain-types/factories/ISwETH__factory.ts +7 -7
  105. package/typechain-types/factories/PendleAaveV3SY__factory.ts +1 -1
  106. package/typechain-types/factories/PendleEzETHSY__factory.ts +1218 -0
  107. package/typechain-types/factories/PendleL2LRTSY__factory.ts +1139 -0
  108. package/typechain-types/factories/PendleRedStoneRateOracle__factory.ts +142 -0
  109. package/typechain-types/factories/PendleRouterStatic__factory.ts +1 -1
  110. package/typechain-types/factories/PendleRsETHSY__factory.ts +23 -1
  111. package/typechain-types/factories/PendleRswETHSY__factory.ts +1117 -0
  112. package/typechain-types/factories/PendleWEEthSY__factory.ts +1 -1
  113. package/typechain-types/factories/SwETHSY__factory.ts +1 -1
  114. package/typechain-types/hardhat.d.ts +135 -0
  115. package/typechain-types/index.ts +28 -0
  116. package/build/artifacts/contracts/interfaces/ISwETH.sol/ISwETH.dbg.json +0 -4
@@ -0,0 +1,672 @@
1
+ // SPDX-License-Identifier: GPL-3.0-or-later
2
+ pragma solidity ^0.8.17;
3
+
4
+ import "../../../interfaces/IPMarket.sol";
5
+ import "../../../interfaces/IPRouterStatic.sol";
6
+ import "./StorageLayout.sol";
7
+
8
+ contract ActionMarketCoreStatic is StorageLayout, IPActionMarketCoreStatic {
9
+ using PMath for uint256;
10
+ using PMath for int256;
11
+
12
+ using LogExpMath for int256;
13
+ using PYIndexLib for PYIndex;
14
+ using PYIndexLib for IPYieldToken;
15
+ using MarketApproxPtInLib for MarketState;
16
+ using MarketApproxPtOutLib for MarketState;
17
+ using MarketMathCore for MarketState;
18
+
19
+ // ============ ADD REMOVE LIQUIDITY ============
20
+
21
+ function addLiquidityDualSyAndPtStatic(
22
+ address market,
23
+ uint256 netSyDesired,
24
+ uint256 netPtDesired
25
+ ) public view returns (uint256 netLpOut, uint256 netSyUsed, uint256 netPtUsed) {
26
+ MarketState memory state = _readState(market);
27
+ (, netLpOut, netSyUsed, netPtUsed) = state.addLiquidity(netSyDesired, netPtDesired, block.timestamp);
28
+ }
29
+
30
+ function addLiquidityDualTokenAndPtStatic(
31
+ address market,
32
+ address tokenIn,
33
+ uint256 netTokenDesired,
34
+ uint256 netPtDesired
35
+ )
36
+ public
37
+ view
38
+ returns (
39
+ uint256 netLpOut,
40
+ uint256 netTokenUsed,
41
+ uint256 netPtUsed,
42
+ // extra-info
43
+ uint256 netSyUsed,
44
+ uint256 netSyDesired
45
+ )
46
+ {
47
+ netSyDesired = _mintSyFromTokenStatic(market, tokenIn, netTokenDesired);
48
+
49
+ (netLpOut, netSyUsed, netPtUsed) = addLiquidityDualSyAndPtStatic(market, netSyDesired, netPtDesired);
50
+
51
+ if (netSyUsed != netSyDesired) revert Errors.RouterNotAllSyUsed(netSyDesired, netSyUsed);
52
+
53
+ netTokenUsed = netTokenDesired;
54
+ }
55
+
56
+ /// @dev netPtToSwap is the parameter to approx
57
+ function addLiquiditySinglePtStatic(
58
+ address market,
59
+ uint256 netPtIn
60
+ )
61
+ public
62
+ view
63
+ returns (
64
+ uint256 netLpOut,
65
+ uint256 netPtToSwap,
66
+ uint256 netSyFee,
67
+ uint256 priceImpact,
68
+ uint256 exchangeRateAfter,
69
+ // extra-info
70
+ uint256 netSyFromSwap
71
+ )
72
+ {
73
+ MarketState memory state = _readState(market);
74
+
75
+ (netPtToSwap, , ) = state.approxSwapPtToAddLiquidity(
76
+ _pyIndex(market),
77
+ netPtIn,
78
+ 0,
79
+ block.timestamp,
80
+ defaultApproxParams
81
+ );
82
+
83
+ state = _readState(market); // re-read
84
+
85
+ (netSyFromSwap, netSyFee, ) = state.swapExactPtForSy(_pyIndex(market), netPtToSwap, block.timestamp);
86
+ (, netLpOut, , ) = state.addLiquidity(netSyFromSwap, netPtIn - netPtToSwap, block.timestamp);
87
+
88
+ priceImpact = _calcPriceImpactPt(market, netPtToSwap.neg());
89
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
90
+ }
91
+
92
+ /// @dev netPtFromSwap is the parameter to approx
93
+ function addLiquiditySingleSyStatic(
94
+ address market,
95
+ uint256 netSyIn
96
+ )
97
+ public
98
+ view
99
+ returns (
100
+ uint256 netLpOut,
101
+ uint256 netPtFromSwap,
102
+ uint256 netSyFee,
103
+ uint256 priceImpact,
104
+ uint256 exchangeRateAfter,
105
+ // extra-info
106
+ uint256 netSyToSwap
107
+ )
108
+ {
109
+ MarketState memory state = _readState(market);
110
+
111
+ (netPtFromSwap, , ) = state.approxSwapSyToAddLiquidity(
112
+ _pyIndex(market),
113
+ netSyIn,
114
+ 0,
115
+ block.timestamp,
116
+ defaultApproxParams
117
+ );
118
+
119
+ state = _readState(market); // re-read
120
+
121
+ (netSyToSwap, netSyFee, ) = state.swapSyForExactPt(_pyIndex(market), netPtFromSwap, block.timestamp);
122
+ (, netLpOut, , ) = state.addLiquidity(netSyIn - netSyToSwap, netPtFromSwap, block.timestamp);
123
+
124
+ priceImpact = _calcPriceImpactPt(market, netPtFromSwap.Int());
125
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
126
+ }
127
+
128
+ function addLiquiditySingleTokenStatic(
129
+ address market,
130
+ address tokenIn,
131
+ uint256 netTokenIn
132
+ )
133
+ public
134
+ view
135
+ returns (
136
+ uint256 netLpOut,
137
+ uint256 netPtFromSwap,
138
+ uint256 netSyFee,
139
+ uint256 priceImpact,
140
+ uint256 exchangeRateAfter,
141
+ // extra-info
142
+ uint256 netSyMinted,
143
+ uint256 netSyToSwap
144
+ )
145
+ {
146
+ netSyMinted = _mintSyFromTokenStatic(market, tokenIn, netTokenIn);
147
+ (netLpOut, netPtFromSwap, netSyFee, priceImpact, exchangeRateAfter, netSyToSwap) = addLiquiditySingleSyStatic(
148
+ market,
149
+ netSyMinted
150
+ );
151
+ }
152
+
153
+ function addLiquiditySingleTokenKeepYtStatic(
154
+ address market,
155
+ address tokenIn,
156
+ uint256 netTokenIn
157
+ )
158
+ public
159
+ view
160
+ returns (
161
+ uint256 netLpOut,
162
+ uint256 netYtOut,
163
+ // extra-info
164
+ uint256 netSyMinted,
165
+ uint256 netSyToPY
166
+ )
167
+ {
168
+ netSyMinted = _mintSyFromTokenStatic(market, tokenIn, netTokenIn);
169
+ (netLpOut, netYtOut, netSyToPY) = addLiquiditySingleSyKeepYtStatic(market, netSyMinted);
170
+ }
171
+
172
+ function addLiquiditySingleSyKeepYtStatic(
173
+ address market,
174
+ uint256 netSyIn
175
+ )
176
+ public
177
+ view
178
+ returns (
179
+ uint256 netLpOut,
180
+ uint256 netYtOut,
181
+ // extra-info
182
+ uint256 netSyToPY
183
+ )
184
+ {
185
+ MarketState memory state = _readState(market);
186
+ PYIndex index = _pyIndex(market);
187
+
188
+ netSyToPY = (netSyIn * state.totalPt.Uint()) / (state.totalPt.Uint() + index.syToAsset(state.totalSy.Uint()));
189
+
190
+ netYtOut = index.syToAsset(netSyToPY);
191
+
192
+ (, netLpOut, , ) = state.addLiquidity(netSyIn - netSyToPY, netYtOut, block.timestamp);
193
+ }
194
+
195
+ function removeLiquidityDualSyAndPtStatic(
196
+ address market,
197
+ uint256 netLpToRemove
198
+ ) public view returns (uint256 netSyOut, uint256 netPtOut) {
199
+ MarketState memory state = _readState(market);
200
+ (netSyOut, netPtOut) = state.removeLiquidity(netLpToRemove);
201
+ }
202
+
203
+ function removeLiquidityDualTokenAndPtStatic(
204
+ address market,
205
+ uint256 netLpToRemove,
206
+ address tokenOut
207
+ ) public view returns (uint256 netTokenOut, uint256 netPtOut, uint256 netSyToRedeem) {
208
+ (netSyToRedeem, netPtOut) = removeLiquidityDualSyAndPtStatic(market, netLpToRemove);
209
+ netTokenOut = _redeemSyToTokenStatic(market, tokenOut, netSyToRedeem);
210
+ }
211
+
212
+ /// @dev netPtFromSwap is the parameter to approx
213
+ /// @notice should revert post-expiry
214
+ function removeLiquiditySinglePtStatic(
215
+ address market,
216
+ uint256 netLpToRemove
217
+ )
218
+ public
219
+ view
220
+ returns (
221
+ uint256 netPtOut,
222
+ uint256 netPtFromSwap,
223
+ uint256 netSyFee,
224
+ uint256 priceImpact,
225
+ uint256 exchangeRateAfter,
226
+ // extra-info
227
+ uint256 netSyFromBurn,
228
+ uint256 netPtFromBurn
229
+ )
230
+ {
231
+ MarketState memory state = _readState(market);
232
+
233
+ (netSyFromBurn, netPtFromBurn) = state.removeLiquidity(netLpToRemove);
234
+ (netPtFromSwap, netSyFee) = state.approxSwapExactSyForPt(
235
+ _pyIndex(market),
236
+ netSyFromBurn,
237
+ block.timestamp,
238
+ defaultApproxParams
239
+ );
240
+
241
+ netPtOut = netPtFromBurn + netPtFromSwap;
242
+ priceImpact = _calcPriceImpactPt(market, netPtFromSwap.Int());
243
+
244
+ // Execute swap to calculate exchangeRateAfter
245
+ state.swapSyForExactPt(_pyIndex(market), netPtFromSwap, block.timestamp);
246
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
247
+ }
248
+
249
+ function removeLiquiditySingleSyStatic(
250
+ address market,
251
+ uint256 netLpToRemove
252
+ )
253
+ public
254
+ view
255
+ returns (
256
+ uint256 netSyOut,
257
+ uint256 netSyFee,
258
+ uint256 priceImpact,
259
+ uint256 exchangeRateAfter,
260
+ // extra-info
261
+ uint256 netSyFromBurn,
262
+ uint256 netPtFromBurn,
263
+ uint256 netSyFromSwap
264
+ )
265
+ {
266
+ MarketState memory state = _readState(market);
267
+
268
+ (netSyFromBurn, netPtFromBurn) = state.removeLiquidity(netLpToRemove);
269
+
270
+ if (IPMarket(market).isExpired()) {
271
+ netSyOut = netSyFromBurn + _pyIndex(market).assetToSy(netPtFromBurn);
272
+ netSyFee = 0;
273
+ priceImpact = 0;
274
+ exchangeRateAfter = PMath.ONE;
275
+ } else {
276
+ (netSyFromSwap, netSyFee, ) = state.swapExactPtForSy(_pyIndex(market), netPtFromBurn, block.timestamp);
277
+
278
+ netSyOut = netSyFromBurn + netSyFromSwap;
279
+ priceImpact = _calcPriceImpactPt(market, netPtFromBurn.neg());
280
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
281
+ }
282
+ }
283
+
284
+ function removeLiquiditySingleTokenStatic(
285
+ address market,
286
+ uint256 netLpToRemove,
287
+ address tokenOut
288
+ )
289
+ public
290
+ view
291
+ returns (
292
+ uint256 netTokenOut,
293
+ uint256 netSyFee,
294
+ uint256 priceImpact,
295
+ uint256 exchangeRateAfter,
296
+ // extra-info
297
+ uint256 netSyOut,
298
+ uint256 netSyFromBurn,
299
+ uint256 netPtFromBurn,
300
+ uint256 netSyFromSwap
301
+ )
302
+ {
303
+ (
304
+ netSyOut,
305
+ netSyFee,
306
+ priceImpact,
307
+ exchangeRateAfter,
308
+ netSyFromBurn,
309
+ netPtFromBurn,
310
+ netSyFromSwap
311
+ ) = removeLiquiditySingleSyStatic(market, netLpToRemove);
312
+
313
+ netTokenOut = _redeemSyToTokenStatic(market, tokenOut, netSyOut);
314
+ }
315
+
316
+ // ============ SWAP PT ============
317
+
318
+ function swapExactPtForSyStatic(
319
+ address market,
320
+ uint256 exactPtIn
321
+ ) public view returns (uint256 netSyOut, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
322
+ MarketState memory state = _readState(market);
323
+ (netSyOut, netSyFee, ) = state.swapExactPtForSy(_pyIndex(market), exactPtIn, block.timestamp);
324
+ priceImpact = _calcPriceImpactPt(market, exactPtIn.neg());
325
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
326
+ }
327
+
328
+ function swapSyForExactPtStatic(
329
+ address market,
330
+ uint256 exactPtOut
331
+ ) public view returns (uint256 netSyIn, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
332
+ MarketState memory state = _readState(market);
333
+ (netSyIn, netSyFee, ) = state.swapSyForExactPt(_pyIndex(market), exactPtOut, block.timestamp);
334
+ priceImpact = _calcPriceImpactPt(market, exactPtOut.Int());
335
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
336
+ }
337
+
338
+ /// @dev netPtOut is the parameter to approx
339
+ function swapExactSyForPtStatic(
340
+ address market,
341
+ uint256 exactSyIn
342
+ ) public view returns (uint256 netPtOut, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
343
+ MarketState memory state = _readState(market);
344
+ (netPtOut, netSyFee) = state.approxSwapExactSyForPt(
345
+ _pyIndex(market),
346
+ exactSyIn,
347
+ block.timestamp,
348
+ defaultApproxParams
349
+ );
350
+ priceImpact = _calcPriceImpactPt(market, netPtOut.Int());
351
+
352
+ // Execute swap to calculate exchangeRateAfter
353
+ state.swapSyForExactPt(_pyIndex(market), netPtOut, block.timestamp);
354
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
355
+ }
356
+
357
+ /// @dev netPtIn is the parameter to approx
358
+ function swapPtForExactSyStatic(
359
+ address market,
360
+ uint256 exactSyOut
361
+ ) public view returns (uint256 netPtIn, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
362
+ MarketState memory state = _readState(market);
363
+
364
+ (netPtIn, , netSyFee) = state.approxSwapPtForExactSy(
365
+ _pyIndex(market),
366
+ exactSyOut,
367
+ block.timestamp,
368
+ defaultApproxParams
369
+ );
370
+ priceImpact = _calcPriceImpactPt(market, netPtIn.neg());
371
+
372
+ // Execute swap to calculate exchangeRateAfter
373
+ state.swapExactPtForSy(_pyIndex(market), netPtIn, block.timestamp);
374
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
375
+ }
376
+
377
+ function swapExactTokenForPtStatic(
378
+ address market,
379
+ address tokenIn,
380
+ uint256 amountTokenIn
381
+ )
382
+ public
383
+ view
384
+ returns (
385
+ uint256 netPtOut,
386
+ uint256 netSyMinted,
387
+ uint256 netSyFee,
388
+ uint256 priceImpact,
389
+ uint256 exchangeRateAfter
390
+ )
391
+ {
392
+ netSyMinted = _mintSyFromTokenStatic(market, tokenIn, amountTokenIn);
393
+
394
+ (netPtOut, netSyFee, priceImpact, exchangeRateAfter) = swapExactSyForPtStatic(market, netSyMinted);
395
+ }
396
+
397
+ function swapExactPtForTokenStatic(
398
+ address market,
399
+ uint256 exactPtIn,
400
+ address tokenOut
401
+ )
402
+ public
403
+ view
404
+ returns (
405
+ uint256 netTokenOut,
406
+ uint256 netSyToRedeem,
407
+ uint256 netSyFee,
408
+ uint256 priceImpact,
409
+ uint256 exchangeRateAfter
410
+ )
411
+ {
412
+ (netSyToRedeem, netSyFee, priceImpact, exchangeRateAfter) = swapExactPtForSyStatic(market, exactPtIn);
413
+
414
+ netTokenOut = _redeemSyToTokenStatic(market, tokenOut, netSyToRedeem);
415
+ }
416
+
417
+ // ============ SWAP YT ============
418
+
419
+ function swapSyForExactYtStatic(
420
+ address market,
421
+ uint256 exactYtOut
422
+ )
423
+ public
424
+ view
425
+ returns (
426
+ uint256 netSyIn,
427
+ uint256 netSyFee,
428
+ uint256 priceImpact,
429
+ uint256 exchangeRateAfter,
430
+ // extra-info
431
+ uint256 netSyReceivedInt,
432
+ uint256 totalSyNeedInt
433
+ )
434
+ {
435
+ priceImpact = _calcPriceImpactYt(market, exactYtOut.neg());
436
+
437
+ MarketState memory state = _readState(market);
438
+ PYIndex index = _pyIndex(market);
439
+
440
+ (netSyReceivedInt, netSyFee, ) = state.swapExactPtForSy(_pyIndex(market), exactYtOut, block.timestamp);
441
+
442
+ totalSyNeedInt = index.assetToSyUp(exactYtOut);
443
+ netSyIn = totalSyNeedInt.subMax0(netSyReceivedInt);
444
+
445
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
446
+ }
447
+
448
+ /// @dev netYtOut is the parameter to approx
449
+ function swapExactSyForYtStatic(
450
+ address market,
451
+ uint256 exactSyIn
452
+ ) public view returns (uint256 netYtOut, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
453
+ MarketState memory state = _readState(market);
454
+ PYIndex index = _pyIndex(market);
455
+
456
+ (netYtOut, netSyFee) = state.approxSwapExactSyForYt(index, exactSyIn, block.timestamp, defaultApproxParams);
457
+
458
+ priceImpact = _calcPriceImpactYt(market, netYtOut.neg());
459
+
460
+ // Execute swap to calculate exchangeRateAfter
461
+ state.swapExactPtForSy(index, netYtOut, block.timestamp);
462
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
463
+ }
464
+
465
+ function swapExactYtForSyStatic(
466
+ address market,
467
+ uint256 exactYtIn
468
+ )
469
+ public
470
+ view
471
+ returns (
472
+ uint256 netSyOut,
473
+ uint256 netSyFee,
474
+ uint256 priceImpact,
475
+ uint256 exchangeRateAfter,
476
+ // extra-info
477
+ uint256 netSyOwedInt,
478
+ uint256 netPYToRepaySyOwedInt,
479
+ uint256 netPYToRedeemSyOutInt
480
+ )
481
+ {
482
+ priceImpact = _calcPriceImpactYt(market, exactYtIn.Int());
483
+
484
+ MarketState memory state = _readState(market);
485
+
486
+ PYIndex index = _pyIndex(market);
487
+
488
+ (netSyOwedInt, netSyFee, ) = state.swapSyForExactPt(index, exactYtIn, block.timestamp);
489
+
490
+ netPYToRepaySyOwedInt = index.syToAssetUp(netSyOwedInt);
491
+ netPYToRedeemSyOutInt = exactYtIn - netPYToRepaySyOwedInt;
492
+
493
+ netSyOut = index.assetToSy(netPYToRedeemSyOutInt);
494
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
495
+ }
496
+
497
+ function swapExactYtForTokenStatic(
498
+ address market,
499
+ uint256 exactYtIn,
500
+ address tokenOut
501
+ )
502
+ public
503
+ view
504
+ returns (
505
+ uint256 netTokenOut,
506
+ uint256 netSyFee,
507
+ uint256 priceImpact,
508
+ uint256 exchangeRateAfter,
509
+ // extra-info
510
+ uint256 netSyOut,
511
+ uint256 netSyOwedInt,
512
+ uint256 netPYToRepaySyOwedInt,
513
+ uint256 netPYToRedeemSyOutInt
514
+ )
515
+ {
516
+ (
517
+ netSyOut,
518
+ netSyFee,
519
+ priceImpact,
520
+ exchangeRateAfter,
521
+ netSyOwedInt,
522
+ netPYToRepaySyOwedInt,
523
+ netPYToRedeemSyOutInt
524
+ ) = swapExactYtForSyStatic(market, exactYtIn);
525
+
526
+ netTokenOut = _redeemSyToTokenStatic(market, tokenOut, netSyOut);
527
+ }
528
+
529
+ /// @dev netYtIn is the parameter to approx
530
+ function swapYtForExactSyStatic(
531
+ address market,
532
+ uint256 exactSyOut
533
+ ) public view returns (uint256 netYtIn, uint256 netSyFee, uint256 priceImpact, uint256 exchangeRateAfter) {
534
+ MarketState memory state = _readState(market);
535
+
536
+ PYIndex index = _pyIndex(market);
537
+
538
+ (netYtIn, , netSyFee) = state.approxSwapYtForExactSy(index, exactSyOut, block.timestamp, defaultApproxParams);
539
+ priceImpact = _calcPriceImpactYt(market, netYtIn.Int());
540
+
541
+ // Execute swap to calculate exchangeRateAfter
542
+ state.swapSyForExactPt(index, netYtIn, block.timestamp);
543
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
544
+ }
545
+
546
+ function swapExactTokenForYtStatic(
547
+ address market,
548
+ address tokenIn,
549
+ uint256 amountTokenIn
550
+ )
551
+ public
552
+ view
553
+ returns (
554
+ uint256 netYtOut,
555
+ uint256 netSyMinted,
556
+ uint256 netSyFee,
557
+ uint256 priceImpact,
558
+ uint256 exchangeRateAfter
559
+ )
560
+ {
561
+ netSyMinted = _mintSyFromTokenStatic(market, tokenIn, amountTokenIn);
562
+ (netYtOut, netSyFee, priceImpact, exchangeRateAfter) = swapExactSyForYtStatic(market, netSyMinted);
563
+ }
564
+
565
+ // totalPtToSwap is the param to approx
566
+ function swapExactPtForYtStatic(
567
+ address market,
568
+ uint256 exactPtIn
569
+ )
570
+ public
571
+ view
572
+ returns (
573
+ uint256 netYtOut,
574
+ uint256 totalPtToSwap,
575
+ uint256 netSyFee,
576
+ uint256 priceImpact,
577
+ uint256 exchangeRateAfter
578
+ )
579
+ {
580
+ MarketState memory state = _readState(market);
581
+ PYIndex index = _pyIndex(market);
582
+
583
+ (netYtOut, totalPtToSwap, netSyFee) = state.approxSwapExactPtForYt(
584
+ index,
585
+ exactPtIn,
586
+ block.timestamp,
587
+ defaultApproxParams
588
+ );
589
+ priceImpact = _calcPriceImpactPY(market, totalPtToSwap.neg());
590
+
591
+ // Execute swap to calculate exchangeRateAfter
592
+ state.swapExactPtForSy(index, totalPtToSwap, block.timestamp);
593
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
594
+ }
595
+
596
+ // totalPtSwapped is the param to approx
597
+ function swapExactYtForPtStatic(
598
+ address market,
599
+ uint256 exactYtIn
600
+ )
601
+ public
602
+ view
603
+ returns (
604
+ uint256 netPtOut,
605
+ uint256 totalPtSwapped,
606
+ uint256 netSyFee,
607
+ uint256 priceImpact,
608
+ uint256 exchangeRateAfter
609
+ )
610
+ {
611
+ MarketState memory state = _readState(market);
612
+ PYIndex index = _pyIndex(market);
613
+
614
+ (netPtOut, totalPtSwapped, netSyFee) = state.approxSwapExactYtForPt(
615
+ index,
616
+ exactYtIn,
617
+ block.timestamp,
618
+ defaultApproxParams
619
+ );
620
+
621
+ priceImpact = _calcPriceImpactPY(market, totalPtSwapped.Int());
622
+
623
+ // Execute swap to calculate exchangeRateAfter
624
+ state.swapSyForExactPt(index, totalPtSwapped, block.timestamp);
625
+ exchangeRateAfter = _getTradeExchangeRateExcludeFee(market, state);
626
+ }
627
+
628
+ function _calcPriceImpactPY(address market, int256 netPtOut) internal view returns (uint256) {
629
+ return IPRouterStatic(address(this)).calcPriceImpactPY(market, netPtOut);
630
+ }
631
+
632
+ function _calcPriceImpactPt(address market, int256 netPtOut) internal view returns (uint256) {
633
+ return IPRouterStatic(address(this)).calcPriceImpactPt(market, netPtOut);
634
+ }
635
+
636
+ function _calcPriceImpactYt(address market, int256 netPtOut) internal view returns (uint256) {
637
+ return IPRouterStatic(address(this)).calcPriceImpactYt(market, netPtOut);
638
+ }
639
+
640
+ function _mintSyFromTokenStatic(
641
+ address market,
642
+ address tokenIn,
643
+ uint256 netTokenToDeposit
644
+ ) internal view returns (uint256) {
645
+ return IPRouterStatic(address(this)).mintSyFromTokenStatic(_getSyMarket(market), tokenIn, netTokenToDeposit);
646
+ }
647
+
648
+ function _redeemSyToTokenStatic(
649
+ address market,
650
+ address tokenOut,
651
+ uint256 netSyToRedeem
652
+ ) internal view returns (uint256) {
653
+ return IPRouterStatic(address(this)).redeemSyToTokenStatic(_getSyMarket(market), tokenOut, netSyToRedeem);
654
+ }
655
+
656
+ function _getTradeExchangeRateExcludeFee(address market, MarketState memory state) internal view returns (uint256) {
657
+ return IPRouterStatic(address(this)).getTradeExchangeRateExcludeFee(market, state);
658
+ }
659
+
660
+ function _readState(address market) internal view returns (MarketState memory) {
661
+ return IPMarket(market).readState(address(this));
662
+ }
663
+
664
+ function _pyIndex(address market) private view returns (PYIndex) {
665
+ return PYIndex.wrap(IPRouterStatic(address(this)).pyIndexCurrentViewMarket(market));
666
+ }
667
+
668
+ function _getSyMarket(address market) internal view returns (address) {
669
+ (IStandardizedYield SY, , ) = IPMarket(market).readTokens();
670
+ return address(SY);
671
+ }
672
+ }