@drift-labs/sdk 0.1.36-master.5 → 0.2.0-master.0

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 (197) hide show
  1. package/lib/accounts/bulkAccountLoader.d.ts +7 -6
  2. package/lib/accounts/bulkAccountLoader.js +83 -93
  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 +8 -12
  26. package/lib/admin.js +366 -490
  27. package/lib/clearingHouse.d.ts +84 -103
  28. package/lib/clearingHouse.js +779 -810
  29. package/lib/clearingHouseConfig.d.ts +34 -0
  30. package/lib/clearingHouseConfig.js +2 -0
  31. package/lib/clearingHouseUser.d.ts +19 -18
  32. package/lib/clearingHouseUser.js +157 -115
  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 +34 -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 +16 -0
  42. package/lib/constants/numericConstants.js +22 -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 +112 -0
  61. package/lib/factory/bigNum.js +356 -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 +1739 -2287
  65. package/lib/index.d.ts +13 -4
  66. package/lib/index.js +13 -4
  67. package/lib/math/amm.d.ts +19 -29
  68. package/lib/math/amm.js +129 -179
  69. package/lib/math/auction.d.ts +5 -0
  70. package/lib/math/auction.js +39 -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/oracles.d.ts +3 -0
  80. package/lib/math/oracles.js +26 -0
  81. package/lib/math/orders.d.ts +5 -0
  82. package/lib/math/orders.js +31 -1
  83. package/lib/math/position.d.ts +7 -4
  84. package/lib/math/position.js +27 -9
  85. package/lib/math/repeg.d.ts +22 -0
  86. package/lib/math/repeg.js +128 -0
  87. package/lib/math/trade.d.ts +13 -8
  88. package/lib/math/trade.js +85 -22
  89. package/lib/mockUSDCFaucet.js +87 -116
  90. package/lib/oracles/oracleClientCache.d.ts +8 -0
  91. package/lib/oracles/oracleClientCache.js +19 -0
  92. package/lib/oracles/pythClient.d.ts +3 -5
  93. package/lib/oracles/pythClient.js +12 -30
  94. package/lib/oracles/quoteAssetOracleClient.d.ts +9 -0
  95. package/lib/oracles/quoteAssetOracleClient.js +21 -0
  96. package/lib/oracles/switchboardClient.d.ts +3 -5
  97. package/lib/oracles/switchboardClient.js +29 -47
  98. package/lib/oracles/types.d.ts +7 -1
  99. package/lib/orders.d.ts +6 -6
  100. package/lib/orders.js +10 -9
  101. package/lib/slot/SlotSubscriber.d.ts +12 -0
  102. package/lib/slot/SlotSubscriber.js +23 -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 +105 -98
  109. package/lib/types.js +13 -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 +10 -3
  116. package/src/accounts/bulkAccountLoader.ts +26 -15
  117. package/src/accounts/bulkUserSubscription.ts +1 -45
  118. package/src/accounts/fetch.ts +33 -0
  119. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +249 -214
  120. package/src/accounts/pollingOracleSubscriber.ts +16 -8
  121. package/src/accounts/pollingTokenAccountSubscriber.ts +11 -8
  122. package/src/accounts/pollingUserAccountSubscriber.ts +21 -86
  123. package/src/accounts/types.ts +41 -70
  124. package/src/accounts/webSocketAccountSubscriber.ts +33 -16
  125. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +190 -240
  126. package/src/accounts/webSocketUserAccountSubscriber.ts +11 -71
  127. package/src/addresses/marketAddresses.ts +18 -0
  128. package/src/addresses/pda.ts +118 -0
  129. package/src/admin.ts +209 -267
  130. package/src/clearingHouse.ts +921 -829
  131. package/src/clearingHouseConfig.ts +37 -0
  132. package/src/clearingHouseUser.ts +280 -127
  133. package/src/clearingHouseUserConfig.ts +18 -0
  134. package/src/config.ts +54 -1
  135. package/src/constants/banks.ts +43 -0
  136. package/src/constants/markets.ts +16 -207
  137. package/src/constants/numericConstants.ts +33 -5
  138. package/src/events/eventList.ts +94 -0
  139. package/src/events/eventSubscriber.ts +194 -0
  140. package/src/events/fetchLogs.ts +80 -0
  141. package/src/events/pollingLogProvider.ts +79 -0
  142. package/src/events/sort.ts +65 -0
  143. package/src/events/txEventCache.ts +74 -0
  144. package/src/events/types.ts +98 -0
  145. package/src/events/webSocketLogProvider.ts +38 -0
  146. package/src/examples/makeTradeExample.ts +20 -11
  147. package/src/factory/bigNum.ts +507 -0
  148. package/src/factory/oracleClient.ts +7 -4
  149. package/src/idl/clearing_house.json +1739 -2287
  150. package/src/index.ts +13 -4
  151. package/src/math/amm.ts +229 -245
  152. package/src/math/auction.ts +39 -0
  153. package/src/math/bankBalance.ts +112 -0
  154. package/src/math/conversion.ts +1 -11
  155. package/src/math/funding.ts +12 -9
  156. package/src/math/market.ts +37 -30
  157. package/src/math/oracles.ts +36 -0
  158. package/src/math/orders.ts +38 -0
  159. package/src/math/position.ts +48 -13
  160. package/src/math/repeg.ts +175 -0
  161. package/src/math/trade.ts +114 -36
  162. package/src/math/utils.js +27 -0
  163. package/src/math/utils.js.map +1 -0
  164. package/src/oracles/oracleClientCache.ts +20 -0
  165. package/src/oracles/pythClient.ts +5 -11
  166. package/src/oracles/quoteAssetOracleClient.ts +25 -0
  167. package/src/oracles/switchboardClient.ts +16 -24
  168. package/src/oracles/types.ts +8 -1
  169. package/src/orders.ts +35 -20
  170. package/src/slot/SlotSubscriber.ts +32 -0
  171. package/src/tx/retryTxSender.ts +6 -4
  172. package/src/tx/types.ts +6 -1
  173. package/src/tx/utils.ts +22 -3
  174. package/src/types.ts +108 -110
  175. package/src/userName.ts +20 -0
  176. package/src/util/computeUnits.js +17 -0
  177. package/src/util/computeUnits.js.map +1 -0
  178. package/tests/bn/test.ts +255 -0
  179. package/tsconfig.json +12 -12
  180. package/lib/addresses.d.ts +0 -9
  181. package/lib/addresses.js +0 -87
  182. package/lib/constants/accounts.d.ts +0 -15
  183. package/lib/constants/accounts.js +0 -18
  184. package/lib/factory/clearingHouse.d.ts +0 -35
  185. package/lib/factory/clearingHouse.js +0 -81
  186. package/lib/factory/clearingHouseUser.d.ts +0 -19
  187. package/lib/factory/clearingHouseUser.js +0 -34
  188. package/lib/math/insuranceFund.d.ts +0 -15
  189. package/lib/math/insuranceFund.js +0 -33
  190. package/lib/tx/defaultTxSender.d.ts +0 -8
  191. package/lib/tx/defaultTxSender.js +0 -12
  192. package/src/addresses.ts +0 -71
  193. package/src/constants/accounts.ts +0 -26
  194. package/src/factory/clearingHouse.ts +0 -173
  195. package/src/factory/clearingHouseUser.ts +0 -73
  196. package/src/math/insuranceFund.ts +0 -29
  197. package/src/tx/defaultTxSender.ts +0 -24
