@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.
Files changed (83) hide show
  1. package/dist/lending/aave-v2-type/types.d.ts +2 -0
  2. package/dist/lending/aave-v2-type/types.d.ts.map +1 -1
  3. package/dist/lending/fetchLender.d.ts.map +1 -1
  4. package/dist/lending/fetchLender.js +25 -29
  5. package/dist/lending/fetchLenderAll.d.ts +2 -1
  6. package/dist/lending/fetchLenderAll.d.ts.map +1 -1
  7. package/dist/lending/fetchLenderAll.js +3 -3
  8. package/dist/lending/fetchLenderExt.d.ts +2 -1
  9. package/dist/lending/fetchLenderExt.d.ts.map +1 -1
  10. package/dist/lending/fetchLenderExt.js +28 -14
  11. package/dist/lending/index.d.ts +2 -0
  12. package/dist/lending/index.d.ts.map +1 -1
  13. package/dist/lending/index.js +2 -0
  14. package/dist/lending/morpho/convertPublic.d.ts +3 -5
  15. package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
  16. package/dist/lending/morpho/convertPublic.js +16 -12
  17. package/dist/lending/morpho/fetchPublic.js +1 -1
  18. package/dist/lending/morpho/publicCallBuild.d.ts +1 -4
  19. package/dist/lending/morpho/publicCallBuild.d.ts.map +1 -1
  20. package/dist/lending/morpho/types.d.ts +2 -0
  21. package/dist/lending/morpho/types.d.ts.map +1 -1
  22. package/dist/lending/user-data/aave-v3-type/userCallBuild.d.ts.map +1 -1
  23. package/dist/lending/user-data/aave-v3-type/userCallBuild.js +4 -7
  24. package/dist/lending/user-data/abis.d.ts +88 -0
  25. package/dist/lending/user-data/abis.d.ts.map +1 -1
  26. package/dist/lending/user-data/abis.js +5 -1
  27. package/dist/lending/user-data/compound-v3/userCallParse.d.ts.map +1 -1
  28. package/dist/lending/user-data/compound-v3/userCallParse.js +1 -0
  29. package/dist/lending/user-data/fetchUserData.d.ts +4 -4
  30. package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
  31. package/dist/lending/user-data/fetchUserData.js +46 -25
  32. package/dist/lending/user-data/morpho/userCallBuild.d.ts +4 -5
  33. package/dist/lending/user-data/morpho/userCallBuild.d.ts.map +1 -1
  34. package/dist/lending/user-data/morpho/userCallBuild.js +15 -9
  35. package/dist/lending/user-data/morpho/userCallParse.d.ts +1 -2
  36. package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
  37. package/dist/lending/user-data/morpho/userCallParse.js +15 -12
  38. package/dist/lending/user-data/types.d.ts +30 -19
  39. package/dist/lending/user-data/types.d.ts.map +1 -1
  40. package/dist/lending/user-data/types.js +12 -0
  41. package/dist/lending/user-data/utils/createGeneralUserState.d.ts +4 -4
  42. package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
  43. package/dist/lending/user-data/utils/createGeneralUserState.js +24 -17
  44. package/dist/utils/index.d.ts +5 -3
  45. package/dist/utils/index.d.ts.map +1 -1
  46. package/dist/utils/index.js +20 -11
  47. package/dist/utils/parsing.d.ts +1 -0
  48. package/dist/utils/parsing.d.ts.map +1 -1
  49. package/dist/utils/parsing.js +3 -0
  50. package/dist/yields/index.d.ts.map +1 -1
  51. package/dist/yields/index.js +12 -5
  52. package/package.json +1 -1
  53. package/src/abis/morpho/blue.ts +99 -0
  54. package/src/abis/morpho/lens.ts +31 -0
  55. package/src/lending/aave-v2-type/types.ts +2 -0
  56. package/src/lending/fetchLender.ts +86 -49
  57. package/src/lending/fetchLenderAll.ts +30 -0
  58. package/src/lending/fetchLenderExt.ts +82 -0
  59. package/src/lending/index.ts +3 -1
  60. package/src/lending/morpho/convertPublic.ts +153 -0
  61. package/src/lending/morpho/fetchPublic.ts +80 -0
  62. package/src/lending/morpho/publicCallBuild.ts +11 -0
  63. package/src/lending/morpho/types.ts +129 -0
  64. package/src/lending/user-data/aave-v3-type/userCallBuild.ts +2 -8
  65. package/src/lending/user-data/abis.ts +4 -1
  66. package/src/lending/user-data/compound-v3/userCallParse.ts +1 -0
  67. package/src/lending/user-data/fetchUserData.ts +114 -33
  68. package/src/lending/user-data/morpho/decoder.ts +71 -0
  69. package/src/lending/user-data/morpho/morphoLib.ts +61 -0
  70. package/src/lending/user-data/morpho/types.ts +12 -0
  71. package/src/lending/user-data/morpho/userCallBuild.ts +63 -0
  72. package/src/lending/user-data/morpho/userCallParse.ts +150 -0
  73. package/src/lending/user-data/morpho/userCallParseNoDeploy.ts +168 -0
  74. package/src/lending/user-data/types.ts +64 -42
  75. package/src/lending/user-data/utils/createGeneralUserState.ts +56 -32
  76. package/src/utils/index.ts +32 -14
  77. package/src/utils/parsing.ts +5 -0
  78. package/src/yields/index.ts +13 -4
  79. package/test/lenderData.test.ts +13251 -13649
  80. package/test/mainPrices.test.ts +1 -13
  81. package/test/morpho.test.ts +20 -0
  82. package/test/userDataMorpho.test.ts +79 -0
  83. package/test/utils.ts +13 -0
