@gainsnetwork/sdk 0.1.29-rc3 → 0.2.0-rc3

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 (135) hide show
  1. package/README.md +11 -11
  2. package/lib/constants.d.ts +252 -261
  3. package/lib/constants.js +269 -277
  4. package/lib/contracts/addresses.d.ts +3 -3
  5. package/lib/contracts/addresses.js +31 -31
  6. package/lib/contracts/addresses.json +53 -89
  7. package/lib/contracts/index.d.ts +8 -8
  8. package/lib/contracts/index.js +37 -40
  9. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +5215 -1740
  10. package/lib/contracts/types/generated/GNSMultiCollatDiamond.js +2 -2
  11. package/lib/contracts/types/generated/GToken.d.ts +1946 -1946
  12. package/lib/contracts/types/generated/GToken.js +2 -2
  13. package/lib/contracts/types/generated/GTokenOpenPnlFeed.d.ts +557 -557
  14. package/lib/contracts/types/generated/GTokenOpenPnlFeed.js +2 -2
  15. package/lib/contracts/types/generated/common.d.ts +22 -22
  16. package/lib/contracts/types/generated/common.js +2 -2
  17. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +291 -144
  18. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +11360 -3094
  19. package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.d.ts +59 -59
  20. package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.js +765 -765
  21. package/lib/contracts/types/generated/factories/GToken__factory.d.ts +121 -121
  22. package/lib/contracts/types/generated/factories/GToken__factory.js +2944 -2944
  23. package/lib/contracts/types/generated/factories/index.d.ts +3 -10
  24. package/lib/contracts/types/generated/factories/index.js +12 -26
  25. package/lib/contracts/types/generated/index.d.ts +7 -21
  26. package/lib/contracts/types/generated/index.js +33 -47
  27. package/lib/contracts/types/index.d.ts +19 -27
  28. package/lib/contracts/types/index.js +10 -10
  29. package/lib/contracts/utils/borrowingFees.d.ts +8 -8
  30. package/lib/contracts/utils/borrowingFees.js +32 -28
  31. package/lib/contracts/utils/index.d.ts +3 -4
  32. package/lib/contracts/utils/index.js +19 -20
  33. package/lib/contracts/utils/openTrades.d.ts +9 -9
  34. package/lib/contracts/utils/openTrades.js +380 -188
  35. package/lib/contracts/utils/pairs.d.ts +7 -7
  36. package/lib/contracts/utils/pairs.js +339 -337
  37. package/lib/index.d.ts +7 -7
  38. package/lib/index.js +24 -24
  39. package/lib/markets/commodities.d.ts +1 -1
  40. package/lib/markets/commodities.js +31 -31
  41. package/lib/markets/crypto.d.ts +1 -1
  42. package/lib/markets/crypto.js +6 -6
  43. package/lib/markets/forex.d.ts +3 -3
  44. package/lib/markets/forex.js +45 -45
  45. package/lib/markets/index.d.ts +5 -5
  46. package/lib/markets/index.js +21 -21
  47. package/lib/markets/indices.d.ts +1 -1
  48. package/lib/markets/indices.js +6 -6
  49. package/lib/markets/stocks.d.ts +3 -3
  50. package/lib/markets/stocks.js +54 -54
  51. package/lib/trade/fees/borrowing/converter.d.ts +15 -13
  52. package/lib/trade/fees/borrowing/converter.js +35 -41
  53. package/lib/trade/fees/borrowing/index.d.ts +54 -55
  54. package/lib/trade/fees/borrowing/index.js +165 -171
  55. package/lib/trade/fees/borrowing/types.d.ts +30 -36
  56. package/lib/trade/fees/borrowing/types.js +2 -2
  57. package/lib/trade/fees/index.d.ts +4 -4
  58. package/lib/trade/fees/index.js +30 -30
  59. package/lib/trade/fees/tiers/index.d.ts +12 -12
  60. package/lib/trade/fees/tiers/index.js +51 -51
  61. package/lib/trade/fees/tiers/types.d.ts +8 -8
  62. package/lib/trade/fees/tiers/types.js +2 -2
  63. package/lib/trade/index.d.ts +7 -8
  64. package/lib/trade/index.js +23 -24
  65. package/lib/trade/liquidation.d.ts +3 -3
  66. package/lib/trade/liquidation.js +15 -16
  67. package/lib/trade/oiWindows.d.ts +3 -3
  68. package/lib/trade/oiWindows.js +20 -20
  69. package/lib/trade/pnl.d.ts +7 -7
  70. package/lib/trade/pnl.js +33 -33
  71. package/lib/trade/spread.d.ts +2 -2
  72. package/lib/trade/spread.js +22 -22
  73. package/lib/trade/types.d.ts +413 -429
  74. package/lib/trade/types.js +255 -249
  75. package/lib/utils/index.d.ts +1 -1
  76. package/lib/utils/index.js +17 -17
  77. package/lib/utils/packing.d.ts +2 -2
  78. package/lib/utils/packing.js +39 -39
  79. package/lib/vault/index.d.ts +8 -8
  80. package/lib/vault/index.js +10 -10
  81. package/package.json +105 -105
  82. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +0 -1911
  83. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +0 -2
  84. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +0 -1067
  85. package/lib/contracts/types/generated/GNSBorrowingFees.js +0 -2
  86. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.d.ts +0 -1058
  87. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.js +0 -2
  88. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +0 -533
  89. package/lib/contracts/types/generated/GNSNftRewardsV6.js +0 -2
  90. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +0 -613
  91. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +0 -2
  92. package/lib/contracts/types/generated/GNSPairInfosV6_1.d.ts +0 -911
  93. package/lib/contracts/types/generated/GNSPairInfosV6_1.js +0 -2
  94. package/lib/contracts/types/generated/GNSPairsStorageV6.d.ts +0 -660
  95. package/lib/contracts/types/generated/GNSPairsStorageV6.js +0 -2
  96. package/lib/contracts/types/generated/GNSTrading.d.ts +0 -758
  97. package/lib/contracts/types/generated/GNSTrading.js +0 -2
  98. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +0 -875
  99. package/lib/contracts/types/generated/GNSTradingCallbacks.js +0 -2
  100. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.d.ts +0 -821
  101. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.js +0 -2
  102. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +0 -1387
  103. package/lib/contracts/types/generated/GNSTradingStorage.js +0 -2
  104. package/lib/contracts/types/generated/GTokenV6_3_2.d.ts +0 -1838
  105. package/lib/contracts/types/generated/GTokenV6_3_2.js +0 -2
  106. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.d.ts +0 -83
  107. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.js +0 -2691
  108. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.d.ts +0 -113
  109. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.js +0 -1742
  110. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.d.ts +0 -124
  111. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.js +0 -1784
  112. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +0 -100
  113. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +0 -1116
  114. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +0 -100
  115. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +0 -1003
  116. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.d.ts +0 -98
  117. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.js +0 -1485
  118. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.d.ts +0 -117
  119. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.js +0 -1265
  120. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.d.ts +0 -82
  121. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.js +0 -1326
  122. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +0 -113
  123. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +0 -1428
  124. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +0 -96
  125. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +0 -2241
  126. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +0 -95
  127. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +0 -1071
  128. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +0 -110
  129. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +0 -2682
  130. package/lib/contracts/utils/openLimitOrders.d.ts +0 -8
  131. package/lib/contracts/utils/openLimitOrders.js +0 -88
  132. package/lib/trade/fees.d.ts +0 -15
  133. package/lib/trade/fees.js +0 -45
  134. package/lib/trade/openLimitOrder.d.ts +0 -2
  135. package/lib/trade/openLimitOrder.js +0 -23
