@1delta/margin-fetcher 0.0.11 → 0.0.13
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/lending/aave-v2-type/types.d.ts +2 -0
- package/dist/lending/aave-v2-type/types.d.ts.map +1 -1
- package/dist/lending/fetchLender.d.ts.map +1 -1
- package/dist/lending/fetchLender.js +25 -29
- package/dist/lending/fetchLenderAll.d.ts +2 -1
- package/dist/lending/fetchLenderAll.d.ts.map +1 -1
- package/dist/lending/fetchLenderAll.js +3 -3
- package/dist/lending/fetchLenderExt.d.ts +2 -1
- package/dist/lending/fetchLenderExt.d.ts.map +1 -1
- package/dist/lending/fetchLenderExt.js +28 -14
- package/dist/lending/index.d.ts +2 -0
- package/dist/lending/index.d.ts.map +1 -1
- package/dist/lending/index.js +2 -0
- package/dist/lending/morpho/convertPublic.d.ts +3 -5
- package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
- package/dist/lending/morpho/convertPublic.js +16 -12
- package/dist/lending/morpho/fetchPublic.js +1 -1
- package/dist/lending/morpho/publicCallBuild.d.ts +1 -4
- package/dist/lending/morpho/publicCallBuild.d.ts.map +1 -1
- package/dist/lending/morpho/types.d.ts +2 -0
- package/dist/lending/morpho/types.d.ts.map +1 -1
- package/dist/lending/user-data/aave-v3-type/userCallBuild.d.ts.map +1 -1
- package/dist/lending/user-data/aave-v3-type/userCallBuild.js +4 -7
- package/dist/lending/user-data/abis.d.ts +88 -0
- package/dist/lending/user-data/abis.d.ts.map +1 -1
- package/dist/lending/user-data/abis.js +5 -1
- package/dist/lending/user-data/compound-v3/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/compound-v3/userCallParse.js +1 -0
- package/dist/lending/user-data/fetchUserData.d.ts +4 -4
- package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
- package/dist/lending/user-data/fetchUserData.js +46 -25
- package/dist/lending/user-data/morpho/userCallBuild.d.ts +4 -5
- package/dist/lending/user-data/morpho/userCallBuild.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallBuild.js +15 -9
- package/dist/lending/user-data/morpho/userCallParse.d.ts +1 -2
- package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallParse.js +15 -12
- package/dist/lending/user-data/types.d.ts +30 -19
- package/dist/lending/user-data/types.d.ts.map +1 -1
- package/dist/lending/user-data/types.js +12 -0
- package/dist/lending/user-data/utils/createGeneralUserState.d.ts +4 -4
- package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
- package/dist/lending/user-data/utils/createGeneralUserState.js +24 -17
- package/dist/utils/index.d.ts +5 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +20 -11
- package/dist/utils/parsing.d.ts +1 -0
- package/dist/utils/parsing.d.ts.map +1 -1
- package/dist/utils/parsing.js +3 -0
- package/dist/yields/index.d.ts.map +1 -1
- package/dist/yields/index.js +12 -5
- package/package.json +1 -1
- package/src/abis/morpho/blue.ts +99 -0
- package/src/abis/morpho/lens.ts +31 -0
- package/src/lending/aave-v2-type/types.ts +2 -0
- package/src/lending/fetchLender.ts +86 -49
- package/src/lending/fetchLenderAll.ts +30 -0
- package/src/lending/fetchLenderExt.ts +82 -0
- package/src/lending/index.ts +3 -1
- package/src/lending/morpho/convertPublic.ts +153 -0
- package/src/lending/morpho/fetchPublic.ts +80 -0
- package/src/lending/morpho/publicCallBuild.ts +11 -0
- package/src/lending/morpho/types.ts +129 -0
- package/src/lending/user-data/aave-v3-type/userCallBuild.ts +2 -8
- package/src/lending/user-data/abis.ts +4 -1
- package/src/lending/user-data/compound-v3/userCallParse.ts +1 -0
- package/src/lending/user-data/fetchUserData.ts +114 -33
- package/src/lending/user-data/morpho/decoder.ts +71 -0
- package/src/lending/user-data/morpho/morphoLib.ts +61 -0
- package/src/lending/user-data/morpho/types.ts +12 -0
- package/src/lending/user-data/morpho/userCallBuild.ts +63 -0
- package/src/lending/user-data/morpho/userCallParse.ts +150 -0
- package/src/lending/user-data/morpho/userCallParseNoDeploy.ts +168 -0
- package/src/lending/user-data/types.ts +64 -42
- package/src/lending/user-data/utils/createGeneralUserState.ts +56 -32
- package/src/utils/index.ts +32 -14
- package/src/utils/parsing.ts +5 -0
- package/src/yields/index.ts +13 -4
- package/test/lenderData.test.ts +13251 -13649
- package/test/mainPrices.test.ts +1 -13
- package/test/morpho.test.ts +20 -0
- package/test/userDataMorpho.test.ts +79 -0
- package/test/utils.ts +13 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export interface BalanceInfo {
|
|
2
|
+
index: number; // uint16 (2 bytes)
|
|
3
|
+
supplyShares: bigint; // uint256 (32 bytes)
|
|
4
|
+
borrowShares: bigint; // uint128 (16 bytes)
|
|
5
|
+
supplyAssets: bigint; // uint256 (32 bytes)
|
|
6
|
+
borrowAssets: bigint; // uint256 (32 bytes)
|
|
7
|
+
collateral: bigint; // uint128 (16 bytes)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const WORD = 32;
|
|
11
|
+
const HALF = 16;
|
|
12
|
+
|
|
13
|
+
/** Read `len` bytes at `off` as a big‐endian BigInt. */
|
|
14
|
+
function readBigIntBE(buf: Uint8Array, off: number, len: number): bigint {
|
|
15
|
+
let v = 0n;
|
|
16
|
+
for (let i = 0; i < len; i++) {
|
|
17
|
+
v = (v << 8n) | BigInt(buf[off + i]);
|
|
18
|
+
}
|
|
19
|
+
return v;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Decode:
|
|
24
|
+
* [ uint256 count (32 bytes) ]
|
|
25
|
+
* then for each of `count` records:
|
|
26
|
+
* uint16 index (2 bytes),
|
|
27
|
+
* uint256 supplyShares (32 bytes),
|
|
28
|
+
* uint128 borrowShares (16 bytes),
|
|
29
|
+
* uint256 supplyAssets (32 bytes),
|
|
30
|
+
* uint256 borrowAssets (32 bytes),
|
|
31
|
+
* uint128 collateral (16 bytes)
|
|
32
|
+
*/
|
|
33
|
+
export function decodePackedDataset(hex: string): BalanceInfo[] {
|
|
34
|
+
if (hex.startsWith("0x")) hex = hex.slice(2);
|
|
35
|
+
const buf = Uint8Array.from(hex.match(/.{1,2}/g)!.map((b) => parseInt(b, 16)));
|
|
36
|
+
|
|
37
|
+
// 1) count (uint256)
|
|
38
|
+
const count = Number(readBigIntBE(buf, 0, 2));
|
|
39
|
+
const out: BalanceInfo[] = [];
|
|
40
|
+
|
|
41
|
+
let off = 2;
|
|
42
|
+
for (let i = 0; i < count; i++) {
|
|
43
|
+
// 2) index (uint16)
|
|
44
|
+
const index = Number(readBigIntBE(buf, off, 2));
|
|
45
|
+
off += 2;
|
|
46
|
+
|
|
47
|
+
// 3) supplyShares (uint256)
|
|
48
|
+
const supplyShares = readBigIntBE(buf, off, WORD);
|
|
49
|
+
off += WORD;
|
|
50
|
+
|
|
51
|
+
// 4) borrowShares (uint128)
|
|
52
|
+
const borrowShares = readBigIntBE(buf, off, HALF);
|
|
53
|
+
off += HALF;
|
|
54
|
+
|
|
55
|
+
// 5) supplyAssets (uint256)
|
|
56
|
+
const supplyAssets = readBigIntBE(buf, off, WORD);
|
|
57
|
+
off += WORD;
|
|
58
|
+
|
|
59
|
+
// 6) borrowAssets (uint256)
|
|
60
|
+
const borrowAssets = readBigIntBE(buf, off, WORD);
|
|
61
|
+
off += WORD;
|
|
62
|
+
|
|
63
|
+
// 7) collateral (uint128)
|
|
64
|
+
const collateral = readBigIntBE(buf, off, HALF);
|
|
65
|
+
off += HALF;
|
|
66
|
+
|
|
67
|
+
out.push({ index, supplyShares, borrowShares, supplyAssets, borrowAssets, collateral });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// Constants
|
|
2
|
+
const VIRTUAL_SHARES = 10n ** 6n;
|
|
3
|
+
const VIRTUAL_ASSETS = 1n;
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
function mulDivDown(x: bigint, y: bigint, d: bigint): bigint {
|
|
7
|
+
return (x * y) / d;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function mulDivUp(x: bigint, y: bigint, d: bigint): bigint {
|
|
11
|
+
return (x * y + (d - 1n)) / d;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export function toSharesDown(
|
|
16
|
+
assets: bigint,
|
|
17
|
+
totalAssets: bigint,
|
|
18
|
+
totalShares: bigint
|
|
19
|
+
): bigint {
|
|
20
|
+
return mulDivDown(
|
|
21
|
+
assets,
|
|
22
|
+
totalShares + VIRTUAL_SHARES,
|
|
23
|
+
totalAssets + VIRTUAL_ASSETS
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function toAssetsDown(
|
|
28
|
+
shares: bigint,
|
|
29
|
+
totalAssets: bigint,
|
|
30
|
+
totalShares: bigint
|
|
31
|
+
): bigint {
|
|
32
|
+
return mulDivDown(
|
|
33
|
+
shares,
|
|
34
|
+
totalAssets + VIRTUAL_ASSETS,
|
|
35
|
+
totalShares + VIRTUAL_SHARES
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function toSharesUp(
|
|
40
|
+
assets: bigint,
|
|
41
|
+
totalAssets: bigint,
|
|
42
|
+
totalShares: bigint
|
|
43
|
+
): bigint {
|
|
44
|
+
return mulDivUp(
|
|
45
|
+
assets,
|
|
46
|
+
totalShares + VIRTUAL_SHARES,
|
|
47
|
+
totalAssets + VIRTUAL_ASSETS
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function toAssetsUp(
|
|
52
|
+
shares: bigint,
|
|
53
|
+
totalAssets: bigint,
|
|
54
|
+
totalShares: bigint
|
|
55
|
+
): bigint {
|
|
56
|
+
return mulDivUp(
|
|
57
|
+
shares,
|
|
58
|
+
totalAssets + VIRTUAL_ASSETS,
|
|
59
|
+
totalShares + VIRTUAL_SHARES
|
|
60
|
+
);
|
|
61
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Chain, Lender, MORPHO_BLUE_POOL_DATA } from '@1delta/asset-registry'
|
|
2
|
+
import { Call } from '../../../utils/multicall'
|
|
3
|
+
import { chunk } from 'lodash'
|
|
4
|
+
|
|
5
|
+
const MORPHO_LENS: { [c: string]: string } = {
|
|
6
|
+
[Chain.BASE]: '0x98542B95B44a4732EffB1F4F01A696F1546236d3',
|
|
7
|
+
[Chain.POLYGON_MAINNET]: '0x105eb87D2b3127f43B1b4C0F125dbEb0EDF3d6C6',
|
|
8
|
+
[Chain.OP_MAINNET]: '0xd184c5315B728c1C990f59dDD275c8155f8e255c',
|
|
9
|
+
[Chain.ARBITRUM_ONE]: '0xF64F862Fb7D687411585e06C08711B612e156530',
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const getBaseMorphoCalls = (
|
|
13
|
+
lender: string,
|
|
14
|
+
chainId: string,
|
|
15
|
+
account: string,
|
|
16
|
+
marketsToQuery: string[],
|
|
17
|
+
) => {
|
|
18
|
+
return marketsToQuery.flatMap(id => [
|
|
19
|
+
{
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
address: MORPHO_BLUE_POOL_DATA[lender][chainId],
|
|
22
|
+
name: 'position',
|
|
23
|
+
params: ["0x" + id.split("_")[1], account],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
// @ts-ignore
|
|
27
|
+
address: MORPHO_BLUE_POOL_DATA[lender][chainId],
|
|
28
|
+
name: 'market',
|
|
29
|
+
params: ["0x" + id.split("_")[1]],
|
|
30
|
+
},
|
|
31
|
+
])
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const buildMorphoUserCall = (
|
|
35
|
+
chainId: string,
|
|
36
|
+
account: string,
|
|
37
|
+
lender: Lender,
|
|
38
|
+
marketsToQuery: string[],
|
|
39
|
+
): Call[] => {
|
|
40
|
+
const calls = getBaseMorphoCalls(lender, chainId, account, marketsToQuery)
|
|
41
|
+
|
|
42
|
+
return calls
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const buildMorphoUserCallWithLens = (
|
|
46
|
+
chainId: string,
|
|
47
|
+
account: string,
|
|
48
|
+
lender: Lender,
|
|
49
|
+
marketsToQuery: string[],
|
|
50
|
+
): Call[] => {
|
|
51
|
+
// 100 per call
|
|
52
|
+
const marketSlices = chunk(marketsToQuery, 100)
|
|
53
|
+
return marketSlices.flatMap((marketsInChunk) => ({
|
|
54
|
+
address: MORPHO_LENS[chainId],
|
|
55
|
+
name: 'getUserDataCompact',
|
|
56
|
+
params: [
|
|
57
|
+
marketsInChunk.map(a=> a.replace("MORPHO_BLUE_", "0x")),
|
|
58
|
+
account,
|
|
59
|
+
// @ts-ignore
|
|
60
|
+
MORPHO_BLUE_POOL_DATA[lender][chainId],
|
|
61
|
+
],
|
|
62
|
+
}))
|
|
63
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { Lender } from "@1delta/asset-registry"
|
|
2
|
+
import { getAssetMeta, toGenericPriceKey, toOracleKey } from "../../../assets"
|
|
3
|
+
import { MorphoUserReserveResponse } from "../types"
|
|
4
|
+
import { createBaseTypeUserState } from "../utils"
|
|
5
|
+
import { parseRawAmount } from "../../../utils/parsing"
|
|
6
|
+
import { MorphoMarket } from "../../morpho/types"
|
|
7
|
+
import { BalanceInfo, decodePackedDataset } from "./decoder"
|
|
8
|
+
|
|
9
|
+
export const getMorphoUserDataConverterWithlens = (
|
|
10
|
+
lender: Lender,
|
|
11
|
+
chainId: string,
|
|
12
|
+
account: string,
|
|
13
|
+
markets: string[],
|
|
14
|
+
prices: { [asset: string]: number },
|
|
15
|
+
pricesHist: { [asset: string]: number },
|
|
16
|
+
lenderData: any
|
|
17
|
+
): [(data: any[]) => { [market: string]: MorphoUserReserveResponse } | undefined, number] => {
|
|
18
|
+
|
|
19
|
+
const expectedNumberOfCalls = markets.length * 2
|
|
20
|
+
return [
|
|
21
|
+
(data: any[]) => {
|
|
22
|
+
// chunksizes depend on markets
|
|
23
|
+
const slices = Math.ceil(markets.length / 100)
|
|
24
|
+
if (data.length !== slices) {
|
|
25
|
+
return undefined
|
|
26
|
+
}
|
|
27
|
+
// de-chunk the calldata
|
|
28
|
+
const returnDatas = data.flatMap(d => decodePackedDataset(d))
|
|
29
|
+
|
|
30
|
+
let datas: { [market: string]: MorphoUserReserveResponse } = {}
|
|
31
|
+
for (let i = 0; i < returnDatas.length; i++) {
|
|
32
|
+
|
|
33
|
+
let totalDebt24h = 0
|
|
34
|
+
let totalDeposits24h = 0
|
|
35
|
+
const balanceData = returnDatas[i]
|
|
36
|
+
const markeId = markets[balanceData.index]
|
|
37
|
+
const market = lenderData[markeId]?.params?.market
|
|
38
|
+
const {
|
|
39
|
+
dataForMarket,
|
|
40
|
+
addedDebt,
|
|
41
|
+
addedDeposits
|
|
42
|
+
} = createMorphoEntryFromMarketWithLens(
|
|
43
|
+
i,
|
|
44
|
+
balanceData,
|
|
45
|
+
chainId,
|
|
46
|
+
market,
|
|
47
|
+
prices,
|
|
48
|
+
pricesHist,
|
|
49
|
+
)
|
|
50
|
+
if (!dataForMarket) continue;
|
|
51
|
+
|
|
52
|
+
totalDebt24h += addedDebt
|
|
53
|
+
totalDeposits24h += addedDeposits
|
|
54
|
+
|
|
55
|
+
const payload = {
|
|
56
|
+
chainId,
|
|
57
|
+
account,
|
|
58
|
+
lendingPositions: { "0": dataForMarket },
|
|
59
|
+
rewards: {},
|
|
60
|
+
userEMode : 0,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const userData = createBaseTypeUserState(payload, lenderData[markeId].data, totalDeposits24h, totalDebt24h)
|
|
64
|
+
|
|
65
|
+
datas[market.lender] = {
|
|
66
|
+
...payload,
|
|
67
|
+
...userData,
|
|
68
|
+
id: market.id
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
return datas
|
|
73
|
+
},
|
|
74
|
+
expectedNumberOfCalls,
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function createMorphoEntryFromMarketWithLens(
|
|
79
|
+
i: number,
|
|
80
|
+
balanceInfo: BalanceInfo,
|
|
81
|
+
chainId: string,
|
|
82
|
+
market: MorphoMarket,
|
|
83
|
+
prices: any,
|
|
84
|
+
pricesHist: any,
|
|
85
|
+
) {
|
|
86
|
+
|
|
87
|
+
const loanAddress = market.loanAddress.toLowerCase()
|
|
88
|
+
const loanMeta = getAssetMeta(chainId, loanAddress)
|
|
89
|
+
|
|
90
|
+
const loanKey = toOracleKey(loanMeta?.assetGroup) ?? toGenericPriceKey(loanAddress, chainId)
|
|
91
|
+
// prices
|
|
92
|
+
const priceLoan = prices[loanKey] ?? 1
|
|
93
|
+
const priceHistLoan = pricesHist?.[loanKey] ?? priceLoan
|
|
94
|
+
|
|
95
|
+
const deposits = balanceInfo.supplyAssets
|
|
96
|
+
const borrow = balanceInfo.borrowAssets
|
|
97
|
+
const depositDec = parseRawAmount(deposits.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18)
|
|
98
|
+
const borrowDec = parseRawAmount(borrow.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18)
|
|
99
|
+
|
|
100
|
+
const dataForLoanAsset = {
|
|
101
|
+
poolId: loanAddress,
|
|
102
|
+
underlying: loanAddress,
|
|
103
|
+
deposits: parseRawAmount(deposits.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18),
|
|
104
|
+
depositsRaw: deposits.toString(),
|
|
105
|
+
debtStable: "0",
|
|
106
|
+
debt: borrowDec,
|
|
107
|
+
depositsUSD: Number(depositDec) * priceLoan,
|
|
108
|
+
debtStableUSD: 0,
|
|
109
|
+
debtUSD: Number(borrowDec) * priceLoan,
|
|
110
|
+
stableBorrowRate: "0",
|
|
111
|
+
collateralActive: true,
|
|
112
|
+
claimableRewards: 0,
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
const collateralAddress = market.collateralAddress.toLowerCase()
|
|
117
|
+
const assetMeta = getAssetMeta(chainId, collateralAddress)
|
|
118
|
+
const decimals = market.collateralDecimals ?? assetMeta?.decimals ?? 18
|
|
119
|
+
|
|
120
|
+
const collateralDec = parseRawAmount(balanceInfo.collateral.toString(), decimals)
|
|
121
|
+
|
|
122
|
+
const key = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(collateralAddress, chainId)
|
|
123
|
+
// prices
|
|
124
|
+
const price = prices[key] ?? 1
|
|
125
|
+
const priceHist = pricesHist?.[key] ?? price
|
|
126
|
+
|
|
127
|
+
const dataForCollateralAsset = {
|
|
128
|
+
poolId: collateralAddress,
|
|
129
|
+
underlying: collateralAddress,
|
|
130
|
+
deposits: collateralDec,
|
|
131
|
+
depositsRaw: balanceInfo.collateral.toString(),
|
|
132
|
+
debtStable: "0",
|
|
133
|
+
debt: "0",
|
|
134
|
+
depositsUSD: Number(collateralDec) * price,
|
|
135
|
+
debtStableUSD: 0,
|
|
136
|
+
debtUSD: 0,
|
|
137
|
+
stableBorrowRate: "0",
|
|
138
|
+
collateralActive: true,
|
|
139
|
+
claimableRewards: 0,
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
dataForMarket: {
|
|
144
|
+
[loanAddress]: dataForLoanAsset,
|
|
145
|
+
[collateralAddress]: dataForCollateralAsset
|
|
146
|
+
},
|
|
147
|
+
addedDeposits: Number(depositDec) * priceHistLoan + Number(collateralDec) * priceHist,
|
|
148
|
+
addedDebt: Number(borrowDec) * priceHistLoan
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { Lender } from "@1delta/asset-registry"
|
|
2
|
+
import { getAssetMeta, toGenericPriceKey, toOracleKey } from "../../../assets"
|
|
3
|
+
import { MorphoUserReserveResponse } from "../types"
|
|
4
|
+
import { createBaseTypeUserState } from "../utils"
|
|
5
|
+
import { MorphoPositionParams } from "./types"
|
|
6
|
+
import { parseRawAmount } from "../../../utils/parsing"
|
|
7
|
+
import { MorphoMarket } from "../../morpho/types"
|
|
8
|
+
import { toAssetsDown } from "./morphoLib"
|
|
9
|
+
|
|
10
|
+
export const getMorphoUserDataConverter = (
|
|
11
|
+
lender: Lender,
|
|
12
|
+
chainId: string,
|
|
13
|
+
account: string,
|
|
14
|
+
markets: MorphoMarket[],
|
|
15
|
+
prices: { [asset: string]: number },
|
|
16
|
+
pricesHist: { [asset: string]: number },
|
|
17
|
+
lenderData: any
|
|
18
|
+
): [(data: any[]) => { [market: string]: MorphoUserReserveResponse } | undefined, number] => {
|
|
19
|
+
|
|
20
|
+
const expectedNumberOfCalls = markets.length * 2
|
|
21
|
+
return [
|
|
22
|
+
(data: any[]) => {
|
|
23
|
+
if (data.length !== expectedNumberOfCalls) {
|
|
24
|
+
return undefined
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let datas: { [market: string]: MorphoUserReserveResponse } = {}
|
|
28
|
+
for (let i = 0; i < markets.length; i++) {
|
|
29
|
+
|
|
30
|
+
let totalDebt24h = 0
|
|
31
|
+
let totalDeposits24h = 0
|
|
32
|
+
const market = markets[i]
|
|
33
|
+
const {
|
|
34
|
+
dataForMarket,
|
|
35
|
+
addedDebt,
|
|
36
|
+
addedDeposits
|
|
37
|
+
} = createMorphoEntryFromMarket(
|
|
38
|
+
i,
|
|
39
|
+
data,
|
|
40
|
+
chainId,
|
|
41
|
+
market,
|
|
42
|
+
prices,
|
|
43
|
+
pricesHist,
|
|
44
|
+
)
|
|
45
|
+
if (!dataForMarket) continue;
|
|
46
|
+
|
|
47
|
+
totalDebt24h += addedDebt
|
|
48
|
+
totalDeposits24h += addedDeposits
|
|
49
|
+
|
|
50
|
+
const payload = {
|
|
51
|
+
chainId,
|
|
52
|
+
account,
|
|
53
|
+
lendingPositions: { "0": dataForMarket },
|
|
54
|
+
rewards: {},
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const userData = createBaseTypeUserState(payload, lenderData, totalDeposits24h, totalDebt24h)
|
|
58
|
+
|
|
59
|
+
datas[market.lender] = {
|
|
60
|
+
...payload,
|
|
61
|
+
...userData,
|
|
62
|
+
id: market.id
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
return datas
|
|
67
|
+
},
|
|
68
|
+
expectedNumberOfCalls,
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function createMorphoEntryFromMarket(
|
|
73
|
+
i: number,
|
|
74
|
+
data: any[],
|
|
75
|
+
chainId: string,
|
|
76
|
+
market: MorphoMarket,
|
|
77
|
+
prices: any,
|
|
78
|
+
pricesHist: any,
|
|
79
|
+
) {
|
|
80
|
+
const userPosition = data[2 * i]
|
|
81
|
+
const marketData = data[2 * i + 1]
|
|
82
|
+
const collateralBalance = userPosition[MorphoPositionParams.collateral]?.toString()
|
|
83
|
+
const currentLendShares = userPosition[MorphoPositionParams.supplyShares]?.toString()
|
|
84
|
+
const currentBorrowShares = userPosition[MorphoPositionParams.borrowShares]?.toString()
|
|
85
|
+
|
|
86
|
+
const totalSupplyShares = BigInt(marketData[MorphoPositionParams.collateral]?.toString() ?? 0n)
|
|
87
|
+
const totalSupplyAssets = BigInt(marketData[MorphoPositionParams.supplyShares]?.toString() ?? 0n)
|
|
88
|
+
const totalBorrowShares = BigInt(marketData[MorphoPositionParams.borrowShares]?.toString() ?? 0n)
|
|
89
|
+
const totalBorrowAssets = BigInt(marketData[MorphoPositionParams.borrowShares]?.toString() ?? 0n)
|
|
90
|
+
|
|
91
|
+
if (
|
|
92
|
+
currentLendShares === "0" &&
|
|
93
|
+
currentBorrowShares === "0" &&
|
|
94
|
+
collateralBalance === "0"
|
|
95
|
+
) {
|
|
96
|
+
return {
|
|
97
|
+
dataForMarket: undefined,
|
|
98
|
+
addedDeposits: 0,
|
|
99
|
+
addedDebt: 0
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const loanMeta = getAssetMeta(chainId, market.loanAddress)
|
|
104
|
+
|
|
105
|
+
const loanKey = toOracleKey(loanMeta?.assetGroup) ?? toGenericPriceKey(market.loanAddress, chainId)
|
|
106
|
+
// prices
|
|
107
|
+
const priceLoan = prices[loanKey] ?? 1
|
|
108
|
+
const priceHistLoan = pricesHist?.[loanKey] ?? priceLoan
|
|
109
|
+
|
|
110
|
+
const deposits = toAssetsDown(currentLendShares, totalSupplyAssets, totalSupplyShares)
|
|
111
|
+
const borrow = toAssetsDown(currentBorrowShares, totalBorrowAssets, totalBorrowShares)
|
|
112
|
+
const depositDec = parseRawAmount(deposits.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18)
|
|
113
|
+
const borrowDec = parseRawAmount(borrow.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
const dataForLoanAsset = {
|
|
117
|
+
poolId: market.loanAddress,
|
|
118
|
+
underlying: market.loanAddress,
|
|
119
|
+
deposits: parseRawAmount(deposits.toString(), market.loanDecimals ?? loanMeta?.decimals ?? 18),
|
|
120
|
+
depositsRaw: deposits.toString(),
|
|
121
|
+
debtStable: "0",
|
|
122
|
+
debt: borrowDec,
|
|
123
|
+
depositsUSD: Number(depositDec) * priceLoan,
|
|
124
|
+
debtStableUSD: 0,
|
|
125
|
+
debtUSD: Number(borrowDec) * priceLoan,
|
|
126
|
+
stableBorrowRate: "0",
|
|
127
|
+
collateralActive: true,
|
|
128
|
+
claimableRewards: 0,
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
const assetMeta = getAssetMeta(chainId, market.collateralAddress)
|
|
133
|
+
const decimals = market.collateralDecimals ?? assetMeta?.decimals ?? 18
|
|
134
|
+
|
|
135
|
+
const collateralDec = parseRawAmount(collateralBalance, decimals)
|
|
136
|
+
|
|
137
|
+
const key = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(market.collateralAddress, chainId)
|
|
138
|
+
// prices
|
|
139
|
+
const price = prices[key] ?? 1
|
|
140
|
+
const priceHist = pricesHist?.[key] ?? price
|
|
141
|
+
|
|
142
|
+
const dataForCollateralAsset = {
|
|
143
|
+
poolId: market.collateralAddress,
|
|
144
|
+
underlying: market.collateralAddress,
|
|
145
|
+
deposits: collateralDec,
|
|
146
|
+
depositsRaw: collateralBalance,
|
|
147
|
+
debtStable: "0",
|
|
148
|
+
debt: "0",
|
|
149
|
+
depositsUSD: Number(collateralDec) * price,
|
|
150
|
+
debtStableUSD: 0,
|
|
151
|
+
debtUSD: 0,
|
|
152
|
+
stableBorrowRate: "0",
|
|
153
|
+
collateralActive: true,
|
|
154
|
+
claimableRewards: 0,
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
dataForMarket: {
|
|
159
|
+
[market.loanAddress]: dataForLoanAsset,
|
|
160
|
+
[market.collateralAddress]: dataForCollateralAsset
|
|
161
|
+
},
|
|
162
|
+
addedDeposits: Number(depositDec) * priceHistLoan + Number(collateralDec) * priceHist,
|
|
163
|
+
addedDebt: Number(borrowDec) * priceHistLoan
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|