@@ -0,0 +1,153 @@
1
+ import { formatUnits } from 'viem'
2
+ import {
3
+ MorphoGeneralPublicResponse,
4
+ RewardsMap,
5
+ GetMarketsResponse,
6
+ } from './types'
7
+ import { apyToApr } from '../user-data/utils'
8
+ import { AdditionalYields } from '../../types'
9
+ import { GenericTokenList } from '../types'
10
+
11
+ function parseLtv(ltv: number | string) {
12
+ let str = 0
13
+ try {
14
+ str = Number(formatUnits(BigInt(ltv), 18))
15
+ } catch (e) {}
16
+ return str
17
+ }
18
+
19
+ function formatNr(n: string, d: number) {
20
+ return Number(formatUnits(BigInt(n ?? 0), d))
21
+ }
22
+
23
+ export function convertMarketsToMorphoResponse(
24
+ response: GetMarketsResponse,
25
+ chainId: string,
26
+ additionalYields: AdditionalYields = {
27
+ intrinsicYields: {},
28
+ lenderRewards: {},
29
+ loaded: true,
30
+ },
31
+ tokens: GenericTokenList = {},
32
+ ): { [m: string]: MorphoGeneralPublicResponse } {
33
+ const data: { [m: string]: MorphoGeneralPublicResponse } = {}
34
+
35
+ response.markets.items.forEach((market) => {
36
+ const {
37
+ uniqueKey,
38
+ lltv,
39
+ irmAddress,
40
+ oracleAddress,
41
+ loanAsset,
42
+ collateralAsset,
43
+ state,
44
+ } = market
45
+ if (collateralAsset && loanAsset && oracleAddress) {
46
+ const m = 'MORPHO_BLUE_' + uniqueKey.slice(2).toUpperCase()
47
+ // @ts-ignore
48
+ if (!data[m]) data[m] = { data: {} }
49
+ // 1. LOAN asset entry
50
+ const loanRewards: RewardsMap = {}
51
+
52
+ // state.rewards?.forEach((reward) => {
53
+ // loanRewards[reward.asset.address] = {
54
+ // depositRate: formatNr(reward.amountPerSuppliedToken, reward.asset.decimals),
55
+ // variableBorrowRate: formatNr(reward.amountPerBorrowedToken, reward.asset.decimals),
56
+ // stableBorrowRate: 0,
57
+ // }
58
+ // })
59
+
60
+ const loanAssetAddress = loanAsset.address.toLowerCase()
61
+
62
+ const meta = tokens[loanAssetAddress] ?? loanAsset
63
+
64
+ data[m].data[loanAssetAddress] = {
65
+ poolId: loanAssetAddress,
66
+ underlying: loanAssetAddress,
67
+ asset: meta,
68
+ totalDeposits: formatNr(state.supplyAssets, loanAsset.decimals),
69
+ totalDebtStable: 0,
70
+ totalDebt: formatNr(state.borrowAssets, loanAsset.decimals),
71
+ totalDepositsUSD: Number(state.supplyAssetsUsd),
72
+ totalDebtStableUSD: 0,
73
+ totalDebtUSD: Number(state.borrowAssetsUsd),
74
+ depositRate: apyToApr(Number(state.supplyApy)) * 100,
75
+ variableBorrowRate: apyToApr(Number(state.borrowApy)) * 100,
76
+ stableBorrowRate: 0,
77
+ stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
78
+ rewards: Object.keys(loanRewards).length > 0 ? loanRewards : undefined,
79
+ decimals: loanAsset.decimals,
80
+ config: {
81
+ 0: {
82
+ category: 0,
83
+ borrowCollateralFactor: 0,
84
+ collateralFactor: 0,
85
+ borrowFactor: 1,
86
+ },
87
+ },
88
+ collateralActive: false,
89
+ borrowingEnabled: true,
90
+ hasStable: false,
91
+ isActive: true,
92
+ isFrozen: false,
93
+ }
94
+
95
+ const ltv = parseLtv(lltv)
96
+
97
+ const collateralAssetAddress = collateralAsset.address.toLowerCase()
98
+ const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset
99
+ // 2. COLLATERAL asset entry
100
+ data[m].data[collateralAssetAddress] = {
101
+ poolId: collateralAssetAddress,
102
+ underlying: collateralAssetAddress,
103
+ asset: metaCollateral,
104
+ totalDeposits: formatNr(
105
+ state.collateralAssets,
106
+ collateralAsset.decimals,
107
+ ),
108
+ totalDebtStable: 0,
109
+ totalDebt: 0,
110
+ totalDepositsUSD: Number(state.collateralAssetsUsd),
111
+ totalDebtStableUSD: 0,
112
+ totalDebtUSD: 0,
113
+ depositRate: 0,
114
+ variableBorrowRate: 0,
115
+ stableBorrowRate: 0,
116
+ stakingYield:
117
+ additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
118
+ rewards: undefined,
119
+ decimals: collateralAsset.decimals,
120
+ config: {
121
+ 0: {
122
+ category: 0,
123
+ borrowCollateralFactor: ltv,
124
+ collateralFactor: ltv,
125
+ borrowFactor: 1,
126
+ },
127
+ },
128
+ collateralActive: true,
129
+ borrowingEnabled: false,
130
+ hasStable: false,
131
+ isActive: true,
132
+ isFrozen: false,
133
+ }
134
+
135
+ data[m].params = {
136
+ market: {
137
+ lender: m,
138
+ collateralDecimals: collateralAsset.decimals,
139
+ loanDecimals: loanAsset.decimals,
140
+ id: uniqueKey,
141
+ lltv,
142
+ oracle: oracleAddress,
143
+ irm: irmAddress,
144
+ collateralAddress: collateralAsset.address,
145
+ loanAddress: loanAsset.address,
146
+ },
147
+ }
148
+ data[m].chainId = chainId
149
+ }
150
+ })
151
+
152
+ return data
153
+ }
@@ -0,0 +1,80 @@
1
+
2
+ export const query = (first: number, skip: number, chainId: string) => `
3
+ query GetMarkets {
4
+ markets(first: ${first}, skip: ${skip}, where: {
5
+ chainId_in: [${chainId}],
6
+ whitelisted: true
7
+ },
8
+ orderBy: SupplyAssetsUsd,
9
+ orderDirection: Desc
10
+ ) {
11
+ items {
12
+ uniqueKey
13
+ irmAddress
14
+ oracleAddress
15
+ lltv
16
+ loanAsset {
17
+ address
18
+ name
19
+ symbol
20
+ decimals
21
+ priceUsd
22
+ }
23
+ collateralAsset {
24
+ address
25
+ name
26
+ symbol
27
+ decimals
28
+ priceUsd
29
+ }
30
+ state {
31
+ borrowApy
32
+ supplyApy
33
+ price
34
+ rewards {
35
+ asset {
36
+ address
37
+ name
38
+ symbol
39
+ decimals
40
+ }
41
+ amountPerBorrowedToken
42
+ amountPerSuppliedToken
43
+ }
44
+ borrowAssets
45
+ borrowAssetsUsd
46
+ supplyAssets
47
+ supplyAssetsUsd
48
+ collateralAssets
49
+ collateralAssetsUsd
50
+ }
51
+ }
52
+ }
53
+ }
54
+ `
55
+
56
+ const BASE_URL = "https://blue-api.morpho.org/graphql"
57
+
58
+
59
+ export async function fetchMorphoMarkets(chainId: string) {
60
+ const requestBody = {
61
+ query: query(200, 0, chainId),
62
+ variables: {},
63
+ };
64
+ const response = await fetch(BASE_URL, {
65
+ method: 'POST',
66
+ headers: {
67
+ 'Content-Type': 'application/json',
68
+ },
69
+ body: JSON.stringify(requestBody),
70
+ });
71
+
72
+ if (!response.ok) {
73
+ throw new Error(`Network error: ${response.status} - ${response.statusText}`);
74
+ }
75
+
76
+ const data: any = await response.json();
77
+
78
+ return data.data
79
+
80
+ }
@@ -0,0 +1,11 @@
1
+ import { AdditionalYields } from "../../types"
2
+ import { convertMarketsToMorphoResponse } from "./convertPublic"
3
+ import { fetchMorphoMarkets } from "./fetchPublic"
4
+
5
+ export async function fetchMorphoPublicData(
6
+ chainId: string,
7
+ yields: AdditionalYields = { intrinsicYields: {}, lenderRewards: {}, loaded: true }
8
+ ) {
9
+ const mbData = await fetchMorphoMarkets(chainId)
10
+ return convertMarketsToMorphoResponse(mbData, chainId, yields)
11
+ }
@@ -0,0 +1,129 @@
1
+ import { GenericCurrency } from "../types";
2
+
3
+
4
+ export type GetMarketsResponse = {
5
+ markets: {
6
+ items: {
7
+ uniqueKey: string;
8
+ irmAddress: string;
9
+ oracleAddress: string;
10
+ lltv: string;
11
+ loanAsset: {
12
+ address: string;
13
+ name: string;
14
+ symbol: string;
15
+ decimals: number;
16
+ priceUsd: string;
17
+ };
18
+ collateralAsset: {
19
+ address: string;
20
+ name: string;
21
+ symbol: string;
22
+ decimals: number;
23
+ priceUsd: string;
24
+ };
25
+ state: {
26
+ borrowApy: string;
27
+ supplyApy: string;
28
+ price: string;
29
+ rewards: {
30
+ asset: {
31
+ address: string
32
+ name: string
33
+ symbol: string
34
+ decimals: number
35
+ }
36
+ amountPerBorrowedToken: string;
37
+ amountPerSuppliedToken: string;
38
+ }[];
39
+ borrowAssets: string;
40
+ borrowAssetsUsd: string;
41
+ supplyAssets: string
42
+ supplyAssetsUsd: string
43
+ collateralAssets: string;
44
+ collateralAssetsUsd: string;
45
+ };
46
+ }[];
47
+ };
48
+ };
49
+
50
+ export interface BaseYields {
51
+ // borrow interest rates
52
+ variableBorrowRate: number
53
+ stableBorrowRate: number
54
+ // deposit interest rate
55
+ depositRate: number
56
+ }
57
+
58
+ export type RewardsMap = { [rewardId: string]: BaseYields }
59
+
60
+
61
+
62
+ export interface MorphoMarket {
63
+ /** the 1delta lender enum */
64
+ lender: string
65
+ collateralDecimals?: number
66
+ loanDecimals?: number
67
+
68
+
69
+ /** the market hash */
70
+ id: string,
71
+ /** market params */
72
+ lltv: string;
73
+ oracle: string;
74
+ irm: string;
75
+ collateralAddress: string;
76
+ loanAddress: string;
77
+ }
78
+
79
+
80
+ export interface MorphoGeneralPublicResponse {
81
+ data: {
82
+ [tokenSymbol: string]: {
83
+ poolId: string
84
+ underlying: string
85
+ asset: GenericCurrency
86
+ // token amounts
87
+ totalDeposits: number;
88
+ totalDebtStable: 0;
89
+ totalDebt: number;
90
+ // USD amounts
91
+ totalDepositsUSD: number;
92
+ totalDebtStableUSD: 0;
93
+ totalDebtUSD: number;
94
+ // rates
95
+ depositRate: number;
96
+ variableBorrowRate: number;
97
+ stakingYield: number;
98
+ stableBorrowRate: 0;
99
+
100
+ // rewards
101
+ rewards?: RewardsMap
102
+
103
+ // config part
104
+ decimals: number;
105
+
106
+ config: {
107
+ [0]: {
108
+ category: number
109
+ // collateral factors
110
+ borrowCollateralFactor: number
111
+ collateralFactor: number
112
+ borrowFactor: 1
113
+ }
114
+ }
115
+
116
+ // flags
117
+ collateralActive: boolean;
118
+ borrowingEnabled: boolean;
119
+ hasStable: false;
120
+ isActive: true;
121
+ isFrozen: false;
122
+ }
123
+ }
124
+ /** morpho market info */
125
+ params: {
126
+ market: MorphoMarket;
127
+ }
128
+ chainId: string
129
+ }
@@ -1,18 +1,14 @@
1
1
  import { Lender } from "@1delta/asset-registry"
