@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
|
* ZLP DataAPI implementation
|
|
5
5
|
* Implements ZLP-specific data access methods
|
|
6
6
|
*/
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _ZLPDataAPI_instances, _a, _ZLPDataAPI_getTotalVaultsValueUsd, _ZLPDataAPI_getSwapImpactConfig, _ZLPDataAPI_getEmaVolatilityFeeConfig, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix, _ZLPDataAPI_parseSwapImpactConfig, _ZLPDataAPI_parseEmaVolatilityFeeConfig, _ZLPDataAPI_computeSwapImpactFeeValue, _ZLPDataAPI_computeEmaVolatilityFeeValue, _ZLPDataAPI_maxEmaDivergenceRate, _ZLPDataAPI_emaDivergenceRate;
|
|
7
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
14
|
exports.ZLPDataAPI = void 0;
|
|
9
15
|
const utils_1 = require("@mysten/sui/utils");
|
|
@@ -13,6 +19,7 @@ const utils_2 = require("../utils.cjs");
|
|
|
13
19
|
class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
14
20
|
constructor(network, provider, apiEndpoint, connectionURL) {
|
|
15
21
|
super(network, provider, apiEndpoint, connectionURL, consts_1.LPToken.ZLP);
|
|
22
|
+
_ZLPDataAPI_instances.add(this);
|
|
16
23
|
}
|
|
17
24
|
async getStaked(owner) {
|
|
18
25
|
let rawCredentialsData = [];
|
|
@@ -46,7 +53,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
46
53
|
const credentials = rawCredentialsData
|
|
47
54
|
.filter((item) => item.data.type
|
|
48
55
|
=== `${this.sharedConfig.zoStaking.package}::pool::Credential<${this.consts.zoCore.package}::zlp::ZLP, 0x2::sui::SUI>`)
|
|
49
|
-
.map((item) =>
|
|
56
|
+
.map((item) => _a.parseCredential(item, pool));
|
|
50
57
|
return {
|
|
51
58
|
credentials,
|
|
52
59
|
amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
|
|
@@ -61,7 +68,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
61
68
|
showContent: true,
|
|
62
69
|
},
|
|
63
70
|
});
|
|
64
|
-
return
|
|
71
|
+
return _a.parseStakePool(raw);
|
|
65
72
|
}
|
|
66
73
|
/**
|
|
67
74
|
* Creates vaults valuation for ZLP
|
|
@@ -140,22 +147,28 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
140
147
|
const marketInfo = await this.getMarketInfo();
|
|
141
148
|
let zlpPrice = 0;
|
|
142
149
|
let value = 0;
|
|
143
|
-
const
|
|
150
|
+
const vaultKeys = Object.keys(this.consts.zoCore.vaults);
|
|
151
|
+
const vaultData = await Promise.all(vaultKeys.map(async (vault) => {
|
|
144
152
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
145
|
-
const reservingFeeDelta =
|
|
146
|
-
|
|
147
|
-
|
|
153
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
154
|
+
const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
|
|
155
|
+
const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
156
|
+
const vaultValue = totalVaultAmount * oraclePrice / (10 ** this.consts.coins[vault].decimals);
|
|
157
|
+
return { vault, oraclePrice, vaultValue };
|
|
158
|
+
}));
|
|
159
|
+
const vaultPrices = Object.fromEntries(vaultData.map(d => [d.vault, d.oraclePrice]));
|
|
160
|
+
const vaultValues = vaultData.map(d => d.vaultValue);
|
|
148
161
|
const symbolPromises = Object.keys(this.consts.zoCore.symbols).map(async (symbol) => {
|
|
149
162
|
const [direction, tokenId] = (0, utils_2.parseSymbolKey)(symbol);
|
|
150
163
|
const symbolInfo = await this.getSymbolInfo(tokenId, direction === 'long');
|
|
151
164
|
const price = (await this.getOraclePrice(tokenId)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
152
|
-
const deltaSize =
|
|
165
|
+
const deltaSize = _a.calcDeltaSize(symbolInfo, price);
|
|
153
166
|
const oiState = await this.getSymbolOiFundingState(tokenId);
|
|
154
167
|
const pairedInfo = await this.getSymbolInfo(tokenId, direction !== 'long');
|
|
155
|
-
const fundingFeeDelta =
|
|
168
|
+
const fundingFeeDelta = _a.calculateSymbolFundingFee(symbolInfo, symbolInfo.fundingFeeModel, price, marketInfo.lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedInfo.openingSize);
|
|
156
169
|
return fundingFeeDelta + deltaSize;
|
|
157
170
|
});
|
|
158
|
-
const
|
|
171
|
+
const symbolValues = await Promise.all(symbolPromises);
|
|
159
172
|
value = vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
160
173
|
value += symbolValues.reduce((acc, curr) => acc + curr, 0);
|
|
161
174
|
zlpPrice = value / marketInfo.lpSupplyWithDecimals;
|
|
@@ -164,6 +177,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
164
177
|
price: zlpPrice,
|
|
165
178
|
supply: marketInfo.lpSupplyWithDecimals,
|
|
166
179
|
apr: Number(marketInfo.apr),
|
|
180
|
+
vaultPrices,
|
|
167
181
|
};
|
|
168
182
|
}
|
|
169
183
|
/**
|
|
@@ -180,7 +194,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
180
194
|
showContent: true,
|
|
181
195
|
},
|
|
182
196
|
});
|
|
183
|
-
return
|
|
197
|
+
return _a.parseMarketInfo(rawData);
|
|
184
198
|
}
|
|
185
199
|
/**
|
|
186
200
|
* Gets ZLP vault information
|
|
@@ -229,7 +243,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
229
243
|
showContent: true,
|
|
230
244
|
},
|
|
231
245
|
});
|
|
232
|
-
return
|
|
246
|
+
return _a.parsePositionConfig(rawData);
|
|
233
247
|
}
|
|
234
248
|
/**
|
|
235
249
|
* Gets ZLP symbol configuration
|
|
@@ -244,7 +258,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
244
258
|
value: { dummy_field: false },
|
|
245
259
|
},
|
|
246
260
|
});
|
|
247
|
-
return
|
|
261
|
+
return _a.parseSymbolConfig(rawData);
|
|
248
262
|
}
|
|
249
263
|
catch (e) {
|
|
250
264
|
// If the dynamic field doesn't exist, return null
|
|
@@ -265,7 +279,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
265
279
|
value: { dummy_field: false },
|
|
266
280
|
},
|
|
267
281
|
});
|
|
268
|
-
return
|
|
282
|
+
return _a.parseOiFundingState(rawData);
|
|
269
283
|
}
|
|
270
284
|
catch (e) {
|
|
271
285
|
// If the dynamic field doesn't exist, return null
|
|
@@ -287,7 +301,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
287
301
|
value: { dummy_field: false },
|
|
288
302
|
},
|
|
289
303
|
});
|
|
290
|
-
return
|
|
304
|
+
return _a.parsePriceImpactConfig(rawData);
|
|
291
305
|
}
|
|
292
306
|
catch (e) {
|
|
293
307
|
// If the dynamic field doesn't exist, return null (price impact not configured for this symbol)
|
|
@@ -295,6 +309,50 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
295
309
|
return null;
|
|
296
310
|
}
|
|
297
311
|
}
|
|
312
|
+
async calculateSwapFeeBreakdown(fromToken, toToken, fromAmount) {
|
|
313
|
+
const timestamp = Date.now() / 1000;
|
|
314
|
+
const fromDecimals = this.consts.coins[fromToken]?.decimals;
|
|
315
|
+
const toDecimals = this.consts.coins[toToken]?.decimals;
|
|
316
|
+
if (fromDecimals === undefined || toDecimals === undefined) {
|
|
317
|
+
throw new Error(`Unknown token decimals for swap: ${fromToken} -> ${toToken}`);
|
|
318
|
+
}
|
|
319
|
+
const fromFeed = await this.getOraclePrice(fromToken);
|
|
320
|
+
const toFeed = await this.getOraclePrice(toToken);
|
|
321
|
+
const fromPrice = fromFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
322
|
+
const toPrice = toFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
323
|
+
const swapValue = (fromAmount * fromPrice) / (10 ** fromDecimals);
|
|
324
|
+
const totalVaultsValue = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getTotalVaultsValueUsd).call(this, timestamp);
|
|
325
|
+
const rebaseFeeInRate = await this.rebaseFeeRate(fromToken, true, fromAmount);
|
|
326
|
+
const rebaseFeeInValue = swapValue * rebaseFeeInRate;
|
|
327
|
+
// Estimate out-amount by notional value (ignoring price impact / spread / fees).
|
|
328
|
+
const estimatedToAmount = toPrice !== 0
|
|
329
|
+
? (swapValue * (10 ** toDecimals)) / toPrice
|
|
330
|
+
: 0;
|
|
331
|
+
const rebaseFeeOutRate = await this.rebaseFeeRate(toToken, false, estimatedToAmount);
|
|
332
|
+
const rebaseFeeOutValue = swapValue * rebaseFeeOutRate;
|
|
333
|
+
const swapImpactCfg = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getSwapImpactConfig).call(this);
|
|
334
|
+
const swapImpactFeeValue = swapImpactCfg?.enabled
|
|
335
|
+
? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeSwapImpactFeeValue).call(_a, swapValue, totalVaultsValue, swapImpactCfg.impactMultiplier, swapImpactCfg.maxImpactRate)
|
|
336
|
+
: 0;
|
|
337
|
+
const emaCfg = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getEmaVolatilityFeeConfig).call(this);
|
|
338
|
+
const emaVolatilityFeeValue = emaCfg?.enabled
|
|
339
|
+
? __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_computeEmaVolatilityFeeValue).call(_a, swapValue, __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_maxEmaDivergenceRate).call(_a, fromFeed, toFeed), emaCfg.multiplier, emaCfg.maxFeeRate)
|
|
340
|
+
: 0;
|
|
341
|
+
const totalFeeValue = rebaseFeeInValue + rebaseFeeOutValue + swapImpactFeeValue + emaVolatilityFeeValue;
|
|
342
|
+
const totalFeeRate = swapValue !== 0 ? totalFeeValue / swapValue : 0;
|
|
343
|
+
return {
|
|
344
|
+
swapValue,
|
|
345
|
+
totalVaultsValue,
|
|
346
|
+
rebaseFeeInRate,
|
|
347
|
+
rebaseFeeOutRate,
|
|
348
|
+
rebaseFeeInValue,
|
|
349
|
+
rebaseFeeOutValue,
|
|
350
|
+
swapImpactFeeValue,
|
|
351
|
+
emaVolatilityFeeValue,
|
|
352
|
+
totalFeeValue,
|
|
353
|
+
totalFeeRate,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
298
356
|
async getPositionCapInfoList(owner) {
|
|
299
357
|
const positionCapInfoList = [];
|
|
300
358
|
let cursor;
|
|
@@ -509,8 +567,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
509
567
|
showContent: true,
|
|
510
568
|
},
|
|
511
569
|
});
|
|
512
|
-
const model =
|
|
513
|
-
const exponent = await
|
|
570
|
+
const model = _a.parseRebaseFeeModel(rawData);
|
|
571
|
+
const exponent = await _a.getRebaseFeeExponent(this.provider, this.consts.zoCore.rebaseFeeModel, this.consts.zoCore.upgradedPackage);
|
|
514
572
|
return { ...model, exponent };
|
|
515
573
|
}
|
|
516
574
|
async fundingFeeRate(indexToken, long) {
|
|
@@ -524,9 +582,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
524
582
|
const lpSupplyAmount = (await this.getMarketInfo()).lpSupplyWithDecimals;
|
|
525
583
|
const model = symbol.fundingFeeModel;
|
|
526
584
|
const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
527
|
-
const deltaSize =
|
|
585
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
528
586
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
529
|
-
return
|
|
587
|
+
return _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
530
588
|
}
|
|
531
589
|
const longSymbol = await this.getSymbolInfo(indexToken, true);
|
|
532
590
|
const shortSymbol = await this.getSymbolInfo(indexToken, false);
|
|
@@ -536,7 +594,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
536
594
|
const elapsed = consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
537
595
|
const longSize = longSymbol.openingSize;
|
|
538
596
|
const shortSize = shortSymbol.openingSize;
|
|
539
|
-
const deltaRate =
|
|
597
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
540
598
|
return long ? deltaRate : -deltaRate;
|
|
541
599
|
}
|
|
542
600
|
async rebaseFeeRate(collateralToken, increase, amount) {
|
|
@@ -547,7 +605,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
547
605
|
const value = amount * (await this.getOraclePrice(collateralToken)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[collateralToken].decimals);
|
|
548
606
|
const vaultPromises = Object.keys(this.consts.zoCore.vaults).map(async (vault) => {
|
|
549
607
|
const vaultInfo = await this.getVaultInfo(vault);
|
|
550
|
-
const reservingFeeDelta =
|
|
608
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, Date.now() / 1000);
|
|
551
609
|
const res = (reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount) * (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked() / (10 ** this.consts.coins[vault].decimals);
|
|
552
610
|
if (collateralToken === vault) {
|
|
553
611
|
vaultValue = res;
|
|
@@ -559,13 +617,13 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
559
617
|
const targetRatio = Number.parseInt(this.consts.zoCore.vaults[collateralToken].weight, 10) / Object.values(this.consts.zoCore.vaults)
|
|
560
618
|
.map(e => Number.parseInt(e.weight, 10))
|
|
561
619
|
.reduce((acc, curr) => acc + curr, 0);
|
|
562
|
-
return
|
|
620
|
+
return _a.calcRebaseFeeRate(await this.getRebaseFeeModel(), increase, (vaultValue + value) / (totalVaultValue + value), targetRatio);
|
|
563
621
|
}
|
|
564
622
|
async reservingFeeRate(collateralToken, amount = 0) {
|
|
565
623
|
const vaultInfo = await this.getVaultInfo(collateralToken);
|
|
566
624
|
const vaultSupply = vaultInfo.liquidity + vaultInfo.reservedAmount + vaultInfo.unrealisedReservingFeeAmount + amount;
|
|
567
625
|
const utilization = vaultSupply ? ((vaultInfo.reservedAmount + amount) / vaultSupply) : 0;
|
|
568
|
-
return
|
|
626
|
+
return _a.calcReservingFeeRate(vaultInfo.reservingFeeModel, utilization, consts_1.SECONDS_PER_EIGHT_HOUR);
|
|
569
627
|
}
|
|
570
628
|
async getHistory(trader, page, limit, orderType, symbol) {
|
|
571
629
|
const params = new URLSearchParams({
|
|
@@ -605,47 +663,68 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
605
663
|
const secondsRate = dailyRate * elapsed / consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
606
664
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate;
|
|
607
665
|
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
666
|
+
/**
|
|
667
|
+
* OI funding rate matching Move compute_oi_funding_rate_capped.
|
|
668
|
+
* When both maxOiLong and maxOiShort are set and > 0, uses normalized skew (oi/cap);
|
|
669
|
+
* otherwise falls back to (long - short) / total.
|
|
670
|
+
*/
|
|
671
|
+
static calcOiFundingFeeRate(model, oiLong, oiShort, elapsed, maxOiLong, maxOiShort) {
|
|
672
|
+
let skew;
|
|
673
|
+
if (maxOiLong && maxOiShort && maxOiLong > 0 && maxOiShort > 0) {
|
|
674
|
+
const normLong = Math.min(oiLong / maxOiLong, 1);
|
|
675
|
+
const normShort = Math.min(oiShort / maxOiShort, 1);
|
|
676
|
+
skew = normLong - normShort;
|
|
677
|
+
}
|
|
678
|
+
else {
|
|
679
|
+
const total = oiLong + oiShort;
|
|
680
|
+
if (total === 0)
|
|
681
|
+
return 0;
|
|
682
|
+
skew = (oiLong - oiShort) / total;
|
|
683
|
+
}
|
|
684
|
+
if (skew === 0)
|
|
685
|
+
return 0;
|
|
686
|
+
const skewIsPositive = skew > 0;
|
|
687
|
+
const skewAbs = Math.abs(skew);
|
|
688
|
+
const exponentInt = Math.floor(model.exponent);
|
|
689
|
+
const skewPow = skewAbs ** exponentInt;
|
|
690
|
+
const dailyRate = Math.min(model.multiplier * skewPow, model.max);
|
|
691
|
+
const secondsRate = (dailyRate * elapsed) / consts_1.SECONDS_PER_EIGHT_HOUR;
|
|
692
|
+
return skewIsPositive ? secondsRate : -secondsRate;
|
|
614
693
|
}
|
|
615
|
-
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp,
|
|
694
|
+
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
616
695
|
if (symbol.lastUpdate > 0) {
|
|
617
696
|
const elapsed = timestamp - symbol.lastUpdate;
|
|
618
697
|
if (elapsed > 0) {
|
|
619
|
-
// Prefer OI-based delta when
|
|
620
|
-
if (
|
|
698
|
+
// Prefer OI-based delta when state and paired side are available
|
|
699
|
+
if (oiState?.enabled && oiState.model && typeof pairedOpeningSize === 'number') {
|
|
621
700
|
const longSize = symbol.long ? symbol.openingSize : pairedOpeningSize;
|
|
622
701
|
const shortSize = symbol.long ? pairedOpeningSize : symbol.openingSize;
|
|
623
|
-
const deltaRate =
|
|
702
|
+
const deltaRate = _a.calcOiFundingFeeRate(oiState.model, longSize, shortSize, elapsed, oiState.maxOiLong, oiState.maxOiShort);
|
|
624
703
|
const appliedRate = symbol.long ? deltaRate : -deltaRate;
|
|
625
704
|
return symbol.accFundingRate + appliedRate;
|
|
626
705
|
}
|
|
627
706
|
// Fallback to PnL-based funding delta
|
|
628
|
-
const deltaSize =
|
|
707
|
+
const deltaSize = _a.calcDeltaSize(symbol, price);
|
|
629
708
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
630
|
-
return symbol.accFundingRate +
|
|
709
|
+
return symbol.accFundingRate + _a.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
631
710
|
}
|
|
632
711
|
}
|
|
633
712
|
return symbol.accFundingRate;
|
|
634
713
|
}
|
|
635
|
-
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp,
|
|
636
|
-
const accFundingRate =
|
|
714
|
+
static calculateSymbolFundingFee(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
715
|
+
const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
|
|
637
716
|
return symbol.unrealisedFundingFeeValue + (accFundingRate - symbol.accFundingRate) * symbol.openingSize;
|
|
638
717
|
}
|
|
639
718
|
static calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
640
|
-
const accReservingRate =
|
|
719
|
+
const accReservingRate = _a.calcAccReservingFeeRate(vault, model, timestamp);
|
|
641
720
|
return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.reservedAmount;
|
|
642
721
|
}
|
|
643
722
|
static calcAccReservingFeeRate(vault, model, timestamp) {
|
|
644
723
|
if (vault.lastUpdate > 0) {
|
|
645
724
|
const elapsed = timestamp - vault.lastUpdate;
|
|
646
725
|
if (elapsed > 0) {
|
|
647
|
-
const utilization =
|
|
648
|
-
return vault.accReservingRate +
|
|
726
|
+
const utilization = _a.vaultUtilization(vault);
|
|
727
|
+
return vault.accReservingRate + _a.calcReservingFeeRate(model, utilization, elapsed);
|
|
649
728
|
}
|
|
650
729
|
}
|
|
651
730
|
return vault.accReservingRate;
|
|
@@ -693,7 +772,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
693
772
|
showContent: true,
|
|
694
773
|
},
|
|
695
774
|
});
|
|
696
|
-
const reservingFeeModel =
|
|
775
|
+
const reservingFeeModel = _a.parseReservingFeeModel(reservingFeeModelRaw);
|
|
697
776
|
return {
|
|
698
777
|
liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
|
|
699
778
|
reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
|
|
@@ -721,7 +800,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
721
800
|
showContent: true,
|
|
722
801
|
},
|
|
723
802
|
});
|
|
724
|
-
const fundingFeeModel =
|
|
803
|
+
const fundingFeeModel = _a.parseFundingFeeModel(fundingFeeModelRaw);
|
|
725
804
|
return {
|
|
726
805
|
objectId,
|
|
727
806
|
openingSize: (0, utils_2.parseValue)(fields.opening_size),
|
|
@@ -800,15 +879,15 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
800
879
|
closed: positionFields.closed,
|
|
801
880
|
openTimestamp: (0, utils_2.parseValue)(positionFields.open_timestamp),
|
|
802
881
|
};
|
|
803
|
-
positionInfo.reservingFeeAmount =
|
|
882
|
+
positionInfo.reservingFeeAmount = _a.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
|
|
804
883
|
// OI context for funding: fetch state and paired side size when enabled
|
|
805
884
|
const oiState = await this.getSymbolOiFundingState(positionInfo.indexToken);
|
|
806
885
|
const pairedSymbol = await this.getSymbolInfo(positionInfo.indexToken, !positionInfo.long);
|
|
807
|
-
positionInfo.fundingFeeValue =
|
|
886
|
+
positionInfo.fundingFeeValue = _a.calculatePositionFundingFee(positionInfo, await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long), (await this.getSymbolInfo(positionInfo.indexToken, positionInfo.long)).fundingFeeModel, (await this.getOraclePrice(positionInfo.indexToken)).getPriceUnchecked().getPriceAsNumberUnchecked(), (await this.getMarketInfo()).lpSupplyWithDecimals, Date.now() / 1000, oiState && oiState.enabled ? oiState : undefined, pairedSymbol.openingSize);
|
|
808
887
|
return positionInfo;
|
|
809
888
|
}
|
|
810
|
-
static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp,
|
|
811
|
-
const accFundingRate =
|
|
889
|
+
static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize) {
|
|
890
|
+
const accFundingRate = _a.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, oiState, pairedOpeningSize);
|
|
812
891
|
return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
|
|
813
892
|
}
|
|
814
893
|
static parseRebaseFeeModel(raw) {
|
|
@@ -869,6 +948,8 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
869
948
|
exponent: (0, utils_2.parseValue)(content.model.fields.exponent),
|
|
870
949
|
max: (0, utils_2.parseValue)(content.model.fields.max),
|
|
871
950
|
},
|
|
951
|
+
maxOiLong: content.max_oi_long !== null && content.max_oi_long !== undefined ? (0, utils_2.parseValue)(content.max_oi_long) : undefined,
|
|
952
|
+
maxOiShort: content.max_oi_short !== null && content.max_oi_short !== undefined ? (0, utils_2.parseValue)(content.max_oi_short) : undefined,
|
|
872
953
|
};
|
|
873
954
|
}
|
|
874
955
|
static parsePriceImpactConfig(raw) {
|
|
@@ -1054,9 +1135,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1054
1135
|
endSkew = 1;
|
|
1055
1136
|
}
|
|
1056
1137
|
// Compute average dynamic spread via integral
|
|
1057
|
-
const avgDynamicRate =
|
|
1138
|
+
const avgDynamicRate = _a.computeIntegralAverage(config.maxDynamicSpreadRate, startSkew, endSkew, config.impactExponent);
|
|
1058
1139
|
// Apply size scaling factor to dynamic spread
|
|
1059
|
-
const sizeFactor =
|
|
1140
|
+
const sizeFactor = _a.computeSizeFactor(newPositionSize, config.referenceSize);
|
|
1060
1141
|
const scaledDynamicRate = avgDynamicRate * sizeFactor;
|
|
1061
1142
|
// total_spread = base_spread + scaled_dynamic
|
|
1062
1143
|
let totalSpread = config.baseSpreadRate + scaledDynamicRate;
|
|
@@ -1127,9 +1208,9 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1127
1208
|
const maxOiThisSide = isLong ? config.maxOiLong : config.maxOiShort;
|
|
1128
1209
|
const maxOiOpposite = isLong ? config.maxOiShort : config.maxOiLong;
|
|
1129
1210
|
// Compute average spread rate (uses integration for better accuracy on large trades)
|
|
1130
|
-
const spreadRate =
|
|
1211
|
+
const spreadRate = _a.computeAverageSpreadRate(config, currentOiThisSide, positionSizeValue, currentOiOpposite, maxOiThisSide, maxOiOpposite);
|
|
1131
1212
|
// Apply price impact
|
|
1132
|
-
const adjustedPrice =
|
|
1213
|
+
const adjustedPrice = _a.applyPriceImpact(oraclePrice, spreadRate, isLong, isOpening);
|
|
1133
1214
|
return {
|
|
1134
1215
|
spreadRate,
|
|
1135
1216
|
originalPrice: oraclePrice,
|
|
@@ -1245,7 +1326,7 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1245
1326
|
accRewardPerShare: BigInt(content.acc_reward_per_share),
|
|
1246
1327
|
lockDuration: (0, utils_2.parseValue)(content.lock_duration),
|
|
1247
1328
|
};
|
|
1248
|
-
|
|
1329
|
+
_a.refreshPool(pool, Math.floor(Date.now() / 1000));
|
|
1249
1330
|
return pool;
|
|
1250
1331
|
}
|
|
1251
1332
|
static refreshPool(pool, timestamp) {
|
|
@@ -1264,4 +1345,84 @@ class ZLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
1264
1345
|
}
|
|
1265
1346
|
}
|
|
1266
1347
|
exports.ZLPDataAPI = ZLPDataAPI;
|
|
1348
|
+
_a = ZLPDataAPI, _ZLPDataAPI_instances = new WeakSet(), _ZLPDataAPI_getTotalVaultsValueUsd = async function _ZLPDataAPI_getTotalVaultsValueUsd(timestamp) {
|
|
1349
|
+
const vaultKeys = Object.keys(this.consts.zoCore.vaults);
|
|
1350
|
+
const vaultValues = await Promise.all(vaultKeys.map(async (vault) => {
|
|
1351
|
+
const vaultInfo = await this.getVaultInfo(vault);
|
|
1352
|
+
const reservingFeeDelta = _a.calculateVaultReservingFee(vaultInfo, vaultInfo.reservingFeeModel, timestamp);
|
|
1353
|
+
const totalVaultAmount = reservingFeeDelta + vaultInfo.liquidity + vaultInfo.reservedAmount;
|
|
1354
|
+
const oraclePrice = (await this.getOraclePrice(vault)).getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
1355
|
+
const { decimals } = this.consts.coins[vault];
|
|
1356
|
+
return totalVaultAmount * oraclePrice / (10 ** decimals);
|
|
1357
|
+
}));
|
|
1358
|
+
return vaultValues.reduce((acc, curr) => acc + curr, 0);
|
|
1359
|
+
}, _ZLPDataAPI_getSwapImpactConfig = async function _ZLPDataAPI_getSwapImpactConfig() {
|
|
1360
|
+
const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'SwapImpactConfigKey');
|
|
1361
|
+
if (!raw)
|
|
1362
|
+
return null;
|
|
1363
|
+
return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseSwapImpactConfig).call(_a, raw);
|
|
1364
|
+
}, _ZLPDataAPI_getEmaVolatilityFeeConfig = async function _ZLPDataAPI_getEmaVolatilityFeeConfig() {
|
|
1365
|
+
const raw = await __classPrivateFieldGet(this, _ZLPDataAPI_instances, "m", _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix).call(this, this.consts.zoCore.market, 'EmaVolatilityFeeConfigKey');
|
|
1366
|
+
if (!raw)
|
|
1367
|
+
return null;
|
|
1368
|
+
return __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_parseEmaVolatilityFeeConfig).call(_a, raw);
|
|
1369
|
+
}, _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix = async function _ZLPDataAPI_getMarketDynamicFieldObjectByKeySuffix(parentId, keyTypeSuffix) {
|
|
1370
|
+
let cursor;
|
|
1371
|
+
let hasNextPage = true;
|
|
1372
|
+
while (hasNextPage) {
|
|
1373
|
+
const page = await this.provider.getDynamicFields({ parentId, cursor });
|
|
1374
|
+
for (const field of page.data) {
|
|
1375
|
+
const type = field.name?.type;
|
|
1376
|
+
if (typeof type === 'string' && type.endsWith(`::${keyTypeSuffix}`)) {
|
|
1377
|
+
return await this.provider.getDynamicFieldObject({
|
|
1378
|
+
parentId,
|
|
1379
|
+
name: field.name,
|
|
1380
|
+
});
|
|
1381
|
+
}
|
|
1382
|
+
}
|
|
1383
|
+
hasNextPage = page.hasNextPage;
|
|
1384
|
+
cursor = page.nextCursor;
|
|
1385
|
+
}
|
|
1386
|
+
return null;
|
|
1387
|
+
}, _ZLPDataAPI_parseSwapImpactConfig = function _ZLPDataAPI_parseSwapImpactConfig(raw) {
|
|
1388
|
+
const { fields } = raw.data.content;
|
|
1389
|
+
return {
|
|
1390
|
+
id: fields.id.id,
|
|
1391
|
+
enabled: fields.enabled,
|
|
1392
|
+
impactMultiplier: (0, utils_2.parseValue)(fields.impact_multiplier),
|
|
1393
|
+
maxImpactRate: (0, utils_2.parseValue)(fields.max_impact_rate),
|
|
1394
|
+
};
|
|
1395
|
+
}, _ZLPDataAPI_parseEmaVolatilityFeeConfig = function _ZLPDataAPI_parseEmaVolatilityFeeConfig(raw) {
|
|
1396
|
+
const { fields } = raw.data.content;
|
|
1397
|
+
return {
|
|
1398
|
+
id: fields.id.id,
|
|
1399
|
+
enabled: fields.enabled,
|
|
1400
|
+
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
1401
|
+
maxFeeRate: (0, utils_2.parseValue)(fields.max_fee_rate),
|
|
1402
|
+
};
|
|
1403
|
+
}, _ZLPDataAPI_computeSwapImpactFeeValue = function _ZLPDataAPI_computeSwapImpactFeeValue(swapValue, totalVaultsValue, impactMultiplier, maxImpactRate) {
|
|
1404
|
+
if (swapValue <= 0 || totalVaultsValue <= 0)
|
|
1405
|
+
return 0;
|
|
1406
|
+
const utilization = swapValue / totalVaultsValue;
|
|
1407
|
+
const rawImpactRate = impactMultiplier * utilization;
|
|
1408
|
+
const impactRate = Math.min(rawImpactRate, maxImpactRate);
|
|
1409
|
+
return swapValue * impactRate;
|
|
1410
|
+
}, _ZLPDataAPI_computeEmaVolatilityFeeValue = function _ZLPDataAPI_computeEmaVolatilityFeeValue(swapValue, maxDiv, multiplier, maxFeeRate) {
|
|
1411
|
+
if (swapValue <= 0 || maxDiv <= 0)
|
|
1412
|
+
return 0;
|
|
1413
|
+
const rawFeeRate = multiplier * maxDiv;
|
|
1414
|
+
const feeRate = Math.min(rawFeeRate, maxFeeRate);
|
|
1415
|
+
return swapValue * feeRate;
|
|
1416
|
+
}, _ZLPDataAPI_maxEmaDivergenceRate = function _ZLPDataAPI_maxEmaDivergenceRate(sourceFeed, destFeed) {
|
|
1417
|
+
const sourceDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, sourceFeed);
|
|
1418
|
+
const destDiv = __classPrivateFieldGet(_a, _a, "m", _ZLPDataAPI_emaDivergenceRate).call(_a, destFeed);
|
|
1419
|
+
return Math.max(sourceDiv, destDiv);
|
|
1420
|
+
}, _ZLPDataAPI_emaDivergenceRate = function _ZLPDataAPI_emaDivergenceRate(priceFeed) {
|
|
1421
|
+
const price = priceFeed.getPriceUnchecked().getPriceAsNumberUnchecked();
|
|
1422
|
+
const ema = priceFeed.getEmaPriceUnchecked().getPriceAsNumberUnchecked();
|
|
1423
|
+
const denom = Math.abs(price);
|
|
1424
|
+
if (denom === 0)
|
|
1425
|
+
return 0;
|
|
1426
|
+
return Math.abs(price - ema) / denom;
|
|
1427
|
+
};
|
|
1267
1428
|
//# sourceMappingURL=ZLPDataAPI.cjs.map
|