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.
- package/lib/config/subgraphs.d.ts +2 -2
- package/lib/config/subgraphs.js +40 -23
- package/lib/config/types.d.ts +10 -0
- package/lib/config/types.js +7 -1
- package/lib/index.d.ts +4 -2
- package/lib/index.js +10 -2
- package/lib/offchain/account/offchainAccount.d.ts +6 -6
- package/lib/offchain/account/offchainAccount.js +33 -24
- package/lib/offchain/account/vault/offchainAccountVault.js +10 -3
- package/lib/offchain/index.d.ts +2 -1
- package/lib/offchain/index.js +3 -1
- package/lib/offchain/offchain.d.ts +13 -10
- package/lib/offchain/offchain.js +18 -11
- package/lib/offchain/offchainInitializer.d.ts +11 -11
- package/lib/offchain/offchainInitializer.js +151 -89
- package/lib/offchain/offchainMultichain.d.ts +8 -3
- package/lib/offchain/offchainMultichain.js +40 -4
- package/lib/offchain/offchainTypes.d.ts +9 -1
- package/lib/offchain/queries/apis/ponder/index.d.ts +3 -3
- package/lib/offchain/queries/apis/ponder/index.js +4 -2
- package/lib/offchain/queries/apis/thegraph/index.d.ts +3 -3
- package/lib/offchain/queries/apis/thegraph/index.js +4 -2
- package/lib/offchain/queries/interfaces/query-builder.d.ts +3 -3
- package/lib/offchain/vault/offchainHedgedVault.js +2 -25
- package/lib/offchain/vault/offchainLendingVault.js +6 -25
- package/lib/offchain/vault/offchainLeveragedVault.js +2 -25
- package/lib/offchain/vault/offchainVault.d.ts +16 -5
- package/lib/offchain/vault/offchainVault.js +18 -8
- package/lib/onchain/account/onchainAccountLendingVault.js +1 -1
- package/lib/onchain/onchainLendingVault.js +1 -1
- 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.
|
|
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
|
|
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:
|
|
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(
|
|
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(
|
|
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 }
|
|
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]
|
|
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 =
|
|
280
|
-
|
|
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 ||
|
|
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 =
|
|
322
|
-
const ETH_MAGIC =
|
|
323
|
-
const ETH_RDNT =
|
|
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 =
|
|
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 =
|
|
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:
|
|
385
|
-
periodFinish:
|
|
416
|
+
rewardRate: "0.00608",
|
|
417
|
+
periodFinish: "0",
|
|
386
418
|
};
|
|
387
|
-
lendingPoolsDataV2V2[GNS_DAI].pair.stakedTotalSupply =
|
|
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 =
|
|
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:
|
|
401
|
-
periodFinish:
|
|
432
|
+
rewardRate: "4.54",
|
|
433
|
+
periodFinish: "0",
|
|
402
434
|
};
|
|
403
435
|
// TODO -> this is wrong
|
|
404
|
-
lendingPoolsDataV2V1_2[QI_AVAX].pair.stakedTotalSupply =
|
|
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
|
|
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] =
|
|
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
|
|
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] =
|
|
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
|
|
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
|
|
671
|
-
const
|
|
672
|
-
//
|
|
673
|
-
|
|
674
|
-
|
|
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
|
|
679
|
-
|
|
680
|
-
|
|
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
|
|
724
|
+
return vaultsData;
|
|
683
725
|
});
|
|
684
726
|
}
|
|
685
|
-
exports.
|
|
686
|
-
function
|
|
727
|
+
exports.initializeVaultsData = initializeVaultsData;
|
|
728
|
+
function getVaultsData() {
|
|
687
729
|
return __awaiter(this, void 0, void 0, function* () {
|
|
688
|
-
if (!this.
|
|
689
|
-
this.
|
|
690
|
-
return this.
|
|
730
|
+
if (!this.vaultsData)
|
|
731
|
+
this.vaultsData = this.initializeVaultsData();
|
|
732
|
+
return this.vaultsData;
|
|
691
733
|
});
|
|
692
734
|
}
|
|
693
|
-
exports.
|
|
694
|
-
function
|
|
735
|
+
exports.getVaultsData = getVaultsData;
|
|
736
|
+
function getVaultData(vaultAddress) {
|
|
695
737
|
return __awaiter(this, void 0, void 0, function* () {
|
|
696
|
-
const
|
|
697
|
-
return
|
|
738
|
+
const vaultsData = yield this.getVaultsData();
|
|
739
|
+
return vaultsData[vaultAddress.toLowerCase()];
|
|
698
740
|
});
|
|
699
741
|
}
|
|
700
|
-
exports.
|
|
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
|
|
802
|
+
function fetchVaultsUserData(account) {
|
|
761
803
|
return __awaiter(this, void 0, void 0, function* () {
|
|
762
|
-
const
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
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.
|
|
772
|
-
function
|
|
829
|
+
exports.fetchVaultsUserData = fetchVaultsUserData;
|
|
830
|
+
function initializeVaultsUserData(account) {
|
|
773
831
|
return __awaiter(this, void 0, void 0, function* () {
|
|
774
|
-
const
|
|
775
|
-
if (!positions)
|
|
776
|
-
return null;
|
|
832
|
+
const userVaultData = yield this.fetchVaultsUserData(account);
|
|
777
833
|
const result = {};
|
|
778
|
-
for (const
|
|
779
|
-
|
|
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.
|
|
785
|
-
function
|
|
846
|
+
exports.initializeVaultsUserData = initializeVaultsUserData;
|
|
847
|
+
function getVaultsUserData(account) {
|
|
786
848
|
return __awaiter(this, void 0, void 0, function* () {
|
|
787
|
-
if (!(account in this.
|
|
788
|
-
this.
|
|
789
|
-
return yield this.
|
|
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.
|
|
854
|
+
exports.getVaultsUserData = getVaultsUserData;
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { NetworkIndex, Networks } from
|
|
1
|
+
import { NetworkIndex, Networks, VaultType } from "../config/types";
|
|
2
2
|
import Offchain from "./offchain";
|
|
3
|
-
import 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
|
|
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
|
-
|
|
69
|
+
/*--------------------------------------------------------*
|
|
70
|
+
* Vaults
|
|
71
|
+
*--------------------------------------------------------*/
|
|
72
|
+
getVaultList(params = {}) {
|
|
61
73
|
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
//
|
|
63
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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;
|