@defisaver/positions-sdk 2.1.168 → 2.1.169-custom-fetching-2-dev
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/cjs/helpers/aaveV4Helpers/index.js +11 -1
- package/cjs/markets/morphoBlue/index.d.ts +2 -0
- package/cjs/markets/morphoBlue/index.js +18 -1
- package/cjs/moneymarket/moneymarketCommonService.js +12 -2
- package/cjs/portfolio/customDeFiData.d.ts +3 -0
- package/cjs/portfolio/customDeFiData.js +263 -0
- package/cjs/portfolio/index.d.ts +1 -0
- package/cjs/portfolio/index.js +15 -851
- package/cjs/services/viem.d.ts +2 -0
- package/cjs/services/viem.js +27 -1
- package/cjs/types/common.d.ts +1 -0
- package/cjs/types/common.js +1 -0
- package/cjs/types/morphoBlue.d.ts +1 -0
- package/cjs/types/morphoBlue.js +1 -0
- package/cjs/types/portfolio.d.ts +36 -0
- package/cjs/types/portfolio.js +18 -0
- package/esm/helpers/aaveV4Helpers/index.js +11 -1
- package/esm/markets/morphoBlue/index.d.ts +2 -0
- package/esm/markets/morphoBlue/index.js +16 -0
- package/esm/moneymarket/moneymarketCommonService.js +12 -2
- package/esm/portfolio/customDeFiData.d.ts +3 -0
- package/esm/portfolio/customDeFiData.js +257 -0
- package/esm/portfolio/index.d.ts +1 -0
- package/esm/portfolio/index.js +16 -849
- package/esm/services/viem.d.ts +2 -0
- package/esm/services/viem.js +25 -0
- package/esm/types/common.d.ts +1 -0
- package/esm/types/common.js +1 -0
- package/esm/types/morphoBlue.d.ts +1 -0
- package/esm/types/morphoBlue.js +1 -0
- package/esm/types/portfolio.d.ts +36 -0
- package/esm/types/portfolio.js +17 -1
- package/package.json +2 -2
- package/src/helpers/aaveV4Helpers/index.ts +12 -1
- package/src/markets/morphoBlue/index.ts +16 -0
- package/src/moneymarket/moneymarketCommonService.ts +13 -2
- package/src/portfolio/customDeFiData.ts +379 -0
- package/src/portfolio/index.ts +16 -834
- package/src/services/viem.ts +14 -0
- package/src/types/common.ts +1 -0
- package/src/types/morphoBlue.ts +1 -0
- package/src/types/portfolio.ts +39 -0
package/esm/services/viem.d.ts
CHANGED
|
@@ -4393,6 +4393,8 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
|
|
|
4393
4393
|
uid?: undefined;
|
|
4394
4394
|
} & import("viem").ExactPartial<Pick<import("viem").PublicActions<import("viem").Transport, undefined, undefined>, "getBlockNumber" | "call" | "createContractEventFilter" | "createEventFilter" | "estimateContractGas" | "estimateGas" | "getBlock" | "getChainId" | "getContractEvents" | "getEnsText" | "getFilterChanges" | "getGasPrice" | "getLogs" | "getTransaction" | "getTransactionCount" | "getTransactionReceipt" | "prepareTransactionRequest" | "readContract" | "sendRawTransaction" | "simulateContract" | "uninstallFilter" | "watchBlockNumber" | "watchContractEvent"> & Pick<import("viem").WalletActions<undefined, undefined>, "sendTransaction" | "writeContract">>>(fn: (client: import("viem").Client<import("viem").Transport, undefined, undefined, import("viem").PublicRpcSchema, import("viem").PublicActions<import("viem").Transport, undefined>>) => client) => import("viem").Client<import("viem").Transport, undefined, undefined, import("viem").PublicRpcSchema, { [K in keyof client]: client[K]; } & import("viem").PublicActions<import("viem").Transport, undefined>>;
|
|
4395
4395
|
};
|
|
4396
|
+
/** Rewrites 'latest' reads so a client built on this provider sees a fixed block. */
|
|
4397
|
+
export declare const pinProviderBlock: (provider: EthereumProvider, blockNumber: number | bigint) => EthereumProvider;
|
|
4396
4398
|
export declare const setViemBlockNumber: (block: Blockish) => {
|
|
4397
4399
|
blockNumber?: undefined;
|
|
4398
4400
|
} | {
|
package/esm/services/viem.js
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { createPublicClient, custom, encodeFunctionData, } from 'viem';
|
|
2
11
|
import { arbitrum, base, mainnet, optimism, linea, plasma, } from 'viem/chains';
|
|
3
12
|
import { NetworkNumber } from '../types/common';
|
|
@@ -20,6 +29,22 @@ export const getViemChain = (network) => {
|
|
|
20
29
|
}
|
|
21
30
|
};
|
|
22
31
|
export const getViemProvider = (provider, network, options) => createPublicClient(Object.assign({ transport: custom(provider), chain: getViemChain(network) }, options));
|
|
32
|
+
/** Rewrites 'latest' reads so a client built on this provider sees a fixed block. */
|
|
33
|
+
export const pinProviderBlock = (provider, blockNumber) => {
|
|
34
|
+
const block = `0x${BigInt(blockNumber).toString(16)}`;
|
|
35
|
+
return {
|
|
36
|
+
request: (args) => __awaiter(void 0, void 0, void 0, function* () {
|
|
37
|
+
const params = [...(args.params || [])];
|
|
38
|
+
if (args.method === 'eth_blockNumber')
|
|
39
|
+
return block;
|
|
40
|
+
if (['eth_call', 'eth_getCode', 'eth_getBalance', 'eth_getStorageAt'].includes(args.method) && (params[1] === undefined || params[1] === 'latest'))
|
|
41
|
+
params[1] = block;
|
|
42
|
+
if (args.method === 'eth_getBlockByNumber' && params[0] === 'latest')
|
|
43
|
+
params[0] = block;
|
|
44
|
+
return provider.request(Object.assign(Object.assign({}, args), { params }));
|
|
45
|
+
}),
|
|
46
|
+
};
|
|
47
|
+
};
|
|
23
48
|
export const setViemBlockNumber = (block) => {
|
|
24
49
|
if (block === 'latest')
|
|
25
50
|
return {};
|
package/esm/types/common.d.ts
CHANGED
package/esm/types/common.js
CHANGED
|
@@ -27,6 +27,7 @@ export var LeverageType;
|
|
|
27
27
|
LeverageType["Short"] = "short";
|
|
28
28
|
LeverageType["VolatilePair"] = "volatile-pair";
|
|
29
29
|
LeverageType["VolatilePairReverse"] = "volatile-pair-reverse";
|
|
30
|
+
LeverageType["StablePair"] = "stable-pair";
|
|
30
31
|
LeverageType["None"] = "";
|
|
31
32
|
})(LeverageType || (LeverageType = {}));
|
|
32
33
|
export var NetworkNumber;
|
|
@@ -110,6 +110,7 @@ export declare enum MorphoBlueVersions {
|
|
|
110
110
|
MorphoBlueUSDeUSDC_915_Base = "morphoblueusdeusdc_915_base",// USDe/USDC 0.915
|
|
111
111
|
MorphoBlueCbEthUSDC_770_Base = "morphobluecbethusdc_770_base",// cbETH/USDC 0.77
|
|
112
112
|
MorphoBlueCbXRPUSDC_625_Base = "morphobluecbxrpusdc_625_base",// cbXRP/USDC 0.625
|
|
113
|
+
MorphoBlueCbHYPEUSDC_625_Base = "morphobluecbhypeusdc_625_base",// cbHYPE/USDC 0.625
|
|
113
114
|
MorphoBlueSyrupUSDCUSDC_915_Arb = "morphobluesyrupusdcusdc_915_arb",// syrupUSDC/USDC
|
|
114
115
|
MorphoBlueWBTCUSDC_860_Arb = "morphobluewbtcusdc_860_arb",// WBTC/USDC
|
|
115
116
|
MorphoBlueWstEthUSDC_860_Arb = "morphobluewstethusdc_860_arb",// wstETH/USDC
|
package/esm/types/morphoBlue.js
CHANGED
|
@@ -117,6 +117,7 @@ export var MorphoBlueVersions;
|
|
|
117
117
|
MorphoBlueVersions["MorphoBlueUSDeUSDC_915_Base"] = "morphoblueusdeusdc_915_base";
|
|
118
118
|
MorphoBlueVersions["MorphoBlueCbEthUSDC_770_Base"] = "morphobluecbethusdc_770_base";
|
|
119
119
|
MorphoBlueVersions["MorphoBlueCbXRPUSDC_625_Base"] = "morphobluecbxrpusdc_625_base";
|
|
120
|
+
MorphoBlueVersions["MorphoBlueCbHYPEUSDC_625_Base"] = "morphobluecbhypeusdc_625_base";
|
|
120
121
|
// ARBITRUM
|
|
121
122
|
MorphoBlueVersions["MorphoBlueSyrupUSDCUSDC_915_Arb"] = "morphobluesyrupusdcusdc_915_arb";
|
|
122
123
|
MorphoBlueVersions["MorphoBlueWBTCUSDC_860_Arb"] = "morphobluewbtcusdc_860_arb";
|
package/esm/types/portfolio.d.ts
CHANGED
|
@@ -60,6 +60,42 @@ export interface PortfolioPositionsDataForAddress {
|
|
|
60
60
|
export interface PortfolioPositionsData {
|
|
61
61
|
[key: EthAddress]: PortfolioPositionsDataForAddress;
|
|
62
62
|
}
|
|
63
|
+
export declare enum PortfolioProtocol {
|
|
64
|
+
AaveV2 = "aaveV2",
|
|
65
|
+
AaveV3 = "aaveV3",
|
|
66
|
+
AaveV4 = "aaveV4",
|
|
67
|
+
CompoundV2 = "compoundV2",
|
|
68
|
+
CompoundV3 = "compoundV3",
|
|
69
|
+
Spark = "spark",
|
|
70
|
+
MorphoBlue = "morphoBlue",
|
|
71
|
+
MorphoMidnight = "morphoMidnight",
|
|
72
|
+
CrvUsd = "crvUsd",
|
|
73
|
+
LlamaLend = "llamaLend",
|
|
74
|
+
Maker = "maker",
|
|
75
|
+
Liquity = "liquity",
|
|
76
|
+
LiquityV2 = "liquityV2",
|
|
77
|
+
Fluid = "fluid"
|
|
78
|
+
}
|
|
79
|
+
export interface CustomDeFiDataOptions {
|
|
80
|
+
/** Defaults to every protocol. */
|
|
81
|
+
protocols?: PortfolioProtocol[];
|
|
82
|
+
fetchStaking?: boolean;
|
|
83
|
+
fetchRewards?: boolean;
|
|
84
|
+
/** Keep Aave V3 / Spark positions with no supply so the eMode category is available. */
|
|
85
|
+
returnEmptyEModePositions?: boolean;
|
|
86
|
+
fetchFluidMarkets?: boolean;
|
|
87
|
+
isSim?: boolean;
|
|
88
|
+
/** viem multicall calldata cap in bytes; defaults to 250k (2k when isSim). */
|
|
89
|
+
batchSize?: number;
|
|
90
|
+
/** Pins every read to this block; defaults to latest. */
|
|
91
|
+
blockNumber?: number;
|
|
92
|
+
}
|
|
93
|
+
export interface CustomDeFiData {
|
|
94
|
+
positions: PortfolioPositionsData;
|
|
95
|
+
stakingPositions: Record<string, any>;
|
|
96
|
+
rewardsData: Record<string, any>;
|
|
97
|
+
markets: PortfolioMarketsData;
|
|
98
|
+
}
|
|
63
99
|
export interface PortfolioMarketsData {
|
|
64
100
|
morphoMarketsData: Record<string, MorphoBlueMarketInfo>;
|
|
65
101
|
morphoMidnightMarketsData: Record<string, MorphoMidnightMarketInfo>;
|
package/esm/types/portfolio.js
CHANGED
|
@@ -1 +1,17 @@
|
|
|
1
|
-
export
|
|
1
|
+
export var PortfolioProtocol;
|
|
2
|
+
(function (PortfolioProtocol) {
|
|
3
|
+
PortfolioProtocol["AaveV2"] = "aaveV2";
|
|
4
|
+
PortfolioProtocol["AaveV3"] = "aaveV3";
|
|
5
|
+
PortfolioProtocol["AaveV4"] = "aaveV4";
|
|
6
|
+
PortfolioProtocol["CompoundV2"] = "compoundV2";
|
|
7
|
+
PortfolioProtocol["CompoundV3"] = "compoundV3";
|
|
8
|
+
PortfolioProtocol["Spark"] = "spark";
|
|
9
|
+
PortfolioProtocol["MorphoBlue"] = "morphoBlue";
|
|
10
|
+
PortfolioProtocol["MorphoMidnight"] = "morphoMidnight";
|
|
11
|
+
PortfolioProtocol["CrvUsd"] = "crvUsd";
|
|
12
|
+
PortfolioProtocol["LlamaLend"] = "llamaLend";
|
|
13
|
+
PortfolioProtocol["Maker"] = "maker";
|
|
14
|
+
PortfolioProtocol["Liquity"] = "liquity";
|
|
15
|
+
PortfolioProtocol["LiquityV2"] = "liquityV2";
|
|
16
|
+
PortfolioProtocol["Fluid"] = "fluid";
|
|
17
|
+
})(PortfolioProtocol || (PortfolioProtocol = {}));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@defisaver/positions-sdk",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.169-custom-fetching-2-dev",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./esm/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"repository": "https://github.com/defisaver/defisaver-positions-sdk",
|
|
23
23
|
"license": "ISC",
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@defisaver/tokens": "^1.7.
|
|
25
|
+
"@defisaver/tokens": "^1.7.50",
|
|
26
26
|
"@types/lodash": "^4.17.15",
|
|
27
27
|
"@types/memoizee": "^0.4.12",
|
|
28
28
|
"decimal.js": "^10.6.0",
|
|
@@ -198,13 +198,17 @@ export const isLeveragedPosAaveV4 = (usedAssets: AaveV4UsedReserveAssets, dustLi
|
|
|
198
198
|
let supplyUnstable = 0;
|
|
199
199
|
let longAsset = '';
|
|
200
200
|
let shortAsset = '';
|
|
201
|
+
let stableCollAsset = '';
|
|
201
202
|
Object.values(usedAssets).forEach(({
|
|
202
203
|
symbol, suppliedUsd, borrowedUsd, collateral, reserveId,
|
|
203
204
|
}) => {
|
|
204
205
|
const spokeAsset = `${symbol}-${reserveId}`;
|
|
205
206
|
const isSupplied = (+suppliedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
206
207
|
const isBorrowed = (+borrowedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
207
|
-
if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral)
|
|
208
|
+
if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral) {
|
|
209
|
+
supplyStable += 1;
|
|
210
|
+
stableCollAsset = spokeAsset;
|
|
211
|
+
}
|
|
208
212
|
if (isBorrowed && STABLE_ASSETS.includes(symbol)) borrowStable += 1;
|
|
209
213
|
if (isBorrowed && !STABLE_ASSETS.includes(symbol)) {
|
|
210
214
|
borrowUnstable += 1;
|
|
@@ -218,6 +222,7 @@ export const isLeveragedPosAaveV4 = (usedAssets: AaveV4UsedReserveAssets, dustLi
|
|
|
218
222
|
const isLong = borrowStable > 0 && borrowUnstable === 0 && supplyUnstable === 1 && supplyStable === 0;
|
|
219
223
|
const isShort = supplyStable > 0 && supplyUnstable === 0 && borrowUnstable === 1 && borrowStable === 0;
|
|
220
224
|
const isVolatilePair = supplyUnstable === 1 && borrowUnstable === 1 && supplyStable === 0 && borrowStable === 0;
|
|
225
|
+
const isStablePair = supplyStable === 1 && borrowStable === 1 && supplyUnstable === 0 && borrowUnstable === 0;
|
|
221
226
|
if (isLong) {
|
|
222
227
|
return {
|
|
223
228
|
leveragedType: LeverageType.Long,
|
|
@@ -236,6 +241,12 @@ export const isLeveragedPosAaveV4 = (usedAssets: AaveV4UsedReserveAssets, dustLi
|
|
|
236
241
|
leveragedAsset: longAsset,
|
|
237
242
|
};
|
|
238
243
|
}
|
|
244
|
+
if (isStablePair) {
|
|
245
|
+
return {
|
|
246
|
+
leveragedType: LeverageType.StablePair,
|
|
247
|
+
leveragedAsset: stableCollAsset,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
239
250
|
return {
|
|
240
251
|
leveragedType: LeverageType.None,
|
|
241
252
|
leveragedAsset: '',
|
|
@@ -1659,6 +1659,21 @@ export const MORPHO_BLUE_CBXRP_USDC_625_BASE = (networkId: NetworkNumber = Netwo
|
|
|
1659
1659
|
marketId: '0xd4a903dc6d949519060c7707f9604fdc9772c046e05c2e3a8fce0bd7196e4109',
|
|
1660
1660
|
protocolName: 'morpho-blue',
|
|
1661
1661
|
});
|
|
1662
|
+
export const MORPHO_BLUE_CBHYPE_USDC_625_BASE = (networkId: NetworkNumber = NetworkNumber.Base): MorphoBlueMarketData => ({
|
|
1663
|
+
chainIds: [NetworkNumber.Base],
|
|
1664
|
+
label: 'Morpho Blue',
|
|
1665
|
+
shortLabel: 'cbHYPE/USDC',
|
|
1666
|
+
value: MorphoBlueVersions.MorphoBlueCbHYPEUSDC_625_Base,
|
|
1667
|
+
url: 'cbhypeusdc-76629002',
|
|
1668
|
+
loanToken: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
1669
|
+
collateralToken: '0xB200000000000000000000451d033a5000cb479e',
|
|
1670
|
+
oracle: '0x7FaD8B8De2DDb7b4B415e1Aa3613e45EeF9E4bFf',
|
|
1671
|
+
oracleType: MorphoBlueOracleType.MARKET_RATE,
|
|
1672
|
+
irm: '0x46415998764C29aB2a25CbeA6254146D50D22687',
|
|
1673
|
+
lltv: 0.625,
|
|
1674
|
+
marketId: '0x76629002c9fdb20fb2092053a4f22c5c65e04a81887218b9546f2a2d82b4c0a8',
|
|
1675
|
+
protocolName: 'morpho-blue',
|
|
1676
|
+
});
|
|
1662
1677
|
|
|
1663
1678
|
// ARBITRUM
|
|
1664
1679
|
export const MORPHO_BLUE_SYRUPUSDC_USDC_915_ARB = (networkId: NetworkNumber = NetworkNumber.Eth): MorphoBlueMarketData => ({
|
|
@@ -1935,6 +1950,7 @@ export const MorphoBlueMarkets = (networkId: NetworkNumber) => ({
|
|
|
1935
1950
|
[MorphoBlueVersions.MorphoBlueUSDeUSDC_915_Base]: MORPHO_BLUE_USDE_USDC_915_BASE(networkId),
|
|
1936
1951
|
[MorphoBlueVersions.MorphoBlueCbEthUSDC_770_Base]: MORPHO_BLUE_CBETH_USDC_770_BASE(networkId),
|
|
1937
1952
|
[MorphoBlueVersions.MorphoBlueCbXRPUSDC_625_Base]: MORPHO_BLUE_CBXRP_USDC_625_BASE(networkId),
|
|
1953
|
+
[MorphoBlueVersions.MorphoBlueCbHYPEUSDC_625_Base]: MORPHO_BLUE_CBHYPE_USDC_625_BASE(networkId),
|
|
1938
1954
|
[MorphoBlueVersions.MorphoBlueWsuperOETHbWETH_915_Base]: MORPHO_BLUE_WSUPEROETHB_WETH_915_BASE(networkId),
|
|
1939
1955
|
[MorphoBlueVersions.MorphoBlueCbEthEth_945_Base]: MORPHO_BLUE_CBETH_ETH_945_BASE(networkId),
|
|
1940
1956
|
[MorphoBlueVersions.MorphoBlueCbEthEth_965_Base]: MORPHO_BLUE_CBETH_ETH_965_BASE(networkId),
|
|
@@ -13,7 +13,7 @@ export const calcShortLiqPrice = (assetPrice: string, borrowedUsd: string, borro
|
|
|
13
13
|
|
|
14
14
|
export const calcLeverageLiqPrice = (leverageType: LeverageType, assetPrice: string, borrowedUsd: string, borrowLimitUsd: string) => {
|
|
15
15
|
if (leverageType === LeverageType.Short || leverageType === LeverageType.VolatilePairReverse) return calcShortLiqPrice(assetPrice, borrowedUsd, borrowLimitUsd);
|
|
16
|
-
if (leverageType === LeverageType.Long || leverageType === LeverageType.VolatilePair) return calcLongLiqPrice(assetPrice, borrowedUsd, borrowLimitUsd);
|
|
16
|
+
if (leverageType === LeverageType.Long || leverageType === LeverageType.VolatilePair || leverageType === LeverageType.StablePair) return calcLongLiqPrice(assetPrice, borrowedUsd, borrowLimitUsd);
|
|
17
17
|
console.error('invalid leverageType', leverageType);
|
|
18
18
|
return '0';
|
|
19
19
|
};
|
|
@@ -37,12 +37,16 @@ export const isLeveragedPos = (usedAssets: MMUsedAssets, dustLimit = 5) => {
|
|
|
37
37
|
let supplyUnstable = 0;
|
|
38
38
|
let longAsset = '';
|
|
39
39
|
let shortAsset = '';
|
|
40
|
+
let stableCollAsset = '';
|
|
40
41
|
Object.values(usedAssets).forEach(({
|
|
41
42
|
symbol, suppliedUsd, borrowedUsd, collateral,
|
|
42
43
|
}) => {
|
|
43
44
|
const isSupplied = (+suppliedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
44
45
|
const isBorrowed = (+borrowedUsd) > dustLimit; // ignore dust like <limit leftover supply
|
|
45
|
-
if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral)
|
|
46
|
+
if (isSupplied && STABLE_ASSETS.includes(symbol) && collateral) {
|
|
47
|
+
supplyStable += 1;
|
|
48
|
+
stableCollAsset = symbol;
|
|
49
|
+
}
|
|
46
50
|
if (isBorrowed && STABLE_ASSETS.includes(symbol)) borrowStable += 1;
|
|
47
51
|
if (isBorrowed && !STABLE_ASSETS.includes(symbol)) {
|
|
48
52
|
borrowUnstable += 1;
|
|
@@ -56,6 +60,7 @@ export const isLeveragedPos = (usedAssets: MMUsedAssets, dustLimit = 5) => {
|
|
|
56
60
|
const isLong = borrowStable > 0 && borrowUnstable === 0 && supplyUnstable === 1 && supplyStable === 0;
|
|
57
61
|
const isShort = supplyStable > 0 && supplyUnstable === 0 && borrowUnstable === 1 && borrowStable === 0;
|
|
58
62
|
const isVolatilePair = supplyUnstable === 1 && borrowUnstable === 1 && supplyStable === 0 && borrowStable === 0;
|
|
63
|
+
const isStablePair = supplyStable === 1 && borrowStable === 1 && supplyUnstable === 0 && borrowUnstable === 0;
|
|
59
64
|
if (isLong) {
|
|
60
65
|
return {
|
|
61
66
|
leveragedType: LeverageType.Long,
|
|
@@ -74,6 +79,12 @@ export const isLeveragedPos = (usedAssets: MMUsedAssets, dustLimit = 5) => {
|
|
|
74
79
|
leveragedAsset: longAsset,
|
|
75
80
|
};
|
|
76
81
|
}
|
|
82
|
+
if (isStablePair) {
|
|
83
|
+
return {
|
|
84
|
+
leveragedType: LeverageType.StablePair,
|
|
85
|
+
leveragedAsset: stableCollAsset,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
77
88
|
return {
|
|
78
89
|
leveragedType: LeverageType.None,
|
|
79
90
|
leveragedAsset: '',
|