@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
  * USDZ DataAPI implementation
5
5
  * Implements USDZ-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 _USDZDataAPI_instances, _a, _USDZDataAPI_getTotalVaultsValueUsd, _USDZDataAPI_getSwapImpactConfig, _USDZDataAPI_getEmaVolatilityFeeConfig, _USDZDataAPI_getMarketDynamicFieldObjectByKeySuffix, _USDZDataAPI_parseSwapImpactConfig, _USDZDataAPI_parseEmaVolatilityFeeConfig, _USDZDataAPI_computeSwapImpactFeeValue, _USDZDataAPI_computeEmaVolatilityFeeValue, _USDZDataAPI_maxEmaDivergenceRate, _USDZDataAPI_emaDivergenceRate;
7
13
  Object.defineProperty(exports, "__esModule", { value: true });
8
14
  exports.USDZDataAPI = void 0;
9
15
  const utils_1 = require("@mysten/sui/utils");
@@ -13,6 +19,7 @@ const utils_2 = require("../utils.cjs");
13
19
  class USDZDataAPI extends abstract_1.BaseDataAPI {
14
20
  constructor(network, provider, apiEndpoint, connectionURL) {
15
21
  super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.USDZ);
22
+ _USDZDataAPI_instances.add(this);
16
23
  }
17
24
  async getStaked(owner) {
18
25
  let rawCredentialsData = [];
@@ -45,7 +52,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
45
52
  const credentials = rawCredentialsData
46
53
  .filter((item) => item.data.type
47
54
  === `${this.sharedConfig.zoStaking.package}::pool::Credential<${this.consts.zoCore.package}::usdz::USDZ, 0x2::sui::SUI>`)
48
- .map((item) => USDZDataAPI.parseCredential(item, pool));
55
+ .map((item) => _a.parseCredential(item, pool));
49
56
  return {
50
57
  credentials,
51
58
  amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
@@ -60,7 +67,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
60
67
  showContent: true,
61
68
  },
62
69
  });
63
- return USDZDataAPI.parseStakePool(raw);
70
+ return _a.parseStakePool(raw);
64
71
  }