2
2
  import { Call } from "../../../utils/multicall"
3
- import { getAaveAssets, getAaveStyleProtocolTokenMap, getAaveTypePoolDataProviderAddress, getAaveTypePoolAddress } from "../../../assets"
4
- import { getComposerAddress, isYLDR } from "../../../utils"
5
-
6
- const fallbackDebtToken = '0x52A1CeB68Ee6b7B5D13E0376A1E0E4423A8cE26e'
3
+ import { getAaveAssets, getAaveTypePoolDataProviderAddress, getAaveTypePoolAddress } from "../../../assets"
4
+ import { isYLDR } from "../../../utils"
7
5
 
8
6
  const getBaseAaveV3Calls = (
9
7
  chainId: string,
10
8
  account: string,
11
9
  lender: Lender,
12
10
  assetsToQuery: string[],
13
- aaveTokenMap: any
14
11
  ) => {
15
- const broker = getComposerAddress(chainId)
16
12
  return assetsToQuery.flatMap((tk) => [
17
13
  {
18
14
  address: getAaveTypePoolDataProviderAddress(chainId, lender),
@@ -24,7 +20,6 @@ const getBaseAaveV3Calls = (
24
20
 
25
21
  export const buildAaveV3UserCall = (chainId: string, lender: Lender, account: string): Call[] => {
26
22
  const assetsToQuery = getAaveAssets(chainId, lender)
27
- const aaveTokenMap = getAaveStyleProtocolTokenMap(chainId, lender)
28
23
 
29
24
  const calls = [
30
25
  ...getBaseAaveV3Calls(
@@ -32,7 +27,6 @@ export const buildAaveV3UserCall = (chainId: string, lender: Lender, account: st
32
27
  account,
33
28
  lender,
34
29
  assetsToQuery,
35
- aaveTokenMap
36
30
  ),
37
31
  ]
38
32
  if (!isYLDR(lender)) {
@@ -1,5 +1,5 @@
1
1
  import { Lender } from "@1delta/asset-registry"
2
- import { isAaveV2Type, isAaveV3Type, isCompoundV3, isInit, isAaveV32Type, isYLDR } from "../../utils"
2
+ import { isAaveV2Type, isAaveV3Type, isCompoundV3, isInit, isAaveV32Type, isYLDR, isMorphoType } from "../../utils"
3
3
  import { IncentivesControllerAbi } from "../../abis/lendle/IncentivesController"
4
4
  import { RewarderAbi } from "../../abis/aurelius/Rewarder"
5
5
  import { AavePoolV3UpgradedAbi } from "../../abis/aave/AavePoolV3Upgraded"
@@ -15,6 +15,8 @@ import { MultiFeeDistributionAbi } from "../../abis/lendle/MultiFeeDistribution"
15
15
  import { PullRewardsIncentivesController } from "../../abis/meridian/PullRewardsIncentivesController"
16
16
  import { CometRewardsAbi } from "../../abis/compound-v3/CometRewards"
17
17
  import { YLDRAbi } from "../../abis/aave-v3/YLDR"
18
+ import { MorphoBlueAbi } from "../../abis/morpho/blue"
19
+ import { MorphoLensAbi } from "../../abis/morpho/lens"
18
20
 
19
21
  export const getAbi = (lender: Lender) => {
20
22
  if (isAaveV2Type(lender as any)) return [
@@ -45,6 +47,7 @@ export const getAbi = (lender: Lender) => {
45
47
  ...CometExtAbi,
46
48
  ...CometRewardsAbi,
47
49
  ]
50
+ if(isMorphoType(lender)) return [...MorphoBlueAbi, ...MorphoLensAbi]
48
51
  if (isInit(lender as any)) return InitLensAbi
49
52
  return []
50
53
  }
@@ -53,6 +53,7 @@ export const getCompoundV3UserDataConverter = (
53
53
  depositsUSD: Number(deposits) * price,
54
54
  debtStableUSD: 0,
55
55
  debt: "0",
56
+ debtStable: "0",
56
57
  debtUSD: 0,
57
58
  collateralActive: true,
58
59
  // user depos raw
@@ -1,27 +1,39 @@
1
- import { Call, multicallViemAbiArray } from "../../utils/multicall"
2
- import { Lender } from "@1delta/asset-registry"
3
- import { isAaveV2Type, isAaveV3Type, isInit, isYLDR } from "../../utils"
4
- import { LenderUserQuery } from "./types"
5
- import { GetEvmClientFunction } from "../../types"
6
- import { buildAaveV2UserCall } from "./aave-v2-type/userCallBuild"
7
- import { buildAaveV3UserCall } from "./aave-v3-type/userCallBuild"
8
- import { buildInitUserCall } from "./init/userCallBuild"
9
- import { buildCompoundV3UserCall } from "./compound-v3/userCallBuild"
10
- import { getAbi } from "./abis"
11
- import { getAaveV2UserDataConverter } from "./aave-v2-type/userCallParse"
12
- import { getAaveV3UserDataConverter } from "./aave-v3-type/userCallParse"
13
- import { getInitUserDataConverter } from "./init/userCallParse"
14
- import { getCompoundV3UserDataConverter } from "./compound-v3/userCallParse"
15
- import { getYldrUserDataConverter } from "./aave-v3-type/userCallParseYldr"
1
+ import { Call, multicallViemAbiArray } from '../../utils/multicall'
2
+ import { Lender } from '@1delta/asset-registry'
3
+ import {
4
+ isAaveV2Type,
5
+ isAaveV3Type,
6
+ isInit,
7
+ isMorphoType,
8
+ isMultiMarket,
9
+ isYLDR,
10
+ } from '../../utils'
11
+ import { LenderUserQuery, organizeUserQueries } from './types'
12
+ import { GetEvmClientFunction } from '../../types'
13
+ import { buildAaveV2UserCall } from './aave-v2-type/userCallBuild'
14
+ import { buildAaveV3UserCall } from './aave-v3-type/userCallBuild'
15
+ import { buildInitUserCall } from './init/userCallBuild'
16
+ import { buildCompoundV3UserCall } from './compound-v3/userCallBuild'
17
+ import { getAbi } from './abis'
18
+ import { getAaveV2UserDataConverter } from './aave-v2-type/userCallParse'
19
+ import { getAaveV3UserDataConverter } from './aave-v3-type/userCallParse'
20
+ import { getInitUserDataConverter } from './init/userCallParse'
21
+ import { getCompoundV3UserDataConverter } from './compound-v3/userCallParse'
22
+ import { getYldrUserDataConverter } from './aave-v3-type/userCallParseYldr'
23
+ import { buildMorphoUserCallWithLens } from './morpho/userCallBuild'
24
+ import { getMorphoUserDataConverterWithlens } from './morpho/userCallParse'
16
25
 
17
26
  function buildUserCall(
18
27
  chainId: string,
19
28
  lender: Lender,
20
- account: string
29
+ account: string,
30
+ params?: any,
21
31
  ) {
22
32
  if (isAaveV2Type(lender)) return buildAaveV2UserCall(chainId, lender, account)
23
33
  if (isAaveV3Type(lender)) return buildAaveV3UserCall(chainId, lender, account)
24
34
  if (isInit(lender)) return buildInitUserCall(chainId, lender, account)
35
+ if (isMorphoType(lender))
36
+ return buildMorphoUserCallWithLens(chainId, account, lender, params)
25
37
  return buildCompoundV3UserCall(chainId, lender, account)
26
38
  }
27
39
 
@@ -31,13 +43,63 @@ function getUserDataConverter(
31
43
  account: string,
32
44
  prices: { [a: string]: number },
33
45
  pricesHist: { [a: string]: number },
34
- lenderPublicState: any
46
+ lenderPublicState: any,
47
+ params?: any,
35
48
  ) {
36
- if (isYLDR(lender)) return getYldrUserDataConverter(lender, chainId, account, prices, pricesHist, lenderPublicState)
37
- if (isAaveV2Type(lender)) return getAaveV2UserDataConverter(lender, chainId, account, prices, pricesHist, lenderPublicState)
38
- if (isAaveV3Type(lender)) return getAaveV3UserDataConverter(lender, chainId, account, prices, pricesHist, lenderPublicState)
39
- if (isInit(lender)) return getInitUserDataConverter(lender, chainId, account, prices, pricesHist, lenderPublicState)
40
- return getCompoundV3UserDataConverter(lender, chainId, account, prices, pricesHist, lenderPublicState)
49
+ if (isYLDR(lender))
50
+ return getYldrUserDataConverter(
51
+ lender,
52
+ chainId,
53
+ account,
54
+ prices,
55
+ pricesHist,
56
+ lenderPublicState?.data?.[lender]?.data,
57
+ )
58
+ if (isAaveV2Type(lender))
59
+ return getAaveV2UserDataConverter(
60
+ lender,
61
+ chainId,
62
+ account,
63
+ prices,
64
+ pricesHist,
65
+ lenderPublicState?.data?.[lender]?.data,
66
+ )
67
+ if (isAaveV3Type(lender))
68
+ return getAaveV3UserDataConverter(
69
+ lender,
70
+ chainId,
71
+ account,
72
+ prices,
73
+ pricesHist,
74
+ lenderPublicState?.data?.[lender]?.data,
75
+ )
76
+ if (isInit(lender))
77
+ return getInitUserDataConverter(
78
+ lender,
79
+ chainId,
80
+ account,
81
+ prices,
82
+ pricesHist,
83
+ lenderPublicState?.data?.[lender]?.data,
84
+ )
85
+ if (isMorphoType(lender))
86
+ return getMorphoUserDataConverterWithlens(
87
+ lender,
88
+ chainId,
89
+ account,
90
+ params,
91
+ prices,
92
+ pricesHist,
93
+ lenderPublicState?.data,
94
+ )
95
+ return getCompoundV3UserDataConverter(
96
+ lender,
97
+ chainId,
98
+ account,
99
+ prices,
100
+ pricesHist,
101
+ lenderPublicState,
102
+ )
41
103
  }
42
104
 
43
105
  /**
@@ -49,17 +111,23 @@ function getUserDataConverter(
49
111
  */
50
112
  export const getLenderUserDataResult = async (
51
113
  chainId: string,
52
- queries: LenderUserQuery[],
53
- getEvmClient: GetEvmClientFunction
114
+ queriesRaw: LenderUserQuery[],
115
+ getEvmClient: GetEvmClientFunction,
54
116
  ): Promise<any[]> => {
55
117
  let calls: {
56
118
  call: Call
57
119
  abi: any
58
120
  }[] = []
59
121
 
122
+ const queries = organizeUserQueries(queriesRaw)
60
123
  for (const query of queries) {
61
124
  const abi = getAbi(query.lender)
62
- const callData = buildUserCall(chainId, query.lender, query.account)
125
+ const callData = buildUserCall(
126
+ chainId,
127
+ query.lender,
128
+ query.account,
129
+ query.params,
130
+ )
63
131
  const mappedCalls = callData.map((call) => ({ call, abi }))
64
132
  calls = [...calls, ...mappedCalls]
65
133
  }
@@ -71,7 +139,7 @@ export const getLenderUserDataResult = async (
71
139
  getEvmClient,
72
140
  true,
73
141
  0,
74
- 3
142
+ 3,
75
143
  )
76
144
  }
77
145
 
@@ -87,12 +155,13 @@ export const getLenderUserDataResult = async (
87
155
  */
88
156
  export const convertLenderUserDataResult = (
89
157
  chainId: string,
90
- queries: LenderUserQuery[],
158
+ queriesRaw: LenderUserQuery[],
91
159
  rawResults: any[],
92
160
  prices: any,
93
161
  pricesHist: any,
94
- lenderState: any
162
+ lenderState: any,
95
163
  ): { [lender: string]: any } => {
164
+ const queries = organizeUserQueries(queriesRaw)
96
165
 
97
166
  const lenderData: { [lender: string]: any } = {}
98
167
  let currentSlice = 0
@@ -103,7 +172,8 @@ export const convertLenderUserDataResult = (
103
172
  query.account,
104
173
  prices,
105
174
  pricesHist,
106
- lenderState[chainId]?.data?.[query.lender]?.data
175
+ lenderState[chainId],
176
+ query.params,
107
177
  )
108
178
 
109
179
  try {
@@ -111,14 +181,25 @@ export const convertLenderUserDataResult = (
111
181
  const convertedData = converter(data)
112
182
 
113
183
  if (convertedData) {
114
- // map it to the user address
115
- lenderData[query.lender] = { [query.account.toLowerCase()]: convertedData }
184
+ if (isMultiMarket(query.lender)) {
185
+ Object.keys(convertedData).forEach((market) => {
186
+ lenderData[market] = {
187
+ // @ts-ignore
188
+ [query.account.toLowerCase()]: convertedData[market],
189
+ }
190
+ })
191
+ } else {
192
+ // map it to the user address
193
+ lenderData[query.lender] = {
194
+ [query.account.toLowerCase()]: convertedData,
195
+ }
196
+ }
116
197
  }
117
198
  } catch (e) {
118
- console.log("Error parsing for", query.lender, "on", chainId, e)
199
+ console.log('Error parsing for', query.lender, 'on', chainId, e)
119
200
  }
120
201
  currentSlice += sliceLength
121
202
  }
122
203
 
123
204
  return lenderData
124
- }
205
+ }