@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
|
* 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) =>
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
555
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
506
556
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
507
|
-
return
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
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,
|
|
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 (
|
|
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 =
|
|
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 =
|
|
675
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
605
676
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
606
|
-
return symbol.accFundingRate +
|
|
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,
|
|
612
|
-
const accFundingRate =
|
|
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 =
|
|
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 =
|
|
624
|
-
return vault.accReservingRate +
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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,
|
|
786
|
-
const accFundingRate =
|
|
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 =
|
|
1079
|
+
const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
|
|
1007
1080
|
// Apply size scaling factor to dynamic spread
|
|
1008
|
-
const sizeFactor =
|
|
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 =
|
|
1152
|
+
const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
|
|
1080
1153
|
// Apply price impact
|
|
1081
|
-
const adjustedPrice =
|
|
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
|
-
|
|
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
|