65
72
  /**
66
73
  * Creates vaults valuation for USDZ
@@ -142,7 +149,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
142
149
  const vaultKeys = Object.keys(this.consts.zoCore.vaults);
143
150
  const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
144
151
  const vaultInfo = await this.getVaultInfo(vault);
145
- const reservingFeeDelta = USDZDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
152
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
146
153
  const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
147
154
  const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
148
155
  const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
@@ -153,11 +160,11 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
153
160
  const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
154
161
  const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
155
162
  const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
156
- const deltaSize = USDZDataAPI.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked());
163
+ const deltaSize = _a.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked());
157
164
  // OI context for funding fee delta
158
165
  const oiState = await this.getSymbolOiFundingState(tokenId);
159
166
  const pairedSymbol = await this.getSymbolInfo(tokenId, !(direction === 'long'));
160
- const fundingFeeDelta = USDZDataAPI.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked(), marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState.model : undefined, pairedSymbol.openingSize);
167
+ const fundingFeeDelta = _a.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked(), marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedSymbol.openingSize);
161
168
  return fundingFeeDelta + deltaSize;
162
169
  });
163
170
  const symbolValues = await Promise.all(symbolPromises);
@@ -186,7 +193,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
186
193
  showContent: true,
187
194
  },
188
195
  });
189
- return USDZDataAPI.parseMarketInfo(rawData);
196
+ return _a.parseMarketInfo(rawData);
190
197
  }
191
198
  /**
192
199
  * Gets USDZ vault information
@@ -235,7 +242,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
235
242
  showContent: true,
236
243
  },
237
244
  });
238
- return USDZDataAPI.parsePositionConfig(rawData);
245
+ return _a.parsePositionConfig(rawData);
239
246
  }
240
247
  /**
241
248
  * Gets USDZ symbol configuration
@@ -250,7 +257,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
250
257
  value: { dummy_field: false },
251
258
  },
252
259
  });
253
- return USDZDataAPI.parseSymbolConfig(rawData);
260
+ return _a.parseSymbolConfig(rawData);
254
261
  }
255
262
  catch {
256
263
  // If the dynamic field doesn't exist, return null
@@ -271,7 +278,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
271
278
  value: { dummy_field: false },
272
279
  },
273
280
  });
274
- return USDZDataAPI.parseOiFundingState(rawData);
281
+ return _a.parseOiFundingState(rawData);
275
282
  }
276
283
  catch (e) {
277
284
  console.error('Error Fetching USDZ Symbol OI Funding State:', e);
@@ -292,7 +299,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
292
299
  value: { dummy_field: false },
293
300
  },
294
301
  });
295
- return USDZDataAPI.parsePriceImpactConfig(rawData);
302
+ return _a.parsePriceImpactConfig(rawData);
296
303
  }
297
304
  catch (e) {
298
305
  // If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
@@ -300,6 +307,49 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
300
307
  return null;
301
308
  }
302
309
  }
310
+ async calculateSwapFeeBreakdown(fromToken, toToken, fromAmount) {
311
+ const timestamp = Date.now() / 1000;
312
+ const fromDecimals = this.consts.coins[fromToken]?.decimals;
313
+ const toDecimals = this.consts.coins[toToken]?.decimals;
314
+ if (fromDecimals === undefined || toDecimals === undefined) {
315
+ throw new Error(`Unknown token decimals for swap: ${fromToken} -> ${toToken}`);
316
+ }
317
+ const fromFeed = await this.getOraclePrice(fromToken);
318
+ const toFeed = await this.getOraclePrice(toToken);
319
+ const fromPrice = fromFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
320
+ const toPrice = toFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
321
+ const swapValue = (fromAmount * fromPrice) / (10 ** fromDecimals);
322
+ const totalVaultsValue = await __classPrivateFieldGet(this, _USDZDataAPI_instances, "m", _USDZDataAPI_getTotalVaultsValueUsd).call(this, timestamp);
323
+ const rebaseFeeInRate = await this.rebaseFeeRate(fromToken, true, fromAmount);
324
+ const rebaseFeeInValue = swapValue * rebaseFeeInRate;
325
+ const estimatedToAmount = toPrice !== 0
326
+ ? (swapValue * (10 ** toDecimals)) / toPrice
327
+ : 0;
328
+ const rebaseFeeOutRate = await this.rebaseFeeRate(toToken, false, estimatedToAmount);
329
+ const rebaseFeeOutValue = swapValue * rebaseFeeOutRate;
330
+ const swapImpactCfg = await __classPrivateFieldGet(this, _USDZDataAPI_instances, "m", _USDZDataAPI_getSwapImpactConfig).call(this);
331
+ const swapImpactFeeValue = swapImpactCfg?.enabled
332
+ ? __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_computeSwapImpactFeeValue).call(_a, swapValue, totalVaultsValue, swapImpactCfg.impactMultiplier, swapImpactCfg.maxImpactRate)
333
+ : 0;
334
+ const emaCfg = await __classPrivateFieldGet(this, _USDZDataAPI_instances, "m", _USDZDataAPI_getEmaVolatilityFeeConfig).call(this);
335
+ const emaVolatilityFeeValue = emaCfg?.enabled
336
+ ? __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_computeEmaVolatilityFeeValue).call(_a, swapValue, __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_maxEmaDivergenceRate).call(_a, fromFeed, toFeed), emaCfg.multiplier, emaCfg.maxFeeRate)
337
+ : 0;
338
+ const totalFeeValue = rebaseFeeInValue + rebaseFeeOutValue + swapImpactFeeValue + emaVolatilityFeeValue;
339
+ const totalFeeRate = swapValue !== 0 ? totalFeeValue / swapValue : 0;
340
+ return {
341
+ swapValue,
342
+ totalVaultsValue,
343
+ rebaseFeeInRate,
344
+ rebaseFeeOutRate,
345
+ rebaseFeeInValue,
346
+ rebaseFeeOutValue,
347
+ swapImpactFeeValue,
348
+ emaVolatilityFeeValue,
349
+ totalFeeValue,
350
+ totalFeeRate,
351
+ };
352
+ }
303
353
  async getPositionCapInfoList(owner) {
304
354
  const positionCapInfoList = [];
305
355
  let cursor;
@@ -489,7 +539,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
489
539
  showContent: true,
490
540
  },
491
541
  });
492
- return USDZDataAPI.parseRebaseFeeModel(rawData);
542
+ return _a.parseRebaseFeeModel(rawData);
493
543
  }
494
544
  async fundingFeeRate(indexToken, long) {
495
545
  const oiState = await this.getSymbolOiFundingState(indexToken);
@@ -502,9 +552,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
502
552
  const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
503
553
  const model = symbol.fundingFeeModel;
504
554
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
505
- const deltaSize = USDZDataAPI.calcDeltaSize(symbol, price);
555
+ const deltaSize = _a.calcDeltaSize(symbol, price);
506
556
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
507
- return USDZDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
557
+ return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
508
558
  }
509
559
  // OI model enabled: rate based on long/short imbalance
510
560
  const longSymbol = await this.getSymbolInfo(indexToken, true);
@@ -515,7 +565,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
515
565
  const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
516
566
  const longSize = longSymbol.openingSize;
517
567
  const shortSize = shortSymbol.openingSize;
518
- const deltaRate = USDZDataAPI.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed);
568
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
519
569
  return long ? deltaRate : -deltaRate;
520
570
  }
521
571
  async rebaseFeeRate(collateralToken, increase, amount) {
@@ -526,7 +576,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
526
576
  const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
527
577
  const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
528
578
  const vaultInfo = await this.getVaultInfo(vault);
529
- const reservingFeeDelta = USDZDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
579
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
530
580
  const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
531
581
  if (collateralToken === vault) {
532
582
  vaultValue = res;
@@ -538,13 +588,13 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
538
588
  const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
539
589
  .map(e => Number.parseInt(e.weight, 10))
540
590
  .reduce((acc, curr) => acc + curr, 0);
541
- return USDZDataAPI.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
591
+ return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
542
592
  }
543
593
  async reservingFeeRate(collateralToken, amount = 0) {
544
594
  const vaultInfo = await this.getVaultInfo(collateralToken);
545
595
  const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
546
596
  const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
547
- return USDZDataAPI.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
597
+ return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
548
598
  }
549
599
  async getHistory(trader, page, limit, orderType, symbol) {
550
600
  const params = new URLSearchParams({
@@ -584,44 +634,65 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
584
634
  const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
585
635
  return pnlPerRate >= 0 ? -secondsRate : secondsRate;
586
636
  }
587
- static calcOiFundingFeeRate(model, longSize, shortSize, elapsed) {
588
- const imbalance = Math.abs(longSize - shortSize);
589
- const total = longSize + shortSize > 0 ? longSize + shortSize : 1;
590
- const dailyRate = Math.min((model.multiplier * (imbalance ** model.exponent)) / total, model.max);
591
- const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
592
- return longSize >= shortSize ? secondsRate : -secondsRate;
637
+ /**
638
+ * OI funding rate matching Move compute_oi_funding_rate_capped.
639
+ * When both maxOiLong and maxOiShort are set and > 0, uses normalized skew (oi/cap);
640
+ * otherwise falls back to (long - short) / total.
641
+ */
642
+ static calcOiFundingFeeRate(model, oiLong, oiShort, elapsed, maxOiLong, maxOiShort) {
643
+ let skew;
644
+ if (maxOiLong && maxOiShort && maxOiLong > 0 && maxOiShort > 0) {
645
+ const normLong = Math.min(oiLong / maxOiLong, 1);
646
+ const normShort = Math.min(oiShort / maxOiShort, 1);
647
+ skew = normLong - normShort;
648
+ }
649
+ else {
650
+ const total = oiLong + oiShort;
651
+ if (total === 0)
652
+ return 0;
653
+ skew = (oiLong - oiShort) / total;
654
+ }
655
+ if (skew === 0)
656
+ return 0;
657
+ const skewIsPositive = skew > 0;
658
+ const skewAbs = Math.abs(skew);
659
+ const exponentInt = Math.floor(model.exponent);
660
+ const skewPow = skewAbs ** exponentInt;
661
+ const dailyRate = Math.min(model.multiplier * skewPow, model.max);
662
+ const secondsRate = (dailyRate * elapsed) / consts_1.SECONDS_PER_EIGHT_HOUR;
663
+ return skewIsPositive ? secondsRate : -secondsRate;
593
664
  }
