@zofai/zo-sdk 0.1.92 → 0.1.94

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 (54) hide show
  1. package/dist/consts/deployments-slp-mainnet.json +1 -1
  2. package/dist/consts/deployments-usdz-mainnet.json +1 -1
  3. package/dist/consts/deployments-zlp-mainnet.json +1 -1
  4. package/dist/implementations/SLPDataAPI.cjs +227 -51
  5. package/dist/implementations/SLPDataAPI.cjs.map +1 -1
  6. package/dist/implementations/SLPDataAPI.d.cts +8 -1
  7. package/dist/implementations/SLPDataAPI.d.cts.map +1 -1
  8. package/dist/implementations/SLPDataAPI.d.mts +8 -1
  9. package/dist/implementations/SLPDataAPI.d.mts.map +1 -1
  10. package/dist/implementations/SLPDataAPI.mjs +227 -51
  11. package/dist/implementations/SLPDataAPI.mjs.map +1 -1
  12. package/dist/implementations/USDZDataAPI.cjs +208 -48
  13. package/dist/implementations/USDZDataAPI.cjs.map +1 -1
  14. package/dist/implementations/USDZDataAPI.d.cts +8 -1
  15. package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
  16. package/dist/implementations/USDZDataAPI.d.mts +8 -1
  17. package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
  18. package/dist/implementations/USDZDataAPI.mjs +208 -48
  19. package/dist/implementations/USDZDataAPI.mjs.map +1 -1
  20. package/dist/implementations/ZLPDataAPI.cjs +211 -50
  21. package/dist/implementations/ZLPDataAPI.cjs.map +1 -1
  22. package/dist/implementations/ZLPDataAPI.d.cts +8 -1
  23. package/dist/implementations/ZLPDataAPI.d.cts.map +1 -1
  24. package/dist/implementations/ZLPDataAPI.d.mts +8 -1
  25. package/dist/implementations/ZLPDataAPI.d.mts.map +1 -1
  26. package/dist/implementations/ZLPDataAPI.mjs +211 -50
  27. package/dist/implementations/ZLPDataAPI.mjs.map +1 -1
  28. package/dist/interfaces/base.d.cts +22 -0
  29. package/dist/interfaces/base.d.cts.map +1 -1
  30. package/dist/interfaces/base.d.mts +22 -0
  31. package/dist/interfaces/base.d.mts.map +1 -1
  32. package/dist/interfaces/slp.d.cts +8 -1
  33. package/dist/interfaces/slp.d.cts.map +1 -1
  34. package/dist/interfaces/slp.d.mts +8 -1
  35. package/dist/interfaces/slp.d.mts.map +1 -1
  36. package/dist/interfaces/usdz.d.cts +8 -1
  37. package/dist/interfaces/usdz.d.cts.map +1 -1
  38. package/dist/interfaces/usdz.d.mts +8 -1
  39. package/dist/interfaces/usdz.d.mts.map +1 -1
  40. package/dist/interfaces/zlp.d.cts +8 -1
  41. package/dist/interfaces/zlp.d.cts.map +1 -1
  42. package/dist/interfaces/zlp.d.mts +8 -1
  43. package/dist/interfaces/zlp.d.mts.map +1 -1
  44. package/package.json +4 -1
  45. package/src/consts/deployments-slp-mainnet.json +1 -1
  46. package/src/consts/deployments-usdz-mainnet.json +1 -1
  47. package/src/consts/deployments-zlp-mainnet.json +1 -1
  48. package/src/implementations/SLPDataAPI.ts +253 -23
  49. package/src/implementations/USDZDataAPI.ts +232 -20
  50. package/src/implementations/ZLPDataAPI.ts +233 -21
  51. package/src/interfaces/base.ts +26 -0
  52. package/src/interfaces/slp.ts +10 -1
  53. package/src/interfaces/usdz.ts +10 -1
  54. package/src/interfaces/zlp.ts +10 -1
@@ -4,6 +4,12 @@
4
4
  * ZLP DataAPI implementation
5
5
  * Implements ZLP-specific data access methods
