@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
@@ -3,6 +3,12 @@
3
3
  * ZLP DataAPI implementation
4
4
  * Implements ZLP-specific data access methods
5
5
  */
6
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
7
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
8
+ 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");
9
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
10
+ };
11
+ var _ZLPDataAPI_instances, _a, _ZLPDataAPI_getTotalVaultsValueUsd, _ZLPDataAPI_getSwapImpactConfig, _ZLPDataAPI_getEmaVolatilityFeeConfig, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix, _ZLPDataAPI_parseSwapImpactConfig, _ZLPDataAPI_parseEmaVolatilityFeeConfig, _ZLPDataAPI_computeSwapImpactFeeValue, _ZLPDataAPI_computeEmaVolatilityFeeValue, _ZLPDataAPI_maxEmaDivergenceRate, _ZLPDataAPI_emaDivergenceRate;
6
12
  import { SUI_CLOCK_OBJECT_ID } from "@mysten/sui/utils";
7
13
  import { BaseDataAPI } from "../abstract/index.mjs";
8
14
  import { LPToken, SECONDS_PER_EIGHT_HOUR, ZLP_TOKEN_DECIMALS } from "../consts/index.mjs";
@@ -10,6 +16,7 @@ import { joinSymbol, parseSymbolKey, parseValue, suiSymbolToSymbol } from "../ut
10
16
  export class ZLPDataAPI extends BaseDataAPI {
11
17
  constructor(network, provider, apiEndpoint, connectionURL) {
12
18
  super(network, provider, apiEndpoint, connectionURL, LPToken.ZLP);
19
+ _ZLPDataAPI_instances.add(this);
13
20
  }
14
21
  async getStaked(owner) {
15
22
  let rawCredentialsData = [];
@@ -43,7 +50,7 @@ export class ZLPDataAPI extends BaseDataAPI {
43
50
  const credentials = rawCredentialsData
44
51
  .filter((item) => item.data.type
45
52
  === `${this.sharedConfig.zoStaking.package}::pool::Credential<${this.consts.zoCore.package}::zlp::ZLP, 0x2::sui::SUI>`)
46
- .map((item) => ZLPDataAPI.parseCredential(item, pool));
53
+ .map((item) => _a.parseCredential(item, pool));
47
54
  return {
48
55
  credentials,
49
56
  amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
@@ -58,7 +65,7 @@ export class ZLPDataAPI extends BaseDataAPI {
58
65
  showContent: true,
59
66
  },
60
67
  });
61
- return ZLPDataAPI.parseStakePool(raw);
68
+ return _a.parseStakePool(raw);
62
69
  }
63
70
  /**
64
71
  * Creates vaults valuation for ZLP
@@ -137,22 +144,28 @@ export class ZLPDataAPI extends BaseDataAPI {
137
144
  const marketInfo = await this.getMarketInfo();
138
145
  let zlpPrice = 0;
139
146
  let value = 0;
140
- const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
147
+ const vaultKeys = Object.keys(this.consts.zoCore.vaults);
148
+ const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
141
149
  const vaultInfo = await this.getVaultInfo(vault);
142
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
143
- return (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
144
- });
150
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
151
+ const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
152
+ const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
153
+ const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
154
+ return { vault, oraclePrice, vaultValue };
155
+ }));
156
+ const vaultPrices = Object.fromEntries(vaultData.map(d => [d.vault, d.oraclePrice]));
157
+ const vaultValues = vaultData.map(d => d.vaultValue);
145
158
  const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
146
159
  const [direction, tokenId] = parseSymbolKey(symbol);
147
160
  const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
148
161
  const price = (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked();
149
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbolInfo, price);
162
+ const deltaSize = _a.calcDeltaSize(symbolInfo, price);
150
163
  const oiState = await this.getSymbolOiFundingState(tokenId);
151
164
  const pairedInfo = await this.getSymbolInfo(tokenId, direction !== 'long');
152
- const fundingFeeDelta = ZLPDataAPI.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, price, marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState.model : undefined, pairedInfo.openingSize);
165
+ const fundingFeeDelta = _a.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, price, marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedInfo.openingSize);
153
166
  return fundingFeeDelta + deltaSize;
154
167
  });
155
- const [vaultValues, symbolValues] = await Promise.all([Promise.all(vaultPromises), Promise.all(symbolPromises)]);
168
+ const symbolValues = await Promise.all(symbolPromises);
156
169
  value = vaultValues.reduce((acc, curr) => acc + curr, 0);
157
170
  value += symbolValues.reduce((acc, curr) => acc + curr, 0);
158
171
  zlpPrice = value / marketInfo.lpSupplyWithDecimals;
@@ -161,6 +174,7 @@ export class ZLPDataAPI extends BaseDataAPI {
161
174
  price: zlpPrice,
162
175
  supply: marketInfo.lpSupplyWithDecimals,
163
176
  apr: Number(marketInfo.apr),
177
+ vaultPrices,
164
178
  };
165
179
  }
166
180
  /**
@@ -177,7 +191,7 @@ export class ZLPDataAPI extends BaseDataAPI {
177
191
  showContent: true,
178
192
  },
179
193
  });
180
- return ZLPDataAPI.parseMarketInfo(rawData);
194
+ return _a.parseMarketInfo(rawData);
181
195
  }
182
196
  /**
183
197
  * Gets ZLP vault information
@@ -226,7 +240,7 @@ export class ZLPDataAPI extends BaseDataAPI {
226
240
  showContent: true,
227
241
  },
228
242
  });
229
- return ZLPDataAPI.parsePositionConfig(rawData);
243
+ return _a.parsePositionConfig(rawData);
230
244
  }
231
245
  /**
232
246
  * Gets ZLP symbol configuration
@@ -241,7 +255,7 @@ export class ZLPDataAPI extends BaseDataAPI {
241
255
  value: { dummy_field: false },
242
256
  },
243
257
  });
244
- return ZLPDataAPI.parseSymbolConfig(rawData);
258
+ return _a.parseSymbolConfig(rawData);
245
259
  }
246
260
  catch (e) {
247
261
  // If the dynamic field doesn't exist, return null
@@ -262,7 +276,7 @@ export class ZLPDataAPI extends BaseDataAPI {
262
276
  value: { dummy_field: false },
263
277
  },
264
278
  });
265
- return ZLPDataAPI.parseOiFundingState(rawData);
279
+ return _a.parseOiFundingState(rawData);
266
280
  }
267
281
  catch (e) {
268
282
  // If the dynamic field doesn't exist, return null
@@ -284,7 +298,7 @@ export class ZLPDataAPI extends BaseDataAPI {
284
298
  value: { dummy_field: false },
285
299
  },
286
300
  });
287
- return ZLPDataAPI.parsePriceImpactConfig(rawData);
301
+ return _a.parsePriceImpactConfig(rawData);
288
302
  }
289
303
  catch (e) {
290
304
  // If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
@@ -292,6 +306,50 @@ export class ZLPDataAPI extends BaseDataAPI {
292
306
  return null;
293
307
  }
294
308
  }
309
+ async calculateSwapFeeBreakdown(fromToken, toToken, fromAmount) {
310
+ const timestamp = Date.now() / 1000;
311
+ const fromDecimals = this.consts.coins[fromToken]?.decimals;
312
+ const toDecimals = this.consts.coins[toToken]?.decimals;
313
+ if (fromDecimals === undefined || toDecimals === undefined) {
314
+ throw new Error(`Unknown token decimals for swap: ${fromToken} -> ${toToken}`);
315
+ }
316
+ const fromFeed = await this.getOraclePrice(fromToken);
317
+ const toFeed = await this.getOraclePrice(toToken);
318
+ const fromPrice = fromFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
319
+ const toPrice = toFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
320
+ const swapValue = (fromAmount * fromPrice) / (10 ** fromDecimals);
321
+ const totalVaultsValue = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getTotalVaultsValueUsd).call(this, timestamp);
322
+ const rebaseFeeInRate = await this.rebaseFeeRate(fromToken, true, fromAmount);
323
+ const rebaseFeeInValue = swapValue * rebaseFeeInRate;
324
+ // Estimate out-amount by notional value (ignoring price impact / spread / fees).
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, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getSwapImpactConfig).call(this);
331
+ const swapImpactFeeValue = swapImpactCfg?.enabled
332
+ ? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeSwapImpactFeeValue).call(_a, swapValue, totalVaultsValue, swapImpactCfg.impactMultiplier, swapImpactCfg.maxImpactRate)
333
+ : 0;
334
+ const emaCfg = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getEmaVolatilityFeeConfig).call(this);
335
+ const emaVolatilityFeeValue = emaCfg?.enabled
336
+ ? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeEmaVolatilityFeeValue).call(_a, swapValue, __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_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
+ }
295
353
  async getPositionCapInfoList(owner) {
296
354
  const positionCapInfoList = [];
297
355
  let cursor;
@@ -506,8 +564,8 @@ export class ZLPDataAPI extends BaseDataAPI {
506
564
  showContent: true,
507
565
  },
508
566
  });
509
- const model = ZLPDataAPI.parseRebaseFeeModel(rawData);
510
- const exponent = await ZLPDataAPI.getRebaseFeeExponent(this.provider, this.consts.zoCore.rebaseFeeModel, this.consts.zoCore.upgradedPackage);
567
+ const model = _a.parseRebaseFeeModel(rawData);
568
+ const exponent = await _a.getRebaseFeeExponent(this.provider, this.consts.zoCore.rebaseFeeModel, this.consts.zoCore.upgradedPackage);
511
569
  return { ...model, exponent };
512
570
  }
513
571
  async fundingFeeRate(indexToken, long) {
@@ -521,9 +579,9 @@ export class ZLPDataAPI extends BaseDataAPI {
521
579
  const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
522
580
  const model = symbol.fundingFeeModel;
523
581
  const elapsed = SECONDS_PER_EIGHT_HOUR;
524
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
582
+ const deltaSize = _a.calcDeltaSize(symbol, price);
525
583
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
526
- return ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
584
+ return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
527
585
  }
528
586
  const longSymbol = await this.getSymbolInfo(indexToken, true);
529
587
  const shortSymbol = await this.getSymbolInfo(indexToken, false);
@@ -533,7 +591,7 @@ export class ZLPDataAPI extends BaseDataAPI {
533
591
  const elapsed = SECONDS_PER_EIGHT_HOUR;
534
592
  const longSize = longSymbol.openingSize;
535
593
  const shortSize = shortSymbol.openingSize;
536
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed);
594
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
537
595
  return long ? deltaRate : -deltaRate;
538
596
  }
539
597
  async rebaseFeeRate(collateralToken, increase, amount) {
@@ -544,7 +602,7 @@ export class ZLPDataAPI extends BaseDataAPI {
544
602
  const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
545
603
  const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
546
604
  const vaultInfo = await this.getVaultInfo(vault);
547
- const reservingFeeDelta = ZLPDataAPI.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
605
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
548
606
  const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
549
607
  if (collateralToken === vault) {
550
608
  vaultValue = res;
@@ -556,13 +614,13 @@ export class ZLPDataAPI extends BaseDataAPI {
556
614
  const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
557
615
  .map(e => Number.parseInt(e.weight, 10))
558
616
  .reduce((acc, curr) => acc + curr, 0);
559
- return ZLPDataAPI.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
617
+ return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
560
618
  }
561
619
  async reservingFeeRate(collateralToken, amount = 0) {
562
620
  const vaultInfo = await this.getVaultInfo(collateralToken);
563
621
  const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
564
622
  const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
565
- return ZLPDataAPI.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, SECONDS_PER_EIGHT_HOUR);
623
+ return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, SECONDS_PER_EIGHT_HOUR);
566
624
  }
567
625
  async getHistory(trader, page, limit, orderType, symbol) {
568
626
  const params = new URLSearchParams({
@@ -602,47 +660,68 @@ export class ZLPDataAPI extends BaseDataAPI {
602
660
  const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR;
603
661
  return pnlPerRate >= 0 ? -secondsRate : secondsRate;
604
662
  }
605
- static calcOiFundingFeeRate(model, longSize, shortSize, elapsed) {
606
- const imbalance = Math.abs(longSize - shortSize);
607
- // multiplier = 0.1%, exponent = 1
608
- const dailyRate = Math.min(model.multiplier * (imbalance ** model.exponent) / (longSize + shortSize > 0 ? longSize + shortSize : 1), model.max);
609
- const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR;
610
- return longSize >= shortSize ? secondsRate : -secondsRate;
663
+ /**
664
+ * OI funding rate matching Move compute_oi_funding_rate_capped.
665
+ * When both maxOiLong and maxOiShort are set and > 0, uses normalized skew (oi/cap);
666
+ * otherwise falls back to (long - short) / total.
667
+ */
668
+ static calcOiFundingFeeRate(model, oiLong, oiShort, elapsed, maxOiLong, maxOiShort) {
669
+ let skew;
670
+ if (maxOiLong && maxOiShort && maxOiLong > 0 && maxOiShort > 0) {
671
+ const normLong = Math.min(oiLong / maxOiLong, 1);
672
+ const normShort = Math.min(oiShort / maxOiShort, 1);
673
+ skew = normLong - normShort;
674
+ }
675
+ else {
676
+ const total = oiLong + oiShort;
677
+ if (total === 0)
678
+ return 0;
679
+ skew = (oiLong - oiShort) / total;
680
+ }
681
+ if (skew === 0)
682
+ return 0;
683
+ const skewIsPositive = skew > 0;
684
+ const skewAbs = Math.abs(skew);
685
+ const exponentInt = Math.floor(model.exponent);
686
+ const skewPow = skewAbs ** exponentInt;
687
+ const dailyRate = Math.min(model.multiplier * skewPow, model.max);
688
+ const secondsRate = (dailyRate * elapsed) / SECONDS_PER_EIGHT_HOUR;
689
+ return skewIsPositive ? secondsRate : -secondsRate;
611
690
  }
612
- static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
691
+ static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
613
692
  if (symbol.lastUpdate > 0) {
614
693
  const elapsed = timestamp - symbol.lastUpdate;
615
694
  if (elapsed > 0) {
616
- // Prefer OI-based delta when model and paired side are available
617
- if (oiModel && typeof pairedOpeningSize === 'number') {
695
+ // Prefer OI-based delta when state and paired side are available
696
+ if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
618
697
  const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
619
698
  const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
620
- const deltaRate = ZLPDataAPI.calcOiFundingFeeRate(oiModel, longSize, shortSize, elapsed);
699
+ const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
621
700
  const appliedRate = symbol.long ? deltaRate : -deltaRate;
622
701
  return symbol.accFundingRate + appliedRate;
623
702
  }
624
703
  // Fallback to PnL-based funding delta
625
- const deltaSize = ZLPDataAPI.calcDeltaSize(symbol, price);
704
+ const deltaSize = _a.calcDeltaSize(symbol, price);
626
705
  const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
627
- return symbol.accFundingRate + ZLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
706
+ return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
628
707
  }
629
708
  }
630
709
  return symbol.accFundingRate;
631
710
  }
