@defisaver/positions-sdk 2.1.126 → 2.1.127-midnight-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.
Files changed (62) hide show
  1. package/cjs/config/contracts.d.ts +249 -0
  2. package/cjs/config/contracts.js +11 -1
  3. package/cjs/contracts.d.ts +1510 -0
  4. package/cjs/contracts.js +3 -2
  5. package/cjs/helpers/index.d.ts +1 -0
  6. package/cjs/helpers/index.js +2 -1
  7. package/cjs/helpers/morphoMidnightHelpers/index.d.ts +16 -0
  8. package/cjs/helpers/morphoMidnightHelpers/index.js +68 -0
  9. package/cjs/index.d.ts +2 -1
  10. package/cjs/index.js +3 -1
  11. package/cjs/markets/index.d.ts +1 -0
  12. package/cjs/markets/index.js +4 -1
  13. package/cjs/markets/morphoMidnight/index.d.ts +16 -0
  14. package/cjs/markets/morphoMidnight/index.js +159 -0
  15. package/cjs/morphoMidnight/index.d.ts +14 -0
  16. package/cjs/morphoMidnight/index.js +220 -0
  17. package/cjs/portfolio/discovery.js +4 -0
  18. package/cjs/portfolio/index.js +44 -0
  19. package/cjs/services/viem.d.ts +11 -11
  20. package/cjs/types/index.d.ts +1 -0
  21. package/cjs/types/index.js +1 -0
  22. package/cjs/types/morphoMidnight.d.ts +91 -0
  23. package/cjs/types/morphoMidnight.js +15 -0
  24. package/cjs/types/portfolio.d.ts +4 -0
  25. package/esm/config/contracts.d.ts +249 -0
  26. package/esm/config/contracts.js +9 -0
  27. package/esm/contracts.d.ts +1510 -0
  28. package/esm/contracts.js +1 -0
  29. package/esm/helpers/index.d.ts +1 -0
  30. package/esm/helpers/index.js +1 -0
  31. package/esm/helpers/morphoMidnightHelpers/index.d.ts +16 -0
  32. package/esm/helpers/morphoMidnightHelpers/index.js +61 -0
  33. package/esm/index.d.ts +2 -1
  34. package/esm/index.js +2 -1
  35. package/esm/markets/index.d.ts +1 -0
  36. package/esm/markets/index.js +1 -0
  37. package/esm/markets/morphoMidnight/index.d.ts +16 -0
  38. package/esm/markets/morphoMidnight/index.js +148 -0
  39. package/esm/morphoMidnight/index.d.ts +14 -0
  40. package/esm/morphoMidnight/index.js +207 -0
  41. package/esm/portfolio/discovery.js +5 -1
  42. package/esm/portfolio/index.js +45 -1
  43. package/esm/services/viem.d.ts +11 -11
  44. package/esm/types/index.d.ts +1 -0
  45. package/esm/types/index.js +1 -0
  46. package/esm/types/morphoMidnight.d.ts +91 -0
  47. package/esm/types/morphoMidnight.js +12 -0
  48. package/esm/types/portfolio.d.ts +4 -0
  49. package/package.json +1 -1
  50. package/src/config/contracts.ts +9 -0
  51. package/src/contracts.ts +1 -0
  52. package/src/helpers/index.ts +1 -0
  53. package/src/helpers/morphoMidnightHelpers/index.ts +86 -0
  54. package/src/index.ts +2 -0
  55. package/src/markets/index.ts +1 -0
  56. package/src/markets/morphoMidnight/index.ts +161 -0
  57. package/src/morphoMidnight/index.ts +234 -0
  58. package/src/portfolio/discovery.ts +6 -0
  59. package/src/portfolio/index.ts +44 -0
  60. package/src/types/index.ts +1 -0
  61. package/src/types/morphoMidnight.ts +104 -0
  62. package/src/types/portfolio.ts +4 -0
@@ -9,8 +9,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  };
10
10
  import Dec from 'decimal.js';
11
11
  import { NetworkNumber } from '../types/common';
12
- import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LiquityV2Markets, LlamaLendMarkets, MorphoBlueMarkets, SparkMarkets, } from '../markets';
12
+ import { AaveMarkets, AaveV4Spokes, CompoundMarkets, CrvUsdMarkets, EulerV2Markets, LiquityV2Markets, LlamaLendMarkets, MorphoBlueMarkets, MorphoMidnightMarkets, SparkMarkets, } from '../markets';
13
13
  import { _getMorphoBlueAccountData, _getMorphoBlueMarketData, getMorphoEarn } from '../morphoBlue';
14
+ import { _getMorphoMidnightAccountData, _getMorphoMidnightMarketData, getMorphoMidnightEarn } from '../morphoMidnight';
14
15
  import { AaveVersions, CompoundVersions, } from '../types';
15
16
  import { _getCompoundV3AccountData, _getCompoundV3MarketsData } from '../compoundV3';
