@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
|
@@ -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
|
|
@@ -136,22 +143,28 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
136
143
|
const marketInfo = await this.getMarketInfo();
|
|
137
144
|
let usdzPrice = 0;
|
|
138
145
|
let value = 0;
|
|
139
|
-
const
|
|
146
|
+
const vaultKeys = Object.keys(this.consts.zoCore.vaults);
|
|
147
|
+
const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
|
|
140
148
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
141
|
-
const reservingFeeDelta =
|
|
142
|
-
|
|
143
|
-
|
|
149
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
150
|
+
const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
|
|
151
|
+
const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
152
|
+
const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
|
|
153
|
+
return { vault, oraclePrice, vaultValue };
|
|
154
|
+
}));
|
|
155
|
+
const vaultPrices = Object.fromEntries(vaultData.map(d => [d.vault, d.oraclePrice]));
|
|
156
|
+
const vaultValues = vaultData.map(d => d.vaultValue);
|
|
144
157
|
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
145
158
|
const [direction, tokenId] = parseSymbolKey(symbol);
|
|
146
159
|
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
|
|
147
|
-
const deltaSize =
|
|
160
|
+
const deltaSize = _a.calcDeltaSize(symbolInfo, (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked());
|
|
148
161
|
// OI context for funding fee delta
|
|
149
162
|
const oiState = await this.getSymbolOiFundingState(tokenId);
|
|
150
163
|
const pairedSymbol = await this.getSymbolInfo(tokenId, !(direction === 'long'));
|
|
151
|
-
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);
|
|
152
165
|
return fundingFeeDelta + deltaSize;
|
|
153
166
|
});
|
|
154
|
-
const
|
|
167
|
+
const symbolValues = await Promise.all(symbolPromises);
|
|
155
168
|
value = vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
156
169
|
value += symbolValues.reduce((acc, curr) => acc + curr, 0);
|
|
157
170
|
usdzPrice = value / marketInfo.lpSupplyWithDecimals;
|
|
@@ -160,6 +173,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
160
173
|
price: usdzPrice,
|
|
161
174
|
supply: marketInfo.lpSupplyWithDecimals,
|
|
162
175
|
apr: Number(marketInfo.apr),
|
|
176
|
+
vaultPrices,
|
|
163
177
|
};
|
|
164
178
|
}
|
|
165
179
|
/**
|
|
@@ -176,7 +190,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
176
190
|
showContent: true,
|
|
177
191
|
},
|
|
178
192
|
});
|
|
179
|
-
return
|
|
193
|
+
return _a.parseMarketInfo(rawData);
|
|
180
194
|
}
|
|
181
195
|
/**
|
|
182
196
|
* Gets USDZ vault information
|
|
@@ -225,7 +239,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
225
239
|
showContent: true,
|
|
226
240
|
},
|
|
227
241
|
});
|
|
228
|
-
return
|
|
242
|
+
return _a.parsePositionConfig(rawData);
|
|
229
243
|
}
|
|
230
244
|
/**
|
|
231
245
|
* Gets USDZ symbol configuration
|
|
@@ -240,7 +254,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
240
254
|
value: { dummy_field: false },
|
|
241
255
|
},
|
|
242
256
|
});
|
|
243
|
-
return
|
|
257
|
+
return _a.parseSymbolConfig(rawData);
|
|
244
258
|
}
|
|
245
259
|
catch {
|
|
246
260
|
// If the dynamic field doesn't exist, return null
|
|
@@ -261,7 +275,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
261
275
|
value: { dummy_field: false },
|
|
262
276
|
},
|
|
263
277
|
});
|
|
264
|
-
return
|
|
278
|
+
return _a.parseOiFundingState(rawData);
|
|
265
279
|
}
|
|
266
280
|
catch (e) {
|
|
267
281
|
console.error('Error Fetching USDZ Symbol OI Funding State:', e);
|
|
@@ -282,7 +296,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
282
296
|
value: { dummy_field: false },
|
|
283
297
|
},
|
|
284
298
|
});
|
|
285
|
-
return
|
|
299
|
+
return _a.parsePriceImpactConfig(rawData);
|
|
286
300
|
}
|
|
287
301
|
catch (e) {
|
|
288
302
|
// If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
|
|
@@ -290,6 +304,49 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
290
304
|
return null;
|
|
291
305
|
}
|
|
292
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
|
+
}
|
|
293
350
|
async getPositionCapInfoList(owner) {
|
|
294
351
|
const positionCapInfoList = [];
|
|
295
352
|
let cursor;
|
|
@@ -479,7 +536,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
479
536
|
showContent: true,
|
|
480
537
|
},
|
|
481
538
|
});
|
|
482
|
-
return
|
|
539
|
+
return _a.parseRebaseFeeModel(rawData);
|
|
483
540
|
}
|
|
484
541
|
async fundingFeeRate(indexToken, long) {
|
|
485
542
|
const oiState = await this.getSymbolOiFundingState(indexToken);
|
|
@@ -492,9 +549,9 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
492
549
|
const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
|
|
493
550
|
const model = symbol.fundingFeeModel;
|
|
494
551
|
const elapsed = SECONDS_PER_EIGHT_HOUR;
|
|
495
|
-
const deltaSize =
|
|
552
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
496
553
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
497
|
-
return
|
|
554
|
+
return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
498
555
|
}
|
|
499
556
|
// OI model enabled: rate based on long/short imbalance
|
|
500
557
|
const longSymbol = await this.getSymbolInfo(indexToken, true);
|
|
@@ -505,7 +562,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
505
562
|
const elapsed = SECONDS_PER_EIGHT_HOUR;
|
|
506
563
|
const longSize = longSymbol.openingSize;
|
|
507
564
|
const shortSize = shortSymbol.openingSize;
|
|
508
|
-
const deltaRate =
|
|
565
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
509
566
|
return long ? deltaRate : -deltaRate;
|
|
510
567
|
}
|
|
511
568
|
async rebaseFeeRate(collateralToken, increase, amount) {
|
|
@@ -516,7 +573,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
516
573
|
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
|
|
517
574
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
518
575
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
519
|
-
const reservingFeeDelta =
|
|
576
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
520
577
|
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
|
|
521
578
|
if (collateralToken === vault) {
|
|
522
579
|
vaultValue = res;
|
|
@@ -528,13 +585,13 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
528
585
|
const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
|
|
529
586
|
.map(e => Number.parseInt(e.weight, 10))
|
|
530
587
|
.reduce((acc, curr) => acc + curr, 0);
|
|
531
|
-
return
|
|
588
|
+
return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
|
|
532
589
|
}
|
|
533
590
|
async reservingFeeRate(collateralToken, amount = 0) {
|
|
534
591
|
const vaultInfo = await this.getVaultInfo(collateralToken);
|
|
535
592
|
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
|
|
536
593
|
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
|
|
537
|
-
return
|
|
594
|
+
return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, SECONDS_PER_EIGHT_HOUR);
|
|
538
595
|
}
|
|
539
596
|
async getHistory(trader, page, limit, orderType, symbol) {
|
|
540
597
|
const params = new URLSearchParams({
|
|
@@ -574,44 +631,65 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
574
631
|
const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR;
|
|
575
632
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate;
|
|
576
633
|
}
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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;
|
|
583
661
|
}
|
|
584
|
-
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp,
|
|
662
|
+
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
585
663
|
if (symbol.lastUpdate > 0) {
|
|
586
664
|
const elapsed = timestamp - symbol.lastUpdate;
|
|
587
665
|
if (elapsed > 0) {
|
|
588
|
-
if (
|
|
666
|
+
if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
|
|
589
667
|
const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
|
|
590
668
|
const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
|
|
591
|
-
const deltaRate =
|
|
669
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
592
670
|
return symbol.accFundingRate + deltaRate;
|
|
593
671
|
}
|
|
594
|
-
const deltaSize =
|
|
672
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
595
673
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
596
|
-
return symbol.accFundingRate +
|
|
674
|
+
return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
597
675
|
}
|
|
598
676
|
}
|
|
599
677
|
return symbol.accFundingRate;
|
|
600
678
|
}
|
|
601
|
-
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp,
|
|
602
|
-
const accFundingRate =
|
|
679
|
+
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
680
|
+
const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
|
|
603
681
|
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
|
|
604
682
|
}
|
|
605
683
|
static calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
606
|
-
const accReservingRate =
|
|
684
|
+
const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
|
|
607
685
|
return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
|
|
608
686
|
}
|
|
609
687
|
static calcAccReservingFeeRate(vault, model, timestamp) {
|
|
610
688
|
if (vault.lastUpdate > 0) {
|
|
611
689
|
const elapsed = timestamp - vault.lastUpdate;
|
|
612
690
|
if (elapsed > 0) {
|
|
613
|
-
const utilization =
|
|
614
|
-
return vault.accReservingRate +
|
|
691
|
+
const utilization = _a.vaultUtilization(vault);
|
|
692
|
+
return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
|
|
615
693
|
}
|
|
616
694
|
}
|
|
617
695
|
return vault.accReservingRate;
|
|
@@ -658,7 +736,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
658
736
|
showContent: true,
|
|
659
737
|
},
|
|
660
738
|
});
|
|
661
|
-
const reservingFeeModel =
|
|
739
|
+
const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
|
|
662
740
|
return {
|
|
663
741
|
liquidity: parseValue(vaultFields.liquidity),
|
|
664
742
|
reservedAmount: parseValue(vaultFields.reserved_amount),
|
|
@@ -686,7 +764,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
686
764
|
showContent: true,
|
|
687
765
|
},
|
|
688
766
|
});
|
|
689
|
-
const fundingFeeModel =
|
|
767
|
+
const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
|
|
690
768
|
return {
|
|
691
769
|
objectId,
|
|
692
770
|
openingSize: parseValue(fields.opening_size),
|
|
@@ -765,15 +843,15 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
765
843
|
closed: positionFields.closed,
|
|
766
844
|
openTimestamp: parseValue(positionFields.open_timestamp),
|
|
767
845
|
};
|
|
768
|
-
positionInfo.reservingFeeAmount =
|
|
846
|
+
positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
|
|
769
847
|
// OI context for funding: fetch state and paired side size when enabled
|
|
770
848
|
const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
|
|
771
849
|
const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
|
|
772
|
-
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);
|
|
773
851
|
return positionInfo;
|
|
774
852
|
}
|
|
775
|
-
static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp,
|
|
776
|
-
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);
|
|
777
855
|
return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
|
|
778
856
|
}
|
|
779
857
|
static parseRebaseFeeModel(raw) {
|
|
@@ -808,6 +886,8 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
808
886
|
exponent: parseValue(content.model.fields.exponent),
|
|
809
887
|
max: parseValue(content.model.fields.max),
|
|
810
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,
|
|
811
891
|
};
|
|
812
892
|
}
|
|
813
893
|
static parsePriceImpactConfig(raw) {
|
|
@@ -993,9 +1073,9 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
993
1073
|
endSkew = 1;
|
|
994
1074
|
}
|
|
995
1075
|
// Compute average dynamic spread via integral
|
|
996
|
-
const avgDynamicRate =
|
|
1076
|
+
const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
|
|
997
1077
|
// Apply size scaling factor to dynamic spread
|
|
998
|
-
const sizeFactor =
|
|
1078
|
+
const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
|
|
999
1079
|
const scaledDynamicRate = avgDynamicRate * sizeFactor;
|
|
1000
1080
|
// total_spread = base_spread + scaled_dynamic
|
|
1001
1081
|
let totalSpread = config.baseSpreadRate + scaledDynamicRate;
|
|
@@ -1066,9 +1146,9 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
1066
1146
|
const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
|
|
1067
1147
|
const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
|
|
1068
1148
|
// Compute average spread rate (uses integration for better accuracy on large trades)
|
|
1069
|
-
const spreadRate =
|
|
1149
|
+
const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
|
|
1070
1150
|
// Apply price impact
|
|
1071
|
-
const adjustedPrice =
|
|
1151
|
+
const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
|
|
1072
1152
|
return {
|
|
1073
1153
|
spreadRate,
|
|
1074
1154
|
originalPrice: oraclePrice,
|
|
@@ -1184,7 +1264,7 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
1184
1264
|
accRewardPerShare: BigInt(content.acc_reward_per_share),
|
|
1185
1265
|
lockDuration: parseValue(content.lock_duration),
|
|
1186
1266
|
};
|
|
1187
|
-
|
|
1267
|
+
_a.refreshPool(pool, Math.floor(Date.now() / 1000));
|
|
1188
1268
|
return pool;
|
|
1189
1269
|
}
|
|
1190
1270
|
static refreshPool(pool, timestamp) {
|
|
@@ -1202,4 +1282,84 @@ export class USDZDataAPI extends BaseDataAPI {
|
|
|
1202
1282
|
pool.lastUpdatedTime = calculationEndTime;
|
|
1203
1283
|
}
|
|
1204
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
|
+
};
|
|
1205
1365
|
//# sourceMappingURL=USDZDataAPI.mjs.map
|