632
- static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
633
- const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
711
+ static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
712
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
634
713
  return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
635
714
  }
636
715
  static calculatePositionReserveFee(position, vault, model, timestamp) {
637
- const accReservingRate = ZLPDataAPI.calcAccReservingFeeRate(vault, model, timestamp);
716
+ const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
638
717
  return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
639
718
  }
640
719
  static calcAccReservingFeeRate(vault, model, timestamp) {
641
720
  if (vault.lastUpdate > 0) {
642
721
  const elapsed = timestamp - vault.lastUpdate;
643
722
  if (elapsed > 0) {
644
- const utilization = ZLPDataAPI.vaultUtilization(vault);
645
- return vault.accReservingRate + ZLPDataAPI.calcReservingFeeRate(model, utilization, elapsed);
723
+ const utilization = _a.vaultUtilization(vault);
724
+ return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
646
725
  }
647
726
  }
648
727
  return vault.accReservingRate;
@@ -690,7 +769,7 @@ export class ZLPDataAPI extends BaseDataAPI {
690
769
  showContent: true,
691
770
  },
692
771
  });
693
- const reservingFeeModel = ZLPDataAPI.parseReservingFeeModel(reservingFeeModelRaw);
772
+ const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
694
773
  return {
695
774
  liquidity: parseValue(vaultFields.liquidity),
696
775
  reservedAmount: parseValue(vaultFields.reserved_amount),
@@ -718,7 +797,7 @@ export class ZLPDataAPI extends BaseDataAPI {
718
797
  showContent: true,
719
798
  },
720
799
  });