16
17
  import { _getSparkAccountData, _getSparkMarketsData } from '../spark';
@@ -39,6 +40,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
39
40
  const isMainnet = network === NetworkNumber.Eth;
40
41
  const isFluidSupported = [NetworkNumber.Eth, NetworkNumber.Arb, NetworkNumber.Base, NetworkNumber.Plasma].includes(network);
41
42
  const morphoMarkets = Object.values(MorphoBlueMarkets(network)).filter((market) => market.chainIds.includes(network));
43
+ const morphoMidnightMarkets = Object.values(MorphoMidnightMarkets(network)).filter((market) => market.chainIds.includes(network));
42
44
  const compoundV3Markets = Object.values(CompoundMarkets(network)).filter((market) => market.chainIds.includes(network) && market.value !== CompoundVersions.CompoundV2);
43
45
  const sparkMarkets = Object.values(SparkMarkets(network)).filter((market) => market.chainIds.includes(network));
44
46
  const eulerV2Markets = Object.values(EulerV2Markets(network)).filter((market) => market.chainIds.includes(network));
@@ -54,6 +56,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
54
56
  const client = getViemProvider(provider, ...args);
55
57
  const defaultClient = getViemProvider(defaultProvider, ...args);
56
58
  const morphoMarketsData = {};
59
+ const morphoMidnightMarketsData = {};
57
60
  const compoundV3MarketsData = {};
58
61
  const sparkMarketsData = {};
59
62
  const eulerV2MarketsData = {};
@@ -67,6 +70,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
67
70
  const aaveV4SpokesData = {};
68
71
  const markets = {
69
72
  morphoMarketsData,
73
+ morphoMidnightMarketsData,
70
74
  compoundV3MarketsData,
71
75
  sparkMarketsData,
72
76
  eulerV2MarketsData,
@@ -87,6 +91,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
87
91
  aaveV3: {},
88
92
  aaveV4: {},
89
93
  morphoBlue: {},
94
+ morphoMidnight: {},
90
95
  compoundV3: {},
91
96
  spark: {},
92
97
  eulerV2: {},
@@ -107,6 +112,7 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
107
112
  stakingPositions[address.toLowerCase()] = {
108
113
  aaveV3: {},
109
114
  morphoBlue: {},
115
+ morphoMidnight: {},
110
116
  compoundV3: {},
111
117
  spark: {},
112
118
  aaveV2: {},
@@ -134,6 +140,10 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
134
140
  const marketData = yield _getMorphoBlueMarketData(client, network, market);
135
141
  morphoMarketsData[market.value] = marketData;
136
142
  })),
143
+ ...morphoMidnightMarkets.map((market) => __awaiter(this, void 0, void 0, function* () {
144
+ const marketData = yield _getMorphoMidnightMarketData(client, network, market);
145
+ morphoMidnightMarketsData[market.value] = marketData;
146
+ })),
137
147
  ...compoundV3Markets.map((market) => __awaiter(this, void 0, void 0, function* () {
138
148
  const marketData = yield _getCompoundV3MarketsData(client, network, market, defaultClient);
139
149
  compoundV3MarketsData[market.value] = marketData;
@@ -444,6 +454,40 @@ export function getPortfolioData(provider_1, network_1, defaultProvider_1, addre
444
454
  positions[address.toLowerCase()].morphoBlue[market.value] = { error: `Error fetching MorphoBlue account data for address ${address} on market ${market.value}`, data: null };
445
455
  }
446
456
  }))).flat(),