594
- static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
665
+ static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
595
666
  if (symbol.lastUpdate > 0) {
596
667
  const elapsed = timestamp - symbol.lastUpdate;
597
668
  if (elapsed > 0) {
598
- if (oiModel && typeof pairedOpeningSize === 'number') {
669
+ if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
599
670
  const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
600
671
  const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
601
- const deltaRate = USDZDataAPI.calcOiFundingFeeRate(oiModel, longSize, shortSize, elapsed);
672
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
602
673
  return symbol.accFundingRate + deltaRate;
603
674
  }
604
- const deltaSize = USDZDataAPI.calcDeltaSize(symbol, price);
675
+ const deltaSize = _a.calcDeltaSize(symbol, price);
605
676
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
606
- return symbol.accFundingRate + USDZDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
677
+ return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
607
678
  }
608
679
  }
609
680
  return symbol.accFundingRate;
610
681
  }
611
- static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
612
- const accFundingRate = USDZDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
682
+ static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
683
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
613
684
  return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
614
685
  }
615
686
  static calculatePositionReserveFee(position, vault, model, timestamp) {
616
- const accReservingRate = USDZDataAPI.calcAccReservingFeeRate(vault, model, timestamp);
687
+ const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
617
688
  return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
618
689
  }
619
690
  static calcAccReservingFeeRate(vault, model, timestamp) {
620
691
  if (vault.lastUpdate > 0) {
621
692
  const elapsed = timestamp - vault.lastUpdate;
622
693
  if (elapsed > 0) {
623
- const utilization = USDZDataAPI.vaultUtilization(vault);
624
- return vault.accReservingRate + USDZDataAPI.calcReservingFeeRate(model, utilization, elapsed);
694
+ const utilization = _a.vaultUtilization(vault);
695
+ return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
625
696
  }
626
697
  }
627
698
  return vault.accReservingRate;
@@ -668,7 +739,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
668
739
  showContent: true,
669
740
  },
