@d8x/perpetuals-sdk 0.7.7 → 0.7.8

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 (165) hide show
  1. package/dist/cjs/abi/IPyth.json +471 -0
  2. package/dist/cjs/abi/OracleFactory.json +457 -0
  3. package/dist/cjs/accountTrade.js +134 -243
  4. package/dist/cjs/accountTrade.js.map +1 -1
  5. package/dist/cjs/brokerTool.js +144 -290
  6. package/dist/cjs/brokerTool.js.map +1 -1
  7. package/dist/cjs/config/priceFeedConfig.json +1 -1
  8. package/dist/cjs/contracts/IPyth.d.ts +234 -0
  9. package/dist/cjs/contracts/IPyth.js +3 -0
  10. package/dist/cjs/contracts/IPyth.js.map +1 -0
  11. package/dist/cjs/contracts/OracleFactory.d.ts +288 -0
  12. package/dist/cjs/contracts/OracleFactory.js +3 -0
  13. package/dist/cjs/contracts/OracleFactory.js.map +1 -0
  14. package/dist/cjs/contracts/factories/ERC20__factory.js +9 -12
  15. package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
  16. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +9 -12
  17. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  18. package/dist/cjs/contracts/factories/IPyth__factory.d.ts +367 -0
  19. package/dist/cjs/contracts/factories/IPyth__factory.js +489 -0
  20. package/dist/cjs/contracts/factories/IPyth__factory.js.map +1 -0
  21. package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +9 -12
  22. package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
  23. package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +9 -12
  24. package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
  25. package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +9 -12
  26. package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
  27. package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +361 -0
  28. package/dist/cjs/contracts/factories/OracleFactory__factory.js +475 -0
  29. package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -0
  30. package/dist/cjs/contracts/factories/ShareToken__factory.js +9 -12
  31. package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
  32. package/dist/cjs/contracts/factories/index.d.ts +2 -0
  33. package/dist/cjs/contracts/factories/index.js +5 -1
  34. package/dist/cjs/contracts/factories/index.js.map +1 -1
  35. package/dist/cjs/contracts/index.d.ts +4 -0
  36. package/dist/cjs/contracts/index.js +6 -2
  37. package/dist/cjs/contracts/index.js.map +1 -1
  38. package/dist/cjs/d8XMath.js +65 -66
  39. package/dist/cjs/d8XMath.js.map +1 -1
  40. package/dist/cjs/index.d.ts +2 -1
  41. package/dist/cjs/index.js +14 -12
  42. package/dist/cjs/index.js.map +1 -1
  43. package/dist/cjs/liquidatorTool.js +80 -137
  44. package/dist/cjs/liquidatorTool.js.map +1 -1
  45. package/dist/cjs/liquidityProviderTool.js +33 -65
  46. package/dist/cjs/liquidityProviderTool.js.map +1 -1
  47. package/dist/cjs/marketData.js +635 -978
  48. package/dist/cjs/marketData.js.map +1 -1
  49. package/dist/cjs/nodeSDKTypes.js +10 -22
  50. package/dist/cjs/nodeSDKTypes.js.map +1 -1
  51. package/dist/cjs/orderReferrerTool.js +200 -323
  52. package/dist/cjs/orderReferrerTool.js.map +1 -1
  53. package/dist/cjs/perpetualDataHandler.js +404 -550
  54. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  55. package/dist/cjs/perpetualEventHandler.js +129 -190
  56. package/dist/cjs/perpetualEventHandler.js.map +1 -1
  57. package/dist/cjs/priceFeeds.js +223 -335
  58. package/dist/cjs/priceFeeds.js.map +1 -1
  59. package/dist/cjs/traderDigests.js +20 -23
  60. package/dist/cjs/traderDigests.js.map +1 -1
  61. package/dist/cjs/traderInterface.js +54 -87
  62. package/dist/cjs/traderInterface.js.map +1 -1
  63. package/dist/cjs/triangulator.js +34 -38
  64. package/dist/cjs/triangulator.js.map +1 -1
  65. package/dist/cjs/utils.js +18 -32
  66. package/dist/cjs/utils.js.map +1 -1
  67. package/dist/cjs/version.d.ts +1 -1
  68. package/dist/cjs/version.js +1 -1
  69. package/dist/cjs/writeAccessHandler.js +78 -112
  70. package/dist/cjs/writeAccessHandler.js.map +1 -1
  71. package/dist/esm/abi/IPyth.json +471 -0
  72. package/dist/esm/abi/OracleFactory.json +457 -0
  73. package/dist/esm/accountTrade.js +126 -237
  74. package/dist/esm/accountTrade.js.map +1 -1
  75. package/dist/esm/brokerTool.js +136 -284
  76. package/dist/esm/brokerTool.js.map +1 -1
  77. package/dist/esm/config/priceFeedConfig.json +1 -1
  78. package/dist/esm/contracts/IPyth.d.ts +234 -0
  79. package/dist/esm/contracts/IPyth.js +2 -0
  80. package/dist/esm/contracts/IPyth.js.map +1 -0
  81. package/dist/esm/contracts/OracleFactory.d.ts +288 -0
  82. package/dist/esm/contracts/OracleFactory.js +2 -0
  83. package/dist/esm/contracts/OracleFactory.js.map +1 -0
  84. package/dist/esm/contracts/factories/ERC20__factory.js +8 -12
  85. package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
  86. package/dist/esm/contracts/factories/IPerpetualManager__factory.js +8 -12
  87. package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  88. package/dist/esm/contracts/factories/IPyth__factory.d.ts +367 -0
  89. package/dist/esm/contracts/factories/IPyth__factory.js +485 -0
  90. package/dist/esm/contracts/factories/IPyth__factory.js.map +1 -0
  91. package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +8 -12
  92. package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
  93. package/dist/esm/contracts/factories/LimitOrderBook__factory.js +8 -12
  94. package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
  95. package/dist/esm/contracts/factories/MockTokenSwap__factory.js +8 -12
  96. package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
  97. package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +361 -0
  98. package/dist/esm/contracts/factories/OracleFactory__factory.js +471 -0
  99. package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -0
  100. package/dist/esm/contracts/factories/ShareToken__factory.js +8 -12
  101. package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
  102. package/dist/esm/contracts/factories/index.d.ts +2 -0
  103. package/dist/esm/contracts/factories/index.js +2 -0
  104. package/dist/esm/contracts/factories/index.js.map +1 -1
  105. package/dist/esm/contracts/index.d.ts +4 -0
  106. package/dist/esm/contracts/index.js +2 -0
  107. package/dist/esm/contracts/index.js.map +1 -1
  108. package/dist/esm/d8XMath.js +63 -64
  109. package/dist/esm/d8XMath.js.map +1 -1
  110. package/dist/esm/index.d.ts +2 -1
  111. package/dist/esm/index.js +2 -1
  112. package/dist/esm/index.js.map +1 -1
  113. package/dist/esm/liquidatorTool.js +77 -136
  114. package/dist/esm/liquidatorTool.js.map +1 -1
  115. package/dist/esm/liquidityProviderTool.js +29 -63
  116. package/dist/esm/liquidityProviderTool.js.map +1 -1
  117. package/dist/esm/marketData.js +626 -971
  118. package/dist/esm/marketData.js.map +1 -1
  119. package/dist/esm/nodeSDKTypes.js +36 -48
  120. package/dist/esm/nodeSDKTypes.js.map +1 -1
  121. package/dist/esm/orderReferrerTool.js +194 -319
  122. package/dist/esm/orderReferrerTool.js.map +1 -1
  123. package/dist/esm/perpetualDataHandler.js +394 -542
  124. package/dist/esm/perpetualDataHandler.js.map +1 -1
  125. package/dist/esm/perpetualEventHandler.js +126 -188
  126. package/dist/esm/perpetualEventHandler.js.map +1 -1
  127. package/dist/esm/priceFeeds.js +218 -332
  128. package/dist/esm/priceFeeds.js.map +1 -1
  129. package/dist/esm/traderDigests.js +15 -19
  130. package/dist/esm/traderDigests.js.map +1 -1
  131. package/dist/esm/traderInterface.js +48 -83
  132. package/dist/esm/traderInterface.js.map +1 -1
  133. package/dist/esm/triangulator.js +34 -39
  134. package/dist/esm/triangulator.js.map +1 -1
  135. package/dist/esm/utils.js +16 -30
  136. package/dist/esm/utils.js.map +1 -1
  137. package/dist/esm/version.d.ts +1 -1
  138. package/dist/esm/version.js +1 -1
  139. package/dist/esm/version.js.map +1 -1
  140. package/dist/esm/writeAccessHandler.js +69 -105
  141. package/dist/esm/writeAccessHandler.js.map +1 -1
  142. package/package.json +1 -1
  143. package/src/abi/IPyth.json +471 -0
  144. package/src/abi/OracleFactory.json +457 -0
  145. package/src/accountTrade.ts +1 -6
  146. package/src/config/priceFeedConfig.json +1 -1
  147. package/src/contracts/IPyth.ts +571 -0
  148. package/src/contracts/OracleFactory.ts +708 -0
  149. package/src/contracts/factories/IPyth__factory.ts +489 -0
  150. package/src/contracts/factories/{zkevmTestnet/ShareToken__factory.ts → OracleFactory__factory.ts} +222 -206
  151. package/src/contracts/factories/index.ts +2 -0
  152. package/src/contracts/index.ts +4 -0
  153. package/src/index.ts +2 -0
  154. package/src/orderReferrerTool.ts +1 -3
  155. package/src/priceFeeds.ts +1 -1
  156. package/src/version.ts +1 -1
  157. package/src/contracts/factories/zkevmTestnet/IPerpetualManager__factory.ts +0 -5804
  158. package/src/contracts/factories/zkevmTestnet/LimitOrderBookFactory__factory.ts +0 -263
  159. package/src/contracts/factories/zkevmTestnet/LimitOrderBook__factory.ts +0 -1131
  160. package/src/contracts/factories/zkevmTestnet/index.ts +0 -7
  161. package/src/contracts/zkevmTestnet/IPerpetualManager.ts +0 -7109
  162. package/src/contracts/zkevmTestnet/LimitOrderBook.ts +0 -1341
  163. package/src/contracts/zkevmTestnet/LimitOrderBookFactory.ts +0 -472
  164. package/src/contracts/zkevmTestnet/ShareToken.ts +0 -695
  165. package/src/contracts/zkevmTestnet/index.ts +0 -7
