@1delta/margin-fetcher 0.0.20 → 0.0.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/prices/defillama/index.ts"],"names":[],"mappings":"AAkOA,wBAAsB,kBAAkB,iBAwCvC;AAED,wBAAsB,sBAAsB,iBA2C3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/prices/defillama/index.ts"],"names":[],"mappings":"AA+OA,wBAAsB,kBAAkB,iBAwCvC;AAED,wBAAsB,sBAAsB,iBA4C3C"}
@@ -103,8 +103,12 @@ const prefixSonic = 'sonic:';
103
103
  const WS = '0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38';
104
104
  const prefixFantom = 'fantom:';
105
105
  const WFTM = '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83';
106
+ const prefixPolygon = 'polygon:';
107
+ const TRUMATIC = '0xf33687811f3ad0cd6b48dd4b39f9f977bd7165a2';
106
108
  const prefixHyperEVM = 'hyperliquid:';
107
109
  const WYPE = '0x5555555555555555555555555555555555555555';
110
+ const WSTHYPE = '0x94e8396e0869c9f2200760af0621afd240e1cf38';
111
+ const kHYPE = '0xfd739d4e423301ce9385c1fb8850539d657c296d';
108
112
  // const prefixKaia = 'kaia:'
109
113
  // const WKAIA = '0x19aac5f612f524b754ca7e7c41cbfa2e981a4432'
110
114
  const datasAvalanche = [WAVAX, SAVAX].map((d) => prefixAvalanche + d).join(',');
@@ -116,8 +120,11 @@ const datasBase = [AERO].map((d) => prefixBase + d).join(',');
116
120
  const datasCore = [WCORE].map((d) => prefixCore + d).join(',');
117
121
  const datasMetis = [WMETIS].map((d) => prefixMetis + d).join(',');
118
122
  const datasFantom = [WFTM].map((d) => prefixFantom + d).join(',');
123
+ const datasPolygon = [TRUMATIC].map((d) => prefixPolygon + d).join(',');
119
124
  const datasSonic = [WS].map((d) => prefixSonic + d).join(',');
120
- const datasHyperEvm = [WYPE].map((d) => prefixHyperEVM + d).join(',');
125
+ const datasHyperEvm = [WYPE, WSTHYPE, kHYPE]
126
+ .map((d) => prefixHyperEVM + d)
127
+ .join(',');
121
128
  // const datasKaia = [WKAIA].map((d) => prefixKaia + d).join(',')
122
129
  const URL = `https://coins.llama.fi/prices/current/${[
123
130
  datasEthereum,
@@ -131,6 +138,7 @@ const URL = `https://coins.llama.fi/prices/current/${[
131
138
  datasHyperEvm,
132
139
  // datasKaia,
133
140
  datasSonic, //
141
+ datasPolygon,
134
142
  ].join(',')}?searchWidth=4h`;
135
143
  const URL_HIST = (ref) => `https://coins.llama.fi/prices/historical/${ref}/${[
136
144
  datasEthereum,
@@ -143,6 +151,7 @@ const URL_HIST = (ref) => `https://coins.llama.fi/prices/historical/${ref}/${[
143
151
  datasFantom,
144
152
  // datasKaia,
145
153
  datasHyperEvm,
154
+ datasPolygon,
146
155
  datasSonic, //
147
156
  ].join(',')}?searchWidth=4h`;