@@ -1,188 +1,380 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.fetchOpenPairTradesRaw = exports.fetchOpenPairTrades = void 0;
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 ethcall_1 = require("ethcall");
17
- const fetchOpenPairTrades = (contracts, overrides = {}) => __awaiter(void 0, void 0, void 0, function* () {
18
- const rawTrades = yield (0, exports.fetchOpenPairTradesRaw)(contracts, overrides);
19
- const { precision: collateralPrecision } = yield contracts.gnsBorrowingFees.collateralConfig();
20
- return rawTrades.map(rawTrade => _prepareTradeContainer(rawTrade.trade, rawTrade.tradeInfo, rawTrade.initialAccFees, rawTrade.tradeData, collateralPrecision));
21
- });
22
- exports.fetchOpenPairTrades = fetchOpenPairTrades;
23
- const fetchOpenPairTradesRaw = (contracts, overrides = {}) => __awaiter(void 0, void 0, void 0, function* () {
24
- if (!contracts) {
25
- return [];
26
- }
27
- const { pairBatchSize = 10, useMulticall = false, blockTag = "latest", } = overrides;
28
- const { gnsMultiCollatDiamond: multiCollatDiamondContract } = contracts;
29
- try {
30
- const totalPairIndexes = (yield multiCollatDiamondContract.pairsCount({ blockTag })).toNumber() -
31
- 1;
32
- let allOpenPairTrades = [];
33
- for (let batchStartPairIndex = 0; batchStartPairIndex < totalPairIndexes; batchStartPairIndex += pairBatchSize) {
34
- const batchEndPairIndex = Math.min(batchStartPairIndex + pairBatchSize - 1, totalPairIndexes);
35
- const openPairTradesBatch = useMulticall
36
- ? yield fetchOpenPairTradesBatchMulticall(contracts, batchStartPairIndex, batchEndPairIndex, blockTag)
37
- : yield fetchOpenPairTradesBatch(contracts, batchStartPairIndex, batchEndPairIndex);
38
- allOpenPairTrades = allOpenPairTrades.concat(openPairTradesBatch);
39
- }
40
- return allOpenPairTrades;
41
- }
42
- catch (error) {
43
- console.error(`Unexpected error while fetching open pair trades!`);
44
- throw error;
45
- }
46
- });
47
- exports.fetchOpenPairTradesRaw = fetchOpenPairTradesRaw;
48
- const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __awaiter(void 0, void 0, void 0, function* () {
49
- const { gfarmTradingStorageV5: storageContract, gnsBorrowingFees: borrowingFeesContract, gnsTradingCallbacks: callbacksContract, } = contracts;
50
- const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
51
- const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
52
- const rawTrades = yield Promise.all(pairIndexesToFetch.map((pairIndex) => __awaiter(void 0, void 0, void 0, function* () {
53
- const pairTraderAddresses = yield storageContract.pairTradersArray(pairIndex);
54
- if (pairTraderAddresses.length === 0) {
55
- return [];
56
- }
57
- const openTradesForPairTraders = yield Promise.all(pairTraderAddresses.map((pairTraderAddress) => __awaiter(void 0, void 0, void 0, function* () {
58
- const openTradesCalls = new Array(maxTradesPerPair);
59
- for (let pairTradeIndex = 0; pairTradeIndex < maxTradesPerPair; pairTradeIndex++) {
60
- openTradesCalls[pairTradeIndex] = storageContract.openTrades(pairTraderAddress, pairIndex, pairTradeIndex);
61
- }
62
- const openTradesForTraderAddress = yield Promise.all(openTradesCalls);
63
- // Filter out any of the trades that aren't *really* open (NOTE: these will have an empty trader address, so just test against that)
64
- const actualOpenTradesForTrader = openTradesForTraderAddress.filter(openTrade => openTrade.trader === pairTraderAddress);
65
- const [actualOpenTradesTradeInfos, actualOpenTradesInitialAccFees, actualOpenTradesTradeData,] = yield Promise.all([
66
- Promise.all(actualOpenTradesForTrader.map(aot => storageContract.openTradesInfo(aot.trader, aot.pairIndex, aot.index))),
67
- Promise.all(actualOpenTradesForTrader.map(aot => borrowingFeesContract.initialAccFees(aot.trader, aot.pairIndex, aot.index))),
68
- Promise.all(actualOpenTradesForTrader.map(aot => callbacksContract.tradeData(aot.trader, aot.pairIndex, aot.index, 0))),
69
- ]);
70
- const finalOpenTradesForTrader = new Array(actualOpenTradesForTrader.length);
71
- for (let tradeIndex = 0; tradeIndex < actualOpenTradesForTrader.length; tradeIndex++) {
72
- const tradeInfo = actualOpenTradesTradeInfos[tradeIndex];
73
- if (tradeInfo === undefined) {
74
- continue;
75
- }
76
- if (actualOpenTradesInitialAccFees[tradeIndex] === undefined) {
77
- continue;
78
- }
79
- const trade = actualOpenTradesForTrader[tradeIndex];
80
- const tradeData = actualOpenTradesTradeData[tradeIndex];
81
- finalOpenTradesForTrader[tradeIndex] = {
82
- trade,
83
- tradeInfo,
84
- initialAccFees: {
85
- borrowing: actualOpenTradesInitialAccFees[tradeIndex],
86
- },
87
- tradeData,
88
- };
89
- }
90
- return finalOpenTradesForTrader;
91
- })));
92
- return openTradesForPairTraders;
93
- })));
94
- const perPairTrades = rawTrades.reduce((a, b) => a.concat(b), []);
95
- return perPairTrades.reduce((a, b) => a.concat(b), []);
96
- });
97
- const fetchOpenPairTradesBatchMulticall = (contracts, startPairIndex, endPairIndex, blockTag) => __awaiter(void 0, void 0, void 0, function* () {
98
- const { gfarmTradingStorageV5: storageContract, gnsBorrowingFees: borrowingFeesContract, gnsTradingCallbacks: callbacksContract, } = contracts;
99
- // Convert to Multicall for efficient RPC usage
100
- const multicallProvider = new ethcall_1.Provider();
101
- yield multicallProvider.init(storageContract.provider);
102
- const storageContractMulticall = new ethcall_1.Contract(storageContract.address, [
103
- ...storageContract.interface.fragments,
104
- ]);
105
- const borrowingFeesContractMulticall = new ethcall_1.Contract(borrowingFeesContract.address, [...borrowingFeesContract.interface.fragments]);
106
- const callbacksContractMulticall = new ethcall_1.Contract(callbacksContract.address, [
107
- ...callbacksContract.interface.fragments,
108
- ]);
109
- const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
110
- const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
111
- const mcPairTraderAddresses = yield multicallProvider.all(pairIndexesToFetch.map(pairIndex => storageContractMulticall.pairTradersArray(pairIndex)), blockTag);
112
- const mcFlatOpenTrades = yield multicallProvider.all(mcPairTraderAddresses
113
- .map((pairTraderAddresses, _ix) => {
114
- return pairTraderAddresses
115
- .map((pairTraderAddress) => {
116
- const openTradesCalls = new Array(maxTradesPerPair);
117
- for (let pairTradeIndex = 0; pairTradeIndex < maxTradesPerPair; pairTradeIndex++) {
118
- openTradesCalls[pairTradeIndex] =
119
- storageContractMulticall.openTrades(pairTraderAddress, _ix + startPairIndex, pairTradeIndex);
120
- }
121
- return openTradesCalls;
122
- })
123
- .reduce((acc, val) => acc.concat(val), []);
124
- })
125
- .reduce((acc, val) => acc.concat(val), []), blockTag);
126
- const openTrades = mcFlatOpenTrades.filter(openTrade => openTrade[0] !== "0x0000000000000000000000000000000000000000");
127
- const [openTradesTradeInfos, openTradesInitialAccFees, openTradesTradeData] = yield Promise.all([
128
- multicallProvider.all(openTrades.map(openTrade => storageContractMulticall.openTradesInfo(openTrade.trader, openTrade.pairIndex, openTrade.index)), blockTag),
129
- multicallProvider.all(openTrades.map(openTrade => borrowingFeesContractMulticall.initialAccFees(openTrade.trader, openTrade.pairIndex, openTrade.index)), blockTag),
130
- multicallProvider.all(openTrades.map(openTrade => callbacksContractMulticall.tradeData(openTrade.trader, openTrade.pairIndex, openTrade.index, 0)), blockTag),
131
- ]);
132
- const finalTrades = new Array(openTrades.length);
133
- for (let tradeIndex = 0; tradeIndex < openTradesTradeInfos.length; tradeIndex++) {
134
- const tradeInfo = openTradesTradeInfos[tradeIndex];
135
- if (tradeInfo === undefined) {
136
- console.error("No trade info found for open trade while fetching open trades!", { trade: openTradesTradeInfos[tradeIndex] });
137
- continue;
138
- }
139
- if (openTradesInitialAccFees[tradeIndex] === undefined) {
140
- console.error("No initial fees found for open trade while fetching open trades!", { trade: openTrades[tradeIndex] });
141
- continue;
142
- }
143
- const trade = openTrades[tradeIndex];
144
- const tradeData = openTradesTradeData[tradeIndex];
145
- finalTrades[tradeIndex] = {
146
- trade,
147
- tradeInfo,
148
- initialAccFees: {
149
- borrowing: openTradesInitialAccFees[tradeIndex],
150
- },
151
- tradeData,
152
- };
153
- }
154
- return finalTrades.filter(trade => trade !== undefined);
155
- });
156
- const _prepareTradeContainer = (trade, tradeInfo, tradeInitialAccFees, tradeData, collateralPrecision) => ({
157
- trade: {
158
- trader: trade.trader,
159
- pairIndex: parseInt(trade.pairIndex.toString()),
160
- index: parseInt(trade.index.toString()),
161
- initialPosToken: parseFloat(trade.initialPosToken.toString()) / 1e18,
162
- openPrice: parseFloat(trade.openPrice.toString()) / 1e10,
163
- buy: trade.buy.toString() === "true",
164
- leverage: parseInt(trade.leverage.toString()),
165
- tp: parseFloat(trade.tp.toString()) / 1e10,
166
- sl: parseFloat(trade.sl.toString()) / 1e10,
167
- },
168
- tradeInfo: {
169
- beingMarketClosed: tradeInfo.beingMarketClosed.toString() === "true",
170
- tokenPriceDai: parseFloat(tradeInfo.tokenPriceDai.toString()) / 1e10,
171
- openInterestDai: parseFloat(tradeInfo.openInterestDai.toString()) /
172
- parseFloat(collateralPrecision.toString()),
173
- tpLastUpdated: tradeInfo.tpLastUpdated,
174
- slLastUpdated: tradeInfo.slLastUpdated,
175
- },
176
- tradeData: {
177
- maxSlippageP: parseFloat(tradeData.maxSlippageP.toString()) / 1e10,
178
- lastOiUpdateTs: parseFloat(tradeData.lastOiUpdateTs),
179
- collateralPriceUsd: parseFloat(tradeData.collateralPriceUsd.toString()) / 1e8,
180
- },
181
- initialAccFees: {
182
- borrowing: {
183
- accPairFee: parseFloat(tradeInitialAccFees.borrowing.accPairFee.toString()) / 1e10,
184
- accGroupFee: parseFloat(tradeInitialAccFees.borrowing.accGroupFee.toString()) / 1e10,
185
- block: parseFloat(tradeInitialAccFees.borrowing.block.toString()),
186
- },
187
- },
188
- });
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fetchOpenPairTradesRaw = exports.fetchOpenPairTrades = void 0;
13
+ const fetchOpenPairTrades = (contracts, overrides = {}) => __awaiter(void 0, void 0, void 0, function* () {
14
+ const rawTrades = yield (0, exports.fetchOpenPairTradesRaw)(contracts, overrides);
15
+ const collateralPrecisions = (yield contracts.gnsMultiCollatDiamond.getCollaterals()).map(({ precision }) => precision);
16
+ return rawTrades.map(rawTrade => _prepareTradeContainer(rawTrade.trade, rawTrade.tradeInfo, rawTrade.initialAccFees, collateralPrecisions[parseInt(rawTrade.trade.collateralIndex.toString()) - 1]));
17
+ });
18
+ exports.fetchOpenPairTrades = fetchOpenPairTrades;
19
+ // @todo rename
20
+ const fetchOpenPairTradesRaw = (contracts, overrides = {}) => __awaiter(void 0, void 0, void 0, function* () {
21
+ if (!contracts) {
22
+ return [];
23
+ }
24
+ const { batchSize = 50,
25
+ // useMulticall = false,
26
+ // blockTag = "latest",
27
+ } = overrides;
28
+ const { gnsMultiCollatDiamond: multiCollatDiamondContract } = contracts;
29
+ try {
30
+ let allOpenPairTrades = [];
31
+ let running = true;
32
+ let offset = 0;
33
+ while (running) {
34
+ console.log("fetching with", offset, batchSize);
35
+ const trades = yield multiCollatDiamondContract.getAllTrades(offset, offset + batchSize);
36
+ const tradeInfos = yield multiCollatDiamondContract.getAllTradeInfos(offset, offset + batchSize);
37
+ // Array is always of length `batchSize`
38
+ // so we need to filter out the empty trades, indexes are reliable
39
+ const openTrades = trades
40
+ .filter(t => t.collateralIndex > 0)
41
+ .map((trade, ix) => ({
42
+ trade,
43
+ tradeInfo: tradeInfos[ix],
44
+ initialAccFees: {
45
+ accPairFee: 0,
46
+ accGroupFee: 0,
47
+ block: 0,
48
+ __placeholder: 0,
49
+ }, // @todo fetch initialAccFees
50
+ }));
51
+ allOpenPairTrades = allOpenPairTrades.concat(openTrades);
52
+ offset += batchSize + 1;
53
+ running =
54
+ parseInt(trades[trades.length - 1].collateralIndex.toString()) > 0;
55
+ }
56
+ return allOpenPairTrades;
57
+ }
58
+ catch (error) {
59
+ console.error(`Unexpected error while fetching open pair trades!`);
60
+ throw error;
61
+ }
62
+ });
63
+ exports.fetchOpenPairTradesRaw = fetchOpenPairTradesRaw;
64
+ // @todo deprecate
65
+ /*
66
+ const fetchOpenPairTradesBatch = async (
67
+ contracts: Contracts,
68
+ startPairIndex: number,
69
+ endPairIndex: number
70
+ ): Promise<TradeContainerRaw[]> => {
71
+ const {
72
+ gfarmTradingStorageV5: storageContract,
73
+ gnsBorrowingFees: borrowingFeesContract,
74
+ gnsTradingCallbacks: callbacksContract,
75
+ } = contracts;
76
+
77
+ const maxTradesPerPair = (
78
+ await storageContract.maxTradesPerPair()
79
+ ).toNumber();
80
+
81
+ const pairIndexesToFetch = Array.from(
82
+ { length: endPairIndex - startPairIndex + 1 },
83
+ (_, i) => i + startPairIndex
84
+ );
85
+
86
+ const rawTrades = await Promise.all(
87
+ pairIndexesToFetch.map(async pairIndex => {
88
+ const pairTraderAddresses = await storageContract.pairTradersArray(
89
+ pairIndex
90
+ );
91
+
92
+ if (pairTraderAddresses.length === 0) {
93
+ return [];
94
+ }
95
+
96
+ const openTradesForPairTraders = await Promise.all(
97
+ pairTraderAddresses.map(async pairTraderAddress => {
98
+ const openTradesCalls = new Array(maxTradesPerPair);
99
+ for (
100
+ let pairTradeIndex = 0;
101
+ pairTradeIndex < maxTradesPerPair;
102
+ pairTradeIndex++
103
+ ) {
104
+ openTradesCalls[pairTradeIndex] = storageContract.openTrades(
105
+ pairTraderAddress,
106
+ pairIndex,
107
+ pairTradeIndex
108
+ );
109
+ }
110
+
111
+ const openTradesForTraderAddress = await Promise.all(openTradesCalls);
112
+
113
+ // Filter out any of the trades that aren't *really* open (NOTE: these will have an empty trader address, so just test against that)
114
+ const actualOpenTradesForTrader = openTradesForTraderAddress.filter(
115
+ openTrade => openTrade.trader === pairTraderAddress
116
+ );
117
+
118
+ const [
119
+ actualOpenTradesTradeInfos,
120
+ actualOpenTradesInitialAccFees,
121
+ actualOpenTradesTradeData,
122
+ ] = await Promise.all([
123
+ Promise.all(
124
+ actualOpenTradesForTrader.map(aot =>
125
+ storageContract.openTradesInfo(
126
+ aot.trader,
127
+ aot.pairIndex,
128
+ aot.index
129
+ )
130
+ )
131
+ ),
132
+ Promise.all(
133
+ actualOpenTradesForTrader.map(aot =>
134
+ borrowingFeesContract.initialAccFees(
135
+ aot.trader,
136
+ aot.pairIndex,
137
+ aot.index
138
+ )
139
+ )
140
+ ),
141
+ Promise.all(
142
+ actualOpenTradesForTrader.map(aot =>
143
+ callbacksContract.tradeData(
144
+ aot.trader,
145
+ aot.pairIndex,
146
+ aot.index,
147
+ 0
148
+ )
149
+ )
150
+ ),
151
+ ]);
152
+
153
+ const finalOpenTradesForTrader = new Array(
154
+ actualOpenTradesForTrader.length
155
+ );
156
+
157
+ for (
158
+ let tradeIndex = 0;
159
+ tradeIndex < actualOpenTradesForTrader.length;
160
+ tradeIndex++
161
+ ) {
162
+ const tradeInfo = actualOpenTradesTradeInfos[tradeIndex];
163
+
164
+ if (tradeInfo === undefined) {
165
+ continue;
166
+ }
167
+
168
+ if (actualOpenTradesInitialAccFees[tradeIndex] === undefined) {
169
+ continue;
170
+ }
171
+
172
+ const trade = actualOpenTradesForTrader[tradeIndex];
173
+ const tradeData = actualOpenTradesTradeData[tradeIndex];
174
+
175
+ finalOpenTradesForTrader[tradeIndex] = {
176
+ trade,
177
+ tradeInfo,
178
+ initialAccFees: {
179
+ borrowing: actualOpenTradesInitialAccFees[tradeIndex],
180
+ },
181
+ tradeData,
182
+ };
183
+ }
184
+
185
+ return finalOpenTradesForTrader;
186
+ })
187
+ );
188
+
189
+ return openTradesForPairTraders;
190
+ })
191
+ );
192
+
193
+ const perPairTrades = rawTrades.reduce((a, b) => a.concat(b), []);
194
+ return perPairTrades.reduce((a, b) => a.concat(b), []);
195
+ };
196
+ */
197
+ // @todo deprecate
198
+ /*
199
+ const fetchOpenPairTradesBatchMulticall = async (
200
+ contracts: Contracts,
201
+ startPairIndex: number,
202
+ endPairIndex: number,
203
+ blockTag: BlockTag
204
+ ): Promise<TradeContainerRaw[]> => {
205
+ const {
206
+ gfarmTradingStorageV5: storageContract,
207
+ gnsBorrowingFees: borrowingFeesContract,
208
+ gnsTradingCallbacks: callbacksContract,
209
+ } = contracts;
210
+
211
+ // Convert to Multicall for efficient RPC usage
212
+ const multicallProvider = new Provider();
213
+ await multicallProvider.init(storageContract.provider);
214
+ const storageContractMulticall = new Contract(storageContract.address, [
215
+ ...storageContract.interface.fragments,
216
+ ]);
217
+ const borrowingFeesContractMulticall = new Contract(
218
+ borrowingFeesContract.address,
219
+ [...borrowingFeesContract.interface.fragments]
220
+ );
221
+ const callbacksContractMulticall = new Contract(callbacksContract.address, [
222
+ ...callbacksContract.interface.fragments,
223
+ ]);
224
+
225
+ const maxTradesPerPair = (
226
+ await storageContract.maxTradesPerPair()
227
+ ).toNumber();
228
+
229
+ const pairIndexesToFetch = Array.from(
230
+ { length: endPairIndex - startPairIndex + 1 },
231
+ (_, i) => i + startPairIndex
232
+ );
233
+
234
+ const mcPairTraderAddresses: string[][] = await multicallProvider.all(
235
+ pairIndexesToFetch.map(pairIndex =>
236
+ storageContractMulticall.pairTradersArray(pairIndex)
237
+ ),
238
+ blockTag
239
+ );
240
+
241
+ const mcFlatOpenTrades: any[] = await multicallProvider.all(
242
+ mcPairTraderAddresses
243
+ .map((pairTraderAddresses, _ix) => {
244
+ return pairTraderAddresses
245
+ .map((pairTraderAddress: string) => {
246
+ const openTradesCalls: Call[] = new Array(maxTradesPerPair);
247
+ for (
248
+ let pairTradeIndex = 0;
249
+ pairTradeIndex < maxTradesPerPair;
250
+ pairTradeIndex++
251
+ ) {
252
+ openTradesCalls[pairTradeIndex] =
253
+ storageContractMulticall.openTrades(
254
+ pairTraderAddress,
255
+ _ix + startPairIndex,
256
+ pairTradeIndex
257
+ );
258
+ }
259
+ return openTradesCalls;
260
+ })
261
+ .reduce((acc, val) => acc.concat(val), []);
262
+ })
263
+ .reduce((acc, val) => acc.concat(val), [] as Call[]),
264
+ blockTag
265
+ );
266
+
267
+ const openTrades = mcFlatOpenTrades.filter(
268
+ openTrade => openTrade[0] !== "0x0000000000000000000000000000000000000000"
269
+ );
270
+
271
+ const [openTradesTradeInfos, openTradesInitialAccFees, openTradesTradeData] =
272
+ await Promise.all([
273
+ multicallProvider.all(
274
+ openTrades.map(openTrade =>
275
+ storageContractMulticall.openTradesInfo(
276
+ openTrade.trader,
277
+ openTrade.pairIndex,
278
+ openTrade.index
279
+ )
280
+ ),
281
+ blockTag
282
+ ),
283
+ multicallProvider.all<
284
+ Awaited<ReturnType<typeof borrowingFeesContract.initialAccFees>>
285
+ >(
286
+ openTrades.map(openTrade =>
287
+ borrowingFeesContractMulticall.initialAccFees(
288
+ openTrade.trader,
289
+ openTrade.pairIndex,
290
+ openTrade.index
291
+ )
292
+ ),
293
+ blockTag
294
+ ),
295
+ multicallProvider.all(
296
+ openTrades.map(openTrade =>
297
+ callbacksContractMulticall.tradeData(
298
+ openTrade.trader,
299
+ openTrade.pairIndex,
300
+ openTrade.index,
301
+ 0
302
+ )
303
+ ),
304
+ blockTag
305
+ ),
306
+ ]);
307
+
308
+ const finalTrades = new Array(openTrades.length);
309
+
310
+ for (
311
+ let tradeIndex = 0;
312
+ tradeIndex < openTradesTradeInfos.length;
313
+ tradeIndex++
314
+ ) {
315
+ const tradeInfo = openTradesTradeInfos[tradeIndex];
316
+
317
+ if (tradeInfo === undefined) {
318
+ console.error(
319
+ "No trade info found for open trade while fetching open trades!",
320
+ { trade: openTradesTradeInfos[tradeIndex] }
321
+ );
322
+
323
+ continue;
324
+ }
325
+
326
+ if (openTradesInitialAccFees[tradeIndex] === undefined) {
327
+ console.error(
328
+ "No initial fees found for open trade while fetching open trades!",
329
+ { trade: openTrades[tradeIndex] }
330
+ );
331
+
332
+ continue;
333
+ }
334
+
335
+ const trade = openTrades[tradeIndex];
336
+ const tradeData = openTradesTradeData[tradeIndex];
337
+
338
+ finalTrades[tradeIndex] = {
339
+ trade,
340
+ tradeInfo,
341
+ initialAccFees: {
342
+ borrowing: openTradesInitialAccFees[tradeIndex],
343
+ },
344
+ tradeData,
345
+ };
346
+ }
347
+
348
+ return finalTrades.filter(trade => trade !== undefined);
349
+ };
350
+ */
351
+ const _prepareTradeContainer = (trade, tradeInfo, tradeInitialAccFees, collateralPrecision) => ({
352
+ trade: {
353
+ user: trade.user,
354
+ index: parseInt(trade.index.toString()),
355
+ pairIndex: parseInt(trade.pairIndex.toString()),
356
+ leverage: parseFloat(trade.leverage.toString()) / 1e3,
357
+ long: trade.long.toString() === "true",
358
+ isOpen: trade.isOpen.toString() === "true",
359
+ collateralIndex: parseInt(trade.collateralIndex.toString()),
360
+ tradeType: trade.tradeType,
361
+ collateralAmount: parseFloat(trade.collateralAmount.toString()) /
362
+ parseFloat(collateralPrecision.toString()),
363
+ openPrice: parseFloat(trade.openPrice.toString()) / 1e10,
364
+ tp: parseFloat(trade.tp.toString()) / 1e10,
365
+ sl: parseFloat(trade.sl.toString()) / 1e10,
366
+ },
367
+ tradeInfo: {
368
+ createdBlock: parseInt(tradeInfo.createdBlock.toString()),
369
+ tpLastUpdatedBlock: parseInt(tradeInfo.tpLastUpdatedBlock.toString()),
370
+ slLastUpdatedBlock: parseInt(tradeInfo.slLastUpdatedBlock.toString()),
371
+ maxSlippageP: parseFloat(tradeInfo.maxSlippageP.toString()) / 1e3,
372
+ lastOiUpdateTs: parseFloat(tradeInfo.lastOiUpdateTs),
373
+ collateralPriceUsd: parseFloat(tradeInfo.collateralPriceUsd.toString()) / 1e8,
374
+ },
375
+ initialAccFees: {
376
+ accPairFee: parseFloat(tradeInitialAccFees.accPairFee.toString()) / 1e10,
377
+ accGroupFee: parseFloat(tradeInitialAccFees.accGroupFee.toString()) / 1e10,
378
+ block: parseFloat(tradeInitialAccFees.block.toString()),
379
+ },
380
+ });
@@ -1,7 +1,7 @@
1
- import { Pair, Fee, OpenInterest, PairDepth, PairIndex } from "../../trade/types";
2
- import { Contracts } from "../../contracts/types";
3
- export declare const fetchPairs: (contracts: Contracts, pairIxs: PairIndex[]) => Promise<Pair[]>;
4
- export declare const fetchPairDepths: (contracts: Contracts, pairIxs: number[]) => Promise<PairDepth[]>;
5
- export declare const fetchFees: (contracts: Contracts, feeIxs: PairIndex[]) => Promise<Fee[]>;
6
- export declare const fetchOpenInterest: (contracts: Contracts, pairIxs: number[]) => Promise<OpenInterest[]>;
7
- export declare const getPairDescription: (pairIndex: PairIndex) => string;
1
+ import { Pair, Fee, OpenInterest, PairDepth, PairIndex } from "../../trade/types";
2
+ import { Contracts } from "../../contracts/types";
3
+ export declare const fetchPairs: (contracts: Contracts, pairIxs: PairIndex[]) => Promise<Pair[]>;
4
+ export declare const fetchPairDepths: (contracts: Contracts, pairIxs: number[]) => Promise<PairDepth[]>;
5
+ export declare const fetchFees: (contracts: Contracts, feeIxs: PairIndex[]) => Promise<Fee[]>;
6
+ export declare const fetchOpenInterest: (collateralIndex: number, contracts: Contracts, pairIxs: number[]) => Promise<OpenInterest[]>;
7
+ export declare const getPairDescription: (pairIndex: PairIndex) => string;