721
- const fundingFeeModel = ZLPDataAPI.parseFundingFeeModel(fundingFeeModelRaw);
800
+ const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
722
801
  return {
723
802
  objectId,
724
803
  openingSize: parseValue(fields.opening_size),
@@ -797,15 +876,15 @@ export class ZLPDataAPI extends BaseDataAPI {
797
876
  closed: positionFields.closed,
798
877
  openTimestamp: parseValue(positionFields.open_timestamp),
799
878
  };
800
- positionInfo.reservingFeeAmount = ZLPDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
879
+ positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
801
880
  // OI context for funding: fetch state and paired side size when enabled
802
881
  const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
803
882
  const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
804
- 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);
883
+ 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);
805
884
  return positionInfo;
806
885
  }
807
- static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize) {
808
- const accFundingRate = ZLPDataAPI.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiModel, pairedOpeningSize);
886
+ static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
887
+ const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
809
888
  return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
810
889
  }
811
890
  static parseRebaseFeeModel(raw) {
@@ -866,6 +945,8 @@ export class ZLPDataAPI extends BaseDataAPI {
866
945
  exponent: parseValue(content.model.fields.exponent),
867
946
  max: parseValue(content.model.fields.max),
868
947
  },
948
+ maxOiLong: content.max_oi_long !== null && content.max_oi_long !== undefined ? parseValue(content.max_oi_long) : undefined,
949
+ maxOiShort: content.max_oi_short !== null && content.max_oi_short !== undefined ? parseValue(content.max_oi_short) : undefined,
869
950
  };