6
6
  */
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ZLPDataAPI_instances, _a, _ZLPDataAPI_getTotalVaultsValueUsd, _ZLPDataAPI_getSwapImpactConfig, _ZLPDataAPI_getEmaVolatilityFeeConfig, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix, _ZLPDataAPI_parseSwapImpactConfig, _ZLPDataAPI_parseEmaVolatilityFeeConfig, _ZLPDataAPI_computeSwapImpactFeeValue, _ZLPDataAPI_computeEmaVolatilityFeeValue, _ZLPDataAPI_maxEmaDivergenceRate, _ZLPDataAPI_emaDivergenceRate;
7
13
  Object.defineProperty(exports, "__esModule", { value: true });
8
14
  exports.ZLPDataAPI = void 0;
9
15
  const utils_1 = require("@mysten/sui/utils");
@@ -13,6 +19,7 @@ const utils_2 = require("../utils.cjs");
13
19
  class ZLPDataAPI extends abstract_1.BaseDataAPI {
14
20
  constructor(network, provider, apiEndpoint, connectionURL) {
15
21
  super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.ZLP);
22
+ _ZLPDataAPI_instances.add(this);
16
23
  }
17
24
  async getStaked(owner) {
18
25
  let rawCredentialsData = [];
@@ -46,7 +53,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
46
53
  const credentials = rawCredentialsData
47
54
  .filter((item) => item.data.type
48
55
  === `${this.sharedConfig.zoStaking.package}::pool::Credential<${this.consts.zoCore.package}::zlp::ZLP, 0x2::sui::SUI>`)
49
- .map((item) => ZLPDataAPI.parseCredential(item, pool));
56
+ .map((item) => _a.parseCredential(item, pool));
50
57
  return {
51
58
  credentials,
52
59
  amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
@@ -61,7 +68,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
61
68
  showContent: true,
62
69
  },
63
70
  });
64
- return ZLPDataAPI.parseStakePool(raw);
71
+ return _a.parseStakePool(raw);
65
72
  }
