@zofai/zo-sdk 0.1.93 → 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 +212 -47
  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 +212 -47
  11. package/dist/implementations/SLPDataAPI.mjs.map +1 -1
  12. package/dist/implementations/USDZDataAPI.cjs +197 -44
  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 +197 -44
  19. package/dist/implementations/USDZDataAPI.mjs.map +1 -1
  20. package/dist/implementations/ZLPDataAPI.cjs +200 -46
  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 +200 -46
  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 +6 -1
  33. package/dist/interfaces/slp.d.cts.map +1 -1
  34. package/dist/interfaces/slp.d.mts +6 -1
  35. package/dist/interfaces/slp.d.mts.map +1 -1
  36. package/dist/interfaces/usdz.d.cts +6 -1
  37. package/dist/interfaces/usdz.d.cts.map +1 -1
  38. package/dist/interfaces/usdz.d.mts +6 -1
  39. package/dist/interfaces/usdz.d.mts.map +1 -1
  40. package/dist/interfaces/zlp.d.cts +6 -1
  41. package/dist/interfaces/zlp.d.cts.map +1 -1
  42. package/dist/interfaces/zlp.d.mts +6 -1
  43. package/dist/interfaces/zlp.d.mts.map +1 -1
  44. package/package.json +1 -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 +235 -19
  49. package/src/implementations/USDZDataAPI.ts +221 -16
  50. package/src/implementations/ZLPDataAPI.ts +222 -17
  51. package/src/interfaces/base.ts +26 -0
  52. package/src/interfaces/slp.ts +6 -0
  53. package/src/interfaces/usdz.ts +6 -0
  54. package/src/interfaces/zlp.ts +6 -0
@@ -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
@@ -143,7 +150,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
143
150
  const vaultKeys = Object.keys(this.consts.zoCore.vaults);
144
151
  const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
145
152
  const vaultInfo = await this.getVaultInfo(vault);
146
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
153
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
147
154
  const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
148
155
  const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
149
156
  const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
@@ -155,10 +162,10 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
155
162
  const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
156
163
  const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
157
164
  const price = (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked();
158
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbolInfo, price);
165
+ const deltaSize = _a.calcDeltaSize(symbolInfo, price);
159
166
  const oiState = await this.getSymbolOiFundingState(tokenId);
160
167
  const pairedInfo = await this.getSymbolInfo(tokenId, direction !== 'long');
161
- 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);
162
169
  return fundingFeeDelta + deltaSize;
163
170
  });
164
171
  const symbolValues = await Promise.all(symbolPromises);
@@ -187,7 +194,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
187
194
  showContent: true,
188
195
  },
189
196
  });
190
- return ZLPDataAPI.parseMarketInfo(rawData);
197
+ return _a.parseMarketInfo(rawData);
191
198
  }
