@drift-labs/sdk 0.2.0-master.25 → 0.2.0-master.26

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 (184) hide show
  1. package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +13 -13
  2. package/lib/accounts/pollingClearingHouseAccountSubscriber.js +27 -27
  3. package/lib/accounts/types.d.ts +8 -9
  4. package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +14 -14
  5. package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +35 -34
  6. package/lib/addresses/pda.d.ts +7 -6
  7. package/lib/addresses/pda.js +31 -27
  8. package/lib/admin.d.ts +9 -6
  9. package/lib/admin.js +83 -42
  10. package/lib/clearingHouse.d.ts +69 -42
  11. package/lib/clearingHouse.js +753 -277
  12. package/lib/clearingHouseConfig.d.ts +2 -2
  13. package/lib/clearingHouseUser.d.ts +16 -16
  14. package/lib/clearingHouseUser.js +139 -119
  15. package/lib/config.d.ts +7 -7
  16. package/lib/config.js +20 -20
  17. package/lib/constants/numericConstants.d.ts +12 -12
  18. package/lib/constants/numericConstants.js +13 -13
  19. package/lib/constants/{markets.d.ts → perpMarkets.d.ts} +5 -5
  20. package/{src/constants/markets.js → lib/constants/perpMarkets.js} +4 -4
  21. package/lib/constants/{banks.d.ts → spotMarkets.d.ts} +6 -6
  22. package/lib/constants/{banks.js → spotMarkets.js} +16 -16
  23. package/lib/events/types.d.ts +2 -1
  24. package/lib/events/types.js +1 -0
  25. package/lib/examples/makeTradeExample.js +7 -7
  26. package/lib/idl/clearing_house.json +1008 -279
  27. package/lib/index.d.ts +5 -3
  28. package/lib/index.js +5 -3
  29. package/lib/math/amm.d.ts +2 -2
  30. package/lib/math/amm.js +1 -1
  31. package/lib/math/funding.d.ts +6 -6
  32. package/lib/math/funding.js +2 -1
  33. package/lib/math/margin.d.ts +4 -4
  34. package/lib/math/margin.js +18 -11
  35. package/lib/math/market.d.ts +10 -9
  36. package/lib/math/market.js +29 -6
  37. package/lib/math/oracles.d.ts +2 -1
  38. package/lib/math/oracles.js +11 -1
  39. package/lib/math/orders.d.ts +5 -5
  40. package/lib/math/position.d.ts +13 -13
  41. package/lib/math/position.js +19 -19
  42. package/lib/math/spotBalance.d.ts +19 -0
  43. package/lib/math/spotBalance.js +176 -0
  44. package/lib/math/spotMarket.d.ts +4 -0
  45. package/lib/math/spotMarket.js +8 -0
  46. package/lib/math/spotPosition.d.ts +2 -0
  47. package/lib/math/spotPosition.js +8 -0
  48. package/lib/math/state.js +2 -2
  49. package/lib/math/trade.d.ts +4 -4
  50. package/lib/orderParams.d.ts +4 -4
  51. package/lib/orderParams.js +12 -4
  52. package/lib/serum/serumSubscriber.d.ts +23 -0
  53. package/lib/serum/serumSubscriber.js +41 -0
  54. package/lib/serum/types.d.ts +11 -0
  55. package/lib/serum/types.js +2 -0
  56. package/lib/tx/retryTxSender.d.ts +1 -1
  57. package/lib/tx/retryTxSender.js +4 -2
  58. package/lib/tx/types.d.ts +1 -1
  59. package/lib/types.d.ts +123 -33
  60. package/lib/types.js +31 -9
  61. package/my-script/.env +7 -0
  62. package/my-script/getUserStats.ts +106 -0
  63. package/my-script/multiConnections.ts +119 -0
  64. package/my-script/test-regex.ts +11 -0
  65. package/my-script/utils.ts +52 -0
  66. package/package.json +1 -1
  67. package/src/accounts/bulkAccountLoader.js +249 -0
  68. package/src/accounts/bulkUserStatsSubscription.js +75 -0
  69. package/src/accounts/bulkUserSubscription.js +75 -0
  70. package/src/accounts/fetch.js +92 -0
  71. package/src/accounts/pollingClearingHouseAccountSubscriber.js +465 -0
  72. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +38 -38
  73. package/src/accounts/pollingOracleSubscriber.js +156 -0
  74. package/src/accounts/pollingTokenAccountSubscriber.js +141 -0
  75. package/src/accounts/pollingUserAccountSubscriber.js +208 -0
  76. package/src/accounts/pollingUserStatsAccountSubscriber.js +208 -0
  77. package/src/accounts/types.js +28 -0
  78. package/src/accounts/types.ts +11 -9
  79. package/src/accounts/utils.js +7 -0
  80. package/src/accounts/webSocketAccountSubscriber.js +138 -0
  81. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +433 -0
  82. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +59 -52
  83. package/src/accounts/webSocketUserAccountSubscriber.js +113 -0
  84. package/src/accounts/webSocketUserStatsAccountSubsriber.js +113 -0
  85. package/src/addresses/pda.js +186 -0
  86. package/src/addresses/pda.ts +49 -44
  87. package/src/admin.js +1284 -0
  88. package/src/admin.ts +140 -47
  89. package/src/assert/assert.js +1 -1
  90. package/src/clearingHouse.js +3433 -0
  91. package/src/clearingHouse.ts +1083 -378
  92. package/src/clearingHouseConfig.js +2 -0
  93. package/src/clearingHouseConfig.ts +2 -2
  94. package/src/clearingHouseUser.js +874 -0
  95. package/src/clearingHouseUser.ts +232 -168
  96. package/src/clearingHouseUserConfig.js +2 -0
  97. package/src/clearingHouseUserStats.js +115 -0
  98. package/src/clearingHouseUserStatsConfig.js +2 -0
  99. package/src/config.js +80 -0
  100. package/src/config.ts +29 -29
  101. package/src/constants/numericConstants.js +18 -11
  102. package/src/constants/numericConstants.ts +17 -15
  103. package/{lib/constants/markets.js → src/constants/perpMarkets.js} +11 -11
  104. package/src/constants/{markets.ts → perpMarkets.ts} +5 -5
  105. package/src/constants/spotMarkets.js +51 -0
  106. package/src/constants/{banks.ts → spotMarkets.ts} +19 -19
  107. package/src/events/eventList.js +66 -23
  108. package/src/events/eventSubscriber.js +202 -0
  109. package/src/events/fetchLogs.js +117 -0
  110. package/src/events/pollingLogProvider.js +113 -0
  111. package/src/events/sort.js +41 -0
  112. package/src/events/txEventCache.js +22 -19
  113. package/src/events/types.js +25 -0
  114. package/src/events/types.ts +3 -0
  115. package/src/events/webSocketLogProvider.js +76 -0
  116. package/src/examples/makeTradeExample.ts +10 -8
  117. package/src/factory/bigNum.js +183 -180
  118. package/src/factory/oracleClient.js +9 -9
  119. package/src/idl/clearing_house.json +1008 -279
  120. package/src/index.js +75 -0
  121. package/src/index.ts +5 -3
  122. package/src/math/amm.js +422 -0
  123. package/src/math/amm.ts +6 -3
  124. package/src/math/auction.js +10 -10
  125. package/src/math/conversion.js +4 -3
  126. package/src/math/funding.js +223 -175
  127. package/src/math/funding.ts +7 -7
  128. package/src/math/insurance.js +27 -0
  129. package/src/math/margin.js +77 -0
  130. package/src/math/margin.ts +34 -23
  131. package/src/math/market.js +105 -0
  132. package/src/math/market.ts +71 -19
  133. package/src/math/oracles.js +40 -10
  134. package/src/math/oracles.ts +18 -1
  135. package/src/math/orders.js +153 -0
  136. package/src/math/orders.ts +5 -5
  137. package/src/math/position.js +172 -0
  138. package/src/math/position.ts +31 -31
  139. package/src/math/repeg.js +40 -40
  140. package/src/math/spotBalance.js +176 -0
  141. package/src/math/spotBalance.ts +290 -0
  142. package/src/math/spotMarket.js +8 -0
  143. package/src/math/spotMarket.ts +9 -0
  144. package/src/math/spotPosition.js +8 -0
  145. package/src/math/spotPosition.ts +6 -0
  146. package/src/math/state.ts +2 -2
  147. package/src/math/trade.js +81 -74
  148. package/src/math/trade.ts +4 -4
  149. package/src/math/utils.js +8 -7
  150. package/src/oracles/oracleClientCache.js +10 -9
  151. package/src/oracles/pythClient.js +52 -17
  152. package/src/oracles/quoteAssetOracleClient.js +44 -13
  153. package/src/oracles/switchboardClient.js +69 -37
  154. package/src/oracles/types.js +1 -1
  155. package/src/orderParams.js +14 -6
  156. package/src/orderParams.ts +16 -8
  157. package/src/serum/serumSubscriber.js +102 -0
  158. package/src/serum/serumSubscriber.ts +80 -0
  159. package/src/serum/types.js +2 -0
  160. package/src/serum/types.ts +13 -0
  161. package/src/slot/SlotSubscriber.js +67 -20
  162. package/src/token/index.js +4 -4
  163. package/src/tokenFaucet.js +288 -154
  164. package/src/tx/retryTxSender.js +280 -0
  165. package/src/tx/retryTxSender.ts +5 -2
  166. package/src/tx/types.js +1 -1
  167. package/src/tx/types.ts +2 -1
  168. package/src/tx/utils.js +7 -6
  169. package/src/types.js +216 -0
  170. package/src/types.ts +110 -33
  171. package/src/userName.js +5 -5
  172. package/src/util/computeUnits.js +46 -11
  173. package/src/util/promiseTimeout.js +5 -5
  174. package/src/util/tps.js +46 -12
  175. package/src/wallet.js +55 -18
  176. package/lib/math/bankBalance.d.ts +0 -15
  177. package/lib/math/bankBalance.js +0 -150
  178. package/src/addresses/marketAddresses.js +0 -26
  179. package/src/constants/banks.js +0 -42
  180. package/src/examples/makeTradeExample.js +0 -80
  181. package/src/math/bankBalance.ts +0 -258
  182. package/src/math/state.js +0 -15
  183. package/src/math/utils.js.map +0 -1
  184. package/src/util/getTokenAddress.js +0 -9