66
73
  /**
67
74
  * Creates vaults valuation for ZLP
@@ -140,22 +147,28 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
140
147
  const marketInfo = await this.getMarketInfo();
141
148
  let zlpPrice = 0;
142
149
  let value = 0;
143
- const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
150
+ const vaultKeys = Object.keys(this.consts.zoCore.vaults);
151
+ const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
144
152
  const vaultInfo = await this.getVaultInfo(vault);
145
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
146
- return (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
147
- });
153
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
154
+ const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
155
+ const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
156
+ const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
157
+ return { vault, oraclePrice, vaultValue };
158
+ }));
159
+ const vaultPrices = Object.fromEntries(vaultData.map(d => [d.vault, d.oraclePrice]));
160
+ const vaultValues = vaultData.map(d => d.vaultValue);
148
161
  const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
149
162
  const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
150
163
  const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
151
164
  const price = (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked();
152
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbolInfo, price);
165
+ const deltaSize = _a.calcDeltaSize(symbolInfo, price);
153
166
  const oiState = await this.getSymbolOiFundingState(tokenId);
154
167
  const pairedInfo = await this.getSymbolInfo(tokenId, direction !== 'long');
155
- const fundingFeeDelta = ZLPDataAPI.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, price, marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState.model : undefined, pairedInfo.openingSize);
168
+ const fundingFeeDelta = _a.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, price, marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedInfo.openingSize);
156
169
  return fundingFeeDelta + deltaSize;
157
170
  });
158
- const [vaultValues, symbolValues] = await Promise.all([Promise.all(vaultPromises), Promise.all(symbolPromises)]);
171
+ const symbolValues = await Promise.all(symbolPromises);
159
172
  value = vaultValues.reduce((acc, curr) => acc + curr, 0);
160
173
  value += symbolValues.reduce((acc, curr) => acc + curr, 0);
161
174
  zlpPrice = value / marketInfo.lpSupplyWithDecimals;
@@ -164,6 +177,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
164
177
  price: zlpPrice,
165
178
  supply: marketInfo.lpSupplyWithDecimals,
166
179
  apr: Number(marketInfo.apr),
180
+ vaultPrices,
167
181
  };
168
182
  }
169
183
  /**
@@ -180,7 +194,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
180
194
  showContent: true,
181
195
  },
182
196
  });
183
- return ZLPDataAPI.parseMarketInfo(rawData);
197
+ return _a.parseMarketInfo(rawData);
184
198
  }
185
199
  /**
186
200
  * Gets ZLP vault information
@@ -229,7 +243,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
229
243
  showContent: true,
230
244
  },
231
245
  });
232
- return ZLPDataAPI.parsePositionConfig(rawData);
246
+ return _a.parsePositionConfig(rawData);
233
247
  }
234
248
  /**
235
249
  * Gets ZLP symbol configuration
@@ -244,7 +258,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
244
258
  value: { dummy_field: false },
245
259
  },
246
260
  });
247
- return ZLPDataAPI.parseSymbolConfig(rawData);
261
+ return _a.parseSymbolConfig(rawData);
248
262
  }
249
263
  catch (e) {
250
264
  // If the dynamic field doesn't exist, return null
@@ -265,7 +279,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
265
279
  value: { dummy_field: false },
266
280
  },
267
281
  });
268
- return ZLPDataAPI.parseOiFundingState(rawData);
282
+ return _a.parseOiFundingState(rawData);
269
283
  }
270
284
  catch (e) {
271
285
  // If the dynamic field doesn't exist, return null
@@ -287,7 +301,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
287
301
  value: { dummy_field: false },
288
302
  },
289
303
  });
290
- return ZLPDataAPI.parsePriceImpactConfig(rawData);
304
+ return _a.parsePriceImpactConfig(rawData);
291
305
  }
292
306
  catch (e) {
293
307
  // If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
@@ -295,6 +309,50 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
295
309
  return null;
296
310
  }
297
311
  }
312
+ async calculateSwapFeeBreakdown(fromToken, toToken, fromAmount) {
313
+ const timestamp = Date.now() / 1000;
314
+ const fromDecimals = this.consts.coins[fromToken]?.decimals;
315
+ const toDecimals = this.consts.coins[toToken]?.decimals;
316
+ if (fromDecimals === undefined || toDecimals === undefined) {
317
+ throw new Error(`Unknown token decimals for swap: ${fromToken} -> ${toToken}`);
318
+ }
319
+ const fromFeed = await this.getOraclePrice(fromToken);
320
+ const toFeed = await this.getOraclePrice(toToken);
321
+ const fromPrice = fromFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
322
+ const toPrice = toFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
323
+ const swapValue = (fromAmount * fromPrice) / (10 ** fromDecimals);
324
+ const totalVaultsValue = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getTotalVaultsValueUsd).call(this, timestamp);
325
+ const rebaseFeeInRate = await this.rebaseFeeRate(fromToken, true, fromAmount);
326
+ const rebaseFeeInValue = swapValue * rebaseFeeInRate;
327
+ // Estimate out-amount by notional value (ignoring price impact / spread / fees).
328
+ const estimatedToAmount = toPrice !== 0
329
+ ? (swapValue * (10 ** toDecimals)) / toPrice
330
+ : 0;
331
+ const rebaseFeeOutRate = await this.rebaseFeeRate(toToken, false, estimatedToAmount);
332
+ const rebaseFeeOutValue = swapValue * rebaseFeeOutRate;
333
+ const swapImpactCfg = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getSwapImpactConfig).call(this);
334
+ const swapImpactFeeValue = swapImpactCfg?.enabled
335
+ ? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeSwapImpactFeeValue).call(_a, swapValue, totalVaultsValue, swapImpactCfg.impactMultiplier, swapImpactCfg.maxImpactRate)
336
+ : 0;
337
+ const emaCfg = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getEmaVolatilityFeeConfig).call(this);
338
+ const emaVolatilityFeeValue = emaCfg?.enabled
339
+ ? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeEmaVolatilityFeeValue).call(_a, swapValue, __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_maxEmaDivergenceRate).call(_a, fromFeed, toFeed), emaCfg.multiplier, emaCfg.maxFeeRate)
340
+ : 0;
341
+ const totalFeeValue = rebaseFeeInValue + rebaseFeeOutValue + swapImpactFeeValue + emaVolatilityFeeValue;
342
+ const totalFeeRate = swapValue !== 0 ? totalFeeValue / swapValue : 0;
343
+ return {
344
+ swapValue,
345
+ totalVaultsValue,
346
+ rebaseFeeInRate,
347
+ rebaseFeeOutRate,
348
+ rebaseFeeInValue,
349
+ rebaseFeeOutValue,
350
+ swapImpactFeeValue,
351
+ emaVolatilityFeeValue,
352
+ totalFeeValue,
353
+ totalFeeRate,
354
+ };
355
+ }
298
356
  async getPositionCapInfoList(owner) {
299
357
  const positionCapInfoList = [];
300
358
  let cursor;
@@ -509,8 +567,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
509
567
  showContent: true,
510
568
  },
511
569
  });
512
- const model = ZLPDataAPI.parseRebaseFeeModel(rawData);
513
- const exponent = await ZLPDataAPI.getRebaseFeeExponent(this.provider, this.consts.zoCore.rebaseFeeModel, this.consts.zoCore.upgradedPackage);
570
+ const model = _a.parseRebaseFeeModel(rawData);
571
+ const exponent = await _a.getRebaseFeeExponent(this.provider, this.consts.zoCore.rebaseFeeModel, this.consts.zoCore.upgradedPackage);
514
572
  return { ...model, exponent };
515
573
  }
516
574
  async fundingFeeRate(indexToken, long) {
@@ -524,9 +582,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
524
582
  const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
525
583
  const model = symbol.fundingFeeModel;
526
584
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
527
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
585
+ const deltaSize = _a.calcDeltaSize(symbol, price);
528
586
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
529
- return ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
587
+ return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
530
588
  }
531
589
  const longSymbol = await this.getSymbolInfo(indexToken, true);
532
590
  const shortSymbol = await this.getSymbolInfo(indexToken, false);
@@ -536,7 +594,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
536
594
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
537
595
  const longSize = longSymbol.openingSize;
538
596
  const shortSize = shortSymbol.openingSize;
539
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed);
597
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
540
598
  return long ? deltaRate : -deltaRate;
541
599
  }
542
600
  async rebaseFeeRate(collateralToken, increase, amount) {
@@ -547,7 +605,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
547
605
  const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
548
606
  const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
549
607
  const vaultInfo = await this.getVaultInfo(vault);
550
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
608
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
551
609
  const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
552
610
  if (collateralToken === vault) {
553
611
  vaultValue = res;
@@ -559,13 +617,13 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
559
617
  const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
560
618
  .map(e => Number.parseInt(e.weight, 10))
561
619
  .reduce((acc, curr) => acc + curr, 0);
562
- return ZLPDataAPI.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
620
+ return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
563
621
  }
564
622
  async reservingFeeRate(collateralToken, amount = 0) {
565
623
  const vaultInfo = await this.getVaultInfo(collateralToken);
566
624
  const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
567
625
  const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
568
- return ZLPDataAPI.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
626
+ return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
569
627
  }
570
628
  async getHistory(trader, page, limit, orderType, symbol) {
571
629
  const params = new URLSearchParams({
@@ -605,47 +663,68 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
605
663
  const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
606
664
  return pnlPerRate >= 0 ? -secondsRate : secondsRate;
607
665
  }
608
- static calcOiFundingFeeRate(model, longSize, shortSize, elapsed) {
609
- const imbalance = Math.abs(longSize - shortSize);
610
- // multiplier = 0.1%, exponent = 1
611
- const dailyRate = Math.min(model.multiplier * (imbalance ** model.exponent) / (longSize + shortSize > 0 ? longSize + shortSize : 1), model.max);
612
- const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
613
- return longSize >= shortSize ? secondsRate : -secondsRate;
666
+ /**
667
+ * OI funding rate matching Move compute_oi_funding_rate_capped.
668
+ * When both maxOiLong and maxOiShort are set and > 0, uses normalized skew (oi/cap);
669
+ * otherwise falls back to (long - short) / total.
670
+ */
671
+ static calcOiFundingFeeRate(model, oiLong, oiShort, elapsed, maxOiLong, maxOiShort) {
672
+ let skew;
673
+ if (maxOiLong && maxOiShort && maxOiLong > 0 && maxOiShort > 0) {
674
+ const normLong = Math.min(oiLong / maxOiLong, 1);
675
+ const normShort = Math.min(oiShort / maxOiShort, 1);
676
+ skew = normLong - normShort;
677
+ }
678
+ else {
679
+ const total = oiLong + oiShort;
680
+ if (total === 0)
681
+ return 0;
682
+ skew = (oiLong - oiShort) / total;
683
+ }
684
+ if (skew === 0)
685
+ return 0;
686
+ const skewIsPositive = skew > 0;
687
+ const skewAbs = Math.abs(skew);
688
+ const exponentInt = Math.floor(model.exponent);
689
+ const skewPow = skewAbs ** exponentInt;
690
+ const dailyRate = Math.min(model.multiplier * skewPow, model.max);
691
+ const secondsRate = (dailyRate * elapsed) / consts_1.SECONDS_PER_EIGHT_HOUR;
692
+ return skewIsPositive ? secondsRate : -secondsRate;
614
693
  }