192
199
  /**
193
200
  * Gets ZLP vault information
@@ -236,7 +243,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
236
243
  showContent: true,
237
244
  },
238
245
  });
239
- return ZLPDataAPI.parsePositionConfig(rawData);
246
+ return _a.parsePositionConfig(rawData);
240
247
  }
241
248
  /**
242
249
  * Gets ZLP symbol configuration
@@ -251,7 +258,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
251
258
  value: { dummy_field: false },
252
259
  },
253
260
  });
254
- return ZLPDataAPI.parseSymbolConfig(rawData);
261
+ return _a.parseSymbolConfig(rawData);
255
262
  }
256
263
  catch (e) {
257
264
  // If the dynamic field doesn't exist, return null
@@ -272,7 +279,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
272
279
  value: { dummy_field: false },
273
280
  },
274
281
  });
275
- return ZLPDataAPI.parseOiFundingState(rawData);
282
+ return _a.parseOiFundingState(rawData);
276
283
  }
277
284
  catch (e) {
278
285
  // If the dynamic field doesn't exist, return null
@@ -294,7 +301,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
294
301
  value: { dummy_field: false },
295
302
  },
296
303
  });
297
- return ZLPDataAPI.parsePriceImpactConfig(rawData);
304
+ return _a.parsePriceImpactConfig(rawData);
298
305
  }
299
306
  catch (e) {
300
307
  // If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
@@ -302,6 +309,50 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
302
309
  return null;
303
310
  }
304
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
+ }
305
356
  async getPositionCapInfoList(owner) {
306
357
  const positionCapInfoList = [];
307
358
  let cursor;
@@ -516,8 +567,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
516
567
  showContent: true,
517
568
  },
518
569
  });
519
- const model = ZLPDataAPI.parseRebaseFeeModel(rawData);
520
- 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);
521
572
  return { ...model, exponent };
522
573
  }
523
574
  async fundingFeeRate(indexToken, long) {
@@ -531,9 +582,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
531
582
  const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
532
583
  const model = symbol.fundingFeeModel;
533
584
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
534
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
585
+ const deltaSize = _a.calcDeltaSize(symbol, price);
535
586
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
536
- return ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
587
+ return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
537
588
  }
538
589
  const longSymbol = await this.getSymbolInfo(indexToken, true);
539
590
  const shortSymbol = await this.getSymbolInfo(indexToken, false);
@@ -543,7 +594,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
543
594
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
544
595
  const longSize = longSymbol.openingSize;
545
596
  const shortSize = shortSymbol.openingSize;
546
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed);
597
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
547
598
  return long ? deltaRate : -deltaRate;
548
599
  }
549
600
  async rebaseFeeRate(collateralToken, increase, amount) {
@@ -554,7 +605,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
554
605
  const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
555
606
  const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
556
607
  const vaultInfo = await this.getVaultInfo(vault);
557
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
608
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
558
609
  const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
559
610
  if (collateralToken === vault) {
560
611
  vaultValue = res;
@@ -566,13 +617,13 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
566
617
  const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
567
618
  .map(e => Number.parseInt(e.weight, 10))
568
619
  .reduce((acc, curr) => acc + curr, 0);
569
- 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);
570
621
  }
571
622
  async reservingFeeRate(collateralToken, amount = 0) {
572
623
  const vaultInfo = await this.getVaultInfo(collateralToken);
573
624
  const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
574
625
  const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
575
- 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);
576
627
  }
577
628
  async getHistory(trader, page, limit, orderType, symbol) {
578
629
  const params = new URLSearchParams({
@@ -612,47 +663,68 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
612
663
  const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
613
664
  return pnlPerRate >= 0 ? -secondsRate : secondsRate;
614
665
  }
615
- static calcOiFundingFeeRate(model, longSize, shortSize, elapsed) {
616
- const imbalance = Math.abs(longSize - shortSize);
617
- // multiplier = 0.1%, exponent = 1
618
- const dailyRate = Math.min(model.multiplier * (imbalance ** model.exponent) / (longSize + shortSize > 0 ? longSize + shortSize : 1), model.max);
619
- const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
620
- 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;
621
693
  }
622
- static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
694
+ static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
623
695
  if (symbol.lastUpdate > 0) {
624
696
  const elapsed = timestamp - symbol.lastUpdate;
625
697
  if (elapsed > 0) {
626
- // Prefer OI-based delta when model and paired side are available
627
- 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') {
628
700
  const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
629
701
  const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
630
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiModel, longSize, shortSize, elapsed);
702
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
631
703
  const appliedRate = symbol.long ? deltaRate : -deltaRate;
632
704
  return symbol.accFundingRate + appliedRate;
633
705
  }
634
706
  // Fallback to PnL-based funding delta
635
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
707
+ const deltaSize = _a.calcDeltaSize(symbol, price);
636
708
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
637
- return symbol.accFundingRate + ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
709
+ return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
638
710
  }
639
711
  }
640
712
  return symbol.accFundingRate;
641
713
  }
642
- static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
643
- 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);
644
716
  return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
645
717
  }
646
718
  static calculatePositionReserveFee(position, vault, model, timestamp) {
647
- const accReservingRate = ZLPDataAPI.calcAccReservingFeeRate(vault, model, timestamp);
719
+ const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
648
720
  return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
649
721
  }
650
722
  static calcAccReservingFeeRate(vault, model, timestamp) {
651
723
  if (vault.lastUpdate > 0) {
652
724
  const elapsed = timestamp - vault.lastUpdate;
653
725
  if (elapsed > 0) {
654
- const utilization = ZLPDataAPI.vaultUtilization(vault);
655
- return vault.accReservingRate + ZLPDataAPI.calcReservingFeeRate(model, utilization, elapsed);
726
+ const utilization = _a.vaultUtilization(vault);
727
+ return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
656
728
  }
657
729
  }
658
730
  return vault.accReservingRate;
@@ -700,7 +772,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
700
772
  showContent: true,
701
773
  },
702
774
  });
703
- const reservingFeeModel = ZLPDataAPI.parseReservingFeeModel(reservingFeeModelRaw);
775
+ const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
704
776
  return {
705
777
  liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
706
778
  reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
@@ -728,7 +800,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
728
800
  showContent: true,
729
801
  },
730
802
  });
731
- const fundingFeeModel = ZLPDataAPI.parseFundingFeeModel(fundingFeeModelRaw);
803
+ const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
732
804
  return {
733
805
  objectId,
734
806
  openingSize: (0, utils_2.parseValue)(fields.opening_size),
@@ -807,15 +879,15 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
807
879
  closed: positionFields.closed,
808
880
  openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
809
881
  };
810
- 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);
811
883
  // OI context for funding: fetch state and paired side size when enabled
812
884
  const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
813
885
  const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
814
- 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);
815
887
  return positionInfo;
816
888
  }
817
- static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
818
- 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);
819
891
  return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
820
892
  }
821
893
  static parseRebaseFeeModel(raw) {
@@ -876,6 +948,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
876
948
  exponent: (0, utils_2.parseValue)(content.model.fields.exponent),
877
949
  max: (0, utils_2.parseValue)(content.model.fields.max),
878
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,
879
953
  };
880
954
  }
881
955
  static parsePriceImpactConfig(raw) {
@@ -1061,9 +1135,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1061
1135
  endSkew = 1;
1062
1136
  }
1063
1137
  // Compute average dynamic spread via integral
1064
- const avgDynamicRate = ZLPDataAPI.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1138
+ const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1065
1139
  // Apply size scaling factor to dynamic spread
1066
- const sizeFactor = ZLPDataAPI.computeSizeFactor(newPositionSize, config.referenceSize);
1140
+ const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
1067
1141
  const scaledDynamicRate = avgDynamicRate * sizeFactor;
1068
1142
  // total_spread = base_spread + scaled_dynamic
1069
1143
  let totalSpread = config.baseSpreadRate + scaledDynamicRate;
@@ -1134,9 +1208,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1134
1208
  const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
1135
1209
  const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
1136
1210
  // Compute average spread rate (uses integration for better accuracy on large trades)
1137
- const spreadRate = ZLPDataAPI.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1211
+ const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1138
1212
  // Apply price impact
1139
- const adjustedPrice = ZLPDataAPI.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1213
+ const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1140
1214
  return {
1141
1215
  spreadRate,
1142
1216
  originalPrice: oraclePrice,
@@ -1252,7 +1326,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1252
1326
  accRewardPerShare: BigInt(content.acc_reward_per_share),
1253
1327
  lockDuration: (0, utils_2.parseValue)(content.lock_duration),
1254
1328
  };
1255
- ZLPDataAPI.refreshPool(pool, Math.floor(Date.now() / 1000));
1329
+ _a.refreshPool(pool, Math.floor(Date.now() / 1000));
1256
1330
  return pool;
1257
1331
  }
1258
1332
  static refreshPool(pool, timestamp) {
@@ -1271,4 +1345,84 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
1271
1345
  }
1272
1346
  }
1273
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
+ };
1274
1428
  //# sourceMappingURL=ZLPDataAPI.cjs.map