457
+ ...morphoMidnightMarkets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
458
+ try {
459
+ const [accDataPromise, earnDataPromise] = yield Promise.allSettled([
460
+ _getMorphoMidnightAccountData(client, network, address, market, morphoMidnightMarketsData[market.value]),
461
+ getMorphoMidnightEarn(client, network, address, market, morphoMidnightMarketsData[market.value]),
462
+ ]);
463
+ if (accDataPromise.status === 'rejected') {
464
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, accDataPromise.reason);
465
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
466
+ }
467
+ if (earnDataPromise.status === 'rejected') {
468
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, earnDataPromise.reason);
469
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
470
+ }
471
+ if (accDataPromise.status !== 'rejected') {
472
+ const accData = accDataPromise.value;
473
+ if (new Dec(accData.suppliedUsd).gt(0))
474
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: '', data: accData };
475
+ }
476
+ if (earnDataPromise.status !== 'rejected') {
477
+ const earnData = earnDataPromise.value;
478
+ if (earnData && new Dec(earnData.amount).gt(0)) {
479
+ stakingPositions[address.toLowerCase()].morphoMidnight[market.value] = {
480
+ error: '',
481
+ data: earnData,
482
+ };
483
+ }
484
+ }
485
+ }
486
+ catch (error) {
487
+ console.error(`Error fetching MorphoMidnight account data for address ${address} on market ${market.value}:`, error);
488
+ positions[address.toLowerCase()].morphoMidnight[market.value] = { error: `Error fetching MorphoMidnight account data for address ${address} on market ${market.value}`, data: null };
489
+ }
490
+ }))).flat(),
447
491
  ...compoundV3Markets.map((market) => addresses.map((address) => __awaiter(this, void 0, void 0, function* () {
448
492
  try {
449
493
  const accData = yield _getCompoundV3AccountData(client, network, address, ZERO_ADDRESS, { selectedMarket: market, assetsData: compoundV3MarketsData[market.value].assetsData });
@@ -833,6 +833,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
833
833
  s: import("viem").Hex;
834
834
  value: bigint;
835
835
  v: bigint;
836
+ chainId?: number | undefined;
836
837
  type: "legacy";
837
838
  gas: bigint;
838
839
  nonce: number;
@@ -847,7 +848,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
847
848
  yParity?: undefined | undefined;
848
849
  input: import("viem").Hex;
849
850
  typeHex: import("viem").Hex | null;
850
- chainId?: number | undefined;
851
851
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
852
852
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
853
853
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -858,6 +858,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
858
858
  s: import("viem").Hex;
859
859
  value: bigint;
860
860
  v: bigint;
861
+ chainId: number;
861
862
  type: "eip2930";
862
863
  gas: bigint;
863
864
  nonce: number;
@@ -872,7 +873,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
872
873
  yParity: number;
873
874
  input: import("viem").Hex;
874
875
  typeHex: import("viem").Hex | null;
875
- chainId: number;
876
876
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
877
877
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
878
878
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -883,6 +883,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
883
883
  s: import("viem").Hex;
884
884
  value: bigint;
885
885
  v: bigint;
886
+ chainId: number;
886
887
  type: "eip1559";
887
888
  gas: bigint;
888
889
  nonce: number;
@@ -897,7 +898,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
897
898
  yParity: number;
898
899
  input: import("viem").Hex;
899
900
  typeHex: import("viem").Hex | null;
900
- chainId: number;
901
901
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
902
902
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
903
903
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -908,6 +908,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
908
908
  s: import("viem").Hex;
909
909
  value: bigint;
910
910
  v: bigint;
911
+ chainId: number;
911
912
  type: "eip4844";
912
913
  gas: bigint;
913
914
  nonce: number;
@@ -922,7 +923,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
922
923
  yParity: number;
923
924
  input: import("viem").Hex;
924
925
  typeHex: import("viem").Hex | null;
925
- chainId: number;
926
926
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
927
927
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
928
928
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -933,6 +933,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
933
933
  s: import("viem").Hex;
934
934
  value: bigint;
935
935
  v: bigint;
936
+ chainId: number;
936
937
  type: "eip7702";
937
938
  gas: bigint;
938
939
  nonce: number;
@@ -947,7 +948,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
947
948
  yParity: number;
948
949
  input: import("viem").Hex;
949
950
  typeHex: import("viem").Hex | null;
950
- chainId: number;
951
951
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
952
952
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
953
953
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -983,6 +983,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
983
983
  s: import("viem").Hex;
984
984
  value: bigint;
985
985
  v: bigint;
986
+ chainId?: number | undefined;
986
987
  type: "legacy";
987
988
  gas: bigint;
988
989
  nonce: number;
@@ -997,7 +998,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
997
998
  yParity?: undefined | undefined;
998
999
  input: import("viem").Hex;
999
1000
  typeHex: import("viem").Hex | null;
1000
- chainId?: number | undefined;
1001
1001
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T ? T extends (blockTag extends "pending" ? true : false) ? T extends true ? null : bigint : never : never;
1002
1002
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_1 ? T_1 extends (blockTag extends "pending" ? true : false) ? T_1 extends true ? null : `0x${string}` : never : never;
1003
1003
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_2 ? T_2 extends (blockTag extends "pending" ? true : false) ? T_2 extends true ? null : number : never : never;
@@ -1008,6 +1008,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1008
1008
  s: import("viem").Hex;
1009
1009
  value: bigint;
1010
1010
  v: bigint;
1011
+ chainId: number;
1011
1012
  type: "eip2930";
1012
1013
  gas: bigint;
1013
1014
  nonce: number;
@@ -1022,7 +1023,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1022
1023
  yParity: number;
1023
1024
  input: import("viem").Hex;
1024
1025
  typeHex: import("viem").Hex | null;
1025
- chainId: number;
1026
1026
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_3 ? T_3 extends (blockTag extends "pending" ? true : false) ? T_3 extends true ? null : bigint : never : never;
1027
1027
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_4 ? T_4 extends (blockTag extends "pending" ? true : false) ? T_4 extends true ? null : `0x${string}` : never : never;
1028
1028
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_5 ? T_5 extends (blockTag extends "pending" ? true : false) ? T_5 extends true ? null : number : never : never;
@@ -1033,6 +1033,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1033
1033
  s: import("viem").Hex;
1034
1034
  value: bigint;
1035
1035
  v: bigint;
1036
+ chainId: number;
1036
1037
  type: "eip1559";
1037
1038
  gas: bigint;
1038
1039
  nonce: number;
@@ -1047,7 +1048,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1047
1048
  yParity: number;
1048
1049
  input: import("viem").Hex;
1049
1050
  typeHex: import("viem").Hex | null;
1050
- chainId: number;
1051
1051
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_6 ? T_6 extends (blockTag extends "pending" ? true : false) ? T_6 extends true ? null : bigint : never : never;
1052
1052
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_7 ? T_7 extends (blockTag extends "pending" ? true : false) ? T_7 extends true ? null : `0x${string}` : never : never;
1053
1053
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_8 ? T_8 extends (blockTag extends "pending" ? true : false) ? T_8 extends true ? null : number : never : never;
@@ -1058,6 +1058,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1058
1058
  s: import("viem").Hex;
1059
1059
  value: bigint;
1060
1060
  v: bigint;
1061
+ chainId: number;
1061
1062
  type: "eip4844";
1062
1063
  gas: bigint;
1063
1064
  nonce: number;
@@ -1072,7 +1073,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1072
1073
  yParity: number;
1073
1074
  input: import("viem").Hex;
1074
1075
  typeHex: import("viem").Hex | null;
1075
- chainId: number;
1076
1076
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_9 ? T_9 extends (blockTag extends "pending" ? true : false) ? T_9 extends true ? null : bigint : never : never;
1077
1077
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_10 ? T_10 extends (blockTag extends "pending" ? true : false) ? T_10 extends true ? null : `0x${string}` : never : never;
1078
1078
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_11 ? T_11 extends (blockTag extends "pending" ? true : false) ? T_11 extends true ? null : number : never : never;
@@ -1083,6 +1083,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1083
1083
  s: import("viem").Hex;
1084
1084
  value: bigint;
1085
1085
  v: bigint;
1086
+ chainId: number;
1086
1087
  type: "eip7702";
1087
1088
  gas: bigint;
1088
1089
  nonce: number;
@@ -1097,7 +1098,6 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
1097
1098
  yParity: number;
1098
1099
  input: import("viem").Hex;
1099
1100
  typeHex: import("viem").Hex | null;
1100
- chainId: number;
1101
1101
  blockNumber: (blockTag extends "pending" ? true : false) extends infer T_12 ? T_12 extends (blockTag extends "pending" ? true : false) ? T_12 extends true ? null : bigint : never : never;
1102
1102
  blockHash: (blockTag extends "pending" ? true : false) extends infer T_13 ? T_13 extends (blockTag extends "pending" ? true : false) ? T_13 extends true ? null : `0x${string}` : never : never;
1103
1103
  transactionIndex: (blockTag extends "pending" ? true : false) extends infer T_14 ? T_14 extends (blockTag extends "pending" ? true : false) ? T_14 extends true ? null : number : never : never;
@@ -4358,7 +4358,7 @@ export declare const getViemProvider: (provider: EthereumProvider, network: Netw
4358
4358
  authorizationList: import("viem").TransactionSerializableEIP7702["authorizationList"];
4359
4359
  } ? "eip7702" : never) | (request["type"] extends string | undefined ? Extract<request["type"], string> : never)>) ? T_12 extends "eip7702" ? import("viem").TransactionRequestEIP7702 : never : never : never)>> & {
4360
4360
  chainId?: number | undefined;
4361
- }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees" | "chainId") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4361
+ }, (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") extends infer T_13 ? T_13 extends (request["parameters"] extends readonly import("viem").PrepareTransactionRequestParameterType[] ? request["parameters"][number] : "chainId" | "type" | "gas" | "nonce" | "blobVersionedHashes" | "fees") ? T_13 extends "fees" ? "gasPrice" | "maxFeePerGas" | "maxPriorityFeePerGas" : T_13 : never : never> & (unknown extends request["kzg"] ? {} : Pick<request, "kzg">) extends infer T ? { [K in keyof T]: T[K]; } : never>;
4362
4362
  readContract: <const abi extends Abi | readonly unknown[], functionName extends import("viem").ContractFunctionName<abi, "pure" | "view">, const args extends import("viem").ContractFunctionArgs<abi, "pure" | "view", functionName>>(args: import("viem").ReadContractParameters<abi, functionName, args>) => Promise<import("viem").ReadContractReturnType<abi, functionName, args>>;
4363
4363
  sendRawTransaction: (args: import("viem").SendRawTransactionParameters) => Promise<import("viem").SendRawTransactionReturnType>;
4364
4364
  simulate: <const calls extends readonly unknown[]>(args: import("viem").SimulateBlocksParameters<calls>) => Promise<import("viem").SimulateBlocksReturnType<calls>>;
@@ -6,6 +6,7 @@ export * from './liquity';
6
6
  export * from './liquityV2';
7
7
  export * from './maker';
8
8
  export * from './morphoBlue';
9
+ export * from './morphoMidnight';
9
10
  export * from './llamaLend';
10
11
  export * from './euler';
11
12
  export * from './fluid';
@@ -6,6 +6,7 @@ export * from './liquity';
6
6
  export * from './liquityV2';
7
7
  export * from './maker';
8
8
  export * from './morphoBlue';
9
+ export * from './morphoMidnight';
9
10
  export * from './llamaLend';
10
11
  export * from './euler';
11
12
  export * from './fluid';
@@ -0,0 +1,91 @@
1
+ import { EthAddress, IncentiveData, LeverageType, MMUsedAssets, NetworkNumber } from './common';
2
+ export declare enum MorphoMidnightVersions {
3
+ MorphoMidnightCbBTCUSDC_860_20260731_Base = "morphomidnightcbbtcusdc_860_20260731_base",
4
+ MorphoMidnightCbBTCUSDC_860_20260828_Base = "morphomidnightcbbtcusdc_860_20260828_base",
5
+ MorphoMidnightCbBTCUSDC_860_20260925_Base = "morphomidnightcbbtcusdc_860_20260925_base",
6
+ MorphoMidnightCbBTCUSDC_860_20261030_Base = "morphomidnightcbbtcusdc_860_20261030_base",
7
+ MorphoMidnightCbBTCUSDC_860_20261127_Base = "morphomidnightcbbtcusdc_860_20261127_base",
8
+ MorphoMidnightCbBTCUSDC_860_20261225_Base = "morphomidnightcbbtcusdc_860_20261225_base"
9
+ }
10
+ export interface MorphoMidnightCollateralParams {
11
+ token: EthAddress;
12
+ lltv: number | string;
13
+ liquidationCursor: number | string;
14
+ oracle: EthAddress;
15
+ }
16
+ export interface MorphoMidnightMarketData {
17
+ chainIds: NetworkNumber[];
18
+ label: string;
19
+ shortLabel: string;
20
+ url: string;
21
+ value: MorphoMidnightVersions;
22
+ midnight: EthAddress;
23
+ loanToken: EthAddress;
24
+ collaterals: MorphoMidnightCollateralParams[];
25
+ maturity: number;
26
+ rcfThreshold: number | string;
27
+ enterGate: EthAddress;
28
+ liquidatorGate: EthAddress;
29
+ marketId: string;
30
+ protocolName: string;
31
+ }
32
+ export interface MorphoMidnightAssetData {
33
+ symbol: string;
34
+ address: string;
35
+ price: string;
36
+ supplyRate: string;
37
+ borrowRate: string;
38
+ supplyIncentives: IncentiveData[];
39
+ borrowIncentives: IncentiveData[];
40
+ totalSupply?: string;
41
+ totalBorrow?: string;
42
+ canBeSupplied?: boolean;
43
+ canBeBorrowed?: boolean;
44
+ lltv?: string;
45
+ }
46
+ export type MorphoMidnightAssetsData = {
47
+ [key: string]: MorphoMidnightAssetData;
48
+ };
49
+ export interface MorphoMidnightMarketInfo {
50
+ id: string;
51
+ loanToken: string;
52
+ collaterals: string[];
53
+ maturity: number;
54
+ isMatured: boolean;
55
+ totalUnits: string;
56
+ withdrawable: string;
57
+ totalDebt: string;
58
+ lossFactor: string;
59
+ tickSpacing: number;
60
+ utillization: string;
61
+ assetsData: MorphoMidnightAssetsData;
62
+ }
63
+ export interface MorphoMidnightAggregatedPositionData {
64
+ suppliedUsd: string;
65
+ suppliedCollateralUsd: string;
66
+ borrowedUsd: string;
67
+ borrowLimitUsd: string;
68
+ liquidationLimitUsd: string;
69
+ leftToBorrowUsd: string;
70
+ leftToBorrow: string;
71
+ netApy: string;
72
+ incentiveUsd: string;
73
+ totalInterestUsd: string;
74
+ ltv: string;
75
+ ratio: string;
76
+ healthRatio: string;
77
+ leveragedType: LeverageType;
78
+ leveragedAsset?: string;
79
+ currentVolatilePairRatio?: string;
80
+ liquidationPrice?: string;
81
+ minCollRatio?: string;
82
+ collLiquidationRatio?: string;
83
+ exposure: string;
84
+ }
85
+ export interface MorphoMidnightPositionData extends MorphoMidnightAggregatedPositionData {
86
+ usedAssets: MMUsedAssets;
87
+ credit: string;
88
+ debt: string;
89
+ maturity: number;
90
+ isMatured: boolean;
91
+ }
@@ -0,0 +1,12 @@
1
+ export var MorphoMidnightVersions;
2
+ (function (MorphoMidnightVersions) {
3
+ // BASE
4
+ // Fixed-term markets are disambiguated by maturity (YYYYMMDD), so the same pair recurs across dates.
5
+ // Sourced from the official listing at https://markets.morpho.org/fixed/base (see sitemap.xml).
6
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260731_Base"] = "morphomidnightcbbtcusdc_860_20260731_base";
7
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260828_Base"] = "morphomidnightcbbtcusdc_860_20260828_base";
8
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20260925_Base"] = "morphomidnightcbbtcusdc_860_20260925_base";
9
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261030_Base"] = "morphomidnightcbbtcusdc_860_20261030_base";
10
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261127_Base"] = "morphomidnightcbbtcusdc_860_20261127_base";
11
+ MorphoMidnightVersions["MorphoMidnightCbBTCUSDC_860_20261225_Base"] = "morphomidnightcbbtcusdc_860_20261225_base";
12
+ })(MorphoMidnightVersions || (MorphoMidnightVersions = {}));
@@ -9,6 +9,7 @@ import { LiquityTroveInfo } from './liquity';
9
9
  import { LlamaLendUserData, LlamaLendVersionsType } from './llamaLend';
10
10
  import { CdpData } from './maker';
11
11
  import { MorphoBluePositionData, MorphoBlueVersions } from './morphoBlue';
12
+ import { MorphoMidnightPositionData, MorphoMidnightVersions } from './morphoMidnight';
12
13
  import { SparkPositionData, SparkVersions } from './spark';
13
14
  export interface PortfolioProtocolData<T> {
14
15
  error: string;
@@ -21,6 +22,9 @@ export interface PortfolioPositionsDataForAddress {
21
22
  morphoBlue: {
22
23
  [key in MorphoBlueVersions]?: PortfolioProtocolData<MorphoBluePositionData>;
23
24
  };
25
+ morphoMidnight: {
26
+ [key in MorphoMidnightVersions]?: PortfolioProtocolData<MorphoMidnightPositionData>;
27
+ };
24
28
  compoundV3: {
25
29
  [key in CompoundVersions]?: PortfolioProtocolData<CompoundV3PositionData>;
26
30
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defisaver/positions-sdk",
3
- "version": "2.1.126",
3
+ "version": "2.1.127-midnight-dev",
4
4
  "description": "",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.js",
@@ -1113,6 +1113,15 @@ export const MorphoBlueView = {
1113
1113
  }
1114
1114
  },
1115
1115
  } as const;
1116
+ export const MidnightView = {
1117
+ "abi": [{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"getMarketInfo","outputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"totalUnits","type":"uint128"},{"internalType":"uint128","name":"lossFactor","type":"uint128"},{"internalType":"uint128","name":"withdrawable","type":"uint128"},{"internalType":"uint128","name":"continuousFeeCredit","type":"uint128"},{"internalType":"uint16[7]","name":"settlementFees","type":"uint16[7]"},{"internalType":"uint32","name":"continuousFee","type":"uint32"},{"internalType":"uint8","name":"tickSpacing","type":"uint8"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct MidnightView.MarketInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getPositionInfo","outputs":[{"components":[{"internalType":"uint128","name":"credit","type":"uint128"},{"internalType":"uint128","name":"pendingFee","type":"uint128"},{"internalType":"uint128","name":"debt","type":"uint128"},{"internalType":"uint128","name":"collateralBitmap","type":"uint128"},{"internalType":"uint128[]","name":"collateral","type":"uint128[]"},{"internalType":"uint256","name":"ratio","type":"uint256"}],"internalType":"struct MidnightView.PositionInfo","name":"pos","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"ratio","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"_market","type":"tuple"}],"name":"toId","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"toMarket","outputs":[{"components":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"midnight","type":"address"},{"internalType":"address","name":"loanToken","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"lltv","type":"uint256"},{"internalType":"uint256","name":"liquidationCursor","type":"uint256"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct CollateralParams[]","name":"collateralParams","type":"tuple[]"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint256","name":"rcfThreshold","type":"uint256"},{"internalType":"address","name":"enterGate","type":"address"},{"internalType":"address","name":"liquidatorGate","type":"address"}],"internalType":"struct Market","name":"market","type":"tuple"}],"stateMutability":"view","type":"function"}],
1118
+ "networks": {
1119
+ "8453": {
1120
+ "address": "0x3aa272f329E8B562A3bA56Bb6979a44D23A28839",
1121
+ "createdBlock": 48932293,
1122
+ }
1123
+ },
1124
+ } as const;
1116
1125
  export const FeedRegistry = {
1117
1126
  "abi": [{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"name":"confirmFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccessController","outputs":[{"internalType":"contract AccessControllerInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getCurrentPhaseId","outputs":[{"internalType":"uint16","name":"currentPhaseId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getNextRoundId","outputs":[{"internalType":"uint80","name":"nextRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhase","outputs":[{"components":[{"internalType":"uint16","name":"phaseId","type":"uint16"},{"internalType":"uint80","name":"startingAggregatorRoundId","type":"uint80"},{"internalType":"uint80","name":"endingAggregatorRoundId","type":"uint80"}],"internalType":"struct FeedRegistryInterface.Phase","name":"phase","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhaseFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint16","name":"phaseId","type":"uint16"}],"name":"getPhaseRange","outputs":[{"internalType":"uint80","name":"startingRoundId","type":"uint80"},{"internalType":"uint80","name":"endingRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getPreviousRoundId","outputs":[{"internalType":"uint80","name":"previousRoundId","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"getProposedFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"proposedAggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"_roundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"getRoundFeed","outputs":[{"internalType":"contract AggregatorV2V3Interface","name":"aggregator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"aggregator","type":"address"}],"name":"isFeedEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"answer","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRound","outputs":[{"internalType":"uint256","name":"roundId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"address","name":"aggregator","type":"address"}],"name":"proposeFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"},{"internalType":"uint80","name":"roundId","type":"uint80"}],"name":"proposedGetRoundData","outputs":[{"internalType":"uint80","name":"id","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"proposedLatestRoundData","outputs":[{"internalType":"uint80","name":"id","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract AccessControllerInterface","name":"_accessController","type":"address"}],"name":"setAccessController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"base","type":"address"},{"internalType":"address","name":"quote","type":"address"}],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],
1118
1127
  "networks": {
package/src/contracts.ts CHANGED
@@ -122,6 +122,7 @@ export const getYearnV3VaultContractViem = (client: Client, address: HexString)
122
122
  };
123
123
 
124
124
  export const MorphoBlueViewContractViem = createViemContractFromConfigFunc('MorphoBlueView');
125
+ export const MorphoMidnightViewContractViem = createViemContractFromConfigFunc('MidnightView');
125
126
  export const AaveLoanInfoV2ContractViem = createViemContractFromConfigFunc('AaveLoanInfoV2');
126
127
  export const AaveV3ViewContractViem = createViemContractFromConfigFunc('AaveV3View');
127
128
  export const AaveIncentiveDataProviderV3ContractViem = createViemContractFromConfigFunc('AaveUiIncentiveDataProviderV3');
@@ -4,6 +4,7 @@ export * as sparkHelpers from './sparkHelpers';
4
4
  export * as curveUsdHelpers from './curveUsdHelpers';
5
5
  export * as makerHelpers from './makerHelpers';
6
6
  export * as morphoBlueHelpers from './morphoBlueHelpers';
7
+ export * as morphoMidnightHelpers from './morphoMidnightHelpers';
7
8
  export * as llamaLendHelpers from './llamaLendHelpers';
8
9
  export * as liquityV2Helpers from './liquityV2Helpers';
9
10
  export * as eulerV2Helpers from './eulerHelpers';
@@ -0,0 +1,86 @@
1
+ import Dec from 'decimal.js';
2
+ import {
3
+ calcLeverageLiqPrice, getAssetsTotal, getExposure, isLeveragedPos,
4
+ } from '../../moneymarket';
5
+ import { calculateNetApy } from '../../staking';
6
+ import {
7
+ LeverageType, MMAssetsData, MMUsedAsset, MMUsedAssets,
8
+ } from '../../types/common';
9
+ import { MorphoMidnightAggregatedPositionData, MorphoMidnightAssetsData, MorphoMidnightMarketInfo } from '../../types';
10
+
11
+ /**
12
+ * Aggregate a Morpho Midnight position. Midnight markets are multi-collateral, so the borrow limit is
13
+ * the sum of each collateral's USD value times its own lltv (Aave-v4 style), rather than a single pair.
14
+ *
15
+ * Note on amounts: `borrowedUsd` is derived from the position's `debt`, which is the face value owed at
16
+ * maturity (principal + fixed interest). Health is therefore measured against the full maturity debt,
17
+ * matching how MidnightView computes `ratio`. Fixed-rate APY is not derived on-chain in MVP, so
18
+ * `netApy` reflects the `'0'` rates in `assetsData` (see the module getter).
19
+ */
20
+ export const getMorphoMidnightAggregatedPositionData = ({
21
+ usedAssets,
22
+ assetsData,
23
+ marketInfo,
24
+ }: {
25
+ usedAssets: MMUsedAssets,
26
+ assetsData: MorphoMidnightAssetsData,
27
+ marketInfo: MorphoMidnightMarketInfo,
28
+ }): MorphoMidnightAggregatedPositionData => {
29
+ const payload = {} as MorphoMidnightAggregatedPositionData;
30
+
31
+ payload.suppliedUsd = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
32
+ payload.suppliedCollateralUsd = getAssetsTotal(usedAssets, ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral, ({ suppliedUsd }: { suppliedUsd: string }) => suppliedUsd);
33
+ payload.borrowedUsd = getAssetsTotal(usedAssets, ({ isBorrowed }: { isBorrowed: boolean }) => isBorrowed, ({ borrowedUsd }: { borrowedUsd: string }) => borrowedUsd);
34
+
35
+ // borrowLimit = Σ collateralUsd_i * lltv_i (per-collateral lltv carried on assetsData)
36
+ payload.borrowLimitUsd = getAssetsTotal(
37
+ usedAssets,
38
+ ({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral,
39
+ ({ symbol, suppliedUsd }: { symbol: string, suppliedUsd: string }) => new Dec(suppliedUsd).mul(assetsData[symbol]?.lltv || 0),
40
+ );
41
+ payload.liquidationLimitUsd = payload.borrowLimitUsd;
42
+
43
+ const leftToBorrowUsd = new Dec(payload.borrowLimitUsd).sub(payload.borrowedUsd);
44
+ payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
45
+
46
+ const loanTokenPrice = assetsData[marketInfo.loanToken]?.price || '0';
47
+ payload.leftToBorrow = new Dec(loanTokenPrice).eq(0) ? '0' : new Dec(payload.leftToBorrowUsd).div(loanTokenPrice).toString();
48
+
49
+ const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData: assetsData as unknown as MMAssetsData });
50
+ payload.netApy = netApy;
51
+ payload.incentiveUsd = incentiveUsd;
52
+ payload.totalInterestUsd = totalInterestUsd;
53
+
54
+ payload.ltv = new Dec(payload.suppliedCollateralUsd).eq(0) ? '0' : new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
55
+ payload.ratio = new Dec(payload.borrowedUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString();
56
+ payload.healthRatio = new Dec(payload.borrowedUsd).eq(0) ? 'Infinity' : new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
57
+
58
+ const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
59
+ payload.leveragedType = leveragedType;
60
+ payload.liquidationPrice = '';
61
+ if (leveragedType !== '') {
62
+ payload.leveragedAsset = leveragedAsset;
63
+ let assetPrice = assetsData[leveragedAsset].price;
64
+ if (leveragedType === LeverageType.VolatilePair) {
65
+ const borrowedAsset = (Object.values(usedAssets) as MMUsedAsset[]).find(({ borrowedUsd }: { borrowedUsd: string }) => +borrowedUsd > 0);
66
+ const borrowedAssetPrice = assetsData[borrowedAsset!.symbol].price;
67
+ const leveragedAssetPrice = assetsData[leveragedAsset].price;
68
+ const isReverse = new Dec(leveragedAssetPrice).lt(borrowedAssetPrice);
69
+ if (isReverse) {
70
+ payload.leveragedType = LeverageType.VolatilePairReverse;
71
+ payload.currentVolatilePairRatio = new Dec(borrowedAssetPrice).div(leveragedAssetPrice).toDP(18).toString();
72
+ assetPrice = new Dec(borrowedAssetPrice).div(assetPrice).toString();
73
+ } else {
74
+ assetPrice = new Dec(assetPrice).div(borrowedAssetPrice).toString();
75
+ payload.currentVolatilePairRatio = new Dec(leveragedAssetPrice).div(borrowedAssetPrice).toDP(18).toString();
76
+ }
77
+ }
78
+ payload.liquidationPrice = calcLeverageLiqPrice(payload.leveragedType, assetPrice, payload.borrowedUsd, payload.liquidationLimitUsd);
79
+ }
80
+
81
+ payload.minCollRatio = new Dec(payload.borrowLimitUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowLimitUsd).mul(100).toString();
82
+ payload.collLiquidationRatio = new Dec(payload.liquidationLimitUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.liquidationLimitUsd).mul(100).toString();
83
+ payload.exposure = getExposure(payload.borrowedUsd, payload.suppliedUsd);
84
+
85
+ return payload;
86
+ };
package/src/index.ts CHANGED
@@ -17,6 +17,7 @@ import * as markets from './markets';
17
17
  import * as helpers from './helpers';
18
18
  import * as exchange from './exchange';
19
19
  import * as morphoBlue from './morphoBlue';
20
+ import * as morphoMidnight from './morphoMidnight';
20
21
  import * as llamaLend from './llamaLend';
21
22
  import * as eulerV2 from './eulerV2';
22
23
  import * as portfolio from './portfolio';
@@ -42,6 +43,7 @@ export {
42
43
  markets,
43
44
  helpers,
44
45
  morphoBlue,
46
+ morphoMidnight,
45
47
  llamaLend,
46
48
  eulerV2,
47
49
  fluid,
@@ -17,6 +17,7 @@ export {
17
17
  export { SparkMarkets } from './spark';
18
18
  export { CrvUsdMarkets } from './curveUsd';
19
19
  export { MorphoBlueMarkets, findMorphoBlueMarket } from './morphoBlue';
20
+ export { MorphoMidnightMarkets, findMorphoMidnightMarket } from './morphoMidnight';
20
21
  export { LlamaLendMarkets } from './llamaLend';
21
22
  export { LiquityV2Markets, findLiquityV2MarketByAddress } from './liquityV2';
22
23
  export { EulerV2Markets } from './euler';