@drift-labs/sdk 0.2.0-master.24 → 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.
- package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +13 -13
- package/lib/accounts/pollingClearingHouseAccountSubscriber.js +27 -27
- package/lib/accounts/types.d.ts +8 -9
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +14 -14
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +35 -34
- package/lib/addresses/pda.d.ts +8 -6
- package/lib/addresses/pda.js +35 -27
- package/lib/admin.d.ts +9 -6
- package/lib/admin.js +90 -54
- package/lib/clearingHouse.d.ts +71 -42
- package/lib/clearingHouse.js +765 -282
- package/lib/clearingHouseConfig.d.ts +2 -2
- package/lib/clearingHouseUser.d.ts +19 -17
- package/lib/clearingHouseUser.js +145 -123
- package/lib/config.d.ts +7 -7
- package/lib/config.js +21 -21
- package/lib/constants/numericConstants.d.ts +12 -12
- package/lib/constants/numericConstants.js +13 -13
- package/lib/constants/{markets.d.ts → perpMarkets.d.ts} +5 -5
- package/{src/constants/markets.js → lib/constants/perpMarkets.js} +4 -4
- package/lib/constants/{banks.d.ts → spotMarkets.d.ts} +6 -6
- package/lib/constants/{banks.js → spotMarkets.js} +16 -16
- package/lib/events/eventSubscriber.d.ts +4 -2
- package/lib/events/eventSubscriber.js +16 -9
- package/lib/events/fetchLogs.d.ts +10 -1
- package/lib/events/fetchLogs.js +27 -7
- package/lib/events/pollingLogProvider.d.ts +2 -1
- package/lib/events/pollingLogProvider.js +6 -2
- package/lib/events/types.d.ts +4 -2
- package/lib/events/types.js +2 -0
- package/lib/examples/makeTradeExample.js +18 -6
- package/lib/idl/clearing_house.json +1128 -347
- package/lib/index.d.ts +6 -3
- package/lib/index.js +6 -3
- package/lib/math/amm.d.ts +5 -3
- package/lib/math/amm.js +42 -4
- package/lib/math/funding.d.ts +6 -6
- package/lib/math/funding.js +2 -1
- package/lib/math/margin.d.ts +4 -4
- package/lib/math/margin.js +18 -11
- package/lib/math/market.d.ts +10 -9
- package/lib/math/market.js +29 -6
- package/lib/math/oracles.d.ts +2 -1
- package/lib/math/oracles.js +11 -1
- package/lib/math/orders.d.ts +5 -5
- package/lib/math/position.d.ts +13 -13
- package/lib/math/position.js +19 -19
- package/lib/math/spotBalance.d.ts +19 -0
- package/lib/math/spotBalance.js +176 -0
- package/lib/math/spotMarket.d.ts +4 -0
- package/lib/math/spotMarket.js +8 -0
- package/lib/math/spotPosition.d.ts +2 -0
- package/lib/math/spotPosition.js +8 -0
- package/lib/math/state.js +2 -2
- package/lib/math/trade.d.ts +4 -4
- package/lib/orderParams.d.ts +4 -4
- package/lib/orderParams.js +12 -4
- package/lib/serum/serumSubscriber.d.ts +23 -0
- package/lib/serum/serumSubscriber.js +41 -0
- package/lib/serum/types.d.ts +11 -0
- package/lib/serum/types.js +2 -0
- package/lib/tx/retryTxSender.d.ts +1 -1
- package/lib/tx/retryTxSender.js +4 -2
- package/lib/tx/types.d.ts +1 -1
- package/lib/types.d.ts +148 -39
- package/lib/types.js +37 -9
- package/my-script/.env +7 -0
- package/my-script/getUserStats.ts +106 -0
- package/my-script/multiConnections.ts +119 -0
- package/my-script/test-regex.ts +11 -0
- package/my-script/utils.ts +52 -0
- package/package.json +1 -1
- package/src/accounts/bulkAccountLoader.js +249 -0
- package/src/accounts/bulkUserStatsSubscription.js +75 -0
- package/src/accounts/bulkUserSubscription.js +75 -0
- package/src/accounts/fetch.js +92 -0
- package/src/accounts/pollingClearingHouseAccountSubscriber.js +465 -0
- package/src/accounts/pollingClearingHouseAccountSubscriber.ts +38 -38
- package/src/accounts/pollingOracleSubscriber.js +156 -0
- package/src/accounts/pollingTokenAccountSubscriber.js +141 -0
- package/src/accounts/pollingUserAccountSubscriber.js +208 -0
- package/src/accounts/pollingUserStatsAccountSubscriber.js +208 -0
- package/src/accounts/types.js +28 -0
- package/src/accounts/types.ts +11 -9
- package/src/accounts/utils.js +7 -0
- package/src/accounts/webSocketAccountSubscriber.js +138 -0
- package/src/accounts/webSocketClearingHouseAccountSubscriber.js +433 -0
- package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +59 -52
- package/src/accounts/webSocketUserAccountSubscriber.js +113 -0
- package/src/accounts/webSocketUserStatsAccountSubsriber.js +113 -0
- package/src/addresses/pda.js +186 -0
- package/src/addresses/pda.ts +56 -42
- package/src/admin.js +1284 -0
- package/src/admin.ts +149 -75
- package/src/assert/assert.js +1 -1
- package/src/clearingHouse.js +3433 -0
- package/src/clearingHouse.ts +1097 -380
- package/src/clearingHouseConfig.js +2 -0
- package/src/clearingHouseConfig.ts +2 -2
- package/src/clearingHouseUser.js +874 -0
- package/src/clearingHouseUser.ts +237 -172
- package/src/clearingHouseUserConfig.js +2 -0
- package/src/clearingHouseUserStats.js +115 -0
- package/src/clearingHouseUserStatsConfig.js +2 -0
- package/src/config.js +80 -0
- package/src/config.ts +30 -30
- package/src/constants/numericConstants.js +18 -11
- package/src/constants/numericConstants.ts +17 -15
- package/{lib/constants/markets.js → src/constants/perpMarkets.js} +11 -11
- package/src/constants/{markets.ts → perpMarkets.ts} +5 -5
- package/src/constants/spotMarkets.js +51 -0
- package/src/constants/{banks.ts → spotMarkets.ts} +19 -19
- package/src/events/eventList.js +66 -23
- package/src/events/eventSubscriber.js +202 -0
- package/src/events/eventSubscriber.ts +20 -12
- package/src/events/fetchLogs.js +117 -0
- package/src/events/fetchLogs.ts +35 -8
- package/src/events/pollingLogProvider.js +113 -0
- package/src/events/pollingLogProvider.ts +10 -2
- package/src/events/sort.js +41 -0
- package/src/events/txEventCache.js +22 -19
- package/src/events/types.js +25 -0
- package/src/events/types.ts +7 -1
- package/src/events/webSocketLogProvider.js +76 -0
- package/src/examples/makeTradeExample.ts +27 -6
- package/src/factory/bigNum.js +183 -180
- package/src/factory/oracleClient.js +9 -9
- package/src/idl/clearing_house.json +1128 -347
- package/src/index.js +75 -0
- package/src/index.ts +6 -3
- package/src/math/amm.js +422 -0
- package/src/math/amm.ts +73 -5
- package/src/math/auction.js +10 -10
- package/src/math/conversion.js +4 -3
- package/src/math/funding.js +223 -175
- package/src/math/funding.ts +7 -7
- package/src/math/insurance.js +27 -0
- package/src/math/margin.js +77 -0
- package/src/math/margin.ts +34 -23
- package/src/math/market.js +105 -0
- package/src/math/market.ts +71 -19
- package/src/math/oracles.js +40 -10
- package/src/math/oracles.ts +18 -1
- package/src/math/orders.js +153 -0
- package/src/math/orders.ts +5 -5
- package/src/math/position.js +172 -0
- package/src/math/position.ts +31 -31
- package/src/math/repeg.js +40 -40
- package/src/math/spotBalance.js +176 -0
- package/src/math/spotBalance.ts +290 -0
- package/src/math/spotMarket.js +8 -0
- package/src/math/spotMarket.ts +9 -0
- package/src/math/spotPosition.js +8 -0
- package/src/math/spotPosition.ts +6 -0
- package/src/math/state.ts +2 -2
- package/src/math/trade.js +81 -74
- package/src/math/trade.ts +4 -4
- package/src/math/utils.js +8 -7
- package/src/oracles/oracleClientCache.js +10 -9
- package/src/oracles/pythClient.js +52 -17
- package/src/oracles/quoteAssetOracleClient.js +44 -13
- package/src/oracles/switchboardClient.js +69 -37
- package/src/oracles/types.js +1 -1
- package/src/orderParams.js +14 -6
- package/src/orderParams.ts +16 -8
- package/src/serum/serumSubscriber.js +102 -0
- package/src/serum/serumSubscriber.ts +80 -0
- package/src/serum/types.js +2 -0
- package/src/serum/types.ts +13 -0
- package/src/slot/SlotSubscriber.js +67 -20
- package/src/token/index.js +4 -4
- package/src/tokenFaucet.js +288 -154
- package/src/tx/retryTxSender.js +280 -0
- package/src/tx/retryTxSender.ts +5 -2
- package/src/tx/types.js +1 -1
- package/src/tx/types.ts +2 -1
- package/src/tx/utils.js +7 -6
- package/src/types.js +216 -0
- package/src/types.ts +131 -39
- package/src/userName.js +5 -5
- package/src/util/computeUnits.js +46 -11
- package/src/util/promiseTimeout.js +5 -5
- package/src/util/tps.js +46 -12
- package/src/wallet.js +55 -18
- package/lib/math/bankBalance.d.ts +0 -15
- package/lib/math/bankBalance.js +0 -150
- package/src/addresses/marketAddresses.js +0 -26
- package/src/constants/banks.js +0 -42
- package/src/examples/makeTradeExample.js +0 -80
- package/src/math/bankBalance.ts +0 -258
- package/src/math/state.js +0 -15
- package/src/math/utils.js.map +0 -1
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
35
|
+
perpMarketAccountSubscribers = new Map<
|
|
36
36
|
number,
|
|
37
|
-
AccountSubscriber<
|
|
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
|
-
|
|
49
|
-
|
|
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.
|
|
56
|
-
this.
|
|
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
|
|
94
|
-
await this.
|
|
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.
|
|
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<
|
|
121
|
-
'
|
|
123
|
+
const accountSubscriber = new WebSocketAccountSubscriber<PerpMarketAccount>(
|
|
124
|
+
'perpMarket',
|
|
122
125
|
this.program,
|
|
123
126
|
marketPublicKey
|
|
124
127
|
);
|
|
125
|
-
await accountSubscriber.subscribe((data:
|
|
126
|
-
this.eventEmitter.emit('
|
|
128
|
+
await accountSubscriber.subscribe((data: PerpMarketAccount) => {
|
|
129
|
+
this.eventEmitter.emit('perpMarketAccountUpdate', data);
|
|
127
130
|
this.eventEmitter.emit('update');
|
|
128
131
|
});
|
|
129
|
-
this.
|
|
132
|
+
this.perpMarketAccountSubscribers.set(
|
|
130
133
|
marketIndex.toNumber(),
|
|
131
134
|
accountSubscriber
|
|
132
135
|
);
|
|
133
136
|
return true;
|
|
134
137
|
}
|
|
135
138
|
|
|
136
|
-
async
|
|
137
|
-
for (const
|
|
138
|
-
await this.
|
|
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
|
|
144
|
-
const
|
|
146
|
+
async subscribeToSpotMarketAccount(marketIndex: BN): Promise<boolean> {
|
|
147
|
+
const marketPublicKey = await getSpotMarketPublicKey(
|
|
145
148
|
this.program.programId,
|
|
146
|
-
|
|
149
|
+
marketIndex
|
|
147
150
|
);
|
|
148
|
-
const accountSubscriber = new WebSocketAccountSubscriber<
|
|
149
|
-
'
|
|
151
|
+
const accountSubscriber = new WebSocketAccountSubscriber<SpotMarketAccount>(
|
|
152
|
+
'spotMarket',
|
|
150
153
|
this.program,
|
|
151
|
-
|
|
154
|
+
marketPublicKey
|
|
152
155
|
);
|
|
153
|
-
await accountSubscriber.subscribe((data:
|
|
154
|
-
this.eventEmitter.emit('
|
|
156
|
+
await accountSubscriber.subscribe((data: SpotMarketAccount) => {
|
|
157
|
+
this.eventEmitter.emit('spotMarketAccountUpdate', data);
|
|
155
158
|
this.eventEmitter.emit('update');
|
|
156
159
|
});
|
|
157
|
-
this.
|
|
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.
|
|
204
|
+
for (const accountSubscriber of this.perpMarketAccountSubscribers.values()) {
|
|
199
205
|
await accountSubscriber.unsubscribe();
|
|
200
206
|
}
|
|
201
207
|
}
|
|
202
208
|
|
|
203
|
-
async
|
|
204
|
-
for (const accountSubscriber of this.
|
|
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.
|
|
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.
|
|
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.
|
|
249
|
+
await this.unsubscribeFromSpotMarketAccounts();
|
|
244
250
|
await this.unsubscribeFromOracles();
|
|
245
251
|
|
|
246
252
|
this.isSubscribed = false;
|
|
247
253
|
}
|
|
248
254
|
|
|
249
|
-
async
|
|
250
|
-
if (this.
|
|
255
|
+
async addSpotMarket(marketIndex: BN): Promise<boolean> {
|
|
256
|
+
if (this.spotMarketAccountSubscribers.has(marketIndex.toNumber())) {
|
|
251
257
|
return true;
|
|
252
258
|
}
|
|
253
|
-
return this.
|
|
259
|
+
return this.subscribeToSpotMarketAccount(marketIndex);
|
|
254
260
|
}
|
|
255
261
|
|
|
256
|
-
async
|
|
257
|
-
if (this.
|
|
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<
|
|
296
|
+
): DataAndSlot<PerpMarketAccount> | undefined {
|
|
291
297
|
this.assertIsSubscribed();
|
|
292
|
-
return this.
|
|
298
|
+
return this.perpMarketAccountSubscribers.get(marketIndex.toNumber())
|
|
293
299
|
.dataAndSlot;
|
|
294
300
|
}
|
|
295
301
|
|
|
296
|
-
public getMarketAccountsAndSlots(): DataAndSlot<
|
|
297
|
-
return Array.from(this.
|
|
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
|
|
303
|
-
|
|
304
|
-
): DataAndSlot<
|
|
308
|
+
public getSpotMarketAccountAndSlot(
|
|
309
|
+
marketIndex: BN
|
|
310
|
+
): DataAndSlot<SpotMarketAccount> | undefined {
|
|
305
311
|
this.assertIsSubscribed();
|
|
306
|
-
return this.
|
|
312
|
+
return this.spotMarketAccountSubscribers.get(marketIndex.toNumber())
|
|
313
|
+
.dataAndSlot;
|
|
307
314
|
}
|
|
308
315
|
|
|
309
316
|
public getOraclePriceDataAndSlot(
|