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

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 (143) hide show
  1. package/lib/accounts/pollingClearingHouseAccountSubscriber.d.ts +1 -0
  2. package/lib/accounts/pollingClearingHouseAccountSubscriber.js +3 -0
  3. package/lib/accounts/types.d.ts +2 -0
  4. package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +1 -0
  5. package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +3 -0
  6. package/lib/admin.d.ts +5 -2
  7. package/lib/admin.js +30 -4
  8. package/lib/clearingHouse.d.ts +3 -0
  9. package/lib/clearingHouse.js +19 -1
  10. package/lib/clearingHouseUser.d.ts +11 -9
  11. package/lib/clearingHouseUser.js +184 -108
  12. package/lib/config.js +1 -1
  13. package/lib/dlob/DLOB.d.ts +73 -0
  14. package/lib/dlob/DLOB.js +557 -0
  15. package/lib/dlob/DLOBNode.d.ts +52 -0
  16. package/lib/dlob/DLOBNode.js +82 -0
  17. package/lib/dlob/NodeList.d.ts +26 -0
  18. package/lib/dlob/NodeList.js +138 -0
  19. package/lib/idl/clearing_house.json +123 -203
  20. package/lib/index.d.ts +5 -0
  21. package/lib/index.js +5 -0
  22. package/lib/math/market.d.ts +3 -2
  23. package/lib/math/market.js +17 -12
  24. package/lib/math/orders.d.ts +3 -3
  25. package/lib/math/orders.js +31 -16
  26. package/lib/math/position.d.ts +3 -3
  27. package/lib/math/position.js +23 -16
  28. package/lib/math/repeg.js +8 -0
  29. package/lib/math/spotBalance.d.ts +3 -0
  30. package/lib/math/spotBalance.js +18 -1
  31. package/lib/math/spotPosition.d.ts +5 -1
  32. package/lib/math/spotPosition.js +16 -1
  33. package/lib/types.d.ts +25 -24
  34. package/lib/types.js +9 -3
  35. package/lib/userMap/userMap.d.ts +25 -0
  36. package/lib/userMap/userMap.js +73 -0
  37. package/lib/userMap/userStatsMap.d.ts +19 -0
  38. package/lib/userMap/userStatsMap.js +68 -0
  39. package/package.json +6 -3
  40. package/src/accounts/pollingClearingHouseAccountSubscriber.ts +4 -0
  41. package/src/accounts/types.ts +1 -0
  42. package/src/accounts/webSocketClearingHouseAccountSubscriber.ts +6 -0
  43. package/src/admin.ts +50 -8
  44. package/src/clearingHouse.ts +30 -1
  45. package/src/clearingHouseUser.ts +366 -167
  46. package/src/config.ts +1 -1
  47. package/src/dlob/DLOB.ts +884 -0
  48. package/src/dlob/DLOBNode.ts +163 -0
  49. package/src/dlob/NodeList.ts +185 -0
  50. package/src/idl/clearing_house.json +123 -203
  51. package/src/index.ts +5 -0
  52. package/src/math/market.ts +22 -13
  53. package/src/math/orders.ts +29 -21
  54. package/src/math/position.ts +36 -22
  55. package/src/math/repeg.ts +9 -0
  56. package/src/math/spotBalance.ts +26 -0
  57. package/src/math/spotPosition.ts +42 -1
  58. package/src/types.ts +26 -24
  59. package/src/userMap/userMap.ts +100 -0
  60. package/src/userMap/userStatsMap.ts +110 -0
  61. package/tests/bn/test.ts +2 -3
  62. package/tests/dlob/helpers.ts +322 -0
  63. package/tests/dlob/test.ts +2865 -0
  64. package/my-script/.env +0 -7
  65. package/my-script/getUserStats.ts +0 -106
  66. package/my-script/multiConnections.ts +0 -119
  67. package/my-script/test-regex.ts +0 -11
  68. package/my-script/utils.ts +0 -52
  69. package/src/accounts/bulkAccountLoader.js +0 -249
  70. package/src/accounts/bulkUserStatsSubscription.js +0 -75
  71. package/src/accounts/bulkUserSubscription.js +0 -75
  72. package/src/accounts/fetch.js +0 -92
  73. package/src/accounts/pollingClearingHouseAccountSubscriber.js +0 -465
  74. package/src/accounts/pollingOracleSubscriber.js +0 -156
  75. package/src/accounts/pollingTokenAccountSubscriber.js +0 -141
  76. package/src/accounts/pollingUserAccountSubscriber.js +0 -208
  77. package/src/accounts/pollingUserStatsAccountSubscriber.js +0 -208
  78. package/src/accounts/types.js +0 -28
  79. package/src/accounts/utils.js +0 -7
  80. package/src/accounts/webSocketAccountSubscriber.js +0 -138
  81. package/src/accounts/webSocketClearingHouseAccountSubscriber.js +0 -433
  82. package/src/accounts/webSocketUserAccountSubscriber.js +0 -113
  83. package/src/accounts/webSocketUserStatsAccountSubsriber.js +0 -113
  84. package/src/addresses/pda.js +0 -186
  85. package/src/admin.js +0 -1284
  86. package/src/assert/assert.js +0 -9
  87. package/src/clearingHouse.js +0 -3433
  88. package/src/clearingHouseConfig.js +0 -2
  89. package/src/clearingHouseUser.js +0 -874
  90. package/src/clearingHouseUserConfig.js +0 -2
  91. package/src/clearingHouseUserStats.js +0 -115
  92. package/src/clearingHouseUserStatsConfig.js +0 -2
  93. package/src/config.js +0 -80
  94. package/src/constants/numericConstants.js +0 -48
  95. package/src/constants/perpMarkets.js +0 -42
  96. package/src/constants/spotMarkets.js +0 -51
  97. package/src/events/eventList.js +0 -120
  98. package/src/events/eventSubscriber.js +0 -202
  99. package/src/events/fetchLogs.js +0 -117
  100. package/src/events/pollingLogProvider.js +0 -113
  101. package/src/events/sort.js +0 -41
  102. package/src/events/txEventCache.js +0 -74
  103. package/src/events/types.js +0 -25
  104. package/src/events/webSocketLogProvider.js +0 -76
  105. package/src/factory/bigNum.js +0 -393
  106. package/src/factory/oracleClient.js +0 -20
  107. package/src/index.js +0 -75
  108. package/src/math/amm.js +0 -422
  109. package/src/math/auction.js +0 -42
  110. package/src/math/conversion.js +0 -12
  111. package/src/math/funding.js +0 -296
  112. package/src/math/insurance.js +0 -27
  113. package/src/math/margin.js +0 -77
  114. package/src/math/market.js +0 -105
  115. package/src/math/oracles.js +0 -56
  116. package/src/math/orders.js +0 -153
  117. package/src/math/position.js +0 -172
  118. package/src/math/repeg.js +0 -128
  119. package/src/math/spotBalance.js +0 -176
  120. package/src/math/spotMarket.js +0 -8
  121. package/src/math/spotPosition.js +0 -8
  122. package/src/math/trade.js +0 -260
  123. package/src/math/utils.js +0 -27
  124. package/src/oracles/oracleClientCache.js +0 -20
  125. package/src/oracles/pythClient.js +0 -81
  126. package/src/oracles/quoteAssetOracleClient.js +0 -63
  127. package/src/oracles/switchboardClient.js +0 -101
  128. package/src/oracles/types.js +0 -2
  129. package/src/orderParams.js +0 -28
  130. package/src/serum/serumSubscriber.js +0 -102
  131. package/src/serum/types.js +0 -2
  132. package/src/slot/SlotSubscriber.js +0 -86
  133. package/src/token/index.js +0 -38
  134. package/src/tokenFaucet.js +0 -323
  135. package/src/tx/retryTxSender.js +0 -280
  136. package/src/tx/types.js +0 -2
  137. package/src/tx/utils.js +0 -18
  138. package/src/types.js +0 -216
  139. package/src/userName.js +0 -20
  140. package/src/util/computeUnits.js +0 -62
  141. package/src/util/promiseTimeout.js +0 -14
  142. package/src/util/tps.js +0 -61
  143. package/src/wallet.js +0 -72