670
741
  });
671
- const reservingFeeModel = USDZDataAPI.parseReservingFeeModel(reservingFeeModelRaw);
742
+ const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
672
743
  return {
673
744
  liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
674
745
  reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
@@ -696,7 +767,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
696
767
  showContent: true,
697
768
  },
698
769
  });
699
- const fundingFeeModel = USDZDataAPI.parseFundingFeeModel(fundingFeeModelRaw);
770
+ const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
700
771
  return {
701
772
  objectId,
702
773
  openingSize: (0, utils_2.parseValue)(fields.opening_size),
@@ -775,15 +846,15 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
775
846
  closed: positionFields.closed,
776
847
  openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
777
848
  };
778
- positionInfo.reservingFeeAmount = USDZDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
849
+ positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
779
850
  // OI context for funding: fetch state and paired side size when enabled
780
851
  const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
781
852
  const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
782
- positionInfo.fundingFeeValue = USDZDataAPI.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);
853
+ 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);
783
854
  return positionInfo;
784
855
  }
785
- static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
786
- const accFundingRate = USDZDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
856
+ static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
857
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
787
858
  return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
788
859
  }
789
860
  static parseRebaseFeeModel(raw) {
@@ -818,6 +889,8 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
818
889
  exponent: (0, utils_2.parseValue)(content.model.fields.exponent),
819
890
  max: (0, utils_2.parseValue)(content.model.fields.max),
820
891
  },
