@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,16 +1,16 @@
1
1
  /// <reference types="node" />
2
2
  import { Commitment, Connection, PublicKey } from '@solana/web3.js';
3
- import { AccountData } from './types';
3
+ import { BufferAndSlot } from './types';
4
4
  declare type AccountToLoad = {
5
5
  publicKey: PublicKey;
6
- callbacks: Map<string, (buffer: Buffer) => void>;
6
+ callbacks: Map<string, (buffer: Buffer, slot: number) => void>;
7
7
  };
8
8
  export declare class BulkAccountLoader {
9
9
  connection: Connection;
10
10
  commitment: Commitment;
11
11
  pollingFrequency: number;
12
12
  accountsToLoad: Map<string, AccountToLoad>;
13
- accountData: Map<string, AccountData>;
13
+ bufferAndSlotMap: Map<string, BufferAndSlot>;
14
14
  errorCallbacks: Map<string, (e: any) => void>;
15
15
  intervalId?: NodeJS.Timer;
16
16
  loadPromise?: Promise<void>;
@@ -18,15 +18,15 @@ export declare class BulkAccountLoader {
18
18
  lastTimeLoadingPromiseCleared: number;
19
19
  mostRecentSlot: number;
20
20
  constructor(connection: Connection, commitment: Commitment, pollingFrequency: number);
21
- addAccount(publicKey: PublicKey, callback: (buffer: Buffer) => void): string;
21
+ addAccount(publicKey: PublicKey, callback: (buffer: Buffer, slot: number) => void): string;
22
22
  removeAccount(publicKey: PublicKey, callbackId: string): void;
23
23
  addErrorCallbacks(callback: (error: Error) => void): string;
24
24
  removeErrorCallbacks(callbackId: string): void;
25
25
  chunks<T>(array: readonly T[], size: number): T[][];
26
26
  load(): Promise<void>;
27
27
  loadChunk(accountsToLoad: AccountToLoad[]): Promise<void>;
28
- handleAccountCallbacks(accountToLoad: AccountToLoad, buffer: Buffer): void;
29
- getAccountData(publicKey: PublicKey): Buffer | undefined;
28
+ handleAccountCallbacks(accountToLoad: AccountToLoad, buffer: Buffer, slot: number): void;
29
+ getBufferAndSlot(publicKey: PublicKey): BufferAndSlot | undefined;
30
30
  startPolling(): void;
31
31
  stopPolling(): void;
32
32
  log(msg: string): void;
@@ -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.BulkAccountLoader = void 0;
13
4
  const uuid_1 = require("uuid");
@@ -17,7 +8,7 @@ const oneMinute = 60 * 1000;
17
8
  class BulkAccountLoader {
18
9
  constructor(connection, commitment, pollingFrequency) {
19
10
  this.accountsToLoad = new Map();
20
- this.accountData = new Map();
11
+ this.bufferAndSlotMap = new Map();
21
12
  this.errorCallbacks = new Map();
22
13
  this.lastTimeLoadingPromiseCleared = Date.now();
23
14
  this.mostRecentSlot = 0;
@@ -74,103 +65,98 @@ class BulkAccountLoader {
74
65
  .map((_, index) => index * size)
75
66
  .map((begin) => array.slice(begin, begin + size));
76
67
  }
77
- load() {
78
- return __awaiter(this, void 0, void 0, function* () {
79
- if (this.loadPromise) {
80
- const now = Date.now();
81
- if (now - this.lastTimeLoadingPromiseCleared > oneMinute) {
82
- this.loadPromise = undefined;
83
- }
84
- else {
85
- return this.loadPromise;
86
- }
87
- }
88
- this.loadPromise = new Promise((resolver) => {
89
- this.loadPromiseResolver = resolver;
90
- });
91
- this.lastTimeLoadingPromiseCleared = Date.now();
92
- try {
93
- const chunks = this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE);
94
- yield Promise.all(chunks.map((chunk) => {
95
- return this.loadChunk(chunk);
96
- }));
97
- }
98
- catch (e) {
99
- console.error(`Error in bulkAccountLoader.load()`);
100
- console.error(e);
101
- for (const [_, callback] of this.errorCallbacks) {
102
- callback(e);
103
- }
104
- }
105
- finally {
106
- this.loadPromiseResolver();
68
+ async load() {
69
+ if (this.loadPromise) {
70
+ const now = Date.now();
71
+ if (now - this.lastTimeLoadingPromiseCleared > oneMinute) {
107
72
  this.loadPromise = undefined;
108
73
  }
74
+ else {
75
+ return this.loadPromise;
76
+ }
77
+ }
78
+ this.loadPromise = new Promise((resolver) => {
79
+ this.loadPromiseResolver = resolver;
109
80
  });
81
+ this.lastTimeLoadingPromiseCleared = Date.now();
82
+ try {
83
+ const chunks = this.chunks(Array.from(this.accountsToLoad.values()), GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE);
84
+ await Promise.all(chunks.map((chunk) => {
85
+ return this.loadChunk(chunk);
86
+ }));
87
+ }
88
+ catch (e) {
89
+ console.error(`Error in bulkAccountLoader.load()`);
90
+ console.error(e);
91
+ for (const [_, callback] of this.errorCallbacks) {
92
+ callback(e);
93
+ }
94
+ }
95
+ finally {
96
+ this.loadPromiseResolver();
97
+ this.loadPromise = undefined;
98
+ }
110
99
  }
111
- loadChunk(accountsToLoad) {
112
- return __awaiter(this, void 0, void 0, function* () {
113
- if (accountsToLoad.length === 0) {
114
- return;
100
+ async loadChunk(accountsToLoad) {
101
+ if (accountsToLoad.length === 0) {
102
+ return;
103
+ }
104
+ const args = [
105
+ accountsToLoad.map((accountToLoad) => {
106
+ return accountToLoad.publicKey.toBase58();
107
+ }),
108
+ { commitment: this.commitment },
109
+ ];
110
+ const rpcResponse = await (0, promiseTimeout_1.promiseTimeout)(
111
+ // @ts-ignore
112
+ this.connection._rpcRequest('getMultipleAccounts', args), 10 * 1000 // 30 second timeout
113
+ );
114
+ if (rpcResponse === null) {
115
+ this.log('request to rpc timed out');
116
+ return;
117
+ }
118
+ const newSlot = rpcResponse.result.context.slot;
119
+ if (newSlot > this.mostRecentSlot) {
120
+ this.mostRecentSlot = newSlot;
121
+ }
122
+ for (const i in accountsToLoad) {
123
+ const accountToLoad = accountsToLoad[i];
124
+ const key = accountToLoad.publicKey.toString();
125
+ const oldRPCResponse = this.bufferAndSlotMap.get(key);
126
+ let newBuffer = undefined;
127
+ if (rpcResponse.result.value[i]) {
128
+ const raw = rpcResponse.result.value[i].data[0];
129
+ const dataType = rpcResponse.result.value[i].data[1];
130
+ newBuffer = Buffer.from(raw, dataType);
115
131
  }
116
- const args = [
117
- accountsToLoad.map((accountToLoad) => {
118
- return accountToLoad.publicKey.toBase58();
119
- }),
120
- { commitment: this.commitment },
121
- ];
122
- const rpcResponse = yield (0, promiseTimeout_1.promiseTimeout)(
123
- // @ts-ignore
124
- this.connection._rpcRequest('getMultipleAccounts', args), 10 * 1000 // 30 second timeout
125
- );
126
- if (rpcResponse === null) {
127
- this.log('request to rpc timed out');
128
- return;
132
+ if (!oldRPCResponse) {
133
+ this.bufferAndSlotMap.set(key, {
134
+ slot: newSlot,
135
+ buffer: newBuffer,
136
+ });
137
+ this.handleAccountCallbacks(accountToLoad, newBuffer, newSlot);
138
+ continue;
129
139
  }
130
- const newSlot = rpcResponse.result.context.slot;
131
- if (newSlot > this.mostRecentSlot) {
132
- this.mostRecentSlot = newSlot;
140
+ if (newSlot <= oldRPCResponse.slot) {
141
+ continue;
133
142
  }
134
- for (const i in accountsToLoad) {
135
- const accountToLoad = accountsToLoad[i];
136
- const key = accountToLoad.publicKey.toString();
137
- const oldRPCResponse = this.accountData.get(key);
138
- let newBuffer = undefined;
139
- if (rpcResponse.result.value[i]) {
140
- const raw = rpcResponse.result.value[i].data[0];
141
- const dataType = rpcResponse.result.value[i].data[1];
142
- newBuffer = Buffer.from(raw, dataType);
143
- }
144
- if (!oldRPCResponse) {
145
- this.accountData.set(key, {
146
- slot: newSlot,
147
- buffer: newBuffer,
148
- });
149
- this.handleAccountCallbacks(accountToLoad, newBuffer);
150
- continue;
151
- }
152
- if (newSlot <= oldRPCResponse.slot) {
153
- continue;
154
- }
155
- const oldBuffer = oldRPCResponse.buffer;
156
- if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
157
- this.accountData.set(key, {
158
- slot: newSlot,
159
- buffer: newBuffer,
160
- });
161
- this.handleAccountCallbacks(accountToLoad, newBuffer);
162
- }
143
+ const oldBuffer = oldRPCResponse.buffer;
144
+ if (newBuffer && (!oldBuffer || !newBuffer.equals(oldBuffer))) {
145
+ this.bufferAndSlotMap.set(key, {
146
+ slot: newSlot,
147
+ buffer: newBuffer,
148
+ });
149
+ this.handleAccountCallbacks(accountToLoad, newBuffer, newSlot);
163
150
  }
164
- });
151
+ }
165
152
  }
166
- handleAccountCallbacks(accountToLoad, buffer) {
153
+ handleAccountCallbacks(accountToLoad, buffer, slot) {
167
154
  for (const [_, callback] of accountToLoad.callbacks) {
168
- callback(buffer);
155
+ callback(buffer, slot);
169
156
  }
170
157
  }
171
- getAccountData(publicKey) {
172
- const accountData = this.accountData.get(publicKey.toString());
173
- return accountData === null || accountData === void 0 ? void 0 : accountData.buffer;
158
+ getBufferAndSlot(publicKey) {
159
+ return this.bufferAndSlotMap.get(publicKey.toString());
174
160
  }
175
161
  startPolling() {
176
162
  if (this.intervalId) {
@@ -1,66 +1,22 @@
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.bulkPollingUserSubscribe = void 0;
13
4
  /**
14
5
  * @param users
15
6
  * @param accountLoader
16
7
  */
17
- function bulkPollingUserSubscribe(users, accountLoader) {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- if (users.length === 0) {
20
- yield accountLoader.load();
21
- return;
22
- }
23
- // Fetch all the accounts first
24
- const program = users[0].clearingHouse.program;
25
- let userProgramAccounts;
26
- let orderProgramAccounts;
27
- yield Promise.all([
28
- (() => __awaiter(this, void 0, void 0, function* () {
29
- userProgramAccounts = yield program.account.user.all();
30
- }))(),
31
- (() => __awaiter(this, void 0, void 0, function* () {
32
- orderProgramAccounts = yield program.account.userOrders.all();
33
- }))(),
34
- ]);
35
- // Create a map of the authority to keys
36
- const authorityToKeys = new Map();
37
- const userToAuthority = new Map();
38
- for (const userProgramAccount of userProgramAccounts) {
39
- const userAccountPublicKey = userProgramAccount.publicKey;
40
- const userAccount = userProgramAccount.account;
41
- authorityToKeys.set(userAccount.authority.toString(), {
42
- user: userAccountPublicKey,
43
- userPositions: userAccount.positions,
44
- userOrders: undefined,
45
- });
46
- userToAuthority.set(userAccountPublicKey.toString(), userAccount.authority.toString());
47
- }
48
- for (const orderProgramAccount of orderProgramAccounts) {
49
- const userOrderAccountPublicKey = orderProgramAccount.publicKey;
50
- const userOrderAccount = orderProgramAccount.account;
51
- const authority = userToAuthority.get(userOrderAccount.user.toString());
52
- const userPublicKeys = authorityToKeys.get(authority);
53
- userPublicKeys.userOrders = userOrderAccountPublicKey;
54
- }
55
- yield Promise.all(users.map((user) => {
56
- // Pull the keys from the authority map so we can skip fetching them in addToAccountLoader
57
- const userPublicKeys = authorityToKeys.get(user.authority.toString());
58
- return user.accountSubscriber.addToAccountLoader(userPublicKeys);
59
- }));
60
- yield accountLoader.load();
61
- yield Promise.all(users.map((user) => __awaiter(this, void 0, void 0, function* () {
62
- return user.subscribe();
63
- })));
64
- });
8
+ async function bulkPollingUserSubscribe(users, accountLoader) {
9
+ if (users.length === 0) {
10
+ await accountLoader.load();
11
+ return;
12
+ }
13
+ await Promise.all(users.map((user) => {
14
+ // Pull the keys from the authority map so we can skip fetching them in addToAccountLoader
15
+ return user.accountSubscriber.addToAccountLoader();
16
+ }));
17
+ await accountLoader.load();
18
+ await Promise.all(users.map(async (user) => {
19
+ return user.subscribe();
20
+ }));
65
21
  }
66
22
  exports.bulkPollingUserSubscribe = bulkPollingUserSubscribe;
@@ -0,0 +1,4 @@
1
+ import { Connection, PublicKey } from '@solana/web3.js';
2
+ import { UserAccount } from '../types';
3
+ import { Program } from '@project-serum/anchor';
4
+ export declare function fetchUserAccounts(connection: Connection, program: Program, authority: PublicKey, limit?: number): Promise<(UserAccount | undefined)[]>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchUserAccounts = void 0;
4
+ const pda_1 = require("../addresses/pda");
5
+ async function fetchUserAccounts(connection, program, authority, limit = 8) {
6
+ const userAccountPublicKeys = new Array();
7
+ for (let i = 0; i < limit; i++) {
8
+ userAccountPublicKeys.push(await (0, pda_1.getUserAccountPublicKey)(program.programId, authority, i));
9
+ }
10
+ const accountInfos = await connection.getMultipleAccountsInfo(userAccountPublicKeys, 'confirmed');
11
+ return accountInfos.map((accountInfo) => {
12
+ if (!accountInfo) {
13
+ return undefined;
14
+ }
15
+ return program.account.user.coder.accounts.decode('User', accountInfo.data);
16
+ });
17
+ }
18
+ exports.fetchUserAccounts = fetchUserAccounts;
@@ -1,65 +1,61 @@
1
+ /// <reference types="bn.js" />
1
2
  /// <reference types="node" />
2
- import { AccountToPoll, ClearingHouseAccountEvents, ClearingHouseAccountSubscriber, ClearingHouseAccountTypes } from './types';
3
- import { Program } from '@project-serum/anchor';
3
+ import { DataAndSlot, AccountToPoll, ClearingHouseAccountEvents, ClearingHouseAccountSubscriber, OraclesToPoll } from './types';
4
+ import { BN, Program } from '@project-serum/anchor';
4
5
  import StrictEventEmitter from 'strict-event-emitter-types';
5
6
  import { EventEmitter } from 'events';
6
- import { DepositHistoryAccount, ExtendedCurveHistoryAccount, FundingPaymentHistoryAccount, FundingRateHistoryAccount, LiquidationHistoryAccount, MarketsAccount, OrderHistoryAccount, OrderStateAccount, StateAccount, TradeHistoryAccount } from '../types';
7
+ import { BankAccount, MarketAccount, StateAccount, UserAccount } from '../types';
7
8
  import { BulkAccountLoader } from './bulkAccountLoader';
8
- import { ClearingHouseConfigType } from '../factory/clearingHouse';
9
9
  import { PublicKey } from '@solana/web3.js';
10
+ import { OracleInfo, OraclePriceData } from '../oracles/types';
11
+ import { OracleClientCache } from '../oracles/oracleClientCache';
10
12
  export declare class PollingClearingHouseAccountSubscriber implements ClearingHouseAccountSubscriber {
11
13
  isSubscribed: boolean;
12
14
  program: Program;
15
+ marketIndexes: BN[];
16
+ bankIndexes: BN[];
17
+ oracleInfos: OracleInfo[];
18
+ oracleClientCache: OracleClientCache;
13
19
  eventEmitter: StrictEventEmitter<EventEmitter, ClearingHouseAccountEvents>;
14
20
  accountLoader: BulkAccountLoader;
15
21
  accountsToPoll: Map<string, AccountToPoll>;
22
+ oraclesToPoll: Map<string, OraclesToPoll>;
16
23
  errorCallbackId?: string;
17
- state?: StateAccount;
18
- markets?: MarketsAccount;
19
- orderState?: OrderStateAccount;
20
- tradeHistory?: TradeHistoryAccount;
21
- depositHistory?: DepositHistoryAccount;
22
- fundingPaymentHistory?: FundingPaymentHistoryAccount;
23
- fundingRateHistory?: FundingRateHistoryAccount;
24
- liquidationHistory?: LiquidationHistoryAccount;
25
- extendedCurveHistory: ExtendedCurveHistoryAccount;
26
- orderHistory?: OrderHistoryAccount;
27
- optionalExtraSubscriptions: ClearingHouseAccountTypes[];
28
- type: ClearingHouseConfigType;
24
+ state?: DataAndSlot<StateAccount>;
25
+ market: Map<number, DataAndSlot<MarketAccount>>;
26
+ bank: Map<number, DataAndSlot<BankAccount>>;
27
+ oracles: Map<string, DataAndSlot<OraclePriceData>>;
28
+ user?: DataAndSlot<UserAccount>;
29
29
  private isSubscribing;
30
30
  private subscriptionPromise;
31
31
  private subscriptionPromiseResolver;
32
- constructor(program: Program, accountLoader: BulkAccountLoader);
33
- subscribe(optionalSubscriptions?: ClearingHouseAccountTypes[]): Promise<boolean>;
32
+ constructor(program: Program, accountLoader: BulkAccountLoader, marketIndexes: BN[], bankIndexes: BN[], oracleInfos: OracleInfo[]);
33
+ subscribe(): Promise<boolean>;
34
34
  updateAccountsToPoll(): Promise<void>;
35
+ updateMarketAccountsToPoll(): Promise<boolean>;
36
+ addMarketAccountToPoll(marketIndex: BN): Promise<boolean>;
37
+ updateBankAccountsToPoll(): Promise<boolean>;
38
+ addBankAccountToPoll(bankIndex: BN): Promise<boolean>;
39
+ updateOraclesToPoll(): boolean;
40
+ addOracleToPoll(oracleInfo: OracleInfo): boolean;
35
41
  getClearingHouseAccounts(): Promise<ClearingHouseAccounts>;
36
42
  addToAccountLoader(): Promise<void>;
43
+ addAccountToAccountLoader(accountToPoll: AccountToPoll): void;
44
+ addOracleToAccountLoader(oracleToPoll: OraclesToPoll): void;
37
45
  fetch(): Promise<void>;
38
46
  didSubscriptionSucceed(): boolean;
39
47
  unsubscribe(): Promise<void>;
48
+ addBank(bankIndex: BN): Promise<boolean>;
49
+ addMarket(marketIndex: BN): Promise<boolean>;
50
+ addOracle(oracleInfo: OracleInfo): Promise<boolean>;
40
51
  assertIsSubscribed(): void;
41
- assertOptionalIsSubscribed(optionalSubscription: ClearingHouseAccountTypes): void;
42
- getStateAccount(): StateAccount;
43
- getMarketsAccount(): MarketsAccount;
44
- getOrderStateAccount(): OrderStateAccount;
45
- getTradeHistoryAccount(): TradeHistoryAccount;
46
- getDepositHistoryAccount(): DepositHistoryAccount;
47
- getFundingPaymentHistoryAccount(): FundingPaymentHistoryAccount;
48
- getFundingRateHistoryAccount(): FundingRateHistoryAccount;
49
- getCurveHistoryAccount(): ExtendedCurveHistoryAccount;
50
- getLiquidationHistoryAccount(): LiquidationHistoryAccount;
51
- getOrderHistoryAccount(): OrderHistoryAccount;
52
+ getStateAccountAndSlot(): DataAndSlot<StateAccount>;
53
+ getMarketAccountAndSlot(marketIndex: BN): DataAndSlot<MarketAccount> | undefined;
54
+ getMarketAccountsAndSlots(): DataAndSlot<MarketAccount>[];
55
+ getBankAccountAndSlot(bankIndex: BN): DataAndSlot<BankAccount> | undefined;
56
+ getOraclePriceDataAndSlot(oraclePublicKey: PublicKey): DataAndSlot<OraclePriceData> | undefined;
52
57
  }
53
58
  declare type ClearingHouseAccounts = {
54
59
  state: PublicKey;
55
- markets: PublicKey;
56
- orderState: PublicKey;
57
- tradeHistory?: PublicKey;
58
- depositHistory?: PublicKey;
59
- fundingPaymentHistory?: PublicKey;
60
- fundingRateHistory?: PublicKey;
61
- extendedCurveHistory?: PublicKey;
62
- liquidationHistory?: PublicKey;
63
- orderHistory?: PublicKey;
64
60
  };
65
61
  export {};