@drift-labs/sdk 0.1.36-master.7 → 0.2.0-master.10

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 (254) hide show
  1. package/lib/accounts/bulkAccountLoader.d.ts +6 -6
  2. package/lib/accounts/bulkAccountLoader.js +81 -95
  3. package/lib/accounts/bulkUserSubscription.js +13 -57
  4. package/lib/accounts/fetch.d.ts +4 -0
  5. package/lib/accounts/fetch.js +18 -0
  6. package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +34 -38
  7. package/lib/accounts/pollingClearingHouseAccountSubscriber.js +224 -224
  8. package/lib/accounts/pollingOracleSubscriber.d.ts +3 -3
  9. package/lib/accounts/pollingOracleSubscriber.js +37 -49
  10. package/lib/accounts/pollingTokenAccountSubscriber.d.ts +3 -3
  11. package/lib/accounts/pollingTokenAccountSubscriber.js +35 -50
  12. package/lib/accounts/pollingUserAccountSubscriber.d.ts +7 -13
  13. package/lib/accounts/pollingUserAccountSubscriber.js +71 -134
  14. package/lib/accounts/types.d.ts +34 -41
  15. package/lib/accounts/webSocketAccountSubscriber.d.ts +6 -4
  16. package/lib/accounts/webSocketAccountSubscriber.js +39 -35
  17. package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +33 -28
  18. package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +153 -185
  19. package/lib/accounts/webSocketUserAccountSubscriber.d.ts +5 -11
  20. package/lib/accounts/webSocketUserAccountSubscriber.js +22 -67
  21. package/lib/addresses/marketAddresses.d.ts +4 -0
  22. package/lib/addresses/marketAddresses.js +15 -0
  23. package/lib/addresses/pda.d.ts +12 -0
  24. package/lib/addresses/pda.js +83 -0
  25. package/lib/admin.d.ts +12 -18
  26. package/lib/admin.js +398 -558
  27. package/lib/clearingHouse.d.ts +83 -109
  28. package/lib/clearingHouse.js +832 -893
  29. package/lib/clearingHouseConfig.d.ts +34 -0
  30. package/lib/clearingHouseConfig.js +2 -0
  31. package/lib/clearingHouseUser.d.ts +19 -22
  32. package/lib/clearingHouseUser.js +155 -141
  33. package/lib/clearingHouseUserConfig.d.ts +14 -0
  34. package/lib/clearingHouseUserConfig.js +2 -0
  35. package/lib/config.d.ts +12 -0
  36. package/lib/config.js +35 -4
  37. package/lib/constants/banks.d.ts +16 -0
  38. package/lib/constants/banks.js +41 -0
  39. package/lib/constants/markets.d.ts +8 -3
  40. package/lib/constants/markets.js +13 -206
  41. package/lib/constants/numericConstants.d.ts +17 -0
  42. package/lib/constants/numericConstants.js +23 -6
  43. package/lib/events/eventList.d.ts +22 -0
  44. package/lib/events/eventList.js +77 -0
  45. package/lib/events/eventSubscriber.d.ts +34 -0
  46. package/lib/events/eventSubscriber.js +126 -0
  47. package/lib/events/fetchLogs.d.ts +13 -0
  48. package/lib/events/fetchLogs.js +39 -0
  49. package/lib/events/pollingLogProvider.d.ts +15 -0
  50. package/lib/events/pollingLogProvider.js +53 -0
  51. package/lib/events/sort.d.ts +2 -0
  52. package/lib/events/sort.js +44 -0
  53. package/lib/events/txEventCache.d.ts +24 -0
  54. package/lib/events/txEventCache.js +71 -0
  55. package/lib/events/types.d.ts +49 -0
  56. package/lib/events/types.js +20 -0
  57. package/lib/events/webSocketLogProvider.d.ts +12 -0
  58. package/lib/events/webSocketLogProvider.js +30 -0
  59. package/lib/examples/makeTradeExample.js +26 -27
  60. package/lib/factory/bigNum.d.ts +118 -0
  61. package/lib/factory/bigNum.js +364 -0
  62. package/lib/factory/oracleClient.d.ts +1 -2
  63. package/lib/factory/oracleClient.js +6 -2
  64. package/lib/idl/clearing_house.json +2258 -2774
  65. package/lib/index.d.ts +14 -5
  66. package/lib/index.js +18 -5
  67. package/lib/math/amm.d.ts +24 -29
  68. package/lib/math/amm.js +209 -176
  69. package/lib/math/auction.d.ts +5 -0
  70. package/lib/math/auction.js +42 -0
  71. package/lib/math/bankBalance.d.ts +9 -0
  72. package/lib/math/bankBalance.js +75 -0
  73. package/lib/math/conversion.d.ts +0 -1
  74. package/lib/math/conversion.js +1 -5
  75. package/lib/math/funding.d.ts +6 -6
  76. package/lib/math/funding.js +158 -175
  77. package/lib/math/market.d.ts +6 -6
  78. package/lib/math/market.js +10 -9
  79. package/lib/math/orders.d.ts +6 -1
  80. package/lib/math/orders.js +38 -1
  81. package/lib/math/position.d.ts +7 -5
  82. package/lib/math/position.js +29 -27
  83. package/lib/math/repeg.d.ts +22 -0
  84. package/lib/math/repeg.js +128 -0
  85. package/lib/math/trade.d.ts +5 -4
  86. package/lib/math/trade.js +29 -24
  87. package/lib/mockUSDCFaucet.js +87 -116
  88. package/lib/oracles/oracleClientCache.d.ts +8 -0
  89. package/lib/oracles/oracleClientCache.js +19 -0
  90. package/lib/oracles/pythClient.d.ts +3 -5
  91. package/lib/oracles/pythClient.js +12 -31
  92. package/lib/oracles/quoteAssetOracleClient.d.ts +9 -0
  93. package/lib/oracles/quoteAssetOracleClient.js +21 -0
  94. package/lib/oracles/switchboardClient.d.ts +3 -5
  95. package/lib/oracles/switchboardClient.js +29 -50
  96. package/lib/oracles/types.d.ts +6 -1
  97. package/lib/orderParams.d.ts +14 -5
  98. package/lib/orderParams.js +8 -96
  99. package/lib/orders.d.ts +6 -7
  100. package/lib/orders.js +11 -89
  101. package/lib/slot/SlotSubscriber.d.ts +19 -0
  102. package/lib/slot/SlotSubscriber.js +26 -0
  103. package/lib/tx/retryTxSender.d.ts +2 -2
  104. package/lib/tx/retryTxSender.js +108 -123
  105. package/lib/tx/types.d.ts +5 -1
  106. package/lib/tx/utils.d.ts +1 -1
  107. package/lib/tx/utils.js +11 -2
  108. package/lib/types.d.ts +180 -110
  109. package/lib/types.js +54 -1
  110. package/lib/userName.d.ts +4 -0
  111. package/lib/userName.js +20 -0
  112. package/lib/util/computeUnits.js +10 -21
  113. package/lib/util/tps.js +11 -22
  114. package/lib/wallet.js +7 -20
  115. package/package.json +11 -4
  116. package/src/accounts/bulkAccountLoader.js +197 -0
  117. package/src/accounts/bulkAccountLoader.ts +21 -15
  118. package/src/accounts/bulkUserSubscription.js +33 -0
  119. package/src/accounts/bulkUserSubscription.ts +1 -45
  120. package/src/accounts/fetch.js +29 -0
  121. package/src/accounts/fetch.ts +33 -0
  122. package/src/accounts/pollingClearingHouseAccountSubscriber.js +311 -0
  123. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +249 -214
  124. package/src/accounts/pollingOracleSubscriber.js +93 -0
  125. package/src/accounts/pollingOracleSubscriber.ts +16 -8
  126. package/src/accounts/pollingTokenAccountSubscriber.js +90 -0
  127. package/src/accounts/pollingTokenAccountSubscriber.ts +11 -8
  128. package/src/accounts/pollingUserAccountSubscriber.js +132 -0
  129. package/src/accounts/pollingUserAccountSubscriber.ts +21 -86
  130. package/src/accounts/types.js +10 -0
  131. package/src/accounts/types.ts +41 -70
  132. package/src/accounts/utils.js +7 -0
  133. package/src/accounts/webSocketAccountSubscriber.js +93 -0
  134. package/src/accounts/webSocketAccountSubscriber.ts +33 -16
  135. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +233 -0
  136. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +190 -240
  137. package/src/accounts/webSocketUserAccountSubscriber.js +62 -0
  138. package/src/accounts/webSocketUserAccountSubscriber.ts +11 -71
  139. package/src/addresses/marketAddresses.js +26 -0
  140. package/src/addresses/marketAddresses.ts +18 -0
  141. package/{lib/addresses.js → src/addresses/pda.js} +45 -34
  142. package/src/addresses/pda.ts +118 -0
  143. package/src/admin.ts +247 -336
  144. package/src/assert/assert.js +9 -0
  145. package/src/clearingHouse.ts +1023 -1026
  146. package/src/clearingHouseConfig.ts +37 -0
  147. package/src/clearingHouseUser.ts +275 -185
  148. package/src/clearingHouseUserConfig.ts +18 -0
  149. package/src/config.ts +54 -1
  150. package/src/constants/banks.ts +50 -0
  151. package/src/constants/markets.ts +16 -207
  152. package/src/constants/numericConstants.ts +34 -5
  153. package/src/events/eventList.js +77 -0
  154. package/src/events/eventList.ts +94 -0
  155. package/src/events/eventSubscriber.js +139 -0
  156. package/src/events/eventSubscriber.ts +194 -0
  157. package/src/events/fetchLogs.js +50 -0
  158. package/src/events/fetchLogs.ts +80 -0
  159. package/src/events/pollingLogProvider.js +64 -0
  160. package/src/events/pollingLogProvider.ts +79 -0
  161. package/src/events/sort.js +44 -0
  162. package/src/events/sort.ts +65 -0
  163. package/src/events/txEventCache.js +71 -0
  164. package/src/events/txEventCache.ts +74 -0
  165. package/src/events/types.js +20 -0
  166. package/src/events/types.ts +98 -0
  167. package/src/events/webSocketLogProvider.js +41 -0
  168. package/src/events/webSocketLogProvider.ts +38 -0
  169. package/src/examples/makeTradeExample.js +80 -0
  170. package/src/examples/makeTradeExample.ts +20 -11
  171. package/src/factory/bigNum.js +364 -0
  172. package/src/factory/bigNum.ts +524 -0
  173. package/src/factory/oracleClient.js +20 -0
  174. package/src/factory/oracleClient.ts +7 -4
  175. package/src/idl/clearing_house.json +2258 -2774
  176. package/src/index.js +69 -0
  177. package/src/index.ts +14 -5
  178. package/src/math/amm.js +369 -0
  179. package/src/math/amm.ts +382 -243
  180. package/src/math/auction.js +42 -0
  181. package/src/math/auction.ts +43 -0
  182. package/src/math/bankBalance.js +75 -0
  183. package/src/math/bankBalance.ts +112 -0
  184. package/src/math/conversion.js +11 -0
  185. package/src/math/conversion.ts +1 -11
  186. package/src/math/funding.js +248 -0
  187. package/src/math/funding.ts +12 -9
  188. package/src/math/market.js +57 -0
  189. package/src/math/market.ts +37 -30
  190. package/src/math/oracles.js +26 -0
  191. package/src/math/orders.js +110 -0
  192. package/src/math/orders.ts +43 -1
  193. package/src/math/position.js +140 -0
  194. package/src/math/position.ts +52 -35
  195. package/src/math/repeg.js +128 -0
  196. package/src/math/repeg.ts +176 -0
  197. package/src/math/state.js +15 -0
  198. package/src/math/trade.js +253 -0
  199. package/src/math/trade.ts +55 -47
  200. package/src/math/utils.js +26 -0
  201. package/src/math/utils.js.map +1 -0
  202. package/src/mockUSDCFaucet.js +171 -0
  203. package/src/oracles/oracleClientCache.js +19 -0
  204. package/src/oracles/oracleClientCache.ts +20 -0
  205. package/src/oracles/pythClient.js +46 -0
  206. package/src/oracles/pythClient.ts +4 -11
  207. package/src/oracles/quoteAssetOracleClient.js +32 -0
  208. package/src/oracles/quoteAssetOracleClient.ts +25 -0
  209. package/src/oracles/switchboardClient.js +69 -0
  210. package/src/oracles/switchboardClient.ts +11 -24
  211. package/src/oracles/types.js +2 -0
  212. package/src/oracles/types.ts +7 -1
  213. package/src/orderParams.js +20 -0
  214. package/src/orderParams.ts +20 -141
  215. package/src/orders.js +134 -0
  216. package/src/orders.ts +25 -134
  217. package/src/slot/SlotSubscriber.js +39 -0
  218. package/src/slot/SlotSubscriber.ts +42 -0
  219. package/src/token/index.js +38 -0
  220. package/src/tx/retryTxSender.js +188 -0
  221. package/src/tx/retryTxSender.ts +6 -4
  222. package/src/tx/types.js +2 -0
  223. package/src/tx/types.ts +6 -1
  224. package/src/tx/utils.js +17 -0
  225. package/src/tx/utils.ts +22 -3
  226. package/src/types.js +114 -0
  227. package/src/types.ts +176 -124
  228. package/src/userName.js +20 -0
  229. package/src/userName.ts +20 -0
  230. package/src/util/promiseTimeout.js +14 -0
  231. package/src/util/tps.js +27 -0
  232. package/src/wallet.js +35 -0
  233. package/tests/bn/test.ts +255 -0
  234. package/tsconfig.json +12 -12
  235. package/lib/addresses.d.ts +0 -10
  236. package/lib/constants/accounts.d.ts +0 -15
  237. package/lib/constants/accounts.js +0 -18
  238. package/lib/factory/clearingHouse.d.ts +0 -35
  239. package/lib/factory/clearingHouse.js +0 -81
  240. package/lib/factory/clearingHouseUser.d.ts +0 -19
  241. package/lib/factory/clearingHouseUser.js +0 -34
  242. package/lib/math/insuranceFund.d.ts +0 -15
  243. package/lib/math/insuranceFund.js +0 -33
  244. package/lib/settlement.d.ts +0 -4
  245. package/lib/settlement.js +0 -10
  246. package/lib/tx/defaultTxSender.d.ts +0 -8
  247. package/lib/tx/defaultTxSender.js +0 -12
  248. package/src/addresses.ts +0 -82
  249. package/src/constants/accounts.ts +0 -26
  250. package/src/factory/clearingHouse.ts +0 -173
  251. package/src/factory/clearingHouseUser.ts +0 -73
  252. package/src/math/insuranceFund.ts +0 -29
  253. package/src/settlement.ts +0 -9
  254. package/src/tx/defaultTxSender.ts +0 -24