@@ -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.PollingTokenAccountSubscriber = void 0;
13
4
  const types_1 = require("./types");
@@ -20,33 +11,31 @@ class PollingTokenAccountSubscriber {
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) => {
36
+ this.callbackId = this.accountLoader.addAccount(this.publicKey, (buffer, slot) => {
48
37
  const tokenAccount = (0, token_1.parseTokenAccount)(buffer);
49
- this.tokenAccount = tokenAccount;
38
+ this.tokenAccountAndSlot = { data: tokenAccount, slot };
50
39
  // @ts-ignore
51
40
  this.eventEmitter.emit('tokenAccountUpdate', tokenAccount);
52
41
  this.eventEmitter.emit('update');
@@ -55,36 +44,32 @@ class PollingTokenAccountSubscriber {
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.tokenAccount = (0, token_1.parseTokenAccount)(buffer);
63
- });
47
+ async fetch() {
48
+ await this.accountLoader.load();
49
+ const { buffer, slot } = this.accountLoader.getBufferAndSlot(this.publicKey);
50
+ this.tokenAccountAndSlot = { data: (0, token_1.parseTokenAccount)(buffer), slot };
64
51
  }
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
- });
52
+ async unsubscribe() {
53
+ if (!this.isSubscribed) {
54
+ return;
55
+ }
56
+ this.accountLoader.removeAccount(this.publicKey, this.callbackId);
57
+ this.callbackId = undefined;
58
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
59
+ this.errorCallbackId = undefined;
60
+ this.isSubscribed = false;
76
61
  }
