@pendle/core-v2 0.2.1 → 0.2.2

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 (40) hide show
  1. package/contracts/core/PendleBaseToken.sol +0 -4
  2. package/contracts/core/PendleMarket.sol +4 -7
  3. package/contracts/core/PendleMarketFactory.sol +2 -2
  4. package/contracts/core/PendleOwnershipToken.sol +0 -2
  5. package/contracts/core/router/PendleRouterProxy.sol +15 -1
  6. package/contracts/core/router/PendleRouterStatic.sol +82 -0
  7. package/contracts/interfaces/IPRouterStatic.sol +35 -0
  8. package/contracts/libraries/math/FixedPoint.sol +4 -7
  9. package/contracts/libraries/math/LogExpMath.sol +377 -365
  10. package/contracts/libraries/math/MarketMathLib.sol +25 -17
  11. package/package.json +1 -1
  12. package/typechain-types/IPRouterStatic.ts +307 -0
  13. package/typechain-types/IPRouterView.ts +307 -0
  14. package/typechain-types/PendleBaseToken.ts +0 -30
  15. package/typechain-types/PendleMarket.ts +19 -46
  16. package/typechain-types/PendleMarketFactory.ts +5 -5
  17. package/typechain-types/PendleOwnershipToken.ts +0 -30
  18. package/typechain-types/PendleRouterProxy.ts +21 -0
  19. package/typechain-types/PendleRouterStaticUpg.ts +307 -0
  20. package/typechain-types/PendleRouterViewUpg.ts +307 -0
  21. package/typechain-types/PendleYieldToken.ts +0 -30
  22. package/typechain-types/factories/IPRouterStatic__factory.ts +190 -0
  23. package/typechain-types/factories/IPRouterView__factory.ts +187 -0
  24. package/typechain-types/factories/PendleAaveV3SCY__factory.ts +1 -1
  25. package/typechain-types/factories/PendleBaseToken__factory.ts +0 -38
  26. package/typechain-types/factories/PendleBenQiErc20SCY__factory.ts +1 -1
  27. package/typechain-types/factories/PendleBtrflyScy__factory.ts +1 -1
  28. package/typechain-types/factories/PendleMarketFactory__factory.ts +2 -2
  29. package/typechain-types/factories/PendleMarket__factory.ts +19 -57
  30. package/typechain-types/factories/PendleOwnershipToken__factory.ts +1 -39
  31. package/typechain-types/factories/PendleRouterCoreUpg__factory.ts +1 -1
  32. package/typechain-types/factories/PendleRouterProxy__factory.ts +23 -1
  33. package/typechain-types/factories/PendleRouterStaticUpg__factory.ts +269 -0
  34. package/typechain-types/factories/PendleRouterViewUpg__factory.ts +265 -0
  35. package/typechain-types/factories/PendleRouterYTUpg__factory.ts +1 -1
  36. package/typechain-types/factories/PendleYearnVaultScy__factory.ts +1 -1
  37. package/typechain-types/factories/PendleYieldContractFactory__factory.ts +1 -1
  38. package/typechain-types/factories/PendleYieldToken__factory.ts +1 -39
  39. package/typechain-types/hardhat.d.ts +18 -0
  40. package/typechain-types/index.ts +4 -0
@@ -34,7 +34,7 @@ struct MarketStorage {
34
34
  uint32 lastTradeTime;
35
35
  }
36
36
 