892
+ maxOiLong: content.max_oi_long !== null && content.max_oi_long !== undefined ? (0, utils_2.parseValue)(content.max_oi_long) : undefined,
893
+ maxOiShort: content.max_oi_short !== null && content.max_oi_short !== undefined ? (0, utils_2.parseValue)(content.max_oi_short) : undefined,
821
894
  };
822
895
  }
823
896
  static parsePriceImpactConfig(raw) {
@@ -1003,9 +1076,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
1003
1076
  endSkew = 1;
1004
1077
  }
1005
1078
  // Compute average dynamic spread via integral
1006
- const avgDynamicRate = USDZDataAPI.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1079
+ const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1007
1080
  // Apply size scaling factor to dynamic spread
1008
- const sizeFactor = USDZDataAPI.computeSizeFactor(newPositionSize, config.referenceSize);
1081
+ const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
1009
1082
  const scaledDynamicRate = avgDynamicRate * sizeFactor;
1010
1083
  // total_spread = base_spread + scaled_dynamic
1011
1084
  let totalSpread = config.baseSpreadRate + scaledDynamicRate;
@@ -1076,9 +1149,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
1076
1149
  const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
1077
1150
  const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
1078
1151
  // Compute average spread rate (uses integration for better accuracy on large trades)
1079
- const spreadRate = USDZDataAPI.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1152
+ const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1080
1153
  // Apply price impact
1081
- const adjustedPrice = USDZDataAPI.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1154
+ const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1082
1155
  return {
1083
1156
  spreadRate,
1084
1157
  originalPrice: oraclePrice,
@@ -1194,7 +1267,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
1194
1267
  accRewardPerShare: BigInt(content.acc_reward_per_share),
1195
1268
  lockDuration: (0, utils_2.parseValue)(content.lock_duration),
1196
1269
  };
1197
- USDZDataAPI.refreshPool(pool, Math.floor(Date.now() / 1000));
1270
+ _a.refreshPool(pool, Math.floor(Date.now() / 1000));
1198
1271
  return pool;
1199
1272
  }
1200
1273
  static refreshPool(pool, timestamp) {
@@ -1213,4 +1286,84 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
1213
1286
  }
1214
1287
  }
1215
1288
  exports.USDZDataAPI = USDZDataAPI;
