impermax-sdk 2.1.4 → 2.1.6

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 (31) hide show
  1. package/lib/config/subgraphs.d.ts +2 -2
  2. package/lib/config/subgraphs.js +40 -23
  3. package/lib/config/types.d.ts +10 -0
  4. package/lib/config/types.js +7 -1
  5. package/lib/index.d.ts +4 -2
  6. package/lib/index.js +10 -2
  7. package/lib/offchain/account/offchainAccount.d.ts +6 -6
  8. package/lib/offchain/account/offchainAccount.js +33 -24
  9. package/lib/offchain/account/vault/offchainAccountVault.js +10 -3
  10. package/lib/offchain/index.d.ts +2 -1
  11. package/lib/offchain/index.js +3 -1
  12. package/lib/offchain/offchain.d.ts +13 -10
  13. package/lib/offchain/offchain.js +18 -11
  14. package/lib/offchain/offchainInitializer.d.ts +11 -11
  15. package/lib/offchain/offchainInitializer.js +151 -89
  16. package/lib/offchain/offchainMultichain.d.ts +8 -3
  17. package/lib/offchain/offchainMultichain.js +40 -4
  18. package/lib/offchain/offchainTypes.d.ts +9 -1
  19. package/lib/offchain/queries/apis/ponder/index.d.ts +3 -3
  20. package/lib/offchain/queries/apis/ponder/index.js +4 -2
  21. package/lib/offchain/queries/apis/thegraph/index.d.ts +3 -3
  22. package/lib/offchain/queries/apis/thegraph/index.js +4 -2
  23. package/lib/offchain/queries/interfaces/query-builder.d.ts +3 -3
  24. package/lib/offchain/vault/offchainHedgedVault.js +2 -25
  25. package/lib/offchain/vault/offchainLendingVault.js +6 -25
  26. package/lib/offchain/vault/offchainLeveragedVault.js +2 -25
  27. package/lib/offchain/vault/offchainVault.d.ts +16 -5
  28. package/lib/offchain/vault/offchainVault.js +18 -8
  29. package/lib/onchain/account/onchainAccountLendingVault.js +1 -1
  30. package/lib/onchain/onchainLendingVault.js +1 -1
  31. package/package.json +1 -1
@@ -12,7 +12,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.getLendingVaultsUserData = exports.initializeLendingVaultsUserData = exports.fetchLendingVaultsUserData = exports.getWhitelistState = exports.getWhitelistData = exports.initializeWhitelistData = exports.fetchWhitelist = exports.getLendingVaultData = exports.getLendingVaultsData = exports.initializeLendingVaultsData = exports.fetchLendingVaults = exports.getXimxData = exports.initializeXimxData = exports.getUserData = exports.initializeUserData = exports.fetchUserData = exports.getTvlData = exports.initializeTvlData = exports.getLendingPoolData = exports.getLendingPoolsData = exports.initializeLendingPoolsData = exports.fetchUniswapAPR = exports.fetchCurrentVolumeAndReserves = exports.fetchPastVolume = exports.fetchImpermaxChefRewardRates = exports.fetchLendingPoolsPast = exports.fetchLendingPools = exports.fetchBlockByTimestamp = exports.apolloFetcher = void 0;
15
+ exports.getVaultsUserData = exports.initializeVaultsUserData = exports.fetchVaultsUserData = exports.getWhitelistState = exports.getWhitelistData = exports.initializeWhitelistData = exports.fetchWhitelist = exports.getVaultData = exports.getVaultsData = exports.initializeVaultsData = exports.getXimxData = exports.initializeXimxData = exports.getUserData = exports.initializeUserData = exports.fetchUserData = exports.getTvlData = exports.initializeTvlData = exports.getLendingPoolData = exports.getLendingPoolsData = exports.initializeLendingPoolsData = exports.fetchUniswapAPR = exports.fetchCurrentVolumeAndReserves = exports.fetchPastVolume = exports.fetchImpermaxChefRewardRates = exports.fetchLendingPoolsPast = exports.fetchLendingPools = exports.fetchVaults = exports.fetchBlockByTimestamp = exports.apolloFetcher = void 0;
16
16
  const apollo_client_1 = __importDefault(require("apollo-client"));
17
17
  const apollo_link_http_1 = require("apollo-link-http");
18
18
  const apollo_cache_inmemory_1 = require("apollo-cache-inmemory");
@@ -21,7 +21,7 @@ const lendingPool_1 = __importDefault(require("./lendingPool"));
21
21
  const subgraphs_1 = require("../config/subgraphs");
22
22
  const types_1 = require("../config/types");
23
23
  const amms_1 = require("../config/amms");
24
- const offchainVault_1 = __importDefault(require("./vault/offchainVault"));
24
+ const vault_1 = require("./vault");
25
25
  const impermax_factories_1 = require("../config/contracts/impermax-factories");
26
26
  const SECONDS_IN_YEAR = 60 * 60 * 24 * 365;
27
27
  function apolloFetcher(subgraphUrl, query) {
@@ -34,7 +34,7 @@ function apolloFetcher(subgraphUrl, query) {
34
34
  });
35
35
  const result = yield client.query({
36
36
  query: query,
37
- fetchPolicy: 'cache-first',
37
+ fetchPolicy: "cache-first",
38
38
  });
39
39
  return queries_1.QueryBuilderFactory.transformData(result);
40
40
  });
@@ -61,6 +61,34 @@ function fetchBlockByTimestamp(timestamp) {
61
61
  });
