@defisaver/positions-sdk 2.1.161-portfolio-api-1-dev → 2.1.161
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/portfolio/index.d.ts +2 -2
- package/cjs/portfolio/index.js +3 -5
- package/cjs/savings/index.js +5 -2
- package/cjs/savings/morphoVaults/index.d.ts +1 -1
- package/cjs/savings/morphoVaults/index.js +56 -18
- package/cjs/savings/morphoVaults/options.d.ts +2 -0
- package/cjs/savings/morphoVaults/options.js +61 -1
- package/cjs/types/aave.d.ts +2 -15
- package/cjs/types/compound.d.ts +2 -26
- package/cjs/types/curveUsd.d.ts +1 -9
- package/cjs/types/llamaLend.d.ts +1 -12
- package/cjs/types/morphoBlue.d.ts +0 -2
- package/cjs/types/portfolio.d.ts +8 -23
- package/cjs/types/savings/morphoVaults.d.ts +10 -2
- package/cjs/types/savings/morphoVaults.js +9 -1
- package/cjs/types/spark.d.ts +1 -21
- package/esm/portfolio/index.d.ts +2 -2
- package/esm/portfolio/index.js +3 -5
- package/esm/savings/index.js +5 -2
- package/esm/savings/morphoVaults/index.d.ts +1 -1
- package/esm/savings/morphoVaults/index.js +57 -19
- package/esm/savings/morphoVaults/options.d.ts +2 -0
- package/esm/savings/morphoVaults/options.js +61 -1
- package/esm/types/aave.d.ts +2 -15
- package/esm/types/compound.d.ts +2 -26
- package/esm/types/curveUsd.d.ts +1 -9
- package/esm/types/llamaLend.d.ts +1 -12
- package/esm/types/morphoBlue.d.ts +0 -2
- package/esm/types/portfolio.d.ts +8 -23
- package/esm/types/savings/morphoVaults.d.ts +10 -2
- package/esm/types/savings/morphoVaults.js +8 -0
- package/esm/types/spark.d.ts +1 -21
- package/package.json +1 -1
- package/src/portfolio/index.ts +4 -7
- package/src/savings/index.ts +5 -2
- package/src/savings/morphoVaults/index.ts +73 -21
- package/src/savings/morphoVaults/options.ts +67 -1
- package/src/types/aave.ts +1 -18
- package/src/types/compound.ts +2 -38
- package/src/types/curveUsd.ts +1 -17
- package/src/types/llamaLend.ts +1 -19
- package/src/types/morphoBlue.ts +0 -3
- package/src/types/portfolio.ts +9 -28
- package/src/types/savings/morphoVaults.ts +11 -1
- package/src/types/spark.ts +1 -25
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EthAddress } from '../common';
|
|
1
|
+
import { EthAddress, NetworkNumber } from '../common';
|
|
2
2
|
export declare enum MorphoVaultType {
|
|
3
3
|
MorphoVaultFlagshipEth = "morpho_vault_flagship_eth",
|
|
4
4
|
MorphoVaultGauntletUSDCCore = "morpho_vault_gauntlet_usdc_core",
|
|
@@ -17,13 +17,21 @@ export declare enum MorphoVaultType {
|
|
|
17
17
|
MorphoVaultSteakhousePYUSD = "morpho_vault_steakhouse_pyusd",
|
|
18
18
|
MorphoVaultSmokehouseUSDT = "morpho_vault_smokehouse_usdt",
|
|
19
19
|
MorphoVaultSmokehouseUSDC = "morpho_vault_smokehouse_usdc",
|
|
20
|
-
MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai"
|
|
20
|
+
MorphoVaultSmokehouseDAI = "morpho_vault_smokehouse_dai",
|
|
21
|
+
MorphoVaultGauntletUSDGPremium = "morpho_vault_gauntlet_usdg_premium",
|
|
22
|
+
MorphoVaultSteakhouseUSDGPro = "morpho_vault_steakhouse_usdg_pro"
|
|
23
|
+
}
|
|
24
|
+
export declare enum MorphoVaultVersion {
|
|
25
|
+
V1 = 1,
|
|
26
|
+
V2 = 2
|
|
21
27
|
}
|
|
22
28
|
export interface MorphoVault {
|
|
23
29
|
type: MorphoVaultType;
|
|
24
30
|
name: string;
|
|
25
31
|
address: EthAddress;
|
|
26
32
|
asset: string;
|
|
33
|
+
network: NetworkNumber;
|
|
34
|
+
version: MorphoVaultVersion;
|
|
27
35
|
deploymentBlock: number;
|
|
28
36
|
isLegacy: boolean;
|
|
29
37
|
}
|
|
@@ -20,4 +20,12 @@ export var MorphoVaultType;
|
|
|
20
20
|
MorphoVaultType["MorphoVaultSmokehouseUSDT"] = "morpho_vault_smokehouse_usdt";
|
|
21
21
|
MorphoVaultType["MorphoVaultSmokehouseUSDC"] = "morpho_vault_smokehouse_usdc";
|
|
22
22
|
MorphoVaultType["MorphoVaultSmokehouseDAI"] = "morpho_vault_smokehouse_dai";
|
|
23
|
+
// Vault V2
|
|
24
|
+
MorphoVaultType["MorphoVaultGauntletUSDGPremium"] = "morpho_vault_gauntlet_usdg_premium";
|
|
25
|
+
MorphoVaultType["MorphoVaultSteakhouseUSDGPro"] = "morpho_vault_steakhouse_usdg_pro";
|
|
23
26
|
})(MorphoVaultType || (MorphoVaultType = {}));
|
|
27
|
+
export var MorphoVaultVersion;
|
|
28
|
+
(function (MorphoVaultVersion) {
|
|
29
|
+
MorphoVaultVersion[MorphoVaultVersion["V1"] = 1] = "V1";
|
|
30
|
+
MorphoVaultVersion[MorphoVaultVersion["V2"] = 2] = "V2";
|
|
31
|
+
})(MorphoVaultVersion || (MorphoVaultVersion = {}));
|
package/esm/types/spark.d.ts
CHANGED
|
@@ -46,21 +46,6 @@ export interface SparkAssetData extends MMAssetData {
|
|
|
46
46
|
eModeCategory: number;
|
|
47
47
|
liquidationBonus: string;
|
|
48
48
|
liquidationRatio: string;
|
|
49
|
-
debtCeilingForIsolationMode?: string;
|
|
50
|
-
isSiloed?: boolean;
|
|
51
|
-
isolationModeTotalDebt?: string;
|
|
52
|
-
isolationModeBorrowingEnabled?: boolean;
|
|
53
|
-
assetId?: number;
|
|
54
|
-
borrowRateStable?: string;
|
|
55
|
-
supplyCap?: string;
|
|
56
|
-
isInactive?: boolean;
|
|
57
|
-
isFrozen?: boolean;
|
|
58
|
-
isPaused?: boolean;
|
|
59
|
-
canBeWithdrawn?: boolean;
|
|
60
|
-
canBePayBacked?: boolean;
|
|
61
|
-
disabledStableBorrowing?: boolean;
|
|
62
|
-
isFlashLoanEnabled?: boolean;
|
|
63
|
-
aTokenAddress?: EthAddress;
|
|
64
49
|
}
|
|
65
50
|
export interface SparkAssetsData {
|
|
66
51
|
[token: string]: SparkAssetData;
|
|
@@ -115,12 +100,7 @@ export interface SparkAggregatedPositionData {
|
|
|
115
100
|
minHealthRatio: string;
|
|
116
101
|
exposure: string;
|
|
117
102
|
}
|
|
118
|
-
|
|
119
|
-
* Fields sparkGetAggregatedPositionData adds to every Spark position at runtime, on top of those declared below.
|
|
120
|
-
* Optional, so code that builds a position by hand keeps compiling.
|
|
121
|
-
*/
|
|
122
|
-
export type SparkPositionAggregatedFields = Partial<Omit<SparkAggregatedPositionData, keyof MMPositionData | 'ratio' | 'collRatio' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'suppliedCollateralUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
|
|
123
|
-
export interface SparkPositionData extends MMPositionData, SparkPositionAggregatedFields {
|
|
103
|
+
export interface SparkPositionData extends MMPositionData {
|
|
124
104
|
ratio: string;
|
|
125
105
|
minRatio: string;
|
|
126
106
|
collRatio: string;
|
package/package.json
CHANGED
package/src/portfolio/index.ts
CHANGED
|
@@ -27,7 +27,6 @@ import {
|
|
|
27
27
|
LlamaLendGlobalMarketData,
|
|
28
28
|
MorphoBlueMarketInfo,
|
|
29
29
|
MorphoMidnightMarketInfo,
|
|
30
|
-
PortfolioMarketsData,
|
|
31
30
|
PortfolioPositionsData,
|
|
32
31
|
SparkMarketsData,
|
|
33
32
|
} from '../types';
|
|
@@ -56,7 +55,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
56
55
|
positions: PortfolioPositionsData;
|
|
57
56
|
stakingPositions: any;
|
|
58
57
|
rewardsData: any;
|
|
59
|
-
markets:
|
|
58
|
+
markets: any;
|
|
60
59
|
}> {
|
|
61
60
|
const isMainnet = network === NetworkNumber.Eth;
|
|
62
61
|
const isFluidSupported = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Base, NetworkNumber.Plasma].includes(network);
|
|
@@ -97,7 +96,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
97
96
|
const liquityV2MarketsData: Record<string, LiquityV2MarketData> = {};
|
|
98
97
|
const aaveV4SpokesData: Record<string, AaveV4SpokeData> = {};
|
|
99
98
|
|
|
100
|
-
const markets
|
|
99
|
+
const markets = {
|
|
101
100
|
morphoMarketsData,
|
|
102
101
|
morphoMidnightMarketsData,
|
|
103
102
|
compoundV3MarketsData,
|
|
@@ -507,9 +506,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
507
506
|
positions[address.toLowerCase() as EthAddress].spark[market.value] = { error: `Error fetching Spark account data for address ${address} on market ${market.value}`, data: null };
|
|
508
507
|
}
|
|
509
508
|
})).flat(),
|
|
510
|
-
|
|
511
|
-
// before a vault's data lands and the vault is missing from the result.
|
|
512
|
-
...addresses.flatMap((address) => (makerCdps[address.toLowerCase() as EthAddress] ?? []).map(async (cdpInfo) => {
|
|
509
|
+
...addresses.map(async (address) => makerCdps[address.toLowerCase() as EthAddress]?.map(async (cdpInfo) => {
|
|
513
510
|
try {
|
|
514
511
|
const cdpData = await _getMakerCdpData(client, network, cdpInfo);
|
|
515
512
|
if (cdpData) {
|
|
@@ -519,7 +516,7 @@ export async function getPortfolioData(provider: EthereumProvider, network: Netw
|
|
|
519
516
|
console.error(`Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}:`, error);
|
|
520
517
|
positions[address.toLowerCase() as EthAddress].maker[cdpInfo.id] = { error: `Error fetching Maker CDP data for address ${address} with ID ${cdpInfo.id}`, data: null };
|
|
521
518
|
}
|
|
522
|
-
})),
|
|
519
|
+
})).flat(),
|
|
523
520
|
...aaveV2Markets.map((market) => addresses.map(async (address) => {
|
|
524
521
|
try {
|
|
525
522
|
const accData = await _getAaveV2AccountData(client, network, address, aaveV2MarketsData[market.value].assetsData, market);
|
package/src/savings/index.ts
CHANGED
|
@@ -32,7 +32,8 @@ export const getSavingsData = async (
|
|
|
32
32
|
network: NetworkNumber,
|
|
33
33
|
accounts: EthAddress[],
|
|
34
34
|
) => {
|
|
35
|
-
const morphoVaultsList = Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS) as MorphoVaultType[]
|
|
35
|
+
const morphoVaultsList = (Object.keys(morphoVaults.morphoVaultsOptions.MORPHO_VAULTS) as MorphoVaultType[])
|
|
36
|
+
.filter((key) => morphoVaults.morphoVaultsOptions.getMorphoVault(key).network === network);
|
|
36
37
|
const yearnVaultsList = Object.keys(yearnVaults.yearnVaultsOptions.YEARN_VAULTS) as YearnVaultType[];
|
|
37
38
|
const sparkSavingsVaultsList = Object.keys(sparkSavingsVaults.sparkSavingsVaultsOptions.SPARK_SAVINGS_VAULTS) as SparkSavingsVaultType[];
|
|
38
39
|
const yearnV3VaultsList = Object.keys(yearnV3Vaults.yearnV3VaultsOptions.YEARN_V3_VAULTS) as YearnV3VaultType[];
|
|
@@ -42,7 +43,7 @@ export const getSavingsData = async (
|
|
|
42
43
|
const savingsData: SavingsData = {};
|
|
43
44
|
|
|
44
45
|
await Promise.all([
|
|
45
|
-
...(
|
|
46
|
+
...(morphoVaultsList.length ? [
|
|
46
47
|
(async () => {
|
|
47
48
|
try {
|
|
48
49
|
const vaults = morphoVaultsList.map((vaultKey) => morphoVaults.morphoVaultsOptions.getMorphoVault(vaultKey));
|
|
@@ -52,6 +53,8 @@ export const getSavingsData = async (
|
|
|
52
53
|
console.error('[getSavingsData] Error fetching morpho vaults:', err);
|
|
53
54
|
}
|
|
54
55
|
})(),
|
|
56
|
+
] : []),
|
|
57
|
+
...(network === NetworkNumber.Eth ? [
|
|
55
58
|
...yearnVaultsList.map(async (vaultKey) => {
|
|
56
59
|
try {
|
|
57
60
|
const vault = yearnVaults.yearnVaultsOptions.getYearnVault(vaultKey);
|
|
@@ -4,10 +4,10 @@ import { request as graphqlRequest } from 'graphql-request';
|
|
|
4
4
|
import { assetAmountInEth } from '@defisaver/tokens';
|
|
5
5
|
import * as morphoVaultsOptions from './options';
|
|
6
6
|
import {
|
|
7
|
-
EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, SavingsVaultData,
|
|
7
|
+
EthAddress, EthereumProvider, NetworkNumber, MorphoVault, MorphoVaultType, MorphoVaultVersion, SavingsVaultData,
|
|
8
8
|
} from '../../types';
|
|
9
9
|
import { getViemProvider } from '../../services/viem';
|
|
10
|
-
import { getMorphoVaultContractViem } from '../../contracts';
|
|
10
|
+
import { getErc4626ContractViem, getMorphoVaultContractViem } from '../../contracts';
|
|
11
11
|
import { MORPHO_API_URL } from '../../constants';
|
|
12
12
|
|
|
13
13
|
export {
|
|
@@ -17,38 +17,49 @@ export {
|
|
|
17
17
|
// Morpho API caps list page size at 100 items
|
|
18
18
|
const MORPHO_API_PAGE_SIZE = 100;
|
|
19
19
|
|
|
20
|
-
const
|
|
20
|
+
const buildLiquidityQuery = (listField: 'vaults' | 'vaultV2s') => `
|
|
21
21
|
query VaultsLiquidity($addresses: [String!], $chainIds: [Int!]) {
|
|
22
|
-
|
|
22
|
+
${listField}(first: ${MORPHO_API_PAGE_SIZE}, where: { address_in: $addresses, chainId_in: $chainIds }) {
|
|
23
23
|
items {
|
|
24
24
|
address
|
|
25
|
-
liquidity {
|
|
26
|
-
underlying
|
|
27
|
-
}
|
|
25
|
+
liquidity${listField === 'vaults' ? ' {\n underlying\n }' : ''}
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
28
|
}`;
|
|
31
29
|
|
|
30
|
+
const liquidityQueries = {
|
|
31
|
+
[MorphoVaultVersion.V1]: { field: 'vaults', query: buildLiquidityQuery('vaults') },
|
|
32
|
+
[MorphoVaultVersion.V2]: { field: 'vaultV2s', query: buildLiquidityQuery('vaultV2s') },
|
|
33
|
+
} as const;
|
|
34
|
+
|
|
35
|
+
type LiquidityItem = { address: string, liquidity: { underlying: string | number | null } | string | number | null };
|
|
36
|
+
|
|
32
37
|
/**
|
|
33
|
-
* Fetches liquidity for all given vaults
|
|
38
|
+
* Fetches liquidity for all given vaults, one API request per vault version (chunked if over the page cap),
|
|
34
39
|
* returned as a map keyed by lowercased vault address. A vault missing from the API response is
|
|
35
40
|
* absent from the map.
|
|
36
41
|
*/
|
|
37
42
|
export const fetchMorphoVaultsLiquidity = async (network: NetworkNumber, vaults: MorphoVault[]): Promise<Record<string, string>> => {
|
|
38
|
-
const
|
|
39
|
-
|
|
43
|
+
const requests: { version: MorphoVaultVersion, chunk: MorphoVault[] }[] = [];
|
|
44
|
+
[MorphoVaultVersion.V1, MorphoVaultVersion.V2].forEach((version) => {
|
|
45
|
+
const versionVaults = vaults.filter((vault) => vault.version === version);
|
|
46
|
+
for (let i = 0; i < versionVaults.length; i += MORPHO_API_PAGE_SIZE) requests.push({ version, chunk: versionVaults.slice(i, i + MORPHO_API_PAGE_SIZE) });
|
|
47
|
+
});
|
|
40
48
|
|
|
41
49
|
const liquidityByAddress: Record<string, string> = {};
|
|
42
|
-
await Promise.all(
|
|
43
|
-
const
|
|
50
|
+
await Promise.all(requests.map(async ({ version, chunk }) => {
|
|
51
|
+
const { field, query } = liquidityQueries[version];
|
|
52
|
+
const data = await graphqlRequest(MORPHO_API_URL, query, {
|
|
44
53
|
addresses: chunk.map((vault) => vault.address),
|
|
45
54
|
chainIds: [network],
|
|
46
55
|
// the BigInt scalar serializes as a JSON number when it fits in Number.MAX_SAFE_INTEGER, a string otherwise
|
|
47
|
-
}) as
|
|
56
|
+
}) as Record<string, { items: LiquidityItem[] | null }>;
|
|
48
57
|
|
|
49
|
-
(data.
|
|
50
|
-
|
|
51
|
-
|
|
58
|
+
(data[field].items || []).forEach((item) => {
|
|
59
|
+
// V1 exposes liquidity as { underlying }, V2 as a plain BigInt scalar
|
|
60
|
+
const underlying = item?.liquidity !== null && typeof item?.liquidity === 'object' ? item.liquidity.underlying : item?.liquidity;
|
|
61
|
+
if (underlying !== undefined && underlying !== null) {
|
|
62
|
+
liquidityByAddress[item.address.toLowerCase()] = String(underlying);
|
|
52
63
|
}
|
|
53
64
|
});
|
|
54
65
|
}));
|
|
@@ -63,7 +74,22 @@ const getBatchedViemProvider = (provider: EthereumProvider, network: NetworkNumb
|
|
|
63
74
|
},
|
|
64
75
|
});
|
|
65
76
|
|
|
66
|
-
|
|
77
|
+
// Vault V2 is ERC-4626 but has no decimals offset, so shares are converted with convertToAssets
|
|
78
|
+
const getMorphoVaultV2ChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]) => {
|
|
79
|
+
const vaultContract = getErc4626ContractViem(provider, morphoVault.address);
|
|
80
|
+
|
|
81
|
+
const [totalAssets, suppliedAssets] = await Promise.all([
|
|
82
|
+
vaultContract.read.totalAssets(),
|
|
83
|
+
Promise.all(accounts.map(async (account) => {
|
|
84
|
+
const share = await vaultContract.read.balanceOf([account]);
|
|
85
|
+
return share === BigInt(0) ? BigInt(0) : vaultContract.read.convertToAssets([share]);
|
|
86
|
+
})),
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
return { totalAssets, suppliedAssets };
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const getMorphoVaultV1ChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]) => {
|
|
67
93
|
const morphoVaultContract = getMorphoVaultContractViem(provider, morphoVault.address);
|
|
68
94
|
|
|
69
95
|
const shares: Record<EthAddress, bigint> = {};
|
|
@@ -84,20 +110,46 @@ const getMorphoVaultChainData = async (provider: Client, morphoVault: MorphoVaul
|
|
|
84
110
|
};
|
|
85
111
|
};
|
|
86
112
|
|
|
113
|
+
type MorphoVaultChainData = {
|
|
114
|
+
v1?: Awaited<ReturnType<typeof getMorphoVaultV1ChainData>>,
|
|
115
|
+
v2?: Awaited<ReturnType<typeof getMorphoVaultV2ChainData>>,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const getMorphoVaultChainData = async (provider: Client, morphoVault: MorphoVault, accounts: EthAddress[]): Promise<MorphoVaultChainData> => (
|
|
119
|
+
morphoVault.version === MorphoVaultVersion.V2
|
|
120
|
+
? { v2: await getMorphoVaultV2ChainData(provider, morphoVault, accounts) }
|
|
121
|
+
: { v1: await getMorphoVaultV1ChainData(provider, morphoVault, accounts) }
|
|
122
|
+
);
|
|
123
|
+
|
|
87
124
|
const formatMorphoVaultData = (
|
|
88
125
|
morphoVault: MorphoVault,
|
|
89
|
-
chainData:
|
|
126
|
+
chainData: MorphoVaultChainData,
|
|
90
127
|
liquidityUnderlying: string,
|
|
91
128
|
accounts: EthAddress[],
|
|
92
129
|
): SavingsVaultData => {
|
|
130
|
+
const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
|
|
131
|
+
const supplied: Record<EthAddress, string> = {};
|
|
132
|
+
|
|
133
|
+
if (chainData.v2) {
|
|
134
|
+
const { totalAssets, suppliedAssets } = chainData.v2;
|
|
135
|
+
accounts.forEach((account, i) => {
|
|
136
|
+
supplied[account.toLowerCase() as EthAddress] = assetAmountInEth(suppliedAssets[i].toString(), morphoVault.asset);
|
|
137
|
+
});
|
|
138
|
+
return {
|
|
139
|
+
poolSize: assetAmountInEth(totalAssets.toString(), morphoVault.asset),
|
|
140
|
+
supplied,
|
|
141
|
+
liquidity,
|
|
142
|
+
asset: morphoVault.asset,
|
|
143
|
+
optionType: morphoVault.type,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
93
147
|
const {
|
|
94
148
|
totalAssets, totalSupply, decimals, decimalsOffset, shares,
|
|
95
|
-
} = chainData
|
|
149
|
+
} = chainData.v1!;
|
|
96
150
|
|
|
97
151
|
const poolSize = assetAmountInEth(totalAssets.toString(), morphoVault.asset);
|
|
98
|
-
const liquidity = assetAmountInEth(liquidityUnderlying, morphoVault.asset);
|
|
99
152
|
|
|
100
|
-
const supplied: Record<EthAddress, string> = {};
|
|
101
153
|
accounts.forEach((account) => {
|
|
102
154
|
const share = shares[account] || BigInt(0);
|
|
103
155
|
supplied[account.toLowerCase() as EthAddress] = new Dec(new Dec(share.toString()).mul(new Dec(totalAssets.toString()).add(1)).div(new Dec(totalSupply.toString()).add(10 ** decimalsOffset)).div(10 ** 18)
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
MorphoVault, MorphoVaultType, MorphoVaultVersion, NetworkNumber,
|
|
3
|
+
} from '../../types';
|
|
2
4
|
|
|
3
5
|
export const MORPHO_VAULT_FLAGSHIP_ETH: MorphoVault = {
|
|
4
6
|
type: MorphoVaultType.MorphoVaultFlagshipEth,
|
|
5
7
|
name: 'Flagship ETH',
|
|
6
8
|
address: '0x38989BBA00BDF8181F4082995b3DEAe96163aC5D',
|
|
7
9
|
asset: 'WETH',
|
|
10
|
+
network: NetworkNumber.Eth,
|
|
11
|
+
version: MorphoVaultVersion.V1,
|
|
8
12
|
deploymentBlock: 18927491,
|
|
9
13
|
isLegacy: true,
|
|
10
14
|
};
|
|
@@ -14,6 +18,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_CORE: MorphoVault = {
|
|
|
14
18
|
name: 'Gauntlet USDC Core',
|
|
15
19
|
address: '0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458',
|
|
16
20
|
asset: 'USDC',
|
|
21
|
+
network: NetworkNumber.Eth,
|
|
22
|
+
version: MorphoVaultVersion.V1,
|
|
17
23
|
deploymentBlock: 19777569,
|
|
18
24
|
isLegacy: true,
|
|
19
25
|
};
|
|
@@ -23,6 +29,8 @@ export const MORPHO_VAULT_GAUNTLET_USDC_PRIME: MorphoVault = {
|
|
|
23
29
|
name: 'Gauntlet USDC Prime',
|
|
24
30
|
address: '0xdd0f28e19C1780eb6396170735D45153D261490d',
|
|
25
31
|
asset: 'USDC',
|
|
32
|
+
network: NetworkNumber.Eth,
|
|
33
|
+
version: MorphoVaultVersion.V1,
|
|
26
34
|
deploymentBlock: 19777569,
|
|
27
35
|
isLegacy: true,
|
|
28
36
|
};
|
|
@@ -32,6 +40,8 @@ export const MORPHO_VAULT_RE7_WETH: MorphoVault = {
|
|
|
32
40
|
name: 'RE7 WETH',
|
|
33
41
|
address: '0x78Fc2c2eD1A4cDb5402365934aE5648aDAd094d0',
|
|
34
42
|
asset: 'WETH',
|
|
43
|
+
network: NetworkNumber.Eth,
|
|
44
|
+
version: MorphoVaultVersion.V1,
|
|
35
45
|
deploymentBlock: 19121118,
|
|
36
46
|
isLegacy: true,
|
|
37
47
|
};
|
|
@@ -41,6 +51,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_CORE: MorphoVault = {
|
|
|
41
51
|
name: 'Gauntlet WETH Core',
|
|
42
52
|
address: '0x4881Ef0BF6d2365D3dd6499ccd7532bcdBCE0658',
|
|
43
53
|
asset: 'WETH',
|
|
54
|
+
network: NetworkNumber.Eth,
|
|
55
|
+
version: MorphoVaultVersion.V1,
|
|
44
56
|
deploymentBlock: 19541126,
|
|
45
57
|
isLegacy: true,
|
|
46
58
|
};
|
|
@@ -50,6 +62,8 @@ export const MORPHO_VAULT_GAUNTLET_WETH_PRIME: MorphoVault = {
|
|
|
50
62
|
name: 'Gauntlet WETH Prime',
|
|
51
63
|
address: '0x2371e134e3455e0593363cBF89d3b6cf53740618',
|
|
52
64
|
asset: 'WETH',
|
|
65
|
+
network: NetworkNumber.Eth,
|
|
66
|
+
version: MorphoVaultVersion.V1,
|
|
53
67
|
deploymentBlock: 19372149,
|
|
54
68
|
isLegacy: true,
|
|
55
69
|
};
|
|
@@ -59,6 +73,8 @@ export const MORPHO_VAULT_BOOSTED_USDC: MorphoVault = {
|
|
|
59
73
|
name: 'Boosted USDC',
|
|
60
74
|
address: '0xd63070114470f685b75B74D60EEc7c1113d33a3D',
|
|
61
75
|
asset: 'USDC',
|
|
76
|
+
network: NetworkNumber.Eth,
|
|
77
|
+
version: MorphoVaultVersion.V1,
|
|
62
78
|
deploymentBlock: 20377233,
|
|
63
79
|
isLegacy: true,
|
|
64
80
|
};
|
|
@@ -68,6 +84,8 @@ export const MORPHO_VAULT_FLAGSHIP_USDT: MorphoVault = {
|
|
|
68
84
|
name: 'Flagship USDT',
|
|
69
85
|
address: '0x2C25f6C25770fFEC5959D34B94Bf898865e5D6b1',
|
|
70
86
|
asset: 'USDT',
|
|
87
|
+
network: NetworkNumber.Eth,
|
|
88
|
+
version: MorphoVaultVersion.V1,
|
|
71
89
|
deploymentBlock: 19127039,
|
|
72
90
|
isLegacy: true,
|
|
73
91
|
};
|
|
@@ -77,6 +95,8 @@ export const MORPHO_VAULT_GAUNTLET_USDA_CORE: MorphoVault = {
|
|
|
77
95
|
name: 'Gauntlet USDA Core',
|
|
78
96
|
address: '0x125D41A6e5dbf455cD9Df8F80BCC6fd172D52Cc6',
|
|
79
97
|
asset: 'USDA',
|
|
98
|
+
network: NetworkNumber.Eth,
|
|
99
|
+
version: MorphoVaultVersion.V1,
|
|
80
100
|
deploymentBlock: 19633608,
|
|
81
101
|
isLegacy: true,
|
|
82
102
|
};
|
|
@@ -86,6 +106,8 @@ export const MORPHO_VAULT_GAUNTLET_USDT_PRIME: MorphoVault = {
|
|
|
86
106
|
name: 'Gauntlet USDT Prime',
|
|
87
107
|
address: '0x8CB3649114051cA5119141a34C200D65dc0Faa73',
|
|
88
108
|
asset: 'USDT',
|
|
109
|
+
network: NetworkNumber.Eth,
|
|
110
|
+
version: MorphoVaultVersion.V1,
|
|
89
111
|
deploymentBlock: 19486541,
|
|
90
112
|
isLegacy: true,
|
|
91
113
|
};
|
|
@@ -95,6 +117,8 @@ export const MORPHO_VAULT_GAUNTLET_RESOLV_USDC: MorphoVault = {
|
|
|
95
117
|
name: 'Gauntlet Resolv USDC',
|
|
96
118
|
address: '0x132E6C9C33A62D7727cd359b1f51e5B566E485Eb',
|
|
97
119
|
asset: 'USDC',
|
|
120
|
+
network: NetworkNumber.Eth,
|
|
121
|
+
version: MorphoVaultVersion.V1,
|
|
98
122
|
deploymentBlock: 21487882,
|
|
99
123
|
isLegacy: true,
|
|
100
124
|
};
|
|
@@ -106,6 +130,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDT: MorphoVault = {
|
|
|
106
130
|
name: 'Steakhouse USDT',
|
|
107
131
|
address: '0xbEef047a543E45807105E51A8BBEFCc5950fcfBa',
|
|
108
132
|
asset: 'USDT',
|
|
133
|
+
network: NetworkNumber.Eth,
|
|
134
|
+
version: MorphoVaultVersion.V1,
|
|
109
135
|
deploymentBlock: 19043398,
|
|
110
136
|
isLegacy: false,
|
|
111
137
|
};
|
|
@@ -115,6 +141,8 @@ export const MORPHO_VAULT_STEAKHOUSE_USDC: MorphoVault = {
|
|
|
115
141
|
name: 'Steakhouse USDC',
|
|
116
142
|
address: '0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB',
|
|
117
143
|
asset: 'USDC',
|
|
144
|
+
network: NetworkNumber.Eth,
|
|
145
|
+
version: MorphoVaultVersion.V1,
|
|
118
146
|
deploymentBlock: 18928285,
|
|
119
147
|
isLegacy: false,
|
|
120
148
|
};
|
|
@@ -124,6 +152,8 @@ export const MORPHO_VAULT_STEAKHOUSE_ETH: MorphoVault = {
|
|
|
124
152
|
name: 'Steakhouse WETH',
|
|
125
153
|
address: '0xBEEf050ecd6a16c4e7bfFbB52Ebba7846C4b8cD4',
|
|
126
154
|
asset: 'WETH',
|
|
155
|
+
network: NetworkNumber.Eth,
|
|
156
|
+
version: MorphoVaultVersion.V1,
|
|
127
157
|
deploymentBlock: 19380443,
|
|
128
158
|
isLegacy: false,
|
|
129
159
|
};
|
|
@@ -133,6 +163,8 @@ export const MORPHO_VAULT_STEAKHOUSE_PYUSD: MorphoVault = {
|
|
|
133
163
|
name: 'Steakhouse PYUSD',
|
|
134
164
|
address: '0xbEEF02e5E13584ab96848af90261f0C8Ee04722a',
|
|
135
165
|
asset: 'PYUSD',
|
|
166
|
+
network: NetworkNumber.Eth,
|
|
167
|
+
version: MorphoVaultVersion.V1,
|
|
136
168
|
deploymentBlock: 19043398,
|
|
137
169
|
isLegacy: false,
|
|
138
170
|
};
|
|
@@ -144,6 +176,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDT: MorphoVault = {
|
|
|
144
176
|
name: 'Smokehouse USDT',
|
|
145
177
|
address: '0xA0804346780b4c2e3bE118ac957D1DB82F9d7484',
|
|
146
178
|
asset: 'USDT',
|
|
179
|
+
network: NetworkNumber.Eth,
|
|
180
|
+
version: MorphoVaultVersion.V1,
|
|
147
181
|
deploymentBlock: 21522238,
|
|
148
182
|
isLegacy: false,
|
|
149
183
|
};
|
|
@@ -153,6 +187,8 @@ export const MORPHO_VAULT_SMOKEHOUSE_USDC: MorphoVault = {
|
|
|
153
187
|
name: 'Smokehouse USDC',
|
|
154
188
|
address: '0xBEeFFF209270748ddd194831b3fa287a5386f5bC',
|
|
155
189
|
asset: 'USDC',
|
|
190
|
+
network: NetworkNumber.Eth,
|
|
191
|
+
version: MorphoVaultVersion.V1,
|
|
156
192
|
deploymentBlock: 21337719,
|
|
157
193
|
isLegacy: false,
|
|
158
194
|
};
|
|
@@ -162,10 +198,36 @@ export const MORPHO_VAULT_SMOKEHOUSE_DAI: MorphoVault = {
|
|
|
162
198
|
name: 'Smokehouse DAI',
|
|
163
199
|
address: '0xbeeFfF68CC520D68f82641EFF84330C631E2490E',
|
|
164
200
|
asset: 'DAI',
|
|
201
|
+
network: NetworkNumber.Eth,
|
|
202
|
+
version: MorphoVaultVersion.V1,
|
|
165
203
|
deploymentBlock: 21343808,
|
|
166
204
|
isLegacy: false,
|
|
167
205
|
};
|
|
168
206
|
|
|
207
|
+
// Vault V2
|
|
208
|
+
|
|
209
|
+
export const MORPHO_VAULT_GAUNTLET_USDG_PREMIUM: MorphoVault = {
|
|
210
|
+
type: MorphoVaultType.MorphoVaultGauntletUSDGPremium,
|
|
211
|
+
name: 'Gauntlet USDG Premium',
|
|
212
|
+
address: '0x390c1bb01F3F627144a40617e287d4cE3D5aBCfa',
|
|
213
|
+
asset: 'USDG',
|
|
214
|
+
network: NetworkNumber.Arb,
|
|
215
|
+
version: MorphoVaultVersion.V2,
|
|
216
|
+
deploymentBlock: 510799903,
|
|
217
|
+
isLegacy: false,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export const MORPHO_VAULT_STEAKHOUSE_USDG_PRO: MorphoVault = {
|
|
221
|
+
type: MorphoVaultType.MorphoVaultSteakhouseUSDGPro,
|
|
222
|
+
name: 'Steakhouse USDG Pro',
|
|
223
|
+
address: '0xbeeFf72B77e7584a450E887125F25E8D8819016a',
|
|
224
|
+
asset: 'USDG',
|
|
225
|
+
network: NetworkNumber.Arb,
|
|
226
|
+
version: MorphoVaultVersion.V2,
|
|
227
|
+
deploymentBlock: 512247107,
|
|
228
|
+
isLegacy: false,
|
|
229
|
+
};
|
|
230
|
+
|
|
169
231
|
export const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault> = {
|
|
170
232
|
[MorphoVaultType.MorphoVaultFlagshipEth]: MORPHO_VAULT_FLAGSHIP_ETH,
|
|
171
233
|
[MorphoVaultType.MorphoVaultGauntletUSDCCore]: MORPHO_VAULT_GAUNTLET_USDC_CORE,
|
|
@@ -189,6 +251,10 @@ export const MORPHO_VAULTS: Record<MorphoVaultType, MorphoVault> = {
|
|
|
189
251
|
[MorphoVaultType.MorphoVaultSmokehouseUSDT]: MORPHO_VAULT_SMOKEHOUSE_USDT,
|
|
190
252
|
[MorphoVaultType.MorphoVaultSmokehouseUSDC]: MORPHO_VAULT_SMOKEHOUSE_USDC,
|
|
191
253
|
[MorphoVaultType.MorphoVaultSmokehouseDAI]: MORPHO_VAULT_SMOKEHOUSE_DAI,
|
|
254
|
+
|
|
255
|
+
// Vault V2
|
|
256
|
+
[MorphoVaultType.MorphoVaultGauntletUSDGPremium]: MORPHO_VAULT_GAUNTLET_USDG_PREMIUM,
|
|
257
|
+
[MorphoVaultType.MorphoVaultSteakhouseUSDGPro]: MORPHO_VAULT_STEAKHOUSE_USDG_PRO,
|
|
192
258
|
};
|
|
193
259
|
|
|
194
260
|
export const getMorphoVault = (type: MorphoVaultType): MorphoVault => MORPHO_VAULTS[type];
|
package/src/types/aave.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import {
|
|
2
|
-
EthAddress,
|
|
3
2
|
IncentiveData,
|
|
4
3
|
LeverageType,
|
|
5
4
|
MMAssetData, MMPositionData, MMUsedAsset, NetworkNumber,
|
|
@@ -97,9 +96,6 @@ export interface AaveV3AssetData extends AaveAssetData {
|
|
|
97
96
|
liquidationBonus: string,
|
|
98
97
|
supplyIncentives: IncentiveData[];
|
|
99
98
|
borrowIncentives: IncentiveData[];
|
|
100
|
-
// Set by _getAaveV3MarketData. Optional, so objects built by hand still type-check.
|
|
101
|
-
aTokenAddress?: EthAddress,
|
|
102
|
-
vTokenAddress?: EthAddress,
|
|
103
99
|
}
|
|
104
100
|
|
|
105
101
|
export type EModeCategoriesData = Record<number, EModeCategoryData>;
|
|
@@ -141,15 +137,7 @@ export type AaveV2UsedAssets = AaveUsedAssets<AaveV2UsedAsset>;
|
|
|
141
137
|
|
|
142
138
|
export type AaveV3UsedAssets = AaveUsedAssets<AaveV3UsedAsset>;
|
|
143
139
|
|
|
144
|
-
|
|
145
|
-
* Fields aaveAnyGetAggregatedPositionData adds to every Aave V2/V3 position at runtime, on top of those declared
|
|
146
|
-
* below. Optional, so code that builds a position by hand keeps compiling.
|
|
147
|
-
*/
|
|
148
|
-
export type AavePositionAggregatedFields = Partial<Omit<AaveV3AggregatedPositionData,
|
|
149
|
-
| keyof MMPositionData | 'ratio' | 'collRatio' | 'safetyRatioWithLtvZeroFallback' | 'suppliedUsd' | 'borrowedUsd'
|
|
150
|
-
| 'borrowLimitUsd' | 'suppliedCollateralUsd' | 'incentiveUsd' | 'totalInterestUsd'>>;
|
|
151
|
-
|
|
152
|
-
export interface AavePositionData extends MMPositionData, AavePositionAggregatedFields {
|
|
140
|
+
export interface AavePositionData extends MMPositionData {
|
|
153
141
|
ratio: string,
|
|
154
142
|
minRatio: string,
|
|
155
143
|
collRatio: string,
|
|
@@ -168,11 +156,6 @@ export interface AavePositionData extends MMPositionData, AavePositionAggregated
|
|
|
168
156
|
|
|
169
157
|
export interface AaveV2PositionData extends AavePositionData {
|
|
170
158
|
usedAssets: AaveV2UsedAssets,
|
|
171
|
-
// Always their empty values: _getAaveV2AccountData starts from Aave V3's EMPTY_AAVE_DATA, which carries them.
|
|
172
|
-
eModeCategory?: number,
|
|
173
|
-
isInIsolationMode?: boolean,
|
|
174
|
-
isInSiloedMode?: boolean,
|
|
175
|
-
eModeCategories?: { [key: number]: EModeCategoryDataMapping },
|
|
176
159
|
}
|
|
177
160
|
|
|
178
161
|
export interface AaveV3PositionData extends AavePositionData {
|
package/src/types/compound.ts
CHANGED
|
@@ -70,8 +70,6 @@ export interface CompoundAssetData extends MMAssetData {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
export interface CompoundV2AssetData extends CompoundAssetData {
|
|
73
|
-
// Set by _getCompoundV2MarketsData. Optional, so objects built by hand still type-check.
|
|
74
|
-
exchangeRate?: string,
|
|
75
73
|
}
|
|
76
74
|
export interface CompoundV3AssetData extends CompoundAssetData {
|
|
77
75
|
borrowCollateralFactor: string,
|
|
@@ -83,20 +81,6 @@ export interface CompoundV3AssetData extends CompoundAssetData {
|
|
|
83
81
|
supplyCap: string,
|
|
84
82
|
priceInBaseAsset: string,
|
|
85
83
|
canBeWithdrawn: boolean,
|
|
86
|
-
// The rest are set by formatMarketData and formatBaseData, which also spread in the view contract's raw asset
|
|
87
|
-
// data. Optional, so objects built by hand still type-check.
|
|
88
|
-
tokenAddr?: EthAddress,
|
|
89
|
-
// The base asset's only.
|
|
90
|
-
isBase?: boolean,
|
|
91
|
-
baseBorrowMin?: string,
|
|
92
|
-
baseTrackingBorrowRewardsSpeed?: string,
|
|
93
|
-
baseTrackingSupplyRewardsSpeed?: string,
|
|
94
|
-
borrowIndex?: string,
|
|
95
|
-
supplyIndex?: string,
|
|
96
|
-
trackingBorrowIndex?: string,
|
|
97
|
-
trackingSupplyIndex?: string,
|
|
98
|
-
rewardSupplySpeed?: string,
|
|
99
|
-
rewardBorrowSpeed?: string,
|
|
100
84
|
}
|
|
101
85
|
|
|
102
86
|
export interface CompoundAssetsData<T> {
|
|
@@ -157,30 +141,10 @@ export interface CompoundPositionData extends MMPositionData {
|
|
|
157
141
|
automationResubscribeRequired?: boolean,
|
|
158
142
|
}
|
|
159
143
|
|
|
160
|
-
|
|
161
|
-
* Fields getCompoundV2AggregatedData adds to every Compound V2 position at runtime — a subset of
|
|
162
|
-
* CompoundAggregatedPositionData. Optional, so code that builds a position by hand keeps compiling.
|
|
163
|
-
*/
|
|
164
|
-
export type CompoundV2PositionAggregatedFields = Partial<Pick<CompoundAggregatedPositionData,
|
|
165
|
-
| 'suppliedCollateralUsd' | 'liquidationLimitUsd' | 'leftToBorrowUsd' | 'collRatio' | 'leveragedType'
|
|
166
|
-
| 'leveragedAsset' | 'liquidationPrice'>>;
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Fields getCompoundV3AggregatedData adds to every Compound V3 position at runtime, on top of those declared in
|
|
170
|
-
* CompoundPositionData. Optional, so code that builds a position by hand keeps compiling.
|
|
171
|
-
*/
|
|
172
|
-
export type CompoundV3PositionAggregatedFields = Partial<Omit<CompoundAggregatedPositionData,
|
|
173
|
-
| keyof MMPositionData | 'ratio' | 'minRatio' | 'suppliedUsd' | 'borrowedUsd' | 'borrowLimitUsd' | 'incentiveUsd'
|
|
174
|
-
| 'totalInterestUsd'>>;
|
|
175
|
-
|
|
176
|
-
export interface CompoundV2PositionData extends CompoundPositionData, CompoundV2PositionAggregatedFields {
|
|
144
|
+
export interface CompoundV2PositionData extends CompoundPositionData {
|
|
177
145
|
usedAssets: CompoundV2UsedAssets,
|
|
178
|
-
// Always false: _getCompoundV2AccountData starts from EMPTY_COMPOUND_DATA, which carries it.
|
|
179
|
-
borrowStableSupplyUnstable?: boolean,
|
|
180
146
|
}
|
|
181
147
|
|
|
182
|
-
export interface CompoundV3PositionData extends CompoundPositionData
|
|
148
|
+
export interface CompoundV3PositionData extends CompoundPositionData {
|
|
183
149
|
usedAssets: CompoundV3UsedAssets,
|
|
184
|
-
// Whether the user's smart wallet is allowed to manage the account on Comet (Comet.isAllowed).
|
|
185
|
-
isAllowed?: boolean,
|
|
186
150
|
}
|
package/src/types/curveUsd.ts
CHANGED
|
@@ -66,9 +66,6 @@ export interface CrvUSDGlobalMarketData {
|
|
|
66
66
|
leftToBorrow: string,
|
|
67
67
|
bands: BandData[],
|
|
68
68
|
loanDiscount: string;
|
|
69
|
-
// crvUSDView's globalData field that _getCurveUsdGlobalData spreads in unconverted. Optional, so objects built by
|
|
70
|
-
// hand still type-check.
|
|
71
|
-
A?: bigint,
|
|
72
69
|
}
|
|
73
70
|
|
|
74
71
|
export interface CrvUSDAggregatedPositionData {
|
|
@@ -104,12 +101,7 @@ export interface CrvUSDUsedAssets {
|
|
|
104
101
|
[key: string]: CrvUSDUsedAsset,
|
|
105
102
|
}
|
|
106
103
|
|
|
107
|
-
|
|
108
|
-
// type-check.
|
|
109
|
-
export type CrvUSDPositionAggregatedFields = Partial<Pick<CrvUSDAggregatedPositionData,
|
|
110
|
-
| 'borrowLimitUsd' | 'minAllowedRatio' | 'collFactor' | 'leveragedType' | 'leveragedAsset' | 'liquidationPrice'>>;
|
|
111
|
-
|
|
112
|
-
export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
|
|
104
|
+
export interface CrvUSDUserData {
|
|
113
105
|
debtAmount: string,
|
|
114
106
|
health: string,
|
|
115
107
|
healthPercent: string,
|
|
@@ -131,12 +123,4 @@ export interface CrvUSDUserData extends CrvUSDPositionAggregatedFields {
|
|
|
131
123
|
collateralPrice: string,
|
|
132
124
|
collRatio: string,
|
|
133
125
|
exposure: string,
|
|
134
|
-
// Fields of crvUSDView's userData that _getCurveUsdUserData spreads in unconverted. Optional, so objects built by
|
|
135
|
-
// hand still type-check.
|
|
136
|
-
marketCollateralAmount?: bigint,
|
|
137
|
-
curveUsdCollateralAmount?: bigint,
|
|
138
|
-
N?: bigint,
|
|
139
|
-
bandRange?: readonly [bigint, bigint],
|
|
140
|
-
usersBands?: readonly [readonly bigint[], readonly bigint[]],
|
|
141
|
-
isInSoftLiquidation?: boolean,
|
|
142
126
|
}
|