77
62
  assertIsSubscribed() {
78
63
  if (!this.isSubscribed) {
79
64
  throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
80
65
  }
81
66
  }
82
- getTokenAccount() {
67
+ getTokenAccountAndSlot() {
83
68
  this.assertIsSubscribed();
84
- return this.tokenAccount;
69
+ return this.tokenAccountAndSlot;
85
70
  }
86
71
  didSubscriptionSucceed() {
87
- return !!this.tokenAccount;
72
+ return !!this.tokenAccountAndSlot;
88
73
  }
89
74
  }
90
75
  exports.PollingTokenAccountSubscriber = PollingTokenAccountSubscriber;
@@ -1,33 +1,27 @@
1
1
  /// <reference types="node" />
2
- import { AccountToPoll, UserAccountEvents, UserAccountSubscriber, UserPublicKeys } from './types';
2
+ import { DataAndSlot, AccountToPoll, UserAccountEvents, UserAccountSubscriber } 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';
6
6
  import { PublicKey } from '@solana/web3.js';
7
- import { UserAccount, UserOrdersAccount, UserPositionsAccount } from '../types';
7
+ import { UserAccount } from '../types';
8
8
  import { BulkAccountLoader } from './bulkAccountLoader';
9
- import { ClearingHouseConfigType } from '../factory/clearingHouse';
10
9
  export declare class PollingUserAccountSubscriber implements UserAccountSubscriber {
11
10
  isSubscribed: boolean;
12
11
  program: Program;
13
12
  eventEmitter: StrictEventEmitter<EventEmitter, UserAccountEvents>;
14
- authority: PublicKey;
13
+ userAccountPublicKey: PublicKey;
15
14
  accountLoader: BulkAccountLoader;
16
15
  accountsToPoll: Map<string, AccountToPoll>;
17
16
  errorCallbackId?: string;
18
- user?: UserAccount;
19
- userPositions?: UserPositionsAccount;
20
- userOrders?: UserOrdersAccount;
21
- type: ClearingHouseConfigType;
22
- constructor(program: Program, authority: PublicKey, accountLoader: BulkAccountLoader);
17
+ user?: DataAndSlot<UserAccount>;
18
+ constructor(program: Program, userAccountPublicKey: PublicKey, accountLoader: BulkAccountLoader);
23
19
  subscribe(): Promise<boolean>;
24
- addToAccountLoader(userPublicKeys?: UserPublicKeys): Promise<void>;
20
+ addToAccountLoader(): Promise<void>;
25
21
  fetchIfUnloaded(): Promise<void>;
26
22
  fetch(): Promise<void>;
27
23
  didSubscriptionSucceed(): boolean;
28
24
  unsubscribe(): Promise<void>;
29
25
  assertIsSubscribed(): void;
30
- getUserAccount(): UserAccount;
31
- getUserPositionsAccount(): UserPositionsAccount;
32
- getUserOrdersAccount(): UserOrdersAccount;
26
+ getUserAccountAndSlot(): DataAndSlot<UserAccount>;
33
27
  }