62
62
  }
63
63
  exports.fetchBlockByTimestamp = fetchBlockByTimestamp;
64
+ // Follows similar logic as `fetchLendingPools`
65
+ function fetchVaults() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const calls = [];
68
+ let vaultType;
69
+ for (vaultType in subgraphs_1.VAULT_SUBGRAPH_URL[this.network]) {
70
+ const subgraphs = subgraphs_1.VAULT_SUBGRAPH_URL[this.network][vaultType];
71
+ if (!subgraphs || subgraphs.length === 0)
72
+ continue;
73
+ calls.push(this.endpointManager.fetch(subgraphs, this.network, (queryBuilder) => queryBuilder.vaultsQuery(vaultType, [])));
74
+ }
75
+ const results = yield Promise.all(calls);
76
+ const vaults = {};
77
+ let i = 0;
78
+ for (vaultType in subgraphs_1.VAULT_SUBGRAPH_URL[this.network]) {
79
+ const subgraphs = subgraphs_1.VAULT_SUBGRAPH_URL[this.network][vaultType];
80
+ if (!subgraphs || subgraphs.length === 0)
81
+ continue;
82
+ // WARN: data.lendingVaults will be wrong for different vaults! In the subgraph schema
83
+ // we should name it to just vaults and replace here once done.
84
+ const vaultsForType = results[i++].data.lendingVaults;
85
+ const typedVaults = vaultsForType.map((vault) => (Object.assign(Object.assign({}, vault), { vaultType })));
86
+ vaults[vaultType] = typedVaults;
87
+ }
88
+ return vaults;
89
+ });
90
+ }
91
+ exports.fetchVaults = fetchVaults;
64
92
  // Fetch Lending Pools