870
951
  }
871
952
  static parsePriceImpactConfig(raw) {
@@ -1051,9 +1132,9 @@ export class ZLPDataAPI extends BaseDataAPI {
1051
1132
  endSkew = 1;
1052
1133
  }
1053
1134
  // Compute average dynamic spread via integral
1054
- const avgDynamicRate = ZLPDataAPI.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1135
+ const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
1055
1136
  // Apply size scaling factor to dynamic spread
1056
- const sizeFactor = ZLPDataAPI.computeSizeFactor(newPositionSize, config.referenceSize);
1137
+ const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
1057
1138
  const scaledDynamicRate = avgDynamicRate * sizeFactor;
1058
1139
  // total_spread = base_spread + scaled_dynamic
1059
1140
  let totalSpread = config.baseSpreadRate + scaledDynamicRate;
@@ -1124,9 +1205,9 @@ export class ZLPDataAPI extends BaseDataAPI {
1124
1205
  const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
1125
1206
  const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
1126
1207
  // Compute average spread rate (uses integration for better accuracy on large trades)
1127
- const spreadRate = ZLPDataAPI.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1208
+ const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
1128
1209
  // Apply price impact
1129
- const adjustedPrice = ZLPDataAPI.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1210
+ const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
1130
1211
  return {
1131
1212
  spreadRate,
1132
1213
  originalPrice: oraclePrice,
@@ -1242,7 +1323,7 @@ export class ZLPDataAPI extends BaseDataAPI {
1242
1323
  accRewardPerShare: BigInt(content.acc_reward_per_share),
1243
1324
  lockDuration: parseValue(content.lock_duration),
1244
1325
  };
1245
- ZLPDataAPI.refreshPool(pool, Math.floor(Date.now() / 1000));
1326
+ _a.refreshPool(pool, Math.floor(Date.now() / 1000));
1246
1327
  return pool;
1247
1328
  }
1248
1329
  static refreshPool(pool, timestamp) {
@@ -1260,4 +1341,84 @@ export class ZLPDataAPI extends BaseDataAPI {
1260
1341
  pool.lastUpdatedTime = calculationEndTime;
1261
1342
  }
1262
1343
  }
1344
+ _a = ZLPDataAPI, _ZLPDataAPI_instances = new WeakSet(), _ZLPDataAPI_getTotalVaultsValueUsd = async function _ZLPDataAPI_getTotalVaultsValueUsd(timestamp) {
1345
+ const vaultKeys = Object.keys(this.consts.zoCore.vaults);
1346
+ const vaultValues = await Promise.all(vaultKeys.map(async (vault) => {
1347
+ const vaultInfo = await this.getVaultInfo(vault);
1348
+ const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, timestamp);
1349
+ const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
1350
+ const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
1351
+ const { decimals } = this.consts.coins[vault];
1352
+ return totalVaultAmount * oraclePrice / (10 ** decimals);
1353
+ }));
1354
+ return vaultValues.reduce((acc, curr) => acc + curr, 0);
1355
+ }, _ZLPDataAPI_getSwapImpactConfig = async function _ZLPDataAPI_getSwapImpactConfig() {
1356
+ const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'SwapImpactConfigKey');
1357
+ if (!raw)
1358
+ return null;
1359
+ return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseSwapImpactConfig).call(_a, raw);
1360
+ }, _ZLPDataAPI_getEmaVolatilityFeeConfig = async function _ZLPDataAPI_getEmaVolatilityFeeConfig() {
1361
+ const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'EmaVolatilityFeeConfigKey');
1362
+ if (!raw)
1363
+ return null;
1364
+ return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseEmaVolatilityFeeConfig).call(_a, raw);
1365
+ }, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix = async function _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix(parentId, keyTypeSuffix) {
1366
+ let cursor;
1367
+ let hasNextPage = true;
1368
+ while (hasNextPage) {
1369
+ const page = await this.provider.getDynamicFields({ parentId, cursor });
1370
+ for (const field of page.data) {
1371
+ const type = field.name?.type;
1372
+ if (typeof type === 'string' && type.endsWith(`::${keyTypeSuffix}`)) {
1373
+ return await this.provider.getDynamicFieldObject({
1374
+ parentId,
1375
+ name: field.name,
1376
+ });
1377
+ }
1378
+ }
1379
+ hasNextPage = page.hasNextPage;
1380
+ cursor = page.nextCursor;
1381
+ }
1382
+ return null;
1383
+ }, _ZLPDataAPI_parseSwapImpactConfig = function _ZLPDataAPI_parseSwapImpactConfig(raw) {
1384
+ const { fields } = raw.data.content;
1385
+ return {
1386
+ id: fields.id.id,
1387
+ enabled: fields.enabled,
1388
+ impactMultiplier: parseValue(fields.impact_multiplier),
1389
+ maxImpactRate: parseValue(fields.max_impact_rate),
1390
+ };
1391
+ }, _ZLPDataAPI_parseEmaVolatilityFeeConfig = function _ZLPDataAPI_parseEmaVolatilityFeeConfig(raw) {
1392
+ const { fields } = raw.data.content;
1393
+ return {
1394
+ id: fields.id.id,
1395
+ enabled: fields.enabled,
1396
+ multiplier: parseValue(fields.multiplier),
1397
+ maxFeeRate: parseValue(fields.max_fee_rate),
1398
+ };
1399
+ }, _ZLPDataAPI_computeSwapImpactFeeValue = function _ZLPDataAPI_computeSwapImpactFeeValue(swapValue, totalVaultsValue, impactMultiplier, maxImpactRate) {
1400
+ if (swapValue <= 0 || totalVaultsValue <= 0)
1401
+ return 0;
1402
+ const utilization = swapValue / totalVaultsValue;
1403
+ const rawImpactRate = impactMultiplier * utilization;
1404
+ const impactRate = Math.min(rawImpactRate, maxImpactRate);
1405
+ return swapValue * impactRate;
1406
+ }, _ZLPDataAPI_computeEmaVolatilityFeeValue = function _ZLPDataAPI_computeEmaVolatilityFeeValue(swapValue, maxDiv, multiplier, maxFeeRate) {
1407
+ if (swapValue <= 0 || maxDiv <= 0)
1408
+ return 0;
1409
+ const rawFeeRate = multiplier * maxDiv;
1410
+ const feeRate = Math.min(rawFeeRate, maxFeeRate);
1411
+ return swapValue * feeRate;
1412
+ }, _ZLPDataAPI_maxEmaDivergenceRate = function _ZLPDataAPI_maxEmaDivergenceRate(sourceFeed, destFeed) {
1413
+ const sourceDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, sourceFeed);
1414
+ const destDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, destFeed);
1415
+ return Math.max(sourceDiv, destDiv);
1416
+ }, _ZLPDataAPI_emaDivergenceRate = function _ZLPDataAPI_emaDivergenceRate(priceFeed) {
1417
+ const price = priceFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
1418
+ const ema = priceFeed.getEmaPriceUnchecked().getPriceAsNumberUnchecked();
1419
+ const denom = Math.abs(price);
1420
+ if (denom === 0)
1421
+ return 0;
1422
+ return Math.abs(price - ema) / denom;
1423
+ };
1263
1424
  //# sourceMappingURL=ZLPDataAPI.mjs.map