615
- static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
694
+ static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
616
695
  if (symbol.lastUpdate > 0) {
617
696
  const elapsed = timestamp - symbol.lastUpdate;
618
697
  if (elapsed > 0) {
619
- // Prefer OI-based delta when model and paired side are available
620
- if (oiModel && typeof pairedOpeningSize === 'number') {
698
+ // Prefer OI-based delta when state and paired side are available
699
+ if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
621
700
  const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
622
701
  const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
623
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiModel, longSize, shortSize, elapsed);
702
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
624
703
  const appliedRate = symbol.long ? deltaRate : -deltaRate;
625
704
  return symbol.accFundingRate + appliedRate;
626
705
  }
627
706
  // Fallback to PnL-based funding delta
628
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
707
+ const deltaSize = _a.calcDeltaSize(symbol, price);
629
708
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
630
- return symbol.accFundingRate + ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
709
+ return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
631
710
  }
632
711
  }
633
712
  return symbol.accFundingRate;
634
713
  }
635
- static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
636
- const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
714
+ static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
715
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
637
716
  return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
638
717
  }
639
718
  static calculatePositionReserveFee(position, vault, model, timestamp) {
640
- const accReservingRate = ZLPDataAPI.calcAccReservingFeeRate(vault, model, timestamp);
719
+ const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
641
720
  return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
642
721
  }