65
93
  function fetchLendingPools() {
66
94
  return __awaiter(this, void 0, void 0, function* () {
@@ -83,7 +111,7 @@ function fetchLendingPools() {
83
111
  exports.fetchLendingPools = fetchLendingPools;
84
112
  function fetchLendingPoolsPast(seconds) {
85
113
  return __awaiter(this, void 0, void 0, function* () {
86
- const timestamp = Math.floor((new Date).getTime() / 1000);
114
+ const timestamp = Math.floor(new Date().getTime() / 1000);
87
115
  const blockNumber = yield this.fetchBlockByTimestamp(timestamp - seconds);
88
116
  if (!blockNumber)
89
117
  return null;
@@ -93,7 +121,7 @@ function fetchLendingPoolsPast(seconds) {
93
121
  for (factory in subgraphs_1.IMPERMAX_SUBGRAPH_URL[this.network]) {
94
122
  const endpoints = subgraphs_1.IMPERMAX_SUBGRAPH_URL[this.network][factory];
95
123
  // Not all endpoints might support this
96
- const supportedEndpoints = endpoints.filter(endpoint => queries_1.QueryBuilderFactory.getQuery(endpoint).lendingPoolsPastQuery);
124
+ const supportedEndpoints = endpoints.filter((endpoint) => queries_1.QueryBuilderFactory.getQuery(endpoint).lendingPoolsPastQuery);
97
125
  // Skip if no endpoints support past queries for this factory
98
126
  if (supportedEndpoints.length === 0)
99
127
  continue;
@@ -133,7 +161,7 @@ function fetchImpermaxChefRewardRates() {
133
161
  rewards[pool.id] = [];
134
162
  rewards[pool.id].push({
135
163
  rewardToken,
136
- rewardRate: parseFloat(pool.allocPoint) / totalAllocPoint * rewardPerSec
164
+ rewardRate: (parseFloat(pool.allocPoint) / totalAllocPoint) * rewardPerSec,
137
165
  });
138
166
  }
139
167
  for (const impermaxRewarder of impermaxRewarders) {
@@ -145,7 +173,7 @@ function fetchImpermaxChefRewardRates() {
145
173
  rewards[pool.borrowable] = [];
146
174
  rewards[pool.borrowable].push({
147
175
  rewardToken,
148
- rewardRate: parseFloat(pool.allocPoint) / totalAllocPoint * rewardPerSec
176
+ rewardRate: (parseFloat(pool.allocPoint) / totalAllocPoint) * rewardPerSec,
149
177
  });
150
178
  }
151
179
  }
@@ -156,7 +184,7 @@ exports.fetchImpermaxChefRewardRates = fetchImpermaxChefRewardRates;
156
184
  // Uniswap APR
157
185
  function fetchPastVolume(amm, lendingPools, seconds) {
158
186
  return __awaiter(this, void 0, void 0, function* () {
159
- const timestamp = Math.floor((new Date).getTime() / 1000);
187
+ const timestamp = Math.floor(new Date().getTime() / 1000);
160
188
  const blockNumber = yield this.fetchBlockByTimestamp(timestamp - seconds);
161
189
  if (!blockNumber)
162
190
  return {};
@@ -168,7 +196,7 @@ function fetchPastVolume(amm, lendingPools, seconds) {
168
196
  // Since it's not part of core, one endpoint should suffice
169
197
  if (!query.pastVolumeQuery)
170
198
  return {};
171
- result = yield this.apolloFetcher(subgraph, query.pastVolumeQuery(blockNumber, lendingPools.map(lendingPool => lendingPool.pair.uniswapV2PairAddress)));
199
+ result = yield this.apolloFetcher(subgraph, query.pastVolumeQuery(blockNumber, lendingPools.map((lendingPool) => lendingPool.pair.uniswapV2PairAddress)));
172
200
  for (const pair of result.data.pairs) {
173
201
  pastVolume[pair.id] = parseInt(pair.volumeUSD);
174
202
  }
@@ -191,7 +219,7 @@ function fetchCurrentVolumeAndReserves(amm, lendingPools) {
191
219
  // Since it's not part of core, one endpoint should suffice
192
220
  if (!query.currentVolumeAndReservesQuery)
193
221
  return { currentReserve, currentVolume };
194
- result = yield this.apolloFetcher(subgraph, query.currentVolumeAndReservesQuery(lendingPools.map(lendingPool => lendingPool.pair.uniswapV2PairAddress)));
222
+ result = yield this.apolloFetcher(subgraph, query.currentVolumeAndReservesQuery(lendingPools.map((lendingPool) => lendingPool.pair.uniswapV2PairAddress)));
195
223
  for (const pair of result.data.pairs) {
196
224
  currentVolume[pair.id] = parseInt(pair.volumeUSD);
197
225
  currentReserve[pair.id] = parseInt(pair.reserveUSD);
@@ -218,12 +246,12 @@ function fetchUniswapAPR(lendingPoolsByAmm, seconds = 60 * 60 * 24 * 7) {
218
246
  promises.push(Promise.all([
219
247
  amm,
220
248
  this.fetchPastVolume(amm, lendingPools, seconds),
221
- this.fetchCurrentVolumeAndReserves(amm, lendingPools)
249
+ this.fetchCurrentVolumeAndReserves(amm, lendingPools),
222
250
  ]));
223
251
  }
224
252
  const ammsData = yield Promise.all(promises);
225
253
  for (const data of ammsData) {
226
- const [amm, pastVolume, { currentVolume, currentReserve },] = data;
254
+ const [amm, pastVolume, { currentVolume, currentReserve }] = data;
227
255
  const lendingPools = lendingPoolsByAmm[amm];
228
256
  if (lendingPools === undefined)
229
257
  continue;
@@ -233,11 +261,13 @@ function fetchUniswapAPR(lendingPoolsByAmm, seconds = 60 * 60 * 24 * 7) {
233
261
  uniswapAPR[lendingPool.id] = 0;
234
262
  continue;
235
263
  }
236
- const cumVolumePast = pastVolume[uniswapV2PairAddress] ? pastVolume[uniswapV2PairAddress] : 0;
264
+ const cumVolumePast = pastVolume[uniswapV2PairAddress]
265
+ ? pastVolume[uniswapV2PairAddress]
266
+ : 0;
237
267
  const cumVolumeNow = currentVolume[uniswapV2PairAddress];
238
268
  const reserveUSD = currentReserve[uniswapV2PairAddress];
239
269
  const volumeUSD = cumVolumeNow - cumVolumePast;
240
- const yearlyVolume = volumeUSD * SECONDS_IN_YEAR / seconds;
270
+ const yearlyVolume = (volumeUSD * SECONDS_IN_YEAR) / seconds;
241
271
  const yearlyFee = yearlyVolume * amms_1.AMM_LP_FEE[this.network][amm];
242
272
  uniswapAPR[lendingPool.id] = yearlyFee / reserveUSD;
243
273
  }
@@ -276,11 +306,14 @@ function initializeLendingPoolsData() {
276
306
  for (const lendingPool of lendingPools[factory]) {
277
307
  lendingPool.pair.uniswapAPR = uniswapAPR[lendingPool.id] || 0;
278
308
  if (impermaxChefRewardRates) {
279
- lendingPool.borrowable0.rewards = impermaxChefRewardRates[lendingPool.borrowable0.id];
280
- lendingPool.borrowable1.rewards = impermaxChefRewardRates[lendingPool.borrowable1.id];
309
+ lendingPool.borrowable0.rewards =
310
+ impermaxChefRewardRates[lendingPool.borrowable0.id];
311
+ lendingPool.borrowable1.rewards =
312
+ impermaxChefRewardRates[lendingPool.borrowable1.id];
281
313
  }
282
314
  // If one of the price of the 2 tokens is 0, fix the collateral price by doubling it
283
- if (parseFloat(lendingPool.borrowable0.underlying.derivedUSD) === 0 || parseFloat(lendingPool.borrowable1.underlying.derivedUSD) === 0) {
315
+ if (parseFloat(lendingPool.borrowable0.underlying.derivedUSD) === 0 ||
316
+ parseFloat(lendingPool.borrowable1.underlying.derivedUSD) === 0) {
284
317
  lendingPool.pair.derivedUSD = (parseFloat(lendingPool.pair.derivedUSD) * 2).toString();
285
318
  }
286
319
  if (!lendingPoolsData[factory])
@@ -310,17 +343,16 @@ function initializeLendingPoolsData() {
310
343
  for (const factory in lendingPools) {
311
344
  this.lendingPools[factory] = {};
312
345
  for (const lendingPool of lendingPools[factory]) {
313
- this.lendingPools[factory][lendingPool.id] =
314
- new lendingPool_1.default(this, factory, lendingPool.id);
346
+ this.lendingPools[factory][lendingPool.id] = new lendingPool_1.default(this, factory, lendingPool.id);
315
347
  }
316
348
  }
317
349
  // Quickfix for MIM and SPELL
318
350
  if (this.network === types_1.Networks.Arbitrum) {
319
351
  // const ETH_MIM = '0xa6e69dd0c36f3b59539e2c7afd274ef91b5c70f9';
320
352
  // const ETH_SPELL = '0x35b44b303eacb71114aa62fe8dae6f9c5de0f680';
321
- const ETH_gGOHM = '0x6d94f7e67c6ae0b0257c35754e059fdfb249d998';
322
- const ETH_MAGIC = '0x88a0b00bbe918ee00e3482f71962070dc052984b';
323
- const ETH_RDNT = '0xfb468ad210d427d65c9a765a480649d5754ca325';
353
+ const ETH_gGOHM = "0x6d94f7e67c6ae0b0257c35754e059fdfb249d998";
354
+ const ETH_MAGIC = "0x88a0b00bbe918ee00e3482f71962070dc052984b";
355
+ const ETH_RDNT = "0xfb468ad210d427d65c9a765a480649d5754ca325";
324
356
  // const LIZ_LIZ_ETH = '0x699c5e23357ab1bf658bd0b38070d746e37671f3';
325
357
  // const LIZ_ETH_USDC = '0x1229aac120ae75301ab1c3a2a04ec14183493584';
326
358
  // const LIZ_ETH_BTC = '0xce009c44e1645bc6d19c90ba440c618a42ae581d';
@@ -331,7 +363,7 @@ function initializeLendingPoolsData() {
331
363
  //lendingPoolsData[Factory.V2V1_1][ETH_SPELL].pair.rewards[0].rewardRate = '8.44';
332
364
  //lendingPoolsData[Factory.V2V1_1][ETH_MIM].pair.rewards[0].rewardRate = '30.64';
333
365
  //lendingPoolsData[Factory.V2V1_1][ETH_gGOHM].pair.rewards[0].rewardRate = '0.000009129';
334
- lendingPoolsDataV2V1_1[ETH_MAGIC].pair.rewards[0].rewardRate = '0.135';
366
+ lendingPoolsDataV2V1_1[ETH_MAGIC].pair.rewards[0].rewardRate = "0.135";
335
367
  }
336
368
  }
337
369
  const lendingPoolsDataV2V2 = lendingPoolsData[types_1.Factory.V2V2];
@@ -375,33 +407,34 @@ function initializeLendingPoolsData() {
375
407
  if (this.network === types_1.Networks.Polygon) {
376
408
  const lendingPoolsDataV2V2 = lendingPoolsData[types_1.Factory.V2V2];
377
409
  if (lendingPoolsDataV2V2) {
378
- const GNS_DAI = '0xf9221c5edc736d26ffc4ddccddfa15a4b958862e';
410
+ const GNS_DAI = "0xf9221c5edc736d26ffc4ddccddfa15a4b958862e";
379
411
  if (lendingPoolsDataV2V2[GNS_DAI]) {
380
412
  const GNS = lendingPoolsDataV2V2[GNS_DAI].borrowable1.underlying;
381
413
  lendingPoolsDataV2V2[GNS_DAI].pair.rewards[0] = {
382
- id: '',
414
+ id: "",
383
415
  rewardsToken: GNS,
384
- rewardRate: '0.00608',
385
- periodFinish: '0',
416
+ rewardRate: "0.00608",
417
+ periodFinish: "0",
386
418
  };
387
- lendingPoolsDataV2V2[GNS_DAI].pair.stakedTotalSupply = '1640000';
419
+ lendingPoolsDataV2V2[GNS_DAI].pair.stakedTotalSupply = "1640000";
388
420
  }
389
421
  }
390
422
  }
391
423
  if (this.network === types_1.Networks.Avalanche) {
392
424
  const lendingPoolsDataV2V1_2 = lendingPoolsData[types_1.Factory.V2V1_2];
393
425
  if (lendingPoolsDataV2V1_2) {
394
- const QI_AVAX = '0x3e2a4dcd46e0e339aec603080d90bd939a163062';
426
+ const QI_AVAX = "0x3e2a4dcd46e0e339aec603080d90bd939a163062";
395
427
  if (lendingPoolsDataV2V1_2[QI_AVAX]) {
396
428
  const QI = lendingPoolsDataV2V1_2[QI_AVAX].borrowable0.underlying;
397
429
  lendingPoolsDataV2V1_2[QI_AVAX].pair.rewards[0] = {
398
- id: '',
430
+ id: "",
399
431
  rewardsToken: QI,
400
- rewardRate: '4.54',
401
- periodFinish: '0',
432
+ rewardRate: "4.54",
433
+ periodFinish: "0",
402
434
  };
403
435
  // TODO -> this is wrong
404
- lendingPoolsDataV2V1_2[QI_AVAX].pair.stakedTotalSupply = '0.000000992210460243'; //https://snowtrace.io/token/0xe530dc2095ef5653205cf5ea79f8979a7028065c?a=0x784da19e61cf348a8c54547531795ecfee2affd1
436
+ lendingPoolsDataV2V1_2[QI_AVAX].pair.stakedTotalSupply =
437
+ "0.000000992210460243"; //https://snowtrace.io/token/0xe530dc2095ef5653205cf5ea79f8979a7028065c?a=0x784da19e61cf348a8c54547531795ecfee2affd1
405
438
  }
406
439
  }
407
440
  /*REWARD STOPPED const sAVAX_AVAX = '0x5b588f4481035b0f765393fc9f4752615a6d0498';
@@ -472,7 +505,7 @@ function initializeTvlData() {
472
505
  types_1.Networks.Base,
473
506
  types_1.Networks.Scroll,
474
507
  types_1.Networks.Real,
475
- types_1.Networks.Blast
508
+ types_1.Networks.Blast,
476
509
  ]; // exclude ropsten
477
510
  const calls = [];
478
511
  for (const network of networks) {
@@ -605,22 +638,28 @@ function initializeUserData(account) {
605
638
  const underlyingAddress = supplyPositions.borrowable.underlying.id;
606
639
  const borrowableA = (yield this.getLendingPool(factory, uniswapV2PairAddress)).getPoolToken(types_1.PoolTokenType.BorrowableA);
607
640
  const addressA = yield borrowableA.getUnderlyingAddress();
608
- const poolTokenType = underlyingAddress === addressA ? types_1.PoolTokenType.BorrowableA : types_1.PoolTokenType.BorrowableB;
641
+ const poolTokenType = underlyingAddress === addressA
642
+ ? types_1.PoolTokenType.BorrowableA
643
+ : types_1.PoolTokenType.BorrowableB;
609
644
  const resultOfFactory = result[factory];
610
645
  if (!(uniswapV2PairAddress in resultOfFactory.supplyPositions))
611
646
  resultOfFactory.supplyPositions[uniswapV2PairAddress] = {};
612
- resultOfFactory.supplyPositions[uniswapV2PairAddress][poolTokenType] = supplyPositions;
647
+ resultOfFactory.supplyPositions[uniswapV2PairAddress][poolTokenType] =
648
+ supplyPositions;
613
649
  }
614
650
  for (const borrowPositions of rawUserData.borrowPositions) {
615
651
  const uniswapV2PairAddress = borrowPositions.borrowable.lendingPool.id;
616
652
  const underlyingAddress = borrowPositions.borrowable.underlying.id;
617
653
  const borrowableA = (yield this.getLendingPool(factory, uniswapV2PairAddress)).getPoolToken(types_1.PoolTokenType.BorrowableA);
618
654
  const addressA = yield borrowableA.getUnderlyingAddress();
619
- const poolTokenType = underlyingAddress === addressA ? types_1.PoolTokenType.BorrowableA : types_1.PoolTokenType.BorrowableB;
655
+ const poolTokenType = underlyingAddress === addressA
656
+ ? types_1.PoolTokenType.BorrowableA
657
+ : types_1.PoolTokenType.BorrowableB;
620
658
  const resultOfFactory = result[factory];
621
659
  if (!(uniswapV2PairAddress in resultOfFactory.borrowPositions))
622
660
  resultOfFactory.borrowPositions[uniswapV2PairAddress] = {};
623
- resultOfFactory.borrowPositions[uniswapV2PairAddress][poolTokenType] = borrowPositions;
661
+ resultOfFactory.borrowPositions[uniswapV2PairAddress][poolTokenType] =
662
+ borrowPositions;
624
663
  }
625
664
  }
626
665
  return result;
@@ -656,48 +695,51 @@ exports.getXimxData = getXimxData;
656
695
  /**
657
696
  * Lending Vault
658
697
  **/
659
- function fetchLendingVaults() {
660
- return __awaiter(this, void 0, void 0, function* () {
661
- const subgraph = subgraphs_1.LENDING_VAULT_SUBGRAPH_URL[this.network];
662
- const query = queries_1.QueryBuilderFactory.getQuery(subgraph);
663
- const result = yield this.apolloFetcher(subgraph, query.lendingVaultsQuery([]));
664
- return result.data.lendingVaults;
665
- });
666
- }
667
- exports.fetchLendingVaults = fetchLendingVaults;
668
- function initializeLendingVaultsData() {
698
+ function initializeVaultsData() {
669
699
  return __awaiter(this, void 0, void 0, function* () {
670
- const lendingVaultsData = {};
671
- const lendingVaults = yield this.fetchLendingVaults();
672
- // Organize lending vaults data
673
- for (const lendingVault of lendingVaults) {
674
- lendingVaultsData[lendingVault.id] = lendingVault;
700
+ const vaultsData = {};
701
+ const vaults = yield this.fetchVaults();
702
+ // Put all vaults in one map, we can destrucutre later as we know
703
+ // which vault is whcih type from subgraphs
704
+ for (const vaultType in vaults) {
705
+ const vaultsOfType = vaults[vaultType];
706
+ for (const vault of vaultsOfType) {
707
+ vaultsData[vault.id] = vault;
708
+ }
675
709
  }
676
- // Initialize OffchainLendingVault objects
677
710
  this.vaults = {};
678
- for (const lendingVault of lendingVaults) {
679
- this.vaults[lendingVault.id] =
680
- new offchainVault_1.default(this, lendingVault.id);
711
+ for (const vault of Object.values(vaultsData)) {
712
+ switch (vault.vaultType) {
713
+ case types_1.VaultType.LENDING:
714
+ this.vaults[vault.id] = new vault_1.OffchainLendingVault(this, vault.id);
715
+ break;
716
+ case types_1.VaultType.HEDGED:
717
+ this.vaults[vault.id] = new vault_1.OffchainHedgedVault(this, vault.id);
718
+ break;
719
+ case types_1.VaultType.LEVERAGED:
720
+ this.vaults[vault.id] = new vault_1.OffchainLeveragedVault(this, vault.id);
721
+ break;
722
+ }
681
723
  }
682
- return lendingVaultsData;
724
+ return vaultsData;
683
725
  });
684
726
  }
685
- exports.initializeLendingVaultsData = initializeLendingVaultsData;
686
- function getLendingVaultsData() {
727
+ exports.initializeVaultsData = initializeVaultsData;
728
+ function getVaultsData() {
687
729
  return __awaiter(this, void 0, void 0, function* () {
688
- if (!this.lendingVaultsData)
689
- this.lendingVaultsData = this.initializeLendingVaultsData();
690
- return this.lendingVaultsData;
730
+ if (!this.vaultsData)
731
+ this.vaultsData = this.initializeVaultsData();
732
+ return this.vaultsData;
691
733
  });
692
734
  }
693
- exports.getLendingVaultsData = getLendingVaultsData;
694
- function getLendingVaultData(lendingVaultAddress) {
735
+ exports.getVaultsData = getVaultsData;
736
+ function getVaultData(vaultAddress) {
695
737
  return __awaiter(this, void 0, void 0, function* () {
696
- const lendingVaultsData = yield this.getLendingVaultsData();
697
- return lendingVaultsData[lendingVaultAddress.toLowerCase()];
738
+ const vaultsData = yield this.getVaultsData();
739
+ return vaultsData[vaultAddress.toLowerCase()];
698
740
  });
699
741
  }
700
- exports.getLendingVaultData = getLendingVaultData;
742
+ exports.getVaultData = getVaultData;
701
743
  /**
702
744
  * Whitelist
703
745
  */
@@ -757,36 +799,56 @@ exports.getWhitelistState = getWhitelistState;
757
799
  /**
758
800
  * User Data
759
801
  */
760
- function fetchLendingVaultsUserData(account) {
802
+ function fetchVaultsUserData(account) {
761
803
  return __awaiter(this, void 0, void 0, function* () {
762
- const subgraph = subgraphs_1.LENDING_VAULT_SUBGRAPH_URL[this.network];
763
- const query = queries_1.QueryBuilderFactory.getQuery(subgraph);
764
- const result = yield this.apolloFetcher(subgraph, query.lendingVaultsUserQuery(account));
765
- const user = result.data.user;
766
- if (!user)
767
- return null;
768
- return result.data.user.positions;
804
+ const calls = [];
805
+ let vaultType;
806
+ // Collect all fetch promises
807
+ for (vaultType in subgraphs_1.VAULT_SUBGRAPH_URL[this.network]) {
808
+ const subgraphs = subgraphs_1.VAULT_SUBGRAPH_URL[this.network][vaultType];
809
+ if (!subgraphs || subgraphs.length === 0)
810
+ continue;
811
+ calls.push(this.endpointManager.fetch(subgraphs, this.network, (queryBuilder) => queryBuilder.vaultsUserQuery(account)));
812
+ }
813
+ const results = yield Promise.all(calls);
814
+ const userVaultData = {};
815
+ let i = 0;
816
+ for (vaultType in subgraphs_1.VAULT_SUBGRAPH_URL[this.network]) {
817
+ const subgraphs = subgraphs_1.VAULT_SUBGRAPH_URL[this.network][vaultType];
818
+ if (!subgraphs || subgraphs.length === 0)
819
+ continue;
820
+ const result = results[i++];
821
+ const user = result.data.user;
822
+ if (user && user.positions) {
823
+ userVaultData[vaultType] = user.positions.map((position) => (Object.assign(Object.assign({}, position), { vaultType })));
824
+ }
825
+ }
826
+ return userVaultData;
769
827
  });
770
828
  }
771
- exports.fetchLendingVaultsUserData = fetchLendingVaultsUserData;
772
- function initializeLendingVaultsUserData(account) {
829
+ exports.fetchVaultsUserData = fetchVaultsUserData;
830
+ function initializeVaultsUserData(account) {
773
831
  return __awaiter(this, void 0, void 0, function* () {
774
- const positions = yield this.fetchLendingVaultsUserData(account);
775
- if (!positions)
776
- return null;
832
+ const userVaultData = yield this.fetchVaultsUserData(account);
777
833
  const result = {};
778
- for (const position of positions) {
779
- result[position.lendingVault.id] = position;
834
+ for (const vaultType in userVaultData) {
835
+ const positions = userVaultData[vaultType];
836
+ if (!positions)
837
+ continue;
838
+ result[vaultType] = {};
839
+ for (const position of positions) {
840
+ result[vaultType][position.lendingVault.id] = position;
841
+ }
780
842
  }
781
843
  return result;
782
844
  });
783
845
  }
784
- exports.initializeLendingVaultsUserData = initializeLendingVaultsUserData;
785
- function getLendingVaultsUserData(account) {
846
+ exports.initializeVaultsUserData = initializeVaultsUserData;
847
+ function getVaultsUserData(account) {
786
848
  return __awaiter(this, void 0, void 0, function* () {
787
- if (!(account in this.lendingVaultsUsersData))
788
- this.lendingVaultsUsersData[account] = this.initializeLendingVaultsUserData(account);
789
- return yield this.lendingVaultsUsersData[account];
849
+ if (!(account in this.vaultsUsersData))
850
+ this.vaultsUsersData[account] = this.initializeVaultsUserData(account);
851
+ return (yield this.vaultsUsersData[account]) || {};
790
852
  });
791
853
  }
792
- exports.getLendingVaultsUserData = getLendingVaultsUserData;
854
+ exports.getVaultsUserData = getVaultsUserData;
@@ -1,11 +1,15 @@
1
- import { NetworkIndex, Networks } from '../config/types';
1
+ import { NetworkIndex, Networks, VaultType } from "../config/types";
2
2
  import Offchain from "./offchain";
3
- import OffchainVault, { VaultType } from "./vault/offchainVault";
3
+ import OffchainVault from "./vault/offchainVault";
4
4
  import { Amms } from "../config/amms";
5
5
  import { Farms } from "../config/farms";
6
6
  import { RiskLevel } from "./vault/offchainLendingVault";
7
7
  import OffchainLendingPool from "./lendingPool";
8
8
  import { LendingPoolVersion } from "./lendingPool/offchainLendingPool";
9
+ export declare enum SortDirection {
10
+ ASC = "asc",
11
+ DESC = "desc"
12
+ }
9
13
  export declare enum VaultOrderBy {
10
14
  TVL = 0,
11
15
  APR = 1,
@@ -45,6 +49,7 @@ export default class OffchainMultichain {
45
49
  private constructor();
46
50
  static get instance(): OffchainMultichain;
47
51
  getOffchain(network: Networks): Offchain;
48
- getVaultList(params?: VaultListParams, orderBy?: VaultOrderBy): Promise<Array<OffchainVault>>;
52
+ getVaultList(params?: VaultListParams): Promise<Array<OffchainVault>>;
53
+ networkHasVault(network: Networks): boolean;
49
54
  getLendingPoolList(params?: LendingPoolListParams, orderBy?: LendingPoolListOrderBy): Promise<Array<OffchainLendingPool>>;
50
55
  }
@@ -24,14 +24,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
24
24
  };
25
25
  var _a, _OffchainMultichain_instance;
26
26
  Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.LendingPoolListOrderBy = exports.VaultOrderBy = void 0;
27
+ exports.LendingPoolListOrderBy = exports.VaultOrderBy = exports.SortDirection = void 0;
28
+ const types_1 = require("../config/types");
28
29
  const offchain_1 = __importDefault(require("./offchain"));
30
+ const subgraphs_1 = require("../config/subgraphs");
31
+ // For vaults and pools
32
+ var SortDirection;
33
+ (function (SortDirection) {
34
+ SortDirection["ASC"] = "asc";
35
+ SortDirection["DESC"] = "desc";
36
+ })(SortDirection = exports.SortDirection || (exports.SortDirection = {}));
29
37
  var VaultOrderBy;
30
38
  (function (VaultOrderBy) {
31
39
  VaultOrderBy[VaultOrderBy["TVL"] = 0] = "TVL";
32
40
  VaultOrderBy[VaultOrderBy["APR"] = 1] = "APR";
33
41
  VaultOrderBy[VaultOrderBy["DEPOSITED"] = 2] = "DEPOSITED";
34
42
  })(VaultOrderBy = exports.VaultOrderBy || (exports.VaultOrderBy = {}));
43
+ // Pools //
35
44
  var LendingPoolListOrderBy;
36
45
  (function (LendingPoolListOrderBy) {
37
46
  LendingPoolListOrderBy[LendingPoolListOrderBy["TVL"] = 0] = "TVL";
@@ -57,12 +66,39 @@ class OffchainMultichain {
57
66
  this.offchains[network] = new offchain_1.default(this, network);
58
67
  return this.offchains[network];
59
68
  }
60
- getVaultList(params = {}, orderBy = VaultOrderBy.TVL) {
69
+ /*--------------------------------------------------------*
70
+ * Vaults
71
+ *--------------------------------------------------------*/
72
+ getVaultList(params = {}) {
61
73
  return __awaiter(this, void 0, void 0, function* () {
62
- // TODO FILL WITH FAKE DATA
63
- return [];
74
+ // Get networks passed, if empty get all
75
+ const allNetworks = params.networks || Object.values(types_1.Networks);
76
+ // Filter out networks without vaults
77
+ const networksWithVaults = allNetworks.filter((network) => this.networkHasVault(network));
78
+ // Loop through all the vaults in `allNetworks`
79
+ const allVaults = [];
80
+ for (const network of networksWithVaults) {
81
+ const offchain = this.getOffchain(network);
82
+ const vaultsData = yield offchain.getVaultsData();
83
+ // Filter out vaults based on vaultType (if passed)
84
+ for (const address in vaultsData) {
85
+ const vault = yield offchain.getVault(address);
86
+ if (params.type && vault.getVaultType() !== params.type)
87
+ continue;
88
+ allVaults.push(vault);
89
+ }
90
+ }
91
+ return allVaults;
64
92
  });
65
93
  }
94
+ // Helpful for frontend UI thing
95
+ networkHasVault(network) {
96
+ return Object.keys(subgraphs_1.VAULT_SUBGRAPH_URL[network]).length > 0;
97
+ }
98
+ /*--------------------------------------------------------*
99
+ * Lending Pools
100
+ *--------------------------------------------------------*/
101
+ // private async getVaultSortValue( vault: OffchainVault, orderBy: VaultOrderBy,): Promise<number> { }
66
102
  getLendingPoolList(params = {}, orderBy = LendingPoolListOrderBy.TVL) {
67
103
  return __awaiter(this, void 0, void 0, function* () {
68
104
  // TODO FILL WITH FAKE DATA
@@ -1,4 +1,4 @@
1
- import { Address, AddressIndex, PoolTokenType, ProposalState, WhitelistState } from '../config/types';
1
+ import { Address, AddressIndex, PoolTokenType, ProposalState, WhitelistState, VaultType } from '../config/types';
2
2
  export interface PoolTokenData {
3
3
  id: Address;
4
4
  totalBalance: string;
@@ -165,7 +165,15 @@ export interface LendingVaultData extends PoolTokenData {
165
165
  reserveFactor: string;
166
166
  availableLiquidity: string;
167
167
  lastUpdate: string;
168
+ vaultType: VaultType.LENDING;
168
169
  }
170
+ export interface HedgedVaultData extends PoolTokenData {
171
+ vaultType: VaultType.HEDGED;
172
+ }
173
+ export interface LeveragedVaultData extends PoolTokenData {
174
+ vaultType: VaultType.LEVERAGED;
175
+ }
176
+ export type VaultData = LendingVaultData | HedgedVaultData | LeveragedVaultData;
169
177
  export interface VaultPosition {
170
178
  tokenBalance: string;
171
179
  lastExchangeRate: string;
@@ -1,4 +1,4 @@
1
- import { Address, Factory, Networks } from "../../../../config/types";
1
+ import { Address, Factory, Networks, VaultType } from "../../../../config/types";
2
2
  import { IQueryBuilder } from "../../interfaces/query-builder";
3
3
  export declare class PonderQueryBuilder implements IQueryBuilder {
4
4
  blockQuery(): import("graphql").DocumentNode;
@@ -6,8 +6,8 @@ export declare class PonderQueryBuilder implements IQueryBuilder {
6
6
  lendingPoolsQuery(factory: Factory, addressesFilter: Address[], network: Networks): import("graphql").DocumentNode;
7
7
  userQuery(account: Address, network: Networks, factory: Factory): import("graphql").DocumentNode;
8
8
  tvlQuery(): import("graphql").DocumentNode;
9
- lendingVaultsUserQuery(account: Address): import("graphql").DocumentNode;
10
- lendingVaultsQuery(addressesFilter: Address[]): import("graphql").DocumentNode;
9
+ vaultsUserQuery(account: Address): import("graphql").DocumentNode;
10
+ vaultsQuery(vaultType: VaultType, addressesFilter: Address[]): import("graphql").DocumentNode;
11
11
  proposalsMetaQuery(rangeBegin: any, rangeLength: any, descending: any): import("graphql").DocumentNode;
12
12
  proposalQuery(id: number): import("graphql").DocumentNode;
13
13
  ximxQuery(): import("graphql").DocumentNode;
@@ -7,6 +7,7 @@ exports.PonderQueryBuilder = void 0;
7
7
  const graphql_tag_1 = __importDefault(require("graphql-tag"));
8
8
  const factories_1 = require("../../../../config/factories");
9
9
  const impermax_factories_1 = require("../../../../config/contracts/impermax-factories");
10
+ // TODO: Might need to separate Vaults query based on vault type, maybe not.
10
11
  class PonderQueryBuilder {
11
12
  /*-----------------------------*
12
13
  * 1. API Health
@@ -180,7 +181,7 @@ class PonderQueryBuilder {
180
181
  /*-----------------------------*
181
182
  * Lending vaults
182
183
  *-----------------------------*/
183
- lendingVaultsUserQuery(account) {
184
+ vaultsUserQuery(account) {
184
185
  return (0, graphql_tag_1.default) `{
185
186
  user(id: "${account.toLowerCase()}") {
186
187
  positions(first:1000) {
@@ -194,7 +195,8 @@ class PonderQueryBuilder {
194
195
  }
195
196
  }`;
196
197
  }
197
- lendingVaultsQuery(addressesFilter) {
198
+ vaultsQuery(vaultType, addressesFilter) {
199
+ // do something here for difference kind of vault type, currently only lending
198
200
  const id_in_string = addressesFilter.length > 0 ? `where: {id_in: ["${addressesFilter.join('","').toLowerCase()}"]}` : "";
199
201
  return (0, graphql_tag_1.default) `{
200
202
  lendingVaults(first: 1000 ${id_in_string}) {
@@ -1,4 +1,4 @@
1
- import { Address, Factory, Networks } from "../../../../config/types";
1
+ import { Address, Factory, Networks, VaultType } from "../../../../config/types";
2
2
  import { IQueryBuilder } from "../../interfaces/query-builder";
3
3
  export declare class TheGraphQueryBuilder implements IQueryBuilder {
4
4
  blockQuery(timestamp: number): import("graphql").DocumentNode;
@@ -6,8 +6,8 @@ export declare class TheGraphQueryBuilder implements IQueryBuilder {
6
6
  lendingPoolsQuery(factory: Factory, addressesFilter: Address[]): import("graphql").DocumentNode;
7
7
  userQuery(account: Address, network: Networks, factory: Factory): import("graphql").DocumentNode;
8
8
  tvlQuery(): import("graphql").DocumentNode;
9
- lendingVaultsQuery(addressesFilter: Address[]): import("graphql").DocumentNode;
10
- lendingVaultsUserQuery(account: Address): import("graphql").DocumentNode;
9
+ vaultsQuery(vaultType: VaultType, addressesFilter: Address[]): import("graphql").DocumentNode;
10
+ vaultsUserQuery(account: Address): import("graphql").DocumentNode;
11
11
  proposalsMetaQuery(rangeBegin: any, rangeLength: any, descending: any): import("graphql").DocumentNode;
12
12
  proposalQuery(id: number): import("graphql").DocumentNode;
13
13
  ximxQuery(): import("graphql").DocumentNode;