@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.
- package/dist/consts/deployments-slp-mainnet.json +1 -1
- package/dist/consts/deployments-usdz-mainnet.json +1 -1
- package/dist/consts/deployments-zlp-mainnet.json +1 -1
- package/dist/implementations/SLPDataAPI.cjs +212 -47
- package/dist/implementations/SLPDataAPI.cjs.map +1 -1
- package/dist/implementations/SLPDataAPI.d.cts +8 -1
- package/dist/implementations/SLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/SLPDataAPI.d.mts +8 -1
- package/dist/implementations/SLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/SLPDataAPI.mjs +212 -47
- package/dist/implementations/SLPDataAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +197 -44
- package/dist/implementations/USDZDataAPI.cjs.map +1 -1
- package/dist/implementations/USDZDataAPI.d.cts +8 -1
- package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
- package/dist/implementations/USDZDataAPI.d.mts +8 -1
- package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
- package/dist/implementations/USDZDataAPI.mjs +197 -44
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.cjs +200 -46
- package/dist/implementations/ZLPDataAPI.cjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.cts +8 -1
- package/dist/implementations/ZLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.mts +8 -1
- package/dist/implementations/ZLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPDataAPI.mjs +200 -46
- package/dist/implementations/ZLPDataAPI.mjs.map +1 -1
- package/dist/interfaces/base.d.cts +22 -0
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +22 -0
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/interfaces/slp.d.cts +6 -1
- package/dist/interfaces/slp.d.cts.map +1 -1
- package/dist/interfaces/slp.d.mts +6 -1
- package/dist/interfaces/slp.d.mts.map +1 -1
- package/dist/interfaces/usdz.d.cts +6 -1
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +6 -1
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/interfaces/zlp.d.cts +6 -1
- package/dist/interfaces/zlp.d.cts.map +1 -1
- package/dist/interfaces/zlp.d.mts +6 -1
- package/dist/interfaces/zlp.d.mts.map +1 -1
- package/package.json +1 -1
- package/src/consts/deployments-slp-mainnet.json +1 -1
- package/src/consts/deployments-usdz-mainnet.json +1 -1
- package/src/consts/deployments-zlp-mainnet.json +1 -1
- package/src/implementations/SLPDataAPI.ts +235 -19
- package/src/implementations/USDZDataAPI.ts +221 -16
- package/src/implementations/ZLPDataAPI.ts +222 -17
- package/src/interfaces/base.ts +26 -0
- package/src/interfaces/slp.ts +6 -0
- package/src/interfaces/usdz.ts +6 -0
- 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) =>
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
520
|
-
const exponent = await
|
|
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 =
|
|
585
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
535
586
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
536
|
-
return
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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,
|
|
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
|
|
627
|
-
if (
|
|
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 =
|
|
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 =
|
|
707
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
636
708
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
637
|
-
return symbol.accFundingRate +
|
|
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,
|
|
643
|
-
const accFundingRate =
|
|
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 =
|
|
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 =
|
|
655
|
-
return vault.accReservingRate +
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
818
|
-
const accFundingRate =
|
|
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 =
|
|
1138
|
+
const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
|
|
1065
1139
|
// Apply size scaling factor to dynamic spread
|
|
1066
|
-
const sizeFactor =
|
|
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 =
|
|
1211
|
+
const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
|
|
1138
1212
|
// Apply price impact
|
|
1139
|
-
const adjustedPrice =
|
|
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
|
-
|
|
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
|