@@ -1,22 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- var tslib_1 = require("tslib");
4
- var bignumber_1 = require("@ethersproject/bignumber");
5
- var triangulator_1 = tslib_1.__importDefault(require("./triangulator"));
6
- var d8XMath_1 = require("./d8XMath");
7
- var buffer_1 = require("buffer");
3
+ const tslib_1 = require("tslib");
4
+ const bignumber_1 = require("@ethersproject/bignumber");
5
+ const triangulator_1 = tslib_1.__importDefault(require("./triangulator"));
6
+ const d8XMath_1 = require("./d8XMath");
7
+ const buffer_1 = require("buffer");
8
8
  /**
9
9
  * This class communicates with the REST API that provides price-data that is
10
10
  * to be submitted to the smart contracts for certain functions such as
11
11
  * trader liquidations, trade executions, change of trader margin amount.
12
12
  */
13
- var PriceFeeds = /** @class */ (function () {
14
- function PriceFeeds(dataHandler, priceFeedConfigNetwork) {
15
- var _a;
13
+ class PriceFeeds {
14
+ constructor(dataHandler, priceFeedConfigNetwork) {
16
15
  this.THRESHOLD_MARKET_CLOSED_SEC = 15; // smallest lag for which we consider the market as being closed
17
- var configs = require("./config/priceFeedConfig.json");
16
+ let configs = require("./config/priceFeedConfig.json");
18
17
  this.config = PriceFeeds._selectConfig(configs, priceFeedConfigNetwork);
19
- _a = tslib_1.__read(PriceFeeds._constructFeedInfo(this.config), 2), this.feedInfo = _a[0], this.feedEndpoints = _a[1];
18
+ [this.feedInfo, this.feedEndpoints] = PriceFeeds._constructFeedInfo(this.config);
20
19
  this.dataHandler = dataHandler;
21
20
  this.triangulations = new Map();
22
21
  }
@@ -24,140 +23,84 @@ var PriceFeeds = /** @class */ (function () {
24
23
  * Pre-processing of triangulations for symbols, given the price feeds
25
24
  * @param symbols set of symbols we want to triangulate from price feeds
26
25
  */
27
- PriceFeeds.prototype.initializeTriangulations = function (symbols) {
28
- var e_1, _a, e_2, _b;
29
- var feedSymbols = new Array();
30
- try {
31
- for (var _c = tslib_1.__values(this.feedInfo), _d = _c.next(); !_d.done; _d = _c.next()) {
32
- var _e = tslib_1.__read(_d.value, 2), value = _e[1];
33
- feedSymbols.push(value.symbol);
34
- }
35
- }
36
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
37
- finally {
38
- try {
39
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
40
- }
41
- finally { if (e_1) throw e_1.error; }
26
+ initializeTriangulations(symbols) {
27
+ let feedSymbols = new Array();
28
+ for (let [, value] of this.feedInfo) {
29
+ feedSymbols.push(value.symbol);
42
30
  }
43
- try {
44
- for (var _f = tslib_1.__values(symbols.values()), _g = _f.next(); !_g.done; _g = _f.next()) {
45
- var symbol = _g.value;
46
- var triangulation = triangulator_1.default.triangulate(feedSymbols, symbol);
47
- this.triangulations.set(symbol, triangulation);
48
- }
31
+ for (let symbol of symbols.values()) {
32
+ let triangulation = triangulator_1.default.triangulate(feedSymbols, symbol);
33
+ this.triangulations.set(symbol, triangulation);
49
34
  }
50
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
51
- finally {
52
- try {
53
- if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
54
- }
55
- finally { if (e_2) throw e_2.error; }
56
- }
57
- };
35
+ }
58
36
  /**
59
37
  * Get required information to be able to submit a blockchain transaction with price-update
60
38
  * such as trade execution, liquidation
61
39
  * @param symbol symbol of perpetual, e.g., BTC-USD-MATIC
62
40
  * @returns PriceFeedSubmission, index prices, market closed information
63
41
  */
64
- PriceFeeds.prototype.fetchFeedPriceInfoAndIndicesForPerpetual = function (symbol) {
65
- return tslib_1.__awaiter(this, void 0, void 0, function () {
66
- var indexSymbols, submission, _a, _idxPrices, _mktClosed, idxPrices, mktClosed;
67
- return tslib_1.__generator(this, function (_b) {
68
- switch (_b.label) {
69
- case 0:
70
- indexSymbols = this.dataHandler.getIndexSymbols(symbol);
71
- return [4 /*yield*/, this.fetchLatestFeedPriceInfoForPerpetual(symbol)];
72
- case 1:
73
- submission = _b.sent();
74
- _a = tslib_1.__read(this.calculateTriangulatedPricesFromFeedInfo(indexSymbols.filter(function (x) { return x != ""; }), submission), 2), _idxPrices = _a[0], _mktClosed = _a[1];
75
- idxPrices = [_idxPrices[0], 0];
76
- mktClosed = [_mktClosed[0], false];
77
- if (idxPrices.length > 1) {
78
- idxPrices[1] = _idxPrices[1];
79
- mktClosed[1] = _mktClosed[1];
80
- }
81
- return [2 /*return*/, { submission: submission, pxS2S3: idxPrices, mktClosed: mktClosed }];
82
- }
83
- });
84
- });
85
- };
42
+ async fetchFeedPriceInfoAndIndicesForPerpetual(symbol) {
43
+ let indexSymbols = this.dataHandler.getIndexSymbols(symbol);
44
+ // fetch prices from required price-feeds (REST)
45
+ let submission = await this.fetchLatestFeedPriceInfoForPerpetual(symbol);
46
+ // calculate index-prices from price-feeds
47
+ let [_idxPrices, _mktClosed] = this.calculateTriangulatedPricesFromFeedInfo(indexSymbols.filter((x) => x != ""), submission);
48
+ let idxPrices = [_idxPrices[0], 0];
49
+ let mktClosed = [_mktClosed[0], false];
50
+ if (idxPrices.length > 1) {
51
+ idxPrices[1] = _idxPrices[1];
52
+ mktClosed[1] = _mktClosed[1];
53
+ }
54
+ return { submission: submission, pxS2S3: idxPrices, mktClosed: mktClosed };
55
+ }
86
56
  /**
87
57
  * Get all prices/isMarketClosed for the provided symbols via
88
58
  * "latest_price_feeds" and triangulation. Triangulation must be defined in config, unless
89
59
  * it is a direct price feed.
90
60
  * @returns map of feed-price symbol to price/isMarketClosed
91
61
  */
92
- PriceFeeds.prototype.fetchPrices = function (symbols) {
93
- return tslib_1.__awaiter(this, void 0, void 0, function () {
94
- var feedPrices, _a, prices, mktClosed, symMap, k;
95
- return tslib_1.__generator(this, function (_b) {
96
- switch (_b.label) {
97
- case 0: return [4 /*yield*/, this.fetchAllFeedPrices()];
98
- case 1:
99
- feedPrices = _b.sent();
100
- _a = tslib_1.__read(this.triangulatePricesFromFeedPrices(symbols, feedPrices), 2), prices = _a[0], mktClosed = _a[1];
101
- symMap = new Map();
102
- for (k = 0; k < symbols.length; k++) {
103
- symMap.set(symbols[k], [prices[k], mktClosed[k]]);
104
- }
105
- return [2 /*return*/, symMap];
106
- }
107
- });
108
- });
109
- };
62
+ async fetchPrices(symbols) {
63
+ let feedPrices = await this.fetchAllFeedPrices();
64
+ let [prices, mktClosed] = this.triangulatePricesFromFeedPrices(symbols, feedPrices);
65
+ let symMap = new Map();
66
+ for (let k = 0; k < symbols.length; k++) {
67
+ symMap.set(symbols[k], [prices[k], mktClosed[k]]);
68
+ }
69
+ return symMap;
70
+ }
110
71
  /**
111
72
  * Get index prices and market closed information for the given perpetual
112
73
  * @param symbol perpetual symbol such as ETH-USD-MATIC
113
74
  * @returns Index prices and market closed information
114
75
  */
115
- PriceFeeds.prototype.fetchPricesForPerpetual = function (symbol) {
116
- return tslib_1.__awaiter(this, void 0, void 0, function () {
117
- var indexSymbols, feedSymbols, indexSymbols_1, indexSymbols_1_1, sym, triang, feedPrices, _a, prices, mktClosed;
118
- var e_3, _b;
119
- return tslib_1.__generator(this, function (_c) {
120
- switch (_c.label) {
121
- case 0:
122
- indexSymbols = this.dataHandler.getIndexSymbols(symbol).filter(function (x) { return x != ""; });
123
- feedSymbols = new Array();
124
- try {
125
- for (indexSymbols_1 = tslib_1.__values(indexSymbols), indexSymbols_1_1 = indexSymbols_1.next(); !indexSymbols_1_1.done; indexSymbols_1_1 = indexSymbols_1.next()) {
126
- sym = indexSymbols_1_1.value;
127
- if (sym != "") {
128
- triang = this.triangulations.get(sym);
129
- if (triang == undefined) {
130
- // no triangulation defined, so symbol must be a feed (unless misconfigured)
131
- feedSymbols.push(sym);
132
- }
133
- else {
134
- // push all required feeds to array
135
- triang[0].map(function (feedSym) { return feedSymbols.push(feedSym); });
136
- }
137
- }
138
- }
139
- }
140
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
141
- finally {
142
- try {
143
- if (indexSymbols_1_1 && !indexSymbols_1_1.done && (_b = indexSymbols_1.return)) _b.call(indexSymbols_1);
144
- }
145
- finally { if (e_3) throw e_3.error; }
146
- }
147
- return [4 /*yield*/, this.fetchFeedPrices(feedSymbols)];
148
- case 1:
149
- feedPrices = _c.sent();
150
- _a = tslib_1.__read(this.triangulatePricesFromFeedPrices(indexSymbols, feedPrices), 2), prices = _a[0], mktClosed = _a[1];
151
- // ensure we return an array of 2 in all cases
152
- if (prices.length == 1) {
153
- prices.push(0);
154
- mktClosed.push(false);
155
- }
156
- return [2 /*return*/, { idxPrices: prices, mktClosed: mktClosed }];
76
+ async fetchPricesForPerpetual(symbol) {
77
+ let indexSymbols = this.dataHandler.getIndexSymbols(symbol).filter((x) => x != "");
78
+ // determine relevant price feeds
79
+ let feedSymbols = new Array();
80
+ for (let sym of indexSymbols) {
81
+ if (sym != "") {
82
+ let triang = this.triangulations.get(sym);
83
+ if (triang == undefined) {
84
+ // no triangulation defined, so symbol must be a feed (unless misconfigured)
85
+ feedSymbols.push(sym);
157
86
  }
158
- });
159
- });
160
- };
87
+ else {
88
+ // push all required feeds to array
89
+ triang[0].map((feedSym) => feedSymbols.push(feedSym));
90
+ }
91
+ }
92
+ }
93
+ // get all feed prices
94
+ let feedPrices = await this.fetchFeedPrices(feedSymbols);
95
+ // triangulate
96
+ let [prices, mktClosed] = this.triangulatePricesFromFeedPrices(indexSymbols, feedPrices);
97
+ // ensure we return an array of 2 in all cases
98
+ if (prices.length == 1) {
99
+ prices.push(0);
100
+ mktClosed.push(false);
101
+ }
102
+ return { idxPrices: prices, mktClosed: mktClosed };
103
+ }
161
104
  /**
162
105
  * Fetch the provided feed prices and bool whether market is closed or open
163
106
  * - requires the feeds to be defined in priceFeedConfig.json
@@ -165,68 +108,49 @@ var PriceFeeds = /** @class */ (function () {
165
108
  * @param symbols array of feed-price symbols (e.g., [btc-usd, eth-usd]) or undefined
166
109
  * @returns mapping symbol-> [price, isMarketClosed]
167
110
  */
168
- PriceFeeds.prototype.fetchFeedPrices = function (symbols) {
169
- return tslib_1.__awaiter(this, void 0, void 0, function () {
170
- var queries, symbolsOfEndpoint, j, k, currFeed, endpointId, resultPrices, k, _a, pxInfo, tsSecNow, j, price, isMarketClosed;
171
- return tslib_1.__generator(this, function (_b) {
172
- switch (_b.label) {
173
- case 0:
174
- queries = new Array(this.feedEndpoints.length);
175
- symbolsOfEndpoint = [];
176
- for (j = 0; j < queries.length; j++) {
177
- symbolsOfEndpoint.push([]);
178
- }
179
- for (k = 0; k < this.config.ids.length; k++) {
180
- currFeed = this.config.ids[k];
181
- if (symbols != undefined && !symbols.includes(currFeed.symbol)) {
182
- continue;
183
- }
184
- endpointId = this.feedInfo.get(currFeed.id).endpointId;
185
- symbolsOfEndpoint[endpointId].push(currFeed.symbol);
186
- if (queries[endpointId] == undefined) {
187
- // each id can have a different endpoint, but we cluster
188
- // the queries into one per endpoint
189
- queries[endpointId] = this.feedEndpoints[endpointId] + "/latest_price_feeds?";
190
- }
191
- queries[endpointId] = queries[endpointId] + "ids[]=" + currFeed.id + "&";
192
- }
193
- resultPrices = new Map();
194
- k = 0;
195
- _b.label = 1;
196
- case 1:
197
- if (!(k < queries.length)) return [3 /*break*/, 4];
198
- if (queries[k] == undefined) {
199
- return [3 /*break*/, 3];
200
- }
201
- return [4 /*yield*/, this.fetchPriceQuery(queries[k])];
202
- case 2:
203
- _a = tslib_1.__read.apply(void 0, [_b.sent(), 2]), pxInfo = _a[1];
204
- tsSecNow = Math.round(Date.now() / 1000);
205
- for (j = 0; j < pxInfo.length; j++) {
206
- price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo[j].price), -pxInfo[j].expo);
207
- isMarketClosed = tsSecNow - pxInfo[j].publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
208
- resultPrices.set(symbolsOfEndpoint[k][j], [price, isMarketClosed]);
209
- }
210
- _b.label = 3;
211
- case 3:
212
- k++;
213
- return [3 /*break*/, 1];
214
- case 4: return [2 /*return*/, resultPrices];
215
- }
216
- });
217
- });
218
- };
111
+ async fetchFeedPrices(symbols) {
112
+ let queries = new Array(this.feedEndpoints.length);
113
+ let symbolsOfEndpoint = [];
114
+ for (let j = 0; j < queries.length; j++) {
115
+ symbolsOfEndpoint.push([]);
116
+ }
117
+ for (let k = 0; k < this.config.ids.length; k++) {
118
+ let currFeed = this.config.ids[k];
119
+ if (symbols != undefined && !symbols.includes(currFeed.symbol)) {
120
+ continue;
121
+ }
122
+ // feedInfo: Map<string, {symbol:string, endpointId: number}>; // priceFeedId -> symbol, endpointId
123
+ let endpointId = this.feedInfo.get(currFeed.id).endpointId;
124
+ symbolsOfEndpoint[endpointId].push(currFeed.symbol);
125
+ if (queries[endpointId] == undefined) {
126
+ // each id can have a different endpoint, but we cluster
127
+ // the queries into one per endpoint
128
+ queries[endpointId] = this.feedEndpoints[endpointId] + "/latest_price_feeds?";
129
+ }
130
+ queries[endpointId] = queries[endpointId] + "ids[]=" + currFeed.id + "&";
131
+ }
132
+ let resultPrices = new Map();
133
+ for (let k = 0; k < queries.length; k++) {
134
+ if (queries[k] == undefined) {
135
+ continue;
136
+ }
137
+ let [, pxInfo] = await this.fetchPriceQuery(queries[k]);
138
+ let tsSecNow = Math.round(Date.now() / 1000);
139
+ for (let j = 0; j < pxInfo.length; j++) {
140
+ let price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo[j].price), -pxInfo[j].expo);
141
+ let isMarketClosed = tsSecNow - pxInfo[j].publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
142
+ resultPrices.set(symbolsOfEndpoint[k][j], [price, isMarketClosed]);
143
+ }
144
+ }
145
+ return resultPrices;
146
+ }
219
147
  /**
220
148
  * Get all configured feed prices via "latest_price_feeds"
221
149
  * @returns map of feed-price symbol to price/isMarketClosed
222
150
  */
223
- PriceFeeds.prototype.fetchAllFeedPrices = function () {
224
- return tslib_1.__awaiter(this, void 0, void 0, function () {
225
- return tslib_1.__generator(this, function (_a) {
226
- return [2 /*return*/, this.fetchFeedPrices()];
227
- });
228
- });
229
- };
151
+ async fetchAllFeedPrices() {
152
+ return this.fetchFeedPrices();
153
+ }
230
154
  /**
231
155
  * Get the latest prices for a given perpetual from the offchain oracle
232
156
  * networks
@@ -234,75 +158,64 @@ var PriceFeeds = /** @class */ (function () {
234
158
  * @returns array of price feed updates that can be submitted to the smart contract
235
159
  * and corresponding price information
236
160
  */
237
- PriceFeeds.prototype.fetchLatestFeedPriceInfoForPerpetual = function (symbol) {
238
- return tslib_1.__awaiter(this, void 0, void 0, function () {
239
- var feedIds, queries, orderEndpointNumber, idCountPriceFeeds, symbols, k, info, id, data, priceFeedUpdates, prices, mktClosed, timestamps, tsSecNow, k, endpointId, idWithinEndpoint, pxInfo, price, isMarketClosed;
240
- var _this = this;
241
- return tslib_1.__generator(this, function (_a) {
242
- switch (_a.label) {
243
- case 0:
244
- feedIds = this.dataHandler.getPriceIds(symbol);
245
- queries = new Array(this.feedEndpoints.length);
246
- orderEndpointNumber = new Array();
247
- idCountPriceFeeds = new Array(this.feedEndpoints.length);
248
- symbols = new Array();
249
- for (k = 0; k < feedIds.length; k++) {
250
- info = this.feedInfo.get(feedIds[k]);
251
- if (info == undefined) {
252
- throw new Error("priceFeeds: config for symbol ".concat(symbol, " insufficient"));
253
- }
254
- id = info.endpointId;
255
- symbols.push(info.symbol);
256
- if (queries[id] == undefined) {
257
- // each id can have a different endpoint, but we cluster
258
- // the queries into one per endpoint
259
- queries[id] = this.feedEndpoints[id] + "/latest_price_feeds?target_chain=default&";
260
- idCountPriceFeeds[id] = 0;
261
- }
262
- queries[id] = queries[id] + "ids[]=" + feedIds[k] + "&";
263
- orderEndpointNumber.push(id * 100 + idCountPriceFeeds[id]);
264
- idCountPriceFeeds[id] = idCountPriceFeeds[id] + 1;
265
- }
266
- return [4 /*yield*/, Promise.all(queries.map(function (q) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
267
- return tslib_1.__generator(this, function (_a) {
268
- if (q != undefined) {
269
- return [2 /*return*/, this.fetchVAAQuery(q)];
270
- }
271
- else {
272
- return [2 /*return*/, [[], []]];
273
- }
274
- return [2 /*return*/];
275
- });
276
- }); }))];
277
- case 1:
278
- data = _a.sent();
279
- priceFeedUpdates = new Array();
280
- prices = new Array();
281
- mktClosed = new Array();
282
- timestamps = new Array();
283
- tsSecNow = Math.round(Date.now() / 1000);
284
- for (k = 0; k < orderEndpointNumber.length; k++) {
285
- endpointId = Math.floor(orderEndpointNumber[k] / 100);
286
- idWithinEndpoint = orderEndpointNumber[k] - 100 * endpointId;
287
- priceFeedUpdates.push(data[endpointId][0][idWithinEndpoint]);
288
- pxInfo = data[endpointId][1][idWithinEndpoint];
289
- price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo.price), -pxInfo.expo);
290
- isMarketClosed = tsSecNow - pxInfo.publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
291
- mktClosed.push(isMarketClosed);
292
- prices.push(price);
293
- timestamps.push(pxInfo.publish_time);
294
- }
295
- return [2 /*return*/, {
296
- symbols: symbols,
297
- priceFeedVaas: priceFeedUpdates,
298
- prices: prices,
299
- isMarketClosed: mktClosed,
300
- timestamps: timestamps,
301
- }];
302
- }
303
- });
304
- });
305
- };
161
+ async fetchLatestFeedPriceInfoForPerpetual(symbol) {
162
+ let feedIds = this.dataHandler.getPriceIds(symbol);
163
+ let queries = new Array(this.feedEndpoints.length);
164
+ // we need to preserve the order of the price feeds
165
+ let orderEndpointNumber = new Array();
166
+ // count how many prices per endpoint
167
+ let idCountPriceFeeds = new Array(this.feedEndpoints.length);
168
+ let symbols = new Array();
169
+ for (let k = 0; k < feedIds.length; k++) {
170
+ let info = this.feedInfo.get(feedIds[k]);
171
+ if (info == undefined) {
172
+ throw new Error(`priceFeeds: config for symbol ${symbol} insufficient`);
173
+ }
174
+ let id = info.endpointId;
175
+ symbols.push(info.symbol);
176
+ if (queries[id] == undefined) {
177
+ // each id can have a different endpoint, but we cluster
178
+ // the queries into one per endpoint
179
+ queries[id] = this.feedEndpoints[id] + "/latest_price_feeds?binary=true&";
180
+ idCountPriceFeeds[id] = 0;
181
+ }
182
+ queries[id] = queries[id] + "ids[]=" + feedIds[k] + "&";
183
+ orderEndpointNumber.push(id * 100 + idCountPriceFeeds[id]);
184
+ idCountPriceFeeds[id] = idCountPriceFeeds[id] + 1;
185
+ }
186
+ let data = await Promise.all(queries.map(async (q) => {
187
+ if (q != undefined) {
188
+ return this.fetchVAAQuery(q);
189
+ }
190
+ else {
191
+ return [[], []];
192
+ }
193
+ }));
194
+ // re-order arrays so we preserve the order of the feeds
195
+ const priceFeedUpdates = new Array();
196
+ const prices = new Array();
197
+ const mktClosed = new Array();
198
+ const timestamps = new Array();
199
+ const tsSecNow = Math.round(Date.now() / 1000);
200
+ for (let k = 0; k < orderEndpointNumber.length; k++) {
201
+ let endpointId = Math.floor(orderEndpointNumber[k] / 100);
202
+ let idWithinEndpoint = orderEndpointNumber[k] - 100 * endpointId;
203
+ priceFeedUpdates.push(data[endpointId][0][idWithinEndpoint]);
204
+ let pxInfo = data[endpointId][1][idWithinEndpoint];
205
+ let price = (0, d8XMath_1.decNToFloat)(bignumber_1.BigNumber.from(pxInfo.price), -pxInfo.expo);
206
+ let isMarketClosed = tsSecNow - pxInfo.publish_time > this.THRESHOLD_MARKET_CLOSED_SEC;
207
+ mktClosed.push(isMarketClosed);
208
+ prices.push(price);
209
+ timestamps.push(pxInfo.publish_time);
210
+ }
211
+ return {
212
+ symbols: symbols,
213
+ priceFeedVaas: priceFeedUpdates,
214
+ prices: prices,
215
+ isMarketClosed: mktClosed,
216
+ timestamps: timestamps,
217
+ };
218
+ }
306
219
  /**
307
220
  * Extract pair-prices from underlying price feeds via triangulation
308
221
  * The function either needs a direct price feed or a defined triangulation to succesfully
@@ -311,13 +224,13 @@ var PriceFeeds = /** @class */ (function () {
311
224
  * @param feeds data obtained via fetchLatestFeedPriceInfo or fetchLatestFeedPrices
312
225
  * @returns array of prices with same order as symbols
313
226
  */
314
- PriceFeeds.prototype.calculateTriangulatedPricesFromFeedInfo = function (symbols, feeds) {
315
- var priceMap = new Map();
316
- for (var j = 0; j < feeds.prices.length; j++) {
227
+ calculateTriangulatedPricesFromFeedInfo(symbols, feeds) {
228
+ let priceMap = new Map();
229
+ for (let j = 0; j < feeds.prices.length; j++) {
317
230
  priceMap.set(feeds.symbols[j], [feeds.prices[j], feeds.isMarketClosed[j]]);
318
231
  }
319
232
  return this.triangulatePricesFromFeedPrices(symbols, priceMap);
320
- };
233
+ }
321
234
  /**
322
235
  * Extract pair-prices from underlying price feeds via triangulation
323
236
  * The function either needs a direct price feed or a defined triangulation to succesfully
@@ -326,15 +239,15 @@ var PriceFeeds = /** @class */ (function () {
326
239
  * @param feeds data obtained via fetchLatestFeedPriceInfo or fetchLatestFeedPrices
327
240
  * @returns array of prices with same order as symbols
328
241
  */
329
- PriceFeeds.prototype.triangulatePricesFromFeedPrices = function (symbols, feedPriceMap) {
330
- var prices = new Array();
331
- var mktClosed = new Array();
332
- for (var k = 0; k < symbols.length; k++) {
333
- var triangulation = this.triangulations.get(symbols[k]);
242
+ triangulatePricesFromFeedPrices(symbols, feedPriceMap) {
243
+ let prices = new Array();
244
+ let mktClosed = new Array();
245
+ for (let k = 0; k < symbols.length; k++) {
246
+ let triangulation = this.triangulations.get(symbols[k]);
334
247
  if (triangulation == undefined) {
335
- var feedPrice = feedPriceMap.get(symbols[k]);
248
+ let feedPrice = feedPriceMap.get(symbols[k]);
336
249
  if (feedPrice == undefined) {
337
- throw new Error("PriceFeeds: no triangulation defined for ".concat(symbols[k]));
250
+ throw new Error(`PriceFeeds: no triangulation defined for ${symbols[k]}`);
338
251
  }
339
252
  else {
340
253
  prices.push(feedPrice[0]); //price
@@ -342,110 +255,86 @@ var PriceFeeds = /** @class */ (function () {
342
255
  continue;
343
256
  }
344
257
  }
345
- var _a = tslib_1.__read(triangulator_1.default.calculateTriangulatedPrice(triangulation, feedPriceMap), 2), px = _a[0], isMktClosed = _a[1];
258
+ let [px, isMktClosed] = triangulator_1.default.calculateTriangulatedPrice(triangulation, feedPriceMap);
346
259
  prices.push(px);
347
260
  mktClosed.push(isMktClosed);
348
261
  }
349
262
  return [prices, mktClosed];
350
- };
263
+ }
351
264
  /**
352
265
  * Queries the REST endpoint and returns parsed VAA price data
353
266
  * @param query query price-info from endpoint
354
267
  * @returns vaa and price info
355
268
  */
356
- PriceFeeds.prototype.fetchVAAQuery = function (query) {
357
- return tslib_1.__awaiter(this, void 0, void 0, function () {
358
- var headers, response, values, priceFeedUpdates, px, k, vaa;
359
- return tslib_1.__generator(this, function (_a) {
360
- switch (_a.label) {
361
- case 0:
362
- headers = { headers: { "Content-Type": "application/json" } };
363
- return [4 /*yield*/, fetch(query, headers)];
364
- case 1:
365
- response = _a.sent();
366
- if (!response.ok) {
367
- throw new Error("Failed to fetch posts (".concat(response.status, "): ").concat(response.statusText));
368
- }
369
- return [4 /*yield*/, response.json()];
370
- case 2:
371
- values = (_a.sent());
372
- priceFeedUpdates = new Array();
373
- px = new Array();
374
- for (k = 0; k < values.length; k++) {
375
- vaa = values[k].vaa;
376
- priceFeedUpdates.push("0x" + buffer_1.Buffer.from(vaa, "base64").toString("hex"));
377
- px.push(values[k].price);
378
- }
379
- return [2 /*return*/, [priceFeedUpdates, px]];
380
- }
381
- });
382
- });
383
- };
269
+ async fetchVAAQuery(query) {
270
+ const headers = { headers: { "Content-Type": "application/json" } };
271
+ let response = await fetch(query, headers);
272
+ if (!response.ok) {
273
+ throw new Error(`Failed to fetch posts (${response.status}): ${response.statusText}`);
274
+ }
275
+ let values = (await response.json());
276
+ const priceFeedUpdates = new Array();
277
+ const px = new Array();
278
+ for (let k = 0; k < values.length; k++) {
279
+ const vaa = values[k].vaa;
280
+ priceFeedUpdates.push("0x" + buffer_1.Buffer.from(vaa, "base64").toString("hex"));
281
+ px.push(values[k].price);
282
+ }
283
+ return [priceFeedUpdates, px];
284
+ }
384
285
  /**
385
286
  * Queries the REST endpoint and returns parsed price data
386
287
  * @param query query price-info from endpoint
387
288
  * @returns vaa and price info
388
289
  */
389
- PriceFeeds.prototype.fetchPriceQuery = function (query) {
390
- return tslib_1.__awaiter(this, void 0, void 0, function () {
391
- var headers, response, values, priceFeedUpdates, px, k;
392
- return tslib_1.__generator(this, function (_a) {
393
- switch (_a.label) {
394
- case 0:
395
- headers = { headers: { "Content-Type": "application/json" } };
396
- return [4 /*yield*/, fetch(query, headers)];
397
- case 1:
398
- response = _a.sent();
399
- if (!response.ok) {
400
- throw new Error("Failed to fetch posts (".concat(response.status, "): ").concat(response.statusText));
401
- }
402
- return [4 /*yield*/, response.json()];
403
- case 2:
404
- values = _a.sent();
405
- priceFeedUpdates = new Array();
406
- px = new Array();
407
- for (k = 0; k < values.length; k++) {
408
- priceFeedUpdates.push("0x" + buffer_1.Buffer.from(values[k].id, "base64").toString("hex"));
409
- px.push(values[k].price);
410
- }
411
- return [2 /*return*/, [priceFeedUpdates, px]];
412
- }
413
- });
414
- });
415
- };
290
+ async fetchPriceQuery(query) {
291
+ const headers = { headers: { "Content-Type": "application/json" } };
292
+ let response = await fetch(query, headers);
293
+ if (!response.ok) {
294
+ throw new Error(`Failed to fetch posts (${response.status}): ${response.statusText}`);
295
+ }
296
+ let values = await response.json();
297
+ const priceFeedUpdates = new Array();
298
+ const px = new Array();
299
+ for (let k = 0; k < values.length; k++) {
300
+ priceFeedUpdates.push("0x" + buffer_1.Buffer.from(values[k].id, "base64").toString("hex"));
301
+ px.push(values[k].price);
302
+ }
303
+ return [priceFeedUpdates, px];
304
+ }
416
305
  /**
417
306
  * Searches for configuration for given network
418
307
  * @param configs pricefeed configuration from json
419
308
  * @param network e.g. testnet
420
309
  * @returns selected configuration
421
310
  */
422
- PriceFeeds._selectConfig = function (configs, network) {
423
- var k = 0;
311
+ static _selectConfig(configs, network) {
312
+ let k = 0;
424
313
  while (k < configs.length) {
425
314
  if (configs[k].network == network) {
426
315
  return configs[k];
427
316
  }
428
317
  k = k + 1;
429
318
  }
430
- throw new Error("PriceFeeds: config not found for network ".concat(network));
431
- };
319
+ throw new Error(`PriceFeeds: config not found for network ${network}`);
320
+ }
432
321
  /**
433
322
  * Wraps configuration into convenient data-structure
434
323
  * @param config configuration for the selected network
435
324
  * @returns feedInfo-map and endPoints-array
436
325
  */
437
- PriceFeeds._constructFeedInfo = function (config) {
438
- var feed = new Map();
439
- var endpointId = -1;
440
- var type = "";
441
- var feedEndpoints = new Array();
442
- for (var k = 0; k < config.endpoints.length; k++) {
326
+ static _constructFeedInfo(config) {
327
+ let feed = new Map();
328
+ let endpointId = -1;
329
+ let type = "";
330
+ let feedEndpoints = new Array();
331
+ for (let k = 0; k < config.endpoints.length; k++) {
443
332
  feedEndpoints.push(config.endpoints[k].endpoint);
444
333
  }
445
- for (var k = 0; k < config.ids.length; k++) {
334
+ for (let k = 0; k < config.ids.length; k++) {
446
335
  if (type != config.ids[k].type) {
447
336
  type = config.ids[k].type;
448
- var j = 0;
337
+ let j = 0;
449
338
  while (j < config.endpoints.length) {
450
339
  if (config.endpoints[j].type == type) {
451
340
  endpointId = j;
@@ -454,14 +343,13 @@ var PriceFeeds = /** @class */ (function () {
454
343
  j++;
455
344
  }
456
345
  if (config.endpoints[endpointId].type != type) {
457
- throw new Error("priceFeeds: no enpoint found for ".concat(type, " check priceFeedConfig"));
346
+ throw new Error(`priceFeeds: no enpoint found for ${type} check priceFeedConfig`);
458
347
  }
459
348
  }
460
349
  feed.set(config.ids[k].id, { symbol: config.ids[k].symbol.toUpperCase(), endpointId: endpointId });
461
350
  }
462
351
  return [feed, feedEndpoints];
463
- };
464
- return PriceFeeds;
465
- }());
352
+ }
353
+ }
466
354
  exports.default = PriceFeeds;
467
355
  //# sourceMappingURL=priceFeeds.js.map