zo-sdk 0.1.2 → 0.1.4
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/abstract/BaseAPI.cjs +3 -4
- package/dist/abstract/BaseAPI.cjs.map +1 -1
- package/dist/abstract/BaseAPI.d.cts +13 -13
- package/dist/abstract/BaseAPI.d.cts.map +1 -1
- package/dist/abstract/BaseAPI.d.mts +13 -13
- package/dist/abstract/BaseAPI.d.mts.map +1 -1
- package/dist/abstract/BaseAPI.mjs +3 -4
- package/dist/abstract/BaseAPI.mjs.map +1 -1
- package/dist/abstract/BaseDataAPI.cjs +2 -2
- package/dist/abstract/BaseDataAPI.cjs.map +1 -1
- package/dist/abstract/BaseDataAPI.d.cts +2 -2
- package/dist/abstract/BaseDataAPI.d.cts.map +1 -1
- package/dist/abstract/BaseDataAPI.d.mts +2 -2
- package/dist/abstract/BaseDataAPI.d.mts.map +1 -1
- package/dist/abstract/BaseDataAPI.mjs +2 -2
- package/dist/abstract/BaseDataAPI.mjs.map +1 -1
- package/dist/abstract/index.cjs +3 -3
- package/dist/abstract/index.cjs.map +1 -1
- package/dist/abstract/index.d.cts +1 -1
- package/dist/abstract/index.d.cts.map +1 -1
- package/dist/abstract/index.d.mts +1 -1
- package/dist/abstract/index.d.mts.map +1 -1
- package/dist/abstract/index.mjs +1 -1
- package/dist/abstract/index.mjs.map +1 -1
- package/dist/api.cjs +2 -1
- package/dist/api.cjs.map +1 -1
- package/dist/api.d.cts.map +1 -1
- package/dist/api.d.mts.map +1 -1
- package/dist/api.mjs +2 -1
- package/dist/api.mjs.map +1 -1
- package/dist/bcs.cjs.map +1 -1
- package/dist/bcs.d.cts.map +1 -1
- package/dist/bcs.d.mts.map +1 -1
- package/dist/bcs.mjs.map +1 -1
- package/dist/consts/deployments-slp-mainnet.json +0 -70
- package/dist/consts/deployments-usdz-mainnet.json +1 -133
- package/dist/consts/index.cjs +56 -15
- package/dist/consts/index.cjs.map +1 -1
- package/dist/consts/index.d.cts.map +1 -1
- package/dist/consts/index.d.mts.map +1 -1
- package/dist/consts/index.mjs +56 -15
- package/dist/consts/index.mjs.map +1 -1
- package/dist/factory/SDKFactory.cjs +21 -14
- package/dist/factory/SDKFactory.cjs.map +1 -1
- package/dist/factory/SDKFactory.d.cts +4 -4
- package/dist/factory/SDKFactory.d.cts.map +1 -1
- package/dist/factory/SDKFactory.d.mts +4 -4
- package/dist/factory/SDKFactory.d.mts.map +1 -1
- package/dist/factory/SDKFactory.mjs +22 -15
- package/dist/factory/SDKFactory.mjs.map +1 -1
- package/dist/implementations/SLPAPI.cjs +143 -110
- package/dist/implementations/SLPAPI.cjs.map +1 -1
- package/dist/implementations/SLPAPI.d.cts +49 -47
- package/dist/implementations/SLPAPI.d.cts.map +1 -1
- package/dist/implementations/SLPAPI.d.mts +49 -47
- package/dist/implementations/SLPAPI.d.mts.map +1 -1
- package/dist/implementations/SLPAPI.mjs +143 -110
- package/dist/implementations/SLPAPI.mjs.map +1 -1
- package/dist/implementations/SLPDataAPI.cjs +98 -89
- package/dist/implementations/SLPDataAPI.cjs.map +1 -1
- package/dist/implementations/SLPDataAPI.d.cts +21 -21
- package/dist/implementations/SLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/SLPDataAPI.d.mts +21 -21
- package/dist/implementations/SLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/SLPDataAPI.mjs +98 -89
- package/dist/implementations/SLPDataAPI.mjs.map +1 -1
- package/dist/implementations/USDZAPI.cjs +128 -84
- package/dist/implementations/USDZAPI.cjs.map +1 -1
- package/dist/implementations/USDZAPI.d.cts +46 -45
- package/dist/implementations/USDZAPI.d.cts.map +1 -1
- package/dist/implementations/USDZAPI.d.mts +46 -45
- package/dist/implementations/USDZAPI.d.mts.map +1 -1
- package/dist/implementations/USDZAPI.mjs +128 -84
- package/dist/implementations/USDZAPI.mjs.map +1 -1
- package/dist/implementations/USDZDataAPI.cjs +48 -47
- package/dist/implementations/USDZDataAPI.cjs.map +1 -1
- package/dist/implementations/USDZDataAPI.d.cts +19 -19
- package/dist/implementations/USDZDataAPI.d.cts.map +1 -1
- package/dist/implementations/USDZDataAPI.d.mts +19 -19
- package/dist/implementations/USDZDataAPI.d.mts.map +1 -1
- package/dist/implementations/USDZDataAPI.mjs +49 -48
- package/dist/implementations/USDZDataAPI.mjs.map +1 -1
- package/dist/implementations/ZLPAPI.cjs +137 -89
- package/dist/implementations/ZLPAPI.cjs.map +1 -1
- package/dist/implementations/ZLPAPI.d.cts +50 -48
- package/dist/implementations/ZLPAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPAPI.d.mts +50 -48
- package/dist/implementations/ZLPAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPAPI.mjs +137 -89
- package/dist/implementations/ZLPAPI.mjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.cjs +62 -63
- package/dist/implementations/ZLPDataAPI.cjs.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.cts +19 -19
- package/dist/implementations/ZLPDataAPI.d.cts.map +1 -1
- package/dist/implementations/ZLPDataAPI.d.mts +19 -19
- package/dist/implementations/ZLPDataAPI.d.mts.map +1 -1
- package/dist/implementations/ZLPDataAPI.mjs +63 -64
- package/dist/implementations/ZLPDataAPI.mjs.map +1 -1
- package/dist/implementations/index.cjs +5 -5
- package/dist/implementations/index.cjs.map +1 -1
- package/dist/implementations/index.d.cts +2 -2
- package/dist/implementations/index.d.cts.map +1 -1
- package/dist/implementations/index.d.mts +2 -2
- package/dist/implementations/index.d.mts.map +1 -1
- package/dist/implementations/index.mjs +2 -2
- package/dist/implementations/index.mjs.map +1 -1
- package/dist/index.cjs +9 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +6 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +6 -6
- package/dist/index.mjs.map +1 -1
- package/dist/interfaces/base.cjs +0 -1
- package/dist/interfaces/base.cjs.map +1 -1
- package/dist/interfaces/base.d.cts +57 -57
- package/dist/interfaces/base.d.cts.map +1 -1
- package/dist/interfaces/base.d.mts +57 -57
- package/dist/interfaces/base.d.mts.map +1 -1
- package/dist/interfaces/base.mjs +1 -1
- package/dist/interfaces/base.mjs.map +1 -1
- package/dist/interfaces/index.d.cts +4 -4
- package/dist/interfaces/index.d.cts.map +1 -1
- package/dist/interfaces/index.d.mts +4 -4
- package/dist/interfaces/index.d.mts.map +1 -1
- package/dist/interfaces/slp.cjs +0 -2
- package/dist/interfaces/slp.cjs.map +1 -1
- package/dist/interfaces/slp.d.cts +5 -5
- package/dist/interfaces/slp.d.cts.map +1 -1
- package/dist/interfaces/slp.d.mts +5 -5
- package/dist/interfaces/slp.d.mts.map +1 -1
- package/dist/interfaces/slp.mjs +1 -2
- package/dist/interfaces/slp.mjs.map +1 -1
- package/dist/interfaces/usdz.d.cts +1 -1
- package/dist/interfaces/usdz.d.cts.map +1 -1
- package/dist/interfaces/usdz.d.mts +1 -1
- package/dist/interfaces/usdz.d.mts.map +1 -1
- package/dist/interfaces/zlp.d.cts +5 -5
- package/dist/interfaces/zlp.d.cts.map +1 -1
- package/dist/interfaces/zlp.d.mts +5 -5
- package/dist/interfaces/zlp.d.mts.map +1 -1
- package/dist/oracle.cjs +12 -2
- package/dist/oracle.cjs.map +1 -1
- package/dist/oracle.d.cts +4 -3
- package/dist/oracle.d.cts.map +1 -1
- package/dist/oracle.d.mts +4 -3
- package/dist/oracle.d.mts.map +1 -1
- package/dist/oracle.mjs +13 -3
- package/dist/oracle.mjs.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs +1 -1
- package/dist/utils.mjs.map +1 -1
- package/eslint.config.mjs +18 -0
- package/package.json +16 -15
- package/src/abstract/BaseAPI.ts +55 -49
- package/src/abstract/BaseDataAPI.ts +19 -17
- package/src/abstract/index.ts +1 -1
- package/src/api.ts +3 -1
- package/src/bcs.ts +9 -9
- package/src/consts/deployments-slp-mainnet.json +0 -70
- package/src/consts/deployments-usdz-mainnet.json +1 -133
- package/src/consts/index.ts +61 -16
- package/src/factory/SDKFactory.ts +49 -41
- package/src/implementations/SLPAPI.ts +299 -210
- package/src/implementations/SLPDataAPI.ts +163 -146
- package/src/implementations/USDZAPI.ts +238 -133
- package/src/implementations/USDZDataAPI.ts +79 -74
- package/src/implementations/ZLPAPI.ts +296 -174
- package/src/implementations/ZLPDataAPI.ts +93 -88
- package/src/implementations/index.ts +3 -3
- package/src/index.ts +17 -17
- package/src/interfaces/base.ts +123 -116
- package/src/interfaces/index.ts +14 -17
- package/src/interfaces/slp.ts +20 -19
- package/src/interfaces/usdz.ts +13 -13
- package/src/interfaces/zlp.ts +22 -21
- package/src/oracle.ts +25 -5
- package/src/utils.ts +9 -9
- package/tsconfig.json +1 -1
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/* eslint-disable no-await-in-loop */
|
|
3
|
+
/* eslint-disable @stylistic/indent-binary-ops */
|
|
4
|
+
/* eslint-disable @stylistic/indent */
|
|
2
5
|
/**
|
|
3
6
|
* SLP DataAPI implementation
|
|
4
7
|
* Implements SLP-specific data access methods for Sudo SDK
|
|
@@ -7,10 +10,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
10
|
exports.SLPDataAPI = void 0;
|
|
8
11
|
const transactions_1 = require("@mysten/sui/transactions");
|
|
9
12
|
const utils_1 = require("@mysten/sui/utils");
|
|
10
|
-
const consts_1 = require("../consts/index.cjs");
|
|
11
13
|
const abstract_1 = require("../abstract/index.cjs");
|
|
12
|
-
const utils_2 = require("../utils.cjs");
|
|
13
14
|
const bcs_1 = require("../bcs.cjs");
|
|
15
|
+
const consts_1 = require("../consts/index.cjs");
|
|
16
|
+
const utils_2 = require("../utils.cjs");
|
|
14
17
|
let aprResponse = {};
|
|
15
18
|
const SECONDS_PER_EIGHT_HOUR = 8 * 60 * 60; // 28800 seconds
|
|
16
19
|
class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
@@ -28,7 +31,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
28
31
|
showContent: true,
|
|
29
32
|
},
|
|
30
33
|
});
|
|
31
|
-
return
|
|
34
|
+
return SLPDataAPI.parseRebaseFeeModel(rawData);
|
|
32
35
|
}
|
|
33
36
|
/**
|
|
34
37
|
* Creates vaults valuation for SLP using Sudo SDK approach
|
|
@@ -136,9 +139,9 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
136
139
|
const vaultsValuation = bcs_1.VaultsValuation.parse(new Uint8Array(res.results[(res.results?.length || 0) - symbolsValuationOffset - 1].mutableReferenceOutputs[1][1]));
|
|
137
140
|
const symbolsValuation = bcs_1.SymbolsValuation.parse(new Uint8Array(res.results[(res.results?.length || 0) - 1]
|
|
138
141
|
.mutableReferenceOutputs[1][1]));
|
|
139
|
-
const result = Number(BigInt(vaultsValuation.value)
|
|
140
|
-
BigInt(symbolsValuation.value.value)
|
|
141
|
-
BigInt(symbolsValuation.value.is_positive ? 1 : -1)) / 1e18;
|
|
142
|
+
const result = Number(BigInt(vaultsValuation.value)
|
|
143
|
+
+ BigInt(symbolsValuation.value.value)
|
|
144
|
+
* BigInt(symbolsValuation.value.is_positive ? 1 : -1)) / 1e18;
|
|
142
145
|
return result;
|
|
143
146
|
}
|
|
144
147
|
/**
|
|
@@ -164,8 +167,8 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
164
167
|
throw new Error('Sudo Core configuration not found');
|
|
165
168
|
}
|
|
166
169
|
const marketInfo = await this.getMarketInfo();
|
|
167
|
-
|
|
168
|
-
|
|
170
|
+
const value = await this.simValuateVaults(this.consts.sudoCore.adminCap);
|
|
171
|
+
const slpPrice = value / marketInfo.lpSupplyWithDecimals;
|
|
169
172
|
return {
|
|
170
173
|
marketCap: value,
|
|
171
174
|
price: slpPrice,
|
|
@@ -189,7 +192,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
189
192
|
});
|
|
190
193
|
const apr = await this.getCumulativeApr();
|
|
191
194
|
return {
|
|
192
|
-
...
|
|
195
|
+
...SLPDataAPI.parseMarketInfo(rawData),
|
|
193
196
|
apr,
|
|
194
197
|
};
|
|
195
198
|
}
|
|
@@ -283,7 +286,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
283
286
|
async getStaked(owner) {
|
|
284
287
|
let rawCredentialsData = [];
|
|
285
288
|
let queryNextPage = true;
|
|
286
|
-
let queryCursor
|
|
289
|
+
let queryCursor;
|
|
287
290
|
const limit = 50;
|
|
288
291
|
while (queryNextPage) {
|
|
289
292
|
const { data, hasNextPage, nextCursor } = await this.provider.getOwnedObjects({
|
|
@@ -308,7 +311,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
308
311
|
rawCredentialsData = [...rawCredentialsData, ...data];
|
|
309
312
|
}
|
|
310
313
|
const pool = await this.getStakePool();
|
|
311
|
-
const credentials = rawCredentialsData.map((item) =>
|
|
314
|
+
const credentials = rawCredentialsData.map((item) => SLPDataAPI.parseCredential(item, pool));
|
|
312
315
|
return {
|
|
313
316
|
credentials,
|
|
314
317
|
amount: credentials.reduce((acc, cur) => acc + cur.amount, BigInt(0)),
|
|
@@ -322,12 +325,15 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
322
325
|
showContent: true,
|
|
323
326
|
},
|
|
324
327
|
});
|
|
325
|
-
return
|
|
328
|
+
return SLPDataAPI.parseStakePool(raw);
|
|
326
329
|
}
|
|
327
330
|
async fundingFeeRate(indexToken, long, sender) {
|
|
331
|
+
if (!sender) {
|
|
332
|
+
throw new Error('Sender address is required for fundingFeeRate calculation');
|
|
333
|
+
}
|
|
328
334
|
const tx = await this.initOracleTxb([indexToken]);
|
|
329
335
|
const symbol_ = (0, utils_2.joinSymbol)(long ? 'long' : 'short', indexToken);
|
|
330
|
-
const currentTimestamp = parseInt((
|
|
336
|
+
const currentTimestamp = Number.parseInt((Date.now() / 1000).toFixed(0), 10);
|
|
331
337
|
const symbol = tx.moveCall({
|
|
332
338
|
target: `${this.consts.sudoCore.package}::market::symbol`,
|
|
333
339
|
typeArguments: [
|
|
@@ -378,10 +384,13 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
378
384
|
transactionBlock: tx,
|
|
379
385
|
sender,
|
|
380
386
|
});
|
|
381
|
-
const de = bcs_1.SRate.parse(new Uint8Array(res.results
|
|
387
|
+
const de = bcs_1.SRate.parse(new Uint8Array(res.results.at(-1).returnValues[0][0]));
|
|
382
388
|
return (Number(BigInt(de.value)) / 1e18) * (de.is_positive ? 1 : -1);
|
|
383
389
|
}
|
|
384
390
|
async rebaseFeeRate(collateralToken, increase, amount, sender) {
|
|
391
|
+
if (!sender) {
|
|
392
|
+
throw new Error('Sender address is required for rebaseFeeRate calculation');
|
|
393
|
+
}
|
|
385
394
|
const tx1 = await this.initOracleTxb(Object.keys(this.consts.pythFeeder.feeder));
|
|
386
395
|
this.valuateVaults(tx1);
|
|
387
396
|
const res1 = await this.provider.devInspectTransactionBlock({
|
|
@@ -391,7 +400,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
391
400
|
const vaultsValuation = bcs_1.VaultsValuation.parse(new Uint8Array(res1.results[(res1.results?.length || 0) - 1]
|
|
392
401
|
.mutableReferenceOutputs[1][1]));
|
|
393
402
|
const singleVaultValue = BigInt(
|
|
394
|
-
// @ts-
|
|
403
|
+
// @ts-expect-error: vaultsValuation.handled type is not properly defined in BCS schema
|
|
395
404
|
vaultsValuation.handled.find((item) => (item.key || '').includes(this.consts.coins[collateralToken].module.slice(2)) || false)?.value.value) + BigInt(Math.floor(amount));
|
|
396
405
|
const allVaultValue = BigInt(vaultsValuation.value) + BigInt(Math.floor(amount));
|
|
397
406
|
const singleVaultWeight = BigInt(this.consts.sudoCore.vaults[collateralToken].weight);
|
|
@@ -412,17 +421,20 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
412
421
|
transactionBlock: tx2,
|
|
413
422
|
sender,
|
|
414
423
|
});
|
|
415
|
-
const de = bcs_1.Rate.parse(new Uint8Array(res2.results
|
|
424
|
+
const de = bcs_1.Rate.parse(new Uint8Array(res2.results.at(-1).returnValues[0][0]));
|
|
416
425
|
return Number(BigInt(de)) / 1e18;
|
|
417
426
|
}
|
|
418
427
|
async reservingFeeRate(collateralToken, amount, sender) {
|
|
428
|
+
if (!sender) {
|
|
429
|
+
throw new Error('Sender address is required for reservingFeeRate calculation');
|
|
430
|
+
}
|
|
419
431
|
const vaultInfo = await this.getVaultInfo(collateralToken);
|
|
420
|
-
const vaultSupply = vaultInfo.liquidity
|
|
421
|
-
vaultInfo.reservedAmount
|
|
422
|
-
vaultInfo.unrealisedReservingFeeAmount
|
|
423
|
-
amount;
|
|
432
|
+
const vaultSupply = vaultInfo.liquidity
|
|
433
|
+
+ vaultInfo.reservedAmount
|
|
434
|
+
+ vaultInfo.unrealisedReservingFeeAmount
|
|
435
|
+
+ amount;
|
|
424
436
|
const utilization = vaultSupply
|
|
425
|
-
? parseInt((((vaultInfo.reservedAmount + amount) / vaultSupply) * 1e18).toFixed(0))
|
|
437
|
+
? Number.parseInt((((vaultInfo.reservedAmount + amount) / vaultSupply) * 1e18).toFixed(0), 10)
|
|
426
438
|
: 0;
|
|
427
439
|
const tx = new transactions_1.Transaction();
|
|
428
440
|
tx.moveCall({
|
|
@@ -437,7 +449,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
437
449
|
transactionBlock: tx,
|
|
438
450
|
sender,
|
|
439
451
|
});
|
|
440
|
-
const de = bcs_1.Rate.parse(new Uint8Array(res.results
|
|
452
|
+
const de = bcs_1.Rate.parse(new Uint8Array(res.results.at(-1).returnValues[0][0]));
|
|
441
453
|
return Number(BigInt(de)) / 1e18;
|
|
442
454
|
}
|
|
443
455
|
async getPositionConfig(indexToken, long) {
|
|
@@ -452,12 +464,12 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
452
464
|
showContent: true,
|
|
453
465
|
},
|
|
454
466
|
});
|
|
455
|
-
return
|
|
467
|
+
return SLPDataAPI.parsePositionConfig(rawData);
|
|
456
468
|
}
|
|
457
469
|
async getOpenPositions(batchSize = 50, symbol = 'sui') {
|
|
458
470
|
let positionDynamicFields = [];
|
|
459
471
|
let _continue = true;
|
|
460
|
-
let cursor
|
|
472
|
+
let cursor;
|
|
461
473
|
while (_continue) {
|
|
462
474
|
// data here will be a list of dynamic fields containing name and value
|
|
463
475
|
const { data, nextCursor, hasNextPage } = await this.provider.getDynamicFields({
|
|
@@ -469,23 +481,21 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
469
481
|
cursor = nextCursor;
|
|
470
482
|
}
|
|
471
483
|
// Filter by symbol if provided
|
|
472
|
-
if (symbol && this.consts.coins[symbol]) {
|
|
473
|
-
const coinModule = symbol === 'sui' ? '0x2::sui::SUI' : this.consts.coins[symbol].module;
|
|
474
|
-
positionDynamicFields = positionDynamicFields.filter(field => {
|
|
475
|
-
// Extract the second coin module from PositionName<coin1, coin2, direction>
|
|
476
|
-
const typeStr = field.name?.type;
|
|
477
|
-
if (!typeStr)
|
|
478
|
-
return false;
|
|
479
|
-
const match = typeStr.match(/PositionName<([^,]+),\s*([^,]+),\s*([^>]+)>/);
|
|
480
|
-
if (!match)
|
|
481
|
-
return false;
|
|
482
|
-
const secondCoin = match[2].trim();
|
|
483
|
-
return secondCoin === coinModule;
|
|
484
|
-
});
|
|
485
|
-
}
|
|
486
|
-
else {
|
|
484
|
+
if (!(symbol && this.consts.coins[symbol])) {
|
|
487
485
|
return [];
|
|
488
486
|
}
|
|
487
|
+
const coinModule = symbol === 'sui' ? '0x2::sui::SUI' : this.consts.coins[symbol].module;
|
|
488
|
+
positionDynamicFields = positionDynamicFields.filter((field) => {
|
|
489
|
+
// Extract the second coin module from PositionName<coin1, coin2, direction>
|
|
490
|
+
const typeStr = field.name?.type;
|
|
491
|
+
if (!typeStr)
|
|
492
|
+
return false;
|
|
493
|
+
const match = typeStr.match(/PositionName<([^,]+),([^,]+),([^>]+)>/);
|
|
494
|
+
if (!match)
|
|
495
|
+
return false;
|
|
496
|
+
const secondCoin = match[2].trim();
|
|
497
|
+
return secondCoin === coinModule;
|
|
498
|
+
});
|
|
489
499
|
// then we query by dynamic field names and order by time
|
|
490
500
|
const positionInfoList = [];
|
|
491
501
|
for (let i = 0; i < positionDynamicFields.length; i += batchSize) {
|
|
@@ -496,7 +506,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
496
506
|
name: positionDynamicField.name,
|
|
497
507
|
});
|
|
498
508
|
if (positionRaw?.data?.content) {
|
|
499
|
-
// @ts-
|
|
509
|
+
// @ts-expect-error: content fields type is not properly defined
|
|
500
510
|
if (positionRaw?.data?.content?.fields?.value?.fields?.closed) {
|
|
501
511
|
// skip closed positions
|
|
502
512
|
return;
|
|
@@ -513,7 +523,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
513
523
|
.sort((a, b) => (a.openTimestamp > b.openTimestamp ? 1 : -1));
|
|
514
524
|
}
|
|
515
525
|
async getPositionCapInfoList(owner) {
|
|
516
|
-
let cursor
|
|
526
|
+
let cursor;
|
|
517
527
|
let hasNextPage = true;
|
|
518
528
|
const positionCapInfoList = [];
|
|
519
529
|
while (hasNextPage) {
|
|
@@ -547,7 +557,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
547
557
|
return positionCapInfoList;
|
|
548
558
|
}
|
|
549
559
|
async getOrderCapInfoList(owner) {
|
|
550
|
-
let cursor
|
|
560
|
+
let cursor;
|
|
551
561
|
let hasNextPage = true;
|
|
552
562
|
const orderCapInfoList = [];
|
|
553
563
|
while (hasNextPage) {
|
|
@@ -605,7 +615,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
605
615
|
const orderRaw = await this.provider.getDynamicFieldObject({
|
|
606
616
|
parentId: this.consts.sudoCore.ordersParent,
|
|
607
617
|
name: {
|
|
608
|
-
type: `${this.consts.sudoCore.package}::market::OrderName<${orderCapInfo.symbol0}, ${orderCapInfo.symbol1}, ${this.consts.sudoCore.package}::market::${orderCapInfo.long ? 'LONG' : 'SHORT'}, ${this.consts.coins
|
|
618
|
+
type: `${this.consts.sudoCore.package}::market::OrderName<${orderCapInfo.symbol0}, ${orderCapInfo.symbol1}, ${this.consts.sudoCore.package}::market::${orderCapInfo.long ? 'LONG' : 'SHORT'}, ${this.consts.coins.sui.module}>`,
|
|
609
619
|
value: {
|
|
610
620
|
owner,
|
|
611
621
|
id: orderCapInfo.orderCapId,
|
|
@@ -622,9 +632,9 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
622
632
|
async getCumulativeApr() {
|
|
623
633
|
const refetchDate = new Date(Date.now() - 3600000);
|
|
624
634
|
// fetch new every hour
|
|
625
|
-
if (!aprResponse?.generatedAt
|
|
626
|
-
(aprResponse?.generatedAt
|
|
627
|
-
refetchDate > new Date(aprResponse?.generatedAt))) {
|
|
635
|
+
if (!aprResponse?.generatedAt
|
|
636
|
+
|| (aprResponse?.generatedAt
|
|
637
|
+
&& refetchDate > new Date(aprResponse?.generatedAt))) {
|
|
628
638
|
try {
|
|
629
639
|
const url = `${this.apiEndpoint}/cumulativeApr`;
|
|
630
640
|
const res = await fetch(url, {
|
|
@@ -634,64 +644,63 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
634
644
|
},
|
|
635
645
|
});
|
|
636
646
|
const data = await res.json();
|
|
647
|
+
// eslint-disable-next-line require-atomic-updates
|
|
637
648
|
aprResponse = { ...data };
|
|
638
649
|
return data.cumulativeApr;
|
|
639
650
|
}
|
|
640
|
-
catch
|
|
651
|
+
catch {
|
|
641
652
|
console.error('Failed to get cumulative APR');
|
|
642
653
|
}
|
|
643
654
|
return 0;
|
|
644
655
|
}
|
|
645
|
-
|
|
646
|
-
return aprResponse.apr;
|
|
647
|
-
}
|
|
656
|
+
return aprResponse.apr;
|
|
648
657
|
}
|
|
649
658
|
// Private helper methods
|
|
650
|
-
calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp) {
|
|
659
|
+
static calculatePositionFundingFee(position, symbol, model, price, lpSupplyAmount, timestamp) {
|
|
651
660
|
const accFundingRate = this.calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, position.long);
|
|
652
661
|
return position.fundingFeeValue + (accFundingRate - position.lastFundingRate) * position.positionSize;
|
|
653
662
|
}
|
|
654
|
-
calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, isLong) {
|
|
663
|
+
static calcAccFundingFeeRate(symbol, model, price, lpSupplyAmount, timestamp, isLong) {
|
|
655
664
|
if (symbol.lastUpdate > 0) {
|
|
656
665
|
const elapsed = timestamp - symbol.lastUpdate;
|
|
657
666
|
if (elapsed > 0) {
|
|
658
667
|
const deltaSize = this.calcDeltaSize(symbol, price, isLong);
|
|
659
668
|
const pnlPerLp = (symbol.realisedPnl + symbol.unrealisedFundingFeeValue + deltaSize) / lpSupplyAmount;
|
|
660
|
-
return symbol.accFundingRate +
|
|
669
|
+
return symbol.accFundingRate + SLPDataAPI.calcFundingFeeRate(model, pnlPerLp, elapsed);
|
|
661
670
|
}
|
|
662
671
|
}
|
|
663
672
|
return symbol.accFundingRate;
|
|
664
673
|
}
|
|
665
|
-
calcDeltaSize(symbol, price, isLong) {
|
|
674
|
+
static calcDeltaSize(symbol, price, isLong) {
|
|
666
675
|
const latestSize = symbol.openingAmount * price;
|
|
667
676
|
return isLong ? symbol.openingSize - latestSize : latestSize - symbol.openingSize;
|
|
668
677
|
}
|
|
669
|
-
calcFundingFeeRate(model, pnlPerRate, elapsed) {
|
|
678
|
+
static calcFundingFeeRate(model, pnlPerRate, elapsed) {
|
|
670
679
|
const dailyRate = Math.min(model.multiplier * Math.abs(pnlPerRate), model.max);
|
|
671
680
|
const secondsRate = dailyRate * elapsed / SECONDS_PER_EIGHT_HOUR;
|
|
672
681
|
return pnlPerRate >= 0 ? -secondsRate : secondsRate;
|
|
673
682
|
}
|
|
674
|
-
calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
675
|
-
const accReservingRate =
|
|
683
|
+
static calculatePositionReserveFee(position, vault, model, timestamp) {
|
|
684
|
+
const accReservingRate = SLPDataAPI.calcAccReservingFeeRate(vault, model, timestamp);
|
|
676
685
|
return position.reservingFeeAmount + (accReservingRate - position.lastReservingRate) * position.collateralAmount;
|
|
677
686
|
}
|
|
678
|
-
calcAccReservingFeeRate(vault, model, timestamp) {
|
|
687
|
+
static calcAccReservingFeeRate(vault, model, timestamp) {
|
|
679
688
|
if (vault.lastUpdate > 0) {
|
|
680
689
|
const elapsed = timestamp - vault.lastUpdate;
|
|
681
690
|
if (elapsed > 0) {
|
|
682
|
-
const utilization =
|
|
683
|
-
return vault.accReservingRate +
|
|
691
|
+
const utilization = SLPDataAPI.vaultUtilization(vault);
|
|
692
|
+
return vault.accReservingRate + SLPDataAPI.calcReservingFeeRate(model, utilization, elapsed);
|
|
684
693
|
}
|
|
685
694
|
}
|
|
686
695
|
return vault.accReservingRate;
|
|
687
696
|
}
|
|
688
|
-
vaultUtilization(vault) {
|
|
697
|
+
static vaultUtilization(vault) {
|
|
689
698
|
return vault.liquidity > 0 ? vault.reservedAmount / vault.liquidity : 0;
|
|
690
699
|
}
|
|
691
|
-
calcReservingFeeRate(model, utilization, elapsed) {
|
|
700
|
+
static calcReservingFeeRate(model, utilization, elapsed) {
|
|
692
701
|
return model.multiplier * utilization * elapsed / SECONDS_PER_EIGHT_HOUR;
|
|
693
702
|
}
|
|
694
|
-
parsePositionConfig(raw) {
|
|
703
|
+
static parsePositionConfig(raw) {
|
|
695
704
|
const positionConfigFields = raw.data.content.fields.inner.fields;
|
|
696
705
|
return {
|
|
697
706
|
decreaseFeeBps: (0, utils_2.parseValue)(positionConfigFields.decrease_fee_bps),
|
|
@@ -704,21 +713,21 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
704
713
|
minCollateralValue: (0, utils_2.parseValue)(positionConfigFields.min_collateral_value),
|
|
705
714
|
};
|
|
706
715
|
}
|
|
707
|
-
parseRebaseFeeModel(raw) {
|
|
716
|
+
static parseRebaseFeeModel(raw) {
|
|
708
717
|
const { fields } = raw.data.content;
|
|
709
718
|
return {
|
|
710
719
|
base: (0, utils_2.parseValue)(fields.base),
|
|
711
720
|
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
712
721
|
};
|
|
713
722
|
}
|
|
714
|
-
parseFundingFeeModel(raw) {
|
|
723
|
+
static parseFundingFeeModel(raw) {
|
|
715
724
|
const { fields } = raw.data.content;
|
|
716
725
|
return {
|
|
717
726
|
multiplier: (0, utils_2.parseValue)(fields.multiplier),
|
|
718
727
|
max: (0, utils_2.parseValue)(fields.max),
|
|
719
728
|
};
|
|
720
729
|
}
|
|
721
|
-
parseMarketInfo(raw) {
|
|
730
|
+
static parseMarketInfo(raw) {
|
|
722
731
|
const content = raw.data.content.fields;
|
|
723
732
|
return {
|
|
724
733
|
lpSupply: content.lp_supply.fields.value,
|
|
@@ -737,7 +746,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
737
746
|
showContent: true,
|
|
738
747
|
},
|
|
739
748
|
});
|
|
740
|
-
const reservingFeeModel =
|
|
749
|
+
const reservingFeeModel = SLPDataAPI.parseReservingFeeModel(reservingFeeModelRaw);
|
|
741
750
|
return {
|
|
742
751
|
liquidity: (0, utils_2.parseValue)(vaultFields.liquidity),
|
|
743
752
|
reservedAmount: (0, utils_2.parseValue)(vaultFields.reserved_amount),
|
|
@@ -755,14 +764,14 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
755
764
|
},
|
|
756
765
|
};
|
|
757
766
|
}
|
|
758
|
-
parseReservingFeeModel(raw) {
|
|
767
|
+
static parseReservingFeeModel(raw) {
|
|
759
768
|
const content = raw.data.content.fields;
|
|
760
769
|
return {
|
|
761
770
|
multiplier: (0, utils_2.parseValue)(content.multiplier),
|
|
762
771
|
};
|
|
763
772
|
}
|
|
764
773
|
async parseSymbolInfo(raw, long) {
|
|
765
|
-
const fields = raw.data.content.fields.value
|
|
774
|
+
const { fields } = raw.data.content.fields.value;
|
|
766
775
|
const fundingFeeModelAddr = fields.funding_fee_model;
|
|
767
776
|
const fundingFeeModelRaw = await this.provider.getObject({
|
|
768
777
|
id: fundingFeeModelAddr,
|
|
@@ -770,7 +779,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
770
779
|
showContent: true,
|
|
771
780
|
},
|
|
772
781
|
});
|
|
773
|
-
const fundingFeeModel =
|
|
782
|
+
const fundingFeeModel = SLPDataAPI.parseFundingFeeModel(fundingFeeModelRaw);
|
|
774
783
|
return {
|
|
775
784
|
openingSize: (0, utils_2.parseValue)(fields.opening_size),
|
|
776
785
|
openingAmount: (0, utils_2.parseValue)(fields.opening_amount),
|
|
@@ -792,15 +801,15 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
792
801
|
};
|
|
793
802
|
}
|
|
794
803
|
async parsePositionInfo(raw, id_) {
|
|
795
|
-
const content = raw.data
|
|
796
|
-
const fields = content
|
|
804
|
+
const { content } = raw.data;
|
|
805
|
+
const { fields } = content;
|
|
797
806
|
const positionFields = fields.value.fields;
|
|
798
807
|
const dataType = fields.name.type;
|
|
799
808
|
const positionInfo = {
|
|
800
809
|
id: id_,
|
|
801
810
|
long: dataType.includes('::market::LONG'),
|
|
802
811
|
owner: fields.name.fields.owner,
|
|
803
|
-
version: parseInt(raw.data.version, 10),
|
|
812
|
+
version: Number.parseInt(raw.data.version, 10),
|
|
804
813
|
collateralToken: (0, utils_2.suiSymbolToSymbol)(dataType.split('<')[1].split(',')[0].trim(), this.consts),
|
|
805
814
|
indexToken: (0, utils_2.suiSymbolToSymbol)(dataType.split(',')[1].trim(), this.consts),
|
|
806
815
|
collateralAmount: (0, utils_2.parseValue)(positionFields.collateral),
|
|
@@ -817,8 +826,8 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
817
826
|
};
|
|
818
827
|
if (!positionFields.closed) {
|
|
819
828
|
try {
|
|
820
|
-
positionInfo.reservingFeeAmount =
|
|
821
|
-
positionInfo.fundingFeeValue =
|
|
829
|
+
positionInfo.reservingFeeAmount = SLPDataAPI.calculatePositionReserveFee(positionInfo, await this.getVaultInfo(positionInfo.collateralToken), (await this.getVaultInfo(positionInfo.collateralToken)).reservingFeeModel, Date.now() / 1000);
|
|
830
|
+
positionInfo.fundingFeeValue = SLPDataAPI.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);
|
|
822
831
|
}
|
|
823
832
|
catch (e) {
|
|
824
833
|
console.error(e);
|
|
@@ -829,14 +838,14 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
829
838
|
return positionInfo;
|
|
830
839
|
}
|
|
831
840
|
parseOrderInfo(raw, capId) {
|
|
832
|
-
|
|
833
|
-
|
|
841
|
+
const { content } = raw.data;
|
|
842
|
+
const { fields } = content.fields.value;
|
|
834
843
|
// Extract tokens from dataType
|
|
835
|
-
|
|
844
|
+
const dataType = content.type;
|
|
836
845
|
const orderType = content.fields.value.type.includes('OpenPositionOrder')
|
|
837
846
|
? 'OPEN_POSITION'
|
|
838
847
|
: 'DECREASE_POSITION';
|
|
839
|
-
|
|
848
|
+
const ret = {
|
|
840
849
|
id: content.fields.id.id,
|
|
841
850
|
capId,
|
|
842
851
|
executed: fields.executed,
|
|
@@ -866,7 +875,7 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
866
875
|
}
|
|
867
876
|
return ret;
|
|
868
877
|
}
|
|
869
|
-
parseCredential(raw, pool) {
|
|
878
|
+
static parseCredential(raw, pool) {
|
|
870
879
|
const stakedAmount = BigInt(raw.data.content.fields.stake);
|
|
871
880
|
const accRewardPerShare = BigInt(raw.data.content.fields.acc_reward_per_share);
|
|
872
881
|
return {
|
|
@@ -874,11 +883,11 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
874
883
|
lockUntil: (0, utils_2.parseValue)(raw.data.content.fields.lock_until),
|
|
875
884
|
amount: stakedAmount,
|
|
876
885
|
accRewardPerShare,
|
|
877
|
-
claimable: ((pool.accRewardPerShare - accRewardPerShare) * stakedAmount)
|
|
878
|
-
BigInt(1e18),
|
|
886
|
+
claimable: ((pool.accRewardPerShare - accRewardPerShare) * stakedAmount)
|
|
887
|
+
/ BigInt(1e18),
|
|
879
888
|
};
|
|
880
889
|
}
|
|
881
|
-
parseStakePool(raw) {
|
|
890
|
+
static parseStakePool(raw) {
|
|
882
891
|
const content = raw.data.content.fields;
|
|
883
892
|
const pool = {
|
|
884
893
|
id: content.id.id,
|
|
@@ -891,22 +900,22 @@ class SLPDataAPI extends abstract_1.BaseDataAPI {
|
|
|
891
900
|
accRewardPerShare: BigInt(content.acc_reward_per_share),
|
|
892
901
|
lockDuration: (0, utils_2.parseValue)(content.lock_duration),
|
|
893
902
|
};
|
|
894
|
-
|
|
903
|
+
SLPDataAPI.refreshPool(pool, Math.floor(Date.now() / 1000));
|
|
895
904
|
return pool;
|
|
896
905
|
}
|
|
897
|
-
refreshPool(pool, timestamp) {
|
|
906
|
+
static refreshPool(pool, timestamp) {
|
|
898
907
|
if (timestamp === pool.lastUpdatedTime || timestamp < pool.startTime) {
|
|
899
908
|
return;
|
|
900
909
|
}
|
|
901
|
-
if (pool.lastUpdatedTime === pool.endTime
|
|
902
|
-
pool.stakedAmount === BigInt(0)) {
|
|
910
|
+
if (pool.lastUpdatedTime === pool.endTime
|
|
911
|
+
|| pool.stakedAmount === BigInt(0)) {
|
|
903
912
|
return;
|
|
904
913
|
}
|
|
905
914
|
if (timestamp > pool.endTime) {
|
|
906
915
|
timestamp = pool.endTime;
|
|
907
916
|
}
|
|
908
|
-
const rewardAmount = (pool.reward * BigInt(timestamp - pool.lastUpdatedTime))
|
|
909
|
-
BigInt(pool.endTime - pool.lastUpdatedTime);
|
|
917
|
+
const rewardAmount = (pool.reward * BigInt(timestamp - pool.lastUpdatedTime))
|
|
918
|
+
/ BigInt(pool.endTime - pool.lastUpdatedTime);
|
|
910
919
|
pool.lastUpdatedTime = timestamp;
|
|
911
920
|
const rewardPerShare = (rewardAmount * BigInt(1e18)) / pool.stakedAmount;
|
|
912
921
|
pool.accRewardPerShare += rewardPerShare;
|