148
157
  const SYMBOL_MAP = {
@@ -206,6 +215,9 @@ const SYMBOL_MAP = {
206
215
  wkaia: 'KAIA',
207
216
  savax: 'SAVAX',
208
217
  whype: 'WHYPE',
218
+ khype: 'Kinetiq Staked HYPE::kHYPE',
219
+ wsthype: 'Staked HYPE Shares::WSTHYPE',
220
+ trumatic: 'TRUMATIC',
209
221
  };
210
222
  export async function fetchDefillamaData() {
211
223
  try {
@@ -270,6 +282,7 @@ export async function fetchDefillamaHistData() {
270
282
  histPrices['SUBTC'] = histPrices['WBTC'];
271
283
  histPrices['IBTC'] = histPrices['WBTC'];
272
284
  histPrices['ENZOBTC'] = histPrices['WBTC'];
285
+ histPrices['CBBTC'] = histPrices['WBTC'];
273
286
  histPrices['PUMPBTC'] = histPrices['WBTC'];
274
287
  return histPrices;
275
288
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chainlink.d.ts","sourceRoot":"","sources":["../../../../src/prices/main-prices/addresses/chainlink.ts"],"names":[],"mappings":"AAGA,oBAAY,0BAA0B;IACpC,OAAO,IAAI;IACX,MAAM,IAAA;IACN,SAAS,IAAA;IACT,SAAS,IAAA;IACT,eAAe,IAAA;CAChB;AAGD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmJ5B,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MAAM,EAGxD,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAukBpC,CAAA"}
1
+ {"version":3,"file":"chainlink.d.ts","sourceRoot":"","sources":["../../../../src/prices/main-prices/addresses/chainlink.ts"],"names":[],"mappings":"AAEA,oBAAY,0BAA0B;IACpC,OAAO,IAAI;IACX,MAAM,IAAA;IACN,SAAS,IAAA;IACT,SAAS,IAAA;IACT,eAAe,IAAA;CAChB;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4K5B,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM,KAAG,MAAM,EAKxD,CAAA;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAukBpC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { Chain } from "@1delta/asset-registry";
1
+ import { Chain } from '@1delta/asset-registry';
2
2
  export var ChainlinkAggregatorIndexes;
3
3
  (function (ChainlinkAggregatorIndexes) {
4
4
  ChainlinkAggregatorIndexes[ChainlinkAggregatorIndexes["roundId"] = 0] = "roundId";
@@ -9,7 +9,7 @@ export var ChainlinkAggregatorIndexes;
9
9
  })(ChainlinkAggregatorIndexes || (ChainlinkAggregatorIndexes = {}));
10
10
  export const chainlinkOracles = {
11
11
  'MIMATIC-USD': {
12
- [Chain.POLYGON_MAINNET]: '0xd8d483d813547cfb624b8dc33a00f2fcbcd2d428'
12
+ [Chain.POLYGON_MAINNET]: '0xd8d483d813547cfb624b8dc33a00f2fcbcd2d428',
13
13
  },
14
14
  'BTC-ETH': {
15
15
  [Chain.POLYGON_MAINNET]: '0x19b0F0833C78c0848109E3842D34d2fDF2cA69BA',
@@ -30,34 +30,34 @@ export const chainlinkOracles = {
30
30
  [Chain.BNB_SMART_CHAIN_MAINNET]: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e',
31
31
  },
32
32
  'BNB-USD': {
33
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE'
33
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE',
34
34
  },
35
35
  'CAKE-USD': {
36
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB6064eD41d4f67e353768aA239cA86f4F73665a1'
36
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB6064eD41d4f67e353768aA239cA86f4F73665a1',
37
37
  },
38
38
  'DOGE-USD': {
39
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8'
39
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8',
40
40
  },
41
41
  'DOT-USD': {
42
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592'
42
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592',
43
43
  },
44
44
  'BUSD-USD': {
45
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xcBb98864Ef56E9042e7d2efef76141f15731B82f'
45
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xcBb98864Ef56E9042e7d2efef76141f15731B82f',
46
46
  },
47
47
  'BETH-USD': {
48
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x2A3796273d47c4eD363b361D3AEFb7F7E2A13782'
48
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x2A3796273d47c4eD363b361D3AEFb7F7E2A13782',
49
49
  },
50
50
  'FIL-USD': {
51
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83'
51
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83',
52
52
  },
53
53
  'LTC-USD': {
54
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D'
54
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D',
55
55
  },
56
56
  'SXP-USD': {
57
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE188A9875af525d25334d75F3327863B2b8cd0F1'
57
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE188A9875af525d25334d75F3327863B2b8cd0F1',
58
58
  },
59
59
  'TRX-USD': {
60
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xF4C5e535756D11994fCBB12Ba8adD0192D9b88be'
60
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xF4C5e535756D11994fCBB12Ba8adD0192D9b88be',
61
61
  },
62
62
  'JPY-USD': {
63
63
  [Chain.POLYGON_MAINNET]: '0xD647a6fC9BC6402301583C91decC5989d8Bc382D',
@@ -68,14 +68,14 @@ export const chainlinkOracles = {
68
68
  [Chain.BNB_SMART_CHAIN_MAINNET]: '0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8',
69
69
  },
70
70
  'TUSD-USD': {
71
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa3334A9762090E827413A7495AfeCE76F41dFc06'
71
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa3334A9762090E827413A7495AfeCE76F41dFc06',
72
72
  },
73
73
  'LINK-MATIC': {
74
74
  [Chain.POLYGON_MAINNET]: '0x5787BefDc0ECd210Dfa948264631CD53E68F7802',
75
75
  },
76
76
  'MATIC-USD': {
77
77
  [Chain.POLYGON_MAINNET]: '0xAB594600376Ec9fD91F8e885dADF0CE036862dE0',
78
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x7CA57b0cA6367191c94C8914d7Df09A57655905f'
78
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x7CA57b0cA6367191c94C8914d7Df09A57655905f',
79
79
  },
80
80
  'MATICX-USD': {
81
81
  [Chain.POLYGON_MAINNET]: '0x5d37E4b374E6907de8Fc7fb33EE3b0af403C7403',
@@ -94,16 +94,16 @@ export const chainlinkOracles = {
94
94
  'USDT-USD': {
95
95
  [Chain.ETHEREUM_MAINNET]: '0x3E7d1eAB13ad0104d2750B8863b489D65364e32D',
96
96
  [Chain.POLYGON_MAINNET]: '0x0a6513e40db6eb1b165753ad52e80663aea50545',
97
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320'
97
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320',
98
98
  },
99
99
  'VAI-USD': {
100
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x058316f8Bb13aCD442ee7A216C7b60CFB4Ea1B53'
100
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x058316f8Bb13aCD442ee7A216C7b60CFB4Ea1B53',
101
101
  },
102
102
  'XRP-USD': {
103
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x93A67D414896A280bF8FFB3b389fE3686E014fda'
103
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x93A67D414896A280bF8FFB3b389fE3686E014fda',
104
104
  },
105
105
  'WIN-USD': {
106
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x9e7377E194E41d63795907c92c3EB351a2eb0233'
106
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x9e7377E194E41d63795907c92c3EB351a2eb0233',
107
107
  },
108
108
  'EUR-USD': {
109
109
  [Chain.POLYGON_MAINNET]: '0x73366Fe0AA0Ded304479862808e02506FE556a98',
@@ -114,13 +114,13 @@ export const chainlinkOracles = {
114
114
  },
115
115
  'AAVE-USD': {
116
116
  [Chain.ETHEREUM_MAINNET]: '0x547a514d5e3769680Ce22B2361c10Ea13619e8a9',
117
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475'
117
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475',
118
118
  },
119
119
  'ADA-USD': {
120
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa767f745331D267c7751297D982b050c93985627'
120
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa767f745331D267c7751297D982b050c93985627',
121
121
  },
122
122
  'BCH-USD': {
123
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x43d80f616DAf0b0B42a928EeD32147dC59027D41'
123
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0x43d80f616DAf0b0B42a928EeD32147dC59027D41',
124
124
  },
125
125
  'BAT-ETH': {
126
126
  [Chain.ETHEREUM_MAINNET]: '0x0d16d4528239e9ee52fa531af613AcdB23D88c94',
@@ -128,7 +128,7 @@ export const chainlinkOracles = {
128
128
  'UNI-USD': {
129
129
  [Chain.ETHEREUM_MAINNET]: '0x553303d460EE0afB37EdFf9bE42922D8FF63220e',
130
130
  [Chain.POLYGON_MAINNET]: '0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C',
131
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xb57f259E7C24e56a1dA00F66b55A5640d9f9E7e4'
131
+ [Chain.BNB_SMART_CHAIN_MAINNET]: '0xb57f259E7C24e56a1dA00F66b55A5640d9f9E7e4',
132
132
  },
133
133
  'YFI-USD': {
134
134
  [Chain.ETHEREUM_MAINNET]: '0xA027702dbb89fbd58938e4324ac03B58d812b0E1',
@@ -144,19 +144,20 @@ export const chainlinkOracles = {
144
144
  },
145
145
  'MKR-USD': {
146
146
  [Chain.ETHEREUM_MAINNET]: '0xec1D1B3b0443256cc3860e24a46F108e699484Aa',
147
- [Chain.POLYGON_MAINNET]: '0xa070427bF5bA5709f70e98b94Cb2F435a242C46C'
147
+ [Chain.POLYGON_MAINNET]: '0xa070427bF5bA5709f70e98b94Cb2F435a242C46C',
148
148
  },
149
149
  'COMP-USD': {
150
150
  [Chain.ETHEREUM_MAINNET]: '0xdbd020CAeF83eFd542f4De03e3cF0C28A4428bd5',
151
- [Chain.POLYGON_MAINNET]: '0x2A8758b7257102461BC958279054e372C2b1bDE6'
151
+ [Chain.POLYGON_MAINNET]: '0x2A8758b7257102461BC958279054e372C2b1bDE6',
152
152
  },
153
153
  'WSTETH-ETH': {
154
154
  [Chain.POLYGON_MAINNET]: '0x10f964234cae09cB6a9854B56FF7D4F38Cda5E6a',
155
155
  },
156
156
  };
157
157
  export const getChainLinkKeys = (chainId) => {
158
+ return Object.keys(chainlinkOracles).filter(
158
159
  // @ts-ignore
159
- return Object.keys(chainlinkOracles).filter((x) => chainlinkOracles[x][chainId] !== undefined);
160
+ (x) => chainlinkOracles[x][chainId] !== undefined);
160
161
  };
161
162
  export const chainlinkOraclesEthereum = {
162
163
  '1INCH-USD': {
@@ -1 +1 @@
1
- {"version":3,"file":"fetchOracleData.d.ts","sourceRoot":"","sources":["../../../src/prices/main-prices/fetchOracleData.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKlD,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,cAAY,KAAG,MAY7D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EACb,eAAe,MAAM,EACrB,SAAS,MAAM,KACd,MAYF,CAAA;AAOD,UAAU,UAAU;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAID;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAAE,EAClB,cAAc,oBAAoB,KACjC,OAAO,CAAC,UAAU,CAiJpB,CAAA"}
1
+ {"version":3,"file":"fetchOracleData.d.ts","sourceRoot":"","sources":["../../../src/prices/main-prices/fetchOracleData.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKlD,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,EAAE,cAAY,KAAG,MAY7D,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,OAAO,MAAM,EACb,eAAe,MAAM,EACrB,SAAS,MAAM,KACd,MAYF,CAAA;AAOD,UAAU,UAAU;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAID;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAAE,EAClB,cAAc,oBAAoB,KACjC,OAAO,CAAC,UAAU,CA8JpB,CAAA"}
@@ -44,97 +44,117 @@ const RWA_DYNAMIC_ORACLE = '0xA96abbe61AfEdEB0D14a20440Ae7100D9aB4882f';
44
44
  * Fetches Aave and uniswap V2 oracle data
45
45
  */
46
46
  export const fetchMainPrices = async (chainIds, getEvmClient) => {
47
- let promises = chainIds.map((chainId) => {
47
+ const multicallPromises = chainIds.map(async (chainId) => {
48
48
  const aaveForks = AAVES_PER_CHAIN[chainId];
49
- let reservesToQuery = aaveForks?.map((a) => ({ fork: a, assets: getAaveAssets(chainId, a) }));
50
- let handled = [];
51
- let queries = [];
52
- reservesToQuery?.forEach((e) => {
53
- const newOnes = e.assets.filter((a) => !handled.includes(a));
54
- if (newOnes.length > 0) {
49
+ const reservesToQuery = aaveForks?.map((a) => ({
50
+ fork: a,
51
+ assets: getAaveAssets(chainId, a),
52
+ })) ?? [];
53
+ const handled = new Set();
54
+ const queries = [];
55
+ for (const e of reservesToQuery) {
56
+ const newAssets = e.assets.filter((a) => !handled.has(a));
57
+ if (newAssets.length > 0) {
55
58
  queries.push({
56
- assets: newOnes,
59
+ assets: newAssets,
57
60
  // @ts-ignore
58
61
  oracle: AAVE_STYLE_ORACLES[e.fork][chainId],
59
62
  fork: e.fork,
60
63
  });
61
- handled = [...handled, ...newOnes];
64
+ newAssets.forEach((a) => handled.add(a));
62
65
  }
63
- });
64
- const morphoQueries = (MrophoOracles[chainId] ?? []).filter((a) => !handled.includes(a.collateralAsset) || !handled.includes(a.loanAsset));
66
+ }
67
+ const morphoQueries = (MrophoOracles[chainId] ?? []).filter((a) => !handled.has(a.collateralAsset) || !handled.has(a.loanAsset));
65
68
  const morphoCalls = getMorphoCalls(morphoQueries);
66
- const callAave = getAaveCalls(queries);
67
- const [callsChainLink, chainLinkNames] = getChainLinkCalls(chainId);
68
- const uniswapV2Calls = getUniswapV2Calls(chainId);
69
+ const aaveCalls = getAaveCalls(queries);
70
+ const [chainlinkCalls, chainlinkNames] = getChainLinkCalls(chainId);
71
+ const uniswapCalls = getUniswapV2Calls(chainId);
69
72
  const [api3Calls, api3Names] = getApi3Calls(chainId);
70
73
  const [rwaCalls, rwaNames] = getRWADynamicOracleCalls(chainId);
71
- return multicallViemAbiArray(chainId, [
74
+ const allCalls = [
75
+ ...chainlinkCalls,
76
+ ...aaveCalls,
77
+ ...uniswapCalls,
78
+ ...api3Calls,
79
+ ...rwaCalls,
80
+ ...morphoCalls,
81
+ ];
82
+ const abis = [
72
83
  ...ChainLinkAggregatorAbi,
73
84
  ...UniswapV2PairAbi,
74
85
  ...AaveOracleAbi,
75
86
  ...Api3OracleAbi,
76
87
  ...RWADynamicOracleAbi,
77
88
  ...ProxyOracleAbi,
78
- ], [
79
- ...callsChainLink,
80
- ...callAave,
81
- ...uniswapV2Calls,
82
- ...api3Calls,
83
- ...rwaCalls,
84
- ...morphoCalls,
85
- ], getEvmClient).then((multicallResult) => {
86
- const chainLinkResults = multicallResult.slice(0, callsChainLink.length);
87
- const aaveResult = multicallResult.slice(callsChainLink.length, callsChainLink.length + callAave.length);
88
- const chainLinkData = parseChainLinkResults(chainId, chainLinkResults, chainLinkNames);
89
- // @ts-ignore
90
- const aaveData = parseAaveResults(chainId, aaveResult, queries);
91
- const uniswapResult = multicallResult.slice(callsChainLink.length + callAave.length, callsChainLink.length + callAave.length + uniswapV2Calls.length);
92
- const api3Result = multicallResult.slice(callsChainLink.length + callAave.length + uniswapV2Calls.length, callsChainLink.length +
93
- callAave.length +
94
- uniswapV2Calls.length +
95
- api3Calls.length);
96
- const uniswapData = parseUniswapV2results(uniswapResult, chainId);
97
- const api3Data = parseApi3Results(chainId, api3Result, api3Names);
98
- const rwaResult = multicallResult.slice(callsChainLink.length +
99
- callAave.length +
100
- uniswapV2Calls.length +
101
- api3Calls.length, callsChainLink.length +
102
- callAave.length +
103
- uniswapV2Calls.length +
104
- api3Calls.length +
105
- rwaCalls.length);
106
- const rwaData = parseRWADynamicOracleResults(chainId, rwaResult, rwaNames);
107
- const morphoResult = multicallResult.slice(callsChainLink.length +
108
- callAave.length +
109
- uniswapV2Calls.length +
110
- api3Calls.length +
111
- rwaCalls.length, callsChainLink.length +
112
- callAave.length +
113
- uniswapV2Calls.length +
114
- api3Calls.length +
115
- morphoCalls.length);
116
- const prices = {
117
- ...uniswapData,
118
- ...aaveData,
119
- ...chainLinkData,
120
- ...api3Data,
121
- ...rwaData,
122
- };
123
- const morphoData = parseMorphoResults(chainId, morphoResult, morphoQueries, prices);
124
- return {
125
- ...prices,
126
- ...morphoData,
127
- };
128
- });
129
- });
130
- promises.push(fetchDefillamaData());
131
- promises.push(fetchPendlePrices());
132
- const result = await Promise.all(promises);
133
- let data = {};
134
- result.forEach((r) => {
135
- data = { ...data, ...r };
89
+ ];
90
+ const result = await multicallViemAbiArray(chainId, abis, allCalls, getEvmClient);
91
+ return {
92
+ chainId,
93
+ result,
94
+ meta: {
95
+ queries,
96
+ chainlink: { calls: chainlinkCalls, names: chainlinkNames },
97
+ api3: { calls: api3Calls, names: api3Names },
98
+ rwa: { calls: rwaCalls, names: rwaNames },
99
+ morpho: { queries: morphoQueries },
100
+ uniswapCalls,
101
+ aaveCalls,
102
+ },
103
+ };
136
104
  });
137
- return data;
105
+ const otherDataPromises = [fetchDefillamaData(), fetchPendlePrices()];
106
+ const [chainResults, ...otherResults] = await Promise.all([
107
+ Promise.all(multicallPromises),
108
+ ...otherDataPromises,
109
+ ]);
110
+ let allPrices = {};
111
+ // Parse all except morpho first
112
+ for (const { chainId, result, meta: { queries, chainlink, api3, rwa, uniswapCalls, aaveCalls }, } of chainResults) {
113
+ let offset = 0;
114
+ const chainlinkSlice = result.slice(offset, offset + chainlink.calls.length);
115
+ const chainlinkData = parseChainLinkResults(chainId, chainlinkSlice, chainlink.names);
116
+ offset += chainlink.calls.length;
117
+ const aaveSlice = result.slice(offset, offset + aaveCalls.length);
118
+ const aaveData = parseAaveResults(chainId, aaveSlice, queries);
119
+ offset += aaveCalls.length;
120
+ const uniswapSlice = result.slice(offset, offset + uniswapCalls.length);
121
+ const uniswapData = parseUniswapV2results(uniswapSlice, chainId);
122
+ offset += uniswapCalls.length;
123
+ const api3Slice = result.slice(offset, offset + api3.calls.length);
124
+ const api3Data = parseApi3Results(chainId, api3Slice, api3.names);
125
+ offset += api3.calls.length;
126
+ const rwaSlice = result.slice(offset, offset + rwa.calls.length);
127
+ const rwaData = parseRWADynamicOracleResults(chainId, rwaSlice, rwa.names);
128
+ offset += rwa.calls.length;
129
+ allPrices = {
130
+ ...allPrices,
131
+ ...chainlinkData,
132
+ ...aaveData,
133
+ ...uniswapData,
134
+ ...api3Data,
135
+ ...rwaData,
136
+ };
137
+ }
138
+ allPrices = { ...allPrices, ...otherResults[0], ...otherResults[1] };
139
+ // Parse morpho data (needs allPrices)
140
+ for (const { chainId, result, meta: { morpho, chainlink, aaveCalls, uniswapCalls, api3, rwa }, } of chainResults) {
141
+ const morphoOffset = chainlink.calls.length +
142
+ aaveCalls.length +
143
+ uniswapCalls.length +
144
+ api3.calls.length +
145
+ rwa.calls.length;
146
+ const morphoResult = result.slice(morphoOffset);
147
+ const morphoData = parseMorphoResults(chainId, morphoResult, morpho.queries, allPrices);
148
+ allPrices = {
149
+ ...allPrices,
150
+ ...morphoData,
151
+ };
152
+ }
153
+ // Merge with defillama + pendle prices
154
+ for (const r of otherResults) {
155
+ allPrices = { ...allPrices, ...r };
156
+ }
157
+ return allPrices;
138
158
  };
139
159
  /**
140
160
  * Gets the calls foir the uniswap pools
@@ -296,8 +316,6 @@ const parseMorphoResults = (chainId, data, queries, donePrices = {}) => {
296
316
  const oracleIdCollateral = ASSET_META[chainId][collateralAsset]?.assetGroup ??
297
317
  chainId + '-' + collateralAsset;
298
318
  const collateralPrice = donePrices[oracleIdCollateral];
299
- console.log('debtPrice', oracleId, debtPrice);
300
- console.log('collateralPrice', oracleIdCollateral, collateralPrice);
301
319
  const priceDebtToCollateral = formatMorphoPrice(d.toString(), loanAssetDecimals, collateralAssetDecimals);
302
320
  if (debtPrice) {
303
321
  if (!prices[oracleIdCollateral])
@@ -114,7 +114,7 @@ export const fetchGeneralYields = async () => {
114
114
  const res = await fetch(FeedData.HYPE).then((r) => r.json());
115
115
  return {
116
116
  [wstHype]: res.wstHYPE.latestApr,
117
- [hyUSD]: res.kHYPE.latestApr,
117
+ [kHYPE]: res.kHYPE.latestApr,
118
118
  };
119
119
  });
120
120
  const cbethPromise = safeFetch('CBETH', async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1delta/margin-fetcher",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -113,9 +113,14 @@ const WS = '0x039e2fb66102314ce7b64ce5ce3e5183bc94ad38'
113
113
  const prefixFantom = 'fantom:'
114
114
  const WFTM = '0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83'
115
115
 
116
+ const prefixPolygon = 'polygon:'
117
+ const TRUMATIC = '0xf33687811f3ad0cd6b48dd4b39f9f977bd7165a2'
118
+
116
119
  const prefixHyperEVM = 'hyperliquid:'
117
120
 
118
121
  const WYPE = '0x5555555555555555555555555555555555555555'
122
+ const WSTHYPE = '0x94e8396e0869c9f2200760af0621afd240e1cf38'
123
+ const kHYPE = '0xfd739d4e423301ce9385c1fb8850539d657c296d'
119
124
 
120
125
  // const prefixKaia = 'kaia:'
121
126
  // const WKAIA = '0x19aac5f612f524b754ca7e7c41cbfa2e981a4432'
@@ -129,8 +134,11 @@ const datasBase = [AERO].map((d) => prefixBase + d).join(',')
129
134
  const datasCore = [WCORE].map((d) => prefixCore + d).join(',')
130
135
  const datasMetis = [WMETIS].map((d) => prefixMetis + d).join(',')
131
136
  const datasFantom = [WFTM].map((d) => prefixFantom + d).join(',')
137
+ const datasPolygon = [TRUMATIC].map((d) => prefixPolygon + d).join(',')
132
138
  const datasSonic = [WS].map((d) => prefixSonic + d).join(',')
133
- const datasHyperEvm = [WYPE].map((d) => prefixHyperEVM + d).join(',')
139
+ const datasHyperEvm = [WYPE, WSTHYPE, kHYPE]
140
+ .map((d) => prefixHyperEVM + d)
141
+ .join(',')
134
142
  // const datasKaia = [WKAIA].map((d) => prefixKaia + d).join(',')
135
143
 
136
144
  const URL = `https://coins.llama.fi/prices/current/${[
@@ -143,8 +151,9 @@ const URL = `https://coins.llama.fi/prices/current/${[
143
151
  datasMetis,
144
152
  datasFantom,
145
153
  datasHyperEvm,
146
- // datasKaia,
154
+ // datasKaia,
147
155
  datasSonic, //
156
+ datasPolygon,
148
157
  ].join(',')}?searchWidth=4h`
149
158
  const URL_HIST = (ref: number) =>
150
159
  `https://coins.llama.fi/prices/historical/${ref}/${[
@@ -158,6 +167,7 @@ const URL_HIST = (ref: number) =>
158
167
  datasFantom,
159
168
  // datasKaia,
160
169
  datasHyperEvm,
170
+ datasPolygon,
161
171
  datasSonic, //
162
172
  ].join(',')}?searchWidth=4h`
163
173
 
@@ -222,6 +232,9 @@ const SYMBOL_MAP = {
222
232
  wkaia: 'KAIA',
223
233
  savax: 'SAVAX',
224
234
  whype: 'WHYPE',
235
+ khype: 'Kinetiq Staked HYPE::kHYPE',
236
+ wsthype: 'Staked HYPE Shares::WSTHYPE',
237
+ trumatic: 'TRUMATIC',
225
238
  }
226
239
 
227
240
  export async function fetchDefillamaData() {
@@ -302,6 +315,7 @@ export async function fetchDefillamaHistData() {
302
315
  histPrices['SUBTC'] = histPrices['WBTC']
303
316
  histPrices['IBTC'] = histPrices['WBTC']
304
317
  histPrices['ENZOBTC'] = histPrices['WBTC']
318
+ histPrices['CBBTC'] = histPrices['WBTC']
305
319
  histPrices['PUMPBTC'] = histPrices['WBTC']
306
320
 
307
321
  return histPrices
@@ -1,18 +1,16 @@
1
- import { Chain } from "@1delta/asset-registry"
2
-
1
+ import { Chain } from '@1delta/asset-registry'
3
2
 
4
3
  export enum ChainlinkAggregatorIndexes {
5
4
  roundId = 0,
6
5
  answer,
7
6
  startedAt,
8
7
  updatedAt,
9
- answeredInRound
8
+ answeredInRound,
10
9
  }
11
10
 
12
-
13
11
  export const chainlinkOracles = {
14
12
  'MIMATIC-USD': {
15
- [Chain.POLYGON_MAINNET]: '0xd8d483d813547cfb624b8dc33a00f2fcbcd2d428'
13
+ [Chain.POLYGON_MAINNET]: '0xd8d483d813547cfb624b8dc33a00f2fcbcd2d428',
16
14
  },
17
15
  'BTC-ETH': {
18
16
  [Chain.POLYGON_MAINNET]: '0x19b0F0833C78c0848109E3842D34d2fDF2cA69BA',
@@ -20,47 +18,60 @@ export const chainlinkOracles = {
20
18
  'BTC-USD': {
21
19
  [Chain.POLYGON_MAINNET]: '0xc907E116054Ad103354f2D350FD2514433D57F6f',
22
20
  [Chain.ETHEREUM_MAINNET]: '0xF4030086522a5bEEa4988F8cA5B36dbC97BeE88c',
23
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf',
21
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
22
+ '0x264990fbd0A4796A3E3d8E37C4d5F87a3aCa5Ebf',
24
23
  },
25
24
  'DAI-USD': {
26
25
  [Chain.POLYGON_MAINNET]: '0x4746DeC9e833A82EC7C2C1356372CcF2cfcD2F3D',
27
26
  [Chain.ETHEREUM_MAINNET]: '0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9',
28
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x132d3C0B1D2cEa0BC552588063bdBb210FDeecfA',
27
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
28
+ '0x132d3C0B1D2cEa0BC552588063bdBb210FDeecfA',
29
29
  },
30
30
  'ETH-USD': {
31
31
  [Chain.POLYGON_MAINNET]: '0xF9680D99D6C9589e2a93a78A04A279e509205945',
32
32
  [Chain.ETHEREUM_MAINNET]: '0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419',
33
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e',
33
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
34
+ '0x9ef1B8c0E4F7dc8bF5719Ea496883DC6401d5b2e',
34
35
  },
35
36
  'BNB-USD': {
36
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE'
37
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
38
+ '0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE',
37
39
  },
38
40
  'CAKE-USD': {
39
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB6064eD41d4f67e353768aA239cA86f4F73665a1'
41
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
42
+ '0xB6064eD41d4f67e353768aA239cA86f4F73665a1',
40
43
  },
41
44
  'DOGE-USD': {
42
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8'
45
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
46
+ '0x3AB0A0d137D4F946fBB19eecc6e92E64660231C8',
43
47
  },
44
48
  'DOT-USD': {
45
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592'
49
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
50
+ '0xC333eb0086309a16aa7c8308DfD32c8BBA0a2592',
46
51
  },
47
52
  'BUSD-USD': {
48
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xcBb98864Ef56E9042e7d2efef76141f15731B82f'
53
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
54
+ '0xcBb98864Ef56E9042e7d2efef76141f15731B82f',
49
55
  },
50
56
  'BETH-USD': {
51
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x2A3796273d47c4eD363b361D3AEFb7F7E2A13782'
57
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
58
+ '0x2A3796273d47c4eD363b361D3AEFb7F7E2A13782',
52
59
  },
53
60
  'FIL-USD': {
54
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83'
61
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
62
+ '0xE5dbFD9003bFf9dF5feB2f4F445Ca00fb121fb83',
55
63
  },
56
64
  'LTC-USD': {
57
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D'
65
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
66
+ '0x74E72F37A8c415c8f1a98Ed42E78Ff997435791D',
58
67
  },
59
68
  'SXP-USD': {
60
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xE188A9875af525d25334d75F3327863B2b8cd0F1'
69
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
70
+ '0xE188A9875af525d25334d75F3327863B2b8cd0F1',
61
71
  },
62
72
  'TRX-USD': {
63
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xF4C5e535756D11994fCBB12Ba8adD0192D9b88be'
73
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
74
+ '0xF4C5e535756D11994fCBB12Ba8adD0192D9b88be',
64
75
  },
65
76
  'JPY-USD': {
66
77
  [Chain.POLYGON_MAINNET]: '0xD647a6fC9BC6402301583C91decC5989d8Bc382D',
@@ -68,17 +79,20 @@ export const chainlinkOracles = {
68
79
  'LINK-USD': {
69
80
  [Chain.POLYGON_MAINNET]: '0xd9FFdb71EbE7496cC440152d43986Aae0AB76665',
70
81
  [Chain.ETHEREUM_MAINNET]: '0x2c1d072e956AFFC0D435Cb7AC38EF18d24d9127c',
71
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8',
82
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
83
+ '0xca236E327F629f9Fc2c30A4E95775EbF0B89fac8',
72
84
  },
73
85
  'TUSD-USD': {
74
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa3334A9762090E827413A7495AfeCE76F41dFc06'
86
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
87
+ '0xa3334A9762090E827413A7495AfeCE76F41dFc06',
75
88
  },
76
89
  'LINK-MATIC': {
77
90
  [Chain.POLYGON_MAINNET]: '0x5787BefDc0ECd210Dfa948264631CD53E68F7802',
78
91
  },
79
92
  'MATIC-USD': {
80
93
  [Chain.POLYGON_MAINNET]: '0xAB594600376Ec9fD91F8e885dADF0CE036862dE0',
81
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x7CA57b0cA6367191c94C8914d7Df09A57655905f'
94
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
95
+ '0x7CA57b0cA6367191c94C8914d7Df09A57655905f',
82
96
  },
83
97
  'MATICX-USD': {
84
98
  [Chain.POLYGON_MAINNET]: '0x5d37E4b374E6907de8Fc7fb33EE3b0af403C7403',
@@ -87,44 +101,52 @@ export const chainlinkOracles = {
87
101
  [Chain.POLYGON_MAINNET]: '0x97371dF4492605486e23Da797fA68e55Fc38a13f',
88
102
  },
89
103
  'XVS-USD': {
90
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xBF63F430A79D4036A5900C19818aFf1fa710f206',
104
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
105
+ '0xBF63F430A79D4036A5900C19818aFf1fa710f206',
91
106
  },
92
107
  'USDC-USD': {
93
108
  [Chain.POLYGON_MAINNET]: '0xfE4A8cc5b5B2366C1B58Bea3858e81843581b2F7',
94
109
  [Chain.ETHEREUM_MAINNET]: '0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6',
95
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x51597f405303C4377E36123cBc172b13269EA163',
110
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
111
+ '0x51597f405303C4377E36123cBc172b13269EA163',
96
112
  },
97
113
  'USDT-USD': {
98
114
  [Chain.ETHEREUM_MAINNET]: '0x3E7d1eAB13ad0104d2750B8863b489D65364e32D',
99
115
  [Chain.POLYGON_MAINNET]: '0x0a6513e40db6eb1b165753ad52e80663aea50545',
100
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xB97Ad0E74fa7d920791E90258A6E2085088b4320'
116
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
117
+ '0xB97Ad0E74fa7d920791E90258A6E2085088b4320',
101
118
  },
102
119
  'VAI-USD': {
103
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x058316f8Bb13aCD442ee7A216C7b60CFB4Ea1B53'
120
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
121
+ '0x058316f8Bb13aCD442ee7A216C7b60CFB4Ea1B53',
104
122
  },
105
123
  'XRP-USD': {
106
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x93A67D414896A280bF8FFB3b389fE3686E014fda'
124
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
125
+ '0x93A67D414896A280bF8FFB3b389fE3686E014fda',
107
126
  },
108
127
  'WIN-USD': {
109
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x9e7377E194E41d63795907c92c3EB351a2eb0233'
128
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
129
+ '0x9e7377E194E41d63795907c92c3EB351a2eb0233',
110
130
  },
111
131
  'EUR-USD': {
112
132
  [Chain.POLYGON_MAINNET]: '0x73366Fe0AA0Ded304479862808e02506FE556a98',
113
133
  },
114
- 'SAND-USD': {
115
- },
134
+ 'SAND-USD': {},
116
135
  'USDT-USDC': {
117
136
  [Chain.POLYGON_MAINNET]: '0x0A6513e40db6EB1b165753AD52E80663aeA50545',
118
137
  },
119
138
  'AAVE-USD': {
120
139
  [Chain.ETHEREUM_MAINNET]: '0x547a514d5e3769680Ce22B2361c10Ea13619e8a9',
121
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475'
140
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
141
+ '0xA8357BF572460fC40f4B0aCacbB2a6A61c89f475',
122
142
  },
123
143
  'ADA-USD': {
124
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xa767f745331D267c7751297D982b050c93985627'
144
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
145
+ '0xa767f745331D267c7751297D982b050c93985627',
125
146
  },
126
147
  'BCH-USD': {
127
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0x43d80f616DAf0b0B42a928EeD32147dC59027D41'
148
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
149
+ '0x43d80f616DAf0b0B42a928EeD32147dC59027D41',
128
150
  },
129
151
  'BAT-ETH': {
130
152
  [Chain.ETHEREUM_MAINNET]: '0x0d16d4528239e9ee52fa531af613AcdB23D88c94',
@@ -132,7 +154,8 @@ export const chainlinkOracles = {
132
154
  'UNI-USD': {
133
155
  [Chain.ETHEREUM_MAINNET]: '0x553303d460EE0afB37EdFf9bE42922D8FF63220e',
134
156
  [Chain.POLYGON_MAINNET]: '0xdf0Fb4e4F928d2dCB76f438575fDD8682386e13C',
135
- [Chain.BNB_SMART_CHAIN_MAINNET]: '0xb57f259E7C24e56a1dA00F66b55A5640d9f9E7e4'
157
+ [Chain.BNB_SMART_CHAIN_MAINNET]:
158
+ '0xb57f259E7C24e56a1dA00F66b55A5640d9f9E7e4',
136
159
  },
137
160
  'YFI-USD': {
138
161
  [Chain.ETHEREUM_MAINNET]: '0xA027702dbb89fbd58938e4324ac03B58d812b0E1',
@@ -148,11 +171,11 @@ export const chainlinkOracles = {
148
171
  },
149
172
  'MKR-USD': {
150
173
  [Chain.ETHEREUM_MAINNET]: '0xec1D1B3b0443256cc3860e24a46F108e699484Aa',
151
- [Chain.POLYGON_MAINNET]: '0xa070427bF5bA5709f70e98b94Cb2F435a242C46C'
174
+ [Chain.POLYGON_MAINNET]: '0xa070427bF5bA5709f70e98b94Cb2F435a242C46C',
152
175
  },
153
176
  'COMP-USD': {
154
177
  [Chain.ETHEREUM_MAINNET]: '0xdbd020CAeF83eFd542f4De03e3cF0C28A4428bd5',
155
- [Chain.POLYGON_MAINNET]: '0x2A8758b7257102461BC958279054e372C2b1bDE6'
178
+ [Chain.POLYGON_MAINNET]: '0x2A8758b7257102461BC958279054e372C2b1bDE6',
156
179
  },
157
180
  'WSTETH-ETH': {
158
181
  [Chain.POLYGON_MAINNET]: '0x10f964234cae09cB6a9854B56FF7D4F38Cda5E6a',
@@ -160,8 +183,10 @@ export const chainlinkOracles = {
160
183
  }
161
184
 
162
185
  export const getChainLinkKeys = (chainId: string): string[] => {
163
- // @ts-ignore
164
- return Object.keys(chainlinkOracles).filter((x) => chainlinkOracles[x][chainId] !== undefined)
186
+ return Object.keys(chainlinkOracles).filter(
187
+ // @ts-ignore
188
+ (x) => chainlinkOracles[x][chainId] !== undefined,
189
+ )
165
190
  }
166
191
 
167
192
  export const chainlinkOraclesEthereum = {
@@ -73,150 +73,163 @@ export const fetchMainPrices = async (
73
73
  chainIds: string[],
74
74
  getEvmClient: GetEvmClientFunction,
75
75
  ): Promise<OracleData> => {
76
- let promises = chainIds.map((chainId) => {
76
+ const multicallPromises = chainIds.map(async (chainId) => {
77
77
  const aaveForks = AAVES_PER_CHAIN[chainId]
78
- let reservesToQuery: { fork: string; assets: string[] }[] = aaveForks?.map(
79
- (a) => ({ fork: a, assets: getAaveAssets(chainId, a) }),
80
- )
81
- let handled: string[] = []
82
- let queries: QueryAave[] = []
83
- reservesToQuery?.forEach((e) => {
84
- const newOnes = e.assets.filter((a) => !handled.includes(a))
85
- if (newOnes.length > 0) {
78
+ const reservesToQuery =
79
+ aaveForks?.map((a) => ({
80
+ fork: a,
81
+ assets: getAaveAssets(chainId, a),
82
+ })) ?? []
83
+
84
+ const handled: Set<string> = new Set()
85
+ const queries: QueryAave[] = []
86
+
87
+ for (const e of reservesToQuery) {
88
+ const newAssets = e.assets.filter((a) => !handled.has(a))
89
+ if (newAssets.length > 0) {
86
90
  queries.push({
87
- assets: newOnes,
91
+ assets: newAssets,
88
92
  // @ts-ignore
89
93
  oracle: AAVE_STYLE_ORACLES[e.fork][chainId],
90
94
  fork: e.fork,
91
95
  })
92
- handled = [...handled, ...newOnes]
96
+ newAssets.forEach((a) => handled.add(a))
93
97
  }
94
- })
98
+ }
95
99
 
96
100
  const morphoQueries = (MrophoOracles[chainId] ?? []).filter(
97
- (a) =>
98
- !handled.includes(a.collateralAsset) || !handled.includes(a.loanAsset),
101
+ (a) => !handled.has(a.collateralAsset) || !handled.has(a.loanAsset),
99
102
  )
100
103
 
101
104
  const morphoCalls = getMorphoCalls(morphoQueries)
102
-
103
- const callAave = getAaveCalls(queries)
104
-
105
- const [callsChainLink, chainLinkNames] = getChainLinkCalls(chainId)
106
-
107
- const uniswapV2Calls = getUniswapV2Calls(chainId)
108
-
105
+ const aaveCalls = getAaveCalls(queries)
106
+ const [chainlinkCalls, chainlinkNames] = getChainLinkCalls(chainId)
107
+ const uniswapCalls = getUniswapV2Calls(chainId)
109
108
  const [api3Calls, api3Names] = getApi3Calls(chainId)
110
-
111
109
  const [rwaCalls, rwaNames] = getRWADynamicOracleCalls(chainId)
112
110
 
113
- return multicallViemAbiArray(
111
+ const allCalls = [
112
+ ...chainlinkCalls,
113
+ ...aaveCalls,
114
+ ...uniswapCalls,
115
+ ...api3Calls,
116
+ ...rwaCalls,
117
+ ...morphoCalls,
118
+ ]
119
+
120
+ const abis = [
121
+ ...ChainLinkAggregatorAbi,
122
+ ...UniswapV2PairAbi,
123
+ ...AaveOracleAbi,
124
+ ...Api3OracleAbi,
125
+ ...RWADynamicOracleAbi,
126
+ ...ProxyOracleAbi,
127
+ ]
128
+
129
+ const result = await multicallViemAbiArray(
114
130
  chainId,
115
- [
116
- ...ChainLinkAggregatorAbi,
117
- ...UniswapV2PairAbi,
118
- ...AaveOracleAbi,
119
- ...Api3OracleAbi,
120
- ...RWADynamicOracleAbi,
121
- ...ProxyOracleAbi,
122
- ],
123
- [
124
- ...callsChainLink,
125
- ...callAave,
126
- ...uniswapV2Calls,
127
- ...api3Calls,
128
- ...rwaCalls,
129
- ...morphoCalls,
130
- ],
131
+ abis,
132
+ allCalls,
131
133
  getEvmClient,
132
- ).then((multicallResult) => {
133
- const chainLinkResults = multicallResult.slice(0, callsChainLink.length)
134
-
135
- const aaveResult = multicallResult.slice(
136
- callsChainLink.length,
137
- callsChainLink.length + callAave.length,
138
- )
139
-
140
- const chainLinkData = parseChainLinkResults(
141
- chainId,
142
- chainLinkResults,
143
- chainLinkNames,
144
- )
145
- // @ts-ignore
146
- const aaveData = parseAaveResults(chainId, aaveResult, queries)
134
+ )
147
135
 
148
- const uniswapResult = multicallResult.slice(
149
- callsChainLink.length + callAave.length,
150
- callsChainLink.length + callAave.length + uniswapV2Calls.length,
151
- )
136
+ return {
137
+ chainId,
138
+ result,
139
+ meta: {
140
+ queries,
141
+ chainlink: { calls: chainlinkCalls, names: chainlinkNames },
142
+ api3: { calls: api3Calls, names: api3Names },
143
+ rwa: { calls: rwaCalls, names: rwaNames },
144
+ morpho: { queries: morphoQueries },
145
+ uniswapCalls,
146
+ aaveCalls,
147
+ },
148
+ }
149
+ })
152
150
 
153
- const api3Result = multicallResult.slice(
154
- callsChainLink.length + callAave.length + uniswapV2Calls.length,
155
- callsChainLink.length +
156
- callAave.length +
157
- uniswapV2Calls.length +
158
- api3Calls.length,
159
- )
151
+ const otherDataPromises = [fetchDefillamaData(), fetchPendlePrices()]
152
+ const [chainResults, ...otherResults] = await Promise.all([
153
+ Promise.all(multicallPromises),
154
+ ...otherDataPromises,
155
+ ])
160
156
 
161
- const uniswapData = parseUniswapV2results(uniswapResult, chainId)
157
+ let allPrices: OracleData = {}
162
158
 
163
- const api3Data = parseApi3Results(chainId, api3Result, api3Names)
159
+ // Parse all except morpho first
160
+ for (const {
161
+ chainId,
162
+ result,
163
+ meta: { queries, chainlink, api3, rwa, uniswapCalls, aaveCalls },
164
+ } of chainResults) {
165
+ let offset = 0
164
166
 
165
- const rwaResult = multicallResult.slice(
166
- callsChainLink.length +
167
- callAave.length +
168
- uniswapV2Calls.length +
169
- api3Calls.length,
170
- callsChainLink.length +
171
- callAave.length +
172
- uniswapV2Calls.length +
173
- api3Calls.length +
174
- rwaCalls.length,
175
- )
167
+ const chainlinkSlice = result.slice(offset, offset + chainlink.calls.length)
168
+ const chainlinkData = parseChainLinkResults(
169
+ chainId,
170
+ chainlinkSlice,
171
+ chainlink.names,
172
+ )
173
+ offset += chainlink.calls.length
174
+
175
+ const aaveSlice = result.slice(offset, offset + aaveCalls.length)
176
+ const aaveData = parseAaveResults(chainId, aaveSlice, queries)
177
+ offset += aaveCalls.length
178
+
179
+ const uniswapSlice = result.slice(offset, offset + uniswapCalls.length)
180
+ const uniswapData = parseUniswapV2results(uniswapSlice, chainId)
181
+ offset += uniswapCalls.length
182
+
183
+ const api3Slice = result.slice(offset, offset + api3.calls.length)
184
+ const api3Data = parseApi3Results(chainId, api3Slice, api3.names)
185
+ offset += api3.calls.length
186
+
187
+ const rwaSlice = result.slice(offset, offset + rwa.calls.length)
188
+ const rwaData = parseRWADynamicOracleResults(chainId, rwaSlice, rwa.names)
189
+ offset += rwa.calls.length
190
+
191
+ allPrices = {
192
+ ...allPrices,
193
+ ...chainlinkData,
194
+ ...aaveData,
195
+ ...uniswapData,
196
+ ...api3Data,
197
+ ...rwaData,
198
+ }
199
+ }
200
+ allPrices = { ...allPrices, ...otherResults[0], ...otherResults[1] }
201
+ // Parse morpho data (needs allPrices)
202
+ for (const {
203
+ chainId,
204
+ result,
205
+ meta: { morpho, chainlink, aaveCalls, uniswapCalls, api3, rwa },
206
+ } of chainResults) {
207
+ const morphoOffset =
208
+ chainlink.calls.length +
209
+ aaveCalls.length +
210
+ uniswapCalls.length +
211
+ api3.calls.length +
212
+ rwa.calls.length
213
+ const morphoResult = result.slice(morphoOffset)
214
+ const morphoData = parseMorphoResults(
215
+ chainId,
216
+ morphoResult,
217
+ morpho.queries,
218
+ allPrices,
219
+ )
176
220
 
177
- const rwaData = parseRWADynamicOracleResults(chainId, rwaResult, rwaNames)
178
-
179
- const morphoResult = multicallResult.slice(
180
- callsChainLink.length +
181
- callAave.length +
182
- uniswapV2Calls.length +
183
- api3Calls.length +
184
- rwaCalls.length,
185
- callsChainLink.length +
186
- callAave.length +
187
- uniswapV2Calls.length +
188
- api3Calls.length +
189
- morphoCalls.length,
190
- )
191
- const prices = {
192
- ...uniswapData,
193
- ...aaveData,
194
- ...chainLinkData,
195
- ...api3Data,
196
- ...rwaData,
197
- }
198
- const morphoData = parseMorphoResults(
199
- chainId,
200
- morphoResult,
201
- morphoQueries,
202
- prices,
203
- )
221
+ allPrices = {
222
+ ...allPrices,
223
+ ...morphoData,
224
+ }
225
+ }
204
226
 
205
- return {
206
- ...prices,
207
- ...morphoData,
208
- }
209
- })
210
- })
211
- promises.push(fetchDefillamaData())
212
- promises.push(fetchPendlePrices())
213
- const result = await Promise.all(promises)
214
- let data: any = {}
215
- result.forEach((r) => {
216
- data = { ...data, ...r }
217
- })
227
+ // Merge with defillama + pendle prices
228
+ for (const r of otherResults) {
229
+ allPrices = { ...allPrices, ...r }
230
+ }
218
231
 
219
- return data
232
+ return allPrices
220
233
  }
221
234
 
222
235
  /**
@@ -412,7 +425,6 @@ const parseMorphoResults = (
412
425
  donePrices: any = {},
413
426
  ) => {
414
427
  let prices: any = {}
415
-
416
428
  data.forEach((d, i) => {
417
429
  const details = queries[i]
418
430
  const {
@@ -421,6 +433,7 @@ const parseMorphoResults = (
421
433
  loanAssetDecimals,
422
434
  collateralAssetDecimals,
423
435
  } = details
436
+
424
437
  const oracleId =
425
438
  ASSET_META[chainId][loanAsset]?.assetGroup ?? chainId + '-' + loanAsset
426
439
  const debtPrice = donePrices[oracleId]
@@ -428,8 +441,6 @@ const parseMorphoResults = (
428
441
  ASSET_META[chainId][collateralAsset]?.assetGroup ??
429
442
  chainId + '-' + collateralAsset
430
443
  const collateralPrice = donePrices[oracleIdCollateral]
431
- console.log('debtPrice', oracleId, debtPrice)
432
- console.log('collateralPrice', oracleIdCollateral, collateralPrice)
433
444
  const priceDebtToCollateral = formatMorphoPrice(
434
445
  d.toString(),
435
446
  loanAssetDecimals,
@@ -151,7 +151,7 @@ export const fetchGeneralYields = async () => {
151
151
  const res = await fetch(FeedData.HYPE).then((r) => r.json())
152
152
  return {
153
153
  [wstHype]: res.wstHYPE.latestApr,
154
- [hyUSD]: res.kHYPE.latestApr,
154
+ [kHYPE]: res.kHYPE.latestApr,
155
155
  }
156
156
  })
157
157
 
@@ -16,8 +16,8 @@ import { prettyPrint } from './utils'
16
16
  describe(
17
17
  'find lending data',
18
18
  () => {
19
- it('should return lender data', async () => {
20
- const chainId = Chain.HYPEREVM
19
+ it.only('should return lender data', async () => {
20
+ const chainId = Chain.ARBITRUM_ONE
21
21
 
22
22
  const ps = [
23
23
  fetchMainPrices([chainId], getEvmClient),
@@ -29,7 +29,7 @@ describe(
29
29
  // console.log("yields", yields)
30
30
  // console.log("prices", prices)
31
31
 
32
- const lenders = [Lender.HYPERLEND] // getLendersForChain(chainId) as any
32
+ const lenders = getLendersForChain(chainId) as any
33
33
  console.log('lenders', lenders)
34
34
  const lendingData = await getLenderPublicData(
35
35
  chainId,
@@ -15,8 +15,8 @@ describe(
15
15
  // Chain.OP_MAINNET,
16
16
  // Chain.POLYGON_MAINNET,
17
17
  // Chain.HEMI_NETWORK,
18
- Chain.ARBITRUM_ONE,
19
- Chain.HYPEREVM,
18
+ // Chain.ARBITRUM_ONE,
19
+ // Chain.HYPEREVM,
20
20
  Chain.KATANA,
21
21
  ],
22
22
  getEvmClient,
@@ -0,0 +1,96 @@
1
+ import { describe, it, expect, beforeAll } from 'vitest'
2
+ import {
3
+ getLenderUserDataResult,
4
+ convertLenderUserDataResult,
5
+ } from '../src/lending/user-data/fetchUserData'
6
+ import {
7
+ fetchGeneralYields,
8
+ fetchMainPrices,
9
+ getLenderPublicData,
10
+ } from '../src'
11
+ import { multicallRetry, getEvmClient } from '@1delta/providers'
12
+ import { Chain, Lender } from '@1delta/asset-registry'
13
+ import { LenderUserQuery } from '../src/lending/user-data/types'
14
+ import { getLendersForChain } from '../src/utils'
15
+ import { prettyPrint } from './utils'
16
+
17
+ const TEST_ADDRESS = '0xbadA9c382165b31419F4CC0eDf0Fa84f80A3C8E5'
18
+ let prices, yields
19
+
20
+ async function getUserData(chainId: Chain, lenders: Lender[]) {
21
+ const _lenders = getLendersForChain(chainId)
22
+ const publicData = {
23
+ data: await getLenderPublicData(
24
+ chainId,
25
+ _lenders as any,
26
+ prices as any,
27
+ yields as any,
28
+ multicallRetry,
29
+ ),
30
+ }
31
+
32
+ // Define user queries
33
+ const queries: LenderUserQuery[] = lenders.map((lender) => ({
34
+ lender,
35
+ account: TEST_ADDRESS.toLowerCase(),
36
+ }))
37
+
38
+ // Fetch raw user data
39
+ const rawUserData = await getLenderUserDataResult(
40
+ chainId,
41
+ queries,
42
+ getEvmClient,
43
+ )
44
+
45
+ // Convert raw data to structured format
46
+ const userData = convertLenderUserDataResult(
47
+ chainId,
48
+ queries,
49
+ rawUserData,
50
+ prices as any,
51
+ prices as any,
52
+ { [chainId]: publicData },
53
+ )
54
+
55
+ return { userData, rawUserData, publicData, queries }
56
+ }
57
+
58
+ describe(
59
+ 'user data fetching',
60
+ () => {
61
+ beforeAll(async () => {
62
+ ;[prices, yields] = await Promise.all([
63
+ fetchMainPrices([Chain.ARBITRUM_ONE], getEvmClient),
64
+ fetchGeneralYields(),
65
+ ])
66
+ }, 30000)
67
+
68
+ it(
69
+ 'should fetch user data for COMET on Arb',
70
+ async () => {
71
+ try {
72
+ const { userData } = await getUserData(Chain.ARBITRUM_ONE, [
73
+ Lender.COMPOUND_V3_USDC,
74
+ ])
75
+
76
+ console.log(
77
+ 'COMET user data:',
78
+ userData[Lender.COMPOUND_V3_USDC]?.[TEST_ADDRESS.toLowerCase()],
79
+ )
80
+
81
+ prettyPrint(
82
+ userData[Lender.COMPOUND_V3_USDC]?.[TEST_ADDRESS.toLowerCase()],
83
+ )
84
+
85
+ // Basic validation
86
+ expect(userData).toBeDefined()
87
+ expect(typeof userData).toBe('object')
88
+ } catch (error) {
89
+ console.log('Error fetching INIT Mantle data:', error)
90
+ }
91
+ },
92
+ { timeout: 30000 },
93
+ )
94
+ },
95
+ { timeout: 90000 },
96
+ )