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