@zofai/zo-sdk 0.1.92 → 0.1.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +227 -51
- 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 +227 -51
- package/dist/implementations/SLPDataAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +208 -48
- 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 +208 -48
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.cjs +211 -50
- 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 +211 -50
- 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 +8 -1
- package/dist/interfaces/slp.d.cts.map +1 -1
- package/dist/interfaces/slp.d.mts +8 -1
- package/dist/interfaces/slp.d.mts.map +1 -1
- package/dist/interfaces/usdz.d.cts +8 -1
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +8 -1
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/interfaces/zlp.d.cts +8 -1
- package/dist/interfaces/zlp.d.cts.map +1 -1
- package/dist/interfaces/zlp.d.mts +8 -1
- package/dist/interfaces/zlp.d.mts.map +1 -1
- package/package.json +4 -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 +253 -23
- package/src/implementations/USDZDataAPI.ts +232 -20
- package/src/implementations/ZLPDataAPI.ts +233 -21
- package/src/interfaces/base.ts +26 -0
- package/src/interfaces/slp.ts +10 -1
- package/src/interfaces/usdz.ts +10 -1
- package/src/interfaces/zlp.ts +10 -1
|
@@ -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
|
|
@@ -139,22 +146,28 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
139
146
|
const marketInfo = await this.getMarketInfo();
|
|
140
147
|
let usdzPrice = 0;
|
|
141
148
|
let value = 0;
|
|
142
|
-
const
|
|
149
|
+
const vaultKeys = Object.keys(this.consts.zoCore.vaults);
|
|
150
|
+
const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
|
|
143
151
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
144
|
-
const reservingFeeDelta =
|
|
145
|
-
|
|
146
|
-
|
|
152
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
153
|
+
const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
|
|
154
|
+
const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
155
|
+
const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
|
|
156
|
+
return { vault, oraclePrice, vaultValue };
|
|
157
|
+
}));
|
|
158
|
+
const vaultPrices = Object.fromEntries(vaultData.map(d => [d.vault, d.oraclePrice]));
|
|
159
|
+
const vaultValues = vaultData.map(d => d.vaultValue);
|
|
147
160
|
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
148
161
|
const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
|
|
149
162
|
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
|
|
150
|
-
const deltaSize =
|
|
163
|
+
const deltaSize = _a.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked());
|
|
151
164
|
// OI context for funding fee delta
|
|
152
165
|
const oiState = await this.getSymbolOiFundingState(tokenId);
|
|
153
166
|
const pairedSymbol = await this.getSymbolInfo(tokenId, !(direction === 'long'));
|
|
154
|
-
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);
|
|
155
168
|
return fundingFeeDelta + deltaSize;
|
|
156
169
|
});
|
|
157
|
-
const
|
|
170
|
+
const symbolValues = await Promise.all(symbolPromises);
|
|
158
171
|
value = vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
159
172
|
value += symbolValues.reduce((acc, curr) => acc + curr, 0);
|
|
160
173
|
usdzPrice = value / marketInfo.lpSupplyWithDecimals;
|
|
@@ -163,6 +176,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
163
176
|
price: usdzPrice,
|
|
164
177
|
supply: marketInfo.lpSupplyWithDecimals,
|
|
165
178
|
apr: Number(marketInfo.apr),
|
|
179
|
+
vaultPrices,
|
|
166
180
|
};
|
|
167
181
|
}
|
|
168
182
|
/**
|
|
@@ -179,7 +193,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
179
193
|
showContent: true,
|
|
180
194
|
},
|
|
181
195
|
});
|
|
182
|
-
return
|
|
196
|
+
return _a.parseMarketInfo(rawData);
|
|
183
197
|
}
|
|
184
198
|
/**
|
|
185
199
|
* Gets USDZ vault information
|
|
@@ -228,7 +242,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
228
242
|
showContent: true,
|
|
229
243
|
},
|
|
230
244
|
});
|
|
231
|
-
return
|
|
245
|
+
return _a.parsePositionConfig(rawData);
|
|
232
246
|
}
|
|
233
247
|
/**
|
|
234
248
|
* Gets USDZ symbol configuration
|
|
@@ -243,7 +257,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
243
257
|
value: { dummy_field: false },
|
|
244
258
|
},
|
|
245
259
|
});
|
|
246
|
-
return
|
|
260
|
+
return _a.parseSymbolConfig(rawData);
|
|
247
261
|
}
|
|
248
262
|
catch {
|
|
249
263
|
// If the dynamic field doesn't exist, return null
|
|
@@ -264,7 +278,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
264
278
|
value: { dummy_field: false },
|
|
265
279
|
},
|
|
266
280
|
});
|
|
267
|
-
return
|
|
281
|
+
return _a.parseOiFundingState(rawData);
|
|
268
282
|
}
|
|
269
283
|
catch (e) {
|
|
270
284
|
console.error('Error Fetching USDZ Symbol OI Funding State:', e);
|
|
@@ -285,7 +299,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
285
299
|
value: { dummy_field: false },
|
|
286
300
|
},
|
|
287
301
|
});
|
|
288
|
-
return
|
|
302
|
+
return _a.parsePriceImpactConfig(rawData);
|
|
289
303
|
}
|
|
290
304
|
catch (e) {
|
|
291
305
|
// If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
|
|
@@ -293,6 +307,49 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
293
307
|
return null;
|
|
294
308
|
}
|
|
295
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
|
+
}
|
|
296
353
|
async getPositionCapInfoList(owner) {
|
|
297
354
|
const positionCapInfoList = [];
|
|
298
355
|
let cursor;
|
|
@@ -482,7 +539,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
482
539
|
showContent: true,
|
|
483
540
|
},
|
|
484
541
|
});
|
|
485
|
-
return
|
|
542
|
+
return _a.parseRebaseFeeModel(rawData);
|
|
486
543
|
}
|
|
487
544
|
async fundingFeeRate(indexToken, long) {
|
|
488
545
|
const oiState = await this.getSymbolOiFundingState(indexToken);
|
|
@@ -495,9 +552,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
495
552
|
const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
|
|
496
553
|
const model = symbol.fundingFeeModel;
|
|
497
554
|
const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
498
|
-
const deltaSize =
|
|
555
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
499
556
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
500
|
-
return
|
|
557
|
+
return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
501
558
|
}
|
|
502
559
|
// OI model enabled: rate based on long/short imbalance
|
|
503
560
|
const longSymbol = await this.getSymbolInfo(indexToken, true);
|
|
@@ -508,7 +565,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
508
565
|
const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
509
566
|
const longSize = longSymbol.openingSize;
|
|
510
567
|
const shortSize = shortSymbol.openingSize;
|
|
511
|
-
const deltaRate =
|
|
568
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
512
569
|
return long ? deltaRate : -deltaRate;
|
|
513
570
|
}
|
|
514
571
|
async rebaseFeeRate(collateralToken, increase, amount) {
|
|
@@ -519,7 +576,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
519
576
|
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
|
|
520
577
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
521
578
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
522
|
-
const reservingFeeDelta =
|
|
579
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
523
580
|
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
|
|
524
581
|
if (collateralToken === vault) {
|
|
525
582
|
vaultValue = res;
|
|
@@ -531,13 +588,13 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
531
588
|
const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
|
|
532
589
|
.map(e => Number.parseInt(e.weight, 10))
|
|
533
590
|
.reduce((acc, curr) => acc + curr, 0);
|
|
534
|
-
return
|
|
591
|
+
return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
|
|
535
592
|
}
|
|
536
593
|
async reservingFeeRate(collateralToken, amount = 0) {
|
|
537
594
|
const vaultInfo = await this.getVaultInfo(collateralToken);
|
|
538
595
|
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
|
|
539
596
|
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
|
|
540
|
-
return
|
|
597
|
+
return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
|
|
541
598
|
}
|
|
542
599
|
async getHistory(trader, page, limit, orderType, symbol) {
|
|
543
600
|
const params = new URLSearchParams({
|
|
@@ -577,44 +634,65 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
577
634
|
const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
578
635
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate;
|
|
579
636
|
}
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
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;
|
|
586
664
|
}
|
|
587
|
-
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp,
|
|
665
|
+
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
588
666
|
if (symbol.lastUpdate > 0) {
|
|
589
667
|
const elapsed = timestamp - symbol.lastUpdate;
|
|
590
668
|
if (elapsed > 0) {
|
|
591
|
-
if (
|
|
669
|
+
if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
|
|
592
670
|
const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
|
|
593
671
|
const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
|
|
594
|
-
const deltaRate =
|
|
672
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
595
673
|
return symbol.accFundingRate + deltaRate;
|
|
596
674
|
}
|
|
597
|
-
const deltaSize =
|
|
675
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
598
676
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
599
|
-
return symbol.accFundingRate +
|
|
677
|
+
return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
600
678
|
}
|
|
601
679
|
}
|
|
602
680
|
return symbol.accFundingRate;
|
|
603
681
|
}
|
|
604
|
-
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp,
|
|
605
|
-
const accFundingRate =
|
|
682
|
+
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
683
|
+
const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
|
|
606
684
|
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
|
|
607
685
|
}
|
|
608
686
|
static calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
609
|
-
const accReservingRate =
|
|
687
|
+
const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
|
|
610
688
|
return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
|
|
611
689
|
}
|
|
612
690
|
static calcAccReservingFeeRate(vault, model, timestamp) {
|
|
613
691
|
if (vault.lastUpdate > 0) {
|
|
614
692
|
const elapsed = timestamp - vault.lastUpdate;
|
|
615
693
|
if (elapsed > 0) {
|
|
616
|
-
const utilization =
|
|
617
|
-
return vault.accReservingRate +
|
|
694
|
+
const utilization = _a.vaultUtilization(vault);
|
|
695
|
+
return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
|
|
618
696
|
}
|
|
619
697
|
}
|
|
620
698
|
return vault.accReservingRate;
|
|
@@ -661,7 +739,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
661
739
|
showContent: true,
|
|
662
740
|
},
|
|
663
741
|
});
|
|
664
|
-
const reservingFeeModel =
|
|
742
|
+
const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
|
|
665
743
|
return {
|
|
666
744
|
liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
|
|
667
745
|
reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
|
|
@@ -689,7 +767,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
689
767
|
showContent: true,
|
|
690
768
|
},
|
|
691
769
|
});
|
|
692
|
-
const fundingFeeModel =
|
|
770
|
+
const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
|
|
693
771
|
return {
|
|
694
772
|
objectId,
|
|
695
773
|
openingSize: (0, utils_2.parseValue)(fields.opening_size),
|
|
@@ -768,15 +846,15 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
768
846
|
closed: positionFields.closed,
|
|
769
847
|
openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
|
|
770
848
|
};
|
|
771
|
-
positionInfo.reservingFeeAmount =
|
|
849
|
+
positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
|
|
772
850
|
// OI context for funding: fetch state and paired side size when enabled
|
|
773
851
|
const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
|
|
774
852
|
const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
|
|
775
|
-
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);
|
|
776
854
|
return positionInfo;
|
|
777
855
|
}
|
|
778
|
-
static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp,
|
|
779
|
-
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);
|
|
780
858
|
return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
|
|
781
859
|
}
|
|
782
860
|
static parseRebaseFeeModel(raw) {
|
|
@@ -811,6 +889,8 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
811
889
|
exponent: (0, utils_2.parseValue)(content.model.fields.exponent),
|
|
812
890
|
max: (0, utils_2.parseValue)(content.model.fields.max),
|
|
813
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,
|
|
814
894
|
};
|
|
815
895
|
}
|
|
816
896
|
static parsePriceImpactConfig(raw) {
|
|
@@ -996,9 +1076,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
996
1076
|
endSkew = 1;
|
|
997
1077
|
}
|
|
998
1078
|
// Compute average dynamic spread via integral
|
|
999
|
-
const avgDynamicRate =
|
|
1079
|
+
const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
|
|
1000
1080
|
// Apply size scaling factor to dynamic spread
|
|
1001
|
-
const sizeFactor =
|
|
1081
|
+
const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
|
|
1002
1082
|
const scaledDynamicRate = avgDynamicRate * sizeFactor;
|
|
1003
1083
|
// total_spread = base_spread + scaled_dynamic
|
|
1004
1084
|
let totalSpread = config.baseSpreadRate + scaledDynamicRate;
|
|
@@ -1069,9 +1149,9 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1069
1149
|
const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
|
|
1070
1150
|
const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
|
|
1071
1151
|
// Compute average spread rate (uses integration for better accuracy on large trades)
|
|
1072
|
-
const spreadRate =
|
|
1152
|
+
const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
|
|
1073
1153
|
// Apply price impact
|
|
1074
|
-
const adjustedPrice =
|
|
1154
|
+
const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
|
|
1075
1155
|
return {
|
|
1076
1156
|
spreadRate,
|
|
1077
1157
|
originalPrice: oraclePrice,
|
|
@@ -1187,7 +1267,7 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1187
1267
|
accRewardPerShare: BigInt(content.acc_reward_per_share),
|
|
1188
1268
|
lockDuration: (0, utils_2.parseValue)(content.lock_duration),
|
|
1189
1269
|
};
|
|
1190
|
-
|
|
1270
|
+
_a.refreshPool(pool, Math.floor(Date.now() / 1000));
|
|
1191
1271
|
return pool;
|
|
1192
1272
|
}
|
|
1193
1273
|
static refreshPool(pool, timestamp) {
|
|
@@ -1206,4 +1286,84 @@ class USDZDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1206
1286
|
}
|
|
1207
1287
|
}
|
|
1208
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
|
+
};
|
|
1209
1369
|
//# sourceMappingURL=USDZDataAPI.cjs.map
|