643
722
  static calcAccReservingFeeRate(vault, model, timestamp) {
644
723
  if (vault.lastUpdate > 0) {
645
724
  const elapsed = timestamp - vault.lastUpdate;
646
725
  if (elapsed > 0) {
647
- const utilization = ZLPDataAPI.vaultUtilization(vault);
648
- return vault.accReservingRate + ZLPDataAPI.calcReservingFeeRate(model, utilization, elapsed);
726
+ const utilization = _a.vaultUtilization(vault);
727
+ return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
649
728
  }
650
729
  }
651
730
  return vault.accReservingRate;
@@ -693,7 +772,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
693
772
  showContent: true,
694
773
  },
695
774
  });
696
- const reservingFeeModel = ZLPDataAPI.parseReservingFeeModel(reservingFeeModelRaw);
775
+ const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
697
776
  return {
698
777
  liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
699
778
  reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
@@ -721,7 +800,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
721
800
  showContent: true,
722
801
  },
723
802
  });
724
- const fundingFeeModel = ZLPDataAPI.parseFundingFeeModel(fundingFeeModelRaw);
803
+ const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
725
804
  return {
726
805
  objectId,
727
806
  openingSize: (0, utils_2.parseValue)(fields.opening_size),
@@ -800,15 +879,15 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
800
879
  closed: positionFields.closed,
801
880
  openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
802
881
  };
803
- positionInfo.reservingFeeAmount = ZLPDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
882
+ positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
804
883
  // OI context for funding: fetch state and paired side size when enabled
805
884
  const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
806
885
  const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