@@ -1,276 +1,276 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.PollingClearingHouseAccountSubscriber = void 0;
13
4
  const types_1 = require("./types");
14
5
  const events_1 = require("events");
15
- const addresses_1 = require("../addresses");
6
+ const pda_1 = require("../addresses/pda");
16
7
  const utils_1 = require("./utils");
17
- const accounts_1 = require("../constants/accounts");
8
+ const web3_js_1 = require("@solana/web3.js");
9
+ const oracleClientCache_1 = require("../oracles/oracleClientCache");
10
+ const quoteAssetOracleClient_1 = require("../oracles/quoteAssetOracleClient");
18
11
  class PollingClearingHouseAccountSubscriber {
19
- constructor(program, accountLoader) {
12
+ constructor(program, accountLoader, marketIndexes, bankIndexes, oracleInfos) {
13
+ this.oracleClientCache = new oracleClientCache_1.OracleClientCache();
20
14
  this.accountsToPoll = new Map();
21
- this.optionalExtraSubscriptions = [];
22
- this.type = 'polling';
15
+ this.oraclesToPoll = new Map();
16
+ this.market = new Map();
17
+ this.bank = new Map();
18
+ this.oracles = new Map();
23
19
  this.isSubscribing = false;
24
20
  this.isSubscribed = false;
25
21
  this.program = program;
26
22
  this.eventEmitter = new events_1.EventEmitter();
27
23
  this.accountLoader = accountLoader;
24
+ this.marketIndexes = marketIndexes;
25
+ this.bankIndexes = bankIndexes;
26
+ this.oracleInfos = oracleInfos;
28
27
  }
29
- subscribe(optionalSubscriptions) {
30
- return __awaiter(this, void 0, void 0, function* () {
31
- if (this.isSubscribed) {
32
- return true;
33
- }
34
- if (this.isSubscribing) {
35
- return yield this.subscriptionPromise;
36
- }
37
- this.optionalExtraSubscriptions = optionalSubscriptions;
38
- this.isSubscribing = true;
39
- this.subscriptionPromise = new Promise((res) => {
40
- this.subscriptionPromiseResolver = res;
41
- });
42
- yield this.updateAccountsToPoll();
43
- yield this.addToAccountLoader();
44
- let subscriptionSucceeded = false;
45
- let retries = 0;
46
- while (!subscriptionSucceeded && retries < 5) {
47
- yield this.fetch();
48
- subscriptionSucceeded = this.didSubscriptionSucceed();
49
- retries++;
50
- }
51
- if (subscriptionSucceeded) {
52
- this.eventEmitter.emit('update');
53
- }
54
- this.isSubscribing = false;
55
- this.isSubscribed = subscriptionSucceeded;
56
- this.subscriptionPromiseResolver(subscriptionSucceeded);
57
- return subscriptionSucceeded;
28
+ async subscribe() {
29
+ if (this.isSubscribed) {
30
+ return true;
31
+ }
32
+ if (this.isSubscribing) {
33
+ return await this.subscriptionPromise;
34
+ }
35
+ this.isSubscribing = true;
36
+ this.subscriptionPromise = new Promise((res) => {
37
+ this.subscriptionPromiseResolver = res;
58
38
  });
39
+ await this.updateAccountsToPoll();
40
+ await this.updateOraclesToPoll();
41
+ await this.addToAccountLoader();
42
+ let subscriptionSucceeded = false;
43
+ let retries = 0;
44
+ while (!subscriptionSucceeded && retries < 5) {
45
+ await this.fetch();
46
+ subscriptionSucceeded = this.didSubscriptionSucceed();
47
+ retries++;
48
+ }
49
+ if (subscriptionSucceeded) {
50
+ this.eventEmitter.emit('update');
51
+ }
52
+ this.isSubscribing = false;
53
+ this.isSubscribed = subscriptionSucceeded;
54
+ this.subscriptionPromiseResolver(subscriptionSucceeded);
55
+ return subscriptionSucceeded;
59
56
  }
60
- updateAccountsToPoll() {
61
- var _a, _b, _c, _d, _e, _f, _g;
62
- return __awaiter(this, void 0, void 0, function* () {
63
- if (this.accountsToPoll.size > 0) {
64
- return;
65
- }
66
- const accounts = yield this.getClearingHouseAccounts();
67
- this.accountsToPoll.set(accounts.state.toString(), {
68
- key: 'state',
69
- publicKey: accounts.state,
70
- eventType: 'stateAccountUpdate',
71
- });
72
- this.accountsToPoll.set(accounts.markets.toString(), {
73
- key: 'markets',
74
- publicKey: accounts.markets,
75
- eventType: 'marketsAccountUpdate',
76
- });
77
- this.accountsToPoll.set(accounts.orderState.toString(), {
78
- key: 'orderState',
79
- publicKey: accounts.orderState,
80
- eventType: 'orderStateAccountUpdate',
81
- });
82
- if ((_a = this.optionalExtraSubscriptions) === null || _a === void 0 ? void 0 : _a.includes('tradeHistoryAccount')) {
83
- this.accountsToPoll.set(accounts.tradeHistory.toString(), {
84
- key: 'tradeHistory',
85
- publicKey: accounts.tradeHistory,
86
- eventType: 'tradeHistoryAccountUpdate',
87
- });
88
- }
89
- if ((_b = this.optionalExtraSubscriptions) === null || _b === void 0 ? void 0 : _b.includes('depositHistoryAccount')) {
90
- this.accountsToPoll.set(accounts.depositHistory.toString(), {
91
- key: 'depositHistory',
92
- publicKey: accounts.depositHistory,
93
- eventType: 'depositHistoryAccountUpdate',
94
- });
95
- }
96
- if ((_c = this.optionalExtraSubscriptions) === null || _c === void 0 ? void 0 : _c.includes('fundingPaymentHistoryAccount')) {
97
- this.accountsToPoll.set(accounts.fundingPaymentHistory.toString(), {
98
- key: 'fundingPaymentHistory',
99
- publicKey: accounts.fundingPaymentHistory,
100
- eventType: 'fundingPaymentHistoryAccountUpdate',
101
- });
102
- }
103
- if ((_d = this.optionalExtraSubscriptions) === null || _d === void 0 ? void 0 : _d.includes('fundingRateHistoryAccount')) {
104
- this.accountsToPoll.set(accounts.fundingRateHistory.toString(), {
105
- key: 'fundingRateHistory',
106
- publicKey: accounts.fundingRateHistory,
107
- eventType: 'fundingRateHistoryAccountUpdate',
108
- });
109
- }
110
- if ((_e = this.optionalExtraSubscriptions) === null || _e === void 0 ? void 0 : _e.includes('curveHistoryAccount')) {
111
- this.accountsToPoll.set(accounts.extendedCurveHistory.toString(), {
112
- key: 'extendedCurveHistory',
113
- publicKey: accounts.extendedCurveHistory,
114
- eventType: 'curveHistoryAccountUpdate',
115
- });
116
- }
117
- if ((_f = this.optionalExtraSubscriptions) === null || _f === void 0 ? void 0 : _f.includes('liquidationHistoryAccount')) {
118
- this.accountsToPoll.set(accounts.liquidationHistory.toString(), {
119
- key: 'liquidationHistory',
120
- publicKey: accounts.liquidationHistory,
121
- eventType: 'liquidationHistoryAccountUpdate',
122
- });
123
- }
124
- if ((_g = this.optionalExtraSubscriptions) === null || _g === void 0 ? void 0 : _g.includes('orderHistoryAccount')) {
125
- this.accountsToPoll.set(accounts.orderHistory.toString(), {
126
- key: 'orderHistory',
127
- publicKey: accounts.orderHistory,
128
- eventType: 'orderHistoryAccountUpdate',
129
- });
130
- }
57
+ async updateAccountsToPoll() {
58
+ if (this.accountsToPoll.size > 0) {
59
+ return;
60
+ }
61
+ const accounts = await this.getClearingHouseAccounts();
62
+ this.accountsToPoll.set(accounts.state.toString(), {
63
+ key: 'state',
64
+ publicKey: accounts.state,
65
+ eventType: 'stateAccountUpdate',
131
66
  });
67
+ await this.updateMarketAccountsToPoll();
68
+ await this.updateBankAccountsToPoll();
132
69
  }
133
- getClearingHouseAccounts() {
134
- var _a;
135
- return __awaiter(this, void 0, void 0, function* () {
136
- // Skip extra calls to rpc if we already know all the accounts
137
- if (accounts_1.CLEARING_HOUSE_STATE_ACCOUNTS[this.program.programId.toString()]) {
138
- return accounts_1.CLEARING_HOUSE_STATE_ACCOUNTS[this.program.programId.toString()];
139
- }
140
- const statePublicKey = yield (0, addresses_1.getClearingHouseStateAccountPublicKey)(this.program.programId);
141
- const state = (yield this.program.account.state.fetch(statePublicKey));
142
- const accounts = {
143
- state: statePublicKey,
144
- markets: state.markets,
145
- orderState: state.orderState,
146
- tradeHistory: state.tradeHistory,
147
- depositHistory: state.depositHistory,
148
- fundingPaymentHistory: state.fundingPaymentHistory,
149
- fundingRateHistory: state.fundingRateHistory,
150
- extendedCurveHistory: state.extendedCurveHistory,
151
- liquidationHistory: state.liquidationHistory,
152
- orderHistory: undefined,
153
- };
154
- if ((_a = this.optionalExtraSubscriptions) === null || _a === void 0 ? void 0 : _a.includes('orderHistoryAccount')) {
155
- const orderState = (yield this.program.account.orderState.fetch(state.orderState));
156
- accounts.orderHistory = orderState.orderHistory;
157
- }
158
- return accounts;
70
+ async updateMarketAccountsToPoll() {
71
+ for (const marketIndex of this.marketIndexes) {
72
+ await this.addMarketAccountToPoll(marketIndex);
73
+ }
74
+ return true;
75
+ }
76
+ async addMarketAccountToPoll(marketIndex) {
77
+ const marketPublicKey = await (0, pda_1.getMarketPublicKey)(this.program.programId, marketIndex);
78
+ this.accountsToPoll.set(marketPublicKey.toString(), {
79
+ key: 'market',
80
+ publicKey: marketPublicKey,
81
+ eventType: 'marketAccountUpdate',
82
+ mapKey: marketIndex.toNumber(),
159
83
  });
84
+ return true;
160
85
  }
161
- addToAccountLoader() {
162
- return __awaiter(this, void 0, void 0, function* () {
163
- for (const [_, accountToPoll] of this.accountsToPoll) {
164
- accountToPoll.callbackId = this.accountLoader.addAccount(accountToPoll.publicKey, (buffer) => {
165
- const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
166
- this[accountToPoll.key] = account;
167
- // @ts-ignore
168
- this.eventEmitter.emit(accountToPoll.eventType, account);
169
- this.eventEmitter.emit('update');
170
- if (!this.isSubscribed) {
171
- this.isSubscribed = this.didSubscriptionSucceed();
172
- }
173
- });
174
- }
175
- this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
176
- this.eventEmitter.emit('error', error);
177
- });
86
+ async updateBankAccountsToPoll() {
87
+ for (const bankIndex of this.bankIndexes) {
88
+ await this.addBankAccountToPoll(bankIndex);
89
+ }
90
+ return true;
91
+ }
92
+ async addBankAccountToPoll(bankIndex) {
93
+ const bankPublicKey = await (0, pda_1.getBankPublicKey)(this.program.programId, bankIndex);
94
+ this.accountsToPoll.set(bankPublicKey.toString(), {
95
+ key: 'bank',
96
+ publicKey: bankPublicKey,
97
+ eventType: 'bankAccountUpdate',
98
+ mapKey: bankIndex.toNumber(),
178
99
  });
100
+ return true;
179
101
  }
180
- fetch() {
181
- return __awaiter(this, void 0, void 0, function* () {
182
- yield this.accountLoader.load();
183
- for (const [_, accountToPoll] of this.accountsToPoll) {
184
- const buffer = this.accountLoader.getAccountData(accountToPoll.publicKey);
185
- if (buffer) {
186
- this[accountToPoll.key] = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
187
- }
102
+ updateOraclesToPoll() {
103
+ for (const oracleInfo of this.oracleInfos) {
104
+ if (!oracleInfo.publicKey.equals(web3_js_1.PublicKey.default)) {
105
+ this.addOracleToPoll(oracleInfo);
188
106
  }
107
+ }
108
+ return true;
109
+ }
110
+ addOracleToPoll(oracleInfo) {
111
+ this.oraclesToPoll.set(oracleInfo.publicKey.toString(), {
112
+ publicKey: oracleInfo.publicKey,
113
+ source: oracleInfo.source,
189
114
  });
115
+ return true;
190
116
  }
191
- didSubscriptionSucceed() {
192
- let success = true;
117
+ async getClearingHouseAccounts() {
118
+ const statePublicKey = await (0, pda_1.getClearingHouseStateAccountPublicKey)(this.program.programId);
119
+ const accounts = {
120
+ state: statePublicKey,
121
+ };
122
+ return accounts;
123
+ }
124
+ async addToAccountLoader() {
193
125
  for (const [_, accountToPoll] of this.accountsToPoll) {
194
- if (!this[accountToPoll.key]) {
195
- success = false;
196
- break;
197
- }
126
+ this.addAccountToAccountLoader(accountToPoll);
198
127
  }
199
- return success;
128
+ for (const [_, oracleToPoll] of this.oraclesToPoll) {
129
+ this.addOracleToAccountLoader(oracleToPoll);
130
+ }
131
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
132
+ this.eventEmitter.emit('error', error);
133
+ });
200
134
  }
201
- unsubscribe() {
202
- return __awaiter(this, void 0, void 0, function* () {
203
- if (!this.isSubscribed) {
135
+ addAccountToAccountLoader(accountToPoll) {
136
+ accountToPoll.callbackId = this.accountLoader.addAccount(accountToPoll.publicKey, (buffer, slot) => {
137
+ if (!buffer)
204
138
  return;
139
+ const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
140
+ const dataAndSlot = {
141
+ data: account,
142
+ slot,
143
+ };
144
+ if (accountToPoll.mapKey != undefined) {
145
+ this[accountToPoll.key].set(accountToPoll.mapKey, dataAndSlot);
146
+ }
147
+ else {
148
+ this[accountToPoll.key] = dataAndSlot;
205
149
  }
206
- for (const [_, accountToPoll] of this.accountsToPoll) {
207
- this.accountLoader.removeAccount(accountToPoll.publicKey, accountToPoll.callbackId);
150
+ // @ts-ignore
151
+ this.eventEmitter.emit(accountToPoll.eventType, account);
152
+ this.eventEmitter.emit('update');
153
+ if (!this.isSubscribed) {
154
+ this.isSubscribed = this.didSubscriptionSucceed();
208
155
  }
209
- this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
210
- this.errorCallbackId = undefined;
211
- this.accountsToPoll.clear();
212
- this.isSubscribed = false;
213
156
  });
214
157
  }
215
- assertIsSubscribed() {
216
- if (!this.isSubscribed) {
217
- throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
158
+ addOracleToAccountLoader(oracleToPoll) {
159
+ const oracleClient = this.oracleClientCache.get(oracleToPoll.source, this.program.provider.connection);
160
+ oracleToPoll.callbackId = this.accountLoader.addAccount(oracleToPoll.publicKey, (buffer, slot) => {
161
+ if (!buffer)
162
+ return;
163
+ const oraclePriceData = oracleClient.getOraclePriceDataFromBuffer(buffer);
164
+ const dataAndSlot = {
165
+ data: oraclePriceData,
166
+ slot,
167
+ };
168
+ this.oracles.set(oracleToPoll.publicKey.toString(), dataAndSlot);
169
+ this.eventEmitter.emit('oraclePriceUpdate', oracleToPoll.publicKey, oraclePriceData);
170
+ this.eventEmitter.emit('update');
171
+ });
172
+ }
173
+ async fetch() {
174
+ await this.accountLoader.load();
175
+ for (const [_, accountToPoll] of this.accountsToPoll) {
176
+ const { buffer, slot } = this.accountLoader.getBufferAndSlot(accountToPoll.publicKey);
177
+ if (buffer) {
178
+ const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
179
+ if (accountToPoll.mapKey != undefined) {
180
+ this[accountToPoll.key].set(accountToPoll.mapKey, {
181
+ data: account,
182
+ slot,
183
+ });
184
+ }
185
+ else {
186
+ this[accountToPoll.key] = {
187
+ data: account,
188
+ slot,
189
+ };
190
+ }
191
+ }
192
+ }
193
+ for (const [_, oracleToPoll] of this.oraclesToPoll) {
194
+ const { buffer, slot } = this.accountLoader.getBufferAndSlot(oracleToPoll.publicKey);
195
+ if (buffer) {
196
+ const oracleClient = this.oracleClientCache.get(oracleToPoll.source, this.program.provider.connection);
197
+ const oraclePriceData = oracleClient.getOraclePriceDataFromBuffer(buffer);
198
+ this.oracles.set(oracleToPoll.publicKey.toString(), {
199
+ data: oraclePriceData,
200
+ slot,
201
+ });
202
+ }
218
203
  }
219
204
  }
220
- assertOptionalIsSubscribed(optionalSubscription) {
205
+ didSubscriptionSucceed() {
206
+ if (this.state)
207
+ return true;
208
+ return false;
209
+ }
210
+ async unsubscribe() {
221
211
  if (!this.isSubscribed) {
222
- throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
212
+ return;
223
213
  }
224
- if (!this.optionalExtraSubscriptions.includes(optionalSubscription)) {
225
- throw new types_1.NotSubscribedError(`You need to subscribe to the optional Clearing House account "${optionalSubscription}" to use this method`);
214
+ for (const [_, accountToPoll] of this.accountsToPoll) {
215
+ this.accountLoader.removeAccount(accountToPoll.publicKey, accountToPoll.callbackId);
216
+ }
217
+ for (const [_, oracleToPoll] of this.oraclesToPoll) {
218
+ this.accountLoader.removeAccount(oracleToPoll.publicKey, oracleToPoll.callbackId);
226
219
  }
220
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
221
+ this.errorCallbackId = undefined;
222
+ this.accountsToPoll.clear();
223
+ this.oraclesToPoll.clear();
224
+ this.isSubscribed = false;
227
225
  }
228
- getStateAccount() {
229
- this.assertIsSubscribed();
230
- return this.state;
226
+ async addBank(bankIndex) {
227
+ await this.addBankAccountToPoll(bankIndex);
228
+ const accountToPoll = this.accountsToPoll.get(bankIndex.toString());
229
+ this.addAccountToAccountLoader(accountToPoll);
230
+ return true;
231
231
  }
232
- getMarketsAccount() {
233
- this.assertIsSubscribed();
234
- return this.markets;
232
+ async addMarket(marketIndex) {
233
+ await this.addMarketAccountToPoll(marketIndex);
234
+ const accountToPoll = this.accountsToPoll.get(marketIndex.toString());
235
+ this.addAccountToAccountLoader(accountToPoll);
236
+ return true;
235
237
  }
236
- getOrderStateAccount() {
237
- this.assertIsSubscribed();
238
- return this.orderState;
239
- }
240
- getTradeHistoryAccount() {
241
- this.assertIsSubscribed();
242
- this.assertOptionalIsSubscribed('tradeHistoryAccount');
243
- return this.tradeHistory;
238
+ async addOracle(oracleInfo) {
239
+ if (oracleInfo.publicKey.equals(web3_js_1.PublicKey.default)) {
240
+ return true;
241
+ }
242
+ this.addOracleToPoll(oracleInfo);
243
+ const oracleToPoll = this.oraclesToPoll.get(oracleInfo.publicKey.toString());
244
+ this.addOracleToAccountLoader(oracleToPoll);
245
+ return true;
244
246
  }
245
- getDepositHistoryAccount() {
246
- this.assertIsSubscribed();
247
- this.assertOptionalIsSubscribed('depositHistoryAccount');
248
- return this.depositHistory;
247
+ assertIsSubscribed() {
248
+ if (!this.isSubscribed) {
249
+ throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
250
+ }
249
251
  }
250
- getFundingPaymentHistoryAccount() {
252
+ getStateAccountAndSlot() {
251
253
  this.assertIsSubscribed();
252
- this.assertOptionalIsSubscribed('fundingPaymentHistoryAccount');
253
- return this.fundingPaymentHistory;
254
+ return this.state;
254
255
  }
255
- getFundingRateHistoryAccount() {
256
- this.assertIsSubscribed();
257
- this.assertOptionalIsSubscribed('fundingRateHistoryAccount');
258
- return this.fundingRateHistory;
256
+ getMarketAccountAndSlot(marketIndex) {
257
+ return this.market.get(marketIndex.toNumber());
259
258
  }
260
- getCurveHistoryAccount() {
261
- this.assertIsSubscribed();
262
- this.assertOptionalIsSubscribed('curveHistoryAccount');
263
- return this.extendedCurveHistory;
259
+ getMarketAccountsAndSlots() {
260
+ return Array.from(this.market.values());
264
261
  }
265
- getLiquidationHistoryAccount() {
266
- this.assertIsSubscribed();
267
- this.assertOptionalIsSubscribed('liquidationHistoryAccount');
268
- return this.liquidationHistory;
262
+ getBankAccountAndSlot(bankIndex) {
263
+ return this.bank.get(bankIndex.toNumber());
269
264
  }
270
- getOrderHistoryAccount() {
265
+ getOraclePriceDataAndSlot(oraclePublicKey) {
271
266
  this.assertIsSubscribed();
272
- this.assertOptionalIsSubscribed('orderHistoryAccount');
273
- return this.orderHistory;
267
+ if (oraclePublicKey.equals(web3_js_1.PublicKey.default)) {
268
+ return {
269
+ data: quoteAssetOracleClient_1.QUOTE_ORACLE_PRICE_DATA,
270
+ slot: 0,
271
+ };
272
+ }
273
+ return this.oracles.get(oraclePublicKey.toString());
274
274
  }
275
275
  }
276
276
  exports.PollingClearingHouseAccountSubscriber = PollingClearingHouseAccountSubscriber;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { OracleEvents, OracleSubscriber } from './types';
2
+ import { DataAndSlot, OracleEvents, OracleSubscriber } from './types';
3
3
  import { Program } from '@project-serum/anchor';
4
4
  import StrictEventEmitter from 'strict-event-emitter-types';
5
5
  import { EventEmitter } from 'events';
@@ -15,13 +15,13 @@ export declare class PollingOracleSubscriber implements OracleSubscriber {
15
15
  oracleClient: OracleClient;
16
16
  callbackId?: string;
17
17
  errorCallbackId?: string;
18
- oraclePriceData?: OraclePriceData;
18
+ oraclePriceData?: DataAndSlot<OraclePriceData>;
19
19
  constructor(publicKey: PublicKey, oracleClient: OracleClient, accountLoader: BulkAccountLoader);
20
20
  subscribe(): Promise<boolean>;
21
21
  addToAccountLoader(): void;
22
22
  fetch(): Promise<void>;
23
23
  unsubscribe(): Promise<void>;
24
24
  assertIsSubscribed(): void;
25
- getOraclePriceData(): OraclePriceData;
25
+ getOraclePriceData(): DataAndSlot<OraclePriceData>;
26
26
  didSubscriptionSucceed(): boolean;
27
27
  }
@@ -1,13 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.PollingOracleSubscriber = void 0;
13
4
  const types_1 = require("./types");
@@ -20,59 +11,56 @@ class PollingOracleSubscriber {
20
11
  this.accountLoader = accountLoader;
21
12
  this.eventEmitter = new events_1.EventEmitter();
22
13
  }
23
- subscribe() {
24
- return __awaiter(this, void 0, void 0, function* () {
25
- if (this.isSubscribed) {
26
- return true;
27
- }
28
- this.addToAccountLoader();
29
- let subscriptionSucceeded = false;
30
- let retries = 0;
31
- while (!subscriptionSucceeded && retries < 5) {
32
- yield this.fetch();
33
- subscriptionSucceeded = this.didSubscriptionSucceed();
34
- retries++;
35
- }
36
- if (subscriptionSucceeded) {
37
- this.eventEmitter.emit('update');
38
- }
39
- this.isSubscribed = subscriptionSucceeded;
40
- return subscriptionSucceeded;
41
- });
14
+ async subscribe() {
15
+ if (this.isSubscribed) {
16
+ return true;
17
+ }
18
+ this.addToAccountLoader();
19
+ let subscriptionSucceeded = false;
20
+ let retries = 0;
21
+ while (!subscriptionSucceeded && retries < 5) {
22
+ await this.fetch();
23
+ subscriptionSucceeded = this.didSubscriptionSucceed();
24
+ retries++;
25
+ }
26
+ if (subscriptionSucceeded) {
27
+ this.eventEmitter.emit('update');
28
+ }
29
+ this.isSubscribed = subscriptionSucceeded;
30
+ return subscriptionSucceeded;
42
31
  }
43
32
  addToAccountLoader() {
44
33
  if (this.callbackId) {
45
34
  return;
46
35
  }
47
- this.callbackId = this.accountLoader.addAccount(this.publicKey, (buffer) => __awaiter(this, void 0, void 0, function* () {
48
- const oraclePriceData = yield this.oracleClient.getOraclePriceDataFromBuffer(buffer);
49
- this.oraclePriceData = oraclePriceData;
36
+ this.callbackId = this.accountLoader.addAccount(this.publicKey, async (buffer, slot) => {
37
+ const oraclePriceData = await this.oracleClient.getOraclePriceDataFromBuffer(buffer);
38
+ this.oraclePriceData = { data: oraclePriceData, slot };
50
39
  // @ts-ignore
51
40
  this.eventEmitter.emit('oracleUpdate', oraclePriceData);
52
41
  this.eventEmitter.emit('update');
53
- }));
42
+ });
54
43
  this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
55
44
  this.eventEmitter.emit('error', error);
56
45
  });
57
46
  }
58
- fetch() {
59
- return __awaiter(this, void 0, void 0, function* () {
60
- yield this.accountLoader.load();
61
- const buffer = this.accountLoader.getAccountData(this.publicKey);
62
- this.oraclePriceData = yield this.oracleClient.getOraclePriceDataFromBuffer(buffer);
63
- });
47
+ async fetch() {
48
+ await this.accountLoader.load();
49
+ const { buffer, slot } = this.accountLoader.getBufferAndSlot(this.publicKey);
50
+ this.oraclePriceData = {
51
+ data: await this.oracleClient.getOraclePriceDataFromBuffer(buffer),
52
+ slot,
53
+ };
64
54
  }
65
- unsubscribe() {
66
- return __awaiter(this, void 0, void 0, function* () {
67
- if (!this.isSubscribed) {
68
- return;
69
- }
70
- this.accountLoader.removeAccount(this.publicKey, this.callbackId);
71
- this.callbackId = undefined;
72
- this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
73
- this.errorCallbackId = undefined;
74
- this.isSubscribed = false;
75
- });
55
+ async unsubscribe() {
56
+ if (!this.isSubscribed) {
57
+ return;
58
+ }
59
+ this.accountLoader.removeAccount(this.publicKey, this.callbackId);
60
+ this.callbackId = undefined;
61
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
62
+ this.errorCallbackId = undefined;
63
+ this.isSubscribed = false;
76
64
  }
77
65
  assertIsSubscribed() {
78
66
  if (!this.isSubscribed) {
@@ -1,5 +1,5 @@
1
1
  /// <reference types="node" />
2
- import { TokenAccountEvents, TokenAccountSubscriber } from './types';
2
+ import { DataAndSlot, TokenAccountEvents, TokenAccountSubscriber } from './types';
3
3
  import { Program } from '@project-serum/anchor';
4
4
  import StrictEventEmitter from 'strict-event-emitter-types';
5
5
  import { EventEmitter } from 'events';
@@ -14,13 +14,13 @@ export declare class PollingTokenAccountSubscriber implements TokenAccountSubscr
14
14
  accountLoader: BulkAccountLoader;
15
15
  callbackId?: string;
16
16
  errorCallbackId?: string;
17
- tokenAccount?: AccountInfo;
17
+ tokenAccountAndSlot?: DataAndSlot<AccountInfo>;
18
18
  constructor(publicKey: PublicKey, accountLoader: BulkAccountLoader);
19
19
  subscribe(): Promise<boolean>;
20
20
  addToAccountLoader(): void;
21
21
  fetch(): Promise<void>;
22
22
  unsubscribe(): Promise<void>;
23
23
  assertIsSubscribed(): void;
24
- getTokenAccount(): AccountInfo;
24
+ getTokenAccountAndSlot(): DataAndSlot<AccountInfo>;
25
25
  didSubscriptionSucceed(): boolean;
26
26
  }