@@ -0,0 +1,163 @@
1
+ import {
2
+ isOneOfVariant,
3
+ AMM_RESERVE_PRECISION,
4
+ BN,
5
+ convertToNumber,
6
+ getLimitPrice,
7
+ isVariant,
8
+ SpotMarketAccount,
9
+ PerpMarketAccount,
10
+ MARK_PRICE_PRECISION,
11
+ OraclePriceData,
12
+ Order,
13
+ ZERO,
14
+ } from '..';
15
+ import { PublicKey } from '@solana/web3.js';
16
+ import { getOrderSignature } from './NodeList';
17
+
18
+ export interface DLOBNode {
19
+ getPrice(oraclePriceData: OraclePriceData, slot: number): BN;
20
+ isVammNode(): boolean;
21
+ order: Order | undefined;
22
+ haveFilled: boolean;
23
+ userAccount: PublicKey | undefined;
24
+ market: SpotMarketAccount | PerpMarketAccount;
25
+ }
26
+
27
+ export abstract class OrderNode implements DLOBNode {
28
+ order: Order;
29
+ market: SpotMarketAccount | PerpMarketAccount;
30
+ userAccount: PublicKey;
31
+ sortValue: BN;
32
+ haveFilled = false;
33
+ haveTrigger = false;
34
+
35
+ constructor(
36
+ order: Order,
37
+ market: SpotMarketAccount | PerpMarketAccount,
38
+ userAccount: PublicKey
39
+ ) {
40
+ this.order = order;
41
+ this.market = market;
42
+ this.userAccount = userAccount;
43
+ this.sortValue = this.getSortValue(order);
44
+ }
45
+
46
+ abstract getSortValue(order: Order): BN;
47
+
48
+ public getLabel(): string {
49
+ let msg = `Order ${getOrderSignature(
50
+ this.order.orderId,
51
+ this.userAccount
52
+ )}`;
53
+ msg += ` ${isVariant(this.order.direction, 'long') ? 'LONG' : 'SHORT'} `;
54
+ msg += `${convertToNumber(
55
+ this.order.baseAssetAmount,
56
+ AMM_RESERVE_PRECISION
57
+ ).toFixed(3)}`;
58
+ if (this.order.price.gt(ZERO)) {
59
+ msg += ` @ ${convertToNumber(
60
+ this.order.price,
61
+ MARK_PRICE_PRECISION
62
+ ).toFixed(3)}`;
63
+ }
64
+ if (this.order.triggerPrice.gt(ZERO)) {
65
+ msg += ` ${
66
+ isVariant(this.order.triggerCondition, 'below') ? 'BELOW' : 'ABOVE'
67
+ }`;
68
+ msg += ` ${convertToNumber(
69
+ this.order.triggerPrice,
70
+ MARK_PRICE_PRECISION
71
+ ).toFixed(3)}`;
72
+ }
73
+ return msg;
74
+ }
75
+
76
+ getPrice(oraclePriceData: OraclePriceData, slot: number): BN {
77
+ if (isOneOfVariant(this.order.marketType, ['spot'])) {
78
+ return getLimitPrice(this.order, oraclePriceData, slot);
79
+ } else if (isOneOfVariant(this.order.marketType, ['perp'])) {
80
+ return getLimitPrice(
81
+ this.order,
82
+ oraclePriceData,
83
+ slot,
84
+ this.market as PerpMarketAccount
85
+ );
86
+ } else {
87
+ console.error(`Unknown market type: ${this.order.marketType}`);
88
+ }
89
+ }
90
+
91
+ isVammNode(): boolean {
92
+ return false;
93
+ }
94
+ }
95
+
96
+ export class LimitOrderNode extends OrderNode {
97
+ next?: LimitOrderNode;
98
+ previous?: LimitOrderNode;
99
+
100
+ getSortValue(order: Order): BN {
101
+ return order.price;
102
+ }
103
+ }
104
+
105
+ export class FloatingLimitOrderNode extends OrderNode {
106
+ next?: FloatingLimitOrderNode;
107
+ previous?: FloatingLimitOrderNode;
108
+
109
+ getSortValue(order: Order): BN {
110
+ return order.oraclePriceOffset;
111
+ }
112
+ }
113
+
114
+ export class MarketOrderNode extends OrderNode {
115
+ next?: MarketOrderNode;
116
+ previous?: MarketOrderNode;
117
+
118
+ getSortValue(order: Order): BN {
119
+ return order.slot;
120
+ }
121
+ }
122
+
123
+ export class TriggerOrderNode extends OrderNode {
124
+ next?: TriggerOrderNode;
125
+ previous?: TriggerOrderNode;
126
+
127
+ getSortValue(order: Order): BN {
128
+ return order.triggerPrice;
129
+ }
130
+ }
131
+
132
+ export type DLOBNodeMap = {
133
+ limit: LimitOrderNode;
134
+ floatingLimit: FloatingLimitOrderNode;
135
+ market: MarketOrderNode;
136
+ trigger: TriggerOrderNode;
137
+ };
138
+
139
+ export type DLOBNodeType =
140
+ | 'limit'
141
+ | 'floatingLimit'
142
+ | 'market'
143
+ | ('trigger' & keyof DLOBNodeMap);
144
+
145
+ export function createNode<T extends DLOBNodeType>(
146
+ nodeType: T,
147
+ order: Order,
148
+ market: SpotMarketAccount | PerpMarketAccount,
149
+ userAccount: PublicKey
150
+ ): DLOBNodeMap[T] {
151
+ switch (nodeType) {
152
+ case 'floatingLimit':
153
+ return new FloatingLimitOrderNode(order, market, userAccount);
154
+ case 'limit':
155
+ return new LimitOrderNode(order, market, userAccount);
156
+ case 'market':
157
+ return new MarketOrderNode(order, market, userAccount);
158
+ case 'trigger':
159
+ return new TriggerOrderNode(order, market, userAccount);
160
+ default:
161
+ throw Error(`Unknown DLOBNode type ${nodeType}`);
162
+ }
163
+ }
@@ -0,0 +1,185 @@
1
+ import {
2
+ BN,
3
+ isVariant,
4
+ MarketTypeStr,
5
+ Order,
6
+ PerpMarketAccount,
7
+ SpotMarketAccount,
8
+ } from '..';
9
+ import { PublicKey } from '@solana/web3.js';
10
+ import { createNode, DLOBNode, DLOBNodeMap } from './DLOBNode';
11
+
12
+ export type SortDirection = 'asc' | 'desc';
13
+
14
+ export function getOrderSignature(orderId: BN, userAccount: PublicKey): string {
15
+ return `${userAccount.toString()}-${orderId.toString()}`;
16
+ }
17
+
18
+ export interface DLOBNodeGenerator {
19
+ getGenerator(): Generator<DLOBNode>;
20
+ }
21
+
22
+ export class NodeList<NodeType extends keyof DLOBNodeMap>
23
+ implements DLOBNodeGenerator
24
+ {
25
+ head?: DLOBNodeMap[NodeType];
26
+ length = 0;
27
+ nodeMap = new Map<string, DLOBNodeMap[NodeType]>();
28
+
29
+ constructor(
30
+ private nodeType: NodeType,
31
+ private sortDirection: SortDirection
32
+ ) {}
33
+
34
+ public insert(
35
+ order: Order,
36
+ marketType: MarketTypeStr,
37
+ market: PerpMarketAccount | SpotMarketAccount,
38
+ userAccount: PublicKey
39
+ ): void {
40
+ if (isVariant(order.status, 'init')) {
41
+ return;
42
+ }
43
+
44
+ if (marketType === 'spot') {
45
+ market = market as SpotMarketAccount;
46
+ } else if (marketType === 'perp') {
47
+ market = market as PerpMarketAccount;
48
+ }
49
+
50
+ const newNode = createNode(this.nodeType, order, market, userAccount);
51
+
52
+ const orderId = getOrderSignature(order.orderId, userAccount);
53
+ if (this.nodeMap.has(orderId)) {
54
+ return;
55
+ }
56
+ this.nodeMap.set(orderId, newNode);
57
+
58
+ this.length += 1;
59
+
60
+ if (this.head === undefined) {
61
+ this.head = newNode;
62
+ return;
63
+ }
64
+
65
+ if (this.prependNode(this.head, newNode)) {
66
+ this.head.previous = newNode;
67
+ newNode.next = this.head;
68
+ this.head = newNode;
69
+ return;
70
+ }
71
+
72
+ let currentNode = this.head;
73
+ while (
74
+ currentNode.next !== undefined &&
75
+ !this.prependNode(currentNode.next, newNode)
76
+ ) {
77
+ currentNode = currentNode.next;
78
+ }
79
+
80
+ newNode.next = currentNode.next;
81
+ if (currentNode.next !== undefined) {
82
+ newNode.next.previous = newNode;
83
+ }
84
+ currentNode.next = newNode;
85
+ newNode.previous = currentNode;
86
+ }
87
+
88
+ prependNode(
89
+ currentNode: DLOBNodeMap[NodeType],
90
+ newNode: DLOBNodeMap[NodeType]
91
+ ): boolean {
92
+ const currentOrder = currentNode.order;
93
+ const newOrder = newNode.order;
94
+
95
+ const currentOrderSortPrice = currentNode.sortValue;
96
+ const newOrderSortPrice = newNode.sortValue;
97
+
98
+ if (newOrderSortPrice.eq(currentOrderSortPrice)) {
99
+ return newOrder.ts.lt(currentOrder.ts);
100
+ }
101
+
102
+ if (this.sortDirection === 'asc') {
103
+ return newOrderSortPrice.lt(currentOrderSortPrice);
104
+ } else {
105
+ return newOrderSortPrice.gt(currentOrderSortPrice);
106
+ }
107
+ }
108
+
109
+ public update(order: Order, userAccount: PublicKey): void {
110
+ const orderId = getOrderSignature(order.orderId, userAccount);
111
+ if (this.nodeMap.has(orderId)) {
112
+ const node = this.nodeMap.get(orderId);
113
+ Object.assign(node.order, order);
114
+ node.haveFilled = false;
115
+ }
116
+ }
117
+
118
+ public remove(order: Order, userAccount: PublicKey): void {
119
+ const orderId = getOrderSignature(order.orderId, userAccount);
120
+ if (this.nodeMap.has(orderId)) {
121
+ const node = this.nodeMap.get(orderId);
122
+ if (node.next) {
123
+ node.next.previous = node.previous;
124
+ }
125
+ if (node.previous) {
126
+ node.previous.next = node.next;
127
+ }
128
+
129
+ if (this.head && node.order.orderId.eq(this.head.order.orderId)) {
130
+ this.head = node.next;
131
+ }
132
+
133
+ node.previous = undefined;
134
+ node.next = undefined;
135
+
136
+ this.nodeMap.delete(orderId);
137
+
138
+ this.length--;
139
+ }
140
+ }
141
+
142
+ *getGenerator(): Generator<DLOBNode> {
143
+ let node = this.head;
144
+ while (node !== undefined) {
145
+ yield node;
146
+ node = node.next;
147
+ }
148
+ }
149
+
150
+ public has(order: Order, userAccount: PublicKey): boolean {
151
+ return this.nodeMap.has(getOrderSignature(order.orderId, userAccount));
152
+ }
153
+
154
+ public print(): void {
155
+ let currentNode = this.head;
156
+ while (currentNode !== undefined) {
157
+ console.log(currentNode.getLabel());
158
+ currentNode = currentNode.next;
159
+ }
160
+ }
161
+
162
+ public printTop(): void {
163
+ if (this.head) {
164
+ console.log(this.sortDirection.toUpperCase(), this.head.getLabel());
165
+ } else {
166
+ console.log('---');
167
+ }
168
+ }
169
+ }
170
+
171
+ export function* getVammNodeGenerator(
172
+ price: BN | undefined
173
+ ): Generator<DLOBNode> {
174
+ if (!price) {
175
+ return;
176
+ }
177
+ yield {
178
+ getPrice: () => price,
179
+ isVammNode: () => true,
180
+ order: undefined,
181
+ market: undefined,
182
+ userAccount: undefined,
183
+ haveFilled: false,
184
+ };
185
+ }