807
- positionInfo.fundingFeeValue = ZLPDataAPI.calculatePositionFundingFee(positionInfo, await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long), (await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long)).fundingFeeModel, (await this.getOraclePrice(positionInfo.indexToken)).getPriceUnchecked().getPriceAsNumberUnchecked(), (await this.getMarketInfo()).lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState.model : undefined, pairedSymbol.openingSize);
886
+ positionInfo.fundingFeeValue = _a.calculatePositionFundingFee(positionInfo, await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long), (await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long)).fundingFeeModel, (await this.getOraclePrice(positionInfo.indexToken)).getPriceUnchecked().getPriceAsNumberUnchecked(), (await this.getMarketInfo()).lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedSymbol.openingSize);
808
887
  return positionInfo;
809
888
  }
810
- static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
811
- const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
889
+ static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
890
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
812
891
  return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
813
892
  }
814
893
  static parseRebaseFeeModel(raw) {
@@ -869,6 +948,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
869
948
  exponent: (0, utils_2.parseValue)(content.model.fields.exponent),
870
949
  max: (0, utils_2.parseValue)(content.model.fields.max),
871
950
  },
951
+ maxOiLong: content.max_oi_long !== null && content.max_oi_long !== undefined ? (0, utils_2.parseValue)(content.max_oi_long) : undefined,
952
+ maxOiShort: content.max_oi_short !== null && content.max_oi_short !== undefined ? (0, utils_2.parseValue)(content.max_oi_short) : undefined,
872
953
  };
873
954
  }
874
955
  static parsePriceImpactConfig(raw) {
@@ -1054,9 +1135,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1054
1135
  endSkew = 1;
1055
1136
  }
1056
1137
  // Compute average dynamic spread via integral
1057
- const avgDynamicRate = ZLPDataAPI.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1138
+ const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1058
1139
  // Apply size scaling factor to dynamic spread
1059
- const sizeFactor = ZLPDataAPI.computeSizeFactor(newPositionSize, config.referenceSize);
1140
+ const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
1060
1141
  const scaledDynamicRate = avgDynamicRate * sizeFactor;
1061
1142
  // total_spread = base_spread + scaled_dynamic
1062
1143
  let totalSpread = config.baseSpreadRate + scaledDynamicRate;
@@ -1127,9 +1208,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1127
1208
  const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
1128
1209
  const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
1129
1210
  // Compute average spread rate (uses integration for better accuracy on large trades)
1130
- const spreadRate = ZLPDataAPI.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1211
+ const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1131
1212
  // Apply price impact
1132
- const adjustedPrice = ZLPDataAPI.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1213
+ const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1133
1214
  return {
1134
1215
  spreadRate,
1135
1216
  originalPrice: oraclePrice,
@@ -1245,7 +1326,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1245
1326
  accRewardPerShare: BigInt(content.acc_reward_per_share),
1246
1327
  lockDuration: (0, utils_2.parseValue)(content.lock_duration),
1247
1328
  };
1248
- ZLPDataAPI.refreshPool(pool, Math.floor(Date.now() / 1000));
1329
+ _a.refreshPool(pool, Math.floor(Date.now() / 1000));
1249
1330
  return pool;
1250
1331
  }
1251
1332
  static refreshPool(pool, timestamp) {
@@ -1264,4 +1345,84 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1264
1345
  }
1265
1346
  }
1266
1347
  exports.ZLPDataAPI = ZLPDataAPI;