@@ -1,176 +1,113 @@
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.PollingUserAccountSubscriber = void 0;
13
4
  const types_1 = require("./types");
14
5
  const events_1 = require("events");
15
- const addresses_1 = require("../addresses");
16
6
  const utils_1 = require("./utils");
17
7
  class PollingUserAccountSubscriber {
18
- constructor(program, authority, accountLoader) {
8
+ constructor(program, userAccountPublicKey, accountLoader) {
19
9
  this.accountsToPoll = new Map();
20
- this.type = 'polling';
21
10
  this.isSubscribed = false;
22
11
  this.program = program;
23
- this.authority = authority;
24
12
  this.accountLoader = accountLoader;
25
13
  this.eventEmitter = new events_1.EventEmitter();
14
+ this.userAccountPublicKey = userAccountPublicKey;
26
15
  }
27
- subscribe() {
28
- return __awaiter(this, void 0, void 0, function* () {
29
- if (this.isSubscribed) {
30
- return true;
31
- }
32
- yield this.addToAccountLoader();
33
- let subscriptionSucceeded = false;
34
- let retries = 0;
35
- while (!subscriptionSucceeded && retries < 5) {
36
- yield this.fetchIfUnloaded();
37
- subscriptionSucceeded = this.didSubscriptionSucceed();
38
- retries++;
39
- }
40
- if (subscriptionSucceeded) {
41
- this.eventEmitter.emit('update');
42
- }
43
- this.isSubscribed = subscriptionSucceeded;
44
- return subscriptionSucceeded;
45
- });
16
+ async subscribe() {
17
+ if (this.isSubscribed) {
18
+ return true;
19
+ }
20
+ await this.addToAccountLoader();
21
+ let subscriptionSucceeded = false;
22
+ let retries = 0;
23
+ while (!subscriptionSucceeded && retries < 5) {
24
+ await this.fetchIfUnloaded();
25
+ subscriptionSucceeded = this.didSubscriptionSucceed();
26
+ retries++;
27
+ }
28
+ if (subscriptionSucceeded) {
29
+ this.eventEmitter.emit('update');
30
+ }
31
+ this.isSubscribed = subscriptionSucceeded;
32
+ return subscriptionSucceeded;
46
33
  }
47
- addToAccountLoader(userPublicKeys) {
48
- return __awaiter(this, void 0, void 0, function* () {
49
- if (this.accountsToPoll.size > 0) {
50
- return;
51
- }
52
- if (!userPublicKeys) {
53
- const userPublicKey = yield (0, addresses_1.getUserAccountPublicKey)(this.program.programId, this.authority);
54
- const userAccount = (yield this.program.account.user.fetch(userPublicKey));
55
- this.accountsToPoll.set(userPublicKey.toString(), {
56
- key: 'user',
57
- publicKey: userPublicKey,
58
- eventType: 'userAccountData',
59
- });
60
- this.accountsToPoll.set(userAccount.positions.toString(), {
61
- key: 'userPositions',
62
- publicKey: userAccount.positions,
63
- eventType: 'userPositionsData',
64
- });
65
- const userOrdersPublicKey = yield (0, addresses_1.getUserOrdersAccountPublicKey)(this.program.programId, userPublicKey);
66
- this.accountsToPoll.set(userOrdersPublicKey.toString(), {
67
- key: 'userOrders',
68
- publicKey: userOrdersPublicKey,
69
- eventType: 'userOrdersData',
70
- });
71
- }
72
- else {
73
- this.accountsToPoll.set(userPublicKeys.user.toString(), {
74
- key: 'user',
75
- publicKey: userPublicKeys.user,
76
- eventType: 'userAccountData',
77
- });
78
- this.accountsToPoll.set(userPublicKeys.userPositions.toString(), {
79
- key: 'userPositions',
80
- publicKey: userPublicKeys.userPositions,
81
- eventType: 'userPositionsData',
82
- });
83
- if (userPublicKeys.userOrders) {
84
- this.accountsToPoll.set(userPublicKeys.userOrders.toString(), {
85
- key: 'userOrders',
86
- publicKey: userPublicKeys.userOrders,
87
- eventType: 'userOrdersData',
88
- });
34
+ async addToAccountLoader() {
35
+ if (this.accountsToPoll.size > 0) {
36
+ return;
37
+ }
38
+ this.accountsToPoll.set(this.userAccountPublicKey.toString(), {
39
+ key: 'user',
40
+ publicKey: this.userAccountPublicKey,
41
+ eventType: 'userAccountUpdate',
42
+ });
43
+ for (const [_, accountToPoll] of this.accountsToPoll) {
44
+ accountToPoll.callbackId = this.accountLoader.addAccount(accountToPoll.publicKey, (buffer, slot) => {
45
+ if (!buffer) {
46
+ return;
89
47
  }
90
- }
91
- for (const [_, accountToPoll] of this.accountsToPoll) {
92
- accountToPoll.callbackId = this.accountLoader.addAccount(accountToPoll.publicKey, (buffer) => {
93
- if (!buffer) {
94
- return;
95
- }
96
- const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
97
- this[accountToPoll.key] = account;
98
- // @ts-ignore
99
- this.eventEmitter.emit(accountToPoll.eventType, account);
100
- this.eventEmitter.emit('update');
101
- });
102
- }
103
- this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
104
- this.eventEmitter.emit('error', error);
48
+ const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
49
+ this[accountToPoll.key] = { data: account, slot };
50
+ // @ts-ignore
51
+ this.eventEmitter.emit(accountToPoll.eventType, account);
52
+ this.eventEmitter.emit('update');
105
53
  });
54
+ }
55
+ this.errorCallbackId = this.accountLoader.addErrorCallbacks((error) => {
56
+ this.eventEmitter.emit('error', error);
106
57
  });
107
58
  }
108
- fetchIfUnloaded() {
109
- return __awaiter(this, void 0, void 0, function* () {
110
- let shouldFetch = false;
111
- for (const [_, accountToPoll] of this.accountsToPoll) {
112
- if (this[accountToPoll.key] === undefined) {
113
- shouldFetch = true;
114
- break;
115
- }
116
- }
117
- if (shouldFetch) {
118
- yield this.fetch();
59
+ async fetchIfUnloaded() {
60
+ let shouldFetch = false;
61
+ for (const [_, accountToPoll] of this.accountsToPoll) {
62
+ if (this[accountToPoll.key] === undefined) {
63
+ shouldFetch = true;
64
+ break;
119
65
  }
120
- });
66
+ }
67
+ if (shouldFetch) {
68
+ await this.fetch();
69
+ }
121
70
  }
122
- fetch() {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- yield this.accountLoader.load();
125
- for (const [_, accountToPoll] of this.accountsToPoll) {
126
- const buffer = this.accountLoader.getAccountData(accountToPoll.publicKey);
127
- if (buffer) {
128
- this[accountToPoll.key] = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
129
- }
71
+ async fetch() {
72
+ await this.accountLoader.load();
73
+ for (const [_, accountToPoll] of this.accountsToPoll) {
74
+ const { buffer, slot } = this.accountLoader.getBufferAndSlot(accountToPoll.publicKey);
75
+ if (buffer) {
76
+ const account = this.program.account[accountToPoll.key].coder.accounts.decode((0, utils_1.capitalize)(accountToPoll.key), buffer);
77
+ this[accountToPoll.key] = { data: account, slot };
130
78
  }
131
- });
79
+ }
132
80
  }
133
81
  didSubscriptionSucceed() {
134
82
  let success = true;
135
83
  for (const [_, accountToPoll] of this.accountsToPoll) {
136
- // userOrders may not exist
137
- if (accountToPoll.key !== 'userOrders' && !this[accountToPoll.key]) {
84
+ if (!this[accountToPoll.key]) {
138
85
  success = false;
139
86
  break;
140
87
  }
141
88
  }
142
89
  return success;
143
90
  }
144
- unsubscribe() {
145
- return __awaiter(this, void 0, void 0, function* () {
146
- if (!this.isSubscribed) {
147
- return;
148
- }
149
- for (const [_, accountToPoll] of this.accountsToPoll) {
150
- this.accountLoader.removeAccount(accountToPoll.publicKey, accountToPoll.callbackId);
151
- }
152
- this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
153
- this.errorCallbackId = undefined;
154
- this.accountsToPoll.clear();
155
- this.isSubscribed = false;
156
- });
91
+ async unsubscribe() {
92
+ if (!this.isSubscribed) {
93
+ return;
94
+ }
95
+ for (const [_, accountToPoll] of this.accountsToPoll) {
96
+ this.accountLoader.removeAccount(accountToPoll.publicKey, accountToPoll.callbackId);
97
+ }
98
+ this.accountLoader.removeErrorCallbacks(this.errorCallbackId);
99
+ this.errorCallbackId = undefined;
100
+ this.accountsToPoll.clear();
101
+ this.isSubscribed = false;
157
102
  }
158
103
  assertIsSubscribed() {
159
104
  if (!this.isSubscribed) {
160
105
  throw new types_1.NotSubscribedError('You must call `subscribe` before using this function');
161
106
  }
162
107
  }
163
- getUserAccount() {
108
+ getUserAccountAndSlot() {
164
109
  this.assertIsSubscribed();
165
110
  return this.user;
166
111
  }
167
- getUserPositionsAccount() {
168
- this.assertIsSubscribed();
169
- return this.userPositions;
170
- }
171
- getUserOrdersAccount() {
172
- this.assertIsSubscribed();
173
- return this.userOrders;
174
- }
175
112
  }
176
113
  exports.PollingUserAccountSubscriber = PollingUserAccountSubscriber;
@@ -1,12 +1,15 @@
1
1
  /// <reference types="node" />
2
- import { DepositHistoryAccount, ExtendedCurveHistoryAccount, FundingPaymentHistoryAccount, FundingRateHistoryAccount, LiquidationHistoryAccount, MarketsAccount, OrderHistoryAccount, OrderStateAccount, StateAccount, TradeHistoryAccount, UserAccount, UserOrdersAccount, UserPositionsAccount } from '../types';
2
+ /// <reference types="bn.js" />
3
+ /// <reference types="node" />
4
+ import { BankAccount, MarketAccount, OracleSource, StateAccount, UserAccount } from '../types';
3
5
  import StrictEventEmitter from 'strict-event-emitter-types';
4
6
  import { EventEmitter } from 'events';
5
7
  import { PublicKey } from '@solana/web3.js';
6
8
  import { AccountInfo } from '@solana/spl-token';
7
- import { ClearingHouseConfigType, ClearingHouseUserConfigType, OraclePriceData } from '..';
9
+ import { OracleInfo, OraclePriceData } from '..';
10
+ import { BN } from '@project-serum/anchor';
8
11
  export interface AccountSubscriber<T> {
9
- data?: T;
12
+ dataAndSlot?: DataAndSlot<T>;
10
13
  subscribe(onChange: (data: T) => void): Promise<void>;
11
14
  fetch(): Promise<void>;
12
15
  unsubscribe(): Promise<void>;
@@ -16,47 +19,30 @@ export declare class NotSubscribedError extends Error {
16
19
  }
17
20
  export interface ClearingHouseAccountEvents {
18
21
  stateAccountUpdate: (payload: StateAccount) => void;
19
- marketsAccountUpdate: (payload: MarketsAccount) => void;
20
- fundingPaymentHistoryAccountUpdate: (payload: FundingPaymentHistoryAccount) => void;
21
- fundingRateHistoryAccountUpdate: (payload: FundingRateHistoryAccount) => void;
22
- tradeHistoryAccountUpdate: (payload: TradeHistoryAccount) => void;
23
- liquidationHistoryAccountUpdate: (payload: LiquidationHistoryAccount) => void;
24
- depositHistoryAccountUpdate: (payload: DepositHistoryAccount) => void;
25
- curveHistoryAccountUpdate: (payload: ExtendedCurveHistoryAccount) => void;
26
- orderHistoryAccountUpdate: (payload: OrderHistoryAccount) => void;
27
- orderStateAccountUpdate: (payload: OrderStateAccount) => void;
22
+ marketAccountUpdate: (payload: MarketAccount) => void;
23
+ bankAccountUpdate: (payload: BankAccount) => void;
24
+ oraclePriceUpdate: (publicKey: PublicKey, data: OraclePriceData) => void;
25
+ userAccountUpdate: (payload: UserAccount) => void;
28
26
  update: void;
29
27
  error: (e: Error) => void;
30
28
  }
31
- export declare type ClearingHouseAccountTypes = 'tradeHistoryAccount' | 'depositHistoryAccount' | 'fundingPaymentHistoryAccount' | 'fundingRateHistoryAccount' | 'curveHistoryAccount' | 'liquidationHistoryAccount' | 'orderHistoryAccount';
32
29
  export interface ClearingHouseAccountSubscriber {
33
30
  eventEmitter: StrictEventEmitter<EventEmitter, ClearingHouseAccountEvents>;
34
31
  isSubscribed: boolean;
35
- optionalExtraSubscriptions: ClearingHouseAccountTypes[];
36
- subscribe(optionalSubscriptions?: ClearingHouseAccountTypes[]): Promise<boolean>;
32
+ subscribe(): Promise<boolean>;
37
33
  fetch(): Promise<void>;
38
34
  unsubscribe(): Promise<void>;
39
- getStateAccount(): StateAccount;
40
- getMarketsAccount(): MarketsAccount;
41
- getTradeHistoryAccount(): TradeHistoryAccount;
42
- getDepositHistoryAccount(): DepositHistoryAccount;
43
- getFundingPaymentHistoryAccount(): FundingPaymentHistoryAccount;
44
- getFundingRateHistoryAccount(): FundingRateHistoryAccount;
45
- getCurveHistoryAccount(): ExtendedCurveHistoryAccount;
46
- getLiquidationHistoryAccount(): LiquidationHistoryAccount;
47
- getOrderStateAccount(): OrderStateAccount;
48
- getOrderHistoryAccount(): OrderHistoryAccount;
49
- type: ClearingHouseConfigType;
35
+ addMarket(marketIndex: BN): Promise<boolean>;
36
+ addBank(bankIndex: BN): Promise<boolean>;
37
+ addOracle(oracleInfo: OracleInfo): Promise<boolean>;
38
+ getStateAccountAndSlot(): DataAndSlot<StateAccount>;
39
+ getMarketAccountAndSlot(marketIndex: BN): DataAndSlot<MarketAccount> | undefined;
40
+ getMarketAccountsAndSlots(): DataAndSlot<MarketAccount>[];
41
+ getBankAccountAndSlot(bankIndex: BN): DataAndSlot<BankAccount> | undefined;
42
+ getOraclePriceDataAndSlot(oraclePublicKey: PublicKey): DataAndSlot<OraclePriceData> | undefined;
50
43
  }
51
- export declare type UserPublicKeys = {
52
- user: PublicKey;
53
- userPositions: PublicKey;
54
- userOrders: PublicKey | undefined;
55
- };
56
44
  export interface UserAccountEvents {
57
- userAccountData: (payload: UserAccount) => void;
58
- userPositionsData: (payload: UserPositionsAccount) => void;
59
- userOrdersData: (payload: UserOrdersAccount) => void;
45
+ userAccountUpdate: (payload: UserAccount) => void;
60
46
  update: void;
61
47
  error: (e: Error) => void;
62
48
  }
@@ -66,10 +52,7 @@ export interface UserAccountSubscriber {
66
52
  subscribe(): Promise<boolean>;
67
53
  fetch(): Promise<void>;
68
54
  unsubscribe(): Promise<void>;
69
- getUserAccount(): UserAccount;
70
- getUserPositionsAccount(): UserPositionsAccount;
71
- getUserOrdersAccount(): UserOrdersAccount;
72
- type: ClearingHouseUserConfigType;
55
+ getUserAccountAndSlot(): DataAndSlot<UserAccount>;
73
56
  }
74
57
  export interface TokenAccountEvents {
75
58
  tokenAccountUpdate: (payload: AccountInfo) => void;
@@ -82,7 +65,7 @@ export interface TokenAccountSubscriber {
82
65
  subscribe(): Promise<boolean>;
83
66
  fetch(): Promise<void>;
84
67
  unsubscribe(): Promise<void>;
85
- getTokenAccount(): AccountInfo;
68
+ getTokenAccountAndSlot(): DataAndSlot<AccountInfo>;
86
69
  }
87
70
  export interface OracleEvents {
88
71
  oracleUpdate: (payload: OraclePriceData) => void;
@@ -95,15 +78,25 @@ export interface OracleSubscriber {
95
78
  subscribe(): Promise<boolean>;
96
79
  fetch(): Promise<void>;
97
80
  unsubscribe(): Promise<void>;
98
- getOraclePriceData(): OraclePriceData;
81
+ getOraclePriceData(): DataAndSlot<OraclePriceData>;
99
82
  }
100
83
  export declare type AccountToPoll = {
101
84
  key: string;
102
85
  publicKey: PublicKey;
103
86
  eventType: string;
104
87
  callbackId?: string;
88
+ mapKey?: number;
89
+ };
90
+ export declare type OraclesToPoll = {
91
+ publicKey: PublicKey;
92
+ source: OracleSource;
93
+ callbackId?: string;
105
94
  };
106
- export declare type AccountData = {
95
+ export declare type BufferAndSlot = {
107
96
  slot: number;
108
97
  buffer: Buffer | undefined;
109
98
  };
99
+ export declare type DataAndSlot<T> = {
100
+ data: T;
101
+ slot: number;
102
+ };
@@ -1,18 +1,20 @@
1
1
  /// <reference types="node" />
2
- import { AccountData, AccountSubscriber } from './types';
2
+ import { DataAndSlot, BufferAndSlot, AccountSubscriber } from './types';
3
3
  import { Program } from '@project-serum/anchor';
4
4
  import { AccountInfo, Context, PublicKey } from '@solana/web3.js';
5
5
  export declare class WebSocketAccountSubscriber<T> implements AccountSubscriber<T> {
6
- data?: T;
7
- accountData?: AccountData;
6
+ dataAndSlot?: DataAndSlot<T>;
7
+ bufferAndSlot?: BufferAndSlot;
8
8
  accountName: string;
9
9
  program: Program;
10
10
  accountPublicKey: PublicKey;
11
+ decodeBufferFn: (buffer: Buffer) => T;
11
12
  onChange: (data: T) => void;
12
13
  listenerId?: number;
13
- constructor(accountName: string, program: Program, accountPublicKey: PublicKey);
14
+ constructor(accountName: string, program: Program, accountPublicKey: PublicKey, decodeBuffer?: (buffer: Buffer) => T);
14
15
  subscribe(onChange: (data: T) => void): Promise<void>;
15
16
  fetch(): Promise<void>;
16
17
  handleRpcResponse(context: Context, accountInfo?: AccountInfo<Buffer>): void;
18
+ decodeBuffer(buffer: Buffer): T;
17
19
  unsubscribe(): Promise<void>;
18
20
  }