@gainsnetwork/sdk 0.0.15 → 0.0.16-rc1

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,3 +1,3 @@
1
1
  import { TradeContainer } from "@/trade/types";
2
2
  import { Contracts } from "@/contracts/types";
3
- export declare const fetchOpenPairTrades: (contracts: Contracts, pairBatchSize?: number) => Promise<TradeContainer[]>;
3
+ export declare const fetchOpenPairTrades: (contracts: Contracts, pairBatchSize?: number, useMulticall?: boolean) => Promise<TradeContainer[]>;
@@ -10,7 +10,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.fetchOpenPairTrades = void 0;
13
- const fetchOpenPairTrades = (contracts, pairBatchSize = 10) => __awaiter(void 0, void 0, void 0, function* () {
13
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
14
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
15
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
16
+ const ethers_multicall_1 = require("ethers-multicall");
17
+ const fetchOpenPairTrades = (contracts, pairBatchSize = 50, useMulticall = false) => __awaiter(void 0, void 0, void 0, function* () {
14
18
  if (!contracts) {
15
19
  return [];
16
20
  }
@@ -20,7 +24,9 @@ const fetchOpenPairTrades = (contracts, pairBatchSize = 10) => __awaiter(void 0,
20
24
  let allOpenPairTrades = [];
21
25
  for (let batchStartPairIndex = 0; batchStartPairIndex < totalPairIndexes; batchStartPairIndex += pairBatchSize) {
22
26
  const batchEndPairIndex = Math.min(batchStartPairIndex + pairBatchSize - 1, totalPairIndexes);
23
- const openPairTradesBatch = yield fetchOpenPairTradesBatch(contracts, batchStartPairIndex, batchEndPairIndex);
27
+ const openPairTradesBatch = useMulticall
28
+ ? yield fetchOpenPairTradesBatchMulticall(contracts, batchStartPairIndex, batchEndPairIndex)
29
+ : yield fetchOpenPairTradesBatch(contracts, batchStartPairIndex, batchEndPairIndex);
24
30
  allOpenPairTrades = allOpenPairTrades.concat(openPairTradesBatch);
25
31
  }
26
32
  console.info(`Fetched ${allOpenPairTrades.length} total open pair trade(s).`);
@@ -33,7 +39,7 @@ const fetchOpenPairTrades = (contracts, pairBatchSize = 10) => __awaiter(void 0,
33
39
  });
34
40
  exports.fetchOpenPairTrades = fetchOpenPairTrades;
35
41
  const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __awaiter(void 0, void 0, void 0, function* () {
36
- const { gfarmTradingStorageV5: storageContract, gnsPairInfosV6_1: pairInfosContract } = contracts;
42
+ const { gfarmTradingStorageV5: storageContract, gnsPairInfosV6_1: pairInfosContract, } = contracts;
37
43
  const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
38
44
  const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
39
45
  const rawTrades = yield Promise.all(pairIndexesToFetch.map((pairIndex) => __awaiter(void 0, void 0, void 0, function* () {
@@ -69,12 +75,18 @@ const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __
69
75
  for (let tradeIndex = 0; tradeIndex < actualOpenTradesForTrader.length; tradeIndex++) {
70
76
  const tradeInfo = actualOpenTradesTradeInfos[tradeIndex];
71
77
  if (tradeInfo === undefined) {
72
- console.error("No trade info found for open trade while fetching open trades!", { trade: actualOpenTradesForTrader[tradeIndex] });
78
+ // console.error(
79
+ // "No trade info found for open trade while fetching open trades!",
80
+ // { trade: actualOpenTradesForTrader[tradeIndex] }
81
+ // );
73
82
  continue;
74
83
  }
75
84
  const tradeInitialAccFees = actualOpenTradesInitialAccFees[tradeIndex];
76
85
  if (tradeInitialAccFees === undefined) {
77
- console.error("No initial fees found for open trade while fetching open trades!", { trade: actualOpenTradesForTrader[tradeIndex] });
86
+ // console.error(
87
+ // "No initial fees found for open trade while fetching open trades!",
88
+ // { trade: actualOpenTradesForTrader[tradeIndex] }
89
+ // );
78
90
  continue;
79
91
  }
80
92
  const trade = actualOpenTradesForTrader[tradeIndex];
@@ -114,3 +126,77 @@ const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __
114
126
  const perPairTrades = rawTrades.reduce((a, b) => a.concat(b), []);
115
127
  return perPairTrades.reduce((a, b) => a.concat(b), []);
116
128
  });
129
+ const fetchOpenPairTradesBatchMulticall = (contracts, startPairIndex, endPairIndex) => __awaiter(void 0, void 0, void 0, function* () {
130
+ const { gfarmTradingStorageV5: storageContract, gnsPairInfosV6_1: pairInfosContract, } = contracts;
131
+ // Convert to Multicall for efficient RPC usage
132
+ const chainId = (yield storageContract.provider.getNetwork()).chainId;
133
+ const multicallProvider = new ethers_multicall_1.Provider(storageContract.provider, chainId);
134
+ const storageContractMulticall = new ethers_multicall_1.Contract(storageContract.address, [
135
+ ...storageContract.interface.fragments,
136
+ ]);
137
+ const pairInfosContractMulticall = new ethers_multicall_1.Contract(pairInfosContract.address, [
138
+ ...pairInfosContract.interface.fragments,
139
+ ]);
140
+ const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
141
+ const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
142
+ const mcPairTraderAddresses = yield multicallProvider.all(pairIndexesToFetch.map(pairIndex => storageContractMulticall.pairTradersArray(pairIndex)));
143
+ const mcFlatOpenTrades = yield multicallProvider.all(mcPairTraderAddresses
144
+ .map((pairTraderAddresses, _ix) => {
145
+ return pairTraderAddresses
146
+ .map((pairTraderAddress) => {
147
+ const openTradesCalls = new Array(maxTradesPerPair);
148
+ for (let pairTradeIndex = 0; pairTradeIndex < maxTradesPerPair; pairTradeIndex++) {
149
+ openTradesCalls[pairTradeIndex] =
150
+ storageContractMulticall.openTrades(pairTraderAddress, _ix + startPairIndex, pairTradeIndex);
151
+ }
152
+ return openTradesCalls;
153
+ })
154
+ .reduce((acc, val) => acc.concat(val), []);
155
+ })
156
+ .reduce((acc, val) => acc.concat(val), []));
157
+ const openTrades = mcFlatOpenTrades.filter(openTrade => openTrade[0] !== "0x0000000000000000000000000000000000000000");
158
+ const [openTradesTradeInfos, openTradesInitialAccFees] = yield Promise.all([
159
+ multicallProvider.all(openTrades.map(openTrade => storageContractMulticall.openTradesInfo(openTrade.trader, openTrade.pairIndex, openTrade.index))),
160
+ multicallProvider.all(openTrades.map(openTrade => pairInfosContractMulticall.tradeInitialAccFees(openTrade.trader, openTrade.pairIndex, openTrade.index))),
161
+ ]);
162
+ const finalTrades = new Array(openTrades.length);
163
+ for (let tradeIndex = 0; tradeIndex < openTradesTradeInfos.length; tradeIndex++) {
164
+ const tradeInfo = openTradesTradeInfos[tradeIndex];
165
+ if (tradeInfo === undefined) {
166
+ console.error("No trade info found for open trade while fetching open trades!", { trade: openTradesTradeInfos[tradeIndex] });
167
+ continue;
168
+ }
169
+ const tradeInitialAccFees = openTradesInitialAccFees[tradeIndex];
170
+ if (tradeInitialAccFees === undefined) {
171
+ console.error("No initial fees found for open trade while fetching open trades!", { trade: openTrades[tradeIndex] });
172
+ continue;
173
+ }
174
+ const trade = openTrades[tradeIndex];
175
+ finalTrades[tradeIndex] = {
176
+ trade: {
177
+ trader: trade.trader,
178
+ pairIndex: parseInt(trade.pairIndex.toString()),
179
+ index: parseInt(trade.index.toString()),
180
+ initialPosToken: parseFloat(trade.initialPosToken.toString()) / 1e18,
181
+ openPrice: parseFloat(trade.openPrice.toString()) / 1e10,
182
+ buy: trade.buy.toString() === "true",
183
+ leverage: parseInt(trade.leverage.toString()),
184
+ tp: parseFloat(trade.tp.toString()) / 1e10,
185
+ sl: parseFloat(trade.sl.toString()) / 1e10,
186
+ },
187
+ tradeInfo: {
188
+ beingMarketClosed: tradeInfo.beingMarketClosed.toString() === "true",
189
+ tokenPriceDai: parseFloat(tradeInfo.tokenPriceDai.toString()) / 1e10,
190
+ openInterestDai: parseFloat(tradeInfo.openInterestDai.toString()) / 1e18,
191
+ tpLastUpdated: tradeInfo.tpLastUpdated,
192
+ slLastUpdated: tradeInfo.slLastUpdated,
193
+ },
194
+ initialAccFees: {
195
+ rollover: parseFloat(tradeInitialAccFees.rollover.toString()) / 1e18,
196
+ funding: parseFloat(tradeInitialAccFees.funding.toString()) / 1e18,
197
+ openedAfterUpdate: tradeInitialAccFees.openedAfterUpdate.toString() === "true",
198
+ },
199
+ };
200
+ }
201
+ return finalTrades.filter(trade => trade !== undefined);
202
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gainsnetwork/sdk",
3
- "version": "0.0.15",
3
+ "version": "0.0.16-rc1",
4
4
  "description": "Gains Network SDK",
5
5
  "main": "./lib/index.js",
6
6
  "files": [
@@ -98,6 +98,7 @@
98
98
  "dependencies": {
99
99
  "@ethersproject/providers": "^5.7.2",
100
100
  "ethers": "^5.7.2",
101
+ "ethers-multicall": "^0.2.3",
101
102
  "luxon": "^3.2.0"
102
103
  }
103
104
  }