1348
+ _a = ZLPDataAPI, _ZLPDataAPI_instances = new WeakSet(), _ZLPDataAPI_getTotalVaultsValueUsd = async function _ZLPDataAPI_getTotalVaultsValueUsd(timestamp) {
1349
+ const vaultKeys = Object.keys(this.consts.zoCore.vaults);
1350
+ const vaultValues = await Promise.all(vaultKeys.map(async (vault) => {
1351
+ const vaultInfo = await this.getVaultInfo(vault);
1352
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, timestamp);
1353
+ const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
1354
+ const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
1355
+ const { decimals } = this.consts.coins[vault];
1356
+ return totalVaultAmount * oraclePrice / (10 ** decimals);
1357
+ }));
1358
+ return vaultValues.reduce((acc, curr) => acc + curr, 0);
1359
+ }, _ZLPDataAPI_getSwapImpactConfig = async function _ZLPDataAPI_getSwapImpactConfig() {
1360
+ const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'SwapImpactConfigKey');
1361
+ if (!raw)
1362
+ return null;
1363
+ return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseSwapImpactConfig).call(_a, raw);
1364
+ }, _ZLPDataAPI_getEmaVolatilityFeeConfig = async function _ZLPDataAPI_getEmaVolatilityFeeConfig() {
1365
+ const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'EmaVolatilityFeeConfigKey');
1366
+ if (!raw)
1367
+ return null;
1368
+ return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseEmaVolatilityFeeConfig).call(_a, raw);
1369
+ }, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix = async function _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix(parentId, keyTypeSuffix) {
1370
+ let cursor;
1371
+ let hasNextPage = true;
1372
+ while (hasNextPage) {
1373
+ const page = await this.provider.getDynamicFields({ parentId, cursor });
1374
+ for (const field of page.data) {
1375
+ const type = field.name?.type;
1376
+ if (typeof type === 'string' && type.endsWith(`::${keyTypeSuffix}`)) {
1377
+ return await this.provider.getDynamicFieldObject({
1378
+ parentId,
1379
+ name: field.name,
1380
+ });
1381
+ }
1382
+ }
1383
+ hasNextPage = page.hasNextPage;
1384
+ cursor = page.nextCursor;
1385
+ }
1386
+ return null;
1387
+ }, _ZLPDataAPI_parseSwapImpactConfig = function _ZLPDataAPI_parseSwapImpactConfig(raw) {
1388
+ const { fields } = raw.data.content;
1389
+ return {
1390
+ id: fields.id.id,
1391
+ enabled: fields.enabled,
1392
+ impactMultiplier: (0, utils_2.parseValue)(fields.impact_multiplier),
1393
+ maxImpactRate: (0, utils_2.parseValue)(fields.max_impact_rate),
1394
+ };
1395
+ }, _ZLPDataAPI_parseEmaVolatilityFeeConfig = function _ZLPDataAPI_parseEmaVolatilityFeeConfig(raw) {
1396
+ const { fields } = raw.data.content;
1397
+ return {
1398
+ id: fields.id.id,
1399
+ enabled: fields.enabled,
1400
+ multiplier: (0, utils_2.parseValue)(fields.multiplier),
1401
+ maxFeeRate: (0, utils_2.parseValue)(fields.max_fee_rate),
1402
+ };
1403
+ }, _ZLPDataAPI_computeSwapImpactFeeValue = function _ZLPDataAPI_computeSwapImpactFeeValue(swapValue, totalVaultsValue, impactMultiplier, maxImpactRate) {
1404
+ if (swapValue <= 0 || totalVaultsValue <= 0)
1405
+ return 0;
1406
+ const utilization = swapValue / totalVaultsValue;
1407
+ const rawImpactRate = impactMultiplier * utilization;
1408
+ const impactRate = Math.min(rawImpactRate, maxImpactRate);
1409
+ return swapValue * impactRate;
1410
+ }, _ZLPDataAPI_computeEmaVolatilityFeeValue = function _ZLPDataAPI_computeEmaVolatilityFeeValue(swapValue, maxDiv, multiplier, maxFeeRate) {
1411
+ if (swapValue <= 0 || maxDiv <= 0)
1412
+ return 0;
1413
+ const rawFeeRate = multiplier * maxDiv;
1414
+ const feeRate = Math.min(rawFeeRate, maxFeeRate);
1415
+ return swapValue * feeRate;
1416
+ }, _ZLPDataAPI_maxEmaDivergenceRate = function _ZLPDataAPI_maxEmaDivergenceRate(sourceFeed, destFeed) {
1417
+ const sourceDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, sourceFeed);
1418
+ const destDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, destFeed);
1419
+ return Math.max(sourceDiv, destDiv);
1420
+ }, _ZLPDataAPI_emaDivergenceRate = function _ZLPDataAPI_emaDivergenceRate(priceFeed) {
1421
+ const price = priceFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
1422
+ const ema = priceFeed.getEmaPriceUnchecked().getPriceAsNumberUnchecked();
1423
+ const denom = Math.abs(price);
1424
+ if (denom === 0)
1425
+ return 0;
1426
+ return Math.abs(price - ema) / denom;
1427
+ };
1267
1428
  //# sourceMappingURL=ZLPDataAPI.cjs.map