@scallop-io/sui-scallop-sdk 1.3.41 → 1.4.1-alpha.1
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/constants/common.d.ts +3 -3
- package/dist/constants/enum.d.ts +2 -2
- package/dist/constants/tokenBucket.d.ts +1 -1
- package/dist/index.js +412 -334
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +411 -333
- package/dist/index.mjs.map +1 -1
- package/dist/models/scallopClient.d.ts +4 -4
- package/dist/models/scallopQuery.d.ts +74 -20
- package/dist/models/scallopUtils.d.ts +11 -11
- package/dist/queries/borrowIncentiveQuery.d.ts +2 -2
- package/dist/queries/coreQuery.d.ts +0 -2
- package/dist/queries/portfolioQuery.d.ts +0 -2
- package/dist/queries/priceQuery.d.ts +32 -2
- package/dist/queries/sCoinQuery.d.ts +1 -1
- package/dist/test.d.ts +0 -0
- package/dist/types/builder/borrowIncentive.d.ts +6 -6
- package/dist/types/constant/common.d.ts +1 -1
- package/dist/types/utils.d.ts +2 -6
- package/package.json +1 -1
- package/src/builders/borrowIncentiveBuilder.ts +2 -13
- package/src/constants/coinGecko.ts +3 -2
- package/src/constants/common.ts +10 -5
- package/src/constants/enum.ts +44 -34
- package/src/constants/poolAddress.ts +9 -8
- package/src/constants/pyth.ts +3 -2
- package/src/constants/tokenBucket.ts +1 -1
- package/src/models/scallopClient.ts +27 -10
- package/src/models/scallopQuery.ts +55 -31
- package/src/models/scallopUtils.ts +23 -18
- package/src/queries/borrowIncentiveQuery.ts +29 -12
- package/src/queries/borrowLimitQuery.ts +3 -2
- package/src/queries/coreQuery.ts +185 -196
- package/src/queries/isolatedAssetQuery.ts +3 -2
- package/src/queries/portfolioQuery.ts +81 -77
- package/src/queries/priceQuery.ts +35 -2
- package/src/queries/sCoinQuery.ts +3 -3
- package/src/queries/spoolQuery.ts +4 -6
- package/src/queries/supplyLimitQuery.ts +3 -2
- package/src/test.ts +20 -0
- package/src/types/builder/borrowIncentive.ts +10 -15
- package/src/types/constant/common.ts +1 -2
- package/src/types/utils.ts +2 -10
- package/src/utils/indexer.ts +9 -3
- package/src/utils/query.ts +0 -87
- package/src/utils/tokenBucket.ts +2 -2
|
@@ -17,8 +17,9 @@ const borrowLimitZod = zod.object({
|
|
|
17
17
|
}),
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
// const borrowLimitKeyType = `
|
|
20
|
+
// TODO: enable for production
|
|
21
|
+
// const borrowLimitKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::BorrowLimitKey`; // prod
|
|
22
|
+
const borrowLimitKeyType = `0xb784ea287d944e478a3ceaa071f8885072cce6b7224cf245914dc2f9963f460e::market_dynamic_keys::BorrowLimitKey`;
|
|
22
23
|
/**
|
|
23
24
|
* Return supply limit of a pool (including the decimals)
|
|
24
25
|
* @param utils
|
package/src/queries/coreQuery.ts
CHANGED
|
@@ -247,7 +247,7 @@ export const getMarketPools = async (
|
|
|
247
247
|
const marketObjectResponse = await query.cache.queryGetObject(marketId, {
|
|
248
248
|
showContent: true,
|
|
249
249
|
});
|
|
250
|
-
coinPrices = (await query.utils.getCoinPrices(
|
|
250
|
+
coinPrices = coinPrices ?? (await query.utils.getCoinPrices());
|
|
251
251
|
|
|
252
252
|
const marketPools: MarketPools = {};
|
|
253
253
|
|
|
@@ -305,222 +305,215 @@ export const getMarketPool = async (
|
|
|
305
305
|
marketObject?: SuiObjectData | null,
|
|
306
306
|
coinPrice?: number
|
|
307
307
|
): Promise<MarketPool | undefined> => {
|
|
308
|
-
|
|
309
|
-
coinPrice =
|
|
310
|
-
coinPrice ||
|
|
311
|
-
(await query.utils.getCoinPrices([poolCoinName]))?.[poolCoinName];
|
|
312
|
-
|
|
313
|
-
if (indexer) {
|
|
314
|
-
const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
|
|
315
|
-
if (!marketPoolIndexer) {
|
|
316
|
-
return undefined;
|
|
317
|
-
}
|
|
318
|
-
marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;
|
|
319
|
-
marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
|
|
320
|
-
marketPoolIndexer.coinName
|
|
321
|
-
);
|
|
308
|
+
coinPrice = coinPrice ?? (await query.utils.getCoinPrices())?.[poolCoinName];
|
|
322
309
|
|
|
323
|
-
|
|
310
|
+
if (indexer) {
|
|
311
|
+
const marketPoolIndexer = await query.indexer.getMarketPool(poolCoinName);
|
|
312
|
+
if (!marketPoolIndexer) {
|
|
313
|
+
return undefined;
|
|
324
314
|
}
|
|
315
|
+
marketPoolIndexer.coinPrice = coinPrice ?? marketPoolIndexer.coinPrice;
|
|
316
|
+
marketPoolIndexer.coinWrappedType = query.utils.getCoinWrappedType(
|
|
317
|
+
marketPoolIndexer.coinName
|
|
318
|
+
);
|
|
325
319
|
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
marketObject ||
|
|
329
|
-
(
|
|
330
|
-
await query.cache.queryGetObject(marketId, {
|
|
331
|
-
showContent: true,
|
|
332
|
-
})
|
|
333
|
-
)?.data;
|
|
320
|
+
return marketPoolIndexer;
|
|
321
|
+
}
|
|
334
322
|
|
|
335
|
-
|
|
336
|
-
|
|
323
|
+
const marketId = query.address.get('core.market');
|
|
324
|
+
marketObject =
|
|
325
|
+
marketObject ||
|
|
326
|
+
(
|
|
327
|
+
await query.cache.queryGetObject(marketId, {
|
|
328
|
+
showContent: true,
|
|
329
|
+
})
|
|
330
|
+
)?.data;
|
|
337
331
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
332
|
+
if (!(marketObject && marketObject.content?.dataType === 'moveObject'))
|
|
333
|
+
throw new Error(`Failed to fetch marketObject`);
|
|
334
|
+
|
|
335
|
+
const fields = marketObject.content.fields as any;
|
|
336
|
+
const coinType = query.utils.parseCoinType(poolCoinName);
|
|
337
|
+
// Get balance sheet.
|
|
338
|
+
const balanceSheetParentId =
|
|
339
|
+
fields.vault.fields.balance_sheets.fields.table.fields.id.id;
|
|
340
|
+
const balanceSheetDynamicFieldObjectResponse =
|
|
341
|
+
await query.cache.queryGetDynamicFieldObject({
|
|
342
|
+
parentId: balanceSheetParentId,
|
|
343
|
+
name: {
|
|
344
|
+
type: '0x1::type_name::TypeName',
|
|
345
|
+
value: {
|
|
346
|
+
name: coinType.substring(2),
|
|
351
347
|
},
|
|
352
|
-
}
|
|
348
|
+
},
|
|
349
|
+
});
|
|
353
350
|
|
|
354
|
-
|
|
355
|
-
|
|
351
|
+
const balanceSheetDynamicFieldObject =
|
|
352
|
+
balanceSheetDynamicFieldObjectResponse?.data;
|
|
356
353
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
)
|
|
354
|
+
if (
|
|
355
|
+
!(
|
|
356
|
+
balanceSheetDynamicFieldObject &&
|
|
357
|
+
balanceSheetDynamicFieldObject.content &&
|
|
358
|
+
'fields' in balanceSheetDynamicFieldObject.content
|
|
363
359
|
)
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
)
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
},
|
|
360
|
+
)
|
|
361
|
+
throw new Error(
|
|
362
|
+
`Failed to fetch balanceSheetDynamicFieldObject for ${poolCoinName}: ${balanceSheetDynamicFieldObjectResponse?.error?.code.toString()}`
|
|
363
|
+
);
|
|
364
|
+
const balanceSheet: BalanceSheet = (
|
|
365
|
+
balanceSheetDynamicFieldObject.content.fields as any
|
|
366
|
+
).value.fields;
|
|
367
|
+
|
|
368
|
+
// Get borrow index.
|
|
369
|
+
const borrowIndexParentId = fields.borrow_dynamics.fields.table.fields.id.id;
|
|
370
|
+
const borrowIndexDynamicFieldObjectResponse =
|
|
371
|
+
await query.cache.queryGetDynamicFieldObject({
|
|
372
|
+
parentId: borrowIndexParentId,
|
|
373
|
+
name: {
|
|
374
|
+
type: '0x1::type_name::TypeName',
|
|
375
|
+
value: {
|
|
376
|
+
name: coinType.substring(2),
|
|
382
377
|
},
|
|
383
|
-
}
|
|
378
|
+
},
|
|
379
|
+
});
|
|
384
380
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
)
|
|
381
|
+
const borrowIndexDynamicFieldObject =
|
|
382
|
+
borrowIndexDynamicFieldObjectResponse?.data;
|
|
383
|
+
if (
|
|
384
|
+
!(
|
|
385
|
+
borrowIndexDynamicFieldObject &&
|
|
386
|
+
borrowIndexDynamicFieldObject.content &&
|
|
387
|
+
'fields' in borrowIndexDynamicFieldObject.content
|
|
393
388
|
)
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
389
|
+
)
|
|
390
|
+
throw new Error(
|
|
391
|
+
`Failed to fetch borrowIndexDynamicFieldObject for ${poolCoinName}`
|
|
392
|
+
);
|
|
393
|
+
const borrowIndex: BorrowIndex = (
|
|
394
|
+
borrowIndexDynamicFieldObject.content.fields as any
|
|
395
|
+
).value.fields;
|
|
396
|
+
|
|
397
|
+
// Get interest models.
|
|
398
|
+
const interestModelParentId =
|
|
399
|
+
fields.interest_models.fields.table.fields.id.id;
|
|
400
|
+
const interestModelDynamicFieldObjectResponse =
|
|
401
|
+
await query.cache.queryGetDynamicFieldObject({
|
|
402
|
+
parentId: interestModelParentId,
|
|
403
|
+
name: {
|
|
404
|
+
type: '0x1::type_name::TypeName',
|
|
405
|
+
value: {
|
|
406
|
+
name: coinType.substring(2),
|
|
407
|
+
},
|
|
408
|
+
},
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
const interestModelDynamicFieldObject =
|
|
412
|
+
interestModelDynamicFieldObjectResponse?.data;
|
|
413
|
+
if (
|
|
414
|
+
!(
|
|
415
|
+
interestModelDynamicFieldObject &&
|
|
416
|
+
interestModelDynamicFieldObject.content &&
|
|
417
|
+
'fields' in interestModelDynamicFieldObject.content
|
|
418
|
+
)
|
|
419
|
+
)
|
|
420
|
+
throw new Error(
|
|
421
|
+
`Failed to fetch interestModelDynamicFieldObject for ${poolCoinName}: ${interestModelDynamicFieldObject}`
|
|
422
|
+
);
|
|
423
|
+
const interestModel: InterestModel = (
|
|
424
|
+
interestModelDynamicFieldObject.content.fields as any
|
|
425
|
+
).value.fields;
|
|
426
|
+
|
|
427
|
+
// Get borrow fee.
|
|
428
|
+
const getBorrowFee = async () => {
|
|
429
|
+
const borrowFeeDynamicFieldObjectResponse =
|
|
405
430
|
await query.cache.queryGetDynamicFieldObject({
|
|
406
|
-
parentId:
|
|
431
|
+
parentId: marketId,
|
|
407
432
|
name: {
|
|
408
|
-
type:
|
|
433
|
+
type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
|
|
409
434
|
value: {
|
|
410
|
-
|
|
435
|
+
type: {
|
|
436
|
+
name: coinType.substring(2),
|
|
437
|
+
},
|
|
411
438
|
},
|
|
412
439
|
},
|
|
413
440
|
});
|
|
414
441
|
|
|
415
|
-
const
|
|
416
|
-
|
|
442
|
+
const borrowFeeDynamicFieldObject =
|
|
443
|
+
borrowFeeDynamicFieldObjectResponse?.data;
|
|
417
444
|
if (
|
|
418
445
|
!(
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
'fields' in
|
|
446
|
+
borrowFeeDynamicFieldObject &&
|
|
447
|
+
borrowFeeDynamicFieldObject.content &&
|
|
448
|
+
'fields' in borrowFeeDynamicFieldObject.content
|
|
422
449
|
)
|
|
423
450
|
)
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
const interestModel: InterestModel = (
|
|
428
|
-
interestModelDynamicFieldObject.content.fields as any
|
|
429
|
-
).value.fields;
|
|
430
|
-
|
|
431
|
-
// Get borrow fee.
|
|
432
|
-
const getBorrowFee = async () => {
|
|
433
|
-
const borrowFeeDynamicFieldObjectResponse =
|
|
434
|
-
await query.cache.queryGetDynamicFieldObject({
|
|
435
|
-
parentId: marketId,
|
|
436
|
-
name: {
|
|
437
|
-
type: `${BORROW_FEE_PROTOCOL_ID}::market_dynamic_keys::BorrowFeeKey`,
|
|
438
|
-
value: {
|
|
439
|
-
type: {
|
|
440
|
-
name: coinType.substring(2),
|
|
441
|
-
},
|
|
442
|
-
},
|
|
443
|
-
},
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
const borrowFeeDynamicFieldObject =
|
|
447
|
-
borrowFeeDynamicFieldObjectResponse?.data;
|
|
448
|
-
if (
|
|
449
|
-
!(
|
|
450
|
-
borrowFeeDynamicFieldObject &&
|
|
451
|
-
borrowFeeDynamicFieldObject.content &&
|
|
452
|
-
'fields' in borrowFeeDynamicFieldObject.content
|
|
453
|
-
)
|
|
454
|
-
)
|
|
455
|
-
return { value: '0' };
|
|
456
|
-
return (borrowFeeDynamicFieldObject.content.fields as any).value.fields;
|
|
457
|
-
};
|
|
451
|
+
return { value: '0' };
|
|
452
|
+
return (borrowFeeDynamicFieldObject.content.fields as any).value.fields;
|
|
453
|
+
};
|
|
458
454
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
455
|
+
const parsedMarketPoolData = parseOriginMarketPoolData({
|
|
456
|
+
type: interestModel.type.fields,
|
|
457
|
+
maxBorrowRate: interestModel.max_borrow_rate.fields,
|
|
458
|
+
interestRate: borrowIndex.interest_rate.fields,
|
|
459
|
+
interestRateScale: borrowIndex.interest_rate_scale,
|
|
460
|
+
borrowIndex: borrowIndex.borrow_index,
|
|
461
|
+
lastUpdated: borrowIndex.last_updated,
|
|
462
|
+
cash: balanceSheet.cash,
|
|
463
|
+
debt: balanceSheet.debt,
|
|
464
|
+
marketCoinSupply: balanceSheet.market_coin_supply,
|
|
465
|
+
reserve: balanceSheet.revenue,
|
|
466
|
+
reserveFactor: interestModel.revenue_factor.fields,
|
|
467
|
+
borrowWeight: interestModel.borrow_weight.fields,
|
|
468
|
+
borrowFeeRate: await getBorrowFee(),
|
|
469
|
+
baseBorrowRatePerSec: interestModel.base_borrow_rate_per_sec.fields,
|
|
470
|
+
borrowRateOnHighKink: interestModel.borrow_rate_on_high_kink.fields,
|
|
471
|
+
borrowRateOnMidKink: interestModel.borrow_rate_on_mid_kink.fields,
|
|
472
|
+
highKink: interestModel.high_kink.fields,
|
|
473
|
+
midKink: interestModel.mid_kink.fields,
|
|
474
|
+
minBorrowAmount: interestModel.min_borrow_amount,
|
|
475
|
+
});
|
|
480
476
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
477
|
+
const calculatedMarketPoolData = calculateMarketPoolData(
|
|
478
|
+
query.utils,
|
|
479
|
+
parsedMarketPoolData
|
|
480
|
+
);
|
|
485
481
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
482
|
+
const coinDecimal = query.utils.getCoinDecimal(poolCoinName);
|
|
483
|
+
const maxSupplyCoin = BigNumber(
|
|
484
|
+
(await getSupplyLimit(query.utils, poolCoinName)) ?? '0'
|
|
485
|
+
)
|
|
486
|
+
.shiftedBy(-coinDecimal)
|
|
487
|
+
.toNumber();
|
|
488
|
+
const maxBorrowCoin = BigNumber(
|
|
489
|
+
(await getBorrowLimit(query.utils, poolCoinName)) ?? '0'
|
|
490
|
+
)
|
|
491
|
+
.shiftedBy(-coinDecimal)
|
|
492
|
+
.toNumber();
|
|
497
493
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
} catch (e: any) {
|
|
522
|
-
console.error(e.message);
|
|
523
|
-
}
|
|
494
|
+
return {
|
|
495
|
+
coinName: poolCoinName,
|
|
496
|
+
symbol: query.utils.parseSymbol(poolCoinName),
|
|
497
|
+
coinType: query.utils.parseCoinType(poolCoinName),
|
|
498
|
+
marketCoinType: query.utils.parseMarketCoinType(poolCoinName),
|
|
499
|
+
sCoinType: query.utils.parseSCoinType(
|
|
500
|
+
query.utils.parseMarketCoinName(poolCoinName)
|
|
501
|
+
),
|
|
502
|
+
coinWrappedType: query.utils.getCoinWrappedType(poolCoinName),
|
|
503
|
+
coinDecimal,
|
|
504
|
+
coinPrice: coinPrice ?? 0,
|
|
505
|
+
highKink: parsedMarketPoolData.highKink,
|
|
506
|
+
midKink: parsedMarketPoolData.midKink,
|
|
507
|
+
reserveFactor: parsedMarketPoolData.reserveFactor,
|
|
508
|
+
borrowWeight: parsedMarketPoolData.borrowWeight,
|
|
509
|
+
borrowFee: parsedMarketPoolData.borrowFee,
|
|
510
|
+
marketCoinSupplyAmount: parsedMarketPoolData.marketCoinSupplyAmount,
|
|
511
|
+
minBorrowAmount: parsedMarketPoolData.minBorrowAmount,
|
|
512
|
+
maxSupplyCoin,
|
|
513
|
+
maxBorrowCoin,
|
|
514
|
+
isIsolated: await isIsolatedAsset(query.utils, poolCoinName),
|
|
515
|
+
...calculatedMarketPoolData,
|
|
516
|
+
};
|
|
524
517
|
};
|
|
525
518
|
|
|
526
519
|
/**
|
|
@@ -541,8 +534,7 @@ export const getMarketCollaterals = async (
|
|
|
541
534
|
indexer: boolean = false
|
|
542
535
|
) => {
|
|
543
536
|
const marketId = query.address.get('core.market');
|
|
544
|
-
const coinPrices =
|
|
545
|
-
(await query.utils.getCoinPrices(collateralCoinNames)) ?? {};
|
|
537
|
+
const coinPrices = (await query.utils.getCoinPrices()) ?? {};
|
|
546
538
|
const marketCollaterals: MarketCollaterals = {};
|
|
547
539
|
|
|
548
540
|
if (indexer) {
|
|
@@ -600,10 +592,7 @@ export const getMarketCollateral = async (
|
|
|
600
592
|
coinPrice?: number
|
|
601
593
|
): Promise<MarketCollateral | undefined> => {
|
|
602
594
|
coinPrice =
|
|
603
|
-
coinPrice
|
|
604
|
-
(await query.utils.getCoinPrices([collateralCoinName]))?.[
|
|
605
|
-
collateralCoinName
|
|
606
|
-
];
|
|
595
|
+
coinPrice ?? (await query.utils.getCoinPrices())?.[collateralCoinName];
|
|
607
596
|
|
|
608
597
|
if (indexer) {
|
|
609
598
|
const marketCollateralIndexer =
|
|
@@ -18,8 +18,9 @@ const isolatedAssetZod = zod.object({
|
|
|
18
18
|
}),
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
// const isolatedAssetKeyType = `
|
|
21
|
+
// TODO: enable for production
|
|
22
|
+
// const isolatedAssetKeyType = `0xe7dbb371a9595631f7964b7ece42255ad0e738cc85fe6da26c7221b220f01af6::market_dynamic_keys::IsolatedAssetKey`; // prod
|
|
23
|
+
const isolatedAssetKeyType = `0x6c23585e940a989588432509107e98bae06dbca4e333f26d0635d401b3c7c76d::market_dynamic_keys::IsolatedAssetKey`;
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* Return list of isolated assets coin types
|