1289
+ _a = USDZDataAPI, _USDZDataAPI_instances = new WeakSet(), _USDZDataAPI_getTotalVaultsValueUsd = async function _USDZDataAPI_getTotalVaultsValueUsd(timestamp) {
1290
+ const vaultKeys = Object.keys(this.consts.zoCore.vaults);
1291
+ const vaultValues = await Promise.all(vaultKeys.map(async (vault) => {
1292
+ const vaultInfo = await this.getVaultInfo(vault);
1293
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, timestamp);
1294
+ const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
1295
+ const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
1296
+ const { decimals } = this.consts.coins[vault];
1297
+ return totalVaultAmount * oraclePrice / (10 ** decimals);
1298
+ }));
1299
+ return vaultValues.reduce((acc, curr) => acc + curr, 0);
1300
+ }, _USDZDataAPI_getSwapImpactConfig = async function _USDZDataAPI_getSwapImpactConfig() {
1301
+ const raw = await __classPrivateFieldGet(this, _USDZDataAPI_instances, "m", _USDZDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'SwapImpactConfigKey');
1302
+ if (!raw)
1303
+ return null;
1304
+ return __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_parseSwapImpactConfig).call(_a, raw);
1305
+ }, _USDZDataAPI_getEmaVolatilityFeeConfig = async function _USDZDataAPI_getEmaVolatilityFeeConfig() {
1306
+ const raw = await __classPrivateFieldGet(this, _USDZDataAPI_instances, "m", _USDZDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'EmaVolatilityFeeConfigKey');
1307
+ if (!raw)
1308
+ return null;
1309
+ return __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_parseEmaVolatilityFeeConfig).call(_a, raw);
1310
+ }, _USDZDataAPI_getMarketDynamicFieldObjectByKeySuffix = async function _USDZDataAPI_getMarketDynamicFieldObjectByKeySuffix(parentId, keyTypeSuffix) {
1311
+ let cursor;
1312
+ let hasNextPage = true;
1313
+ while (hasNextPage) {
1314
+ const page = await this.provider.getDynamicFields({ parentId, cursor });
1315
+ for (const field of page.data) {
1316
+ const type = field.name?.type;
1317
+ if (typeof type === 'string' && type.endsWith(`::${keyTypeSuffix}`)) {
1318
+ return await this.provider.getDynamicFieldObject({
1319
+ parentId,
1320
+ name: field.name,
1321
+ });
1322
+ }
1323
+ }
1324
+ hasNextPage = page.hasNextPage;
1325
+ cursor = page.nextCursor;
1326
+ }
1327
+ return null;
1328
+ }, _USDZDataAPI_parseSwapImpactConfig = function _USDZDataAPI_parseSwapImpactConfig(raw) {
1329
+ const { fields } = raw.data.content;
1330
+ return {
1331
+ id: fields.id.id,
1332
+ enabled: fields.enabled,
1333
+ impactMultiplier: (0, utils_2.parseValue)(fields.impact_multiplier),
1334
+ maxImpactRate: (0, utils_2.parseValue)(fields.max_impact_rate),
1335
+ };
1336
+ }, _USDZDataAPI_parseEmaVolatilityFeeConfig = function _USDZDataAPI_parseEmaVolatilityFeeConfig(raw) {
1337
+ const { fields } = raw.data.content;
1338
+ return {
1339
+ id: fields.id.id,
1340
+ enabled: fields.enabled,
1341
+ multiplier: (0, utils_2.parseValue)(fields.multiplier),
1342
+ maxFeeRate: (0, utils_2.parseValue)(fields.max_fee_rate),
1343
+ };
1344
+ }, _USDZDataAPI_computeSwapImpactFeeValue = function _USDZDataAPI_computeSwapImpactFeeValue(swapValue, totalVaultsValue, impactMultiplier, maxImpactRate) {
1345
+ if (swapValue <= 0 || totalVaultsValue <= 0)
1346
+ return 0;
1347
+ const utilization = swapValue / totalVaultsValue;
1348
+ const rawImpactRate = impactMultiplier * utilization;
1349
+ const impactRate = Math.min(rawImpactRate, maxImpactRate);
1350
+ return swapValue * impactRate;
1351
+ }, _USDZDataAPI_computeEmaVolatilityFeeValue = function _USDZDataAPI_computeEmaVolatilityFeeValue(swapValue, maxDiv, multiplier, maxFeeRate) {
1352
+ if (swapValue <= 0 || maxDiv <= 0)
1353
+ return 0;
1354
+ const rawFeeRate = multiplier * maxDiv;
1355
+ const feeRate = Math.min(rawFeeRate, maxFeeRate);
1356
+ return swapValue * feeRate;
1357
+ }, _USDZDataAPI_maxEmaDivergenceRate = function _USDZDataAPI_maxEmaDivergenceRate(sourceFeed, destFeed) {
1358
+ const sourceDiv = __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_emaDivergenceRate).call(_a, sourceFeed);
1359
+ const destDiv = __classPrivateFieldGet(_a, _a, "m", _USDZDataAPI_emaDivergenceRate).call(_a, destFeed);
1360
+ return Math.max(sourceDiv, destDiv);
1361
+ }, _USDZDataAPI_emaDivergenceRate = function _USDZDataAPI_emaDivergenceRate(priceFeed) {
1362
+ const price = priceFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
1363
+ const ema = priceFeed.getEmaPriceUnchecked().getPriceAsNumberUnchecked();
1364
+ const denom = Math.abs(price);
1365
+ if (denom === 0)
1366
+ return 0;
1367
+ return Math.abs(price - ema) / denom;
1368
+ };
1216
1369
  //# sourceMappingURL=USDZDataAPI.cjs.map