@@ -0,0 +1,433 @@
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
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ exports.__esModule = true;
39
+ exports.WebSocketClearingHouseAccountSubscriber = void 0;
40
+ var types_1 = require("./types");
41
+ var events_1 = require("events");
42
+ var pda_1 = require("../addresses/pda");
43
+ var webSocketAccountSubscriber_1 = require("./webSocketAccountSubscriber");
44
+ var web3_js_1 = require("@solana/web3.js");
45
+ var oracleClientCache_1 = require("../oracles/oracleClientCache");
46
+ var quoteAssetOracleClient_1 = require("../oracles/quoteAssetOracleClient");
47
+ var WebSocketClearingHouseAccountSubscriber = /** @class */ (function () {
48
+ function WebSocketClearingHouseAccountSubscriber(program, perpMarketIndexes, spotMarketIndexes, oracleInfos) {
49
+ this.oracleClientCache = new oracleClientCache_1.OracleClientCache();
50
+ this.perpMarketAccountSubscribers = new Map();
51
+ this.spotMarketAccountSubscribers = new Map();
52
+ this.oracleSubscribers = new Map();
53
+ this.isSubscribing = false;
54
+ this.isSubscribed = false;
55
+ this.program = program;
56
+ this.eventEmitter = new events_1.EventEmitter();
57
+ this.perpMarketIndexes = perpMarketIndexes;
58
+ this.spotMarketIndexes = spotMarketIndexes;
59
+ this.oracleInfos = oracleInfos;
60
+ }
61
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribe = function () {
62
+ return __awaiter(this, void 0, void 0, function () {
63
+ var statePublicKey;
64
+ var _this = this;
65
+ return __generator(this, function (_a) {
66
+ switch (_a.label) {
67
+ case 0:
68
+ if (this.isSubscribed) {
69
+ return [2 /*return*/, true];
70
+ }
71
+ if (!this.isSubscribing) return [3 /*break*/, 2];
72
+ return [4 /*yield*/, this.subscriptionPromise];
73
+ case 1: return [2 /*return*/, _a.sent()];
74
+ case 2:
75
+ this.isSubscribing = true;
76
+ this.subscriptionPromise = new Promise(function (res) {
77
+ _this.subscriptionPromiseResolver = res;
78
+ });
79
+ return [4 /*yield*/, (0, pda_1.getClearingHouseStateAccountPublicKey)(this.program.programId)];
80
+ case 3:
81
+ statePublicKey = _a.sent();
82
+ // create and activate main state account subscription
83
+ this.stateAccountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('state', this.program, statePublicKey);
84
+ return [4 /*yield*/, this.stateAccountSubscriber.subscribe(function (data) {
85
+ _this.eventEmitter.emit('stateAccountUpdate', data);
86
+ _this.eventEmitter.emit('update');
87
+ })];
88
+ case 4:
89
+ _a.sent();
90
+ // subscribe to market accounts
91
+ return [4 /*yield*/, this.subscribeToMarketAccounts()];
92
+ case 5:
93
+ // subscribe to market accounts
94
+ _a.sent();
95
+ // subscribe to spot market accounts
96
+ return [4 /*yield*/, this.subscribeToSpotMarketAccounts()];
97
+ case 6:
98
+ // subscribe to spot market accounts
99
+ _a.sent();
100
+ // subscribe to oracles
101
+ return [4 /*yield*/, this.subscribeToOracles()];
102
+ case 7:
103
+ // subscribe to oracles
104
+ _a.sent();
105
+ this.eventEmitter.emit('update');
106
+ this.isSubscribing = false;
107
+ this.isSubscribed = true;
108
+ this.subscriptionPromiseResolver(true);
109
+ return [2 /*return*/, true];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToMarketAccounts = function () {
115
+ return __awaiter(this, void 0, void 0, function () {
116
+ var _i, _a, marketIndex;
117
+ return __generator(this, function (_b) {
118
+ switch (_b.label) {
119
+ case 0:
120
+ _i = 0, _a = this.perpMarketIndexes;
121
+ _b.label = 1;
122
+ case 1:
123
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
124
+ marketIndex = _a[_i];
125
+ return [4 /*yield*/, this.subscribeToMarketAccount(marketIndex)];
126
+ case 2:
127
+ _b.sent();
128
+ _b.label = 3;
129
+ case 3:
130
+ _i++;
131
+ return [3 /*break*/, 1];
132
+ case 4: return [2 /*return*/, true];
133
+ }
134
+ });
135
+ });
136
+ };
137
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToMarketAccount = function (marketIndex) {
138
+ return __awaiter(this, void 0, void 0, function () {
139
+ var marketPublicKey, accountSubscriber;
140
+ var _this = this;
141
+ return __generator(this, function (_a) {
142
+ switch (_a.label) {
143
+ case 0: return [4 /*yield*/, (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex)];
144
+ case 1:
145
+ marketPublicKey = _a.sent();
146
+ accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('perpMarket', this.program, marketPublicKey);
147
+ return [4 /*yield*/, accountSubscriber.subscribe(function (data) {
148
+ _this.eventEmitter.emit('perpMarketAccountUpdate', data);
149
+ _this.eventEmitter.emit('update');
150
+ })];
151
+ case 2:
152
+ _a.sent();
153
+ this.perpMarketAccountSubscribers.set(marketIndex.toNumber(), accountSubscriber);
154
+ return [2 /*return*/, true];
155
+ }
156
+ });
157
+ });
158
+ };
159
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToSpotMarketAccounts = function () {
160
+ return __awaiter(this, void 0, void 0, function () {
161
+ var _i, _a, marketIndex;
162
+ return __generator(this, function (_b) {
163
+ switch (_b.label) {
164
+ case 0:
165
+ _i = 0, _a = this.spotMarketIndexes;
166
+ _b.label = 1;
167
+ case 1:
168
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
169
+ marketIndex = _a[_i];
170
+ return [4 /*yield*/, this.subscribeToSpotMarketAccount(marketIndex)];
171
+ case 2:
172
+ _b.sent();
173
+ _b.label = 3;
174
+ case 3:
175
+ _i++;
176
+ return [3 /*break*/, 1];
177
+ case 4: return [2 /*return*/, true];
178
+ }
179
+ });
180
+ });
181
+ };
182
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToSpotMarketAccount = function (marketIndex) {
183
+ return __awaiter(this, void 0, void 0, function () {
184
+ var marketPublicKey, accountSubscriber;
185
+ var _this = this;
186
+ return __generator(this, function (_a) {
187
+ switch (_a.label) {
188
+ case 0: return [4 /*yield*/, (0, pda_1.getSpotMarketPublicKey)(this.program.programId, marketIndex)];
189
+ case 1:
190
+ marketPublicKey = _a.sent();
191
+ accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('spotMarket', this.program, marketPublicKey);
192
+ return [4 /*yield*/, accountSubscriber.subscribe(function (data) {
193
+ _this.eventEmitter.emit('spotMarketAccountUpdate', data);
194
+ _this.eventEmitter.emit('update');
195
+ })];
196
+ case 2:
197
+ _a.sent();
198
+ this.spotMarketAccountSubscribers.set(marketIndex.toNumber(), accountSubscriber);
199
+ return [2 /*return*/, true];
200
+ }
201
+ });
202
+ });
203
+ };
204
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToOracles = function () {
205
+ return __awaiter(this, void 0, void 0, function () {
206
+ var _i, _a, oracleInfo;
207
+ return __generator(this, function (_b) {
208
+ switch (_b.label) {
209
+ case 0:
210
+ _i = 0, _a = this.oracleInfos;
211
+ _b.label = 1;
212
+ case 1:
213
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
214
+ oracleInfo = _a[_i];
215
+ if (!!oracleInfo.publicKey.equals(web3_js_1.PublicKey["default"])) return [3 /*break*/, 3];
216
+ return [4 /*yield*/, this.subscribeToOracle(oracleInfo)];
217
+ case 2:
218
+ _b.sent();
219
+ _b.label = 3;
220
+ case 3:
221
+ _i++;
222
+ return [3 /*break*/, 1];
223
+ case 4: return [2 /*return*/, true];
224
+ }
225
+ });
226
+ });
227
+ };
228
+ WebSocketClearingHouseAccountSubscriber.prototype.subscribeToOracle = function (oracleInfo) {
229
+ return __awaiter(this, void 0, void 0, function () {
230
+ var client, accountSubscriber;
231
+ var _this = this;
232
+ return __generator(this, function (_a) {
233
+ switch (_a.label) {
234
+ case 0:
235
+ client = this.oracleClientCache.get(oracleInfo.source, this.program.provider.connection);
236
+ accountSubscriber = new webSocketAccountSubscriber_1.WebSocketAccountSubscriber('oracle', this.program, oracleInfo.publicKey, function (buffer) {
237
+ return client.getOraclePriceDataFromBuffer(buffer);
238
+ });
239
+ return [4 /*yield*/, accountSubscriber.subscribe(function (data) {
240
+ _this.eventEmitter.emit('oraclePriceUpdate', oracleInfo.publicKey, data);
241
+ _this.eventEmitter.emit('update');
242
+ })];
243
+ case 1:
244
+ _a.sent();
245
+ this.oracleSubscribers.set(oracleInfo.publicKey.toString(), accountSubscriber);
246
+ return [2 /*return*/, true];
247
+ }
248
+ });
249
+ });
250
+ };
251
+ WebSocketClearingHouseAccountSubscriber.prototype.unsubscribeFromMarketAccounts = function () {
252
+ return __awaiter(this, void 0, void 0, function () {
253
+ var _i, _a, accountSubscriber;
254
+ return __generator(this, function (_b) {
255
+ switch (_b.label) {
256
+ case 0:
257
+ _i = 0, _a = this.perpMarketAccountSubscribers.values();
258
+ _b.label = 1;
259
+ case 1:
260
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
261
+ accountSubscriber = _a[_i];
262
+ return [4 /*yield*/, accountSubscriber.unsubscribe()];
263
+ case 2:
264
+ _b.sent();
265
+ _b.label = 3;
266
+ case 3:
267
+ _i++;
268
+ return [3 /*break*/, 1];
269
+ case 4: return [2 /*return*/];
270
+ }
271
+ });
272
+ });
273
+ };
274
+ WebSocketClearingHouseAccountSubscriber.prototype.unsubscribeFromSpotMarketAccounts = function () {
275
+ return __awaiter(this, void 0, void 0, function () {
276
+ var _i, _a, accountSubscriber;
277
+ return __generator(this, function (_b) {
278
+ switch (_b.label) {
279
+ case 0:
280
+ _i = 0, _a = this.spotMarketAccountSubscribers.values();
281
+ _b.label = 1;
282
+ case 1:
283
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
284
+ accountSubscriber = _a[_i];
285
+ return [4 /*yield*/, accountSubscriber.unsubscribe()];
286
+ case 2:
287
+ _b.sent();
288
+ _b.label = 3;
289
+ case 3:
290
+ _i++;
291
+ return [3 /*break*/, 1];
292
+ case 4: return [2 /*return*/];
293
+ }
294
+ });
295
+ });
296
+ };
297
+ WebSocketClearingHouseAccountSubscriber.prototype.unsubscribeFromOracles = function () {
298
+ return __awaiter(this, void 0, void 0, function () {
299
+ var _i, _a, accountSubscriber;
300
+ return __generator(this, function (_b) {
301
+ switch (_b.label) {
302
+ case 0:
303
+ _i = 0, _a = this.oracleSubscribers.values();
304
+ _b.label = 1;
305
+ case 1:
306
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
307
+ accountSubscriber = _a[_i];
308
+ return [4 /*yield*/, accountSubscriber.unsubscribe()];
309
+ case 2:
310
+ _b.sent();
311
+ _b.label = 3;
312
+ case 3:
313
+ _i++;
314
+ return [3 /*break*/, 1];
315
+ case 4: return [2 /*return*/];
316
+ }
317
+ });
318
+ });
319
+ };
320
+ WebSocketClearingHouseAccountSubscriber.prototype.fetch = function () {
321
+ return __awaiter(this, void 0, void 0, function () {
322
+ var promises;
323
+ return __generator(this, function (_a) {
324
+ switch (_a.label) {
325
+ case 0:
326
+ if (!this.isSubscribed) {
327
+ return [2 /*return*/];
328
+ }
329
+ promises = [this.stateAccountSubscriber.fetch()]
330
+ .concat(Array.from(this.perpMarketAccountSubscribers.values()).map(function (subscriber) { return subscriber.fetch(); }))
331
+ .concat(Array.from(this.spotMarketAccountSubscribers.values()).map(function (subscriber) { return subscriber.fetch(); }));
332
+ return [4 /*yield*/, Promise.all(promises)];
333
+ case 1:
334
+ _a.sent();
335
+ return [2 /*return*/];
336
+ }
337
+ });
338
+ });
339
+ };
340
+ WebSocketClearingHouseAccountSubscriber.prototype.unsubscribe = function () {
341
+ return __awaiter(this, void 0, void 0, function () {
342
+ return __generator(this, function (_a) {
343
+ switch (_a.label) {
344
+ case 0:
345
+ if (!this.isSubscribed) {
346
+ return [2 /*return*/];
347
+ }
348
+ return [4 /*yield*/, this.stateAccountSubscriber.unsubscribe()];
349
+ case 1:
350
+ _a.sent();
351
+ return [4 /*yield*/, this.unsubscribeFromMarketAccounts()];
352
+ case 2:
353
+ _a.sent();
354
+ return [4 /*yield*/, this.unsubscribeFromSpotMarketAccounts()];
355
+ case 3:
356
+ _a.sent();
357
+ return [4 /*yield*/, this.unsubscribeFromOracles()];
358
+ case 4:
359
+ _a.sent();
360
+ this.isSubscribed = false;
361
+ return [2 /*return*/];
362
+ }
363
+ });
364
+ });
365
+ };
366
+ WebSocketClearingHouseAccountSubscriber.prototype.addSpotMarket = function (marketIndex) {
367
+ return __awaiter(this, void 0, void 0, function () {
368
+ return __generator(this, function (_a) {
369
+ if (this.spotMarketAccountSubscribers.has(marketIndex.toNumber())) {
370
+ return [2 /*return*/, true];
371
+ }
372
+ return [2 /*return*/, this.subscribeToSpotMarketAccount(marketIndex)];
373
+ });
374
+ });
375
+ };
376
+ WebSocketClearingHouseAccountSubscriber.prototype.addPerpMarket = function (marketIndex) {
377
+ return __awaiter(this, void 0, void 0, function () {
378
+ return __generator(this, function (_a) {
379
+ if (this.perpMarketAccountSubscribers.has(marketIndex.toNumber())) {
380
+ return [2 /*return*/, true];
381
+ }
382
+ return [2 /*return*/, this.subscribeToMarketAccount(marketIndex)];
383
+ });
384
+ });
385
+ };
386
+ WebSocketClearingHouseAccountSubscriber.prototype.addOracle = function (oracleInfo) {
387
+ return __awaiter(this, void 0, void 0, function () {
388
+ return __generator(this, function (_a) {
389
+ if (this.oracleSubscribers.has(oracleInfo.publicKey.toString())) {
390
+ return [2 /*return*/, true];
391
+ }
392
+ if (oracleInfo.publicKey.equals(web3_js_1.PublicKey["default"])) {
393
+ return [2 /*return*/, true];
394
+ }
395
+ return [2 /*return*/, this.subscribeToOracle(oracleInfo)];
396
+ });
397
+ });
398
+ };
399
+ WebSocketClearingHouseAccountSubscriber.prototype.assertIsSubscribed = function () {
400
+ if (!this.isSubscribed) {
401
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
402
+ }
403
+ };
404
+ WebSocketClearingHouseAccountSubscriber.prototype.getStateAccountAndSlot = function () {
405
+ this.assertIsSubscribed();
406
+ return this.stateAccountSubscriber.dataAndSlot;
407
+ };
408
+ WebSocketClearingHouseAccountSubscriber.prototype.getMarketAccountAndSlot = function (marketIndex) {
409
+ this.assertIsSubscribed();
410
+ return this.perpMarketAccountSubscribers.get(marketIndex.toNumber())
411
+ .dataAndSlot;
412
+ };
413
+ WebSocketClearingHouseAccountSubscriber.prototype.getMarketAccountsAndSlots = function () {
414
+ return Array.from(this.perpMarketAccountSubscribers.values()).map(function (subscriber) { return subscriber.dataAndSlot; });
415
+ };
416
+ WebSocketClearingHouseAccountSubscriber.prototype.getSpotMarketAccountAndSlot = function (marketIndex) {
417
+ this.assertIsSubscribed();
418
+ return this.spotMarketAccountSubscribers.get(marketIndex.toNumber())
419
+ .dataAndSlot;
420
+ };
421
+ WebSocketClearingHouseAccountSubscriber.prototype.getOraclePriceDataAndSlot = function (oraclePublicKey) {
422
+ this.assertIsSubscribed();
423
+ if (oraclePublicKey.equals(web3_js_1.PublicKey["default"])) {
424
+ return {
425
+ data: quoteAssetOracleClient_1.QUOTE_ORACLE_PRICE_DATA,
426
+ slot: 0
427
+ };
428
+ }
429
+ return this.oracleSubscribers.get(oraclePublicKey.toString()).dataAndSlot;
430
+ };
431
+ return WebSocketClearingHouseAccountSubscriber;
432
+ }());
433
+ exports.WebSocketClearingHouseAccountSubscriber = WebSocketClearingHouseAccountSubscriber;
@@ -4,13 +4,13 @@ import {
4
4
  DataAndSlot,
5
5
  } from './types';
6
6
  import { AccountSubscriber, NotSubscribedError } from './types';
7
- import { BankAccount, MarketAccount, StateAccount } from '../types';
7
+ import { SpotMarketAccount, PerpMarketAccount, StateAccount } from '../types';
8
8
  import { BN, Program } from '@project-serum/anchor';
9
9
  import StrictEventEmitter from 'strict-event-emitter-types';
10
10
  import { EventEmitter } from 'events';
11
11
  import {
12
12
  getClearingHouseStateAccountPublicKey,
13
- getBankPublicKey,
13
+ getSpotMarketPublicKey,
14
14
  getMarketPublicKey,
15
15
  } from '../addresses/pda';
16
16
  import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber';
@@ -25,18 +25,21 @@ export class WebSocketClearingHouseAccountSubscriber
25
25
  {
26
26
  isSubscribed: boolean;
27
27
  program: Program;
28
- marketIndexes: BN[];
29
- bankIndexes: BN[];
28
+ perpMarketIndexes: BN[];
29
+ spotMarketIndexes: BN[];
30
30
  oracleInfos: OracleInfo[];
31
31
  oracleClientCache = new OracleClientCache();
32
32
 
33
33
  eventEmitter: StrictEventEmitter<EventEmitter, ClearingHouseAccountEvents>;
34
34
  stateAccountSubscriber?: AccountSubscriber<StateAccount>;
35
- marketAccountSubscribers = new Map<
35
+ perpMarketAccountSubscribers = new Map<
36
36
  number,
37
- AccountSubscriber<MarketAccount>
37
+ AccountSubscriber<PerpMarketAccount>
38
+ >();
39
+ spotMarketAccountSubscribers = new Map<
40
+ number,
41
+ AccountSubscriber<SpotMarketAccount>
38
42
  >();
39
- bankAccountSubscribers = new Map<number, AccountSubscriber<BankAccount>>();
40
43
  oracleSubscribers = new Map<string, AccountSubscriber<OraclePriceData>>();
41
44
 
42
45
  private isSubscribing = false;
@@ -45,15 +48,15 @@ export class WebSocketClearingHouseAccountSubscriber
45
48
 
46
49
  public constructor(
47
50
  program: Program,
48
- marketIndexes: BN[],
49
- bankIndexes: BN[],
51
+ perpMarketIndexes: BN[],
52
+ spotMarketIndexes: BN[],
50
53
  oracleInfos: OracleInfo[]
51
54
  ) {
52
55
  this.isSubscribed = false;
53
56
  this.program = program;
54
57
  this.eventEmitter = new EventEmitter();
55
- this.marketIndexes = marketIndexes;
56
- this.bankIndexes = bankIndexes;
58
+ this.perpMarketIndexes = perpMarketIndexes;
59
+ this.spotMarketIndexes = spotMarketIndexes;
57
60
  this.oracleInfos = oracleInfos;
58
61
  }
59
62
 
@@ -90,8 +93,8 @@ export class WebSocketClearingHouseAccountSubscriber
90
93
  // subscribe to market accounts
91
94
  await this.subscribeToMarketAccounts();
92
95
 
93
- // subscribe to bank accounts
94
- await this.subscribeToBankAccounts();
96
+ // subscribe to spot market accounts
97
+ await this.subscribeToSpotMarketAccounts();
95
98
 
96
99
  // subscribe to oracles
97
100
  await this.subscribeToOracles();
@@ -106,7 +109,7 @@ export class WebSocketClearingHouseAccountSubscriber
106
109
  }
107
110
 
108
111
  async subscribeToMarketAccounts(): Promise<boolean> {
109
- for (const marketIndex of this.marketIndexes) {
112
+ for (const marketIndex of this.perpMarketIndexes) {
110
113
  await this.subscribeToMarketAccount(marketIndex);
111
114
  }
112
115
  return true;
@@ -117,44 +120,47 @@ export class WebSocketClearingHouseAccountSubscriber
117
120
  this.program.programId,
118
121
  marketIndex
119
122
  );
120
- const accountSubscriber = new WebSocketAccountSubscriber<MarketAccount>(
121
- 'market',
123
+ const accountSubscriber = new WebSocketAccountSubscriber<PerpMarketAccount>(
124
+ 'perpMarket',
122
125
  this.program,
123
126
  marketPublicKey
124
127
  );
125
- await accountSubscriber.subscribe((data: MarketAccount) => {
126
- this.eventEmitter.emit('marketAccountUpdate', data);
128
+ await accountSubscriber.subscribe((data: PerpMarketAccount) => {
129
+ this.eventEmitter.emit('perpMarketAccountUpdate', data);
127
130
  this.eventEmitter.emit('update');
128
131
  });
129
- this.marketAccountSubscribers.set(
132
+ this.perpMarketAccountSubscribers.set(
130
133
  marketIndex.toNumber(),
131
134
  accountSubscriber
132
135
  );
133
136
  return true;
134
137
  }
135
138
 
136
- async subscribeToBankAccounts(): Promise<boolean> {
137
- for (const bankIndex of this.bankIndexes) {
138
- await this.subscribeToBankAccount(bankIndex);
139
+ async subscribeToSpotMarketAccounts(): Promise<boolean> {
140
+ for (const marketIndex of this.spotMarketIndexes) {
141
+ await this.subscribeToSpotMarketAccount(marketIndex);
139
142
  }
140
143
  return true;
141
144
  }
142
145
 
143
- async subscribeToBankAccount(bankIndex: BN): Promise<boolean> {
144
- const bankPublicKey = await getBankPublicKey(
146
+ async subscribeToSpotMarketAccount(marketIndex: BN): Promise<boolean> {
147
+ const marketPublicKey = await getSpotMarketPublicKey(
145
148
  this.program.programId,
146
- bankIndex
149
+ marketIndex
147
150
  );
148
- const accountSubscriber = new WebSocketAccountSubscriber<BankAccount>(
149
- 'bank',
151
+ const accountSubscriber = new WebSocketAccountSubscriber<SpotMarketAccount>(
152
+ 'spotMarket',
150
153
  this.program,
151
- bankPublicKey
154
+ marketPublicKey
152
155
  );
153
- await accountSubscriber.subscribe((data: BankAccount) => {
154
- this.eventEmitter.emit('bankAccountUpdate', data);
156
+ await accountSubscriber.subscribe((data: SpotMarketAccount) => {
157
+ this.eventEmitter.emit('spotMarketAccountUpdate', data);
155
158
  this.eventEmitter.emit('update');
156
159
  });
157
- this.bankAccountSubscribers.set(bankIndex.toNumber(), accountSubscriber);
160
+ this.spotMarketAccountSubscribers.set(
161
+ marketIndex.toNumber(),
162
+ accountSubscriber
163
+ );
158
164
  return true;
159
165
  }
160
166
 
@@ -195,13 +201,13 @@ export class WebSocketClearingHouseAccountSubscriber
195
201
  }
196
202
 
197
203
  async unsubscribeFromMarketAccounts(): Promise<void> {
198
- for (const accountSubscriber of this.marketAccountSubscribers.values()) {
204
+ for (const accountSubscriber of this.perpMarketAccountSubscribers.values()) {
199
205
  await accountSubscriber.unsubscribe();
200
206
  }
201
207
  }
202
208
 
203
- async unsubscribeFromBankAccounts(): Promise<void> {
204
- for (const accountSubscriber of this.bankAccountSubscribers.values()) {
209
+ async unsubscribeFromSpotMarketAccounts(): Promise<void> {
210
+ for (const accountSubscriber of this.spotMarketAccountSubscribers.values()) {
205
211
  await accountSubscriber.unsubscribe();
206
212
  }
207
213
  }
@@ -219,13 +225,13 @@ export class WebSocketClearingHouseAccountSubscriber
219
225
 
220
226
  const promises = [this.stateAccountSubscriber.fetch()]
221
227
  .concat(
222
- Array.from(this.marketAccountSubscribers.values()).map((subscriber) =>
223
- subscriber.fetch()
228
+ Array.from(this.perpMarketAccountSubscribers.values()).map(
229
+ (subscriber) => subscriber.fetch()
224
230
  )
225
231
  )
226
232
  .concat(
227
- Array.from(this.bankAccountSubscribers.values()).map((subscriber) =>
228
- subscriber.fetch()
233
+ Array.from(this.spotMarketAccountSubscribers.values()).map(
234
+ (subscriber) => subscriber.fetch()
229
235
  )
230
236
  );
231
237
 
@@ -240,21 +246,21 @@ export class WebSocketClearingHouseAccountSubscriber
240
246
  await this.stateAccountSubscriber.unsubscribe();
241
247
 
242
248
  await this.unsubscribeFromMarketAccounts();
243
- await this.unsubscribeFromBankAccounts();
249
+ await this.unsubscribeFromSpotMarketAccounts();
244
250
  await this.unsubscribeFromOracles();
245
251
 
246
252
  this.isSubscribed = false;
247
253
  }
248
254
 
249
- async addBank(bankIndex: BN): Promise<boolean> {
250
- if (this.bankAccountSubscribers.has(bankIndex.toNumber())) {
255
+ async addSpotMarket(marketIndex: BN): Promise<boolean> {
256
+ if (this.spotMarketAccountSubscribers.has(marketIndex.toNumber())) {
251
257
  return true;
252
258
  }
253
- return this.subscribeToBankAccount(bankIndex);
259
+ return this.subscribeToSpotMarketAccount(marketIndex);
254
260
  }
255
261
 
256
- async addMarket(marketIndex: BN): Promise<boolean> {
257
- if (this.marketAccountSubscribers.has(marketIndex.toNumber())) {
262
+ async addPerpMarket(marketIndex: BN): Promise<boolean> {
263
+ if (this.perpMarketAccountSubscribers.has(marketIndex.toNumber())) {
258
264
  return true;
259
265
  }
260
266
  return this.subscribeToMarketAccount(marketIndex);
@@ -287,23 +293,24 @@ export class WebSocketClearingHouseAccountSubscriber
287
293
 
288
294
  public getMarketAccountAndSlot(
289
295
  marketIndex: BN
290
- ): DataAndSlot<MarketAccount> | undefined {
296
+ ): DataAndSlot<PerpMarketAccount> | undefined {
291
297
  this.assertIsSubscribed();
292
- return this.marketAccountSubscribers.get(marketIndex.toNumber())
298
+ return this.perpMarketAccountSubscribers.get(marketIndex.toNumber())
293
299
  .dataAndSlot;
294
300
  }
295
301
 
296
- public getMarketAccountsAndSlots(): DataAndSlot<MarketAccount>[] {
297
- return Array.from(this.marketAccountSubscribers.values()).map(
302
+ public getMarketAccountsAndSlots(): DataAndSlot<PerpMarketAccount>[] {
303
+ return Array.from(this.perpMarketAccountSubscribers.values()).map(
298
304
  (subscriber) => subscriber.dataAndSlot
299
305
  );
300
306
  }
301
307
 
302
- public getBankAccountAndSlot(
303
- bankIndex: BN
304
- ): DataAndSlot<BankAccount> | undefined {
308
+ public getSpotMarketAccountAndSlot(
309
+ marketIndex: BN
310
+ ): DataAndSlot<SpotMarketAccount> | undefined {
305
311
  this.assertIsSubscribed();
306
- return this.bankAccountSubscribers.get(bankIndex.toNumber()).dataAndSlot;
312
+ return this.spotMarketAccountSubscribers.get(marketIndex.toNumber())
313
+ .dataAndSlot;
307
314
  }
308
315
 
309
316
  public getOraclePriceDataAndSlot(