@drift-labs/sdk 2.0.19 → 2.1.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.
@@ -1,8 +1,8 @@
1
1
  /// <reference types="bn.js" />
2
2
  import { NodeList } from './NodeList';
3
- import { MarketType, BN, DriftClient, Order, SpotMarketAccount, PerpMarketAccount, OraclePriceData, SlotSubscriber, MarketTypeStr, StateAccount, UserMap } from '..';
3
+ import { MarketType, BN, DriftClient, Order, SpotMarketAccount, PerpMarketAccount, OraclePriceData, SlotSubscriber, MarketTypeStr, StateAccount, UserMap, OrderRecord, OrderActionRecord } from '..';
4
4
  import { PublicKey } from '@solana/web3.js';
5
- import { DLOBNode, TriggerOrderNode } from '..';
5
+ import { DLOBNode, DLOBNodeType, TriggerOrderNode } from '..';
6
6
  import { DLOBOrders } from './DLOBOrders';
7
7
  export declare type MarketNodeLists = {
8
8
  limit: {
@@ -43,10 +43,15 @@ export declare class DLOB {
43
43
  */
44
44
  initFromUserMap(userMap: UserMap): Promise<boolean>;
45
45
  initFromOrders(dlobOrders: DLOBOrders): boolean;
46
+ handleOrderRecord(record: OrderRecord): void;
47
+ handleOrderActionRecord(record: OrderActionRecord): void;
46
48
  insertOrder(order: Order, userAccount: PublicKey, onInsert?: OrderBookCallback): void;
47
49
  addOrderList(marketType: MarketTypeStr, marketIndex: number): void;
50
+ updateOrder(order: Order, userAccount: PublicKey, cumulativeBaseAssetAmountFilled: BN, onUpdate?: OrderBookCallback): void;
48
51
  trigger(order: Order, userAccount: PublicKey, onTrigger?: OrderBookCallback): void;
52
+ delete(order: Order, userAccount: PublicKey, onDelete?: OrderBookCallback): void;
49
53
  getListForOrder(order: Order): NodeList<any> | undefined;
54
+ getOrder(orderId: number, userAccount: PublicKey): Order | undefined;
50
55
  findNodesToFill(marketIndex: number, fallbackBid: BN | undefined, fallbackAsk: BN | undefined, slot: number, ts: number, marketType: MarketType, oraclePriceData: OraclePriceData, stateAccount: StateAccount, marketAccount: PerpMarketAccount | SpotMarketAccount): NodeToFill[];
51
56
  findLimitOrderNodesToFill(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, isAmmPaused: boolean, fallbackAsk: BN | undefined, fallbackBid: BN | undefined): NodeToFill[];
52
57
  findMarketNodesToFill(marketIndex: number, slot: number, marketType: MarketType, oraclePriceData: OraclePriceData, isAmmPaused: boolean, fallbackAsk: BN | undefined, fallbackBid?: BN | undefined): NodeToFill[];
@@ -71,6 +76,6 @@ export declare class DLOB {
71
76
  findNodesToTrigger(marketIndex: number, slot: number, oraclePrice: BN, marketType: MarketType, stateAccount: StateAccount): NodeToTrigger[];
72
77
  printTopOfOrderLists(sdkConfig: any, driftClient: DriftClient, slotSubscriber: SlotSubscriber, marketIndex: number, marketType: MarketType): void;
73
78
  getDLOBOrders(): DLOBOrders;
74
- getOrdersForMarket(marketIndex: number, marketType: MarketType, nodeLists: MarketNodeLists): DLOBOrders;
79
+ getNodeLists(): Generator<NodeList<DLOBNodeType>>;
75
80
  }
76
81
  export {};
package/lib/dlob/DLOB.js CHANGED
@@ -63,6 +63,56 @@ class DLOB {
63
63
  this.initialized = true;
64
64
  return true;
65
65
  }
66
+ handleOrderRecord(record) {
67
+ this.insertOrder(record.order, record.user);
68
+ }
69
+ handleOrderActionRecord(record) {
70
+ if ((0, __1.isOneOfVariant)(record.action, ['place', 'expire'])) {
71
+ return;
72
+ }
73
+ if ((0, __1.isVariant)(record.action, 'trigger')) {
74
+ if (record.taker !== null) {
75
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
76
+ if (takerOrder) {
77
+ this.trigger(takerOrder, record.taker);
78
+ }
79
+ }
80
+ if (record.maker !== null) {
81
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
82
+ if (makerOrder) {
83
+ this.trigger(makerOrder, record.maker);
84
+ }
85
+ }
86
+ }
87
+ else if ((0, __1.isVariant)(record.action, 'fill')) {
88
+ if (record.taker !== null) {
89
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
90
+ if (takerOrder) {
91
+ this.updateOrder(takerOrder, record.taker, record.takerOrderCumulativeBaseAssetAmountFilled);
92
+ }
93
+ }
94
+ if (record.maker !== null) {
95
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
96
+ if (makerOrder) {
97
+ this.updateOrder(makerOrder, record.maker, record.makerOrderCumulativeBaseAssetAmountFilled);
98
+ }
99
+ }
100
+ }
101
+ else if ((0, __1.isVariant)(record.action, 'cancel')) {
102
+ if (record.taker !== null) {
103
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
104
+ if (takerOrder) {
105
+ this.delete(takerOrder, record.taker);
106
+ }
107
+ }
108
+ if (record.maker !== null) {
109
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
110
+ if (makerOrder) {
111
+ this.delete(makerOrder, record.maker);
112
+ }
113
+ }
114
+ }
115
+ }
66
116
  insertOrder(order, userAccount, onInsert) {
67
117
  var _a;
68
118
  if ((0, __1.isVariant)(order.status, 'init')) {
@@ -102,11 +152,29 @@ class DLOB {
102
152
  },
103
153
  });
104
154
  }
155
+ updateOrder(order, userAccount, cumulativeBaseAssetAmountFilled, onUpdate) {
156
+ var _a;
157
+ if (order.baseAssetAmount.eq(cumulativeBaseAssetAmountFilled)) {
158
+ this.delete(order, userAccount);
159
+ return;
160
+ }
161
+ if (order.baseAssetAmountFilled.eq(cumulativeBaseAssetAmountFilled)) {
162
+ return;
163
+ }
164
+ order.baseAssetAmountFilled = cumulativeBaseAssetAmountFilled;
165
+ (_a = this.getListForOrder(order)) === null || _a === void 0 ? void 0 : _a.update(order, userAccount);
166
+ if (onUpdate) {
167
+ onUpdate();
168
+ }
169
+ }
105
170
  trigger(order, userAccount, onTrigger) {
106
171
  var _a;
107
172
  if ((0, __1.isVariant)(order.status, 'init')) {
108
173
  return;
109
174
  }
175
+ if ((0, __1.isTriggered)(order)) {
176
+ return;
177
+ }
110
178
  const marketType = (0, __1.getVariant)(order.marketType);
111
179
  const triggerList = this.orderLists.get(marketType).get(order.marketIndex)
112
180
  .trigger[(0, __1.isVariant)(order.triggerCondition, 'above') ? 'above' : 'below'];
@@ -116,6 +184,16 @@ class DLOB {
116
184
  onTrigger();
117
185
  }
118
186
  }
187
+ delete(order, userAccount, onDelete) {
188
+ var _a;
189
+ if ((0, __1.isVariant)(order.status, 'init')) {
190
+ return;
191
+ }
192
+ (_a = this.getListForOrder(order)) === null || _a === void 0 ? void 0 : _a.remove(order, userAccount);
193
+ if (onDelete) {
194
+ onDelete();
195
+ }
196
+ }
119
197
  getListForOrder(order) {
120
198
  const isInactiveTriggerOrder = (0, __1.mustBeTriggered)(order) && !(0, __1.isTriggered)(order);
121
199
  let type;
@@ -144,6 +222,15 @@ class DLOB {
144
222
  }
145
223
  return this.orderLists.get(marketType).get(order.marketIndex)[type][subType];
146
224
  }
225
+ getOrder(orderId, userAccount) {
226
+ for (const nodeList of this.getNodeLists()) {
227
+ const node = nodeList.get(orderId, userAccount);
228
+ if (node) {
229
+ return node.order;
230
+ }
231
+ }
232
+ return undefined;
233
+ }
147
234
  findNodesToFill(marketIndex, fallbackBid, fallbackAsk, slot, ts, marketType, oraclePriceData, stateAccount, marketAccount) {
148
235
  if ((0, exchangeStatus_1.fillPaused)(stateAccount, marketAccount)) {
149
236
  return [];
@@ -288,6 +375,9 @@ class DLOB {
288
375
  const nodesToFill = new Array();
289
376
  const marketTypeStr = (0, __1.getVariant)(marketType);
290
377
  const nodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
378
+ if (!nodeLists) {
379
+ return nodesToFill;
380
+ }
291
381
  // All bids/asks that can expire
292
382
  const bidGenerators = [
293
383
  nodeLists.limit.bid.getGenerator(),
@@ -641,66 +731,38 @@ class DLOB {
641
731
  }
642
732
  }
643
733
  getDLOBOrders() {
644
- let dlobOrders = [];
645
- for (const [marketIndex, nodeLists] of this.orderLists.get('perp')) {
646
- dlobOrders = dlobOrders.concat(this.getOrdersForMarket(marketIndex, __1.MarketType.PERP, nodeLists));
647
- }
648
- for (const [marketIndex, nodeLists] of this.orderLists.get('spot')) {
649
- dlobOrders = dlobOrders.concat(this.getOrdersForMarket(marketIndex, __1.MarketType.SPOT, nodeLists));
734
+ const dlobOrders = [];
735
+ for (const nodeList of this.getNodeLists()) {
736
+ for (const node of nodeList.getGenerator()) {
737
+ dlobOrders.push({
738
+ user: node.userAccount,
739
+ order: node.order,
740
+ });
741
+ }
650
742
  }
651
743
  return dlobOrders;
652
744
  }
653
- getOrdersForMarket(marketIndex, marketType, nodeLists) {
654
- const orders = [];
655
- for (const node of nodeLists.limit.bid.getGenerator()) {
656
- orders.push({
657
- user: node.userAccount,
658
- order: node.order,
659
- });
660
- }
661
- for (const node of nodeLists.limit.ask.getGenerator()) {
662
- orders.push({
663
- user: node.userAccount,
664
- order: node.order,
665
- });
666
- }
667
- for (const node of nodeLists.market.bid.getGenerator()) {
668
- orders.push({
669
- user: node.userAccount,
670
- order: node.order,
671
- });
672
- }
673
- for (const node of nodeLists.market.ask.getGenerator()) {
674
- orders.push({
675
- user: node.userAccount,
676
- order: node.order,
677
- });
678
- }
679
- for (const node of nodeLists.floatingLimit.bid.getGenerator()) {
680
- orders.push({
681
- user: node.userAccount,
682
- order: node.order,
683
- });
684
- }
685
- for (const node of nodeLists.floatingLimit.ask.getGenerator()) {
686
- orders.push({
687
- user: node.userAccount,
688
- order: node.order,
689
- });
690
- }
691
- for (const node of nodeLists.trigger.below.getGenerator()) {
692
- orders.push({
693
- user: node.userAccount,
694
- order: node.order,
695
- });
696
- }
697
- for (const node of nodeLists.trigger.above.getGenerator()) {
698
- orders.push({
699
- user: node.userAccount,
700
- order: node.order,
701
- });
745
+ *getNodeLists() {
746
+ for (const [_, nodeLists] of this.orderLists.get('perp')) {
747
+ yield nodeLists.limit.bid;
748
+ yield nodeLists.limit.ask;
749
+ yield nodeLists.market.bid;
750
+ yield nodeLists.market.ask;
751
+ yield nodeLists.floatingLimit.bid;
752
+ yield nodeLists.floatingLimit.ask;
753
+ yield nodeLists.trigger.above;
754
+ yield nodeLists.trigger.below;
755
+ }
756
+ for (const [_, nodeLists] of this.orderLists.get('spot')) {
757
+ yield nodeLists.limit.bid;
758
+ yield nodeLists.limit.ask;
759
+ yield nodeLists.market.bid;
760
+ yield nodeLists.market.ask;
761
+ yield nodeLists.floatingLimit.bid;
762
+ yield nodeLists.floatingLimit.ask;
763
+ yield nodeLists.trigger.above;
764
+ yield nodeLists.trigger.below;
702
765
  }
703
- return orders;
704
766
  }
705
767
  }
706
768
  exports.DLOB = DLOB;
@@ -21,6 +21,7 @@ export declare class NodeList<NodeType extends keyof DLOBNodeMap> implements DLO
21
21
  remove(order: Order, userAccount: PublicKey): void;
22
22
  getGenerator(): Generator<DLOBNode>;
23
23
  has(order: Order, userAccount: PublicKey): boolean;
24
+ get(orderId: number, userAccount: PublicKey): DLOBNodeMap[NodeType] | undefined;
24
25
  print(): void;
25
26
  printTop(): void;
26
27
  }
@@ -104,6 +104,9 @@ class NodeList {
104
104
  has(order, userAccount) {
105
105
  return this.nodeMap.has(getOrderSignature(order.orderId, userAccount));
106
106
  }
107
+ get(orderId, userAccount) {
108
+ return this.nodeMap.get(getOrderSignature(orderId, userAccount));
109
+ }
107
110
  print() {
108
111
  let currentNode = this.head;
109
112
  while (currentNode !== undefined) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.0.19",
3
+ "version": "2.1.0",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
package/src/dlob/DLOB.ts CHANGED
@@ -24,6 +24,8 @@ import {
24
24
  isTriggered,
25
25
  getLimitPrice,
26
26
  UserMap,
27
+ OrderRecord,
28
+ OrderActionRecord,
27
29
  } from '..';
28
30
  import { PublicKey } from '@solana/web3.js';
29
31
  import { DLOBNode, DLOBNodeType, TriggerOrderNode } from '..';
@@ -131,6 +133,68 @@ export class DLOB {
131
133
  return true;
132
134
  }
133
135
 
136
+ public handleOrderRecord(record: OrderRecord): void {
137
+ this.insertOrder(record.order, record.user);
138
+ }
139
+
140
+ public handleOrderActionRecord(record: OrderActionRecord): void {
141
+ if (isOneOfVariant(record.action, ['place', 'expire'])) {
142
+ return;
143
+ }
144
+
145
+ if (isVariant(record.action, 'trigger')) {
146
+ if (record.taker !== null) {
147
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
148
+ if (takerOrder) {
149
+ this.trigger(takerOrder, record.taker);
150
+ }
151
+ }
152
+
153
+ if (record.maker !== null) {
154
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
155
+ if (makerOrder) {
156
+ this.trigger(makerOrder, record.maker);
157
+ }
158
+ }
159
+ } else if (isVariant(record.action, 'fill')) {
160
+ if (record.taker !== null) {
161
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
162
+ if (takerOrder) {
163
+ this.updateOrder(
164
+ takerOrder,
165
+ record.taker,
166
+ record.takerOrderCumulativeBaseAssetAmountFilled
167
+ );
168
+ }
169
+ }
170
+
171
+ if (record.maker !== null) {
172
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
173
+ if (makerOrder) {
174
+ this.updateOrder(
175
+ makerOrder,
176
+ record.maker,
177
+ record.makerOrderCumulativeBaseAssetAmountFilled
178
+ );
179
+ }
180
+ }
181
+ } else if (isVariant(record.action, 'cancel')) {
182
+ if (record.taker !== null) {
183
+ const takerOrder = this.getOrder(record.takerOrderId, record.taker);
184
+ if (takerOrder) {
185
+ this.delete(takerOrder, record.taker);
186
+ }
187
+ }
188
+
189
+ if (record.maker !== null) {
190
+ const makerOrder = this.getOrder(record.makerOrderId, record.maker);
191
+ if (makerOrder) {
192
+ this.delete(makerOrder, record.maker);
193
+ }
194
+ }
195
+ }
196
+ }
197
+
134
198
  public insertOrder(
135
199
  order: Order,
136
200
  userAccount: PublicKey,
@@ -179,6 +243,29 @@ export class DLOB {
179
243
  });
180
244
  }
181
245
 
246
+ public updateOrder(
247
+ order: Order,
248
+ userAccount: PublicKey,
249
+ cumulativeBaseAssetAmountFilled: BN,
250
+ onUpdate?: OrderBookCallback
251
+ ): void {
252
+ if (order.baseAssetAmount.eq(cumulativeBaseAssetAmountFilled)) {
253
+ this.delete(order, userAccount);
254
+ return;
255
+ }
256
+
257
+ if (order.baseAssetAmountFilled.eq(cumulativeBaseAssetAmountFilled)) {
258
+ return;
259
+ }
260
+
261
+ order.baseAssetAmountFilled = cumulativeBaseAssetAmountFilled;
262
+ this.getListForOrder(order)?.update(order, userAccount);
263
+
264
+ if (onUpdate) {
265
+ onUpdate();
266
+ }
267
+ }
268
+
182
269
  public trigger(
183
270
  order: Order,
184
271
  userAccount: PublicKey,
@@ -188,6 +275,10 @@ export class DLOB {
188
275
  return;
189
276
  }
190
277
 
278
+ if (isTriggered(order)) {
279
+ return;
280
+ }
281
+
191
282
  const marketType = getVariant(order.marketType) as MarketTypeStr;
192
283
 
193
284
  const triggerList = this.orderLists.get(marketType).get(order.marketIndex)
@@ -200,6 +291,21 @@ export class DLOB {
200
291
  }
201
292
  }
202
293
 
294
+ public delete(
295
+ order: Order,
296
+ userAccount: PublicKey,
297
+ onDelete?: OrderBookCallback
298
+ ): void {
299
+ if (isVariant(order.status, 'init')) {
300
+ return;
301
+ }
302
+
303
+ this.getListForOrder(order)?.remove(order, userAccount);
304
+ if (onDelete) {
305
+ onDelete();
306
+ }
307
+ }
308
+
203
309
  public getListForOrder(order: Order): NodeList<any> | undefined {
204
310
  const isInactiveTriggerOrder =
205
311
  mustBeTriggered(order) && !isTriggered(order);
@@ -233,6 +339,17 @@ export class DLOB {
233
339
  ];
234
340
  }
235
341
 
342
+ public getOrder(orderId: number, userAccount: PublicKey): Order | undefined {
343
+ for (const nodeList of this.getNodeLists()) {
344
+ const node = nodeList.get(orderId, userAccount);
345
+ if (node) {
346
+ return node.order;
347
+ }
348
+ }
349
+
350
+ return undefined;
351
+ }
352
+
236
353
  public findNodesToFill(
237
354
  marketIndex: number,
238
355
  fallbackBid: BN | undefined,
@@ -577,6 +694,10 @@ export class DLOB {
577
694
  const marketTypeStr = getVariant(marketType) as MarketTypeStr;
578
695
  const nodeLists = this.orderLists.get(marketTypeStr).get(marketIndex);
579
696
 
697
+ if (!nodeLists) {
698
+ return nodesToFill;
699
+ }
700
+
580
701
  // All bids/asks that can expire
581
702
  const bidGenerators = [
582
703
  nodeLists.limit.bid.getGenerator(),
@@ -1160,86 +1281,41 @@ export class DLOB {
1160
1281
  }
1161
1282
 
1162
1283
  public getDLOBOrders(): DLOBOrders {
1163
- let dlobOrders: DLOBOrders = [];
1284
+ const dlobOrders: DLOBOrders = [];
1164
1285
 
1165
- for (const [marketIndex, nodeLists] of this.orderLists.get('perp')) {
1166
- dlobOrders = dlobOrders.concat(
1167
- this.getOrdersForMarket(marketIndex, MarketType.PERP, nodeLists)
1168
- );
1169
- }
1170
-
1171
- for (const [marketIndex, nodeLists] of this.orderLists.get('spot')) {
1172
- dlobOrders = dlobOrders.concat(
1173
- this.getOrdersForMarket(marketIndex, MarketType.SPOT, nodeLists)
1174
- );
1286
+ for (const nodeList of this.getNodeLists()) {
1287
+ for (const node of nodeList.getGenerator()) {
1288
+ dlobOrders.push({
1289
+ user: node.userAccount,
1290
+ order: node.order,
1291
+ });
1292
+ }
1175
1293
  }
1176
1294
 
1177
1295
  return dlobOrders;
1178
1296
  }
1179
1297
 
1180
- getOrdersForMarket(
1181
- marketIndex: number,
1182
- marketType: MarketType,
1183
- nodeLists: MarketNodeLists
1184
- ): DLOBOrders {
1185
- const orders: { user: PublicKey; order: Order }[] = [];
1186
-
1187
- for (const node of nodeLists.limit.bid.getGenerator()) {
1188
- orders.push({
1189
- user: node.userAccount,
1190
- order: node.order,
1191
- });
1192
- }
1193
-
1194
- for (const node of nodeLists.limit.ask.getGenerator()) {
1195
- orders.push({
1196
- user: node.userAccount,
1197
- order: node.order,
1198
- });
1199
- }
1200
-
1201
- for (const node of nodeLists.market.bid.getGenerator()) {
1202
- orders.push({
1203
- user: node.userAccount,
1204
- order: node.order,
1205
- });
1298
+ *getNodeLists(): Generator<NodeList<DLOBNodeType>> {
1299
+ for (const [_, nodeLists] of this.orderLists.get('perp')) {
1300
+ yield nodeLists.limit.bid;
1301
+ yield nodeLists.limit.ask;
1302
+ yield nodeLists.market.bid;
1303
+ yield nodeLists.market.ask;
1304
+ yield nodeLists.floatingLimit.bid;
1305
+ yield nodeLists.floatingLimit.ask;
1306
+ yield nodeLists.trigger.above;
1307
+ yield nodeLists.trigger.below;
1206
1308
  }
1207
1309
 
1208
- for (const node of nodeLists.market.ask.getGenerator()) {
1209
- orders.push({
1210
- user: node.userAccount,
1211
- order: node.order,
1212
- });
1310
+ for (const [_, nodeLists] of this.orderLists.get('spot')) {
1311
+ yield nodeLists.limit.bid;
1312
+ yield nodeLists.limit.ask;
1313
+ yield nodeLists.market.bid;
1314
+ yield nodeLists.market.ask;
1315
+ yield nodeLists.floatingLimit.bid;
1316
+ yield nodeLists.floatingLimit.ask;
1317
+ yield nodeLists.trigger.above;
1318
+ yield nodeLists.trigger.below;
1213
1319
  }
1214
-
1215
- for (const node of nodeLists.floatingLimit.bid.getGenerator()) {
1216
- orders.push({
1217
- user: node.userAccount,
1218
- order: node.order,
1219
- });
1220
- }
1221
-
1222
- for (const node of nodeLists.floatingLimit.ask.getGenerator()) {
1223
- orders.push({
1224
- user: node.userAccount,
1225
- order: node.order,
1226
- });
1227
- }
1228
-
1229
- for (const node of nodeLists.trigger.below.getGenerator()) {
1230
- orders.push({
1231
- user: node.userAccount,
1232
- order: node.order,
1233
- });
1234
- }
1235
-
1236
- for (const node of nodeLists.trigger.above.getGenerator()) {
1237
- orders.push({
1238
- user: node.userAccount,
1239
- order: node.order,
1240
- });
1241
- }
1242
-
1243
- return orders;
1244
1320
  }
1245
1321
  }
@@ -146,6 +146,13 @@ export class NodeList<NodeType extends keyof DLOBNodeMap>
146
146
  return this.nodeMap.has(getOrderSignature(order.orderId, userAccount));
147
147
  }
148
148
 
149
+ public get(
150
+ orderId: number,
151
+ userAccount: PublicKey
152
+ ): DLOBNodeMap[NodeType] | undefined {
153
+ return this.nodeMap.get(getOrderSignature(orderId, userAccount));
154
+ }
155
+
149
156
  public print(): void {
150
157
  let currentNode = this.head;
151
158
  while (currentNode !== undefined) {