37
- // solhint-disable reason-string, ordering
37
+ // solhint-disable ordering
38
38
  library MarketMathLib {
39
39
  using FixedPoint for uint256;
40
40
  using FixedPoint for int256;
@@ -138,15 +138,18 @@ library MarketMathLib {
138
138
  function setInitialImpliedRate(
139
139
  MarketParameters memory market,
140
140
  SCYIndex index,
141
- int256 anchorRoot,
141
+ int256 initialAnchor,
142
142
  uint256 blockTime
143
143
  ) internal pure {
144
+ require(blockTime < market.expiry, "market expired");
144
145
  int256 totalAsset = index.scyToAsset(market.totalScy);
146
+ uint256 timeToExpiry = market.expiry - blockTime;
147
+ int256 rateScalar = _getRateScalar(market, timeToExpiry);
145
148
  market.lastImpliedRate = _getImpliedRate(
146
149
  market.totalOt,
147
150
  totalAsset,
148
- market.scalarRoot,
149
- anchorRoot,
151
+ rateScalar,
152
+ initialAnchor,
150
153
  market.expiry - blockTime
151
154
  );
152
155
  }
@@ -211,19 +214,24 @@ library MarketMathLib {
211
214
  scyUsed = scyDesired;
212
215
  otUsed = otDesired;
213
216
  } else {
214
- lpToAccount = FixedPoint.min(
215
- (otDesired * market.totalLp) / market.totalOt,
216
- (scyDesired * market.totalLp) / market.totalScy
217
- );
218
- scyUsed = (market.totalScy * lpToAccount) / market.totalLp;
219
- otUsed = (market.totalOt * lpToAccount) / market.totalLp;
217
+ int256 netLpByOt = (otDesired * market.totalLp) / market.totalOt;
218
+ int256 netLpByScy = (scyDesired * market.totalLp) / market.totalScy;
219
+ if (netLpByOt < netLpByScy) {
220
+ lpToAccount = netLpByOt;
221
+ otUsed = otDesired;
222
+ scyUsed = (market.totalScy * lpToAccount) / market.totalLp;
223
+ } else {
224
+ lpToAccount = netLpByScy;
225
+ scyUsed = scyDesired;
226
+ otUsed = (market.totalOt * lpToAccount) / market.totalLp;
227
+ }
220
228
  }
221
229
 
230
+ require(lpToAccount > 0, "INSUFFICIENT_LIQUIDITY_MINTED");
231
+
222
232
  market.totalScy += scyUsed;
223
233
  market.totalOt += otUsed;
224
234
  market.totalLp += lpToAccount + lpToReserve;
225
-
226
- require(lpToAccount > 0, "INSUFFICIENT_LIQUIDITY_MINTED");
227
235
  }
228
236
 
229
237
  function _removeLiquidity(MarketParameters memory market, int256 lpToRemove)
@@ -254,7 +262,7 @@ library MarketMathLib {
254
262
  int256 otToAccount,
255
263
  uint256 blockTime
256
264
  ) private pure returns (int256 netScyToAccount, int256 netScyToReserve) {
257
- require(blockTime < market.expiry, "MARKET_EXPIRED");
265
+ require(blockTime < market.expiry, "market expired");
258
266
 
259
267
  ExecuteTradeSlot memory slot;
260
268
  slot.timeToExpiry = market.expiry - blockTime;
@@ -313,7 +321,7 @@ library MarketMathLib {
313
321
  // It's technically possible that the implied rate is actually exactly zero (or
314
322
  // more accurately the natural log rounds down to zero) but we will still fail
315
323
  // in this case. If this does happen we may assume that markets are not initialized.
316
- require(market.lastImpliedRate != 0);
324
+ require(market.lastImpliedRate != 0, "zero impliedRate");
317
325
 
318
326
  (netScyToAccount, netScyToReserve) = _setNewMarketState(
319
327
  market,
@@ -345,7 +353,7 @@ library MarketMathLib {
345
353
  rateScalar = _getRateScalar(market, timeToExpiry);
346
354
  totalAsset = index.scyToAsset(market.totalScy);
347
355
 
348
- require(market.totalOt != 0 && totalAsset != 0);
356
+ require(market.totalOt != 0 && totalAsset != 0, "invalid market state");
349
357
 
350
358
  // Get the rateAnchor given the market state, this will establish the baseline for where
351
359
  // the exchange rate is set.
@@ -545,7 +553,7 @@ library MarketMathLib {
545
553
  // removed). Over time, the yield from SCY will slightly decrease the proportion (the
546
554
  // amount of Asset in the market must be monotonically increasing). Therefore it is not
547
555
  // possible for the proportion to go over max market proportion unless borrowing occurs.
548
- require(proportion <= MAX_MARKET_PROPORTION);
556
+ require(proportion <= MAX_MARKET_PROPORTION, "max proportion exceeded");
549
557
 
550
558
  int256 lnProportion = _logProportion(proportion);
551
559
 
@@ -558,7 +566,7 @@ library MarketMathLib {
558
566
 
559
567
  function _logProportion(int256 proportion) private pure returns (int256 res) {
560
568
  // This will result in divide by zero, short circuit
561
- require(proportion != FixedPoint.ONE_INT);
569
+ require(proportion != FixedPoint.ONE_INT, "proportion must not be one");
562
570
 
563
571
  // Convert proportion to what is used inside the logit function (p / (1-p))
564
572
  int256 logitP = proportion.divDown(FixedPoint.ONE_INT - proportion);
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": "0.2.1",
5
+ "version": "0.2.2",
6
6
  "homepage": "https://pendle.finance",
7
7
  "keywords": [
8
8
  "pendle",
@@ -0,0 +1,307 @@
1
+ /* Autogenerated file. Do not edit manually. */
2
+ /* tslint:disable */
3
+ /* eslint-disable */
4
+ import {
5
+ BaseContract,
6
+ BigNumber,
7
+ BigNumberish,
8
+ BytesLike,
9
+ CallOverrides,
10
+ ContractTransaction,
11
+ Overrides,
12
+ PopulatedTransaction,
13
+ Signer,
14
+ utils,
15
+ } from "ethers";
16
+ import { FunctionFragment, Result } from "@ethersproject/abi";
17
+ import { Listener, Provider } from "@ethersproject/providers";
18
+ import type {
19
+ TypedEventFilter,
20
+ TypedEvent,
21
+ TypedListener,
22
+ OnEvent,
23
+ } from "./common";
24
+
25
+ export interface IPRouterStaticInterface extends utils.Interface {
26
+ contractName: "IPRouterStatic";
27
+ functions: {
28
+ "addLiquidityStatic(address,uint256,uint256)": FunctionFragment;
29
+ "getOtImpliedYield(address)": FunctionFragment;
30
+ "removeLiquidityStatic(address,uint256)": FunctionFragment;
31
+ "scyIndex(address)": FunctionFragment;
32
+ "swapOtForScyStatic(address,uint256)": FunctionFragment;
33
+ "swapScyForOtStatic(address,uint256)": FunctionFragment;
34
+ };
35
+
36
+ encodeFunctionData(
37
+ functionFragment: "addLiquidityStatic",
38
+ values: [string, BigNumberish, BigNumberish]
39
+ ): string;
40
+ encodeFunctionData(
41
+ functionFragment: "getOtImpliedYield",
42
+ values: [string]
43
+ ): string;
44
+ encodeFunctionData(
45
+ functionFragment: "removeLiquidityStatic",
46
+ values: [string, BigNumberish]
47
+ ): string;
48
+ encodeFunctionData(functionFragment: "scyIndex", values: [string]): string;
49
+ encodeFunctionData(
50
+ functionFragment: "swapOtForScyStatic",
51
+ values: [string, BigNumberish]
52
+ ): string;
53
+ encodeFunctionData(
54
+ functionFragment: "swapScyForOtStatic",
55
+ values: [string, BigNumberish]
56
+ ): string;
57
+
58
+ decodeFunctionResult(
59
+ functionFragment: "addLiquidityStatic",
60
+ data: BytesLike
61
+ ): Result;
62
+ decodeFunctionResult(
63
+ functionFragment: "getOtImpliedYield",
64
+ data: BytesLike
65
+ ): Result;
66
+ decodeFunctionResult(
67
+ functionFragment: "removeLiquidityStatic",
68
+ data: BytesLike
69
+ ): Result;
70
+ decodeFunctionResult(functionFragment: "scyIndex", data: BytesLike): Result;
71
+ decodeFunctionResult(
72
+ functionFragment: "swapOtForScyStatic",
73
+ data: BytesLike
74
+ ): Result;
75
+ decodeFunctionResult(
76
+ functionFragment: "swapScyForOtStatic",
77
+ data: BytesLike
78
+ ): Result;
79
+
80
+ events: {};
81
+ }
82
+
83
+ export interface IPRouterStatic extends BaseContract {
84
+ contractName: "IPRouterStatic";
85
+ connect(signerOrProvider: Signer | Provider | string): this;
86
+ attach(addressOrName: string): this;
87
+ deployed(): Promise<this>;
88
+
89
+ interface: IPRouterStaticInterface;
90
+
91
+ queryFilter<TEvent extends TypedEvent>(
92
+ event: TypedEventFilter<TEvent>,
93
+ fromBlockOrBlockhash?: string | number | undefined,
94
+ toBlock?: string | number | undefined
95
+ ): Promise<Array<TEvent>>;
96
+
97
+ listeners<TEvent extends TypedEvent>(
98
+ eventFilter?: TypedEventFilter<TEvent>
99
+ ): Array<TypedListener<TEvent>>;
100
+ listeners(eventName?: string): Array<Listener>;
101
+ removeAllListeners<TEvent extends TypedEvent>(
102
+ eventFilter: TypedEventFilter<TEvent>
103
+ ): this;
104
+ removeAllListeners(eventName?: string): this;
105
+ off: OnEvent<this>;
106
+ on: OnEvent<this>;
107
+ once: OnEvent<this>;
108
+ removeListener: OnEvent<this>;
109
+
110
+ functions: {
111
+ addLiquidityStatic(
112
+ market: string,
113
+ scyDesired: BigNumberish,
114
+ otDesired: BigNumberish,
115
+ overrides?: Overrides & { from?: string | Promise<string> }
116
+ ): Promise<ContractTransaction>;
117
+
118
+ getOtImpliedYield(
119
+ market: string,
120
+ overrides?: CallOverrides
121
+ ): Promise<[BigNumber]>;
122
+
123
+ removeLiquidityStatic(
124
+ market: string,
125
+ lpToRemove: BigNumberish,
126
+ overrides?: CallOverrides
127
+ ): Promise<
128
+ [BigNumber, BigNumber] & { netScyOut: BigNumber; netOtOut: BigNumber }
129
+ >;
130
+
131
+ scyIndex(
132
+ market: string,
133
+ overrides?: Overrides & { from?: string | Promise<string> }
134
+ ): Promise<ContractTransaction>;
135
+
136
+ swapOtForScyStatic(
137
+ market: string,
138
+ exactOtIn: BigNumberish,
139
+ overrides?: Overrides & { from?: string | Promise<string> }
140
+ ): Promise<ContractTransaction>;
141
+
142
+ swapScyForOtStatic(
143
+ market: string,
144
+ exactOtOut: BigNumberish,
145
+ overrides?: Overrides & { from?: string | Promise<string> }
146
+ ): Promise<ContractTransaction>;
147
+ };
148
+
149
+ addLiquidityStatic(
150
+ market: string,
151
+ scyDesired: BigNumberish,
152
+ otDesired: BigNumberish,
153
+ overrides?: Overrides & { from?: string | Promise<string> }
154
+ ): Promise<ContractTransaction>;
155
+
156
+ getOtImpliedYield(
157
+ market: string,
158
+ overrides?: CallOverrides
159
+ ): Promise<BigNumber>;
160
+
161
+ removeLiquidityStatic(
162
+ market: string,
163
+ lpToRemove: BigNumberish,
164
+ overrides?: CallOverrides
165
+ ): Promise<
166
+ [BigNumber, BigNumber] & { netScyOut: BigNumber; netOtOut: BigNumber }
167
+ >;
168
+
169
+ scyIndex(
170
+ market: string,
171
+ overrides?: Overrides & { from?: string | Promise<string> }
172
+ ): Promise<ContractTransaction>;
173
+
174
+ swapOtForScyStatic(
175
+ market: string,
176
+ exactOtIn: BigNumberish,
177
+ overrides?: Overrides & { from?: string | Promise<string> }
178
+ ): Promise<ContractTransaction>;
179
+
180
+ swapScyForOtStatic(
181
+ market: string,
182
+ exactOtOut: BigNumberish,
183
+ overrides?: Overrides & { from?: string | Promise<string> }
184
+ ): Promise<ContractTransaction>;
185
+
186
+ callStatic: {
187
+ addLiquidityStatic(
188
+ market: string,
189
+ scyDesired: BigNumberish,
190
+ otDesired: BigNumberish,
191
+ overrides?: CallOverrides
192
+ ): Promise<
193
+ [BigNumber, BigNumber, BigNumber] & {
194
+ netLpOut: BigNumber;
195
+ scyUsed: BigNumber;
196
+ otUsed: BigNumber;
197
+ }
198
+ >;
199
+
200
+ getOtImpliedYield(
201
+ market: string,
202
+ overrides?: CallOverrides
203
+ ): Promise<BigNumber>;
204
+
205
+ removeLiquidityStatic(
206
+ market: string,
207
+ lpToRemove: BigNumberish,
208
+ overrides?: CallOverrides
209
+ ): Promise<
210
+ [BigNumber, BigNumber] & { netScyOut: BigNumber; netOtOut: BigNumber }
211
+ >;
212
+
213
+ scyIndex(market: string, overrides?: CallOverrides): Promise<BigNumber>;
214
+
215
+ swapOtForScyStatic(
216
+ market: string,
217
+ exactOtIn: BigNumberish,
218
+ overrides?: CallOverrides
219
+ ): Promise<
220
+ [BigNumber, BigNumber] & { netScyOut: BigNumber; netScyFee: BigNumber }
221
+ >;
222
+
223
+ swapScyForOtStatic(
224
+ market: string,
225
+ exactOtOut: BigNumberish,
226
+ overrides?: CallOverrides
227
+ ): Promise<
228
+ [BigNumber, BigNumber] & { netScyIn: BigNumber; netScyFee: BigNumber }
229
+ >;
230
+ };
231
+
232
+ filters: {};
233
+
234
+ estimateGas: {
235
+ addLiquidityStatic(
236
+ market: string,
237
+ scyDesired: BigNumberish,
238
+ otDesired: BigNumberish,
239
+ overrides?: Overrides & { from?: string | Promise<string> }
240
+ ): Promise<BigNumber>;
241
+
242
+ getOtImpliedYield(
243
+ market: string,
244
+ overrides?: CallOverrides
245
+ ): Promise<BigNumber>;
246
+
247
+ removeLiquidityStatic(
248
+ market: string,
249
+ lpToRemove: BigNumberish,
250
+ overrides?: CallOverrides
251
+ ): Promise<BigNumber>;
252
+
253
+ scyIndex(
254
+ market: string,
255
+ overrides?: Overrides & { from?: string | Promise<string> }
256
+ ): Promise<BigNumber>;
257
+
258
+ swapOtForScyStatic(
259
+ market: string,
260
+ exactOtIn: BigNumberish,
261
+ overrides?: Overrides & { from?: string | Promise<string> }
262
+ ): Promise<BigNumber>;
263
+
264
+ swapScyForOtStatic(
265
+ market: string,
266
+ exactOtOut: BigNumberish,
267
+ overrides?: Overrides & { from?: string | Promise<string> }
268
+ ): Promise<BigNumber>;
269
+ };
270
+
271
+ populateTransaction: {
272
+ addLiquidityStatic(
273
+ market: string,
274
+ scyDesired: BigNumberish,
275
+ otDesired: BigNumberish,
276
+ overrides?: Overrides & { from?: string | Promise<string> }
277
+ ): Promise<PopulatedTransaction>;
278
+
279
+ getOtImpliedYield(
280
+ market: string,
281
+ overrides?: CallOverrides
282
+ ): Promise<PopulatedTransaction>;
283
+
284
+ removeLiquidityStatic(
285
+ market: string,
286
+ lpToRemove: BigNumberish,
287
+ overrides?: CallOverrides
288
+ ): Promise<PopulatedTransaction>;
289
+
290
+ scyIndex(
291
+ market: string,
292
+ overrides?: Overrides & { from?: string | Promise<string> }
293
+ ): Promise<PopulatedTransaction>;
294
+
295
+ swapOtForScyStatic(
296
+ market: string,
297
+ exactOtIn: BigNumberish,
298
+ overrides?: Overrides & { from?: string | Promise<string> }
299
+ ): Promise<PopulatedTransaction>;
300
+
301
+ swapScyForOtStatic(
302
+ market: string,
303
+ exactOtOut: BigNumberish,
304
+ overrides?: Overrides & { from?: string | Promise<string> }
305
+ ): Promise<PopulatedTransaction>;
306
+ };
307
+ }